2012-01-06 22 views
9

私はX11クリップボードを監視する必要があります。X11クリップボードのテキストを取得

私はClipBoard Selectionを5秒ごとに要求し、次にクリップボードから返されたテキストをハッシュし、最後のチェックからハッシュ計算と比較します。ハッシュが同じでない場合、私はテキストの内容を分析し、いくつかのものを行います...

私の方法は嫌いです。私はWindowsから来ており、winapiでは、クリップボードが変更されたときにあなたのプログラムに通知するのはカーネルであり、より効率的です!

クリップボードが変更されたときにX11がwinapiとしてプログラムに通知できるかどうかを知りたいだけですか? X11でクリップボードの変更をチェックするより効率的な方法は何ですか?ここで

答えて

2
  1. アプリケーションSelectionClearイベント
  2. ため
  3. 時計を通知し、SelectionRequestを送信することにより、選択のGetSelectionOwner(PRIMARYとCLIPBOARD)
  4. のgetコピーを使用して選択して、ウィンドウを探します
  5. SelectionClearイベントからのIDを使用して選択した更新ウィンドウ、ステップ2に進みます。
+0

選択所有者を閉じたときはどうしますか? – retroj

1

XFixesSelectSelectionInput()Xfixesを使用し、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も参照してください。

関連する問題