# HG changeset patch # User Anselm R. Garbe # Date 1152611418 -7200 # Node ID 7066ff2fe8bcce00b4d6344eb0b54d43222dd051 # Parent 49e2fc9fb94f58871fae976f055740303a5205b2 added key handling diff -r 49e2fc9fb94f -r 7066ff2fe8bc Makefile --- a/Makefile Tue Jul 11 11:27:56 2006 +0200 +++ b/Makefile Tue Jul 11 11:50:18 2006 +0200 @@ -3,7 +3,7 @@ include config.mk -WMSRC = bar.c client.c draw.c event.c util.c wm.c +WMSRC = bar.c client.c cmd.c draw.c event.c key.c util.c wm.c WMOBJ = ${WMSRC:.c=.o} MENSRC = menu.c draw.c util.c MENOBJ = ${MENSRC:.c=.o} diff -r 49e2fc9fb94f -r 7066ff2fe8bc config.h --- a/config.h Tue Jul 11 11:27:56 2006 +0200 +++ b/config.h Tue Jul 11 11:50:18 2006 +0200 @@ -9,3 +9,5 @@ #define BORDERCOLOR "#000000" #define STATUSCMD "echo -n `date` `uptime | sed 's/.*://; s/,//g'`" \ " `acpi | awk '{print $4}' | sed 's/,//'`" +#define KEYS \ + { Mod1Mask, XK_Return, run, "xterm -u8 -bg black -fg white -fn -*-terminus-medium-*-*-*-14-*-*-*-*-*-iso10646-*" }, diff -r 49e2fc9fb94f -r 7066ff2fe8bc key.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/key.c Tue Jul 11 11:50:18 2006 +0200 @@ -0,0 +1,26 @@ +/* + * (C)opyright MMVI Anselm R. Garbe + * See LICENSE file for license details. + */ + +#include "wm.h" + +#include + +static Key key[] = { + KEYS +}; + +void +update_keys() +{ + unsigned int i, len; + KeyCode code; + + len = sizeof(key) / sizeof(key[0]); + for(i = 0; i < len; i++) { + code = XKeysymToKeycode(dpy, key[i].keysym); + XUngrabKey(dpy, code, key[i].mod, root); + XGrabKey(dpy, code, key[i].mod, root, True, GrabModeAsync, GrabModeAsync); + } +} diff -r 49e2fc9fb94f -r 7066ff2fe8bc wm.c --- a/wm.c Tue Jul 11 11:27:56 2006 +0200 +++ b/wm.c Tue Jul 11 11:50:18 2006 +0200 @@ -24,7 +24,6 @@ char *bartext, tag[256]; int screen, sel_screen; -unsigned int lock_mask, numlock_mask; /* draw structs */ Brush brush = {0}; @@ -144,32 +143,6 @@ } static void -init_lock_keys() -{ - XModifierKeymap *modmap; - KeyCode numlock; - int i; - static int masks[] = { - ShiftMask, LockMask, ControlMask, Mod1Mask, - Mod2Mask, Mod3Mask, Mod4Mask, Mod5Mask - }; - - numlock_mask = 0; - modmap = XGetModifierMapping(dpy); - numlock = XKeysymToKeycode(dpy, XStringToKeysym("Num_Lock")); - - if(modmap && modmap->max_keypermod > 0) { - int max = (sizeof(masks) / sizeof(int)) * modmap->max_keypermod; - for(i = 0; i < max; i++) - if(numlock && (modmap->modifiermap[i] == numlock)) - numlock_mask = masks[i / modmap->max_keypermod]; - } - XFreeModifiermap(modmap); - - lock_mask = 255 & ~(numlock_mask | LockMask); -} - -static void cleanup() { /* @@ -243,7 +216,7 @@ cursor[CurResize] = XCreateFontCursor(dpy, XC_sizing); cursor[CurMove] = XCreateFontCursor(dpy, XC_fleur); - init_lock_keys(); + update_keys(); brush.drawable = XCreatePixmap(dpy, root, rect.width, rect.height, DefaultDepth(dpy, screen)); diff -r 49e2fc9fb94f -r 7066ff2fe8bc wm.h --- a/wm.h Tue Jul 11 11:27:56 2006 +0200 +++ b/wm.h Tue Jul 11 11:50:18 2006 +0200 @@ -20,6 +20,7 @@ enum { RFloat, RGrid, RLast }; typedef struct Client Client; +typedef struct Key Key; struct Client { char name[256]; @@ -36,6 +37,13 @@ Client *snext; }; +struct Key { + unsigned long mod; + KeySym keysym; + void (*func)(char *arg); + char *arg; +}; + extern Display *dpy; extern Window root, barwin; extern Atom wm_atom[WMLast], net_atom[NetLast]; @@ -46,7 +54,6 @@ extern void (*handler[LASTEvent]) (XEvent *); extern int screen, sel_screen; -extern unsigned int lock_mask, numlock_mask; extern char *bartext, tag[256]; extern Brush brush; @@ -55,9 +62,15 @@ /* bar.c */ extern void draw_bar(); +/* cmd.c */ +extern void run(char *arg); + /* client.c */ extern Client *create_client(Window w, XWindowAttributes *wa); extern void manage(Client *c); +/* key.c */ +extern void update_keys(); + /* wm.c */ extern int win_proto(Window w);