2012-01-06 12 views
9

मुझे एक्स 11 क्लिपबोर्ड पर नजर रखना है।एक्स 11 क्लिपबोर्ड टेक्स्ट प्राप्त करें

इस पल के लिए, मैं प्रत्येक 5 सेकंड में क्लिपबोर्ड चयन का अनुरोध करता हूं, फिर मैंने क्लिपबोर्ड से पाठ वापस कर दिया है और मैं इसे अंतिम चेक से हैश गणना के साथ तुलना करता हूं। यदि हैश समान नहीं हैं, तो मैं टेक्स्ट सामग्री का विश्लेषण करता हूं और कुछ सामान करता हूं ...

मुझे अपनी विधि पसंद नहीं है। मैं विंडोज से हूं, और winapi के साथ, यह कर्नेल है जो क्लिपबोर्ड बदल गया है, और यह अधिक कुशल है, अपने प्रोग्राम को सूचित करें!

मैं सिर्फ यह जानना चाहता हूं कि क्या यह संभव है कि X11 क्लिपबोर्ड बदलते समय Winapi के रूप में आपके प्रोग्राम को सूचित कर सके? X11 के साथ क्लिपबोर्ड संशोधन की जांच करने का अधिक प्रभावी तरीका क्या है?

उत्तर

2
  1. ढूँढें खिड़की GetSelectionOwner (प्राथमिक और क्लिपबोर्ड) SelectionRequest भेजकर चयन के
  2. प्रतिलिपि प्राप्त का उपयोग कर, आपके आवेदन SelectionClear घटना के लिए
  3. घड़ी को सूचित
  4. SelectionClear ईवेंट से आईडी का उपयोग करके चयन के साथ विंडो अपडेट करें, गोटो चरण 2
+0

चयन स्वामी बंद होने पर आप क्या करते हैं? – retroj

1

से एक्सफिक्स एक्सटेंशन का उपयोग करें और XFixesSelectionNotify ईवेंट के लिए प्रतीक्षा करें।

उदाहरण:

// gcc -o xclipwatch xclipwatch.c -lX11 -lXfixes 
... 
#include <X11/extensions/Xfixes.h> 
... 
void WatchSelection(Display *display, Window window, const char *bufname) 
{ 
    int event_base, error_base; 
    XEvent event; 
    Atom bufid = XInternAtom(display, bufname, False); 

    assert(XFixesQueryExtension(display, &event_base, &error_base)); 
    XFixesSelectSelectionInput(display, DefaultRootWindow(display), bufid, XFixesSetSelectionOwnerNotifyMask); 

    while (True) 
    { 
    XNextEvent(display, &event); 

    if (event.type == event_base + XFixesSelectionNotify && 
     ((XFixesSelectionNotifyEvent*)&event)->selection == bufid) 
    { 
     if (!PrintSelection(display, window, bufname, "UTF8_STRING")) 
     PrintSelection(display, window, bufname, "STRING"); 

     fflush(stdout); 
    } 
    } 
} 
... 

यह काम करता है दोनों bufname == "CLIPBOARD" और bufname == "PRIMARY" चयन के लिए।

यह भी देखें PrintSelection() फ़ंक्शन in this answer

संबंधित मुद्दे