2014-02-20 47 views
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(); 
    } 
} 

回答

1

X服務器沒有部件的概念。它只知道窗戶。

如果一個應用程序有一個文本輸入,單選按鈕組,並在一個窗口中完成所有的按鈕,然後在應用程序之外什麼事都沒有哪個小部件它目前考慮主動或集中或什麼的想法。

如果文本控件作爲一個窗口實際執行,你可以專注於它的變化事件。您需要在該窗口上調用XSelectInput

此外,目前還不清楚如何通過文字輸入窗口等各類在其他應用程序窗口的區分。 X服務器不知道哪些窗口是文本輸入的窗口。

+0

非常感謝!那麼有沒有辦法做到這一點?每當文本輸入獲得焦點時收到通知?或者當遊標的可見性發生變化時(假設它僅在接受鍵盤輸入的小部件集中時纔可見)? – niculare

+1

X服務器不知道文本光標。它只是繪製像其他任何圖形形狀。 –

+0

你可以用光標形狀來檢測它,但不知道它有多可靠。您需要Xfixes擴展工具監聽光標改變事件 –