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 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<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, {
|
||||
// @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));
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue