0.6.0 #1

Merged
pogmommy merged 89 commits from 0.6.0 into main 2025-07-04 20:29:26 -07:00
15 changed files with 454 additions and 369 deletions
Showing only changes of commit 3b6f868ea6 - Show all commits

684
Cargo.lock generated

File diff suppressed because it is too large Load diff

View file

@ -21,20 +21,11 @@ eww_shared_util.workspace = true
yuck.workspace = true
notifier_host.workspace = true
gtk = "0.17.1"
gdk = "0.17.1"
pango = "0.17.1"
glib = "0.17.8"
glib-macros = "0.17.8"
gtk = "0.18.1"
cairo-rs = "0.17"
cairo-sys-rs = "0.17"
gdk-pixbuf = "0.17"
gtk-layer-shell = { version = "0.6.1", optional = true }
gdkx11 = { version = "0.17", optional = true }
x11rb = { version = "0.11.1", features = ["randr"], optional = true }
gtk-layer-shell = { version = "0.8.1", optional = true }
gdkx11 = { version = "0.18", optional = true }
x11rb = { version = "0.13.1", features = ["randr"], optional = true }
zbus = { version = "3.7.0", default-features = false, features = ["tokio"] }
ordered-stream = "0.2.0"

View file

@ -17,6 +17,7 @@ use codespan_reporting::files::Files;
use eww_shared_util::{Span, VarName};
use gdk::Monitor;
use glib::ObjectExt;
use gtk::{gdk, glib};
use itertools::Itertools;
use once_cell::sync::Lazy;
use simplexpr::{dynval::DynVal, SimplExpr};

View file

