当用户在 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);
}

然后编译它(取决于X修复):

cc -lX11 -lXfixes -o primarynotify primarynotify.c

并在 shell 循环中运行它,

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

请记住放入primarynotify某个$PATH目录,否则您必须提供其完整路径。

相关内容