Add cursor property to widgets (fixes #66)

This commit is contained in:
elkowar 2021-05-09 17:04:29 +02:00
parent fa70a71a1a
commit 6eea3e039d
No known key found for this signature in database
GPG key ID: E321AD71B1D1F27F

View file

@ -2,6 +2,7 @@
use super::{run_command, BuilderArgs}; use super::{run_command, BuilderArgs};
use crate::{config, eww_state, resolve_block, value::AttrVal, widgets::widget_node}; use crate::{config, eww_state, resolve_block, value::AttrVal, widgets::widget_node};
use anyhow::*; use anyhow::*;
use gdk::WindowExt;
use glib; use glib;
use gtk::{self, prelude::*, ImageExt}; use gtk::{self, prelude::*, ImageExt};
use std::{cell::RefCell, collections::HashMap, rc::Rc}; use std::{cell::RefCell, collections::HashMap, rc::Rc};
@ -51,6 +52,8 @@ pub(super) fn resolve_widget_attrs(bargs: &mut BuilderArgs, gtk_widget: &gtk::Wi
let on_scroll_handler_id: Rc<RefCell<Option<glib::SignalHandlerId>>> = Rc::new(RefCell::new(None)); let on_scroll_handler_id: Rc<RefCell<Option<glib::SignalHandlerId>>> = Rc::new(RefCell::new(None));
let on_hover_handler_id: Rc<RefCell<Option<glib::SignalHandlerId>>> = Rc::new(RefCell::new(None)); let on_hover_handler_id: Rc<RefCell<Option<glib::SignalHandlerId>>> = Rc::new(RefCell::new(None));
let cursor_hover_enter_handler_id: Rc<RefCell<Option<glib::SignalHandlerId>>> = Rc::new(RefCell::new(None));
let cursor_hover_leave_handler_id: Rc<RefCell<Option<glib::SignalHandlerId>>> = Rc::new(RefCell::new(None));
resolve_block!(bargs, gtk_widget, { resolve_block!(bargs, gtk_widget, {
// @prop class - css class name // @prop class - css class name
@ -107,7 +110,7 @@ pub(super) fn resolve_widget_attrs(bargs: &mut BuilderArgs, gtk_widget: &gtk::Wi
prop(onhover: as_string) { prop(onhover: as_string) {
gtk_widget.add_events(gdk::EventMask::ENTER_NOTIFY_MASK); gtk_widget.add_events(gdk::EventMask::ENTER_NOTIFY_MASK);
let old_id = on_hover_handler_id.replace(Some( 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)); run_command(&onhover, format!("{} {}", evt.get_position().0, evt.get_position().1));
gtk::Inhibit(false) gtk::Inhibit(false)
}) })
@ -115,6 +118,30 @@ pub(super) fn resolve_widget_attrs(bargs: &mut BuilderArgs, gtk_widget: &gtk::Wi
old_id.map(|id| gtk_widget.disconnect(id)); 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));
},
}); });
} }