forked from mirror/dwm
added key handling
This commit is contained in:
parent
8a8b7956b6
commit
366d81e313
5 changed files with 44 additions and 30 deletions
2
Makefile
2
Makefile
|
@ -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}
|
||||||
|
|
2
config.h
2
config.h
|
@ -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
26
key.c
Normal 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
29
wm.c
|
@ -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
15
wm.h
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue