--- 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}
--- 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-*" },
--- /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 <garbeam at gmail dot com>
+ * See LICENSE file for license details.
+ */
+
+#include "wm.h"
+
+#include <X11/keysym.h>
+
+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);
+ }
+}
--- 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));
--- 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);