summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--calmwm.h576
1 files changed, 268 insertions, 308 deletions
diff --git a/calmwm.h b/calmwm.h
index 87c54f8..b213312 100644
--- a/calmwm.h
+++ b/calmwm.h
@@ -31,13 +31,15 @@
 #include <X11/extensions/Xrandr.h>
 #include <X11/keysym.h>
 
-#define CALMWM_MAXNAMELEN 256
-
 #undef MIN
 #undef MAX
 #define MIN(x, y) ((x) < (y) ? (x) : (y))
 #define MAX(x, y) ((x) > (y) ? (x) : (y))
 
+#ifndef nitems
+#define nitems(_a) (sizeof((_a)) / sizeof((_a)[0]))
+#endif
+
 #define	CONFFILE	".cwmrc"
 #define	WMNAME	 	"CWM"
 
@@ -51,9 +53,34 @@
 			PointerMotionMask)
 #define SearchMask	(KeyPressMask|ExposureMask)
 
-#ifndef nitems
-#define nitems(_a) (sizeof((_a)) / sizeof((_a)[0]))
-#endif
+/* kb movement */
+#define CWM_MOVE		0x0001
+#define CWM_RESIZE		0x0002
+#define CWM_PTRMOVE		0x0004
+#define CWM_BIGMOVE		0x0008
+#define CWM_UP			0x0010
+#define CWM_DOWN		0x0020
+#define CWM_LEFT		0x0040
+#define CWM_RIGHT		0x0080
+
+/* exec */
+#define	CWM_EXEC_PROGRAM	0x0001
+#define	CWM_EXEC_WM		0x0002
+
+/* client cycle */
+#define CWM_CYCLE		0x0001
+#define CWM_RCYCLE		0x0002
+
+/* group cycle */
+#define CWM_CYCLEGROUP		0x0001
+#define CWM_RCYCLEGROUP		0x0002
+
+#define KBTOGROUP(X) ((X) - 1)
+
+union arg {
+	char	*c;
+	int	 i;
+};
 
 enum cwmcolor {
 	CWM_COLOR_BORDOR_ACTIVE,
@@ -69,6 +96,7 @@ struct color {
 	unsigned long	 pixel;
 	char		*name;
 };
+
 struct gap {
 	int		 top;
 	int		 bottom;
@@ -76,175 +104,124 @@ struct gap {
 	int		 right;
 };
 
-struct client_ctx;
-
-TAILQ_HEAD(cycle_entry_q, client_ctx);
-TAILQ_HEAD(group_ctx_q, group_ctx);
-TAILQ_HEAD(client_ctx_q, client_ctx);
-
-#define CALMWM_NGROUPS 9
-struct group_ctx {
-	TAILQ_ENTRY(group_ctx)	 entry;
-	struct client_ctx_q	 clients;
-	int			 shortcut;
-	int			 hidden;
-	int			 nhidden;
-	int			 highstack;
-};
-
-struct screen_ctx {
-	TAILQ_ENTRY(screen_ctx)	 entry;
-
-	u_int			 which;
-	Window			 rootwin;
-	Window			 menuwin;
-
-	struct color		 color[CWM_COLOR_MAX];
-	GC			 gc;
-
-	int			 altpersist;
-
-	int			 xmax;
-	int			 ymax;
-
-	struct gap		 gap;
-	struct cycle_entry_q	 mruq;
-
-	XftDraw			*xftdraw;
-	XftColor		 xftcolor;
-	XftFont			*font;
-	u_int			 fontheight;
-
-	int			 xinerama_no;
-	XineramaScreenInfo	*xinerama;
-	struct group_ctx	*group_active;
-	struct group_ctx	 groups[CALMWM_NGROUPS];
-	int			 group_hideall;
-	struct group_ctx_q	 groupq;
-	char 			**group_names;
-	int			 group_nonames;
-};
-
-TAILQ_HEAD(screen_ctx_q, screen_ctx);
-
-#define CLIENT_PROTO_DELETE	0x01
-#define CLIENT_PROTO_TAKEFOCUS	0x02
-
-#define CLIENT_MAXNAMEQLEN	5
-
-#define CLIENT_HIDDEN		0x01
-#define CLIENT_IGNORE		0x02
-#define CLIENT_DOMAXIMIZE	0x04
-#define CLIENT_MAXIMIZED	0x08
-#define CLIENT_DOVMAXIMIZE	0x10
-#define CLIENT_VMAXIMIZED	0x20
-#define CLIENT_DOHMAXIMIZE	0x40
-#define CLIENT_HMAXIMIZED	0x80
-
-#define CLIENT_HIGHLIGHT_GROUP		1
-#define CLIENT_HIGHLIGHT_UNGROUP	2
-
 struct winname {
 	TAILQ_ENTRY(winname)	 entry;
 	char			*name;
 };
-
 TAILQ_HEAD(winname_q, winname);
 
 struct client_ctx {
 	TAILQ_ENTRY(client_ctx) entry;
-	TAILQ_ENTRY(client_ctx) searchentry;
 	TAILQ_ENTRY(client_ctx) group_entry;
 	TAILQ_ENTRY(client_ctx) mru_entry;
-
 	struct screen_ctx	*sc;
 	Window			 win;
 	XSizeHints		*size;
-
 	Colormap		 cmap;
-
-	u_int			 bwidth;
+	u_int			 bwidth; /* border width */
 	struct {
-		int		 x, y, width, height, basew, baseh,
-				 minw, minh, maxw, maxh, incw, inch;
-		float		 mina, maxa;
+		int		 x;	/* x position */
+		int		 y;	/* y position */
+		int		 width;	/* width */
+		int		 height;/* height */
+		int		 basew;	/* desired width */
+		int		 baseh;	/* desired height */
+		int		 minw;	/* minimum width */
+		int		 minh;	/* minimum height */
+		int		 maxw;	/* maximum width */
+		int		 maxh;	/* maximum height */
+		int		 incw;	/* width increment progression */
+		int		 inch;	/* height increment progression */
+		float		 mina;	/* minimum aspect ratio */
+		float		 maxa;	/* maximum aspect ratio */
 	} geom, savegeom;
-
 	struct {
-		int		 x,y;
+		int		 x;	/* x position */
+		int		 y;	/* y position */
 	} ptr;
-
+#define CLIENT_PROTO_DELETE		 0x0001
+#define CLIENT_PROTO_TAKEFOCUS		 0x0002
 	int			 xproto;
-
+#define CLIENT_HIDDEN			0x0001
+#define CLIENT_IGNORE			0x0002
+#define CLIENT_DOMAXIMIZE		0x0004
+#define CLIENT_MAXIMIZED		0x0008
+#define CLIENT_DOVMAXIMIZE		0x0010
+#define CLIENT_VMAXIMIZED		0x0020
+#define CLIENT_DOHMAXIMIZE		0x0040
+#define CLIENT_HMAXIMIZED		0x0080
 	int			 flags;
 	int			 state;
-	char			*name;
-	struct winname_q	 nameq;
-	size_t			 nameqlen;
-
-	char			*label;
 	int			 active;
+	int			 stackingorder;
+#define CLIENT_HIGHLIGHT_GROUP		0x0001
+#define CLIENT_HIGHLIGHT_UNGROUP	0x0002
 	int			 highlight;
-
+	struct winname_q	 nameq;
+#define CLIENT_MAXNAMEQLEN		5
+	int			 nameqlen;
+	char			*name;
+	char			*label;
 	char			*matchname;
 	struct group_ctx	*group;
-
-	int			stackingorder;
-
 	char			*app_class;
 	char			*app_name;
 };
+TAILQ_HEAD(client_ctx_q, client_ctx);
+TAILQ_HEAD(cycle_entry_q, client_ctx);
 
-extern const char *shortcut_to_name[];
+struct winmatch {
+	TAILQ_ENTRY(winmatch)	entry;
+#define WIN_MAXTITLELEN		256
+	char			title[WIN_MAXTITLELEN];
+};
+TAILQ_HEAD(winmatch_q, winmatch);
+
+struct group_ctx {
+	TAILQ_ENTRY(group_ctx)	 entry;
+	struct client_ctx_q	 clients;
+	int			 shortcut;
+	int			 hidden;
+	int			 nhidden;
+	int			 highstack;
+};
+TAILQ_HEAD(group_ctx_q, group_ctx);
 
-/* Autogroups */
 struct autogroupwin {
 	TAILQ_ENTRY(autogroupwin)	 entry;
 	char				*class;
 	char				*name;
 	int 				 num;
 };
-
 TAILQ_HEAD(autogroupwin_q, autogroupwin);
 
-#define CWM_MOVE	0x01
-#define CWM_RESIZE	0x02
-#define CWM_PTRMOVE	0x04
-#define CWM_BIGMOVE	0x08
-#define CWM_UP		0x10
-#define CWM_DOWN	0x20
-#define CWM_LEFT	0x40
-#define CWM_RIGHT	0x80
-
-/*
- * Match a window.
- */
-#define CONF_MAX_WINTITLE	256
-struct winmatch {
-	TAILQ_ENTRY(winmatch)	entry;
-	char			title[CONF_MAX_WINTITLE];
-};
-
-TAILQ_HEAD(winmatch_q, winmatch);
-
-/* for cwm_exec */
-#define	CWM_EXEC_PROGRAM	0x1
-#define	CWM_EXEC_WM		0x2
-/* for alt-tab */
-#define CWM_CYCLE		0x0
-#define CWM_RCYCLE		0x1
-/* for group cycle */
-#define CWM_CYCLEGROUP		0x0
-#define CWM_RCYCLEGROUP		0x1
-
-#define KBFLAG_NEEDCLIENT 0x01
-
-#define KBTOGROUP(X) ((X) - 1)
-
-union arg {
-	char	*c;
-	int	 i;
+struct screen_ctx {
+	TAILQ_ENTRY(screen_ctx)	 entry;
+	u_int			 which;
+	Window			 rootwin;
+	Window			 menuwin;
+	struct color		 color[CWM_COLOR_MAX];
+	GC			 gc;
+	int			 altpersist;
+	int			 xmax;
+	int			 ymax;
+	struct gap		 gap;
+	struct cycle_entry_q	 mruq;
+	XftColor		 xftcolor;
+	XftDraw			*xftdraw;
+	XftFont			*font;
+	u_int			 fontheight;
+	int			 xinerama_no;
+	XineramaScreenInfo	*xinerama;
+#define CALMWM_NGROUPS		 9
+	struct group_ctx	 groups[CALMWM_NGROUPS];
+	struct group_ctx_q	 groupq;
+	int			 group_hideall;
+	int			 group_nonames;
+	struct group_ctx	*group_active;
+	char 			**group_names;
 };
+TAILQ_HEAD(screen_ctx_q, screen_ctx);
 
 struct keybinding {
 	TAILQ_ENTRY(keybinding)	 entry;
@@ -253,33 +230,43 @@ struct keybinding {
 	int			 modmask;
 	int			 keysym;
 	int			 keycode;
+#define KBFLAG_NEEDCLIENT	 0x0001
 	int			 flags;
 };
-
-struct cmd {
-	TAILQ_ENTRY(cmd)	entry;
-	int			flags;
-	char			image[MAXPATHLEN];
-	char			label[256];
-	/* (argv) */
-};
+TAILQ_HEAD(keybinding_q, keybinding);
 
 struct mousebinding {
+	TAILQ_ENTRY(mousebinding)	entry;
+	void			 	(*callback)(struct client_ctx *, void *);
 	int				modmask;
 	int			 	button;
+#define MOUSEBIND_CTX_ROOT		0x0001
+#define MOUSEBIND_CTX_WIN		0x0002
 	int				context;
-	void			 	(*callback)(struct client_ctx *, void *);
-	TAILQ_ENTRY(mousebinding)	entry;
 };
+TAILQ_HEAD(mousebinding_q, mousebinding);
 
-#define MOUSEBIND_CTX_ROOT	1
-#define MOUSEBIND_CTX_WIN	2
-
-TAILQ_HEAD(keybinding_q, keybinding);
+struct cmd {
+	TAILQ_ENTRY(cmd)	entry;
+	int			flags;
+	char			image[MAXPATHLEN];
+#define CMD_MAXLABELLEN		256
+	char			label[CMD_MAXLABELLEN];
+};
 TAILQ_HEAD(cmd_q, cmd);
-TAILQ_HEAD(mousebinding_q, mousebinding);
 
-/* Global configuration */
+struct menu {
+	TAILQ_ENTRY(menu)	 entry;
+	TAILQ_ENTRY(menu)	 resultentry;
+#define MENU_MAXENTRY		 50
+	char			 text[MENU_MAXENTRY + 1];
+	char			 print[MENU_MAXENTRY + 1];
+	void			*ctx;
+	short			 dummy;
+	short			 abort;
+};
+TAILQ_HEAD(menu_q, menu);
+
 struct conf {
 	struct keybinding_q	 keybindingq;
 	struct autogroupwin_q	 autogroupq;
@@ -287,15 +274,13 @@ struct conf {
 	char			 conf_path[MAXPATHLEN];
 	struct cmd_q		 cmdq;
 	struct mousebinding_q	 mousebindingq;
-
-#define	CONF_STICKY_GROUPS	 0x0001
+#define	CONF_STICKY_GROUPS		0x0001
 	int			 flags;
-#define CONF_BWIDTH		 1
+#define CONF_BWIDTH			1
 	int			 bwidth;
-#define	CONF_MAMOUNT		 1
+#define	CONF_MAMOUNT			1
 	int			 mamount;
 	struct gap		 gap;
-
 #define CONF_COLOR_ACTIVEBORDER		"#CCCCCC"
 #define CONF_COLOR_INACTIVEBORDER	"#666666"
 #define CONF_COLOR_GROUPBORDER		"blue"
@@ -303,213 +288,190 @@ struct conf {
 #define CONF_COLOR_MENUFG		"black"
 #define CONF_COLOR_MENUBG		"white"
 	struct color		 color[CWM_COLOR_MAX];
-
 	char			 termpath[MAXPATHLEN];
 	char			 lockpath[MAXPATHLEN];
-
-#define	DEFAULTFONTNAME		 "sans-serif:pixelsize=14:bold"
+#define	DEFAULTFONTNAME			"sans-serif:pixelsize=14:bold"
 	char			*DefaultFontName;
 };
 
-/* Menu stuff */
-
-#define MENU_MAXENTRY 50
-
-struct menu {
-	TAILQ_ENTRY(menu)	entry;
-	TAILQ_ENTRY(menu)	resultentry;
-
-	char			 text[MENU_MAXENTRY + 1];
-	char			 print[MENU_MAXENTRY + 1];
-	void			*ctx;
-	short			 dummy;
-	short			 abort;
-};
-
-TAILQ_HEAD(menu_q, menu);
-
 /* MWM hints */
-
 struct mwm_hints {
 	u_long	flags;
 	u_long	functions;
 	u_long	decorations;
 };
-
-#define MWM_NUMHINTS 3
-
+#define MWM_NUMHINTS		3
 #define	PROP_MWM_HINTS_ELEMENTS	3
-#define	MWM_HINTS_DECORATIONS	(1 << 1)
-#define	MWM_DECOR_ALL		(1 << 0)
-#define	MWM_DECOR_BORDER	(1 << 1)
+#define	MWM_HINTS_DECORATIONS	(1<<1)
+#define	MWM_DECOR_ALL		(1<<0)
+#define	MWM_DECOR_BORDER	(1<<1)
 
 __dead void		 usage(void);
 
-struct client_ctx	*client_find(Window);
-struct client_ctx	*client_new(Window, struct screen_ctx *, int);
+void			 client_applysizehints(struct client_ctx *);
+struct client_ctx	*client_current(void);
+struct client_ctx	*client_cycle(struct screen_ctx *, int);
 int			 client_delete(struct client_ctx *);
-void			 client_setactive(struct client_ctx *, int);
-void			 client_resize(struct client_ctx *);
+void			 client_draw_border(struct client_ctx *);
+struct client_ctx	*client_find(Window);
+void			 client_getsizehints(struct client_ctx *);
+void			 client_hide(struct client_ctx *);
+void			 client_horizmaximize(struct client_ctx *);
+void			 client_leave(struct client_ctx *);
 void			 client_lower(struct client_ctx *);
-void			 client_raise(struct client_ctx *);
+void			 client_map(struct client_ctx *);
+void			 client_maximize(struct client_ctx *);
 void			 client_move(struct client_ctx *);
-void			 client_leave(struct client_ctx *);
+void			 client_mtf(struct client_ctx *);
+struct client_ctx	*client_new(Window, struct screen_ctx *, int);
+void			 client_ptrsave(struct client_ctx *);
+void			 client_ptrwarp(struct client_ctx *);
+void			 client_raise(struct client_ctx *);
+void			 client_resize(struct client_ctx *);
 void			 client_send_delete(struct client_ctx *);
-struct client_ctx	*client_current(void);
-void			 client_hide(struct client_ctx *);
-void			 client_unhide(struct client_ctx *);
+void			 client_setactive(struct client_ctx *, int);
 void			 client_setname(struct client_ctx *);
-void			 client_warp(struct client_ctx *);
-void			 client_ptrwarp(struct client_ctx *);
-void			 client_ptrsave(struct client_ctx *);
-void			 client_draw_border(struct client_ctx *);
-void			 client_maximize(struct client_ctx *);
+void			 client_unhide(struct client_ctx *);
 void			 client_vertmaximize(struct client_ctx *);
-void			 client_horizmaximize(struct client_ctx *);
-void			 client_map(struct client_ctx *);
-void			 client_mtf(struct client_ctx *);
-struct client_ctx	*client_cycle(struct screen_ctx *, int);
-void			 client_getsizehints(struct client_ctx *);
-void			 client_applysizehints(struct client_ctx *);
-
-struct menu  		*menu_filter(struct screen_ctx *, struct menu_q *,
-			     char *, char *, int,
-			     void (*)(struct menu_q *, struct menu_q *, char *),
-			     void (*)(struct menu *, int));
-void			 menu_init(struct screen_ctx *);
-
-void			 xev_loop(void);
-
-void			 xu_getatoms(void);
-int			 xu_ptr_grab(Window, int, Cursor);
-void			 xu_btn_grab(Window, int, u_int);
-int			 xu_ptr_regrab(int, Cursor);
-void			 xu_btn_ungrab(Window, int, u_int);
-void			 xu_ptr_ungrab(void);
-void			 xu_ptr_setpos(Window, int, int);
-void			 xu_ptr_getpos(Window, int *, int *);
-void			 xu_key_grab(Window, int, int);
-void			 xu_key_ungrab(Window, int, int);
-void			 xu_configure(struct client_ctx *);
-void			 xu_sendmsg(Window, Atom, long);
-int			 xu_getprop(Window, Atom, Atom, long, u_char **);
-int			 xu_getstrprop(Window, Atom, char **);
-void			 xu_setstate(struct client_ctx *, int);
-int			 xu_getstate(struct client_ctx *, int *);
-unsigned long		 xu_getcolor(struct screen_ctx *, char *);
-void			 xu_freecolor(struct screen_ctx *, unsigned long);
-void			 xu_setwmname(struct screen_ctx *);
+void			 client_warp(struct client_ctx *);
 
-int			 u_spawn(char *);
-void			 u_exec(char *);
+void			 group_alltoggle(struct screen_ctx *);
+void			 group_autogroup(struct client_ctx *);
+void			 group_client_delete(struct client_ctx *);
+void			 group_cycle(struct screen_ctx *, int);
+void			 group_hidetoggle(struct screen_ctx *, int);
+void			 group_init(struct screen_ctx *);
+void			 group_make_autogroup(struct conf *, char *, int);
+void			 group_menu(XButtonEvent *);
+void			 group_movetogroup(struct client_ctx *, int);
+void			 group_only(struct screen_ctx *, int);
+void			 group_sticky(struct client_ctx *);
+void			 group_sticky_toggle_enter(struct client_ctx *);
+void			 group_sticky_toggle_exit(struct client_ctx *);
+void			 group_update_names(struct screen_ctx *);
 
-void			 xfree(void *);
-void			*xmalloc(size_t);
-void			*xcalloc(size_t, size_t);
-char			*xstrdup(const char *);
+void			 search_match_client(struct menu_q *, struct menu_q *,
+			     char *);
+void			 search_match_exec(struct menu_q *, struct menu_q *,
+			     char *);
+void			 search_match_text(struct menu_q *, struct menu_q *,
+			     char *);
+void			 search_print_client(struct menu *, int);
 
+XineramaScreenInfo	*screen_find_xinerama(struct screen_ctx *, int, int);
 struct screen_ctx	*screen_fromroot(Window);
-void			 screen_updatestackingorder(struct screen_ctx *);
-void			 screen_update_geometry(struct screen_ctx *, int, int);
 void			 screen_init_xinerama(struct screen_ctx *);
-XineramaScreenInfo	*screen_find_xinerama(struct screen_ctx *, int, int);
-
-void			 conf_setup(struct conf *, const char *);
-void			 conf_client(struct client_ctx *);
-void			 conf_grab(struct conf *, struct keybinding *);
-void			 conf_ungrab(struct conf *, struct keybinding *);
-void			 conf_bindname(struct conf *, char *, char *);
-void			 conf_mousebind(struct conf *, char *, char *);
-void			 conf_grab_mouse(struct client_ctx *);
-void			 conf_reload(struct conf *);
-void			 conf_gap(struct conf *, struct screen_ctx *);
-void			 conf_font(struct conf *, struct screen_ctx *);
-void			 conf_color(struct conf *, struct screen_ctx *);
-void			 conf_init(struct conf *);
-void			 conf_clear(struct conf *);
-void			 conf_cmd_add(struct conf *, char *, char *, int);
-
-int			 parse_config(const char *, struct conf *);
+void			 screen_update_geometry(struct screen_ctx *, int, int);
+void			 screen_updatestackingorder(struct screen_ctx *);
 
-void			 kbfunc_client_lower(struct client_ctx *, union arg *);
-void			 kbfunc_client_raise(struct client_ctx *, union arg *);
-void			 kbfunc_client_search(struct client_ctx *, union arg *);
-void			 kbfunc_client_hide(struct client_ctx *, union arg *);
 void			 kbfunc_client_cycle(struct client_ctx *, union arg *);
-void			 kbfunc_client_rcycle(struct client_ctx *, union arg *);
-void			 kbfunc_cmdexec(struct client_ctx *, union arg *);
-void			 kbfunc_client_label(struct client_ctx *, union arg *);
+void			 kbfunc_client_cyclegroup(struct client_ctx *,
+			     union arg *);
 void			 kbfunc_client_delete(struct client_ctx *, union arg *);
 void			 kbfunc_client_group(struct client_ctx *, union arg *);
 void			 kbfunc_client_grouponly(struct client_ctx *,
 			     union arg *);
-void			 kbfunc_client_cyclegroup(struct client_ctx *,
+void			 kbfunc_client_grouptoggle(struct client_ctx *,
 			     union arg *);
-void			 kbfunc_client_nogroup(struct client_ctx *,
+void			 kbfunc_client_hide(struct client_ctx *, union arg *);
+void			 kbfunc_client_hmaximize(struct client_ctx *,
 			     union arg *);
-void			 kbfunc_client_grouptoggle(struct client_ctx *,
+void			 kbfunc_client_label(struct client_ctx *, union arg *);
+void			 kbfunc_client_lower(struct client_ctx *, union arg *);
+void			 kbfunc_client_maximize(struct client_ctx *,
 			     union arg *);
 void			 kbfunc_client_movetogroup(struct client_ctx *,
 			     union arg *);
-void			 kbfunc_client_maximize(struct client_ctx *,
+void			 kbfunc_client_nogroup(struct client_ctx *,
 			     union arg *);
+void			 kbfunc_client_raise(struct client_ctx *, union arg *);
+void			 kbfunc_client_rcycle(struct client_ctx *, union arg *);
+void			 kbfunc_client_search(struct client_ctx *, union arg *);
 void			 kbfunc_client_vmaximize(struct client_ctx *,
 			     union arg *);
-void			 kbfunc_client_hmaximize(struct client_ctx *,
-			     union arg *);
-void			 kbfunc_reload(struct client_ctx *, union arg *);
-void			 kbfunc_quit_wm(struct client_ctx *, union arg *);
-void			 kbfunc_moveresize(struct client_ctx *, union arg *);
-void			 kbfunc_menu_search(struct client_ctx *, union arg *);
+void			 kbfunc_cmdexec(struct client_ctx *, union arg *);
 void			 kbfunc_exec(struct client_ctx *, union arg *);
+void			 kbfunc_lock(struct client_ctx *, union arg *);
+void			 kbfunc_menu_search(struct client_ctx *, union arg *);
+void			 kbfunc_moveresize(struct client_ctx *, union arg *);
+void			 kbfunc_quit_wm(struct client_ctx *, union arg *);
+void			 kbfunc_reload(struct client_ctx *, union arg *);
 void			 kbfunc_ssh(struct client_ctx *, union arg *);
 void			 kbfunc_term(struct client_ctx *, union arg *);
-void			 kbfunc_lock(struct client_ctx *, union arg *);
 
-void			 mousefunc_window_resize(struct client_ctx *, void *);
-void			 mousefunc_window_move(struct client_ctx *, void *);
+void			 mousefunc_menu_cmd(struct client_ctx *, void *);
+void			 mousefunc_menu_group(struct client_ctx *, void *);
+void			 mousefunc_menu_unhide(struct client_ctx *, void *);
 void			 mousefunc_window_grouptoggle(struct client_ctx *,
 			    void *);
-void			 mousefunc_window_lower(struct client_ctx *, void *);
 void			 mousefunc_window_hide(struct client_ctx *, void *);
-void			 mousefunc_menu_group(struct client_ctx *, void *);
-void			 mousefunc_menu_unhide(struct client_ctx *, void *);
-void			 mousefunc_menu_cmd(struct client_ctx *, void *);
+void			 mousefunc_window_lower(struct client_ctx *, void *);
+void			 mousefunc_window_move(struct client_ctx *, void *);
+void			 mousefunc_window_resize(struct client_ctx *, void *);
 
-void			 search_match_client(struct menu_q *, struct menu_q *,
-			     char *);
-void			 search_print_client(struct menu *, int);
-void			 search_match_text(struct menu_q *, struct menu_q *,
-			     char *);
-void			 search_match_exec(struct menu_q *, struct menu_q *,
-			     char *);
+struct menu  		*menu_filter(struct screen_ctx *, struct menu_q *,
+			     char *, char *, int,
+			     void (*)(struct menu_q *, struct menu_q *, char *),
+			     void (*)(struct menu *, int));
+void			 menu_init(struct screen_ctx *);
 
-void			 group_init(struct screen_ctx *);
-void			 group_make_autogroup(struct conf *, char *, int);
-void			 group_update_names(struct screen_ctx *);
-void			 group_hidetoggle(struct screen_ctx *, int);
-void			 group_only(struct screen_ctx *, int);
-void			 group_cycle(struct screen_ctx *, int);
-void			 group_sticky(struct client_ctx *);
-void			 group_client_delete(struct client_ctx *);
-void			 group_menu(XButtonEvent *);
-void			 group_alltoggle(struct screen_ctx *);
-void			 group_sticky_toggle_enter(struct client_ctx *);
-void			 group_sticky_toggle_exit(struct client_ctx *);
-void			 group_autogroup(struct client_ctx *);
-void			 group_movetogroup(struct client_ctx *, int);
+int			 parse_config(const char *, struct conf *);
+
+void			 conf_bindname(struct conf *, char *, char *);
+void			 conf_clear(struct conf *);
+void			 conf_client(struct client_ctx *);
+void			 conf_cmd_add(struct conf *, char *, char *, int);
+void			 conf_color(struct conf *, struct screen_ctx *);
+void			 conf_font(struct conf *, struct screen_ctx *);
+void			 conf_gap(struct conf *, struct screen_ctx *);
+void			 conf_grab(struct conf *, struct keybinding *);
+void			 conf_grab_mouse(struct client_ctx *);
+void			 conf_init(struct conf *);
+void			 conf_mousebind(struct conf *, char *, char *);
+void			 conf_reload(struct conf *);
+void			 conf_setup(struct conf *, const char *);
+void			 conf_ungrab(struct conf *, struct keybinding *);
 
 int			 font_ascent(struct screen_ctx *);
 int			 font_descent(struct screen_ctx *);
+void			 font_draw(struct screen_ctx *, const char *, int,
+			     Drawable, int, int);
 u_int			 font_height(struct screen_ctx *);
 void			 font_init(struct screen_ctx *);
 int			 font_width(struct screen_ctx *, const char *, int);
-void			 font_draw(struct screen_ctx *, const char *, int,
-			     Drawable, int, int);
 XftFont			*font_make(struct screen_ctx *, const char *);
 
-/* Externs */
+void			 xev_loop(void);
 
+void			 xu_btn_grab(Window, int, u_int);
+void			 xu_btn_ungrab(Window, int, u_int);
+void			 xu_configure(struct client_ctx *);
+void			 xu_freecolor(struct screen_ctx *, unsigned long);
+void			 xu_getatoms(void);
+unsigned long		 xu_getcolor(struct screen_ctx *, char *);
+int			 xu_getprop(Window, Atom, Atom, long, u_char **);
+int			 xu_getstate(struct client_ctx *, int *);
+int			 xu_getstrprop(Window, Atom, char **);
+void			 xu_key_grab(Window, int, int);
+void			 xu_key_ungrab(Window, int, int);
+void			 xu_ptr_getpos(Window, int *, int *);
+int			 xu_ptr_grab(Window, int, Cursor);
+int			 xu_ptr_regrab(int, Cursor);
+void			 xu_ptr_setpos(Window, int, int);
+void			 xu_ptr_ungrab(void);
+void			 xu_sendmsg(Window, Atom, long);
+void			 xu_setstate(struct client_ctx *, int);
+void			 xu_setwmname(struct screen_ctx *);
+
+void			 u_exec(char *);
+int			 u_spawn(char *);
+
+void			*xcalloc(size_t, size_t);
+void			 xfree(void *);
+void			*xmalloc(size_t);
+char			*xstrdup(const char *);
+
+/* Externs */
 extern Display				*X_Dpy;
 
 extern Cursor				 Cursor_move;
@@ -519,12 +481,10 @@ extern Cursor				 Cursor_default;
 extern Cursor				 Cursor_question;
 
 extern struct screen_ctx_q		 Screenq;
-extern struct screen_ctx		*curscreen;
-
 extern struct client_ctx_q		 Clientq;
+extern struct conf			 Conf;
 
 extern int				 HasXinerama, HasRandr, Randr_ev;
-extern struct conf			 Conf;
 
 #define	WM_STATE			 cwm_atoms[0]
 #define WM_DELETE_WINDOW		 cwm_atoms[1]