adding fix for solaris compilation
[bbkeys.git] / c / bbkeys.c
blob1239f5c65b8686a9e87387df516ec79c1cfec1b4
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <sys/select.h>
5 #include <sys/time.h>
6 #include <time.h>
7 #include <X11/Xlib.h>
8 #include <X11/X.h>
9 #include <X11/keysym.h>
11 /********************************************************************/
13 Display *dpy;
14 Window root;
16 void process_event();
17 void eventLoop();
19 typedef struct {
20 long keyName;
21 long modMask;
22 int action;
23 } KEY_ACTION_MAP;
25 typedef struct {
26 int instructCount;
27 KEY_ACTION_MAP KeyMap[30];
28 } KEY_GRAB_INSTRUCTION;
30 KEY_GRAB_INSTRUCTION grabSet;
32 #define grabIconify 1
33 #define grabRaise 2
34 #define grabLower 3
35 #define grabClose 4
36 #define grabShade 5
37 #define grabVertMax 6
38 #define grabHorizMax 7
39 #define grabFullMax 8
41 /********************************************************************/
43 int main(int argc, char *argv[])
45 int i=0;
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);
62 for (i=0; i<4; i++) {
63 XGrabKey(dpy, XKeysymToKeycode(dpy, grabSet.KeyMap[i].keyName),
64 grabSet.KeyMap[i].modMask, root,
65 False, GrabModeAsync, GrabModeAsync);
67 grabSet.instructCount=4;
70 eventLoop();
71 exit(0);
74 /********************************************************************/
76 void process_event(XEvent *e) {
77 int root_x, root_y;
78 Window my_child, my_root;
79 int win_x, win_y;
80 int grabInt= -1, ifoo=0;
81 unsigned int mask;
82 unsigned int button;
83 int revert_to=0;
84 XEvent ce;
86 switch (e->type) {
87 case (KeyPress):
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) ) {
92 grabInt = ifoo;
95 if (grabInt > -1) {
96 switch (grabSet.KeyMap[grabInt].action) {
97 case grabIconify:
98 XIconifyWindow(dpy, my_child, 0);
99 break;
100 case grabRaise:
101 XRaiseWindow(dpy, my_child);
102 break;
103 case grabLower:
104 XLowerWindow(dpy, my_child);
105 break;
106 case grabClose:
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);*/
120 break;
123 default:
124 break;
128 void eventLoop(void) {
129 int xfd= ConnectionNumber(dpy);
130 time_t lastTime = time(NULL);
131 struct timeval tv;
132 fd_set rfds;
134 while (1) {
135 if (XPending(dpy)) {
136 XEvent e;
137 XNextEvent(dpy, &e);
138 process_event(&e);
141 else {
142 FD_ZERO(&rfds);
143 FD_SET(xfd, &rfds);
145 tv.tv_sec = 60;
146 tv.tv_usec = 0;
148 select(xfd + 1, &rfds, 0, 0, &tv);