]> git.mdlowis.com Git - proto/labwc.git/commitdiff
menu: run actions on button release
authorJohan Malm <jgm323@gmail.com>
Thu, 28 Dec 2023 22:44:59 +0000 (22:44 +0000)
committerJohan Malm <johanmalm@users.noreply.github.com>
Thu, 11 Jan 2024 20:31:24 +0000 (20:31 +0000)
...and call actions after closing menus so that virtual keyboard input
caused by actions are sent to the surface with keyboard-focus rather
than being consumed by the open menu.

Fixes: #1366
src/input/cursor.c
src/input/keyboard.c
src/menu/menu.c

index ca50a8cea7af56144272d2c513b9782ff2a1222d..309bb6cd05e3d9d750235a2aadfb8e7e268a15a4 100644 (file)
@@ -940,13 +940,11 @@ cursor_button_press(struct seat *seat, uint32_t button,
        }
 
        if (server->input_mode == LAB_INPUT_STATE_MENU) {
-               /* We are closing the menu on RELEASE to not leak a stray release */
-               if (ctx.type != LAB_SSD_MENU) {
-                       close_menu = true;
-               } else if (menu_call_actions(ctx.node)) {
-                       /* Action was successful, may fail if item just opens a submenu */
-                       close_menu = true;
-               }
+               /*
+                * We close the menu on RELEASE to not leak a stray releases and
+                * to be consistent with Openbox
+                */
+               close_menu = true;
                return;
        }
 
@@ -1011,9 +1009,13 @@ cursor_button_release(struct seat *seat, uint32_t button,
 
        if (server->input_mode == LAB_INPUT_STATE_MENU) {
                if (close_menu) {
-                       menu_close_root(server);
-                       cursor_update_common(server, &ctx, time_msec,
-                               /*cursor_has_moved*/ false);
+                       if (ctx.type == LAB_SSD_MENU) {
+                               menu_call_selected_actions(server);
+                       } else {
+                               menu_close_root(server);
+                               cursor_update_common(server, &ctx, time_msec,
+                                       /*cursor_has_moved*/ false);
+                       }
                        close_menu = false;
                }
                return;
index 1cf0f6a99aed2115809a2fe571e090ae19220c04..2b53ff0f9f13a29a16dfcf16ea3c6bb0e1286cfb 100644 (file)
@@ -331,10 +331,7 @@ handle_menu_keys(struct server *server, struct keysyms *syms)
                        menu_submenu_leave(server);
                        break;
                case XKB_KEY_Return:
-                       if (menu_call_selected_actions(server)) {
-                               menu_close_root(server);
-                               cursor_update_focus(server);
-                       }
+                       menu_call_selected_actions(server);
                        break;
                case XKB_KEY_Escape:
                        menu_close_root(server);
index 7fc1cecfdae0edf62d678e52637cbc5008cbf0c6..236ab26df6d8592777bb63db7a3fd4189ee7ca1b 100644 (file)
@@ -931,9 +931,6 @@ menu_execute_item(struct menuitem *item)
                return false;
        }
 
-       actions_run(item->parent->triggered_by_view,
-               item->parent->server, &item->actions, 0);
-
        /*
         * We close the menu here to provide a faster feedback to the user.
         * We do that without resetting the input state so src/cursor.c
@@ -942,6 +939,17 @@ menu_execute_item(struct menuitem *item)
        menu_close(item->parent->server->menu_current);
        item->parent->server->menu_current = NULL;
 
+       struct server *server = item->parent->server;
+       menu_close_root(server);
+       cursor_update_focus(server);
+
+       /*
+        * We call the actions after menu_close_root() so that virtual keyboard
+        * input is sent to the focused_surface instead of being absorbed by the
+        * menu. Consider for example: `wlrctl keyboard type abc`
+        */
+       actions_run(item->parent->triggered_by_view, server, &item->actions, 0);
+
        return true;
 }