From c73585324ce7c62c3de38c6eacf2fc98c71c5a63 Mon Sep 17 00:00:00 2001 From: Jake Stanger Date: Sat, 22 Apr 2023 00:29:50 +0100 Subject: [PATCH] start porting to gtk4 --- Cargo.toml | 6 +++--- src/bar.rs | 9 +++++---- src/config/common.rs | 25 ++++++++++++------------ src/image/gtk.rs | 4 ++-- src/main.rs | 7 +++++-- src/modules/clipboard.rs | 17 ++++++++--------- src/modules/clock.rs | 8 +++----- src/modules/custom/button.rs | 2 +- src/modules/custom/mod.rs | 2 -- src/modules/custom/slider.rs | 1 + src/modules/focused.rs | 4 ++-- src/modules/launcher/item.rs | 3 +-- src/modules/launcher/mod.rs | 7 +++---- src/modules/mod.rs | 2 +- src/modules/music/mod.rs | 37 ++++++++++++++++++------------------ src/modules/sysinfo.rs | 2 +- src/modules/tray.rs | 8 ++++---- src/modules/workspaces.rs | 7 +++---- src/popup.rs | 3 ++- 19 files changed, 76 insertions(+), 78 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 25480a4..9d5f9ad 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -46,9 +46,9 @@ workspaces = ["futures-util"] [dependencies] # core -gtk = "0.17.0" -gtk-layer-shell = "0.6.0" -glib = "0.17.5" +gtk = { package = "gtk4", version = "0.6.6" } +gtk-layer-shell = { package = "gtk4-layer-shell", version = "0.0.3" } +glib = "0.17.9" tokio = { version = "1.21.2", features = ["macros", "rt-multi-thread", "time", "process", "sync", "io-util", "net"] } tracing = "0.1.37" tracing-subscriber = { version = "0.3.16", features = ["env-filter"] } diff --git a/src/bar.rs b/src/bar.rs index 9a46fd6..3fad957 100644 --- a/src/bar.rs +++ b/src/bar.rs @@ -7,6 +7,7 @@ use gtk::gdk::Monitor; use gtk::prelude::*; use gtk::{Application, ApplicationWindow, IconTheme, Orientation}; use std::sync::{Arc, RwLock}; +use glib::signal::Inhibit; use tracing::{debug, info}; /// Creates a new window for a bar, @@ -48,16 +49,16 @@ pub fn create_bar( let center = create_container("center", orientation); let end = create_container("end", orientation); - content.add(&start); + content.append(&start); content.set_center_widget(Some(¢er)); content.pack_end(&end, false, false, 0); load_modules(&start, ¢er, &end, app, config, monitor, monitor_name)?; - win.add(&content); + win.append(&content); win.connect_destroy_event(|_, _| { info!("Shutting down"); - gtk::main_quit(); + // gtk::main_quit(); Inhibit(false) }); @@ -197,7 +198,7 @@ fn add_modules( let common = $module.common.take().expect("Common config did not exist"); let widget = create_module(*$module, $id, &info, &Arc::clone(&popup))?; let container = wrap_widget(&widget, common, orientation); - content.add(&container); + content.append(&container); }}; } diff --git a/src/config/common.rs b/src/config/common.rs index e0f97b5..e7154ac 100644 --- a/src/config/common.rs +++ b/src/config/common.rs @@ -1,9 +1,10 @@ +use glib::signal::Inhibit; use crate::dynamic_string::DynamicString; use crate::script::{Script, ScriptInput}; use crate::send; use gtk::gdk::ScrollDirection; use gtk::prelude::*; -use gtk::{EventBox, Orientation, Revealer, RevealerTransitionType}; +use gtk::{GestureClick, Orientation, Revealer, RevealerTransitionType, Widget}; use serde::Deserialize; use tokio::spawn; use tracing::trace; @@ -55,14 +56,16 @@ impl TransitionType { impl CommonConfig { /// Configures the module's container according to the common config options. - pub fn install(mut self, container: &EventBox, revealer: &Revealer) { - self.install_show_if(container, revealer); + pub fn install>(mut self, widget: &W, revealer: &Revealer) { + self.install_show_if(widget, revealer); let left_click_script = self.on_click_left.map(Script::new_polling); let middle_click_script = self.on_click_middle.map(Script::new_polling); let right_click_script = self.on_click_right.map(Script::new_polling); - container.connect_button_press_event(move |_, event| { + let gesture = GestureClick::new(); + + gesture.connect_pressed(move |_, event| { let script = match event.button() { 1 => left_click_script.as_ref(), 2 => middle_click_script.as_ref(), @@ -74,14 +77,12 @@ impl CommonConfig { trace!("Running on-click script: {}", event.button()); script.run_as_oneshot(None); } - - Inhibit(false) }); let scroll_up_script = self.on_scroll_up.map(Script::new_polling); let scroll_down_script = self.on_scroll_down.map(Script::new_polling); - container.connect_scroll_event(move |_, event| { + widget.connect_scroll_event(move |_, event| { let script = match event.direction() { ScrollDirection::Up => scroll_up_script.as_ref(), ScrollDirection::Down => scroll_down_script.as_ref(), @@ -99,7 +100,7 @@ impl CommonConfig { macro_rules! install_oneshot { ($option:expr, $method:ident) => { $option.map(Script::new_polling).map(|script| { - container.$method(move |_, _| { + widget.$method(move |_, _| { script.run_as_oneshot(None); Inhibit(false) }); @@ -111,7 +112,7 @@ impl CommonConfig { install_oneshot!(self.on_mouse_exit, connect_leave_notify_event); if let Some(tooltip) = self.tooltip { - let container = container.clone(); + let container = widget.clone(); DynamicString::new(&tooltip, move |string| { container.set_tooltip_text(Some(&string)); Continue(true) @@ -119,14 +120,14 @@ impl CommonConfig { } } - fn install_show_if(&mut self, container: &EventBox, revealer: &Revealer) { + fn install_show_if>(&mut self, widget: &W, revealer: &Revealer) { self.show_if.take().map_or_else( || { - container.show_all(); + widget.set_visible(true) }, |show_if| { let script = Script::new_polling(show_if); - let container = container.clone(); + let widget = widget.clone(); let (tx, rx) = glib::MainContext::channel(glib::PRIORITY_DEFAULT); spawn(async move { diff --git a/src/image/gtk.rs b/src/image/gtk.rs index 06c62ed..88d43ad 100644 --- a/src/image/gtk.rs +++ b/src/image/gtk.rs @@ -38,7 +38,7 @@ pub fn new_icon_label(input: &str, icon_theme: &IconTheme, size: i32) -> gtk::Bo let image = Image::new(); image.set_widget_name("image"); - container.add(&image); + container.append(&image); if let Err(err) = ImageProvider::parse(input, icon_theme, size) .and_then(|provider| provider.load_into_image(image)) @@ -49,7 +49,7 @@ pub fn new_icon_label(input: &str, icon_theme: &IconTheme, size: i32) -> gtk::Bo let label = Label::new(Some(input)); label.set_widget_name("label"); - container.add(&label); + container.append(&label); } container diff --git a/src/main.rs b/src/main.rs index 5fadbec..c89f7af 100644 --- a/src/main.rs +++ b/src/main.rs @@ -21,7 +21,7 @@ use crate::style::load_css; use color_eyre::eyre::Result; use color_eyre::Report; use dirs::config_dir; -use gtk::gdk::Display; +use gtk::gdk::{Display, Monitor}; use gtk::prelude::*; use gtk::Application; use std::env; @@ -120,7 +120,10 @@ fn create_bars( debug!("Received {} outputs from Wayland", outputs.len()); debug!("Outputs: {:?}", outputs); - let num_monitors = display.n_monitors(); + for monitor in display.monitors().iter::() { + let monitor = monitor.unwrap(); + } + for i in 0..num_monitors { let monitor = display diff --git a/src/modules/clipboard.rs b/src/modules/clipboard.rs index 5045a1a..47f5544 100644 --- a/src/modules/clipboard.rs +++ b/src/modules/clipboard.rs @@ -8,10 +8,11 @@ use crate::try_send; use gtk::gdk_pixbuf::Pixbuf; use gtk::gio::{Cancellable, MemoryInputStream}; use gtk::prelude::*; -use gtk::{Button, EventBox, Image, Label, Orientation, RadioButton, Widget}; +use gtk::{Button, Image, Label, Orientation, RadioButton, Widget}; use serde::Deserialize; use std::collections::HashMap; use std::sync::Arc; +use glib::signal::Inhibit; use tokio::spawn; use tokio::sync::mpsc::{Receiver, Sender}; use tracing::{debug, error}; @@ -161,10 +162,10 @@ impl Module