ユーザーがX11のすべてのウィンドウでテキストを選択したときにイベントを受け取る

ユーザーがX11のすべてのウィンドウでテキストを選択したときにイベントを受け取る

ユーザーがLinux(debianベース)ウィンドウでテキストを選択した後、ポップアップメニューを表示するアプリケーションを作成したいと思います。 Macユーザーは「PopClip」(https://pilotmoon.com/popclip/)そしてLinuxでは同様のものが見つからなかったので、Linux用に直接書き始めました。

しかし、私はX11プログラミングに初めてアクセスし、ユーザーが任意のウィンドウでテキストを選択したときにacプログラムから通知を受け取る方法を知りたいです。

マウスイベントのように通知するいくつかの例を見つけました。

    window = DefaultRootWindow(display);
    XMapWindow(display, window); 
    
    XAllowEvents(display, AsyncBoth, CurrentTime);
    
    XGrabPointer(display, window, True, 
        PointerMotionMask | ButtonPressMask | ButtonReleaseMask , GrabModeAsync, GrabModeAsync, None, None, CurrentTime);

    while(1) {
        XNextEvent(display, &xevent);        
        switch (xevent.type) {
        ...
        

また、他人に知らせることが可能であることがわかりましたが、SelectionNotify実際には私の要件を満たしていませんでした。

既知のケースがありますか?

答え1

いつものように、入れるテキストを選択してください。基本的な選ぶ(クリップボードではありません。)

持つclipnotifyただし、メインまたはクリップボードを所有すると実行されますが、クリップボード部分を削除すると簡単に作成できますprimarynotify.c

#include <X11/Xatom.h>
#include <X11/Xlib.h>
#include <X11/extensions/Xfixes.h>
#include <stdlib.h>

int main(void) {
    Display *disp;
    Window root;
    XEvent evt;

    disp = XOpenDisplay(NULL);
    if (!disp)
        exit(1);

    root = DefaultRootWindow(disp);

    XFixesSelectSelectionInput(disp, root, XA_PRIMARY, XFixesSetSelectionOwnerNotifyMask);

    XNextEvent(disp, &evt);
    XCloseDisplay(disp);
}

次にコンパイルします(によって異なります)。XRepair):

cc -lX11 -lXfixes -o primarynotify primarynotify.c

シェルループで実行し、

while primarynotify; do
    echo "Primary owned: A selection has just been made."
done

primarynotifyディレクトリを入力することを忘れないでください。$PATHそれ以外の場合は、フルパスを提供する必要があります。

関連情報