From 6eea3e039d8362600df4030a29c84cf2f572809b Mon Sep 17 00:00:00 2001 From: elkowar <5300871+elkowar@users.noreply.github.com> Date: Sun, 9 May 2021 17:04:29 +0200 Subject: [PATCH] Add cursor property to widgets (fixes #66) --- src/widgets/widget_definitions.rs | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/src/widgets/widget_definitions.rs b/src/widgets/widget_definitions.rs index 92d63fc..187b91d 100644 --- a/src/widgets/widget_definitions.rs +++ b/src/widgets/widget_definitions.rs @@ -2,6 +2,7 @@ use super::{run_command, BuilderArgs}; use crate::{config, eww_state, resolve_block, value::AttrVal, widgets::widget_node}; use anyhow::*; +use gdk::WindowExt; use glib; use gtk::{self, prelude::*, ImageExt}; use std::{cell::RefCell, collections::HashMap, rc::Rc}; @@ -51,6 +52,8 @@ pub(super) fn resolve_widget_attrs(bargs: &mut BuilderArgs, gtk_widget: >k::Wi let on_scroll_handler_id: Rc>> = Rc::new(RefCell::new(None)); let on_hover_handler_id: Rc>> = Rc::new(RefCell::new(None)); + let cursor_hover_enter_handler_id: Rc>> = Rc::new(RefCell::new(None)); + let cursor_hover_leave_handler_id: Rc>> = Rc::new(RefCell::new(None)); resolve_block!(bargs, gtk_widget, { // @prop class - css class name @@ -107,7 +110,7 @@ pub(super) fn resolve_widget_attrs(bargs: &mut BuilderArgs, gtk_widget: >k::Wi prop(onhover: as_string) { gtk_widget.add_events(gdk::EventMask::ENTER_NOTIFY_MASK); let old_id = on_hover_handler_id.replace(Some( - gtk_widget.connect_scroll_event(move |_, evt| { + gtk_widget.connect_enter_notify_event(move |_, evt| { run_command(&onhover, format!("{} {}", evt.get_position().0, evt.get_position().1)); gtk::Inhibit(false) }) @@ -115,6 +118,30 @@ pub(super) fn resolve_widget_attrs(bargs: &mut BuilderArgs, gtk_widget: >k::Wi old_id.map(|id| gtk_widget.disconnect(id)); }, + // @prop cursor - Cursor to show while hovering (see [gtk3-cursors](https://developer.gnome.org/gdk3/stable/gdk3-Cursors.html) for possible names) + prop(cursor: as_string) { + gtk_widget.add_events(gdk::EventMask::ENTER_NOTIFY_MASK); + cursor_hover_enter_handler_id.replace(Some( + gtk_widget.connect_enter_notify_event(move |widget, _evt| { + let display = gdk::Display::get_default(); + let gdk_window = widget.get_window(); + if let (Some(display), Some(gdk_window)) = (display, gdk_window) { + gdk_window.set_cursor(gdk::Cursor::from_name(&display, &cursor).as_ref()); + } + gtk::Inhibit(false) + }) + )).map(|id| gtk_widget.disconnect(id)); + + cursor_hover_leave_handler_id.replace(Some( + gtk_widget.connect_leave_notify_event(move |widget, _evt| { + let gdk_window = widget.get_window(); + if let Some(gdk_window) = gdk_window { + gdk_window.set_cursor(None); + } + gtk::Inhibit(false) + }) + )).map(|id| gtk_widget.disconnect(id)); + }, }); }