mirror of
https://gitlab.freedesktop.org/wayland/weston.git
synced 2026-01-06 13:10:34 +01:00
compositor: properly restore keyboard_focus in notify_keyboard_focus()
Commit f992b2fc removed the saved keyboard focus logic to fix a crash
when the saved surface is destroyed. However, setting keyboard focus to
the first surface on the list ends up trying to set the focus to the
cursor surface most of the time. The end result is a NULL keyboard
focus.
This patch restores the saved keyboard focus logic and fixes the crash
mentioned above using a destroy listener.
This commit is contained in:
parent
96b0abd88a
commit
71b1d0c91d
2 changed files with 31 additions and 7 deletions
|
|
@ -1636,6 +1636,18 @@ notify_pointer_focus(struct wl_input_device *device,
|
|||
}
|
||||
}
|
||||
|
||||
static void
|
||||
destroy_device_saved_kbd_focus(struct wl_listener *listener,
|
||||
struct wl_resource *resource, uint32_t time)
|
||||
{
|
||||
struct weston_input_device *wd;
|
||||
|
||||
wd = container_of(listener, struct weston_input_device,
|
||||
saved_kbd_focus_listener);
|
||||
|
||||
wd->saved_kbd_focus = NULL;
|
||||
}
|
||||
|
||||
WL_EXPORT void
|
||||
notify_keyboard_focus(struct wl_input_device *device,
|
||||
uint32_t time, struct weston_output *output,
|
||||
|
|
@ -1647,12 +1659,6 @@ notify_keyboard_focus(struct wl_input_device *device,
|
|||
struct weston_surface *es;
|
||||
uint32_t *k;
|
||||
|
||||
if (!wl_list_empty(&compositor->surface_list))
|
||||
es = container_of(compositor->surface_list.next,
|
||||
struct weston_surface, link);
|
||||
else
|
||||
es = NULL;
|
||||
|
||||
if (output) {
|
||||
wl_array_copy(&wd->input_device.keys, keys);
|
||||
wd->modifier_state = 0;
|
||||
|
|
@ -1661,14 +1667,30 @@ notify_keyboard_focus(struct wl_input_device *device,
|
|||
update_modifier_state(wd, *k, 1);
|
||||
}
|
||||
|
||||
if (es && es->surface.resource.client)
|
||||
es = wd->saved_kbd_focus;
|
||||
|
||||
if (es) {
|
||||
wl_list_remove(&wd->saved_kbd_focus_listener.link);
|
||||
wl_input_device_set_keyboard_focus(&wd->input_device,
|
||||
&es->surface, time);
|
||||
wd->saved_kbd_focus = NULL;
|
||||
}
|
||||
} else {
|
||||
wl_array_for_each(k, &device->keys)
|
||||
weston_compositor_idle_release(compositor);
|
||||
|
||||
wd->modifier_state = 0;
|
||||
|
||||
es = wd->input_device.keyboard_focus;
|
||||
|
||||
if (es) {
|
||||
wd->saved_kbd_focus = es;
|
||||
wd->saved_kbd_focus_listener.func =
|
||||
destroy_device_saved_kbd_focus;
|
||||
wl_list_insert(es->surface.resource.destroy_listener_list.prev,
|
||||
&wd->saved_kbd_focus_listener.link);
|
||||
}
|
||||
|
||||
wl_input_device_set_keyboard_focus(&wd->input_device,
|
||||
NULL, time);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -113,6 +113,8 @@ struct weston_input_device {
|
|||
struct wl_list link;
|
||||
uint32_t modifier_state;
|
||||
int hw_cursor;
|
||||
struct wl_surface *saved_kbd_focus;
|
||||
struct wl_listener saved_kbd_focus_listener;
|
||||
|
||||
uint32_t num_tp;
|
||||
struct wl_surface *touch_focus;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue