diff options
author | Aylur <[email protected]> | 2024-05-29 21:33:59 +0200 |
---|---|---|
committer | Aylur <[email protected]> | 2024-05-29 21:33:59 +0200 |
commit | e5868a2514d8f2c28a9294d336c8ccd50e34be43 (patch) | |
tree | 736e3e75ef3a8191c1ba4b75dd0b7e06ec6dbf2b /src | |
parent | 785867f60e9d36df52180e92dc2e1ffb7d3f652c (diff) |
add button and eventbox events
Diffstat (limited to 'src')
-rw-r--r-- | src/widget/button.vala | 98 | ||||
-rw-r--r-- | src/widget/eventbox.vala | 78 |
2 files changed, 158 insertions, 18 deletions
diff --git a/src/widget/button.vala b/src/widget/button.vala index 601733f..05ae02f 100644 --- a/src/widget/button.vala +++ b/src/widget/button.vala @@ -1,9 +1,10 @@ namespace Astal { public class Button : Gtk.Button { - public signal void hover (Gdk.EventCrossing event); - public signal void hover_lost (Gdk.EventCrossing event); - public signal void click (Gdk.EventButton event); - public signal void click_release (Gdk.EventButton event); + public signal void hover (HoverEvent event); + public signal void hover_lost (HoverEvent event); + public signal void click (ClickEvent event); + public signal void click_release (ClickEvent event); + public signal void scroll (ScrollEvent event); construct { add_events(Gdk.EventMask.SCROLL_MASK); @@ -12,24 +13,105 @@ public class Button : Gtk.Button { enter_notify_event.connect((self, event) => { if (event.window == self.get_window() && event.detail != Gdk.NotifyType.INFERIOR) { - hover(event); + var hover_event = HoverEvent(); + hover_event.lost = false; + hover_event.time = event.time; + hover_event.x = event.x; + hover_event.y = event.y; + hover_event.modifier = event.state; + hover_event.mode = event.mode; + hover_event.detail = event.detail; + hover(hover_event); } }); leave_notify_event.connect((self, event) => { if (event.window == self.get_window() && event.detail != Gdk.NotifyType.INFERIOR) { - hover_lost(event); + var hover_event = HoverEvent(); + hover_event.lost = true; + hover_event.time = event.time; + hover_event.x = event.x; + hover_event.y = event.y; + hover_event.modifier = event.state; + hover_event.mode = event.mode; + hover_event.detail = event.detail; + hover_lost(hover_event); } }); button_press_event.connect((event) => { - click(event); + var click_event = ClickEvent(); + click_event.release = false; + click_event.time = event.time; + click_event.x = event.x; + click_event.y = event.y; + click_event.button = (MouseButton)event.button; + click_event.modifier = event.state; + click(click_event); }); button_release_event.connect((event) => { - click_release(event); + var click_event = ClickEvent(); + click_event.release = true; + click_event.x = event.x; + click_event.y = event.y; + click_event.button = (MouseButton)event.button; + click_event.modifier = event.state; + click_release(click_event); + }); + + scroll_event.connect((event) => { + var scroll_event = ScrollEvent(); + scroll_event.time = event.time; + scroll_event.x = event.x; + scroll_event.y = event.y; + scroll_event.modifier = event.state; + scroll_event.direction = event.direction; + scroll_event.delta_x = event.delta_x; + scroll_event.delta_y = event.delta_y; + scroll(scroll_event); }); } } + +public enum MouseButton { + PRIMARY = 0, + MIDDLE, + SECONDARY, + BACK, + FORWARD, +} + +// these structs are here because gjs converts every event +// into a union Gdk.Event, which cannot be destructured +// and are not as convinent to work with as a struct +public struct ClickEvent { + bool release; + uint time; + double x; + double y; + Gdk.ModifierType modifier; + MouseButton button; +} + +public struct HoverEvent { + bool lost; + uint time; + double x; + double y; + Gdk.ModifierType modifier; + Gdk.CrossingMode mode; + Gdk.NotifyType detail; +} + +public struct ScrollEvent { + uint time; + double x; + double y; + Gdk.ModifierType modifier; + Gdk.ScrollDirection direction; + double delta_x; + double delta_y; +} } diff --git a/src/widget/eventbox.vala b/src/widget/eventbox.vala index de04a32..54b0da5 100644 --- a/src/widget/eventbox.vala +++ b/src/widget/eventbox.vala @@ -1,19 +1,30 @@ namespace Astal { public class EventBox : Gtk.EventBox { - public signal void hover (Gdk.EventCrossing event); - public signal void hover_lost (Gdk.EventCrossing event); - public signal void click (Gdk.EventButton event); - public signal void click_release (Gdk.EventButton event); + public signal void hover (HoverEvent event); + public signal void hover_lost (HoverEvent event); + public signal void click (ClickEvent event); + public signal void click_release (ClickEvent event); + public signal void scroll (ScrollEvent event); + public signal void motion (MotionEvent event); construct { add_events(Gdk.EventMask.SCROLL_MASK); add_events(Gdk.EventMask.SMOOTH_SCROLL_MASK); + add_events(Gdk.EventMask.POINTER_MOTION_MASK); enter_notify_event.connect((self, event) => { if (event.window == self.get_window() && event.detail != Gdk.NotifyType.INFERIOR) { this.set_state_flags(Gtk.StateFlags.PRELIGHT, false); - hover(event); + var hover_event = HoverEvent(); + hover_event.lost = false; + hover_event.time = event.time; + hover_event.x = event.x; + hover_event.y = event.y; + hover_event.modifier = event.state; + hover_event.mode = event.mode; + hover_event.detail = event.detail; + hover(hover_event); } }); @@ -21,19 +32,66 @@ public class EventBox : Gtk.EventBox { if (event.window == self.get_window() && event.detail != Gdk.NotifyType.INFERIOR) { this.unset_state_flags(Gtk.StateFlags.PRELIGHT); - hover_lost(event); + var hover_event = HoverEvent(); + hover_event.lost = true; + hover_event.time = event.time; + hover_event.x = event.x; + hover_event.y = event.y; + hover_event.modifier = event.state; + hover_event.mode = event.mode; + hover_event.detail = event.detail; + hover_lost(hover_event); } }); button_press_event.connect((event) => { - // TODO: abstract event for easier use - click(event); + var click_event = ClickEvent(); + click_event.release = false; + click_event.time = event.time; + click_event.x = event.x; + click_event.y = event.y; + click_event.button = (MouseButton)event.button; + click_event.modifier = event.state; + click(click_event); }); button_release_event.connect((event) => { - // TODO: abstract event for easier use - click_release(event); + var click_event = ClickEvent(); + click_event.release = true; + click_event.x = event.x; + click_event.y = event.y; + click_event.button = (MouseButton)event.button; + click_event.modifier = event.state; + click_release(click_event); + }); + + scroll_event.connect((event) => { + var scroll_event = ScrollEvent(); + scroll_event.time = event.time; + scroll_event.x = event.x; + scroll_event.y = event.y; + scroll_event.modifier = event.state; + scroll_event.direction = event.direction; + scroll_event.delta_x = event.delta_x; + scroll_event.delta_y = event.delta_y; + scroll(scroll_event); + }); + + motion_notify_event.connect((event) => { + var motion_event = MotionEvent(); + motion_event.time = event.time; + motion_event.x = event.x; + motion_event.y = event.y; + motion_event.modifier = event.state; + motion(motion_event); }); } } + +public struct MotionEvent { + uint time; + double x; + double y; + Gdk.ModifierType modifier; +} } |