menu: run actions on button release

...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
This commit is contained in:
Johan Malm 2023-12-28 22:44:59 +00:00 committed by Johan Malm
parent cc8f4f943a
commit e9023f51c6
3 changed files with 24 additions and 17 deletions

View file

@ -940,13 +940,11 @@ cursor_button_press(struct seat *seat, uint32_t button,
} }
if (server->input_mode == LAB_INPUT_STATE_MENU) { 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) { * We close the menu on RELEASE to not leak a stray releases and
close_menu = true; * to be consistent with Openbox
} else if (menu_call_actions(ctx.node)) { */
/* Action was successful, may fail if item just opens a submenu */ close_menu = true;
close_menu = true;
}
return; return;
} }
@ -1011,9 +1009,13 @@ cursor_button_release(struct seat *seat, uint32_t button,
if (server->input_mode == LAB_INPUT_STATE_MENU) { if (server->input_mode == LAB_INPUT_STATE_MENU) {
if (close_menu) { if (close_menu) {
menu_close_root(server); if (ctx.type == LAB_SSD_MENU) {
cursor_update_common(server, &ctx, time_msec, menu_call_selected_actions(server);
/*cursor_has_moved*/ false); } else {
menu_close_root(server);
cursor_update_common(server, &ctx, time_msec,
/*cursor_has_moved*/ false);
}
close_menu = false; close_menu = false;
} }
return; return;

View file

@ -331,10 +331,7 @@ handle_menu_keys(struct server *server, struct keysyms *syms)
menu_submenu_leave(server); menu_submenu_leave(server);
break; break;
case XKB_KEY_Return: case XKB_KEY_Return:
if (menu_call_selected_actions(server)) { menu_call_selected_actions(server);
menu_close_root(server);
cursor_update_focus(server);
}
break; break;
case XKB_KEY_Escape: case XKB_KEY_Escape:
menu_close_root(server); menu_close_root(server);

View file

@ -931,9 +931,6 @@ menu_execute_item(struct menuitem *item)
return false; 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 close the menu here to provide a faster feedback to the user.
* We do that without resetting the input state so src/cursor.c * 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); menu_close(item->parent->server->menu_current);
item->parent->server->menu_current = NULL; 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; return true;
} }