LINUX.ORG.RU

Протоколирование сообщений иксов


0

0

Хочется иметь возможность вести лог произвольных иксовых сообщений на конкретном терминале (версия иксов 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;
        }
        }

    }
Та же проблема — сообщения перехватываются и не доходят до окна.

Если можно, также подскажите источник, где популярно описана архитектура иксов, не сталкивался до этого вообще.

Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.