diff --git a/src/input/cursor.c b/src/input/cursor.c index ca50a8ce..309bb6cd 100644 --- a/src/input/cursor.c +++ b/src/input/cursor.c @@ -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; diff --git a/src/input/keyboard.c b/src/input/keyboard.c index 1cf0f6a9..2b53ff0f 100644 --- a/src/input/keyboard.c +++ b/src/input/keyboard.c @@ -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); diff --git a/src/menu/menu.c b/src/menu/menu.c index 7fc1cecf..236ab26d 100644 --- a/src/menu/menu.c +++ b/src/menu/menu.c @@ -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; }