0
我目前正在寻找一种方式来接收窗口小部件焦点变化事件在Linux OS X服务器。接收集中部件变化的事件与X11/Xlib的
我尝试过使用XSelectInput(dpy, focuswin, FocusChangeMask);
,但服务器仅在关注的窗口发生变化时通知我,而不是在特定窗口内的焦点窗口部件(例如文本输入)发送通知。
我想以此来显示每当一个可编辑的文本区域获得焦点的虚拟键盘来实现这一目标。
现在为止写的代码是:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <X11/Xlib.h>
#include <X11/Intrinsic.h>
static Display *dpy;
static Window focuswin = None;
static void attach_to_focuswin(void) {
int revert_to = 0;
XGetInputFocus(dpy, &focuswin, &revert_to);
XSetWindowAttributes attr;
attr.event_mask = FocusChangeMask;
XChangeWindowAttributes(dpy, focuswin, CWEventMask, &attr);
if (focuswin != None)
XSelectInput(dpy, focuswin, FocusChangeMask);
else
sleep(1);
}
static void handle_event(void) {
XEvent ev;
char buf[100];
int len;
XNextEvent(dpy, &ev);
if (ev.xany.type == FocusOut) {
focuswin = None;
fprintf(stdout, "func: handle_event -> focusing out of window\n\n\n");
} else if (ev.xany.type == FocusIn) {
fprintf(stdout, "func: handle_event -> focusing out of window\n\n\n");
} else if (ev.xany.type == KeyPress) {
len = XLookupString(&ev.xkey, buf, 99, 0, 0);
buf[len] = 0;
printf("%s", buf);
fflush(stdout);
} else {
fprintf(stdout, "func: handle_event -> something else %d\n\n\n", ev.type);
}
}
int main(void) {
dpy = XOpenDisplay(getenv("DISPLAY"));
if (dpy == NULL) {
fprintf(stdout, "cannot init display\n");
exit(1);
}
while (1) {
if (focuswin == None)
attach_to_focuswin();
else
handle_event();
}
}
非常感谢!那么有没有办法做到这一点?每当文本输入获得焦点时收到通知?或者当游标的可见性发生变化时(假设它仅在接受键盘输入的小部件集中时才可见)? – niculare
X服务器不知道文本光标。它只是绘制像其他任何图形形状。 –
你可以用光标形状来检测它,但不知道它有多可靠。您需要Xfixes扩展工具监听光标改变事件 –