dwm.c
changeset 1060 9df583e2c03c
parent 1059 98d06be63ce5
child 1061 9d8238793016
equal deleted inserted replaced
1059:98d06be63ce5 1060:9df583e2c03c
    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 */