summaryrefslogtreecommitdiff
path: root/xkb/xkbActions.c
diff options
context:
space:
mode:
Diffstat (limited to 'xkb/xkbActions.c')
-rw-r--r--xkb/xkbActions.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/xkb/xkbActions.c b/xkb/xkbActions.c
index ddd09abd1..aeb702c63 100644
--- a/xkb/xkbActions.c
+++ b/xkb/xkbActions.c
@@ -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:
+ break;
+ default:
+ *sendEvent = 1;
+ return;
+ }
+ }
+
switch (act->type) {
case XkbSA_SetMods:
case XkbSA_SetGroup: