From: ARDiDo <90479315+ARDiDo@users.noreply.github.com> Date: Tue, 2 Nov 2021 00:32:14 +0000 (-0400) Subject: mousebind: add support for more contexts and mouse events X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=6b948c7106b0af3dbaa3607e9a62c9be4ff39b72;p=proto%2Flabwc.git mousebind: add support for more contexts and mouse events --- diff --git a/include/config/mousebind.h b/include/config/mousebind.h index 6244a507..cfd25b51 100644 --- a/include/config/mousebind.h +++ b/include/config/mousebind.h @@ -7,6 +7,9 @@ enum mouse_event { MOUSE_ACTION_NONE = 0, MOUSE_ACTION_DOUBLECLICK, + MOUSE_ACTION_CLICK, + MOUSE_ACTION_PRESS, + MOUSE_ACTION_RELEASE, }; struct mousebind { @@ -21,6 +24,7 @@ struct mousebind { const char *command; struct wl_list link; /* rcxml::mousebinds */ + bool pressed_in_context; /* used in click events */ }; enum mouse_event mousebind_event_from_str(const char *str); diff --git a/src/config/mousebind.c b/src/config/mousebind.c index 3a980403..f12a1131 100644 --- a/src/config/mousebind.c +++ b/src/config/mousebind.c @@ -27,8 +27,14 @@ enum mouse_event mousebind_event_from_str(const char *str) { assert(str); - if (strcasecmp(str, "doubleclick") == 0) { + if (!strcasecmp(str, "doubleclick")) { return MOUSE_ACTION_DOUBLECLICK; + } else if (!strcasecmp(str, "click")) { + return MOUSE_ACTION_CLICK; + } else if (!strcasecmp(str, "press")) { + return MOUSE_ACTION_PRESS; + } else if (!strcasecmp(str, "release")) { + return MOUSE_ACTION_RELEASE; } wlr_log(WLR_ERROR, "unknown mouse action (%s)", str); return MOUSE_ACTION_NONE; @@ -39,6 +45,12 @@ context_from_str(const char *str) { if (!strcasecmp(str, "Titlebar")) { return LAB_SSD_PART_TITLEBAR; + } else if (!strcasecmp(str, "Close")) { + return LAB_SSD_BUTTON_CLOSE; + } else if (!strcasecmp(str, "Maximize")) { + return LAB_SSD_BUTTON_MAXIMIZE; + } else if (!strcasecmp(str, "Iconify")) { + return LAB_SSD_BUTTON_ICONIFY; } wlr_log(WLR_ERROR, "unknown mouse context (%s)", str); return LAB_SSD_NONE; diff --git a/src/config/rcxml.c b/src/config/rcxml.c index f9781f8b..c70fd2fc 100644 --- a/src/config/rcxml.c +++ b/src/config/rcxml.c @@ -466,6 +466,9 @@ static struct { const char *context, *button, *event, *action, *command; } mouse_combos[] = { { "TitleBar", "Left", "DoubleClick", "ToggleMaximize", NULL }, + { "Close", "Left", "Click", "Close", NULL }, + { "Iconify", "Left", "Click", "Iconify", NULL}, + { "Maximize", "Left", "Click", "ToggleMaximize", NULL}, { NULL, NULL, NULL, NULL, NULL }, }; diff --git a/src/cursor.c b/src/cursor.c index 63b0f2e7..13107c7a 100644 --- a/src/cursor.c +++ b/src/cursor.c @@ -420,6 +420,27 @@ handle_cursor_button_with_meta_key(struct view *view, uint32_t button, interactive_begin(view, LAB_INPUT_STATE_RESIZE, edges); } +static void +handle_release_mousebinding(struct server *server, uint32_t button, enum ssd_part_type view_area) +{ + struct mousebind *mousebind; + wl_list_for_each_reverse(mousebind, &rc.mousebinds, link) { + if (mousebind->context == view_area + && mousebind->button == button) { + if (mousebind->mouse_event + == MOUSE_ACTION_RELEASE) { + action(server, mousebind->action, + mousebind->command); + } + if (mousebind->pressed_in_context) { + mousebind->pressed_in_context = false; + action(server, mousebind->action, + mousebind->command); + } + } + } +} + static bool is_double_click(long double_click_speed) { @@ -433,6 +454,37 @@ is_double_click(long double_click_speed) return ms < double_click_speed && ms >= 0; } +static bool +handle_press_mousebinding(struct server *server, uint32_t button, enum ssd_part_type view_area) +{ + struct mousebind *mousebind; + bool double_click = is_double_click(rc.doubleclick_time); + bool bound; + + wl_list_for_each_reverse(mousebind, &rc.mousebinds, link) { + if (mousebind->context == view_area + && mousebind->button == button) { + if (mousebind->mouse_event + == MOUSE_ACTION_PRESS) { + bound = true; + action(server, mousebind->action, + mousebind->command); + } else if (mousebind->mouse_event + == MOUSE_ACTION_CLICK) { + bound = true; + mousebind->pressed_in_context = true; + } else if (double_click + && mousebind->mouse_event + == MOUSE_ACTION_DOUBLECLICK) { + bound = true; + action(server, mousebind->action, + mousebind->command); + } + } + } + return bound; +} + void cursor_button(struct wl_listener *listener, void *data) { @@ -471,10 +523,13 @@ cursor_button(struct wl_listener *listener, void *data) if (server->input_mode == LAB_INPUT_STATE_MENU) { return; } - /* Exit interactive move/resize/menu mode. */ - server->input_mode = LAB_INPUT_STATE_PASSTHROUGH; damage_all_outputs(server); - return; + if (server->input_mode != LAB_INPUT_STATE_PASSTHROUGH) { + /* Exit interactive move/resize/menu mode. */ + server->input_mode = LAB_INPUT_STATE_PASSTHROUGH; + return; + } + goto mousebindings; } if (server->input_mode == LAB_INPUT_STATE_MENU) { @@ -507,39 +562,24 @@ cursor_button(struct wl_listener *listener, void *data) desktop_raise_view(view); damage_all_outputs(server); - if (is_double_click(rc.doubleclick_time) - && view_area == LAB_SSD_PART_TITLEBAR) { - struct mousebind *mousebind; - wl_list_for_each_reverse (mousebind, &rc.mousebinds, link) { - /* TODO: make this more generic */ - if ((mousebind->context == LAB_SSD_PART_TITLEBAR) && - (mousebind->mouse_event == MOUSE_ACTION_DOUBLECLICK) && - (mousebind->button == event->button)) { - action(server, mousebind->action, mousebind->command); - } - } - return; - } - resize_edges = ssd_resize_edges(view_area); if (resize_edges) { interactive_begin(view, LAB_INPUT_STATE_RESIZE, resize_edges); return; } - switch (view_area) { - case LAB_SSD_BUTTON_CLOSE: - view->impl->close(view); - break; - case LAB_SSD_BUTTON_ICONIFY: - view_minimize(view, true); - break; - case LAB_SSD_PART_TITLEBAR: +mousebindings: + if (event->state == WLR_BUTTON_RELEASED) { + handle_release_mousebinding(server, event->button, view_area); + return; + } else if (event->state == WLR_BUTTON_PRESSED) { + if (handle_press_mousebinding(server, event->button, view_area)) { + return; + } + } + + if (view_area == LAB_SSD_PART_TITLEBAR) { interactive_begin(view, LAB_INPUT_STATE_MOVE, 0); - break; - case LAB_SSD_BUTTON_MAXIMIZE: - view_toggle_maximize(view); - break; } }