Global events receiving (keyboard, mouse events, active window change)

Yong Sun Yong.Sun at Sun.COM
Mon Dec 25 17:51:06 PST 2006


Hi, Alex,

Try XRecord extension. See xnee for reference.

Regards,

Alexander Nemish wrote:
> Hi everyone,
> I need to trac all keyboard and mouse events in my program. Also I need to 
> trac active window change event. Googling gave approx nothing.
>
> Now I'm using XGrabKey to trac keypresses and mouse buttons presses and 
> XkbSelectEventDetails to receive Ctrl, Atl and Shift presses.
> I have working code:
> Display *dpy = XOpenDisplay(0); 
> assert(dpy);
> Screen *scr = DefaultScreenOfDisplay(dpy);
> int screen = DefaultScreen(dpy);
> Window window = RootWindow(dpy, screen);
> int opcode, event, error, major, minor;
> XkbQueryExtension(dpy, &opcode, &event, &error, &major, &minor);
> #define _GRUB(key) \
> 	do { \
> 	cout << "attemting " << hex << key << endl; \
> 	XGrabKey(dpy, XKeysymToKeycode(dpy, key), 0, window, False, GrabModeAsync, 
> GrabModeAsync); \
> 	}while(0)
>
> _GRUB(XK_BackSpace);
> _GRUB(XK_Tab);
> _GRUB(XK_Return);
> _GRUB(XK_Escape);
> _GRUB(XK_Delete);
> for (int key = XK_Home; key < XK_Begin; ++key)
> 	_GRUB(key);
> for (int key = XK_F1; key < XK_F12; ++key)
> 	_GRUB(key);
> for (int key = XK_space; key < XK_asciitilde; ++key)
> 	_GRUB(key);
> int res = XkbSelectEventDetails( dpy, XkbUseCoreKbd, XkbStateNotify,
>                       XkbAllStateComponentsMask, XkbAllStateComponentsMask);
>
> while(1)
> {
> 	XkbEvent ev;
> 	XNextEvent(dpy, &ev.core);
> 	XEvent& e = ev.core;
> 		
> 	switch (e.type)
> 	{
> 		case KeyPress:
> 			XSendEvent(dpy, InputFocus, False, KeyPressMask, &e);
> 			break;
> 		case KeyRelease:
> 			XSendEvent(dpy, InputFocus, False, KeyReleaseMask, &e);
> 			break;
> 		default:
> 			if ((e.type == event) && (ev.any.xkb_type == XkbStateNotify))
> 			{
> 				switch (event.event_type)
> 				{
> 					case KeyPress:
> 						break;
> 					case KeyRelease:
> 						break;
> 					case ButtonPress:
> 						break;
> 					case ButtonRelease:
> 						break;
> 				}
> 			}
> 	}
> }
>
> But I think that's not the *right way*. 
> Using XSelectInput(dpy, root_window, KeyPressMask) does not work. Using 
> XGrabKeyboard results in problems with sending grabbed event to the 
> destination, such combos like Alt+Tab etc don't work.
>
> Also I need to get all top-levet windows and their titles. I'm using 
> XQueryTree(dpy, root_window, ...) and XGetWMName for every child returned. 
> I'm getting _all_windows and have no idea on which are top-level.s
>
> Have no idea how to receive active window change notification. Any ideas are 
> welcome.
>
> Could you please give me any ideas or (preferably) any working code how to do 
> all those things?
>
> Thanks,
> Alexander
> _______________________________________________
> xorg mailing list
> xorg at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/xorg
>   




More information about the xorg mailing list