Fix issue #5, Ctrl should not act as Esc when mouse buttons are involved

old-master
Albin Olsson 14 years ago
parent 4fce7c4e2c
commit 3da651d4fa
  1. 72
      xcape.c

@ -116,7 +116,7 @@ int main (int argc, char **argv)
XRecordRange *rec_range = XRecordAllocRange(); XRecordRange *rec_range = XRecordAllocRange();
rec_range->device_events.first = KeyPress; rec_range->device_events.first = KeyPress;
rec_range->device_events.last = KeyRelease; rec_range->device_events.last = ButtonRelease;
XRecordClientSpec client_spec = XRecordAllClients; XRecordClientSpec client_spec = XRecordAllClients;
self->record_ctx = XRecordCreateContext (self->ctrl_conn, self->record_ctx = XRecordCreateContext (self->ctrl_conn,
@ -183,8 +183,9 @@ void *sig_handler (void *user_data)
void intercept (XPointer user_data, XRecordInterceptData *data) void intercept (XPointer user_data, XRecordInterceptData *data)
{ {
XCape_t *self = (XCape_t*)user_data; XCape_t *self = (XCape_t*)user_data;
static Bool ctrl_pressed = False; static Bool ctrl_pressed = False;
static Bool ctrl_used = False; static Bool ctrl_used = False;
static Bool mouse_pressed = False;
if (data->category == XRecordFromServer) if (data->category == XRecordFromServer)
{ {
@ -195,35 +196,52 @@ void intercept (XPointer user_data, XRecordInterceptData *data)
"Intercepted key event %d, key code %d\n", "Intercepted key event %d, key code %d\n",
key_event, key_code); key_event, key_code);
if (XkbKeycodeToKeysym (self->ctrl_conn, key_code, 0, 0) if (key_event == ButtonPress)
== XK_Control_L)
{ {
if (key_event == KeyPress) ctrl_used = ctrl_pressed;
{ mouse_pressed = True;
if (self->debug) fprintf (stdout, "Control pressed!\n"); }
ctrl_pressed = True; else if (key_event == ButtonRelease)
} {
else mouse_pressed = False;
}
else
{
if (XkbKeycodeToKeysym (self->ctrl_conn, key_code, 0, 0)
== XK_Control_L)
{ {
if (self->debug) fprintf (stdout, "Control released!\n"); if (key_event == KeyPress)
if (ctrl_used == False)
{ {
if (self->debug) fprintf (stdout, if (self->debug) fprintf (stdout, "Control pressed!\n");
"Generating ESC!\n"); ctrl_pressed = True;
XTestFakeKeyEvent (self->ctrl_conn, if (mouse_pressed)
self->escape_key, True, 0); {
XTestFakeKeyEvent (self->ctrl_conn, ctrl_used = True;
self->escape_key, False, 0); }
XFlush (self->ctrl_conn); }
else
{
if (self->debug) fprintf (stdout, "Control released!\n");
if (ctrl_used == False)
{
if (self->debug) fprintf (stdout,
"Generating ESC!\n");
XTestFakeKeyEvent (self->ctrl_conn,
self->escape_key, True, 0);
XTestFakeKeyEvent (self->ctrl_conn,
self->escape_key, False, 0);
XFlush (self->ctrl_conn);
}
ctrl_pressed = False;
ctrl_used = False;
} }
ctrl_pressed = False;
ctrl_used = False;
} }
} else if (ctrl_pressed && key_event == KeyPress)
else if (ctrl_pressed && key_event == KeyPress) {
{ ctrl_used = True;
ctrl_used = True; }
} }
} }

Loading…
Cancel
Save