Хочется иметь возможность вести лог произвольных иксовых сообщений на конкретном терминале (версия иксов X.Org X Server 1.6.0). Первая проблема — не получается ловить сообщения для всех окон, только для какого-то конкретного. Например так:
Display * d = XOpenDisplay( NULL );
int screen = DefaultScreen(d);
attr.event_mask = KeyPressMask | KeyReleaseMask
| ButtonPressMask | ButtonReleaseMask
| PointerMotionMask;
Window w = XCreateWindow (dpy, RootWindow (dpy, screen), hints.x, hints.y,
hints.width, hints.height, borderwidth, 0,
InputOutput, (Visual *) CopyFromParent, mask, &attr);
XMapWindow (dpy, w);
for (done = 0; !done;)
{
XEvent event;
XNextEvent (dpy, &event);
switch (event.type)
{
case KeyPress:
LOG4CXX_INFO(g_log_XKeylog, "KeyPress event");
break;
case KeyRelease:
LOG4CXX_INFO(g_log_XKeylog, "KeyRelease event");
break;
case ButtonPress:
LOG4CXX_INFO(g_log_XKeylog, "ButtonPress event");
break;
case ButtonRelease :
LOG4CXX_INFO(g_log_XKeylog, "ButtonRelease event");
break;
case MotionNotify:
LOG4CXX_INFO(g_log_XKeylog,"MotionNotify event " );
break;
default:
break;
}
}
Если сделать окно Window w = RootWindow (dpy, screen), захват событий не происходит.
Вторая проблема — мне не нужно перехватывать сообщения, нужно только писать в лог. Можно ли прочитать сообщение из очереди, не удаляя его(XPeekEvent - не то)?
Пробовал также захват только клавиатуры/мыши, хотя это немного не то, что надо.
Display * d = XOpenDisplay( NULL );
int screen = DefaultScreen(d);
Window root = RootWindow(d, screen);
// так почему-то не работает ((
// XGrabKey(d, AnyKey, AnyModifier, root, True, GrabModeAsync, GrabModeAsync);
for (int i = min; i <= max; i++) {
XGrabKey(d, XKeysymToKeycode(d, i), AnyModifier, root, True, GrabModeAsync, GrabModeAsync);
}
while(1){
while ( !XPending(d) ) {
XEvent event;
XNextEvent(d, &event);
Keys_t key;
switch (event.type) {
case KeyPress:
LOG4CXX_INFO(g_log_XKeylog, "Key press " );
break;
case KeyRelease:
LOG4CXX_INFO(g_log_XKeylog, "Key release " );
break;
case ButtonPress:
LOG4CXX_INFO(g_log_XKeylog, "Button press ");
break;
case ButtonRelease:
LOG4CXX_INFO(g_log_XKeylog, "Button release " );
break;
default:
break;
}
}
}
Если можно, также подскажите источник, где популярно описана архитектура иксов, не сталкивался до этого вообще.