mirror of
https://github.com/labwc/labwc.git
synced 2025-11-02 09:01:47 -05:00
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:
parent
cc8f4f943a
commit
e9023f51c6
3 changed files with 24 additions and 17 deletions
|
|
@ -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
|
||||||
|
* to be consistent with Openbox
|
||||||
|
*/
|
||||||
close_menu = true;
|
close_menu = true;
|
||||||
} else if (menu_call_actions(ctx.node)) {
|
|
||||||
/* Action was successful, may fail if item just opens a submenu */
|
|
||||||
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) {
|
||||||
|
if (ctx.type == LAB_SSD_MENU) {
|
||||||
|
menu_call_selected_actions(server);
|
||||||
|
} else {
|
||||||
menu_close_root(server);
|
menu_close_root(server);
|
||||||
cursor_update_common(server, &ctx, time_msec,
|
cursor_update_common(server, &ctx, time_msec,
|
||||||
/*cursor_has_moved*/ false);
|
/*cursor_has_moved*/ false);
|
||||||
|
}
|
||||||
close_menu = false;
|
close_menu = false;
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue