Update the gtk libraries to 0.17 (#747)

This commit is contained in:
Tamás Táncos 2023-08-18 15:03:01 +02:00 committed by GitHub
parent c94b40d3fa
commit 393f7fa401
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 165 additions and 235 deletions

104
Cargo.lock generated
View file

@ -144,9 +144,9 @@ checksum = "2ce4f10ea3abcd6617873bae9f91d1c5332b4a778bd9ce34d0cd517474c1de82"
[[package]] [[package]]
name = "atk" name = "atk"
version = "0.15.1" version = "0.17.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2c3d816ce6f0e2909a96830d6911c2aff044370b1ef92d7f267b43bae5addedd" checksum = "6ba16453d10c712284061a05f6510f75abeb92b56ba88dfeb48c74775020cc22"
dependencies = [ dependencies = [
"atk-sys", "atk-sys",
"bitflags 1.3.2", "bitflags 1.3.2",
@ -156,9 +156,9 @@ dependencies = [
[[package]] [[package]]
name = "atk-sys" name = "atk-sys"
version = "0.15.1" version = "0.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "58aeb089fb698e06db8089971c7ee317ab9644bade33383f63631437b03aafb6" checksum = "e3bf0a7ca572fbd5762fd8f8cd65a581e06767bc1234913fe1f43e370cff6e90"
dependencies = [ dependencies = [
"glib-sys", "glib-sys",
"gobject-sys", "gobject-sys",
@ -275,22 +275,23 @@ checksum = "3a4f925191b4367301851c6d99b09890311d74b0d43f274c0b34c86d308a3663"
[[package]] [[package]]
name = "cairo-rs" name = "cairo-rs"
version = "0.15.12" version = "0.17.10"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c76ee391b03d35510d9fa917357c7f1855bd9a6659c95a1b392e33f49b3369bc" checksum = "ab3603c4028a5e368d09b51c8b624b9a46edcd7c3778284077a6125af73c9f0a"
dependencies = [ dependencies = [
"bitflags 1.3.2", "bitflags 1.3.2",
"cairo-sys-rs", "cairo-sys-rs",
"glib", "glib",
"libc", "libc",
"once_cell",
"thiserror", "thiserror",
] ]
[[package]] [[package]]
name = "cairo-sys-rs" name = "cairo-sys-rs"
version = "0.15.1" version = "0.17.10"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3c55d429bef56ac9172d25fecb85dc8068307d17acd74b377866b7a1ef25d3c8" checksum = "691d0c66b1fb4881be80a760cb8fe76ea97218312f9dfe2c9cc0f496ca279cb1"
dependencies = [ dependencies = [
"glib-sys", "glib-sys",
"libc", "libc",
@ -688,6 +689,7 @@ dependencies = [
"gdk-pixbuf", "gdk-pixbuf",
"gdkx11", "gdkx11",
"glib", "glib",
"glib-macros",
"grass", "grass",
"gtk", "gtk",
"gtk-layer-shell", "gtk-layer-shell",
@ -863,9 +865,9 @@ dependencies = [
[[package]] [[package]]
name = "gdk" name = "gdk"
version = "0.15.4" version = "0.17.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a6e05c1f572ab0e1f15be94217f0dc29088c248b14f792a5ff0af0d84bcda9e8" checksum = "be1df5ea52cccd7e3a0897338b5564968274b52f5fd12601e0afa44f454c74d3"
dependencies = [ dependencies = [
"bitflags 1.3.2", "bitflags 1.3.2",
"cairo-rs", "cairo-rs",
@ -879,22 +881,23 @@ dependencies = [
[[package]] [[package]]
name = "gdk-pixbuf" name = "gdk-pixbuf"
version = "0.15.11" version = "0.17.10"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ad38dd9cc8b099cceecdf41375bb6d481b1b5a7cd5cd603e10a69a9383f8619a" checksum = "695d6bc846438c5708b07007537b9274d883373dd30858ca881d7d71b5540717"
dependencies = [ dependencies = [
"bitflags 1.3.2", "bitflags 1.3.2",
"gdk-pixbuf-sys", "gdk-pixbuf-sys",
"gio", "gio",
"glib", "glib",
"libc", "libc",
"once_cell",
] ]
[[package]] [[package]]
name = "gdk-pixbuf-sys" name = "gdk-pixbuf-sys"
version = "0.15.10" version = "0.17.10"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "140b2f5378256527150350a8346dbdb08fadc13453a7a2d73aecd5fab3c402a7" checksum = "9285ec3c113c66d7d0ab5676599176f1f42f4944ca1b581852215bf5694870cb"
dependencies = [ dependencies = [
"gio-sys", "gio-sys",
"glib-sys", "glib-sys",
@ -905,9 +908,9 @@ dependencies = [
[[package]] [[package]]
name = "gdk-sys" name = "gdk-sys"
version = "0.15.1" version = "0.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32e7a08c1e8f06f4177fb7e51a777b8c1689f743a7bc11ea91d44d2226073a88" checksum = "2152de9d38bc67a17b3fe49dc0823af5bf874df59ea088c5f28f31cf103de703"
dependencies = [ dependencies = [
"cairo-sys-rs", "cairo-sys-rs",
"gdk-pixbuf-sys", "gdk-pixbuf-sys",
@ -922,9 +925,9 @@ dependencies = [
[[package]] [[package]]
name = "gdkx11" name = "gdkx11"
version = "0.15.5" version = "0.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e62de46d9503381e4ab0b7d7a99b1fda53bd312e19ddc4195ffbe1d76f336cf9" checksum = "08f9efc60ffeede8e3816d1e4ca54b62107c31b6560f967cd84583c8b23acccf"
dependencies = [ dependencies = [
"gdk", "gdk",
"gdkx11-sys", "gdkx11-sys",
@ -936,9 +939,9 @@ dependencies = [
[[package]] [[package]]
name = "gdkx11-sys" name = "gdkx11-sys"
version = "0.15.1" version = "0.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b4b7f8c7a84b407aa9b143877e267e848ff34106578b64d1e0a24bf550716178" checksum = "6aaa174c09165bb416717bf5cf3132a3dc617a069b09000ac0eae1b921a00740"
dependencies = [ dependencies = [
"gdk-sys", "gdk-sys",
"glib-sys", "glib-sys",
@ -976,26 +979,29 @@ checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e"
[[package]] [[package]]
name = "gio" name = "gio"
version = "0.15.12" version = "0.17.10"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "68fdbc90312d462781a395f7a16d96a2b379bb6ef8cd6310a2df272771c4283b" checksum = "a6973e92937cf98689b6a054a9e56c657ed4ff76de925e36fc331a15f0c5d30a"
dependencies = [ dependencies = [
"bitflags 1.3.2", "bitflags 1.3.2",
"futures-channel", "futures-channel",
"futures-core", "futures-core",
"futures-io", "futures-io",
"futures-util",
"gio-sys", "gio-sys",
"glib", "glib",
"libc", "libc",
"once_cell", "once_cell",
"pin-project-lite",
"smallvec",
"thiserror", "thiserror",
] ]
[[package]] [[package]]
name = "gio-sys" name = "gio-sys"
version = "0.15.10" version = "0.17.10"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32157a475271e2c4a023382e9cab31c4584ee30a97da41d3c4e9fdd605abcf8d" checksum = "0ccf87c30a12c469b6d958950f6a9c09f2be20b7773f7e70d20b867fdf2628c3"
dependencies = [ dependencies = [
"glib-sys", "glib-sys",
"gobject-sys", "gobject-sys",
@ -1006,19 +1012,22 @@ dependencies = [
[[package]] [[package]]
name = "glib" name = "glib"
version = "0.15.12" version = "0.17.10"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "edb0306fbad0ab5428b0ca674a23893db909a98582969c9b537be4ced78c505d" checksum = "d3fad45ba8d4d2cea612b432717e834f48031cd8853c8aaf43b2c79fec8d144b"
dependencies = [ dependencies = [
"bitflags 1.3.2", "bitflags 1.3.2",
"futures-channel", "futures-channel",
"futures-core", "futures-core",
"futures-executor", "futures-executor",
"futures-task", "futures-task",
"futures-util",
"gio-sys",
"glib-macros", "glib-macros",
"glib-sys", "glib-sys",
"gobject-sys", "gobject-sys",
"libc", "libc",
"memchr",
"once_cell", "once_cell",
"smallvec", "smallvec",
"thiserror", "thiserror",
@ -1026,9 +1035,9 @@ dependencies = [
[[package]] [[package]]
name = "glib-macros" name = "glib-macros"
version = "0.15.13" version = "0.17.10"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "10c6ae9f6fa26f4fb2ac16b528d138d971ead56141de489f8111e259b9df3c4a" checksum = "eca5c79337338391f1ab8058d6698125034ce8ef31b72a442437fa6c8580de26"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"heck", "heck",
@ -1041,9 +1050,9 @@ dependencies = [
[[package]] [[package]]
name = "glib-sys" name = "glib-sys"
version = "0.15.10" version = "0.17.10"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ef4b192f8e65e9cf76cbf4ea71fa8e3be4a0e18ffe3d68b8da6836974cc5bad4" checksum = "d80aa6ea7bba0baac79222204aa786a6293078c210abe69ef1336911d4bdc4f0"
dependencies = [ dependencies = [
"libc", "libc",
"system-deps", "system-deps",
@ -1051,9 +1060,9 @@ dependencies = [
[[package]] [[package]]
name = "gobject-sys" name = "gobject-sys"
version = "0.15.10" version = "0.17.10"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0d57ce44246becd17153bd035ab4d32cfee096a657fc01f2231c9278378d1e0a" checksum = "cd34c3317740a6358ec04572c1bcfd3ac0b5b6529275fae255b237b314bb8062"
dependencies = [ dependencies = [
"glib-sys", "glib-sys",
"libc", "libc",
@ -1084,9 +1093,9 @@ dependencies = [
[[package]] [[package]]
name = "gtk" name = "gtk"
version = "0.15.5" version = "0.17.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "92e3004a2d5d6d8b5057d2b57b3712c9529b62e82c77f25c1fecde1fd5c23bd0" checksum = "b6c4222ab92b08d4d0bab90ddb6185b4e575ceeea8b8cdf00b938d7b6661d966"
dependencies = [ dependencies = [
"atk", "atk",
"bitflags 1.3.2", "bitflags 1.3.2",
@ -1107,11 +1116,11 @@ dependencies = [
[[package]] [[package]]
name = "gtk-layer-shell" name = "gtk-layer-shell"
version = "0.4.4" version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4316ff523ae445bd6efaf253f217598dd074619fe67b9199b5b0cd5ff99144da" checksum = "992f5fedb31835424a5280acd162bf348995f617d26969fde8d3dfd389b3ff5f"
dependencies = [ dependencies = [
"bitflags 1.3.2", "bitflags 2.4.0",
"gdk", "gdk",
"glib", "glib",
"glib-sys", "glib-sys",
@ -1122,9 +1131,9 @@ dependencies = [
[[package]] [[package]]
name = "gtk-layer-shell-sys" name = "gtk-layer-shell-sys"
version = "0.4.4" version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ff60230d690445577655416055dbd279d05631b03ab07f935e39f5fe81084c0a" checksum = "5754bcfaadfc3529116af6ae93559b267d88647f965382153a4b8ea9372be75a"
dependencies = [ dependencies = [
"gdk-sys", "gdk-sys",
"glib-sys", "glib-sys",
@ -1135,9 +1144,9 @@ dependencies = [
[[package]] [[package]]
name = "gtk-sys" name = "gtk-sys"
version = "0.15.3" version = "0.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d5bc2f0587cba247f60246a0ca11fe25fb733eabc3de12d1965fc07efab87c84" checksum = "4d8eb6a4b93e5a7e6980f7348d08c1cd93d31fae07cf97f20678c5ec41de3d7e"
dependencies = [ dependencies = [
"atk-sys", "atk-sys",
"cairo-sys-rs", "cairo-sys-rs",
@ -1153,9 +1162,9 @@ dependencies = [
[[package]] [[package]]
name = "gtk3-macros" name = "gtk3-macros"
version = "0.15.6" version = "0.17.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "684c0456c086e8e7e9af73ec5b84e35938df394712054550e81558d21c44ab0d" checksum = "3efb84d682c9a39c10bd9f24f5a4b9c15cc8c7edc45c19cb2ca2c4fc38b2d95e"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"proc-macro-crate", "proc-macro-crate",
@ -1637,11 +1646,12 @@ checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d"
[[package]] [[package]]
name = "pango" name = "pango"
version = "0.15.10" version = "0.17.10"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "22e4045548659aee5313bde6c582b0d83a627b7904dd20dc2d9ef0895d414e4f" checksum = "35be456fc620e61f62dff7ff70fbd54dcbaf0a4b920c0f16de1107c47d921d48"
dependencies = [ dependencies = [
"bitflags 1.3.2", "bitflags 1.3.2",
"gio",
"glib", "glib",
"libc", "libc",
"once_cell", "once_cell",
@ -1650,9 +1660,9 @@ dependencies = [
[[package]] [[package]]
name = "pango-sys" name = "pango-sys"
version = "0.15.10" version = "0.17.10"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d2a00081cde4661982ed91d80ef437c20eacaf6aa1a5962c0279ae194662c3aa" checksum = "3da69f9f3850b0d8990d462f8c709561975e95f689c1cdf0fecdebde78b35195"
dependencies = [ dependencies = [
"glib-sys", "glib-sys",
"gobject-sys", "gobject-sys",

View file

@ -16,17 +16,18 @@ x11 = ["gdkx11", "x11rb"]
wayland = ["gtk-layer-shell"] wayland = ["gtk-layer-shell"]
[dependencies] [dependencies]
gtk = { version = "0.15", features = [ "v3_22" ] } gtk = "0.17.1"
gdk = "0.15" gdk = "0.17.1"
glib = "0.15" glib = "0.17.8"
glib-macros = "0.17.8"
cairo-rs = "0.15" cairo-rs = "0.17"
cairo-sys-rs = "0.15.1" cairo-sys-rs = "0.17"
gdk-pixbuf = "0.15" gdk-pixbuf = "0.17"
gtk-layer-shell = { version = "0.4", optional = true} gtk-layer-shell = { version = "0.6.1", optional = true }
gdkx11 = { version = "0.15", optional = true } gdkx11 = { version = "0.17", optional = true }
x11rb = { version = "0.11.1", features = ["randr"], optional = true } x11rb = { version = "0.11.1", features = ["randr"], optional = true }
regex = "1.9.3" regex = "1.9.3"

View file

@ -3,7 +3,7 @@ use crate::{
daemon_response::DaemonResponseSender, daemon_response::DaemonResponseSender,
display_backend::DisplayBackend, display_backend::DisplayBackend,
error_handling_ctx, error_handling_ctx,
gtk::prelude::{ContainerExt, CssProviderExt, GtkWindowExt, StyleContextExt, WidgetExt}, gtk::prelude::{ContainerExt, CssProviderExt, GtkWindowExt, MonitorExt, StyleContextExt, WidgetExt},
paths::EwwPaths, paths::EwwPaths,
script_var_handler::ScriptVarHandlerHandle, script_var_handler::ScriptVarHandlerHandle,
state::scope_graph::{ScopeGraph, ScopeIndex}, state::scope_graph::{ScopeGraph, ScopeIndex},
@ -505,8 +505,7 @@ fn apply_window_position(
} }
fn on_screen_changed(window: &gtk::Window, _old_screen: Option<&gdk::Screen>) { fn on_screen_changed(window: &gtk::Window, _old_screen: Option<&gdk::Screen>) {
let visual = window let visual = gtk::prelude::GtkWindowExt::screen(window)
.screen()
.and_then(|screen| screen.rgba_visual().filter(|_| screen.is_composited()).or_else(|| screen.system_visual())); .and_then(|screen| screen.rgba_visual().filter(|_| screen.is_composited()).or_else(|| screen.system_visual()));
window.set_visual(visual.as_ref()); window.set_visual(visual.as_ref());
} }

View file

@ -138,9 +138,6 @@ mod platform_x11 {
let window_type = let window_type =
if window_def.backend_options.x11.wm_ignore { gtk::WindowType::Popup } else { gtk::WindowType::Toplevel }; if window_def.backend_options.x11.wm_ignore { gtk::WindowType::Popup } else { gtk::WindowType::Toplevel };
let window = gtk::Window::new(window_type); let window = gtk::Window::new(window_type);
let wm_class_name = format!("eww-{}", window_def.name);
#[allow(deprecated)]
window.set_wmclass(&wm_class_name, &wm_class_name);
window.set_resizable(window_def.resizable); window.set_resizable(window_def.resizable);
window.set_keep_above(window_def.stacking == WindowStacking::Foreground); window.set_keep_above(window_def.stacking == WindowStacking::Foreground);
window.set_keep_below(window_def.stacking == WindowStacking::Background); window.set_keep_below(window_def.stacking == WindowStacking::Background);

View file

@ -1,5 +1,6 @@
use anyhow::{anyhow, Result}; use anyhow::{anyhow, Result};
use glib::{object_subclass, wrapper}; use glib::{object_subclass, prelude::*, wrapper};
use glib_macros::Properties;
use gtk::{prelude::*, subclass::prelude::*}; use gtk::{prelude::*, subclass::prelude::*};
use std::cell::RefCell; use std::cell::RefCell;
@ -10,11 +11,21 @@ wrapper! {
@extends gtk::Bin, gtk::Container, gtk::Widget; @extends gtk::Bin, gtk::Container, gtk::Widget;
} }
#[derive(Properties)]
#[properties(wrapper_type = CircProg)]
pub struct CircProgPriv { pub struct CircProgPriv {
#[property(get, set, nick = "Starting at", blurb = "Starting at", minimum = 0f64, maximum = 100f64, default = 0f64)]
start_at: RefCell<f64>, start_at: RefCell<f64>,
#[property(get, set, nick = "Value", blurb = "The value", minimum = 0f64, maximum = 100f64, default = 0f64)]
value: RefCell<f64>, value: RefCell<f64>,
#[property(get, set, nick = "Thickness", blurb = "Thickness", minimum = 0f64, maximum = 100f64, default = 1f64)]
thickness: RefCell<f64>, thickness: RefCell<f64>,
#[property(get, set, nick = "Clockwise", blurb = "Clockwise", default = true)]
clockwise: RefCell<bool>, clockwise: RefCell<bool>,
content: RefCell<Option<gtk::Widget>>, content: RefCell<Option<gtk::Widget>>,
} }
@ -33,40 +44,14 @@ impl Default for CircProgPriv {
impl ObjectImpl for CircProgPriv { impl ObjectImpl for CircProgPriv {
fn properties() -> &'static [glib::ParamSpec] { fn properties() -> &'static [glib::ParamSpec] {
use once_cell::sync::Lazy; Self::derived_properties()
static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
vec![
glib::ParamSpecDouble::new("value", "Value", "The value", 0f64, 100f64, 0f64, glib::ParamFlags::READWRITE),
glib::ParamSpecDouble::new(
"thickness",
"Thickness",
"Thickness",
0f64,
100f64,
1f64,
glib::ParamFlags::READWRITE,
),
glib::ParamSpecDouble::new(
"start-at",
"Starting at",
"Starting at",
0f64,
100f64,
0f64,
glib::ParamFlags::READWRITE,
),
glib::ParamSpecBoolean::new("clockwise", "Clockwise", "Clockwise", true, glib::ParamFlags::READWRITE),
]
});
PROPERTIES.as_ref()
} }
fn set_property(&self, obj: &Self::Type, _id: usize, value: &glib::Value, pspec: &glib::ParamSpec) { fn set_property(&self, _id: usize, value: &glib::Value, pspec: &glib::ParamSpec) {
match pspec.name() { match pspec.name() {
"value" => { "value" => {
self.value.replace(value.get().unwrap()); self.value.replace(value.get().unwrap());
obj.queue_draw(); // Queue a draw call with the updated value self.obj().queue_draw(); // Queue a draw call with the updated value
} }
"thickness" => { "thickness" => {
self.thickness.replace(value.get().unwrap()); self.thickness.replace(value.get().unwrap());
@ -81,14 +66,8 @@ impl ObjectImpl for CircProgPriv {
} }
} }
fn property(&self, _obj: &Self::Type, _id: usize, pspec: &glib::ParamSpec) -> glib::Value { fn property(&self, id: usize, pspec: &glib::ParamSpec) -> glib::Value {
match pspec.name() { self.derived_property(id, pspec)
"value" => self.value.borrow().to_value(),
"start-at" => self.start_at.borrow().to_value(),
"thickness" => self.thickness.borrow().to_value(),
"clockwise" => self.clockwise.borrow().to_value(),
x => panic!("Tried to access inexistant property of CircProg: {}", x,),
}
} }
} }
@ -112,18 +91,18 @@ impl Default for CircProg {
impl CircProg { impl CircProg {
pub fn new() -> Self { pub fn new() -> Self {
glib::Object::new::<Self>(&[]).expect("Failed to create CircularProgress Widget") glib::Object::new::<Self>()
} }
} }
impl ContainerImpl for CircProgPriv { impl ContainerImpl for CircProgPriv {
fn add(&self, container: &Self::Type, widget: &gtk::Widget) { fn add(&self, widget: &gtk::Widget) {
if let Some(content) = &*self.content.borrow() { if let Some(content) = &*self.content.borrow() {
// TODO: Handle this error when populating children widgets instead // TODO: Handle this error when populating children widgets instead
error_handling_ctx::print_error(anyhow!("Error, trying to add multiple children to a circular-progress widget")); error_handling_ctx::print_error(anyhow!("Error, trying to add multiple children to a circular-progress widget"));
self.parent_remove(container, content); self.parent_remove(content);
} }
self.parent_add(container, widget); self.parent_add(widget);
self.content.replace(Some(widget.clone())); self.content.replace(Some(widget.clone()));
} }
} }
@ -140,8 +119,8 @@ impl BinImpl for CircProgPriv {}
impl WidgetImpl for CircProgPriv { impl WidgetImpl for CircProgPriv {
// We overwrite preferred_* so that overflowing content from the children gets cropped // We overwrite preferred_* so that overflowing content from the children gets cropped
// We return min(child_width, child_height) // We return min(child_width, child_height)
fn preferred_width(&self, widget: &Self::Type) -> (i32, i32) { fn preferred_width(&self) -> (i32, i32) {
let styles = widget.style_context(); let styles = self.obj().style_context();
let margin = styles.margin(gtk::StateFlags::NORMAL); let margin = styles.margin(gtk::StateFlags::NORMAL);
if let Some(child) = &*self.content.borrow() { if let Some(child) = &*self.content.borrow() {
@ -153,12 +132,12 @@ impl WidgetImpl for CircProgPriv {
} }
} }
fn preferred_width_for_height(&self, widget: &Self::Type, _height: i32) -> (i32, i32) { fn preferred_width_for_height(&self, _height: i32) -> (i32, i32) {
self.preferred_width(widget) self.preferred_width()
} }
fn preferred_height(&self, widget: &Self::Type) -> (i32, i32) { fn preferred_height(&self) -> (i32, i32) {
let styles = widget.style_context(); let styles = self.obj().style_context();
let margin = styles.margin(gtk::StateFlags::NORMAL); let margin = styles.margin(gtk::StateFlags::NORMAL);
if let Some(child) = &*self.content.borrow() { if let Some(child) = &*self.content.borrow() {
@ -170,18 +149,18 @@ impl WidgetImpl for CircProgPriv {
} }
} }
fn preferred_height_for_width(&self, widget: &Self::Type, _width: i32) -> (i32, i32) { fn preferred_height_for_width(&self, _width: i32) -> (i32, i32) {
self.preferred_height(widget) self.preferred_height()
} }
fn draw(&self, widget: &Self::Type, cr: &cairo::Context) -> Inhibit { fn draw(&self, cr: &cairo::Context) -> Inhibit {
let res: Result<()> = try { let res: Result<()> = try {
let value = *self.value.borrow(); let value = *self.value.borrow();
let start_at = *self.start_at.borrow() as f64; let start_at = *self.start_at.borrow() as f64;
let thickness = *self.thickness.borrow() as f64; let thickness = *self.thickness.borrow() as f64;
let clockwise = *self.clockwise.borrow() as bool; let clockwise = *self.clockwise.borrow() as bool;
let styles = widget.style_context(); let styles = self.obj().style_context();
let margin = styles.margin(gtk::StateFlags::NORMAL); let margin = styles.margin(gtk::StateFlags::NORMAL);
// Padding is not supported yet // Padding is not supported yet
let fg_color: gdk::RGBA = styles.color(gtk::StateFlags::NORMAL); let fg_color: gdk::RGBA = styles.color(gtk::StateFlags::NORMAL);
@ -192,8 +171,8 @@ impl WidgetImpl for CircProgPriv {
(perc_to_rad(100.0 - value as f64), 2f64 * std::f64::consts::PI) (perc_to_rad(100.0 - value as f64), 2f64 * std::f64::consts::PI)
}; };
let total_width = widget.allocated_width() as f64; let total_width = self.obj().allocated_width() as f64;
let total_height = widget.allocated_height() as f64; let total_height = self.obj().allocated_height() as f64;
let center = (total_width / 2.0, total_height / 2.0); let center = (total_width / 2.0, total_height / 2.0);
let circle_width = total_width - margin.left as f64 - margin.right as f64; let circle_width = total_width - margin.left as f64 - margin.right as f64;
@ -237,7 +216,7 @@ impl WidgetImpl for CircProgPriv {
cr.clip(); cr.clip();
// Children widget // Children widget
widget.propagate_draw(child, cr); self.obj().propagate_draw(child, cr);
cr.reset_clip(); cr.reset_clip();
cr.restore()?; cr.restore()?;

View file

@ -3,6 +3,7 @@ use std::{cell::RefCell, collections::VecDeque};
// https://github.com/gtk-rs/examples/blob/master/src/bin/listbox_model.rs // https://github.com/gtk-rs/examples/blob/master/src/bin/listbox_model.rs
use anyhow::{anyhow, Result}; use anyhow::{anyhow, Result};
use glib::{object_subclass, wrapper}; use glib::{object_subclass, wrapper};
use glib_macros::Properties;
use gtk::{prelude::*, subclass::prelude::*}; use gtk::{prelude::*, subclass::prelude::*};
use crate::error_handling_ctx; use crate::error_handling_ctx;
@ -14,14 +15,30 @@ wrapper! {
@extends gtk::Bin, gtk::Container, gtk::Widget; @extends gtk::Bin, gtk::Container, gtk::Widget;
} }
#[derive(Properties)]
#[properties(wrapper_type = Graph)]
pub struct GraphPriv { pub struct GraphPriv {
#[property(get, set, nick = "Value", blurb = "The value", minimum = 0f64, maximum = f64::MAX, default = 0f64)]
value: RefCell<f64>, value: RefCell<f64>,
#[property(get, set, nick = "Thickness", blurb = "The Thickness", minimum = 0f64, maximum = f64::MAX, default = 1f64)]
thickness: RefCell<f64>, thickness: RefCell<f64>,
#[property(get, set, nick = "Line Style", blurb = "The Line Style", default = "miter")]
line_style: RefCell<String>, line_style: RefCell<String>,
#[property(get, set, nick = "Maximum Value", blurb = "The Maximum Value", minimum = 0f64, maximum = f64::MAX, default = 100f64)]
min: RefCell<f64>, min: RefCell<f64>,
#[property(get, set, nick = "Minumum Value", blurb = "The Minimum Value", minimum = 0f64, maximum = f64::MAX, default = 0f64)]
max: RefCell<f64>, max: RefCell<f64>,
#[property(get, set, nick = "Dynamic", blurb = "If it is dynamic", default = true)]
dynamic: RefCell<bool>, dynamic: RefCell<bool>,
#[property(get, set, nick = "Time Range", blurb = "The Time Range", minimum = 0u64, maximum = u64::MAX, default = 10u64)]
time_range: RefCell<u64>, time_range: RefCell<u64>,
history: RefCell<VecDeque<(std::time::Instant, f64)>>, history: RefCell<VecDeque<(std::time::Instant, f64)>>,
extra_point: RefCell<Option<(std::time::Instant, f64)>>, extra_point: RefCell<Option<(std::time::Instant, f64)>>,
last_updated_at: RefCell<std::time::Instant>, last_updated_at: RefCell<std::time::Instant>,
@ -65,67 +82,16 @@ impl GraphPriv {
impl ObjectImpl for GraphPriv { impl ObjectImpl for GraphPriv {
fn properties() -> &'static [glib::ParamSpec] { fn properties() -> &'static [glib::ParamSpec] {
use once_cell::sync::Lazy; Self::derived_properties()
static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
vec![
glib::ParamSpecDouble::new("value", "Value", "The value", 0f64, f64::MAX, 0f64, glib::ParamFlags::READWRITE),
glib::ParamSpecDouble::new(
"thickness",
"Thickness",
"The Thickness",
0f64,
100f64,
1f64,
glib::ParamFlags::READWRITE,
),
glib::ParamSpecDouble::new(
"max",
"Maximum Value",
"The Maximum Value",
0f64,
f64::MAX,
100f64,
glib::ParamFlags::READWRITE,
),
glib::ParamSpecDouble::new(
"min",
"Minumum Value",
"The Minimum Value",
0f64,
f64::MAX,
0f64,
glib::ParamFlags::READWRITE,
),
glib::ParamSpecBoolean::new("dynamic", "Dynamic", "If it is dynamic", true, glib::ParamFlags::READWRITE),
glib::ParamSpecUInt64::new(
"time-range",
"Time Range",
"The Time Range",
0u64,
u64::MAX,
10u64,
glib::ParamFlags::READWRITE,
),
glib::ParamSpecString::new(
"line-style",
"Line Style",
"The Line Style",
Some("miter"),
glib::ParamFlags::READWRITE,
),
]
});
PROPERTIES.as_ref()
} }
fn set_property(&self, obj: &Self::Type, _id: usize, value: &glib::Value, pspec: &glib::ParamSpec) { fn set_property(&self, _id: usize, value: &glib::Value, pspec: &glib::ParamSpec) {
match pspec.name() { match pspec.name() {
"value" => { "value" => {
let value = value.get().unwrap(); let value = value.get().unwrap();
self.value.replace(value); self.value.replace(value);
self.update_history((std::time::Instant::now(), value)); self.update_history((std::time::Instant::now(), value));
obj.queue_draw(); self.obj().queue_draw();
} }
"thickness" => { "thickness" => {
self.thickness.replace(value.get().unwrap()); self.thickness.replace(value.get().unwrap());
@ -149,17 +115,8 @@ impl ObjectImpl for GraphPriv {
} }
} }
fn property(&self, _obj: &Self::Type, _id: usize, pspec: &glib::ParamSpec) -> glib::Value { fn property(&self, id: usize, pspec: &glib::ParamSpec) -> glib::Value {
match pspec.name() { self.derived_property(id, pspec)
"value" => self.value.borrow().to_value(),
"thickness" => self.thickness.borrow().to_value(),
"max" => self.max.borrow().to_value(),
"min" => self.min.borrow().to_value(),
"dynamic" => self.dynamic.borrow().to_value(),
"time-range" => self.time_range.borrow().to_value(),
"line-style" => self.line_style.borrow().to_value(),
x => panic!("Tried to access inexistant property of Graph: {}", x,),
}
} }
} }
@ -183,37 +140,37 @@ impl Default for Graph {
impl Graph { impl Graph {
pub fn new() -> Self { pub fn new() -> Self {
glib::Object::new::<Self>(&[]).expect("Failed to create Graph Widget") glib::Object::new::<Self>()
} }
} }
impl ContainerImpl for GraphPriv { impl ContainerImpl for GraphPriv {
fn add(&self, _container: &Self::Type, _widget: &gtk::Widget) { fn add(&self, _widget: &gtk::Widget) {
error_handling_ctx::print_error(anyhow!("Error, Graph widget shoudln't have any children")); error_handling_ctx::print_error(anyhow!("Error, Graph widget shoudln't have any children"));
} }
} }
impl BinImpl for GraphPriv {} impl BinImpl for GraphPriv {}
impl WidgetImpl for GraphPriv { impl WidgetImpl for GraphPriv {
fn preferred_width(&self, _widget: &Self::Type) -> (i32, i32) { fn preferred_width(&self) -> (i32, i32) {
let thickness = *self.thickness.borrow() as i32; let thickness = *self.thickness.borrow() as i32;
(thickness, thickness) (thickness, thickness)
} }
fn preferred_width_for_height(&self, _widget: &Self::Type, height: i32) -> (i32, i32) { fn preferred_width_for_height(&self, height: i32) -> (i32, i32) {
(height, height) (height, height)
} }
fn preferred_height(&self, _widget: &Self::Type) -> (i32, i32) { fn preferred_height(&self) -> (i32, i32) {
let thickness = *self.thickness.borrow() as i32; let thickness = *self.thickness.borrow() as i32;
(thickness, thickness) (thickness, thickness)
} }
fn preferred_height_for_width(&self, _widget: &Self::Type, width: i32) -> (i32, i32) { fn preferred_height_for_width(&self, width: i32) -> (i32, i32) {
(width, width) (width, width)
} }
fn draw(&self, widget: &Self::Type, cr: &cairo::Context) -> Inhibit { fn draw(&self, cr: &cairo::Context) -> Inhibit {
let res: Result<()> = try { let res: Result<()> = try {
let history = &*self.history.borrow(); let history = &*self.history.borrow();
let extra_point = *self.extra_point.borrow(); let extra_point = *self.extra_point.borrow();
@ -239,13 +196,13 @@ impl WidgetImpl for GraphPriv {
(min, max) (min, max)
}; };
let styles = widget.style_context(); let styles = self.obj().style_context();
let (margin_top, margin_right, margin_bottom, margin_left) = { let (margin_top, margin_right, margin_bottom, margin_left) = {
let margin = styles.margin(gtk::StateFlags::NORMAL); let margin = styles.margin(gtk::StateFlags::NORMAL);
(margin.top as f64, margin.right as f64, margin.bottom as f64, margin.left as f64) (margin.top as f64, margin.right as f64, margin.bottom as f64, margin.left as f64)
}; };
let width = widget.allocated_width() as f64 - margin_left - margin_right; let width = self.obj().allocated_width() as f64 - margin_left - margin_right;
let height = widget.allocated_height() as f64 - margin_top - margin_bottom; let height = self.obj().allocated_height() as f64 - margin_top - margin_bottom;
// Calculate graph points once // Calculate graph points once
// Separating this into another function would require pasing a // Separating this into another function would require pasing a

View file

@ -1,5 +1,6 @@
use anyhow::{anyhow, Result}; use anyhow::{anyhow, Result};
use glib::{object_subclass, wrapper}; use glib::{object_subclass, wrapper};
use glib_macros::Properties;
use gtk::{prelude::*, subclass::prelude::*}; use gtk::{prelude::*, subclass::prelude::*};
use std::{cell::RefCell, str::FromStr}; use std::{cell::RefCell, str::FromStr};
use yuck::value::NumWithUnit; use yuck::value::NumWithUnit;
@ -11,12 +12,24 @@ wrapper! {
@extends gtk::Bin, gtk::Container, gtk::Widget; @extends gtk::Bin, gtk::Container, gtk::Widget;
} }
#[derive(Properties)]
#[properties(wrapper_type = Transform)]
pub struct TransformPriv { pub struct TransformPriv {
#[property(get, set, nick = "Rotate", blurb = "The Rotation", minimum = f64::MIN, maximum = f64::MAX, default = 0f64)]
rotate: RefCell<f64>, rotate: RefCell<f64>,
#[property(get, set, nick = "Translate x", blurb = "The X Translation", default = None)]
translate_x: RefCell<Option<String>>, translate_x: RefCell<Option<String>>,
#[property(get, set, nick = "Translate y", blurb = "The Y Translation", default = None)]
translate_y: RefCell<Option<String>>, translate_y: RefCell<Option<String>>,
#[property(get, set, nick = "Scale x", blurb = "The amount to scale in x", default = None)]
scale_x: RefCell<Option<String>>, scale_x: RefCell<Option<String>>,
#[property(get, set, nick = "Scale y", blurb = "The amount to scale in y", default = None)]
scale_y: RefCell<Option<String>>, scale_y: RefCell<Option<String>>,
content: RefCell<Option<gtk::Widget>>, content: RefCell<Option<gtk::Widget>>,
} }
@ -36,63 +49,37 @@ impl Default for TransformPriv {
impl ObjectImpl for TransformPriv { impl ObjectImpl for TransformPriv {
fn properties() -> &'static [glib::ParamSpec] { fn properties() -> &'static [glib::ParamSpec] {
use once_cell::sync::Lazy; Self::derived_properties()
static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
vec![
glib::ParamSpecDouble::new(
"rotate",
"Rotate",
"The Rotation",
f64::MIN,
f64::MAX,
0f64,
glib::ParamFlags::READWRITE,
),
glib::ParamSpecString::new("translate-x", "Translate x", "The X Translation", None, glib::ParamFlags::READWRITE),
glib::ParamSpecString::new("translate-y", "Translate y", "The Y Translation", None, glib::ParamFlags::READWRITE),
glib::ParamSpecString::new("scale-x", "Scale x", "The amount to scale in x", None, glib::ParamFlags::READWRITE),
glib::ParamSpecString::new("scale-y", "Scale y", "The amount to scale in y", None, glib::ParamFlags::READWRITE),
]
});
PROPERTIES.as_ref()
} }
fn set_property(&self, obj: &Self::Type, _id: usize, value: &glib::Value, pspec: &glib::ParamSpec) { fn set_property(&self, _id: usize, value: &glib::Value, pspec: &glib::ParamSpec) {
match pspec.name() { match pspec.name() {
"rotate" => { "rotate" => {
self.rotate.replace(value.get().unwrap()); self.rotate.replace(value.get().unwrap());
obj.queue_draw(); // Queue a draw call with the updated value self.obj().queue_draw(); // Queue a draw call with the updated value
} }
"translate-x" => { "translate-x" => {
self.translate_x.replace(value.get().unwrap()); self.translate_x.replace(value.get().unwrap());
obj.queue_draw(); // Queue a draw call with the updated value self.obj().queue_draw(); // Queue a draw call with the updated value
} }
"translate-y" => { "translate-y" => {
self.translate_y.replace(value.get().unwrap()); self.translate_y.replace(value.get().unwrap());
obj.queue_draw(); // Queue a draw call with the updated value self.obj().queue_draw(); // Queue a draw call with the updated value
} }
"scale-x" => { "scale-x" => {
self.scale_x.replace(value.get().unwrap()); self.scale_x.replace(value.get().unwrap());
obj.queue_draw(); // Queue a draw call with the updated value self.obj().queue_draw(); // Queue a draw call with the updated value
} }
"scale-y" => { "scale-y" => {
self.scale_y.replace(value.get().unwrap()); self.scale_y.replace(value.get().unwrap());
obj.queue_draw(); // Queue a draw call with the updated value self.obj().queue_draw(); // Queue a draw call with the updated value
} }
x => panic!("Tried to set inexistant property of Transform: {}", x,), x => panic!("Tried to set inexistant property of Transform: {}", x,),
} }
} }
fn property(&self, _obj: &Self::Type, _id: usize, pspec: &glib::ParamSpec) -> glib::Value { fn property(&self, id: usize, pspec: &glib::ParamSpec) -> glib::Value {
match pspec.name() { self.derived_property(id, pspec)
"rotate" => self.rotate.borrow().to_value(),
"translate_x" => self.translate_x.borrow().to_value(),
"translate_y" => self.translate_y.borrow().to_value(),
"scale_x" => self.scale_x.borrow().to_value(),
"scale_y" => self.scale_y.borrow().to_value(),
x => panic!("Tried to access inexistant property of Transform: {}", x,),
}
} }
} }
@ -116,29 +103,29 @@ impl Default for Transform {
impl Transform { impl Transform {
pub fn new() -> Self { pub fn new() -> Self {
glib::Object::new::<Self>(&[]).expect("Failed to create Transform Widget") glib::Object::new::<Self>()
} }
} }
impl ContainerImpl for TransformPriv { impl ContainerImpl for TransformPriv {
fn add(&self, container: &Self::Type, widget: &gtk::Widget) { fn add(&self, widget: &gtk::Widget) {
if let Some(content) = &*self.content.borrow() { if let Some(content) = &*self.content.borrow() {
// TODO: Handle this error when populating children widgets instead // TODO: Handle this error when populating children widgets instead
error_handling_ctx::print_error(anyhow!("Error, trying to add multiple children to a circular-progress widget")); error_handling_ctx::print_error(anyhow!("Error, trying to add multiple children to a circular-progress widget"));
self.parent_remove(container, content); self.parent_remove(content);
} }
self.parent_add(container, widget); self.parent_add(widget);
self.content.replace(Some(widget.clone())); self.content.replace(Some(widget.clone()));
} }
} }
impl BinImpl for TransformPriv {} impl BinImpl for TransformPriv {}
impl WidgetImpl for TransformPriv { impl WidgetImpl for TransformPriv {
fn draw(&self, widget: &Self::Type, cr: &cairo::Context) -> Inhibit { fn draw(&self, cr: &cairo::Context) -> Inhibit {
let res: Result<()> = try { let res: Result<()> = try {
let rotate = *self.rotate.borrow(); let rotate = *self.rotate.borrow();
let total_width = widget.allocated_width() as f64; let total_width = self.obj().allocated_width() as f64;
let total_height = widget.allocated_height() as f64; let total_height = self.obj().allocated_height() as f64;
cr.save()?; cr.save()?;
@ -168,7 +155,7 @@ impl WidgetImpl for TransformPriv {
// Children widget // Children widget
if let Some(child) = &*self.content.borrow() { if let Some(child) = &*self.content.borrow() {
widget.propagate_draw(child, cr); self.obj().propagate_draw(child, cr);
} }
cr.restore()?; cr.restore()?;

View file

@ -356,7 +356,7 @@ const WIDGET_NAME_COLOR_BUTTON: &str = "color-button";
/// @widget color-button /// @widget color-button
/// @desc A button opening a color chooser window /// @desc A button opening a color chooser window
fn build_gtk_color_button(bargs: &mut BuilderArgs) -> Result<gtk::ColorButton> { fn build_gtk_color_button(bargs: &mut BuilderArgs) -> Result<gtk::ColorButton> {
let gtk_widget = gtk::builders::ColorButtonBuilder::new().build(); let gtk_widget = gtk::ColorButton::builder().build();
def_widget!(bargs, _g, gtk_widget, { def_widget!(bargs, _g, gtk_widget, {
// @prop use-alpha - bool to whether or not use alpha // @prop use-alpha - bool to whether or not use alpha
prop(use_alpha: as_bool) {gtk_widget.set_use_alpha(use_alpha);}, prop(use_alpha: as_bool) {gtk_widget.set_use_alpha(use_alpha);},