So che questo post è quasi morto. Eppure, la documentazione di X11 è terribile e mi ci è voluto molto tempo per fare in modo che XDamage funzionasse a tutti gli effetti. Quindi, ecco un esempio che stamperà una linea per la console ogni volta che le radici finestra cambia X11, sulla base della documentazione di cui al post di Havoc, e liberamente ispirato a questo link:
#include <stdio.h>
#include <stdlib.h>
#include <X11/extensions/Xdamage.h>
#include <X11/Xlib.h>
#include <signal.h>
int endnow = 0;
void cleanup(int SIGNUM){
endnow = 1;
}
int main(){
Display *display;
display = XOpenDisplay(":0");
if(!display){
perror("could not open display");
exit(1);
}
Window root = DefaultRootWindow(display);
int damage_event, damage_error, test;
//this line is necessary to initialize things
test = XDamageQueryExtension(display, &damage_event, &damage_error);
/*The "event" output is apparently the integer that appears in the
Xevent.type field when XNextEvent returns an XDamage event */
printf("test = %d, event = %d, error = %d\n",test,damage_event, damage_error);
//This is the handler for the XDamage interface
//See the XDamage documentation for more damage report levels
// http://www.freedesktop.org/wiki/Software/XDamage
Damage damage = XDamageCreate(display, root, XDamageReportNonEmpty);
signal(SIGINT,cleanup);
// XCloseDisplay(display);
while(endnow == 0){
XEvent event;
XNextEvent(display,&event);
printf("event.type = %d\n",event.type);
//this line resets the XDamage handler
XDamageSubtract(display,damage,None,None);
}
XCloseDisplay(display);
printf("done\n");
exit(0);
}
Naturalmente, se si esegue questo da una console sullo stesso schermo del tuo display :0
, ogni riga che stampa si attiverà da sola e sarà un po 'instabile. Ma è una buona dimostrazione se lo si esegue da un terminale ssh su un altro computer.