libweston: Send wl_keyboard.modifiers after wl_keyboard.enter
The core Wayland protocol explicitly states that wl_keyboard.modifiers must be send after wl_keyboard.enter. This commit also changes the behavior of `seat_get_keyboard` to not send `wl_keyboard.modifiers` in case where seat had pointer focus, but not keyboard one. Signed-off-by: Kirill Chibisov <contact@kchibisov.com>
This commit is contained in:
parent
f7f8f5f1a8
commit
c46c70dac8
@ -1518,10 +1518,10 @@ send_enter_to_resource_list(struct wl_list *list,
|
|||||||
struct wl_resource *resource;
|
struct wl_resource *resource;
|
||||||
|
|
||||||
wl_resource_for_each(resource, list) {
|
wl_resource_for_each(resource, list) {
|
||||||
send_modifiers_to_resource(keyboard, resource, serial);
|
|
||||||
wl_keyboard_send_enter(resource, serial,
|
wl_keyboard_send_enter(resource, serial,
|
||||||
surface->resource,
|
surface->resource,
|
||||||
&keyboard->keys);
|
&keyboard->keys);
|
||||||
|
send_modifiers_to_resource(keyboard, resource, serial);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2848,28 +2848,6 @@ static const struct wl_keyboard_interface keyboard_interface = {
|
|||||||
keyboard_release
|
keyboard_release
|
||||||
};
|
};
|
||||||
|
|
||||||
static bool
|
|
||||||
should_send_modifiers_to_client(struct weston_seat *seat,
|
|
||||||
struct wl_client *client)
|
|
||||||
{
|
|
||||||
struct weston_keyboard *keyboard = weston_seat_get_keyboard(seat);
|
|
||||||
struct weston_pointer *pointer = weston_seat_get_pointer(seat);
|
|
||||||
|
|
||||||
if (keyboard &&
|
|
||||||
keyboard->focus &&
|
|
||||||
keyboard->focus->resource &&
|
|
||||||
wl_resource_get_client(keyboard->focus->resource) == client)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
if (pointer &&
|
|
||||||
pointer->focus &&
|
|
||||||
pointer->focus->surface->resource &&
|
|
||||||
wl_resource_get_client(pointer->focus->surface->resource) == client)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
seat_get_keyboard(struct wl_client *client, struct wl_resource *resource,
|
seat_get_keyboard(struct wl_client *client, struct wl_resource *resource,
|
||||||
uint32_t id)
|
uint32_t id)
|
||||||
@ -2915,12 +2893,6 @@ seat_get_keyboard(struct wl_client *client, struct wl_resource *resource,
|
|||||||
|
|
||||||
weston_keyboard_send_keymap(keyboard, cr);
|
weston_keyboard_send_keymap(keyboard, cr);
|
||||||
|
|
||||||
if (should_send_modifiers_to_client(seat, client)) {
|
|
||||||
send_modifiers_to_resource(keyboard,
|
|
||||||
cr,
|
|
||||||
keyboard->focus_serial);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (keyboard->focus && keyboard->focus->resource &&
|
if (keyboard->focus && keyboard->focus->resource &&
|
||||||
wl_resource_get_client(keyboard->focus->resource) == client) {
|
wl_resource_get_client(keyboard->focus->resource) == client) {
|
||||||
struct weston_surface *surface =
|
struct weston_surface *surface =
|
||||||
@ -2934,6 +2906,10 @@ seat_get_keyboard(struct wl_client *client, struct wl_resource *resource,
|
|||||||
surface->resource,
|
surface->resource,
|
||||||
&keyboard->keys);
|
&keyboard->keys);
|
||||||
|
|
||||||
|
send_modifiers_to_resource(keyboard,
|
||||||
|
cr,
|
||||||
|
keyboard->focus_serial);
|
||||||
|
|
||||||
/* If this is the first keyboard resource for this
|
/* If this is the first keyboard resource for this
|
||||||
* client... */
|
* client... */
|
||||||
if (keyboard->focus_resource_list.prev ==
|
if (keyboard->focus_resource_list.prev ==
|
||||||
|
Loading…
Reference in New Issue
Block a user