2011-01-29 9 views

risposta

5

Guardare XDamageNotifyEvent, XDamageQueryExtension, XDamageCreate, XDamageSubtract dall'estensione Damage. Questa estensione è usata per tracciare il cambiamento dei contenuti della finestra. http://www.freedesktop.org/wiki/Software/XDamage

Una buona fonte di codice di esempio sarebbe tutto ciò che rende le miniature di Windows. Inoltre, qualsiasi gestore di finestre di compositing (Compiz, alcuni sapori di metacity, ecc.) Conterrà il codice di tracciamento del danno.

Senza l'estensione, è necessario eseguire il polling (aggiornare i contenuti della finestra in un timeout).

2

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.

Problemi correlati