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/widget/button.vala | |
parent | 785867f60e9d36df52180e92dc2e1ffb7d3f652c (diff) |
add button and eventbox events
Diffstat (limited to 'src/widget/button.vala')
-rw-r--r-- | src/widget/button.vala | 98 |
1 files changed, 90 insertions, 8 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; +} } |