@ -1,5 +1,7 @@
use crate::{widgets::window::Window, window_initiator::WindowInitiator};
use gtk::gdk;
#[cfg(feature = "wayland")]
pub use platform_wayland::WaylandBackend;
@ -27,7 +29,9 @@ impl DisplayBackend for NoBackend {
#[cfg(feature = "wayland")]
mod platform_wayland {
use crate::{widgets::window::Window, window_initiator::WindowInitiator};
use gtk::gdk;
use gtk::prelude::*;
use gtk_layer_shell::LayerShell;
use yuck::config::{window_definition::WindowStacking, window_geometry::AnchorAlignment};
use super::DisplayBackend;
@ -41,12 +45,12 @@ mod platform_wayland {
fn initialize_window(window_init: &WindowInitiator, monitor: gdk::Rectangle, x: i32, y: i32) -> Option<Window> {
let window = Window::new(gtk::WindowType::Toplevel, x, y);
// Initialising a layer shell surface
gtk_layer_shell::init_for_window(&window);
window.init_layer_shell();
// Sets the monitor where the surface is shown
if let Some(ident) = window_init.monitor.clone() {
let display = gdk::Display::default().expect("could not get default display");
if let Some(monitor) = crate::app::get_monitor_from_display(&display, &ident) {
gtk_layer_shell::set_monitor(&window, &monitor);
window.set_monitor(&monitor);
} else {
return None;
}
@ -55,18 +59,18 @@ mod platform_wayland {
// Sets the layer where the layer shell surface will spawn
match window_init.stacking {
WindowStacking::Foreground => gtk_layer_shell::set_layer(&window, gtk_layer_shell::Layer::Top),
WindowStacking::Background => gtk_layer_shell::set_layer(&window, gtk_layer_shell::Layer::Background),
WindowStacking::Bottom => gtk_layer_shell::set_layer(&window, gtk_layer_shell::Layer::Bottom),
WindowStacking::Overlay => gtk_layer_shell::set_layer(&window, gtk_layer_shell::Layer::Overlay),
WindowStacking::Foreground => window.set_layer(gtk_layer_shell::Layer::Top),
WindowStacking::Background => window.set_layer(gtk_layer_shell::Layer::Background),
WindowStacking::Bottom => window.set_layer(gtk_layer_shell::Layer::Bottom),
WindowStacking::Overlay => window.set_layer(gtk_layer_shell::Layer::Overlay),
}
if let Some(namespace) = &window_init.backend_options.wayland.namespace {
gtk_layer_shell::set_namespace(&window, namespace);
window.set_namespace(namespace);
}
// Sets the keyboard interactivity
gtk_layer_shell::set_keyboard_interactivity(&window, window_init.backend_options.wayland.focusable);
window.set_keyboard_interactivity(window_init.backend_options.wayland.focusable);
if let Some(geometry) = window_init.geometry {
// Positioning surface
@ -86,27 +90,27 @@ mod platform_wayland {
AnchorAlignment::END => bottom = true,
}
gtk_layer_shell::set_anchor(&window, gtk_layer_shell::Edge::Left, left);
gtk_layer_shell::set_anchor(&window, gtk_layer_shell::Edge::Right, right);
gtk_layer_shell::set_anchor(&window, gtk_layer_shell::Edge::Top, top);
gtk_layer_shell::set_anchor(&window, gtk_layer_shell::Edge::Bottom, bottom);
window.set_anchor(gtk_layer_shell::Edge::Left, left);
window.set_anchor(gtk_layer_shell::Edge::Right, right);
window.set_anchor(gtk_layer_shell::Edge::Top, top);
window.set_anchor(gtk_layer_shell::Edge::Bottom, bottom);
let xoffset = geometry.offset.x.pixels_relative_to(monitor.width());
let yoffset = geometry.offset.y.pixels_relative_to(monitor.height());
if left {
gtk_layer_shell::set_margin(&window, gtk_layer_shell::Edge::Left, xoffset);
window.set_layer_shell_margin(gtk_layer_shell::Edge::Left, xoffset);
} else {
gtk_layer_shell::set_margin(&window, gtk_layer_shell::Edge::Right, xoffset);
window.set_layer_shell_margin(gtk_layer_shell::Edge::Right, xoffset);
}
if bottom {
gtk_layer_shell::set_margin(&window, gtk_layer_shell::Edge::Bottom, yoffset);
window.set_layer_shell_margin(gtk_layer_shell::Edge::Bottom, yoffset);
} else {
gtk_layer_shell::set_margin(&window, gtk_layer_shell::Edge::Top, yoffset);
window.set_layer_shell_margin(gtk_layer_shell::Edge::Top, yoffset);
}
}
if window_init.backend_options.wayland.exclusive {
gtk_layer_shell::auto_exclusive_zone_enable(&window);
window.auto_exclusive_zone_enable();
}
Some(window)
}
@ -118,6 +122,7 @@ mod platform_x11 {
use crate::{widgets::window::Window, window_initiator::WindowInitiator};
use anyhow::{Context, Result};
use gdk::Monitor;
use gtk::gdk;
use gtk::{self, prelude::*};
use x11rb::protocol::xproto::ConnectionExt;

View file

@ -95,7 +95,7 @@ pub fn initialize_server<B: DisplayBackend>(
paths,
};
if let Some(screen) = gdk::Screen::default() {
if let Some(screen) = gtk::gdk::Screen::default() {
gtk::StyleContext::add_provider_for_screen(&screen, &app.css_provider, gtk::STYLE_PROVIDER_PRIORITY_APPLICATION);
}
@ -108,7 +108,7 @@ pub fn initialize_server<B: DisplayBackend>(
// initialize all the handlers and tasks running asyncronously
let tokio_handle = init_async_part(app.paths.clone(), ui_send);
glib::MainContext::default().spawn_local(async move {
gtk::glib::MainContext::default().spawn_local(async move {
// if an action was given to the daemon initially, execute it first.
if let Some(action) = action {
app.handle_command(action);

View file

@ -1,8 +1,8 @@
use anyhow::{Context, Result};
use codespan_reporting::diagnostic::Severity;
use eww_shared_util::{AttrName, Spanned};
use gdk::prelude::Cast;
use gtk::{
gdk::prelude::Cast,
prelude::{BoxExt, ContainerExt, WidgetExt},
Orientation,
};

View file

@ -1,7 +1,6 @@
use anyhow::{anyhow, Result};
use glib::{object_subclass, prelude::*, wrapper};
use glib_macros::Properties;
use gtk::{prelude::*, subclass::prelude::*};
use gtk::glib::{self, object_subclass, prelude::*, wrapper, Properties};
use gtk::{cairo, gdk, prelude::*, subclass::prelude::*};
use std::cell::RefCell;
use crate::error_handling_ctx;
@ -154,7 +153,7 @@ impl WidgetImpl for CircProgPriv {
self.preferred_height()
}
fn draw(&self, cr: &cairo::Context) -> Inhibit {
fn draw(&self, cr: &cairo::Context) -> glib::Propagation {
let res: Result<()> = (|| {
let value = *self.value.borrow();
let start_at = *self.start_at.borrow();
@ -226,7 +225,7 @@ impl WidgetImpl for CircProgPriv {
error_handling_ctx::print_error(error)
};
gtk::Inhibit(false)
glib::Propagation::Proceed
}
}

View file

@ -2,9 +2,8 @@ use std::{cell::RefCell, collections::VecDeque};
// https://www.figuiere.net/technotes/notes/tn002/
// https://github.com/gtk-rs/examples/blob/master/src/bin/listbox_model.rs
use anyhow::{anyhow, Result};
use glib::{object_subclass, wrapper};
use glib_macros::Properties;
use gtk::{prelude::*, subclass::prelude::*};
use gtk::glib::{self, object_subclass, wrapper, Properties};
use gtk::{cairo, gdk, prelude::*, subclass::prelude::*};
use crate::error_handling_ctx;
@ -170,7 +169,7 @@ impl WidgetImpl for GraphPriv {
(width, width)
}
fn draw(&self, cr: &cairo::Context) -> Inhibit {
fn draw(&self, cr: &cairo::Context) -> glib::Propagation {
let res: Result<()> = (|| {
let history = &*self.history.borrow();
let extra_point = *self.extra_point.borrow();
@ -276,7 +275,7 @@ impl WidgetImpl for GraphPriv {
error_handling_ctx::print_error(error)
};
gtk::Inhibit(false)
glib::Propagation::Proceed
}
}

View file

@ -1,8 +1,6 @@
use crate::widgets::window::Window;
use futures::StreamExt;
use gdk::NotifyType;
use gtk::{cairo::Surface, gdk::ffi::gdk_cairo_surface_create_from_pixbuf, prelude::*};
use notifier_host;
use gtk::{cairo::Surface, gdk, gdk::ffi::gdk_cairo_surface_create_from_pixbuf, gdk::NotifyType, glib, prelude::*};
use std::{cell::RefCell, future::Future, rc::Rc};
// DBus state shared between systray instances, to avoid creating too many connections etc.
@ -139,14 +137,14 @@ impl Item {
if evt.detail() != NotifyType::Inferior {
gtk_widget.clone().set_state_flags(gtk::StateFlags::PRELIGHT, false);
}
gtk::Inhibit(false)
glib::Propagation::Proceed
});
gtk_widget.connect_leave_notify_event(|gtk_widget, evt| {
if evt.detail() != NotifyType::Inferior {
gtk_widget.clone().unset_state_flags(gtk::StateFlags::PRELIGHT);
}
gtk::Inhibit(false)
glib::Propagation::Proceed
});
let out_widget = gtk_widget.clone(); // copy so we can return it
@ -231,7 +229,7 @@ impl Item {
if let Err(result) = result {
log::error!("failed to handle mouse click {}: {}", evt.button(), result);
}
gtk::Inhibit(true)
glib::Propagation::Stop
}));
// updates

View file

@ -1,6 +1,5 @@
use anyhow::{anyhow, Result};
use glib::{object_subclass, wrapper};
use glib_macros::Properties;
use gtk::glib::{self, object_subclass, wrapper, Properties};
use gtk::{prelude::*, subclass::prelude::*};
use std::{cell::RefCell, str::FromStr};
use yuck::value::NumWithUnit;
@ -121,7 +120,7 @@ impl ContainerImpl for TransformPriv {
impl BinImpl for TransformPriv {}
impl WidgetImpl for TransformPriv {
fn draw(&self, cr: &cairo::Context) -> Inhibit {
fn draw(&self, cr: &gtk::cairo::Context) -> glib::Propagation {
let res: Result<()> = (|| {
let rotate = *self.rotate.borrow();
let total_width = self.obj().allocated_width() as f64;
@ -166,7 +165,7 @@ impl WidgetImpl for TransformPriv {
error_handling_ctx::print_error(error)
};
gtk::Inhibit(false)
glib::Propagation::Proceed
}
}

View file

@ -8,10 +8,11 @@ use crate::{
use anyhow::{anyhow, Context, Result};
use codespan_reporting::diagnostic::Severity;
use eww_shared_util::Spanned;
use gdk::{ModifierType, NotifyType};
use gdk::{ModifierType, NotifyType};
use glib::translate::FromGlib;
use gtk::{self, glib, prelude::*, DestDefaults, TargetEntry, TargetList};
use gtk::{gdk, pango};
use itertools::Itertools;
use once_cell::sync::Lazy;
@ -232,11 +233,11 @@ pub(super) fn resolve_range_attrs(bargs: &mut BuilderArgs, gtk_widget: &gtk::Ran
let is_being_dragged = Rc::new(RefCell::new(false));
gtk_widget.connect_button_press_event(glib::clone!(@strong is_being_dragged => move |_, _| {
*is_being_dragged.borrow_mut() = true;
gtk::Inhibit(false)
glib::Propagation::Proceed
}));
gtk_widget.connect_button_release_event(glib::clone!(@strong is_being_dragged => move |_, _| {
*is_being_dragged.borrow_mut() = false;
gtk::Inhibit(false)
glib::Propagation::Proceed
}));
// We keep track of the last value that has been set via gtk_widget.set_value (by a change in the value property).
@ -507,7 +508,7 @@ fn build_gtk_button(bargs: &mut BuilderArgs) -> Result<gtk::Button> {
3 => run_command(timeout, &onrightclick, &[] as &[&str]),
_ => {},
}
gtk::Inhibit(false)
glib::Propagation::Proceed
}));
}
@ -729,25 +730,25 @@ fn build_gtk_event_box(bargs: &mut BuilderArgs) -> Result<gtk::EventBox> {
if evt.detail() != NotifyType::Inferior {
gtk_widget.clone().set_state_flags(gtk::StateFlags::PRELIGHT, false);
}
gtk::Inhibit(false)
glib::Propagation::Proceed
});
gtk_widget.connect_leave_notify_event(|gtk_widget, evt| {
if evt.detail() != NotifyType::Inferior {
gtk_widget.clone().unset_state_flags(gtk::StateFlags::PRELIGHT);
}
gtk::Inhibit(false)
glib::Propagation::Proceed
});
// Support :active selector
gtk_widget.connect_button_press_event(|gtk_widget, _| {
gtk_widget.clone().set_state_flags(gtk::StateFlags::ACTIVE, false);
gtk::Inhibit(false)
glib::Propagation::Proceed
});
gtk_widget.connect_button_release_event(|gtk_widget, _| {
gtk_widget.clone().unset_state_flags(gtk::StateFlags::ACTIVE);
gtk::Inhibit(false)
glib::Propagation::Proceed
});
def_widget!(bargs, _g, gtk_widget, {
@ -761,7 +762,7 @@ fn build_gtk_event_box(bargs: &mut BuilderArgs) -> Result<gtk::EventBox> {
if delta != 0f64 { // Ignore the first event https://bugzilla.gnome.org/show_bug.cgi?id=675959
run_command(timeout, &onscroll, &[if delta < 0f64 { "up" } else { "down" }]);
}
gtk::Inhibit(false)
glib::Propagation::Proceed
}));
},
// @prop timeout - timeout of the command. Default: "200ms"
@ -772,7 +773,7 @@ fn build_gtk_event_box(bargs: &mut BuilderArgs) -> Result<gtk::EventBox> {
if evt.detail() != NotifyType::Inferior {
run_command(timeout, &onhover, &[evt.position().0, evt.position().1]);
}
gtk::Inhibit(false)
glib::Propagation::Proceed
}));
},
// @prop timeout - timeout of the command. Default: "200ms"
@ -783,7 +784,7 @@ fn build_gtk_event_box(bargs: &mut BuilderArgs) -> Result<gtk::EventBox> {
if evt.detail() != NotifyType::Inferior {
run_command(timeout, &onhoverlost, &[evt.position().0, evt.position().1]);
}
gtk::Inhibit(false)
glib::Propagation::Proceed
}));
},
// @prop cursor - Cursor to show while hovering (see [gtk3-cursors](https://docs.gtk.org/gdk3/ctor.Cursor.new_from_name.html) for possible names)
@ -799,7 +800,7 @@ fn build_gtk_event_box(bargs: &mut BuilderArgs) -> Result<gtk::EventBox> {
gdk_window.set_cursor(gdk::Cursor::from_name(&display, &cursor).as_ref());
}
}
gtk::Inhibit(false)
glib::Propagation::Proceed
}));
connect_signal_handler!(gtk_widget, gtk_widget.connect_leave_notify_event(move |widget, _evt| {
if _evt.detail() != NotifyType::Inferior {
@ -808,7 +809,7 @@ fn build_gtk_event_box(bargs: &mut BuilderArgs) -> Result<gtk::EventBox> {
gdk_window.set_cursor(None);
}
}
gtk::Inhibit(false)
glib::Propagation::Proceed
}));
},
// @prop timeout - timeout of the command. Default: "200ms"
@ -878,7 +879,7 @@ fn build_gtk_event_box(bargs: &mut BuilderArgs) -> Result<gtk::EventBox> {
3 => run_command(timeout, &onrightclick, &[] as &[&str]),
_ => {},
}
gtk::Inhibit(false)
glib::Propagation::Proceed
}));
}
});

