4 #include <sys/select.h>
9 #include <X11/keysym.h>
11 /********************************************************************/
27 KEY_ACTION_MAP KeyMap
[30];
28 } KEY_GRAB_INSTRUCTION
;
30 KEY_GRAB_INSTRUCTION grabSet
;
38 #define grabHorizMax 7
41 /********************************************************************/
43 int main(int argc
, char *argv
[])
46 grabSet
.KeyMap
[0].keyName
=XK_m
;
47 grabSet
.KeyMap
[0].modMask
=Mod1Mask
;
48 grabSet
.KeyMap
[0].action
=grabIconify
;
49 grabSet
.KeyMap
[1].keyName
=XK_Up
;
50 grabSet
.KeyMap
[1].modMask
=Mod1Mask
;
51 grabSet
.KeyMap
[1].action
=grabRaise
;
52 grabSet
.KeyMap
[2].keyName
=XK_Down
;
53 grabSet
.KeyMap
[2].modMask
=Mod1Mask
;
54 grabSet
.KeyMap
[2].action
=grabLower
;
55 grabSet
.KeyMap
[3].keyName
=XK_F4
;
56 grabSet
.KeyMap
[3].modMask
=Mod1Mask
;
57 grabSet
.KeyMap
[3].action
=grabClose
;
59 dpy
= XOpenDisplay(NULL
);
60 root
= DefaultRootWindow(dpy
);
63 XGrabKey(dpy
, XKeysymToKeycode(dpy
, grabSet
.KeyMap
[i
].keyName
),
64 grabSet
.KeyMap
[i
].modMask
, root
,
65 False
, GrabModeAsync
, GrabModeAsync
);
67 grabSet
.instructCount
=4;
74 /********************************************************************/
76 void process_event(XEvent
*e
) {
78 Window my_child
, my_root
;
80 int grabInt
= -1, ifoo
=0;
88 XGetInputFocus(dpy
, &my_child
, &revert_to
);
89 for (ifoo
=0; ifoo
< grabSet
.instructCount
; ifoo
++) {
90 if ( XKeycodeToKeysym(dpy
, e
->xkey
.keycode
, 0)
91 == (grabSet
.KeyMap
[ifoo
].keyName
) ) {
96 switch (grabSet
.KeyMap
[grabInt
].action
) {
98 XIconifyWindow(dpy
, my_child
, 0);
101 XRaiseWindow(dpy
, my_child
);
104 XLowerWindow(dpy
, my_child
);
107 ce
.xclient
.type
= ClientMessage
;
108 ce
.xclient
.message_type
= XInternAtom(dpy
, "WM_PROTOCOLS", False
);
109 ce
.xclient
.display
= dpy
;
110 /*ce.xclient.window = client.window;*/
111 ce
.xclient
.window
= my_child
;
112 ce
.xclient
.format
= 32;
113 ce
.xclient
.data
.l
[0] = XInternAtom(dpy
, "WM_DELETE_WINDOW", False
);
114 ce
.xclient
.data
.l
[1] = CurrentTime
;
115 ce
.xclient
.data
.l
[2] = 0l;
116 ce
.xclient
.data
.l
[3] = 0l;
117 ce
.xclient
.data
.l
[4] = 0l;
118 XSendEvent(dpy
, my_child
, False
, NoEventMask
, &ce
);
119 /*XDestroyWindow(dpy, my_child);*/
128 void eventLoop(void) {
129 int xfd
= ConnectionNumber(dpy
);
130 time_t lastTime
= time(NULL
);
148 select(xfd
+ 1, &rfds
, 0, 0, &tv
);