2014-02-20 34 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扩展工具监听光标改变事件 –