2011-01-29 5 views

答えて

5

ダメージ拡張からXDamageNotifyEvent、XDamageQueryExtension、XDamageCreate、XDamageSubtractを見てください。この拡張子は、変化するウィンドウの内容を追跡するために使用されます。 http://www.freedesktop.org/wiki/Software/XDamage

サンプルコードのソースには、ウィンドウのサムネイルを作成するものがあります。また、合成ウィンドウマネージャ(Compiz、メタデータのいくつかのフレーバなど)には、ダメージトラッキングコードが含まれています。

拡張機能がなければ、基本的にはポーリング(ウィンドウの内容をタイムアウトで更新)する必要があります。

2

私はこの投稿がかなり死んでいることを知っています。しかし、X11のドキュメンテーションはひどいので、XDamageが何らかの点で動くようになるまでには長い時間がかかりました。そこでここでは、コンソールたびハボックの記事で言及した文書に基づいてルートX11ウィンドウ変化にラインを表示します例があり、かつ緩くこの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); 
} 

ディスプレイ:0と同じ画面のコンソールから、それが印刷するすべての行はそれ自身を起動し、ちょっと不安定になります。しかし、別のコンピュータのssh端末から実行すると良いデモンストレーションです。

関連する問題