1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
#include <X11/Xlib.h>
#include <X11/Xutil.h>
int main() {
Display *display;
int screen;
unsigned long white, black;
Window mainWindow, focusWindow;
XWMHints *hints;
Atom wmProtocols, wmTakeFocus;
XEvent e;
display = XOpenDisplay(NULL);
if (!display) return 1;
screen = DefaultScreen(display);
white = WhitePixel(display, screen);
black = BlackPixel(display, screen);
mainWindow = XCreateSimpleWindow(display, DefaultRootWindow(display),
100, 100, 300, 200, 0, white, white);
focusWindow = XCreateSimpleWindow(display, mainWindow,
-1, -1, 1, 1, 0, white, white);
hints = XAllocWMHints();
hints->flags = InputHint;
hints->input = False;
XSetWMHints(display, mainWindow, hints);
wmProtocols = XInternAtom(display, "WM_PROTOCOLS", False);
wmTakeFocus = XInternAtom(display, "WM_TAKE_FOCUS", False);
XSetWMProtocols(display, mainWindow, &wmTakeFocus, 1);
XSelectInput(display, focusWindow, FocusChangeMask);
XMapWindow(display, focusWindow);
XMapWindow(display, mainWindow);
for(;;) {
XNextEvent(display, &e);
if (e.type == ClientMessage &&
e.xclient.message_type == wmProtocols &&
e.xclient.data.l[0] == wmTakeFocus) {
XSetInputFocus(display, focusWindow, RevertToNone, e.xclient.data.l[1]);
} else if (e.type == FocusIn) {
XSetWindowBackground(display, mainWindow, black);
XClearWindow(display, mainWindow);
} else if (e.type == FocusOut) {
XSetWindowBackground(display, mainWindow, white);
XClearWindow(display, mainWindow);
}
}
}
|