View file

@ -1,5 +1,4 @@
use glib::{object_subclass, wrapper};
use glib_macros::Properties;
use gtk::glib::{self, object_subclass, wrapper, Properties};
use gtk::{prelude::*, subclass::prelude::*};
use std::cell::RefCell;

View file

@ -9,8 +9,7 @@ repository = "https://github.com/elkowar/eww"
homepage = "https://github.com/elkowar/eww"
[dependencies]
gtk = "0.17.1"
gdk = "0.17.1"
gtk = "0.18.1"
zbus = { version = "3.7.0", default-features = false, features = ["tokio"] }
dbusmenu-gtk3 = "0.1.0"

View file

@ -105,7 +105,7 @@ fn icon_from_name(
) -> std::result::Result<gtk::gdk_pixbuf::Pixbuf, IconError> {
let theme = if let Some(path) = theme_path {
let theme = gtk::IconTheme::new();
theme.prepend_search_path(&path);
theme.prepend_search_path(path);
theme
} else {
gtk::IconTheme::default().expect("Could not get default gtk theme")

View file

@ -88,9 +88,9 @@ impl Item {
Ok(())
}
pub async fn popup_menu(&self, event: &gdk::EventButton, x: i32, y: i32) -> zbus::Result<()> {
pub async fn popup_menu(&self, event: &gtk::gdk::EventButton, x: i32, y: i32) -> zbus::Result<()> {
if let Some(menu) = &self.gtk_menu {
menu.popup_at_pointer(event.downcast_ref::<gdk::Event>());
menu.popup_at_pointer(event.downcast_ref::<gtk::gdk::Event>());
Ok(())
} else {
self.sni.context_menu(x, y).await