Capturing global key press events
- From: Vikram Noel Ambrose <noel ambrose gmail com>
- To: gtk-list gnome org
- Subject: Capturing global key press events
- Date: Mon, 01 Mar 2010 23:29:19 -0500
I'd like to capture global key press events to enable a "Global
Shortcuts" feature in my application.
I've looked at a few other projects that have such capabilities and they
all seem to hook straight into xlib. Is there a more GTK way of doing it?
At the moment I'm using,
XKeysymToKeycode($DISPLAY,XStringToKeysym("some key in here"));
And then passing the resulting key code to XGrabKey,
XGrabKey($DISPLAY,key,Mod4Mask|ShiftMask,$WINDOW,True,GrabModeAsync,GrabModeAsync);
Then I call XSync($DISPLAY,0); I dont know why, but if I dont, gtk
segfaults.
I then wait for events with XNextEvent($DISPLAY,&event); inside a
pthread and when an event comes by, i call a signal callback surrounded
with gdk_threads_enter and _leave.
Now all this worked nicely for a while, but somehow I've managed to
break it :(
It doesnt seem to pick up the events from the keys I passed to XGrabKeys
anymore. If I switch to AnyModifier, it picks things up, but obviously
the keyboard becomes unusable for other applications then.
I believe XGrabKeys will alert me with a BadAccess error if i try to use
a key that is already being grabbed by another x client, but I dont know
how well this mechanism works.
Mod4Mask seems to refer to the Super Key, aka, "Windows Key". So in my
example I have modifiers Shift+Super and keycode "key".
When it worked, I had Shift+Super+{z,x,c,v,b} setup. Now nothing works
and for the best of me, I can't seem to understand what I've changed.
A little background information: My app is heavily threaded, there are
about 12+ threads at any given time. They are all created with
pthread_create, and use gdk_threads_enter/leave before touching anything
gdk/gtk/glib related.
In main() I call g_thread_init( NULL ); and gdk_threads_init(); before
gtk_init(argc,argv);
I've read in some places one should surround gtk_main() with
gdk_threads_enter/leave, but this absolutely doesnt make any sense to
me. If I try to do that, the app locks in gtk_main and doesnt startup.
My assumption is that gdk_threads_enter() "acts" like sem_wait() and
gdk_threads_leave() acts like sem_post(), where gdk_threads_init() sets
the value of the semaphore to 1.
With this assumption I've used gdk_threads_enter/leave throughout my app
and it definitely works.
I'm guessing there is some sort of conflict between the key-press-event
for the top level GtkWindow and my xlib key grabbing, but I don't know
how to debug the situation further. Any ideas whats going on?
thanks,
Vikram.
PS: GTK docs are much better than X11 docs :)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]