]> git.mdlowis.com Git - proto/labwc.git/commitdiff
implement Resize as an action
authorbi4k8 <bi4k8@github>
Wed, 1 Dec 2021 02:38:53 +0000 (02:38 +0000)
committerJohan Malm <johanmalm@users.noreply.github.com>
Wed, 1 Dec 2021 22:45:20 +0000 (22:45 +0000)
this requires action() to know the resize edges to use, so thread them through

include/labwc.h
src/action.c
src/cursor.c
src/keyboard.c
src/menu/menu.c

index 3eb8338a8483d1cc3928a72681d4551048a3645e..f128ec1dd6e39cc99de4f6c45c04bed32217658f 100644 (file)
@@ -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);
index 690e6976333afc857362d02fd5b30e4fd46cf858..b28b8093f850d205c94aa0feb047e59f0f8aaf8a 100644 (file)
@@ -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);
        }
index bcbdfcdcbc5212064d4a159708cc8a7bc0ef5f1a..bb3c2c8d3f73f99af8c1f63d3c3d08530da0a9f4 100644 (file)
@@ -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);
        }
 }
 
index 6c45b7b5d7132b84a45669fc4bd8f7e53da22d9f..dfbbac2accac4d94914e582378d5b41b0d77b8f8 100644 (file)
@@ -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;
                        }
                }
index 6f94d9fb2db46e3050b8c02784abea5e0414db62..fb5f826c8dd46d31bf0e19095f88d3187888303f 100644 (file)
@@ -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) {