Add cursor property to widgets (fixes #66)
This commit is contained in:
parent
fa70a71a1a
commit
6eea3e039d
1 changed files with 28 additions and 1 deletions
|
@ -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: >k::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: >k::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: >k::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));
|
||||||
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue