C X11等待并获取剪贴板文本
我必须监视X11剪贴板 目前,我每5秒请求一次剪贴板选择,然后对从剪贴板返回的文本进行散列,并将其与上次检查时计算的散列值进行比较。如果散列不一样,我分析文本内容并做一些事情 我不喜欢我的方法。我来自Windows,使用winapi,当剪贴板发生更改时,内核会通知您的程序,而且效率更高 我只是想知道,当剪贴板发生更改时,X11是否可能以winapi的形式通知您的程序?使用X11检查剪贴板修改的更有效方法是什么?这里有一个很好的参考:这里有一个很好的参考:C X11等待并获取剪贴板文本,c,x11,C,X11,我必须监视X11剪贴板 目前,我每5秒请求一次剪贴板选择,然后对从剪贴板返回的文本进行散列,并将其与上次检查时计算的散列值进行比较。如果散列不一样,我分析文本内容并做一些事情 我不喜欢我的方法。我来自Windows,使用winapi,当剪贴板发生更改时,内核会通知您的程序,而且效率更高 我只是想知道,当剪贴板发生更改时,X11是否可能以winapi的形式通知您的程序?使用X11检查剪贴板修改的更有效方法是什么?这里有一个很好的参考:这里有一个很好的参考: 使用GetSelectionOwner(
GetSelectionOwner
(主窗口和剪贴板)查找包含所选内容的窗口选择清除事件
SelectionClear
事件中的id更新窗口,转到步骤2GetSelectionOwner
(主窗口和剪贴板)查找包含所选内容的窗口选择清除事件
SelectionClear
事件中的id更新窗口,转到步骤2从Xfixes扩展中使用
xfixeselectionput()
并等待xfixeselectionnotify
事件
例如:
//gcc-o xclipwatch xclipwatch.c-lX11-lX11
...
#包括
...
无效观察选择(显示*显示,窗口,常量字符*bufname)
{
int事件库、错误库;
XEvent事件;
Atom bufid=XInternAtom(显示,bufname,False);
断言(XFixesQueryExtension(显示、事件库和错误库));
xFixesseSelectionInput(显示、DefaultRootWindow(显示)、bufid、xFixessesSelectionOwnerNotifyMask);
while(True)
{
XNextEvent(显示和事件);
if(event.type==event_base+XFixesSelectionNotify&&
((XFixesSelectionNotifyEvent*)和event)->selection==bufid)
{
如果(!打印选择(显示、窗口、bufname、“UTF8\U字符串”))
打印选择(显示、窗口、bufname、“字符串”);
fflush(stdout);
}
}
}
...
这适用于bufname==“剪贴板”
和bufname==“主”
选择
另请参见
PrintSelection()
函数。从Xfixes扩展中使用xfixeselectionput()
并等待xfixeselectionnotify
事件
例如:
//gcc-o xclipwatch xclipwatch.c-lX11-lX11
...
#包括
...
无效观察选择(显示*显示,窗口,常量字符*bufname)
{
int事件库、错误库;
XEvent事件;
Atom bufid=XInternAtom(显示,bufname,False);
断言(XFixesQueryExtension(显示、事件库和错误库));
xFixesseSelectionInput(显示、DefaultRootWindow(显示)、bufid、xFixessesSelectionOwnerNotifyMask);
while(True)
{
XNextEvent(显示和事件);
if(event.type==event_base+XFixesSelectionNotify&&
((XFixesSelectionNotifyEvent*)和event)->selection==bufid)
{
如果(!打印选择(显示、窗口、bufname、“UTF8\U字符串”))
打印选择(显示、窗口、bufname、“字符串”);
fflush(stdout);
}
}
}
...
这适用于bufname==“剪贴板”
和bufname==“主”
选择
另请参见
PrintSelection()
函数。这没有回答问题。这没有回答问题。当选择所有者关闭时,您会做什么?当选择所有者关闭时,您会做什么?请不要将强制命令放入assert()
,(请参见NDEBUG
)。更好:intxfixinstalled=XFixesQueryExtension(显示、事件库和错误库);断言(xfixinstalled)代码>请不要将强制命令放入assert()
,(请参阅NDEBUG
)。更好:intxfixinstalled=XFixesQueryExtension(显示、事件库和错误库);断言(xfixinstalled)代码>
// 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);
}
}
}
...