added key handling

This commit is contained in:
Anselm R. Garbe 2006-07-11 11:50:18 +02:00
parent 8a8b7956b6
commit 366d81e313
5 changed files with 44 additions and 30 deletions

View file

@ -3,7 +3,7 @@
include config.mk 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} WMOBJ = ${WMSRC:.c=.o}
MENSRC = menu.c draw.c util.c MENSRC = menu.c draw.c util.c
MENOBJ = ${MENSRC:.c=.o} MENOBJ = ${MENSRC:.c=.o}

View file

@ -9,3 +9,5 @@
#define BORDERCOLOR "#000000" #define BORDERCOLOR "#000000"
#define STATUSCMD "echo -n `date` `uptime | sed 's/.*://; s/,//g'`" \ #define STATUSCMD "echo -n `date` `uptime | sed 's/.*://; s/,//g'`" \
" `acpi | awk '{print $4}' | sed 's/,//'`" " `acpi | awk '{print $4}' | sed 's/,//'`"
#define KEYS \
{ Mod1Mask, XK_Return, run, "xterm -u8 -bg black -fg white -fn -*-terminus-medium-*-*-*-14-*-*-*-*-*-iso10646-*" },

26
key.c Normal file
View file

@ -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);
}
}

29
wm.c
View file

@ -24,7 +24,6 @@ Client *client = NULL;
char *bartext, tag[256]; char *bartext, tag[256];
int screen, sel_screen; int screen, sel_screen;
unsigned int lock_mask, numlock_mask;
/* draw structs */ /* draw structs */
Brush brush = {0}; Brush brush = {0};
@ -143,32 +142,6 @@ startup_error_handler(Display *dpy, XErrorEvent *error)
return -1; return -1;
} }
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 static void
cleanup() cleanup()
{ {
@ -243,7 +216,7 @@ main(int argc, char *argv[])
cursor[CurResize] = XCreateFontCursor(dpy, XC_sizing); cursor[CurResize] = XCreateFontCursor(dpy, XC_sizing);
cursor[CurMove] = XCreateFontCursor(dpy, XC_fleur); cursor[CurMove] = XCreateFontCursor(dpy, XC_fleur);
init_lock_keys(); update_keys();
brush.drawable = XCreatePixmap(dpy, root, rect.width, rect.height, brush.drawable = XCreatePixmap(dpy, root, rect.width, rect.height,
DefaultDepth(dpy, screen)); DefaultDepth(dpy, screen));

15
wm.h
View file

@ -20,6 +20,7 @@ enum { CurNormal, CurResize, CurMove, CurInput, CurLast };
enum { RFloat, RGrid, RLast }; enum { RFloat, RGrid, RLast };
typedef struct Client Client; typedef struct Client Client;
typedef struct Key Key;
struct Client { struct Client {
char name[256]; char name[256];
@ -36,6 +37,13 @@ struct Client {
Client *snext; Client *snext;
}; };
struct Key {
unsigned long mod;
KeySym keysym;
void (*func)(char *arg);
char *arg;
};
extern Display *dpy; extern Display *dpy;
extern Window root, barwin; extern Window root, barwin;
extern Atom wm_atom[WMLast], net_atom[NetLast]; extern Atom wm_atom[WMLast], net_atom[NetLast];
@ -46,7 +54,6 @@ extern Bool grid;
extern void (*handler[LASTEvent]) (XEvent *); extern void (*handler[LASTEvent]) (XEvent *);
extern int screen, sel_screen; extern int screen, sel_screen;
extern unsigned int lock_mask, numlock_mask;
extern char *bartext, tag[256]; extern char *bartext, tag[256];
extern Brush brush; extern Brush brush;
@ -55,9 +62,15 @@ extern Client *client;
/* bar.c */ /* bar.c */
extern void draw_bar(); extern void draw_bar();
/* cmd.c */
extern void run(char *arg);
/* client.c */ /* client.c */
extern Client *create_client(Window w, XWindowAttributes *wa); extern Client *create_client(Window w, XWindowAttributes *wa);
extern void manage(Client *c); extern void manage(Client *c);
/* key.c */
extern void update_keys();
/* wm.c */ /* wm.c */
extern int win_proto(Window w); extern int win_proto(Window w);