added key handling
This commit is contained in:
		
							parent
							
								
									8a8b7956b6
								
							
						
					
					
						commit
						366d81e313
					
				
							
								
								
									
										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-*" },
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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 New Issue