From a1e0e553ba012081052ed3081e48dd277a8ccd40 Mon Sep 17 00:00:00 2001 From: Janek Fleper Date: Sun, 24 Feb 2019 19:26:27 +0900 Subject: [PATCH 1/3] Fixed bug where the keyboard layout was changed when generating a key event --- xcape.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/xcape.c b/xcape.c index 12f48c6..38bbed3 100644 --- a/xcape.c +++ b/xcape.c @@ -67,6 +67,8 @@ typedef struct _XCape_t KeyMap_t *map; Key_t *generated; struct timeval timeout; + unsigned char intended_group; + unsigned char previous_group; } XCape_t; /************************************************************************ @@ -100,6 +102,7 @@ int main (int argc, char **argv) XRecordRange *rec_range = XRecordAllocRange(); XRecordClientSpec client_spec = XRecordAllClients; + XkbStateRec state; self->foreground = False; self->debug = False; @@ -161,6 +164,9 @@ int main (int argc, char **argv) self->data_conn = XOpenDisplay (NULL); self->ctrl_conn = XOpenDisplay (NULL); + XkbGetState (self->data_conn, XkbUseCoreKbd, &state); + self->intended_group = state.group; + if (!self->data_conn || !self->ctrl_conn) { fprintf (stderr, "Unable to connect to X11 display. Is $DISPLAY set?\n"); @@ -354,6 +360,11 @@ void intercept (XPointer user_data, XRecordInterceptData *data) XCape_t *self = (XCape_t*)user_data; static Bool mouse_pressed = False; KeyMap_t *km; + XkbStateRec state; + unsigned char current_group; + + XkbGetState (self->ctrl_conn, XkbUseCoreKbd, &state); + current_group = state.group; XLockDisplay (self->ctrl_conn); @@ -413,6 +424,18 @@ void intercept (XPointer user_data, XRecordInterceptData *data) } } + if (self->previous_group != current_group) + { + self->intended_group = current_group; + + if (self->debug) + fprintf (stdout, "Changed group to %d\n", current_group); + } + + XkbLockGroup (self->ctrl_conn, XkbUseCoreKbd, self->intended_group); + XkbGetState (self->ctrl_conn, XkbUseCoreKbd, &state); + self->previous_group = state.group; + exit: XUnlockDisplay (self->ctrl_conn); XRecordFreeData (data); From 84c7bcf32e5ab39cac3bc6271b3ae7d03eef5409 Mon Sep 17 00:00:00 2001 From: Janek Fleper Date: Tue, 5 Mar 2019 12:10:28 +0900 Subject: [PATCH 2/3] Initialize self->previous_group before intercept() --- xcape.c | 1 + 1 file changed, 1 insertion(+) diff --git a/xcape.c b/xcape.c index 38bbed3..40c31cb 100644 --- a/xcape.c +++ b/xcape.c @@ -166,6 +166,7 @@ int main (int argc, char **argv) XkbGetState (self->data_conn, XkbUseCoreKbd, &state); self->intended_group = state.group; + self->previous_group = state.group; if (!self->data_conn || !self->ctrl_conn) { From 75434996fe8580cdf3408b786525a7a9fec3abc8 Mon Sep 17 00:00:00 2001 From: Janek Fleper Date: Tue, 5 Mar 2019 12:23:32 +0900 Subject: [PATCH 3/3] Initialize self->previous_group to -1 --- xcape.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xcape.c b/xcape.c index 40c31cb..533a0a6 100644 --- a/xcape.c +++ b/xcape.c @@ -166,7 +166,7 @@ int main (int argc, char **argv) XkbGetState (self->data_conn, XkbUseCoreKbd, &state); self->intended_group = state.group; - self->previous_group = state.group; + self->previous_group = -1; if (!self->data_conn || !self->ctrl_conn) {