Ich versuche, alle Windows-Ereignisse nach xlib abzurufen. Ich habe XChangeWindowAttributes verwendet, um SubstructureRedirectMask zum Root-Fenster hinzuzufügen. Aber wenn ich dieses Programm ausgeführt wird, zeigte es BadAccess wie folgt:Verwenden Sie xlib XChangeWindowAttributes, um alle XWindow-Ereignisse abzurufen
[email protected]:~/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
Das Programm folgt:
/*
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;
}
Wenn ich SubstructureRedirectMask entfernen, werden dort nicht gezeigt Fehler. Wer weiß, was ist daran falsch?
Sie laufen direkt auf xinit? – WhyMe