我想编写一个应用程序,在用户在 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
目录,否则您必须提供其完整路径。