xwayland: Don't send KeyRelease events on wl_keyboard::leave
Commits816015648f
andfee0827a9a
made it so that wl_keyboard::enter doesn't result in X clients getting KeyPress events while still updating our internal xkb state to be in sync with the host compositor. wl_keyboard::leave needs to be handled in the same way as its semantics from an X client POV should be the same as an X grab getting triggered, i.e. X clients shouldn't get KeyRelease events for keys that are still down at that point. This patch uses LeaveNotify for these events on wl_keyboard::leave and changes the current use of KeymapNotify to EnterNotify instead just to keep some symmetry between both cases. On ProcessDeviceEvent() we still need to deactivate X grabs if needed for KeyReleases. Signed-off-by: Rui Matos <tiagomatos@gmail.com> Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
parent
2de37eb71b
commit
5611585b87
|
@ -1798,15 +1798,19 @@ ProcessDeviceEvent(InternalEvent *ev, DeviceIntPtr device)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (grab)
|
/* Don't deliver focus events (e.g. from KeymapNotify when running
|
||||||
DeliverGrabbedEvent((InternalEvent *) event, device,
|
* nested) to clients. */
|
||||||
deactivateDeviceGrab);
|
if (event->source_type != EVENT_SOURCE_FOCUS) {
|
||||||
else if (device->focus && !IsPointerEvent(ev))
|
if (grab)
|
||||||
DeliverFocusedEvent(device, (InternalEvent *) event,
|
DeliverGrabbedEvent((InternalEvent *) event, device,
|
||||||
GetSpriteWindow(device));
|
deactivateDeviceGrab);
|
||||||
else
|
else if (device->focus && !IsPointerEvent(ev))
|
||||||
DeliverDeviceEvents(GetSpriteWindow(device), (InternalEvent *) event,
|
DeliverFocusedEvent(device, (InternalEvent *) event,
|
||||||
NullGrab, NullWindow, device);
|
GetSpriteWindow(device));
|
||||||
|
else
|
||||||
|
DeliverDeviceEvents(GetSpriteWindow(device), (InternalEvent *) event,
|
||||||
|
NullGrab, NullWindow, device);
|
||||||
|
}
|
||||||
|
|
||||||
if (deactivateDeviceGrab == TRUE) {
|
if (deactivateDeviceGrab == TRUE) {
|
||||||
(*device->deviceGrab.DeactivateGrab) (device);
|
(*device->deviceGrab.DeactivateGrab) (device);
|
||||||
|
|
|
@ -1101,9 +1101,12 @@ GetKeyboardEvents(InternalEvent *events, DeviceIntPtr pDev, int type,
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (type == KeymapNotify) {
|
if (type == EnterNotify) {
|
||||||
source_type = EVENT_SOURCE_FOCUS;
|
source_type = EVENT_SOURCE_FOCUS;
|
||||||
type = KeyPress;
|
type = KeyPress;
|
||||||
|
} else if (type == LeaveNotify) {
|
||||||
|
source_type = EVENT_SOURCE_FOCUS;
|
||||||
|
type = KeyRelease;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* refuse events from disabled devices */
|
/* refuse events from disabled devices */
|
||||||
|
|
|
@ -640,7 +640,7 @@ keyboard_handle_enter(void *data, struct wl_keyboard *keyboard,
|
||||||
|
|
||||||
wl_array_copy(&xwl_seat->keys, keys);
|
wl_array_copy(&xwl_seat->keys, keys);
|
||||||
wl_array_for_each(k, &xwl_seat->keys)
|
wl_array_for_each(k, &xwl_seat->keys)
|
||||||
QueueKeyboardEvents(xwl_seat->keyboard, KeymapNotify, *k + 8);
|
QueueKeyboardEvents(xwl_seat->keyboard, EnterNotify, *k + 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -652,12 +652,8 @@ keyboard_handle_leave(void *data, struct wl_keyboard *keyboard,
|
||||||
|
|
||||||
xwl_seat->xwl_screen->serial = serial;
|
xwl_seat->xwl_screen->serial = serial;
|
||||||
|
|
||||||
/* Unlike keymap_handle_enter above, this time we _do_ want to trigger
|
|
||||||
* full release, as we don't know how long we'll be out of focus for.
|
|
||||||
* Notify clients that the keys have been released, disable autorepeat,
|
|
||||||
* etc. */
|
|
||||||
wl_array_for_each(k, &xwl_seat->keys)
|
wl_array_for_each(k, &xwl_seat->keys)
|
||||||
QueueKeyboardEvents(xwl_seat->keyboard, KeyRelease, *k + 8);
|
QueueKeyboardEvents(xwl_seat->keyboard, LeaveNotify, *k + 8);
|
||||||
|
|
||||||
xwl_seat->keyboard_focus = NULL;
|
xwl_seat->keyboard_focus = NULL;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user