aboutsummaryrefslogtreecommitdiff
path: root/river/Cursor.zig
diff options
context:
space:
mode:
Diffstat (limited to 'river/Cursor.zig')
-rw-r--r--river/Cursor.zig42
1 files changed, 25 insertions, 17 deletions
diff --git a/river/Cursor.zig b/river/Cursor.zig
index 1ca75d7..c84c3af 100644
--- a/river/Cursor.zig
+++ b/river/Cursor.zig
@@ -397,23 +397,11 @@ fn handleButton(listener: ?*c.wl_listener, data: ?*c_void) callconv(.C) void {
// perhaps enter move/resize mode.
if (View.fromWlrSurface(wlr_surface)) |view| {
if (event.state == .WLR_BUTTON_PRESSED and self.pressed_count == 1) {
- // If the button is pressed and the pointer modifier is
- // active, enter cursor mode or close view and return.
- const fullscreen = view.current.fullscreen or view.pending.fullscreen;
- if (self.seat.pointer_modifier) {
- switch (event.button) {
- c.BTN_LEFT => if (!fullscreen) Mode.enter(self, .move, event, view),
- c.BTN_MIDDLE => view.close(),
- c.BTN_RIGHT => if (!fullscreen) Mode.enter(self, .resize, event, view),
-
- // TODO Some mice have additional buttons. These
- // could also be bound to some useful action.
- else => {},
- }
- return;
- } else {
- Mode.enter(self, .down, event, view);
- }
+ // If there is an active mapping for this button which is
+ // handled we are done here
+ if (self.handlePointerMapping(event, view)) return;
+ // Otherwise enter cursor down mode
+ Mode.enter(self, .down, event, view);
}
}
@@ -426,6 +414,26 @@ fn handleButton(listener: ?*c.wl_listener, data: ?*c_void) callconv(.C) void {
}
}
+/// Handle the mapping for the passed button if any. Returns true if there
+/// was a mapping and the button was handled.
+fn handlePointerMapping(self: *Self, event: *c.wlr_event_pointer_button, view: *View) bool {
+ const wlr_keyboard = c.wlr_seat_get_keyboard(self.seat.wlr_seat);
+ const modifiers = c.wlr_keyboard_get_modifiers(wlr_keyboard);
+
+ const fullscreen = view.current.fullscreen or view.pending.fullscreen;
+
+ const config = self.seat.input_manager.server.config;
+ return for (config.modes.items[self.seat.mode_id].pointer_mappings.items) |mapping| {
+ if (event.button == mapping.event_code and modifiers == mapping.modifiers) {
+ switch (mapping.action) {
+ .move => if (!fullscreen) Mode.enter(self, .move, event, view),
+ .resize => if (!fullscreen) Mode.enter(self, .resize, event, view),
+ }
+ break true;
+ }
+ } else false;
+}
+
fn handleFrame(listener: ?*c.wl_listener, data: ?*c_void) callconv(.C) void {
// This event is forwarded by the cursor when a pointer emits an frame
// event. Frame events are sent after regular pointer events to group