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

Loading…
Cancel
Save