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擴展工具監聽光標改變事件 –