ウィンドウが作成されたりウィンドウの内容が変更された場合、私のXサーバーのスクリーンショットを自動的に取得する方法を探しています。ウィンドウの内容が変更された場合、自動的にxサーバーのスクリーンショットを取る
現在、X11イベントを聞いてこれを達成していますが、すべての変更が報告されるわけではありません。
ウィンドウが作成されたりウィンドウの内容が変更された場合、私のXサーバーのスクリーンショットを自動的に取得する方法を探しています。ウィンドウの内容が変更された場合、自動的にxサーバーのスクリーンショットを取る
現在、X11イベントを聞いてこれを達成していますが、すべての変更が報告されるわけではありません。
ダメージ拡張からXDamageNotifyEvent、XDamageQueryExtension、XDamageCreate、XDamageSubtractを見てください。この拡張子は、変化するウィンドウの内容を追跡するために使用されます。 http://www.freedesktop.org/wiki/Software/XDamage
サンプルコードのソースには、ウィンドウのサムネイルを作成するものがあります。また、合成ウィンドウマネージャ(Compiz、メタデータのいくつかのフレーバなど)には、ダメージトラッキングコードが含まれています。
拡張機能がなければ、基本的にはポーリング(ウィンドウの内容をタイムアウトで更新)する必要があります。
私はこの投稿がかなり死んでいることを知っています。しかし、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端末から実行すると良いデモンストレーションです。