mirror of
https://github.com/labwc/labwc.git
synced 2025-10-29 05:40:24 -04:00
Give keyboard focus to xdg-popups of unfocused layer-shell clients
...in support of enabling panel menus to be opened by keyboard shortcuts and get keyboard focus so that they can be operated with the keyboard. An example use-case is the xfce4-panel applications-menu being opened by the command xfce4-popup-applicationmenu.
This commit is contained in:
parent
df8e3d819c
commit
df205592c2
3 changed files with 21 additions and 0 deletions
|
|
@ -380,6 +380,7 @@ void desktop_focus_topmost_view(struct server *server);
|
||||||
void seat_init(struct server *server);
|
void seat_init(struct server *server);
|
||||||
void seat_finish(struct server *server);
|
void seat_finish(struct server *server);
|
||||||
void seat_reconfigure(struct server *server);
|
void seat_reconfigure(struct server *server);
|
||||||
|
void seat_force_focus_surface(struct seat *seat, struct wlr_surface *surface);
|
||||||
void seat_focus_surface(struct seat *seat, struct wlr_surface *surface);
|
void seat_focus_surface(struct seat *seat, struct wlr_surface *surface);
|
||||||
|
|
||||||
void seat_pointer_end_grab(struct seat *seat, struct wlr_surface *surface);
|
void seat_pointer_end_grab(struct seat *seat, struct wlr_surface *surface);
|
||||||
|
|
|
||||||
|
|
@ -546,6 +546,15 @@ handle_new_popup(struct wl_listener *listener, void *data)
|
||||||
struct wlr_scene_layer_surface_v1 *surface = toplevel->scene_layer_surface;
|
struct wlr_scene_layer_surface_v1 *surface = toplevel->scene_layer_surface;
|
||||||
struct output *output = surface->layer_surface->output->data;
|
struct output *output = surface->layer_surface->output->data;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* When a popup is opened by a client without keyboard focus we need to
|
||||||
|
* force focus it so that it can be operated by the keyboard. An example
|
||||||
|
* of a use-case is the xfce4-panel start menu which can be opened by a
|
||||||
|
* keyboard shortcut (linked to xfce4-popup-applicationmenu).
|
||||||
|
*/
|
||||||
|
seat_force_focus_surface(&server->seat,
|
||||||
|
toplevel->layer_surface->surface);
|
||||||
|
|
||||||
int lx, ly;
|
int lx, ly;
|
||||||
wlr_scene_node_coords(&surface->tree->node, &lx, &ly);
|
wlr_scene_node_coords(&surface->tree->node, &lx, &ly);
|
||||||
|
|
||||||
|
|
|
||||||
11
src/seat.c
11
src/seat.c
|
|
@ -756,6 +756,17 @@ seat_reconfigure(struct server *server)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
seat_force_focus_surface(struct seat *seat, struct wlr_surface *surface)
|
||||||
|
{
|
||||||
|
uint32_t *pressed_sent_keycodes = key_state_pressed_sent_keycodes();
|
||||||
|
int nr_pressed_sent_keycodes = key_state_nr_pressed_sent_keycodes();
|
||||||
|
struct wlr_keyboard *kb = &seat->keyboard_group->keyboard;
|
||||||
|
|
||||||
|
wlr_seat_keyboard_enter(seat->seat, surface,
|
||||||
|
pressed_sent_keycodes, nr_pressed_sent_keycodes, &kb->modifiers);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
seat_focus(struct seat *seat, struct wlr_surface *surface,
|
seat_focus(struct seat *seat, struct wlr_surface *surface,
|
||||||
bool replace_exclusive_layer, bool is_lock_surface)
|
bool replace_exclusive_layer, bool is_lock_surface)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue