Используйте xlib XChangeWindowAttributes для получения всех событий XWindow - PullRequest
2 голосов
/ 18 ноября 2010

Я пытаюсь получить все события Windows с помощью xlib. Я использовал XChangeWindowAttributes, чтобы добавить SubstructureRedirectMask в корневое окно. Но когда я выполнил эту программу, она показала BadAccess следующим образом:

dorowu@dorowu-F3JP:~/src/xwindow$ sudo ./tmp
X Error of failed request:  BadAccess (attempt to access private resource denied)
  Major opcode of failed request:  2 (X_ChangeWindowAttributes)
  Serial number of failed request:  7
  Current serial number in output stream:  8

Программа следующая:

/*
   Simple Xlib application drawing a box in a window.
   To Compile: gcc -O2 -Wall -o test test.c -L /usr/X11R6/lib -lX11 -lm
   */

#include<X11/Xlib.h>
#include<stdio.h>
#include<stdlib.h> // prevents error for exit on line 18 when compiling with gcc

int main() {
    Display *d;
    XEvent e;

    /* open connection with the server */
    d = XOpenDisplay(NULL);
    if (d == NULL) {
        printf("Cannot open display\n");
        exit(1);
    }

    // sniffer events
    XSetWindowAttributes attr;

    attr.override_redirect = 1;
    attr.event_mask = SubstructureRedirectMask | SubstructureNotifyMask |
        KeyReleaseMask | PointerMotionMask ;
    XChangeWindowAttributes(d, XDefaultRootWindow(d), CWEventMask , &attr);
    XSync(d, False);

    /* event loop */
    while(1) {
        XNextEvent(d, &e);
        printf("event: %d\n", e.type);
    }

    /* close connection to server */
    XCloseDisplay(d);

    return 0;
}

Если я удаляю SubstructureRedirectMask, ошибки не отображаются. Кто-нибудь знает, что с этим не так?

1 Ответ

0 голосов
/ 28 июля 2011

Только один клиент одновременно может это сделать. У вас уже есть такой клиент, это ваш оконный менеджер.

...