2011-01-29 14 views

Respuesta

5

Mire XDamageNotifyEvent, XDamageQueryExtension, XDamageCreate, XDamageSubtract de la extensión Damage. Esta extensión se usa para rastrear los cambios en el contenido de la ventana. http://www.freedesktop.org/wiki/Software/XDamage

Una buena fuente de código de muestra sería cualquier cosa que haga miniaturas de las ventanas. Además, cualquier administrador de ventana de composición (Compiz, algunos sabores de metacity, etc.) contendría código de seguimiento de daños.

Sin la extensión, básicamente tiene que sondear (actualizar el contenido de la ventana en un tiempo de espera).

2

Sé que esta publicación está bastante muerta. Y, sin embargo, la documentación de X11 es terrible, y me tomó mucho tiempo lograr que XDamage funcionara en cualquier aspecto. Así que aquí es un ejemplo que debe imprimir una línea a la consola cada vez que las raíces cambios de ventanas X11, en base a la documentación mencionada en el post de estragos, y basada libremente en este 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, si ejecuta este desde una consola en la misma pantalla que su pantalla :0, cada línea que imprime se activará y será un poco inestable. Pero es una buena demostración si lo ejecuta desde una terminal ssh en otra computadora.

Cuestiones relacionadas