Commit 81601564 authored by Daniel Stone's avatar Daniel Stone Committed by Peter Hutterer

Input: Add focus-in event source

Add a new event source type for keypress events synthesised from focus
notifications (e.g. KeymapNotify from the parent server, when running
nested). This is used to keep the keys-down array in sync with the host
server's, without sending actual keypress events to clients.
Signed-off-by: Daniel Stone's avatarDaniel Stone <>
Reviewed-by: Peter Hutterer's avatarPeter Hutterer <>
Signed-off-by: Peter Hutterer's avatarPeter Hutterer <>
parent c3788394
......@@ -1760,6 +1760,10 @@ ProcessDeviceEvent(InternalEvent *ev, DeviceIntPtr device)
switch (event->type) {
case ET_KeyPress:
/* Don't deliver focus events (e.g. from KeymapNotify when running
* nested) to clients. */
if (event->source_type == EVENT_SOURCE_FOCUS)
if (!grab && CheckDeviceGrabs(device, event, 0))
......@@ -1101,6 +1101,11 @@ GetKeyboardEvents(InternalEvent *events, DeviceIntPtr pDev, int type,
if (type == KeymapNotify) {
source_type = EVENT_SOURCE_FOCUS;
type = KeyPress;
/* refuse events from disabled devices */
if (!pDev->enabled)
return 0;
......@@ -83,6 +83,7 @@ enum EventType {
enum DeviceEventSource {
EVENT_SOURCE_NORMAL = 0, /**< Default: from a user action (e.g. key press) */
EVENT_SOURCE_FOCUS, /**< Keys or buttons previously down on focus-in */
......@@ -1206,6 +1206,32 @@ XkbActionGetFilter(DeviceIntPtr dev, DeviceEvent *event, KeyCode key,
XkbSrvInfoPtr xkbi = dev->key->xkbInfo;
XkbFilterPtr filter;
/* For focus events, we only want to run actions which update our state to
* (hopefully vaguely kinda) match that of the host server, rather than
* actually execute anything. For example, if we enter our VT with
* Ctrl+Alt+Backspace held down, we don't want to terminate our server
* immediately, but we _do_ want Ctrl+Alt to be latched down, so if
* Backspace is released and then pressed again, the server will terminate.
* This is pretty flaky, and we should in fact inherit the complete state
* from the host server. There are some state combinations that we cannot
* express by running the state machine over every key, e.g. if AltGr+Shift
* generates a different state to Shift+AltGr. */
if (event->source_type == EVENT_SOURCE_FOCUS) {
switch (act->type) {
case XkbSA_SetMods:
case XkbSA_SetGroup:
case XkbSA_LatchMods:
case XkbSA_LatchGroup:
case XkbSA_LockMods:
case XkbSA_LockGroup:
*sendEvent = 1;
switch (act->type) {
case XkbSA_SetMods:
case XkbSA_SetGroup:
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment