42 #include <X11/Xutil.h> |
42 #include <X11/Xutil.h> |
43 |
43 |
44 /* macros */ |
44 /* macros */ |
45 #define BUTTONMASK (ButtonPressMask | ButtonReleaseMask) |
45 #define BUTTONMASK (ButtonPressMask | ButtonReleaseMask) |
46 #define CLEANMASK(mask) (mask & ~(numlockmask | LockMask)) |
46 #define CLEANMASK(mask) (mask & ~(numlockmask | LockMask)) |
|
47 #define LENGTH(x) (sizeof x / sizeof x[0]) |
|
48 #define MAXTAGLEN 16 |
47 #define MOUSEMASK (BUTTONMASK | PointerMotionMask) |
49 #define MOUSEMASK (BUTTONMASK | PointerMotionMask) |
48 #define LENGTH(x) (sizeof x / sizeof x[0]) |
|
49 |
50 |
50 |
51 |
51 /* enums */ |
52 /* enums */ |
52 enum { BarTop, BarBot, BarOff }; /* bar position */ |
53 enum { BarTop, BarBot, BarOff }; /* bar position */ |
53 enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ |
54 enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ |
141 Client *getclient(Window w); |
142 Client *getclient(Window w); |
142 unsigned long getcolor(const char *colstr); |
143 unsigned long getcolor(const char *colstr); |
143 long getstate(Window w); |
144 long getstate(Window w); |
144 Bool gettextprop(Window w, Atom atom, char *text, unsigned int size); |
145 Bool gettextprop(Window w, Atom atom, char *text, unsigned int size); |
145 void grabbuttons(Client *c, Bool focused); |
146 void grabbuttons(Client *c, Bool focused); |
|
147 void grabkeys(void); |
146 unsigned int idxoftag(const char *tag); |
148 unsigned int idxoftag(const char *tag); |
147 void initfont(const char *fontstr); |
149 void initfont(const char *fontstr); |
148 Bool isoccupied(unsigned int t); |
150 Bool isoccupied(unsigned int t); |
149 Bool isprotodel(Client *c); |
151 Bool isprotodel(Client *c); |
150 Bool isvisible(Client *c); |
152 Bool isvisible(Client *c); |
836 else |
838 else |
837 XGrabButton(dpy, AnyButton, AnyModifier, c->win, False, BUTTONMASK, |
839 XGrabButton(dpy, AnyButton, AnyModifier, c->win, False, BUTTONMASK, |
838 GrabModeAsync, GrabModeSync, None, None); |
840 GrabModeAsync, GrabModeSync, None, None); |
839 } |
841 } |
840 |
842 |
|
843 void |
|
844 grabkeys(void) { |
|
845 unsigned int i; |
|
846 KeyCode code; |
|
847 |
|
848 XUngrabKey(dpy, AnyKey, AnyModifier, root); |
|
849 for(i = 0; i < LENGTH(keys); i++) { |
|
850 code = XKeysymToKeycode(dpy, keys[i].keysym); |
|
851 XGrabKey(dpy, code, keys[i].mod, root, True, |
|
852 GrabModeAsync, GrabModeAsync); |
|
853 XGrabKey(dpy, code, keys[i].mod | LockMask, root, True, |
|
854 GrabModeAsync, GrabModeAsync); |
|
855 XGrabKey(dpy, code, keys[i].mod | numlockmask, root, True, |
|
856 GrabModeAsync, GrabModeAsync); |
|
857 XGrabKey(dpy, code, keys[i].mod | numlockmask | LockMask, root, True, |
|
858 GrabModeAsync, GrabModeAsync); |
|
859 } |
|
860 } |
|
861 |
841 unsigned int |
862 unsigned int |
842 idxoftag(const char *tag) { |
863 idxoftag(const char *tag) { |
843 unsigned int i; |
864 unsigned int i; |
844 |
865 |
845 for(i = 0; (i < LENGTH(tags)) && (tags[i] != tag); i++); |
866 for(i = 0; (i < LENGTH(tags)) && (tags[i] != tag); i++); |
923 return False; |
944 return False; |
924 } |
945 } |
925 |
946 |
926 void |
947 void |
927 keypress(XEvent *e) { |
948 keypress(XEvent *e) { |
928 KEYS |
|
929 unsigned int i; |
949 unsigned int i; |
930 KeyCode code; |
|
931 KeySym keysym; |
950 KeySym keysym; |
932 XKeyEvent *ev; |
951 XKeyEvent *ev; |
933 |
952 |
934 if(!e) { /* grabkeys */ |
|
935 XUngrabKey(dpy, AnyKey, AnyModifier, root); |
|
936 for(i = 0; i < LENGTH(keys); i++) { |
|
937 code = XKeysymToKeycode(dpy, keys[i].keysym); |
|
938 XGrabKey(dpy, code, keys[i].mod, root, True, |
|
939 GrabModeAsync, GrabModeAsync); |
|
940 XGrabKey(dpy, code, keys[i].mod | LockMask, root, True, |
|
941 GrabModeAsync, GrabModeAsync); |
|
942 XGrabKey(dpy, code, keys[i].mod | numlockmask, root, True, |
|
943 GrabModeAsync, GrabModeAsync); |
|
944 XGrabKey(dpy, code, keys[i].mod | numlockmask | LockMask, root, True, |
|
945 GrabModeAsync, GrabModeAsync); |
|
946 } |
|
947 return; |
|
948 } |
|
949 ev = &e->xkey; |
953 ev = &e->xkey; |
950 keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0); |
954 keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0); |
951 for(i = 0; i < LENGTH(keys); i++) |
955 for(i = 0; i < LENGTH(keys); i++) |
952 if(keysym == keys[i].keysym |
956 if(keysym == keys[i].keysym |
953 && CLEANMASK(keys[i].mod) == CLEANMASK(ev->state)) |
957 && CLEANMASK(keys[i].mod) == CLEANMASK(ev->state)) |
1046 mappingnotify(XEvent *e) { |
1050 mappingnotify(XEvent *e) { |
1047 XMappingEvent *ev = &e->xmapping; |
1051 XMappingEvent *ev = &e->xmapping; |
1048 |
1052 |
1049 XRefreshKeyboardMapping(ev); |
1053 XRefreshKeyboardMapping(ev); |
1050 if(ev->request == MappingKeyboard) |
1054 if(ev->request == MappingKeyboard) |
1051 keypress(NULL); |
1055 grabkeys(); |
1052 } |
1056 } |
1053 |
1057 |
1054 void |
1058 void |
1055 maprequest(XEvent *e) { |
1059 maprequest(XEvent *e) { |
1056 static XWindowAttributes wa; |
1060 static XWindowAttributes wa; |
1458 wa.cursor = cursor[CurNormal]; |
1462 wa.cursor = cursor[CurNormal]; |
1459 XChangeWindowAttributes(dpy, root, CWEventMask | CWCursor, &wa); |
1463 XChangeWindowAttributes(dpy, root, CWEventMask | CWCursor, &wa); |
1460 XSelectInput(dpy, root, wa.event_mask); |
1464 XSelectInput(dpy, root, wa.event_mask); |
1461 |
1465 |
1462 /* grab keys */ |
1466 /* grab keys */ |
1463 keypress(NULL); |
1467 grabkeys(); |
1464 |
1468 |
1465 /* init tags */ |
1469 /* init tags */ |
1466 compileregs(); |
1470 compileregs(); |
1467 |
1471 |
1468 /* init appearance */ |
1472 /* init appearance */ |