From 031ced85efa771518211ff0ea5b500b75753b694 Mon Sep 17 00:00:00 2001 From: bi4k8 Date: Wed, 1 Dec 2021 02:38:53 +0000 Subject: [PATCH] implement Resize as an action this requires action() to know the resize edges to use, so thread them through --- include/labwc.h | 3 ++- src/action.c | 7 ++++++- src/cursor.c | 23 ++++++++++++++--------- src/keyboard.c | 2 +- src/menu/menu.c | 2 +- 5 files changed, 24 insertions(+), 13 deletions(-) diff --git a/include/labwc.h b/include/labwc.h index 3eb8338a..f128ec1d 100644 --- a/include/labwc.h +++ b/include/labwc.h @@ -470,7 +470,8 @@ void server_init(struct server *server); void server_start(struct server *server); void server_finish(struct server *server); -void action(struct server *server, const char *action, const char *command); +void action(struct server *server, const char *action, const char *command, + uint32_t resize_edges); /* update onscreen display 'alt-tab' texture */ void osd_update(struct server *server); diff --git a/src/action.c b/src/action.c index 690e6976..b28b8093 100644 --- a/src/action.c +++ b/src/action.c @@ -20,7 +20,7 @@ show_menu(struct server *server, const char *menu) } void -action(struct server *server, const char *action, const char *command) +action(struct server *server, const char *action, const char *command, uint32_t resize_edges) { if (!action) return; @@ -77,6 +77,11 @@ action(struct server *server, const char *action, const char *command) if (view) { interactive_begin(view, LAB_INPUT_STATE_MOVE, 0); } + } else if (!strcasecmp(action, "Resize")) { + struct view *view = desktop_view_at_cursor(server); + if (view) { + interactive_begin(view, LAB_INPUT_STATE_RESIZE, resize_edges); + } } else { wlr_log(WLR_ERROR, "action (%s) not supported", action); } diff --git a/src/cursor.c b/src/cursor.c index bcbdfcdc..bb3c2c8d 100644 --- a/src/cursor.c +++ b/src/cursor.c @@ -443,7 +443,7 @@ handle_cursor_button_with_meta_key(struct view *view, uint32_t button, } static void -handle_release_mousebinding(struct server *server, uint32_t button, uint32_t modifiers, enum ssd_part_type view_area) +handle_release_mousebinding(struct server *server, uint32_t button, uint32_t modifiers, enum ssd_part_type view_area, uint32_t resize_edges) { struct mousebind *mousebind; wl_list_for_each_reverse(mousebind, &rc.mousebinds, link) { @@ -453,12 +453,12 @@ handle_release_mousebinding(struct server *server, uint32_t button, uint32_t mod if (mousebind->mouse_event == MOUSE_ACTION_RELEASE) { action(server, mousebind->action, - mousebind->command); + mousebind->command, resize_edges); } if (mousebind->pressed_in_context) { mousebind->pressed_in_context = false; action(server, mousebind->action, - mousebind->command); + mousebind->command, resize_edges); } } } @@ -488,7 +488,7 @@ is_double_click(long double_click_speed, uint32_t button) } static bool -handle_press_mousebinding(struct server *server, uint32_t button, uint32_t modifiers, enum ssd_part_type view_area) +handle_press_mousebinding(struct server *server, uint32_t button, uint32_t modifiers, enum ssd_part_type view_area, uint32_t resize_edges) { struct mousebind *mousebind; bool double_click = is_double_click(rc.doubleclick_time, button); @@ -502,7 +502,7 @@ handle_press_mousebinding(struct server *server, uint32_t button, uint32_t modif == MOUSE_ACTION_PRESS) { bound = true; action(server, mousebind->action, - mousebind->command); + mousebind->command, resize_edges); } else if (mousebind->mouse_event == MOUSE_ACTION_CLICK) { bound = true; @@ -512,7 +512,7 @@ handle_press_mousebinding(struct server *server, uint32_t button, uint32_t modif == MOUSE_ACTION_DOUBLECLICK) { bound = true; action(server, mousebind->action, - mousebind->command); + mousebind->command, resize_edges); } } } @@ -590,7 +590,7 @@ cursor_button(struct wl_listener *listener, void *data) /* Handle _press_ on root window */ if (!view) { - action(server, "ShowMenu", "root-menu"); + action(server, "ShowMenu", "root-menu", 0); return; } @@ -599,17 +599,22 @@ cursor_button(struct wl_listener *listener, void *data) desktop_raise_view(view); damage_all_outputs(server); + /* Resize if SSD resize edge is clicked */ resize_edges = ssd_resize_edges(view_area); if (resize_edges) { interactive_begin(view, LAB_INPUT_STATE_RESIZE, resize_edges); return; } + /* Determine closest resize edges in case action is Resize */ + resize_edges |= server->seat.cursor->x < view->x + view->w / 2 ? WLR_EDGE_LEFT : WLR_EDGE_RIGHT; + resize_edges |= server->seat.cursor->y < view->y + view->h / 2 ? WLR_EDGE_TOP : WLR_EDGE_BOTTOM; + mousebindings: if (event->state == WLR_BUTTON_RELEASED) { - handle_release_mousebinding(server, event->button, modifiers, view_area); + handle_release_mousebinding(server, event->button, modifiers, view_area, resize_edges); } else if (event->state == WLR_BUTTON_PRESSED) { - handle_press_mousebinding(server, event->button, modifiers, view_area); + handle_press_mousebinding(server, event->button, modifiers, view_area, resize_edges); } } diff --git a/src/keyboard.c b/src/keyboard.c index 6c45b7b5..dfbbac2a 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -65,7 +65,7 @@ handle_keybinding(struct server *server, uint32_t modifiers, xkb_keysym_t sym) for (size_t i = 0; i < keybind->keysyms_len; i++) { if (xkb_keysym_to_lower(sym) == keybind->keysyms[i]) { action(server, keybind->action, - keybind->command); + keybind->command, 0); return true; } } diff --git a/src/menu/menu.c b/src/menu/menu.c index 6f94d9fb..fb5f826c 100644 --- a/src/menu/menu.c +++ b/src/menu/menu.c @@ -416,7 +416,7 @@ menu_action_selected(struct server *server, struct menu *menu) struct menuitem *menuitem; wl_list_for_each (menuitem, &menu->menuitems, link) { if (menuitem->selected && !menuitem->submenu) { - action(server, menuitem->action, menuitem->command); + action(server, menuitem->action, menuitem->command, 0); break; } if (menuitem->submenu) { -- 2.52.0