added key handling
This commit is contained in:
		
							
								
								
									
										2
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								Makefile
									
									
									
									
									
								
							| @@ -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} | ||||
|   | ||||
							
								
								
									
										2
									
								
								config.h
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								config.h
									
									
									
									
									
								
							| @@ -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-*" }, | ||||
|   | ||||
							
								
								
									
										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]; | ||||
| int screen, sel_screen; | ||||
| unsigned int lock_mask, numlock_mask; | ||||
|  | ||||
| /* draw structs */ | ||||
| Brush brush = {0}; | ||||
| @@ -143,32 +142,6 @@ startup_error_handler(Display *dpy, XErrorEvent *error) | ||||
| 	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 | ||||
| cleanup() | ||||
| { | ||||
| @@ -243,7 +216,7 @@ main(int argc, char *argv[]) | ||||
| 	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)); | ||||
|   | ||||
							
								
								
									
										15
									
								
								wm.h
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								wm.h
									
									
									
									
									
								
							| @@ -20,6 +20,7 @@ enum { CurNormal, CurResize, CurMove, CurInput, CurLast }; | ||||
| enum { RFloat, RGrid, RLast }; | ||||
|  | ||||
| typedef struct Client Client; | ||||
| typedef struct Key Key; | ||||
|  | ||||
| struct Client { | ||||
| 	char name[256]; | ||||
| @@ -36,6 +37,13 @@ struct Client { | ||||
| 	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 Bool grid; | ||||
| 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 @@ extern Client *client; | ||||
| /* 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); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user