2011-01-29 23 views
5

यदि कोई खिड़की बनाई गई है या खिड़कियों की सामग्री बदल गई है तो मैं अपने एक्स सर्वर का स्क्रीनशॉट स्वचालित रूप से लेने का एक तरीका खोज रहा हूं।विंडो सामग्री बदलते हैं तो स्वचालित रूप से एक्स सर्वर का स्क्रीनशॉट लें

मैं वर्तमान में एक्स 11 घटनाओं को सुनकर इसे प्राप्त कर रहा हूं, लेकिन सभी परिवर्तनों की सूचना नहीं दी गई है।

उत्तर

5

क्षति विस्तार से XDamageNotifyEvent, XDamageQueryExtension, XDamageCreate, XDamageSubtract को देखें। इस एक्सटेंशन का उपयोग बदलती विंडो सामग्री को ट्रैक करने के लिए किया जाता है। http://www.freedesktop.org/wiki/Software/XDamage

नमूना कोड का एक अच्छा स्रोत कुछ भी होगा जो विंडोज़ के थंबनेल बनाता है। इसके अलावा, किसी भी कंपोजिटिंग विंडो मैनेजर (कंपिज़, मेटासिटी के कुछ स्वाद, इत्यादि) में क्षति-ट्रैकिंग कोड होगा।

एक्सटेंशन के बिना, आपको मूल रूप से मतदान करना होगा (टाइमआउट में विंडो सामग्री अपडेट करें)।

2

मुझे पता है कि यह पोस्ट काफी मर चुका है। और फिर भी, एक्स 11 का दस्तावेज भयानक है, और मुझे किसी भी संबंध में 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 के रूप में, प्रत्येक पंक्ति जो इसे प्रिंट करती है, वह स्वयं को सक्रिय करेगी, और थोड़ी अस्थिर हो जाएगी। लेकिन यह एक अच्छा प्रदर्शन है यदि आप इसे किसी अन्य कंप्यूटर पर एसएसएच टर्मिनल से चलाते हैं।