189 static void toggleview(const Arg *arg); |
189 static void toggleview(const Arg *arg); |
190 static void unmanage(Client *c); |
190 static void unmanage(Client *c); |
191 static void unmapnotify(XEvent *e); |
191 static void unmapnotify(XEvent *e); |
192 static void updatebar(void); |
192 static void updatebar(void); |
193 static void updategeom(void); |
193 static void updategeom(void); |
|
194 static void updatenumlockmask(void); |
194 static void updatesizehints(Client *c); |
195 static void updatesizehints(Client *c); |
195 static void updatetitle(Client *c); |
196 static void updatetitle(Client *c); |
196 static void updatewmhints(Client *c); |
197 static void updatewmhints(Client *c); |
197 static void view(const Arg *arg); |
198 static void view(const Arg *arg); |
198 static int xerror(Display *dpy, XErrorEvent *ee); |
199 static int xerror(Display *dpy, XErrorEvent *ee); |
733 return True; |
734 return True; |
734 } |
735 } |
735 |
736 |
736 void |
737 void |
737 grabbuttons(Client *c, Bool focused) { |
738 grabbuttons(Client *c, Bool focused) { |
738 unsigned int i, j; |
739 updatenumlockmask(); |
739 unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask }; |
740 { |
740 |
741 unsigned int i, j; |
741 XUngrabButton(dpy, AnyButton, AnyModifier, c->win); |
742 unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask }; |
742 if(focused) { |
743 XUngrabButton(dpy, AnyButton, AnyModifier, c->win); |
743 for(i = 0; i < LENGTH(buttons); i++) |
744 if(focused) { |
744 if(buttons[i].click == ClkClientWin) |
745 for(i = 0; i < LENGTH(buttons); i++) |
745 for(j = 0; j < LENGTH(modifiers); j++) |
746 if(buttons[i].click == ClkClientWin) |
746 XGrabButton(dpy, buttons[i].button, buttons[i].mask | modifiers[j], c->win, False, BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); |
747 for(j = 0; j < LENGTH(modifiers); j++) |
747 } else |
748 XGrabButton(dpy, buttons[i].button, buttons[i].mask | modifiers[j], c->win, False, BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); |
748 XGrabButton(dpy, AnyButton, AnyModifier, c->win, False, |
749 } else |
749 BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); |
750 XGrabButton(dpy, AnyButton, AnyModifier, c->win, False, |
|
751 BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); |
|
752 } |
750 } |
753 } |
751 |
754 |
752 void |
755 void |
753 grabkeys(void) { |
756 grabkeys(void) { |
754 unsigned int i, j; |
757 updatenumlockmask(); |
755 XModifierKeymap *modmap; |
|
756 |
|
757 /* update modifier map */ |
|
758 modmap = XGetModifierMapping(dpy); |
|
759 for(i = 0; i < 8; i++) |
|
760 for(j = 0; j < modmap->max_keypermod; j++) |
|
761 if(modmap->modifiermap[i * modmap->max_keypermod + j] == XKeysymToKeycode(dpy, XK_Num_Lock)) |
|
762 numlockmask = (1 << i); |
|
763 XFreeModifiermap(modmap); |
|
764 |
|
765 { /* grab keys */ |
758 { /* grab keys */ |
|
759 unsigned int i, j; |
766 unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask }; |
760 unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask }; |
767 KeyCode code; |
761 KeyCode code; |
768 |
762 |
769 XUngrabKey(dpy, AnyKey, AnyModifier, root); |
763 XUngrabKey(dpy, AnyKey, AnyModifier, root); |
770 for(i = 0; i < LENGTH(keys); i++) { |
764 for(i = 0; i < LENGTH(keys); i++) { |
1574 /* bar position */ |
1568 /* bar position */ |
1575 by = showbar ? (topbar ? wy - bh : wy + wh) : -bh; |
1569 by = showbar ? (topbar ? wy - bh : wy + wh) : -bh; |
1576 } |
1570 } |
1577 |
1571 |
1578 void |
1572 void |
|
1573 updatenumlockmask(void) { |
|
1574 unsigned int i, j; |
|
1575 XModifierKeymap *modmap; |
|
1576 |
|
1577 numlockmask = 0; |
|
1578 modmap = XGetModifierMapping(dpy); |
|
1579 for(i = 0; i < 8; i++) |
|
1580 for(j = 0; j < modmap->max_keypermod; j++) |
|
1581 if(modmap->modifiermap[i * modmap->max_keypermod + j] == XKeysymToKeycode(dpy, XK_Num_Lock)) |
|
1582 numlockmask = (1 << i); |
|
1583 XFreeModifiermap(modmap); |
|
1584 } |
|
1585 |
|
1586 void |
1579 updatesizehints(Client *c) { |
1587 updatesizehints(Client *c) { |
1580 long msize; |
1588 long msize; |
1581 XSizeHints size; |
1589 XSizeHints size; |
1582 |
1590 |
1583 XGetWMNormalHints(dpy, c->win, &size, &msize); |
1591 XGetWMNormalHints(dpy, c->win, &size, &msize); |