![当用户在 X11 中的任何窗口中选择文本时获取事件](https://linux22.com/image/196314/%E5%BD%93%E7%94%A8%E6%88%B7%E5%9C%A8%20X11%20%E4%B8%AD%E7%9A%84%E4%BB%BB%E4%BD%95%E7%AA%97%E5%8F%A3%E4%B8%AD%E9%80%89%E6%8B%A9%E6%96%87%E6%9C%AC%E6%97%B6%E8%8E%B7%E5%8F%96%E4%BA%8B%E4%BB%B6.png)
我想编写一个应用程序,在用户在 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
目录,否则您必须提供其完整路径。