mirror of
https://github.com/leahneukirchen/cwm.git
synced 2023-08-10 21:13:12 +03:00
cvsimport
* refs/heads/master: stray newlines Add search_print_text(), a default callback for mi->print in menu_filter(). While here, normalize the remaining search_print_* argument paramters. Consistent use of menuq_add for ssh menu. Now that dim.{x,y} are available early, use them before requiring a MotionNotify event. Set dim.{x,y} during client_init and update on resize, instead of (re)calculating only when applying hints. 'window-search' is spelled 'menu-window'; the former snuck in during the conversion('menu-window' already existed and was properlly documented); found the hard way by sthen@ while trying to convert. Fold unbinding functions into one for each, key and mouse; plugs a leak when unbinding a mouse button bound to a command. use the correct type Tame the number of 'exec' and 'path' search_match wrappers. No functional change now, though more can likely go later, losing the (paritally complete or incomplete/broken) argument completion bits. Switch ssh menu to search_match_text; like group/window/cmd menus, use only a substring match. The previous matching is only intended for the exec menus. Change 'menu-window' to display all windows; then add 'menu-window-hidden' for the previous behaviour of 'menu-window'. 'menu-window' becomes the default binding; use 'bind-mouse "1" menu-window-hidden' to restore old behaviour for those who prefer. Normalize bind function names, based on a few categories: window, group, menu and pointer. Use an additional check with lstat(2) when d_type is unknown. revert previous; upcoming changes will hopefully deal with these more naturally. Add a wrapper based upon xevent handlers around client move/resize for key and mouse bindings. Define callbacks, then default bindings. Reorganize for upcoming changes. Remove the (8) default bindings for pointer move since they conflict with default bindings for emacs, which wins; the feature remains and can be bound to whatever users wish with cwmrc(5).
This commit is contained in:
9
calmwm.h
9
calmwm.h
@@ -282,6 +282,8 @@ enum menu_exec {
|
|||||||
#define CWM_MENU_DUMMY 0x0001
|
#define CWM_MENU_DUMMY 0x0001
|
||||||
#define CWM_MENU_FILE 0x0002
|
#define CWM_MENU_FILE 0x0002
|
||||||
#define CWM_MENU_LIST 0x0004
|
#define CWM_MENU_LIST 0x0004
|
||||||
|
#define CWM_MENU_WINDOW_ALL 0x0008
|
||||||
|
#define CWM_MENU_WINDOW_HIDDEN 0x0010
|
||||||
|
|
||||||
struct menu {
|
struct menu {
|
||||||
TAILQ_ENTRY(menu) entry;
|
TAILQ_ENTRY(menu) entry;
|
||||||
@@ -461,15 +463,14 @@ void search_match_client(struct menu_q *, struct menu_q *,
|
|||||||
char *);
|
char *);
|
||||||
void search_match_exec(struct menu_q *, struct menu_q *,
|
void search_match_exec(struct menu_q *, struct menu_q *,
|
||||||
char *);
|
char *);
|
||||||
void search_match_exec_path(struct menu_q *,
|
void search_match_path(struct menu_q *, struct menu_q *,
|
||||||
struct menu_q *, char *);
|
|
||||||
void search_match_path_any(struct menu_q *, struct menu_q *,
|
|
||||||
char *);
|
char *);
|
||||||
void search_match_text(struct menu_q *, struct menu_q *,
|
void search_match_text(struct menu_q *, struct menu_q *,
|
||||||
char *);
|
char *);
|
||||||
void search_print_client(struct menu *, int);
|
void search_print_client(struct menu *, int);
|
||||||
void search_print_cmd(struct menu *, int);
|
void search_print_cmd(struct menu *, int);
|
||||||
void search_print_group(struct menu *, int);
|
void search_print_group(struct menu *, int);
|
||||||
|
void search_print_text(struct menu *, int);
|
||||||
|
|
||||||
struct region_ctx *region_find(struct screen_ctx *, int, int);
|
struct region_ctx *region_find(struct screen_ctx *, int, int);
|
||||||
struct geom screen_apply_gap(struct screen_ctx *, struct geom);
|
struct geom screen_apply_gap(struct screen_ctx *, struct geom);
|
||||||
@@ -539,7 +540,7 @@ int parse_config(const char *, struct conf *);
|
|||||||
void conf_atoms(void);
|
void conf_atoms(void);
|
||||||
void conf_autogroup(struct conf *, int, const char *,
|
void conf_autogroup(struct conf *, int, const char *,
|
||||||
const char *);
|
const char *);
|
||||||
int conf_bind_kbd(struct conf *, const char *,
|
int conf_bind_key(struct conf *, const char *,
|
||||||
const char *);
|
const char *);
|
||||||
int conf_bind_mouse(struct conf *, const char *,
|
int conf_bind_mouse(struct conf *, const char *,
|
||||||
const char *);
|
const char *);
|
||||||
|
8
client.c
8
client.c
@@ -91,6 +91,8 @@ client_init(Window win, struct screen_ctx *sc, int active)
|
|||||||
cc->geom.y = wattr.y;
|
cc->geom.y = wattr.y;
|
||||||
cc->geom.w = wattr.width;
|
cc->geom.w = wattr.width;
|
||||||
cc->geom.h = wattr.height;
|
cc->geom.h = wattr.height;
|
||||||
|
cc->dim.w = (cc->geom.w - cc->hint.basew) / cc->hint.incw;
|
||||||
|
cc->dim.h = (cc->geom.h - cc->hint.baseh) / cc->hint.inch;
|
||||||
cc->ptr.x = cc->geom.w / 2;
|
cc->ptr.x = cc->geom.w / 2;
|
||||||
cc->ptr.y = cc->geom.h / 2;
|
cc->ptr.y = cc->geom.h / 2;
|
||||||
|
|
||||||
@@ -424,6 +426,8 @@ client_resize(struct client_ctx *cc, int reset)
|
|||||||
|
|
||||||
XMoveResizeWindow(X_Dpy, cc->win, cc->geom.x,
|
XMoveResizeWindow(X_Dpy, cc->win, cc->geom.x,
|
||||||
cc->geom.y, cc->geom.w, cc->geom.h);
|
cc->geom.y, cc->geom.w, cc->geom.h);
|
||||||
|
cc->dim.w = (cc->geom.w - cc->hint.basew) / cc->hint.incw;
|
||||||
|
cc->dim.h = (cc->geom.h - cc->hint.baseh) / cc->hint.inch;
|
||||||
client_config(cc);
|
client_config(cc);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -877,9 +881,6 @@ client_applysizehints(struct client_ctx *cc)
|
|||||||
cc->geom.w = MIN(cc->geom.w, cc->hint.maxw);
|
cc->geom.w = MIN(cc->geom.w, cc->hint.maxw);
|
||||||
if (cc->hint.maxh)
|
if (cc->hint.maxh)
|
||||||
cc->geom.h = MIN(cc->geom.h, cc->hint.maxh);
|
cc->geom.h = MIN(cc->geom.h, cc->hint.maxh);
|
||||||
|
|
||||||
cc->dim.w = (cc->geom.w - cc->hint.basew) / cc->hint.incw;
|
|
||||||
cc->dim.h = (cc->geom.h - cc->hint.baseh) / cc->hint.inch;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -1085,4 +1086,3 @@ client_set_wm_state(struct client_ctx *cc, long state)
|
|||||||
XChangeProperty(X_Dpy, cc->win, cwmh[WM_STATE], cwmh[WM_STATE], 32,
|
XChangeProperty(X_Dpy, cc->win, cwmh[WM_STATE], cwmh[WM_STATE], 32,
|
||||||
PropModeReplace, (unsigned char *)data, 2);
|
PropModeReplace, (unsigned char *)data, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
794
conf.c
794
conf.c
@@ -34,27 +34,330 @@
|
|||||||
|
|
||||||
static const char *conf_bind_getmask(const char *, unsigned int *);
|
static const char *conf_bind_getmask(const char *, unsigned int *);
|
||||||
static void conf_cmd_remove(struct conf *, const char *);
|
static void conf_cmd_remove(struct conf *, const char *);
|
||||||
static void conf_unbind_kbd(struct conf *, struct bind_ctx *);
|
static void conf_unbind_key(struct conf *, struct bind_ctx *);
|
||||||
static void conf_unbind_mouse(struct conf *, struct bind_ctx *);
|
static void conf_unbind_mouse(struct conf *, struct bind_ctx *);
|
||||||
|
|
||||||
|
static int cursor_binds[] = {
|
||||||
|
XC_left_ptr, /* CF_NORMAL */
|
||||||
|
XC_fleur, /* CF_MOVE */
|
||||||
|
XC_bottom_right_corner, /* CF_RESIZE */
|
||||||
|
XC_question_arrow, /* CF_QUESTION */
|
||||||
|
};
|
||||||
|
static const char *color_binds[] = {
|
||||||
|
"#CCCCCC", /* CWM_COLOR_BORDER_ACTIVE */
|
||||||
|
"#666666", /* CWM_COLOR_BORDER_INACTIVE */
|
||||||
|
"#FC8814", /* CWM_COLOR_BORDER_URGENCY */
|
||||||
|
"blue", /* CWM_COLOR_BORDER_GROUP */
|
||||||
|
"red", /* CWM_COLOR_BORDER_UNGROUP */
|
||||||
|
"black", /* CWM_COLOR_MENU_FG */
|
||||||
|
"white", /* CWM_COLOR_MENU_BG */
|
||||||
|
"black", /* CWM_COLOR_MENU_FONT */
|
||||||
|
"", /* CWM_COLOR_MENU_FONT_SEL */
|
||||||
|
};
|
||||||
|
static const struct {
|
||||||
|
const char *tag;
|
||||||
|
void (*handler)(void *, union arg *, enum xev);
|
||||||
|
enum context context;
|
||||||
|
union arg argument;
|
||||||
|
} name_to_func[] = {
|
||||||
|
{ "window-menu-label", kbfunc_menu_client_label, CWM_CONTEXT_CC, {0} },
|
||||||
|
{ "window-lower", kbfunc_client_lower, CWM_CONTEXT_CC, {0} },
|
||||||
|
{ "window-raise", kbfunc_client_raise, CWM_CONTEXT_CC, {0} },
|
||||||
|
{ "window-hide", kbfunc_client_hide, CWM_CONTEXT_CC, {0} },
|
||||||
|
{ "window-delete", kbfunc_client_delete, CWM_CONTEXT_CC, {0} },
|
||||||
|
{ "window-htile", kbfunc_client_htile, CWM_CONTEXT_CC, {0} },
|
||||||
|
{ "window-vtile", kbfunc_client_vtile, CWM_CONTEXT_CC, {0} },
|
||||||
|
{ "window-stick", kbfunc_client_toggle_sticky, CWM_CONTEXT_CC, {0} },
|
||||||
|
{ "window-fullscreen", kbfunc_client_toggle_fullscreen, CWM_CONTEXT_CC, {0} },
|
||||||
|
{ "window-maximize", kbfunc_client_toggle_maximize, CWM_CONTEXT_CC, {0} },
|
||||||
|
{ "window-vmaximize", kbfunc_client_toggle_vmaximize, CWM_CONTEXT_CC, {0} },
|
||||||
|
{ "window-hmaximize", kbfunc_client_toggle_hmaximize, CWM_CONTEXT_CC, {0} },
|
||||||
|
{ "window-freeze", kbfunc_client_toggle_freeze, CWM_CONTEXT_CC, {0} },
|
||||||
|
{ "window-cycle", kbfunc_client_cycle, CWM_CONTEXT_SC,
|
||||||
|
{.i = (CWM_CYCLE_FORWARD)} },
|
||||||
|
{ "window-rcycle", kbfunc_client_cycle, CWM_CONTEXT_SC,
|
||||||
|
{.i = (CWM_CYCLE_REVERSE)} },
|
||||||
|
{ "window-cycle-ingroup", kbfunc_client_cycle, CWM_CONTEXT_SC,
|
||||||
|
{.i = (CWM_CYCLE_FORWARD | CWM_CYCLE_INGROUP)} },
|
||||||
|
{ "window-rcycle-ingroup", kbfunc_client_cycle, CWM_CONTEXT_SC,
|
||||||
|
{.i = (CWM_CYCLE_REVERSE | CWM_CYCLE_INGROUP)} },
|
||||||
|
{ "window-group", kbfunc_client_toggle_group, CWM_CONTEXT_CC, {0} },
|
||||||
|
{ "window-movetogroup-1", kbfunc_client_movetogroup, CWM_CONTEXT_CC, {.i = 1} },
|
||||||
|
{ "window-movetogroup-2", kbfunc_client_movetogroup, CWM_CONTEXT_CC, {.i = 2} },
|
||||||
|
{ "window-movetogroup-3", kbfunc_client_movetogroup, CWM_CONTEXT_CC, {.i = 3} },
|
||||||
|
{ "window-movetogroup-4", kbfunc_client_movetogroup, CWM_CONTEXT_CC, {.i = 4} },
|
||||||
|
{ "window-movetogroup-5", kbfunc_client_movetogroup, CWM_CONTEXT_CC, {.i = 5} },
|
||||||
|
{ "window-movetogroup-6", kbfunc_client_movetogroup, CWM_CONTEXT_CC, {.i = 6} },
|
||||||
|
{ "window-movetogroup-7", kbfunc_client_movetogroup, CWM_CONTEXT_CC, {.i = 7} },
|
||||||
|
{ "window-movetogroup-8", kbfunc_client_movetogroup, CWM_CONTEXT_CC, {.i = 8} },
|
||||||
|
{ "window-movetogroup-9", kbfunc_client_movetogroup, CWM_CONTEXT_CC, {.i = 9} },
|
||||||
|
|
||||||
|
{ "window-move", mousefunc_client_move, CWM_CONTEXT_CC, {0} },
|
||||||
|
{ "window-move-up", kbfunc_client_move, CWM_CONTEXT_CC,
|
||||||
|
{.i = (CWM_UP)} },
|
||||||
|
{ "window-move-down", kbfunc_client_move, CWM_CONTEXT_CC,
|
||||||
|
{.i = (CWM_DOWN)} },
|
||||||
|
{ "window-move-right", kbfunc_client_move, CWM_CONTEXT_CC,
|
||||||
|
{.i = (CWM_RIGHT)} },
|
||||||
|
{ "window-move-left", kbfunc_client_move, CWM_CONTEXT_CC,
|
||||||
|
{.i = (CWM_LEFT)} },
|
||||||
|
{ "window-move-up-big", kbfunc_client_move, CWM_CONTEXT_CC,
|
||||||
|
{.i = (CWM_UP | CWM_BIGAMOUNT)} },
|
||||||
|
{ "window-move-down-big", kbfunc_client_move, CWM_CONTEXT_CC,
|
||||||
|
{.i = (CWM_DOWN | CWM_BIGAMOUNT)} },
|
||||||
|
{ "window-move-right-big", kbfunc_client_move, CWM_CONTEXT_CC,
|
||||||
|
{.i = (CWM_RIGHT | CWM_BIGAMOUNT)} },
|
||||||
|
{ "window-move-left-big", kbfunc_client_move, CWM_CONTEXT_CC,
|
||||||
|
{.i = (CWM_LEFT | CWM_BIGAMOUNT)} },
|
||||||
|
{ "window-resize", mousefunc_client_resize, CWM_CONTEXT_CC, {0} },
|
||||||
|
{ "window-resize-up", kbfunc_client_resize, CWM_CONTEXT_CC,
|
||||||
|
{.i = (CWM_UP)} },
|
||||||
|
{ "window-resize-down", kbfunc_client_resize, CWM_CONTEXT_CC,
|
||||||
|
{.i = (CWM_DOWN)} },
|
||||||
|
{ "window-resize-right", kbfunc_client_resize, CWM_CONTEXT_CC,
|
||||||
|
{.i = (CWM_RIGHT)} },
|
||||||
|
{ "window-resize-left", kbfunc_client_resize, CWM_CONTEXT_CC,
|
||||||
|
{.i = (CWM_LEFT)} },
|
||||||
|
{ "window-resize-up-big", kbfunc_client_resize, CWM_CONTEXT_CC,
|
||||||
|
{.i = (CWM_UP | CWM_BIGAMOUNT)} },
|
||||||
|
{ "window-resize-down-big", kbfunc_client_resize, CWM_CONTEXT_CC,
|
||||||
|
{.i = (CWM_DOWN | CWM_BIGAMOUNT)} },
|
||||||
|
{ "window-resize-right-big", kbfunc_client_resize, CWM_CONTEXT_CC,
|
||||||
|
{.i = (CWM_RIGHT | CWM_BIGAMOUNT)} },
|
||||||
|
{ "window-resize-left-big", kbfunc_client_resize, CWM_CONTEXT_CC,
|
||||||
|
{.i = (CWM_LEFT | CWM_BIGAMOUNT)} },
|
||||||
|
|
||||||
|
{ "group-cycle", kbfunc_group_cycle, CWM_CONTEXT_SC,
|
||||||
|
{.i = (CWM_CYCLE_FORWARD)} },
|
||||||
|
{ "group-rcycle", kbfunc_group_cycle, CWM_CONTEXT_SC,
|
||||||
|
{.i = (CWM_CYCLE_REVERSE)} },
|
||||||
|
{ "group-toggle-all", kbfunc_group_alltoggle, CWM_CONTEXT_SC, {0} },
|
||||||
|
{ "group-toggle-1", kbfunc_group_toggle, CWM_CONTEXT_SC, {.i = 1} },
|
||||||
|
{ "group-toggle-2", kbfunc_group_toggle, CWM_CONTEXT_SC, {.i = 2} },
|
||||||
|
{ "group-toggle-3", kbfunc_group_toggle, CWM_CONTEXT_SC, {.i = 3} },
|
||||||
|
{ "group-toggle-4", kbfunc_group_toggle, CWM_CONTEXT_SC, {.i = 4} },
|
||||||
|
{ "group-toggle-5", kbfunc_group_toggle, CWM_CONTEXT_SC, {.i = 5} },
|
||||||
|
{ "group-toggle-6", kbfunc_group_toggle, CWM_CONTEXT_SC, {.i = 6} },
|
||||||
|
{ "group-toggle-7", kbfunc_group_toggle, CWM_CONTEXT_SC, {.i = 7} },
|
||||||
|
{ "group-toggle-8", kbfunc_group_toggle, CWM_CONTEXT_SC, {.i = 8} },
|
||||||
|
{ "group-toggle-9", kbfunc_group_toggle, CWM_CONTEXT_SC, {.i = 9} },
|
||||||
|
{ "group-only-1", kbfunc_group_only, CWM_CONTEXT_SC, {.i = 1} },
|
||||||
|
{ "group-only-2", kbfunc_group_only, CWM_CONTEXT_SC, {.i = 2} },
|
||||||
|
{ "group-only-3", kbfunc_group_only, CWM_CONTEXT_SC, {.i = 3} },
|
||||||
|
{ "group-only-4", kbfunc_group_only, CWM_CONTEXT_SC, {.i = 4} },
|
||||||
|
{ "group-only-5", kbfunc_group_only, CWM_CONTEXT_SC, {.i = 5} },
|
||||||
|
{ "group-only-6", kbfunc_group_only, CWM_CONTEXT_SC, {.i = 6} },
|
||||||
|
{ "group-only-7", kbfunc_group_only, CWM_CONTEXT_SC, {.i = 7} },
|
||||||
|
{ "group-only-8", kbfunc_group_only, CWM_CONTEXT_SC, {.i = 8} },
|
||||||
|
{ "group-only-9", kbfunc_group_only, CWM_CONTEXT_SC, {.i = 9} },
|
||||||
|
|
||||||
|
{ "pointer-move-up", kbfunc_ptrmove, CWM_CONTEXT_SC,
|
||||||
|
{.i = (CWM_UP)} },
|
||||||
|
{ "pointer-move-down", kbfunc_ptrmove, CWM_CONTEXT_SC,
|
||||||
|
{.i = (CWM_DOWN)} },
|
||||||
|
{ "pointer-move-left", kbfunc_ptrmove, CWM_CONTEXT_SC,
|
||||||
|
{.i = (CWM_LEFT)} },
|
||||||
|
{ "pointer-move-right", kbfunc_ptrmove, CWM_CONTEXT_SC,
|
||||||
|
{.i = (CWM_RIGHT)} },
|
||||||
|
{ "pointer-move-up-big", kbfunc_ptrmove, CWM_CONTEXT_SC,
|
||||||
|
{.i = (CWM_UP | CWM_BIGAMOUNT)} },
|
||||||
|
{ "pointer-move-down-big", kbfunc_ptrmove, CWM_CONTEXT_SC,
|
||||||
|
{.i = (CWM_DOWN | CWM_BIGAMOUNT)} },
|
||||||
|
{ "pointer-move-left-big", kbfunc_ptrmove, CWM_CONTEXT_SC,
|
||||||
|
{.i = (CWM_LEFT | CWM_BIGAMOUNT)} },
|
||||||
|
{ "pointer-move-right-big", kbfunc_ptrmove, CWM_CONTEXT_SC,
|
||||||
|
{.i = (CWM_RIGHT | CWM_BIGAMOUNT)} },
|
||||||
|
|
||||||
|
{ "menu-cmd", kbfunc_menu_cmd, CWM_CONTEXT_SC, {0} },
|
||||||
|
{ "menu-group", kbfunc_menu_group, CWM_CONTEXT_SC, {0} },
|
||||||
|
{ "menu-ssh", kbfunc_menu_ssh, CWM_CONTEXT_SC, {0} },
|
||||||
|
{ "menu-window", kbfunc_menu_client, CWM_CONTEXT_SC,
|
||||||
|
{.i = CWM_MENU_WINDOW_ALL} },
|
||||||
|
{ "menu-window-hidden", kbfunc_menu_client, CWM_CONTEXT_SC,
|
||||||
|
{.i = CWM_MENU_WINDOW_HIDDEN} },
|
||||||
|
{ "menu-exec", kbfunc_menu_exec, CWM_CONTEXT_SC,
|
||||||
|
{.i = CWM_MENU_EXEC_EXEC} },
|
||||||
|
{ "menu-exec-wm", kbfunc_menu_exec, CWM_CONTEXT_SC,
|
||||||
|
{.i = CWM_MENU_EXEC_WM} },
|
||||||
|
|
||||||
|
{ "terminal", kbfunc_exec_term, CWM_CONTEXT_SC, {0} },
|
||||||
|
{ "lock", kbfunc_exec_lock, CWM_CONTEXT_SC, {0} },
|
||||||
|
{ "restart", kbfunc_cwm_status, CWM_CONTEXT_SC, {.i = CWM_EXEC_WM} },
|
||||||
|
{ "quit", kbfunc_cwm_status, CWM_CONTEXT_SC, {.i = CWM_QUIT} },
|
||||||
|
|
||||||
|
};
|
||||||
|
static unsigned int ignore_mods[] = {
|
||||||
|
0, LockMask, Mod2Mask, Mod2Mask | LockMask
|
||||||
|
};
|
||||||
|
static const struct {
|
||||||
|
const char ch;
|
||||||
|
int mask;
|
||||||
|
} bind_mods[] = {
|
||||||
|
{ 'C', ControlMask },
|
||||||
|
{ 'M', Mod1Mask },
|
||||||
|
{ '4', Mod4Mask },
|
||||||
|
{ 'S', ShiftMask },
|
||||||
|
};
|
||||||
|
static const struct {
|
||||||
|
const char *key;
|
||||||
|
const char *func;
|
||||||
|
} key_binds[] = {
|
||||||
|
{ "CM-Return", "terminal" },
|
||||||
|
{ "CM-Delete", "lock" },
|
||||||
|
{ "M-question", "menu-exec" },
|
||||||
|
{ "CM-w", "menu-exec-wm" },
|
||||||
|
{ "M-period", "menu-ssh" },
|
||||||
|
{ "M-Return", "window-hide" },
|
||||||
|
{ "M-Down", "window-lower" },
|
||||||
|
{ "M-Up", "window-raise" },
|
||||||
|
{ "M-slash", "menu-window" },
|
||||||
|
{ "C-slash", "menu-cmd" },
|
||||||
|
{ "M-Tab", "window-cycle" },
|
||||||
|
{ "MS-Tab", "window-rcycle" },
|
||||||
|
{ "CM-n", "window-menu-label" },
|
||||||
|
{ "CM-x", "window-delete" },
|
||||||
|
{ "CM-a", "group-toggle-all" },
|
||||||
|
{ "CM-0", "group-toggle-all" },
|
||||||
|
{ "CM-1", "group-toggle-1" },
|
||||||
|
{ "CM-2", "group-toggle-2" },
|
||||||
|
{ "CM-3", "group-toggle-3" },
|
||||||
|
{ "CM-4", "group-toggle-4" },
|
||||||
|
{ "CM-5", "group-toggle-5" },
|
||||||
|
{ "CM-6", "group-toggle-6" },
|
||||||
|
{ "CM-7", "group-toggle-7" },
|
||||||
|
{ "CM-8", "group-toggle-8" },
|
||||||
|
{ "CM-9", "group-toggle-9" },
|
||||||
|
{ "M-Right", "group-cycle" },
|
||||||
|
{ "M-Left", "group-rcycle" },
|
||||||
|
{ "CM-g", "window-group" },
|
||||||
|
{ "CM-f", "window-fullscreen" },
|
||||||
|
{ "CM-m", "window-maximize" },
|
||||||
|
{ "CM-s", "window-stick" },
|
||||||
|
{ "CM-equal", "window-vmaximize" },
|
||||||
|
{ "CMS-equal", "window-hmaximize" },
|
||||||
|
{ "CMS-f", "window-freeze" },
|
||||||
|
{ "CMS-r", "restart" },
|
||||||
|
{ "CMS-q", "quit" },
|
||||||
|
{ "M-h", "window-move-left" },
|
||||||
|
{ "M-j", "window-move-down" },
|
||||||
|
{ "M-k", "window-move-up" },
|
||||||
|
{ "M-l", "window-move-right" },
|
||||||
|
{ "MS-h", "window-move-left-big" },
|
||||||
|
{ "MS-j", "window-move-down-big" },
|
||||||
|
{ "MS-k", "window-move-up-big" },
|
||||||
|
{ "MS-l", "window-move-right-big" },
|
||||||
|
{ "CM-h", "window-resize-left" },
|
||||||
|
{ "CM-j", "window-resize-down" },
|
||||||
|
{ "CM-k", "window-resize-up" },
|
||||||
|
{ "CM-l", "window-resize-right" },
|
||||||
|
{ "CMS-h", "window-resize-left-big" },
|
||||||
|
{ "CMS-j", "window-resize-down-big" },
|
||||||
|
{ "CMS-k", "window-resize-up-big" },
|
||||||
|
{ "CMS-l", "window-resize-right-big" },
|
||||||
|
},
|
||||||
|
mouse_binds[] = {
|
||||||
|
{ "1", "menu-window" },
|
||||||
|
{ "2", "menu-group" },
|
||||||
|
{ "3", "menu-cmd" },
|
||||||
|
{ "M-1", "window-move" },
|
||||||
|
{ "CM-1", "window-group" },
|
||||||
|
{ "M-2", "window-resize" },
|
||||||
|
{ "M-3", "window-lower" },
|
||||||
|
{ "CMS-3", "window-hide" },
|
||||||
|
};
|
||||||
|
|
||||||
|
void
|
||||||
|
conf_init(struct conf *c)
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
c->stickygroups = 0;
|
||||||
|
c->bwidth = 1;
|
||||||
|
c->mamount = 1;
|
||||||
|
c->snapdist = 0;
|
||||||
|
c->ngroups = 10;
|
||||||
|
c->nameqlen = 5;
|
||||||
|
|
||||||
|
TAILQ_INIT(&c->ignoreq);
|
||||||
|
TAILQ_INIT(&c->cmdq);
|
||||||
|
TAILQ_INIT(&c->keybindq);
|
||||||
|
TAILQ_INIT(&c->autogroupq);
|
||||||
|
TAILQ_INIT(&c->mousebindq);
|
||||||
|
|
||||||
|
for (i = 0; i < nitems(key_binds); i++)
|
||||||
|
conf_bind_key(c, key_binds[i].key, key_binds[i].func);
|
||||||
|
|
||||||
|
for (i = 0; i < nitems(mouse_binds); i++)
|
||||||
|
conf_bind_mouse(c, mouse_binds[i].key, mouse_binds[i].func);
|
||||||
|
|
||||||
|
for (i = 0; i < nitems(color_binds); i++)
|
||||||
|
c->color[i] = xstrdup(color_binds[i]);
|
||||||
|
|
||||||
|
conf_cmd_add(c, "lock", "xlock");
|
||||||
|
conf_cmd_add(c, "term", "xterm");
|
||||||
|
|
||||||
|
(void)snprintf(c->known_hosts, sizeof(c->known_hosts), "%s/%s",
|
||||||
|
homedir, ".ssh/known_hosts");
|
||||||
|
|
||||||
|
c->font = xstrdup("sans-serif:pixelsize=14:bold");
|
||||||
|
c->wmname = xstrdup("CWM");
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
conf_clear(struct conf *c)
|
||||||
|
{
|
||||||
|
struct autogroup *ag;
|
||||||
|
struct bind_ctx *kb, *mb;
|
||||||
|
struct winname *wn;
|
||||||
|
struct cmd_ctx *cmd;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
while ((cmd = TAILQ_FIRST(&c->cmdq)) != NULL) {
|
||||||
|
TAILQ_REMOVE(&c->cmdq, cmd, entry);
|
||||||
|
free(cmd->name);
|
||||||
|
free(cmd);
|
||||||
|
}
|
||||||
|
while ((kb = TAILQ_FIRST(&c->keybindq)) != NULL) {
|
||||||
|
TAILQ_REMOVE(&c->keybindq, kb, entry);
|
||||||
|
free(kb);
|
||||||
|
}
|
||||||
|
while ((ag = TAILQ_FIRST(&c->autogroupq)) != NULL) {
|
||||||
|
TAILQ_REMOVE(&c->autogroupq, ag, entry);
|
||||||
|
free(ag->class);
|
||||||
|
free(ag->name);
|
||||||
|
free(ag);
|
||||||
|
}
|
||||||
|
while ((wn = TAILQ_FIRST(&c->ignoreq)) != NULL) {
|
||||||
|
TAILQ_REMOVE(&c->ignoreq, wn, entry);
|
||||||
|
free(wn->name);
|
||||||
|
free(wn);
|
||||||
|
}
|
||||||
|
while ((mb = TAILQ_FIRST(&c->mousebindq)) != NULL) {
|
||||||
|
TAILQ_REMOVE(&c->mousebindq, mb, entry);
|
||||||
|
free(mb);
|
||||||
|
}
|
||||||
|
for (i = 0; i < CWM_COLOR_NITEMS; i++)
|
||||||
|
free(c->color[i]);
|
||||||
|
|
||||||
|
free(c->font);
|
||||||
|
free(c->wmname);
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
conf_cmd_add(struct conf *c, const char *name, const char *path)
|
conf_cmd_add(struct conf *c, const char *name, const char *path)
|
||||||
{
|
{
|
||||||
struct cmd_ctx *cmd;
|
struct cmd_ctx *cmd;
|
||||||
|
|
||||||
cmd = xmalloc(sizeof(*cmd));
|
cmd = xmalloc(sizeof(*cmd));
|
||||||
|
|
||||||
cmd->name = xstrdup(name);
|
cmd->name = xstrdup(name);
|
||||||
if (strlcpy(cmd->path, path, sizeof(cmd->path)) >= sizeof(cmd->path)) {
|
if (strlcpy(cmd->path, path, sizeof(cmd->path)) >= sizeof(cmd->path)) {
|
||||||
free(cmd->name);
|
free(cmd->name);
|
||||||
free(cmd);
|
free(cmd);
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
conf_cmd_remove(c, name);
|
conf_cmd_remove(c, name);
|
||||||
|
|
||||||
TAILQ_INSERT_TAIL(&c->cmdq, cmd, entry);
|
TAILQ_INSERT_TAIL(&c->cmdq, cmd, entry);
|
||||||
|
|
||||||
return(1);
|
return(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -71,6 +374,7 @@ conf_cmd_remove(struct conf *c, const char *name)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
conf_autogroup(struct conf *c, int num, const char *name, const char *class)
|
conf_autogroup(struct conf *c, int num, const char *name, const char *class)
|
||||||
{
|
{
|
||||||
@@ -78,7 +382,6 @@ conf_autogroup(struct conf *c, int num, const char *name, const char *class)
|
|||||||
char *p;
|
char *p;
|
||||||
|
|
||||||
ag = xmalloc(sizeof(*ag));
|
ag = xmalloc(sizeof(*ag));
|
||||||
|
|
||||||
if ((p = strchr(class, ',')) == NULL) {
|
if ((p = strchr(class, ',')) == NULL) {
|
||||||
if (name == NULL)
|
if (name == NULL)
|
||||||
ag->name = NULL;
|
ag->name = NULL;
|
||||||
@@ -88,7 +391,6 @@ conf_autogroup(struct conf *c, int num, const char *name, const char *class)
|
|||||||
ag->class = xstrdup(class);
|
ag->class = xstrdup(class);
|
||||||
} else {
|
} else {
|
||||||
*(p++) = '\0';
|
*(p++) = '\0';
|
||||||
|
|
||||||
if (name == NULL)
|
if (name == NULL)
|
||||||
ag->name = xstrdup(class);
|
ag->name = xstrdup(class);
|
||||||
else
|
else
|
||||||
@@ -97,7 +399,6 @@ conf_autogroup(struct conf *c, int num, const char *name, const char *class)
|
|||||||
ag->class = xstrdup(p);
|
ag->class = xstrdup(p);
|
||||||
}
|
}
|
||||||
ag->num = num;
|
ag->num = num;
|
||||||
|
|
||||||
TAILQ_INSERT_TAIL(&c->autogroupq, ag, entry);
|
TAILQ_INSERT_TAIL(&c->autogroupq, ag, entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -111,17 +412,30 @@ conf_ignore(struct conf *c, const char *name)
|
|||||||
TAILQ_INSERT_TAIL(&c->ignoreq, wn, entry);
|
TAILQ_INSERT_TAIL(&c->ignoreq, wn, entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *color_binds[] = {
|
void
|
||||||
"#CCCCCC", /* CWM_COLOR_BORDER_ACTIVE */
|
conf_cursor(struct conf *c)
|
||||||
"#666666", /* CWM_COLOR_BORDER_INACTIVE */
|
{
|
||||||
"#FC8814", /* CWM_COLOR_BORDER_URGENCY */
|
unsigned int i;
|
||||||
"blue", /* CWM_COLOR_BORDER_GROUP */
|
|
||||||
"red", /* CWM_COLOR_BORDER_UNGROUP */
|
for (i = 0; i < nitems(cursor_binds); i++)
|
||||||
"black", /* CWM_COLOR_MENU_FG */
|
c->cursor[i] = XCreateFontCursor(X_Dpy, cursor_binds[i]);
|
||||||
"white", /* CWM_COLOR_MENU_BG */
|
}
|
||||||
"black", /* CWM_COLOR_MENU_FONT */
|
|
||||||
"", /* CWM_COLOR_MENU_FONT_SEL */
|
void
|
||||||
};
|
conf_client(struct client_ctx *cc)
|
||||||
|
{
|
||||||
|
struct winname *wn;
|
||||||
|
int ignore = 0;
|
||||||
|
|
||||||
|
TAILQ_FOREACH(wn, &Conf.ignoreq, entry) {
|
||||||
|
if (strncasecmp(wn->name, cc->name, strlen(wn->name)) == 0) {
|
||||||
|
ignore = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cc->bwidth = (ignore) ? 0 : Conf.bwidth;
|
||||||
|
cc->flags |= (ignore) ? CLIENT_IGNORE : 0;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
conf_screen(struct screen_ctx *sc)
|
conf_screen(struct screen_ctx *sc)
|
||||||
@@ -174,322 +488,6 @@ conf_screen(struct screen_ctx *sc)
|
|||||||
conf_grab_kbd(sc->rootwin);
|
conf_grab_kbd(sc->rootwin);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct {
|
|
||||||
const char *key;
|
|
||||||
const char *func;
|
|
||||||
} kbd_binds[] = {
|
|
||||||
{ "CM-Return", "terminal" },
|
|
||||||
{ "CM-Delete", "lock" },
|
|
||||||
{ "M-question", "exec" },
|
|
||||||
{ "CM-w", "exec_wm" },
|
|
||||||
{ "M-period", "ssh" },
|
|
||||||
{ "M-Return", "hide" },
|
|
||||||
{ "M-Down", "lower" },
|
|
||||||
{ "M-Up", "raise" },
|
|
||||||
{ "M-slash", "search" },
|
|
||||||
{ "C-slash", "menusearch" },
|
|
||||||
{ "M-Tab", "cycle" },
|
|
||||||
{ "MS-Tab", "rcycle" },
|
|
||||||
{ "CM-n", "label" },
|
|
||||||
{ "CM-x", "delete" },
|
|
||||||
{ "CM-a", "nogroup" },
|
|
||||||
{ "CM-0", "nogroup" },
|
|
||||||
{ "CM-1", "group1" },
|
|
||||||
{ "CM-2", "group2" },
|
|
||||||
{ "CM-3", "group3" },
|
|
||||||
{ "CM-4", "group4" },
|
|
||||||
{ "CM-5", "group5" },
|
|
||||||
{ "CM-6", "group6" },
|
|
||||||
{ "CM-7", "group7" },
|
|
||||||
{ "CM-8", "group8" },
|
|
||||||
{ "CM-9", "group9" },
|
|
||||||
{ "M-Right", "cyclegroup" },
|
|
||||||
{ "M-Left", "rcyclegroup" },
|
|
||||||
{ "CM-g", "grouptoggle" },
|
|
||||||
{ "CM-f", "fullscreen" },
|
|
||||||
{ "CM-m", "maximize" },
|
|
||||||
{ "CM-s", "stick" },
|
|
||||||
{ "CM-equal", "vmaximize" },
|
|
||||||
{ "CMS-equal", "hmaximize" },
|
|
||||||
{ "CMS-f", "freeze" },
|
|
||||||
{ "CMS-r", "restart" },
|
|
||||||
{ "CMS-q", "quit" },
|
|
||||||
{ "M-h", "moveleft" },
|
|
||||||
{ "M-j", "movedown" },
|
|
||||||
{ "M-k", "moveup" },
|
|
||||||
{ "M-l", "moveright" },
|
|
||||||
{ "MS-h", "bigmoveleft" },
|
|
||||||
{ "MS-j", "bigmovedown" },
|
|
||||||
{ "MS-k", "bigmoveup" },
|
|
||||||
{ "MS-l", "bigmoveright" },
|
|
||||||
{ "CM-h", "resizeleft" },
|
|
||||||
{ "CM-j", "resizedown" },
|
|
||||||
{ "CM-k", "resizeup" },
|
|
||||||
{ "CM-l", "resizeright" },
|
|
||||||
{ "CMS-h", "bigresizeleft" },
|
|
||||||
{ "CMS-j", "bigresizedown" },
|
|
||||||
{ "CMS-k", "bigresizeup" },
|
|
||||||
{ "CMS-l", "bigresizeright" },
|
|
||||||
{ "C-Left", "ptrmoveleft" },
|
|
||||||
{ "C-Down", "ptrmovedown" },
|
|
||||||
{ "C-Up", "ptrmoveup" },
|
|
||||||
{ "C-Right", "ptrmoveright" },
|
|
||||||
{ "CS-Left", "bigptrmoveleft" },
|
|
||||||
{ "CS-Down", "bigptrmovedown" },
|
|
||||||
{ "CS-Up", "bigptrmoveup" },
|
|
||||||
{ "CS-Right", "bigptrmoveright" },
|
|
||||||
},
|
|
||||||
mouse_binds[] = {
|
|
||||||
{ "1", "menu_unhide" },
|
|
||||||
{ "2", "menu_group" },
|
|
||||||
{ "3", "menu_cmd" },
|
|
||||||
{ "M-1", "window_move" },
|
|
||||||
{ "CM-1", "window_grouptoggle" },
|
|
||||||
{ "M-2", "window_resize" },
|
|
||||||
{ "M-3", "window_lower" },
|
|
||||||
{ "CMS-3", "window_hide" },
|
|
||||||
};
|
|
||||||
|
|
||||||
void
|
|
||||||
conf_init(struct conf *c)
|
|
||||||
{
|
|
||||||
unsigned int i;
|
|
||||||
|
|
||||||
c->stickygroups = 0;
|
|
||||||
c->bwidth = 1;
|
|
||||||
c->mamount = 1;
|
|
||||||
c->snapdist = 0;
|
|
||||||
c->ngroups = 10;
|
|
||||||
c->nameqlen = 5;
|
|
||||||
|
|
||||||
TAILQ_INIT(&c->ignoreq);
|
|
||||||
TAILQ_INIT(&c->cmdq);
|
|
||||||
TAILQ_INIT(&c->keybindq);
|
|
||||||
TAILQ_INIT(&c->autogroupq);
|
|
||||||
TAILQ_INIT(&c->mousebindq);
|
|
||||||
|
|
||||||
for (i = 0; i < nitems(kbd_binds); i++)
|
|
||||||
conf_bind_kbd(c, kbd_binds[i].key, kbd_binds[i].func);
|
|
||||||
|
|
||||||
for (i = 0; i < nitems(mouse_binds); i++)
|
|
||||||
conf_bind_mouse(c, mouse_binds[i].key, mouse_binds[i].func);
|
|
||||||
|
|
||||||
for (i = 0; i < nitems(color_binds); i++)
|
|
||||||
c->color[i] = xstrdup(color_binds[i]);
|
|
||||||
|
|
||||||
conf_cmd_add(c, "lock", "xlock");
|
|
||||||
conf_cmd_add(c, "term", "xterm");
|
|
||||||
|
|
||||||
(void)snprintf(c->known_hosts, sizeof(c->known_hosts), "%s/%s",
|
|
||||||
homedir, ".ssh/known_hosts");
|
|
||||||
|
|
||||||
c->font = xstrdup("sans-serif:pixelsize=14:bold");
|
|
||||||
c->wmname = xstrdup("CWM");
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
conf_clear(struct conf *c)
|
|
||||||
{
|
|
||||||
struct autogroup *ag;
|
|
||||||
struct bind_ctx *kb, *mb;
|
|
||||||
struct winname *wn;
|
|
||||||
struct cmd_ctx *cmd;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
while ((cmd = TAILQ_FIRST(&c->cmdq)) != NULL) {
|
|
||||||
TAILQ_REMOVE(&c->cmdq, cmd, entry);
|
|
||||||
free(cmd->name);
|
|
||||||
free(cmd);
|
|
||||||
}
|
|
||||||
|
|
||||||
while ((kb = TAILQ_FIRST(&c->keybindq)) != NULL) {
|
|
||||||
TAILQ_REMOVE(&c->keybindq, kb, entry);
|
|
||||||
free(kb);
|
|
||||||
}
|
|
||||||
|
|
||||||
while ((ag = TAILQ_FIRST(&c->autogroupq)) != NULL) {
|
|
||||||
TAILQ_REMOVE(&c->autogroupq, ag, entry);
|
|
||||||
free(ag->class);
|
|
||||||
free(ag->name);
|
|
||||||
free(ag);
|
|
||||||
}
|
|
||||||
|
|
||||||
while ((wn = TAILQ_FIRST(&c->ignoreq)) != NULL) {
|
|
||||||
TAILQ_REMOVE(&c->ignoreq, wn, entry);
|
|
||||||
free(wn->name);
|
|
||||||
free(wn);
|
|
||||||
}
|
|
||||||
|
|
||||||
while ((mb = TAILQ_FIRST(&c->mousebindq)) != NULL) {
|
|
||||||
TAILQ_REMOVE(&c->mousebindq, mb, entry);
|
|
||||||
free(mb);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < CWM_COLOR_NITEMS; i++)
|
|
||||||
free(c->color[i]);
|
|
||||||
|
|
||||||
free(c->font);
|
|
||||||
free(c->wmname);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
conf_client(struct client_ctx *cc)
|
|
||||||
{
|
|
||||||
struct winname *wn;
|
|
||||||
int ignore = 0;
|
|
||||||
|
|
||||||
TAILQ_FOREACH(wn, &Conf.ignoreq, entry) {
|
|
||||||
if (strncasecmp(wn->name, cc->name, strlen(wn->name)) == 0) {
|
|
||||||
ignore = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
cc->bwidth = (ignore) ? 0 : Conf.bwidth;
|
|
||||||
cc->flags |= (ignore) ? CLIENT_IGNORE : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const struct {
|
|
||||||
const char *tag;
|
|
||||||
void (*handler)(void *, union arg *, enum xev);
|
|
||||||
int context;
|
|
||||||
union arg argument;
|
|
||||||
} name_to_func[] = {
|
|
||||||
{ "lower", kbfunc_client_lower, CWM_CONTEXT_CC, {0} },
|
|
||||||
{ "raise", kbfunc_client_raise, CWM_CONTEXT_CC, {0} },
|
|
||||||
{ "search", kbfunc_menu_client, CWM_CONTEXT_SC, {0} },
|
|
||||||
{ "menusearch", kbfunc_menu_cmd, CWM_CONTEXT_SC, {0} },
|
|
||||||
{ "groupsearch", kbfunc_menu_group, CWM_CONTEXT_SC, {0} },
|
|
||||||
{ "hide", kbfunc_client_hide, CWM_CONTEXT_CC, {0} },
|
|
||||||
{ "cycle", kbfunc_client_cycle, CWM_CONTEXT_SC,
|
|
||||||
{.i = (CWM_CYCLE_FORWARD)} },
|
|
||||||
{ "rcycle", kbfunc_client_cycle, CWM_CONTEXT_SC,
|
|
||||||
{.i = (CWM_CYCLE_REVERSE)} },
|
|
||||||
{ "label", kbfunc_menu_client_label, CWM_CONTEXT_CC, {0} },
|
|
||||||
{ "delete", kbfunc_client_delete, CWM_CONTEXT_CC, {0} },
|
|
||||||
{ "group1", kbfunc_group_toggle, CWM_CONTEXT_SC, {.i = 1} },
|
|
||||||
{ "group2", kbfunc_group_toggle, CWM_CONTEXT_SC, {.i = 2} },
|
|
||||||
{ "group3", kbfunc_group_toggle, CWM_CONTEXT_SC, {.i = 3} },
|
|
||||||
{ "group4", kbfunc_group_toggle, CWM_CONTEXT_SC, {.i = 4} },
|
|
||||||
{ "group5", kbfunc_group_toggle, CWM_CONTEXT_SC, {.i = 5} },
|
|
||||||
{ "group6", kbfunc_group_toggle, CWM_CONTEXT_SC, {.i = 6} },
|
|
||||||
{ "group7", kbfunc_group_toggle, CWM_CONTEXT_SC, {.i = 7} },
|
|
||||||
{ "group8", kbfunc_group_toggle, CWM_CONTEXT_SC, {.i = 8} },
|
|
||||||
{ "group9", kbfunc_group_toggle, CWM_CONTEXT_SC, {.i = 9} },
|
|
||||||
{ "grouponly1", kbfunc_group_only, CWM_CONTEXT_SC, {.i = 1} },
|
|
||||||
{ "grouponly2", kbfunc_group_only, CWM_CONTEXT_SC, {.i = 2} },
|
|
||||||
{ "grouponly3", kbfunc_group_only, CWM_CONTEXT_SC, {.i = 3} },
|
|
||||||
{ "grouponly4", kbfunc_group_only, CWM_CONTEXT_SC, {.i = 4} },
|
|
||||||
{ "grouponly5", kbfunc_group_only, CWM_CONTEXT_SC, {.i = 5} },
|
|
||||||
{ "grouponly6", kbfunc_group_only, CWM_CONTEXT_SC, {.i = 6} },
|
|
||||||
{ "grouponly7", kbfunc_group_only, CWM_CONTEXT_SC, {.i = 7} },
|
|
||||||
{ "grouponly8", kbfunc_group_only, CWM_CONTEXT_SC, {.i = 8} },
|
|
||||||
{ "grouponly9", kbfunc_group_only, CWM_CONTEXT_SC, {.i = 9} },
|
|
||||||
{ "movetogroup1", kbfunc_client_movetogroup, CWM_CONTEXT_CC, {.i = 1} },
|
|
||||||
{ "movetogroup2", kbfunc_client_movetogroup, CWM_CONTEXT_CC, {.i = 2} },
|
|
||||||
{ "movetogroup3", kbfunc_client_movetogroup, CWM_CONTEXT_CC, {.i = 3} },
|
|
||||||
{ "movetogroup4", kbfunc_client_movetogroup, CWM_CONTEXT_CC, {.i = 4} },
|
|
||||||
{ "movetogroup5", kbfunc_client_movetogroup, CWM_CONTEXT_CC, {.i = 5} },
|
|
||||||
{ "movetogroup6", kbfunc_client_movetogroup, CWM_CONTEXT_CC, {.i = 6} },
|
|
||||||
{ "movetogroup7", kbfunc_client_movetogroup, CWM_CONTEXT_CC, {.i = 7} },
|
|
||||||
{ "movetogroup8", kbfunc_client_movetogroup, CWM_CONTEXT_CC, {.i = 8} },
|
|
||||||
{ "movetogroup9", kbfunc_client_movetogroup, CWM_CONTEXT_CC, {.i = 9} },
|
|
||||||
{ "nogroup", kbfunc_group_alltoggle, CWM_CONTEXT_SC, {0} },
|
|
||||||
{ "cyclegroup", kbfunc_group_cycle, CWM_CONTEXT_SC,
|
|
||||||
{.i = (CWM_CYCLE_FORWARD)} },
|
|
||||||
{ "rcyclegroup", kbfunc_group_cycle, CWM_CONTEXT_SC,
|
|
||||||
{.i = (CWM_CYCLE_REVERSE)} },
|
|
||||||
{ "cycleingroup", kbfunc_client_cycle, CWM_CONTEXT_SC,
|
|
||||||
{.i = (CWM_CYCLE_FORWARD | CWM_CYCLE_INGROUP)} },
|
|
||||||
{ "rcycleingroup", kbfunc_client_cycle, CWM_CONTEXT_SC,
|
|
||||||
{.i = (CWM_CYCLE_REVERSE | CWM_CYCLE_INGROUP)} },
|
|
||||||
{ "grouptoggle", kbfunc_client_toggle_group, CWM_CONTEXT_CC, {0} },
|
|
||||||
{ "stick", kbfunc_client_toggle_sticky, CWM_CONTEXT_CC, {0} },
|
|
||||||
{ "fullscreen", kbfunc_client_toggle_fullscreen, CWM_CONTEXT_CC, {0} },
|
|
||||||
{ "maximize", kbfunc_client_toggle_maximize, CWM_CONTEXT_CC, {0} },
|
|
||||||
{ "vmaximize", kbfunc_client_toggle_vmaximize, CWM_CONTEXT_CC, {0} },
|
|
||||||
{ "hmaximize", kbfunc_client_toggle_hmaximize, CWM_CONTEXT_CC, {0} },
|
|
||||||
{ "freeze", kbfunc_client_toggle_freeze, CWM_CONTEXT_CC, {0} },
|
|
||||||
{ "restart", kbfunc_cwm_status, CWM_CONTEXT_SC, {.i = CWM_EXEC_WM} },
|
|
||||||
{ "quit", kbfunc_cwm_status, CWM_CONTEXT_SC, {.i = CWM_QUIT} },
|
|
||||||
{ "exec", kbfunc_menu_exec, CWM_CONTEXT_SC,
|
|
||||||
{.i = CWM_MENU_EXEC_EXEC} },
|
|
||||||
{ "exec_wm", kbfunc_menu_exec, CWM_CONTEXT_SC,
|
|
||||||
{.i = CWM_MENU_EXEC_WM} },
|
|
||||||
{ "ssh", kbfunc_menu_ssh, CWM_CONTEXT_SC, {0} },
|
|
||||||
{ "terminal", kbfunc_exec_term, CWM_CONTEXT_SC, {0} },
|
|
||||||
{ "lock", kbfunc_exec_lock, CWM_CONTEXT_SC, {0} },
|
|
||||||
{ "moveup", kbfunc_client_move, CWM_CONTEXT_CC,
|
|
||||||
{.i = (CWM_UP)} },
|
|
||||||
{ "movedown", kbfunc_client_move, CWM_CONTEXT_CC,
|
|
||||||
{.i = (CWM_DOWN)} },
|
|
||||||
{ "moveright", kbfunc_client_move, CWM_CONTEXT_CC,
|
|
||||||
{.i = (CWM_RIGHT)} },
|
|
||||||
{ "moveleft", kbfunc_client_move, CWM_CONTEXT_CC,
|
|
||||||
{.i = (CWM_LEFT)} },
|
|
||||||
{ "bigmoveup", kbfunc_client_move, CWM_CONTEXT_CC,
|
|
||||||
{.i = (CWM_UP | CWM_BIGAMOUNT)} },
|
|
||||||
{ "bigmovedown", kbfunc_client_move, CWM_CONTEXT_CC,
|
|
||||||
{.i = (CWM_DOWN | CWM_BIGAMOUNT)} },
|
|
||||||
{ "bigmoveright", kbfunc_client_move, CWM_CONTEXT_CC,
|
|
||||||
{.i = (CWM_RIGHT | CWM_BIGAMOUNT)} },
|
|
||||||
{ "bigmoveleft", kbfunc_client_move, CWM_CONTEXT_CC,
|
|
||||||
{.i = (CWM_LEFT | CWM_BIGAMOUNT)} },
|
|
||||||
{ "resizeup", kbfunc_client_resize, CWM_CONTEXT_CC,
|
|
||||||
{.i = (CWM_UP)} },
|
|
||||||
{ "resizedown", kbfunc_client_resize, CWM_CONTEXT_CC,
|
|
||||||
{.i = (CWM_DOWN)} },
|
|
||||||
{ "resizeright", kbfunc_client_resize, CWM_CONTEXT_CC,
|
|
||||||
{.i = (CWM_RIGHT)} },
|
|
||||||
{ "resizeleft", kbfunc_client_resize, CWM_CONTEXT_CC,
|
|
||||||
{.i = (CWM_LEFT)} },
|
|
||||||
{ "bigresizeup", kbfunc_client_resize, CWM_CONTEXT_CC,
|
|
||||||
{.i = (CWM_UP | CWM_BIGAMOUNT)} },
|
|
||||||
{ "bigresizedown", kbfunc_client_resize, CWM_CONTEXT_CC,
|
|
||||||
{.i = (CWM_DOWN | CWM_BIGAMOUNT)} },
|
|
||||||
{ "bigresizeright", kbfunc_client_resize, CWM_CONTEXT_CC,
|
|
||||||
{.i = (CWM_RIGHT | CWM_BIGAMOUNT)} },
|
|
||||||
{ "bigresizeleft", kbfunc_client_resize, CWM_CONTEXT_CC,
|
|
||||||
{.i = (CWM_LEFT | CWM_BIGAMOUNT)} },
|
|
||||||
{ "ptrmoveup", kbfunc_ptrmove, CWM_CONTEXT_SC,
|
|
||||||
{.i = (CWM_UP)} },
|
|
||||||
{ "ptrmovedown", kbfunc_ptrmove, CWM_CONTEXT_SC,
|
|
||||||
{.i = (CWM_DOWN)} },
|
|
||||||
{ "ptrmoveleft", kbfunc_ptrmove, CWM_CONTEXT_SC,
|
|
||||||
{.i = (CWM_LEFT)} },
|
|
||||||
{ "ptrmoveright", kbfunc_ptrmove, CWM_CONTEXT_SC,
|
|
||||||
{.i = (CWM_RIGHT)} },
|
|
||||||
{ "bigptrmoveup", kbfunc_ptrmove, CWM_CONTEXT_SC,
|
|
||||||
{.i = (CWM_UP | CWM_BIGAMOUNT)} },
|
|
||||||
{ "bigptrmovedown", kbfunc_ptrmove, CWM_CONTEXT_SC,
|
|
||||||
{.i = (CWM_DOWN | CWM_BIGAMOUNT)} },
|
|
||||||
{ "bigptrmoveleft", kbfunc_ptrmove, CWM_CONTEXT_SC,
|
|
||||||
{.i = (CWM_LEFT | CWM_BIGAMOUNT)} },
|
|
||||||
{ "bigptrmoveright", kbfunc_ptrmove, CWM_CONTEXT_SC,
|
|
||||||
{.i = (CWM_RIGHT | CWM_BIGAMOUNT)} },
|
|
||||||
{ "htile", kbfunc_client_htile, CWM_CONTEXT_CC, {0} },
|
|
||||||
{ "vtile", kbfunc_client_vtile, CWM_CONTEXT_CC, {0} },
|
|
||||||
{ "window_lower", kbfunc_client_lower, CWM_CONTEXT_CC, {0} },
|
|
||||||
{ "window_raise", kbfunc_client_raise, CWM_CONTEXT_CC, {0} },
|
|
||||||
{ "window_hide", kbfunc_client_hide, CWM_CONTEXT_CC, {0} },
|
|
||||||
{ "window_move", mousefunc_client_move, CWM_CONTEXT_CC, {0} },
|
|
||||||
{ "window_resize", mousefunc_client_resize, CWM_CONTEXT_CC, {0} },
|
|
||||||
{ "window_grouptoggle", kbfunc_client_toggle_group, CWM_CONTEXT_CC, {0} },
|
|
||||||
{ "menu_group", kbfunc_menu_group, CWM_CONTEXT_SC, {0} },
|
|
||||||
{ "menu_unhide", kbfunc_menu_client, CWM_CONTEXT_SC, {0} },
|
|
||||||
{ "menu_cmd", kbfunc_menu_cmd, CWM_CONTEXT_SC, {0} },
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct {
|
|
||||||
const char ch;
|
|
||||||
int mask;
|
|
||||||
} bind_mods[] = {
|
|
||||||
{ 'C', ControlMask },
|
|
||||||
{ 'M', Mod1Mask },
|
|
||||||
{ '4', Mod4Mask },
|
|
||||||
{ 'S', ShiftMask },
|
|
||||||
};
|
|
||||||
|
|
||||||
static const char *
|
static const char *
|
||||||
conf_bind_getmask(const char *name, unsigned int *mask)
|
conf_bind_getmask(const char *name, unsigned int *mask)
|
||||||
{
|
{
|
||||||
@@ -504,64 +502,60 @@ conf_bind_getmask(const char *name, unsigned int *mask)
|
|||||||
if ((ch = strchr(name, bind_mods[i].ch)) != NULL && ch < dash)
|
if ((ch = strchr(name, bind_mods[i].ch)) != NULL && ch < dash)
|
||||||
*mask |= bind_mods[i].mask;
|
*mask |= bind_mods[i].mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Skip past modifiers. */
|
/* Skip past modifiers. */
|
||||||
return(dash + 1);
|
return(dash + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
conf_bind_kbd(struct conf *c, const char *bind, const char *cmd)
|
conf_bind_key(struct conf *c, const char *bind, const char *cmd)
|
||||||
{
|
{
|
||||||
struct bind_ctx *kb;
|
struct bind_ctx *kb;
|
||||||
const char *key;
|
const char *key;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
|
if ((strcmp(bind, "all") == 0) && (cmd == NULL)) {
|
||||||
|
conf_unbind_key(c, NULL);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
kb = xmalloc(sizeof(*kb));
|
kb = xmalloc(sizeof(*kb));
|
||||||
key = conf_bind_getmask(bind, &kb->modmask);
|
key = conf_bind_getmask(bind, &kb->modmask);
|
||||||
|
|
||||||
kb->press.keysym = XStringToKeysym(key);
|
kb->press.keysym = XStringToKeysym(key);
|
||||||
if (kb->press.keysym == NoSymbol) {
|
if (kb->press.keysym == NoSymbol) {
|
||||||
warnx("unknown symbol: %s", key);
|
warnx("unknown symbol: %s", key);
|
||||||
free(kb);
|
free(kb);
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
conf_unbind_key(c, kb);
|
||||||
/* We now have the correct binding, remove duplicates. */
|
if (cmd == NULL) {
|
||||||
conf_unbind_kbd(c, kb);
|
|
||||||
|
|
||||||
if (strcmp("unmap", cmd) == 0) {
|
|
||||||
free(kb);
|
free(kb);
|
||||||
return(1);
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < nitems(name_to_func); i++) {
|
for (i = 0; i < nitems(name_to_func); i++) {
|
||||||
if (strcmp(name_to_func[i].tag, cmd) != 0)
|
if (strcmp(name_to_func[i].tag, cmd) != 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
kb->callback = name_to_func[i].handler;
|
kb->callback = name_to_func[i].handler;
|
||||||
kb->context = name_to_func[i].context;
|
kb->context = name_to_func[i].context;
|
||||||
kb->argument = name_to_func[i].argument;
|
kb->argument = name_to_func[i].argument;
|
||||||
TAILQ_INSERT_TAIL(&c->keybindq, kb, entry);
|
TAILQ_INSERT_TAIL(&c->keybindq, kb, entry);
|
||||||
return(1);
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
kb->callback = kbfunc_exec_cmd;
|
kb->callback = kbfunc_exec_cmd;
|
||||||
kb->context = CWM_CONTEXT_NONE;
|
kb->context = CWM_CONTEXT_NONE;
|
||||||
kb->argument.c = xstrdup(cmd);
|
kb->argument.c = xstrdup(cmd);
|
||||||
TAILQ_INSERT_TAIL(&c->keybindq, kb, entry);
|
TAILQ_INSERT_TAIL(&c->keybindq, kb, entry);
|
||||||
|
out:
|
||||||
return(1);
|
return(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
conf_unbind_kbd(struct conf *c, struct bind_ctx *unbind)
|
conf_unbind_key(struct conf *c, struct bind_ctx *unbind)
|
||||||
{
|
{
|
||||||
struct bind_ctx *key = NULL, *keynxt;
|
struct bind_ctx *key = NULL, *keynxt;
|
||||||
|
|
||||||
TAILQ_FOREACH_SAFE(key, &c->keybindq, entry, keynxt) {
|
TAILQ_FOREACH_SAFE(key, &c->keybindq, entry, keynxt) {
|
||||||
if (key->modmask != unbind->modmask)
|
if ((unbind == NULL) ||
|
||||||
continue;
|
((key->modmask == unbind->modmask) &&
|
||||||
|
(key->press.keysym == unbind->press.keysym))) {
|
||||||
if (key->press.keysym == unbind->press.keysym) {
|
|
||||||
TAILQ_REMOVE(&c->keybindq, key, entry);
|
TAILQ_REMOVE(&c->keybindq, key, entry);
|
||||||
if (key->context == CWM_CONTEXT_NONE)
|
if (key->context == CWM_CONTEXT_NONE)
|
||||||
free(key->argument.c);
|
free(key->argument.c);
|
||||||
@@ -577,36 +571,38 @@ conf_bind_mouse(struct conf *c, const char *bind, const char *cmd)
|
|||||||
const char *button, *errstr;
|
const char *button, *errstr;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
|
if ((strcmp(bind, "all") == 0) && (cmd == NULL)) {
|
||||||
|
conf_unbind_mouse(c, NULL);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
mb = xmalloc(sizeof(*mb));
|
mb = xmalloc(sizeof(*mb));
|
||||||
button = conf_bind_getmask(bind, &mb->modmask);
|
button = conf_bind_getmask(bind, &mb->modmask);
|
||||||
|
|
||||||
mb->press.button = strtonum(button, Button1, Button5, &errstr);
|
mb->press.button = strtonum(button, Button1, Button5, &errstr);
|
||||||
if (errstr) {
|
if (errstr) {
|
||||||
warnx("button number is %s: %s", errstr, button);
|
warnx("button number is %s: %s", errstr, button);
|
||||||
free(mb);
|
free(mb);
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We now have the correct binding, remove duplicates. */
|
|
||||||
conf_unbind_mouse(c, mb);
|
conf_unbind_mouse(c, mb);
|
||||||
|
if (cmd == NULL) {
|
||||||
if (strcmp("unmap", cmd) == 0) {
|
|
||||||
free(mb);
|
free(mb);
|
||||||
return(1);
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < nitems(name_to_func); i++) {
|
for (i = 0; i < nitems(name_to_func); i++) {
|
||||||
if (strcmp(name_to_func[i].tag, cmd) != 0)
|
if (strcmp(name_to_func[i].tag, cmd) != 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
mb->callback = name_to_func[i].handler;
|
mb->callback = name_to_func[i].handler;
|
||||||
mb->context = name_to_func[i].context;
|
mb->context = name_to_func[i].context;
|
||||||
mb->argument = name_to_func[i].argument;
|
mb->argument = name_to_func[i].argument;
|
||||||
TAILQ_INSERT_TAIL(&c->mousebindq, mb, entry);
|
TAILQ_INSERT_TAIL(&c->mousebindq, mb, entry);
|
||||||
return(1);
|
goto out;
|
||||||
}
|
}
|
||||||
|
mb->callback = kbfunc_exec_cmd;
|
||||||
return(0);
|
mb->context = CWM_CONTEXT_NONE;
|
||||||
|
mb->argument.c = xstrdup(cmd);
|
||||||
|
TAILQ_INSERT_TAIL(&c->mousebindq, mb, entry);
|
||||||
|
out:
|
||||||
|
return(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -615,55 +611,17 @@ conf_unbind_mouse(struct conf *c, struct bind_ctx *unbind)
|
|||||||
struct bind_ctx *mb = NULL, *mbnxt;
|
struct bind_ctx *mb = NULL, *mbnxt;
|
||||||
|
|
||||||
TAILQ_FOREACH_SAFE(mb, &c->mousebindq, entry, mbnxt) {
|
TAILQ_FOREACH_SAFE(mb, &c->mousebindq, entry, mbnxt) {
|
||||||
if (mb->modmask != unbind->modmask)
|
if ((unbind == NULL) ||
|
||||||
continue;
|
((mb->modmask == unbind->modmask) &&
|
||||||
|
(mb->press.button == unbind->press.button))) {
|
||||||
if (mb->press.button == unbind->press.button) {
|
|
||||||
TAILQ_REMOVE(&c->mousebindq, mb, entry);
|
TAILQ_REMOVE(&c->mousebindq, mb, entry);
|
||||||
|
if (mb->context == CWM_CONTEXT_NONE)
|
||||||
|
free(mb->argument.c);
|
||||||
free(mb);
|
free(mb);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cursor_binds[] = {
|
|
||||||
XC_left_ptr, /* CF_NORMAL */
|
|
||||||
XC_fleur, /* CF_MOVE */
|
|
||||||
XC_bottom_right_corner, /* CF_RESIZE */
|
|
||||||
XC_question_arrow, /* CF_QUESTION */
|
|
||||||
};
|
|
||||||
|
|
||||||
void
|
|
||||||
conf_cursor(struct conf *c)
|
|
||||||
{
|
|
||||||
unsigned int i;
|
|
||||||
|
|
||||||
for (i = 0; i < nitems(cursor_binds); i++)
|
|
||||||
c->cursor[i] = XCreateFontCursor(X_Dpy, cursor_binds[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
static unsigned int ign_mods[] = { 0, LockMask, Mod2Mask, Mod2Mask | LockMask };
|
|
||||||
|
|
||||||
void
|
|
||||||
conf_grab_mouse(Window win)
|
|
||||||
{
|
|
||||||
struct bind_ctx *mb;
|
|
||||||
unsigned int i;
|
|
||||||
|
|
||||||
XUngrabButton(X_Dpy, AnyButton, AnyModifier, win);
|
|
||||||
|
|
||||||
TAILQ_FOREACH(mb, &Conf.mousebindq, entry) {
|
|
||||||
if (mb->context != CWM_CONTEXT_CC)
|
|
||||||
continue;
|
|
||||||
for (i = 0; i < nitems(ign_mods); i++) {
|
|
||||||
XGrabButton(X_Dpy, mb->press.button,
|
|
||||||
(mb->modmask | ign_mods[i]), win, False,
|
|
||||||
BUTTONMASK, GrabModeAsync, GrabModeSync,
|
|
||||||
None, None);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
conf_grab_kbd(Window win)
|
conf_grab_kbd(Window win)
|
||||||
{
|
{
|
||||||
@@ -679,12 +637,32 @@ conf_grab_kbd(Window win)
|
|||||||
(XkbKeycodeToKeysym(X_Dpy, kc, 0, 1) == kb->press.keysym))
|
(XkbKeycodeToKeysym(X_Dpy, kc, 0, 1) == kb->press.keysym))
|
||||||
kb->modmask |= ShiftMask;
|
kb->modmask |= ShiftMask;
|
||||||
|
|
||||||
for (i = 0; i < nitems(ign_mods); i++)
|
for (i = 0; i < nitems(ignore_mods); i++)
|
||||||
XGrabKey(X_Dpy, kc, (kb->modmask | ign_mods[i]), win,
|
XGrabKey(X_Dpy, kc, (kb->modmask | ignore_mods[i]), win,
|
||||||
True, GrabModeAsync, GrabModeAsync);
|
True, GrabModeAsync, GrabModeAsync);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
conf_grab_mouse(Window win)
|
||||||
|
{
|
||||||
|
struct bind_ctx *mb;
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
XUngrabButton(X_Dpy, AnyButton, AnyModifier, win);
|
||||||
|
|
||||||
|
TAILQ_FOREACH(mb, &Conf.mousebindq, entry) {
|
||||||
|
if (mb->context != CWM_CONTEXT_CC)
|
||||||
|
continue;
|
||||||
|
for (i = 0; i < nitems(ignore_mods); i++) {
|
||||||
|
XGrabButton(X_Dpy, mb->press.button,
|
||||||
|
(mb->modmask | ignore_mods[i]), win, False,
|
||||||
|
BUTTONMASK, GrabModeAsync, GrabModeSync,
|
||||||
|
None, None);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static char *cwmhints[] = {
|
static char *cwmhints[] = {
|
||||||
"WM_STATE",
|
"WM_STATE",
|
||||||
"WM_DELETE_WINDOW",
|
"WM_DELETE_WINDOW",
|
||||||
|
9
cwm.1
9
cwm.1
@@ -117,11 +117,6 @@ Toggle maximization of current window.
|
|||||||
Toggle vertical maximization of current window.
|
Toggle vertical maximization of current window.
|
||||||
.It Ic CMS-=
|
.It Ic CMS-=
|
||||||
Toggle horizontal maximization of current window.
|
Toggle horizontal maximization of current window.
|
||||||
.It Ic C-[Up | Down | Left | Right]
|
|
||||||
Move pointer by a small amount.
|
|
||||||
.It Ic CS-[Up | Down | Left | Right]
|
|
||||||
Move pointer by a large amount; see
|
|
||||||
.Xr cwmrc 5 .
|
|
||||||
.It Ic M-[hjkl]
|
.It Ic M-[hjkl]
|
||||||
Move window by a small amount.
|
Move window by a small amount.
|
||||||
.It Ic MS-[hjkl]
|
.It Ic MS-[hjkl]
|
||||||
@@ -224,8 +219,8 @@ Menus are recalled by clicking the mouse on the root window:
|
|||||||
.Pp
|
.Pp
|
||||||
.Bl -tag -width Ds -offset indent -compact
|
.Bl -tag -width Ds -offset indent -compact
|
||||||
.It Ic M1
|
.It Ic M1
|
||||||
Show list of currently hidden windows.
|
Show list of currently defined windows.
|
||||||
Selecting an item will unhide that window.
|
Selecting an item will warp to that window, unhiding it if necessary.
|
||||||
.It Ic M2
|
.It Ic M2
|
||||||
Show list of currently defined groups.
|
Show list of currently defined groups.
|
||||||
Selecting an item will hide/unhide that group.
|
Selecting an item will hide/unhide that group.
|
||||||
|
447
cwmrc.5
447
cwmrc.5
@@ -63,11 +63,15 @@ The name and class values, respectively, for existing windows
|
|||||||
are both set in the WM_CLASS property and may be obtained using
|
are both set in the WM_CLASS property and may be obtained using
|
||||||
.Xr xprop 1 .
|
.Xr xprop 1 .
|
||||||
.Pp
|
.Pp
|
||||||
.It Ic bind Ar keys command
|
.It Ic bind-key Ar key function
|
||||||
Cause the creation of a key binding, or replacement of a default
|
Bind or rebind key
|
||||||
key binding.
|
.Ar key
|
||||||
|
to
|
||||||
|
.Ar function .
|
||||||
The modifier keys come first, followed by a
|
The modifier keys come first, followed by a
|
||||||
.Sq - .
|
.Sq - ,
|
||||||
|
then a keysym name, taken from
|
||||||
|
.Pa /usr/X11R6/include/X11/keysymdef.h .
|
||||||
.Pp
|
.Pp
|
||||||
The following modifiers are recognised:
|
The following modifiers are recognised:
|
||||||
.Pp
|
.Pp
|
||||||
@@ -83,22 +87,53 @@ Mod4 (windows) key.
|
|||||||
.El
|
.El
|
||||||
.Pp
|
.Pp
|
||||||
The
|
The
|
||||||
.Sq -
|
.Ar function
|
||||||
should be followed by a keysym name, taken from
|
|
||||||
.Pa /usr/X11R6/include/X11/keysymdef.h .
|
|
||||||
The
|
|
||||||
.Ar command
|
|
||||||
may either be one from the
|
may either be one from the
|
||||||
.Sx BIND COMMAND LIST
|
.Sx BIND FUNCTION LIST
|
||||||
(see below) or the command line that is to be executed.
|
(see below) or the command line that is to be executed.
|
||||||
.Pp
|
.Pp
|
||||||
A special
|
.It Ic bind-mouse Ar button function
|
||||||
.Ar command
|
Bind or rebind button
|
||||||
keyword
|
.Ar button
|
||||||
.Dq unmap
|
to
|
||||||
can be used to remove the named key binding.
|
.Ar function .
|
||||||
This can be used to remove a binding which conflicts with an
|
The modifier keys come first, followed by a
|
||||||
application.
|
.Sq - ,
|
||||||
|
then the button number.
|
||||||
|
.Pp
|
||||||
|
The following modifiers are recognised:
|
||||||
|
.Pp
|
||||||
|
.Bl -tag -width Ds -offset indent -compact
|
||||||
|
.It Ic C
|
||||||
|
Control key.
|
||||||
|
.It Ic M
|
||||||
|
Meta key.
|
||||||
|
.It Ic S
|
||||||
|
Shift key.
|
||||||
|
.It Ic 4
|
||||||
|
Mod4 (windows) key.
|
||||||
|
.El
|
||||||
|
.Pp
|
||||||
|
The following buttons are recognised:
|
||||||
|
.Pp
|
||||||
|
.Bl -tag -width Ds -offset indent -compact
|
||||||
|
.It Ic 1
|
||||||
|
Left mouse button.
|
||||||
|
.It Ic 2
|
||||||
|
Middle mouse button.
|
||||||
|
.It Ic 3
|
||||||
|
Right mouse button.
|
||||||
|
.It Ic 4
|
||||||
|
Scroll up mouse button.
|
||||||
|
.It Ic 5
|
||||||
|
Scroll down mouse button.
|
||||||
|
.El
|
||||||
|
.Pp
|
||||||
|
The
|
||||||
|
.Ar function
|
||||||
|
may be taken from the
|
||||||
|
.Sx BIND FUNCTION LIST
|
||||||
|
(see below) or the command line that is to be executed.
|
||||||
.Pp
|
.Pp
|
||||||
.It Ic borderwidth Ar pixels
|
.It Ic borderwidth Ar pixels
|
||||||
Set the window border width to
|
Set the window border width to
|
||||||
@@ -177,48 +212,6 @@ Ignore, and do not warp to, windows with the name
|
|||||||
.Ar windowname
|
.Ar windowname
|
||||||
when drawing borders and cycling through windows.
|
when drawing borders and cycling through windows.
|
||||||
.Pp
|
.Pp
|
||||||
.It Ic mousebind Ar buttons command
|
|
||||||
Cause the creation of a mouse binding, or replacement of a default
|
|
||||||
mouse binding.
|
|
||||||
The modifier keys come first, followed by a
|
|
||||||
.Sq - .
|
|
||||||
.Pp
|
|
||||||
The following modifiers are recognised:
|
|
||||||
.Pp
|
|
||||||
.Bl -tag -width Ds -offset indent -compact
|
|
||||||
.It Ic C
|
|
||||||
Control key.
|
|
||||||
.It Ic M
|
|
||||||
Meta key.
|
|
||||||
.It Ic S
|
|
||||||
Shift key.
|
|
||||||
.It Ic 4
|
|
||||||
Mod4 (windows) key.
|
|
||||||
.El
|
|
||||||
.Pp
|
|
||||||
The
|
|
||||||
.Sq -
|
|
||||||
should be followed by number:
|
|
||||||
.Pp
|
|
||||||
.Bl -tag -width Ds -offset indent -compact
|
|
||||||
.It Ic 1
|
|
||||||
Left mouse button.
|
|
||||||
.It Ic 2
|
|
||||||
Middle mouse button.
|
|
||||||
.It Ic 3
|
|
||||||
Right mouse button.
|
|
||||||
.It Ic 4
|
|
||||||
Scroll up mouse button.
|
|
||||||
.It Ic 5
|
|
||||||
Scroll down mouse button.
|
|
||||||
.El
|
|
||||||
.Pp
|
|
||||||
The
|
|
||||||
.Ar command
|
|
||||||
may be taken from the
|
|
||||||
.Sx MOUSEBIND COMMAND LIST
|
|
||||||
(see below).
|
|
||||||
.Pp
|
|
||||||
.It Ic moveamount Ar pixels
|
.It Ic moveamount Ar pixels
|
||||||
Set a default size for the keyboard movement bindings,
|
Set a default size for the keyboard movement bindings,
|
||||||
in pixels.
|
in pixels.
|
||||||
@@ -234,9 +227,28 @@ The default behavior for new windows is to not assign any group.
|
|||||||
By enabling sticky group mode,
|
By enabling sticky group mode,
|
||||||
.Xr cwm 1
|
.Xr cwm 1
|
||||||
will assign new windows to the currently selected group.
|
will assign new windows to the currently selected group.
|
||||||
|
.Pp
|
||||||
|
.It Ic unbind-key Ar key
|
||||||
|
Unbind function bound to
|
||||||
|
.Ar key .
|
||||||
|
A special
|
||||||
|
.Ar key
|
||||||
|
keyword
|
||||||
|
.Dq all
|
||||||
|
can be used to unbind all keys.
|
||||||
|
.Pp
|
||||||
|
.It Ic unbind-mouse Ar button
|
||||||
|
Unbind function bound to
|
||||||
|
.Ar button .
|
||||||
|
A special
|
||||||
|
.Ar button
|
||||||
|
keyword
|
||||||
|
.Dq all
|
||||||
|
can be used to unbind all buttons.
|
||||||
|
.Pp
|
||||||
.El
|
.El
|
||||||
.Sh BIND COMMAND LIST
|
.Sh BIND FUNCTION LIST
|
||||||
.Bl -tag -width 18n -compact
|
.Bl -tag -width 23n -compact
|
||||||
.It restart
|
.It restart
|
||||||
Restart the running
|
Restart the running
|
||||||
.Xr cwm 1 .
|
.Xr cwm 1 .
|
||||||
@@ -247,197 +259,176 @@ Quit
|
|||||||
Spawn a new terminal.
|
Spawn a new terminal.
|
||||||
.It lock
|
.It lock
|
||||||
Lock the screen.
|
Lock the screen.
|
||||||
.It search
|
.It menu-window
|
||||||
Launch window search menu.
|
Launch window search menu.
|
||||||
.It menusearch
|
.It menu-window-hidden
|
||||||
|
Launch hidden window search menu.
|
||||||
|
.It menu-cmd
|
||||||
Launch application search menu.
|
Launch application search menu.
|
||||||
.It groupsearch
|
.It menu-group
|
||||||
Launch group search menu.
|
Launch group search menu.
|
||||||
.It exec
|
.It menu-exec
|
||||||
Launch
|
Launch
|
||||||
.Dq exec program
|
.Dq exec program
|
||||||
menu.
|
menu.
|
||||||
.It exec_wm
|
.It menu-exec-wm
|
||||||
Launch
|
Launch
|
||||||
.Dq exec WindowManager
|
.Dq exec WindowManager
|
||||||
menu.
|
menu.
|
||||||
.It ssh
|
.It menu-ssh
|
||||||
Launch
|
Launch
|
||||||
.Dq ssh
|
.Dq ssh
|
||||||
menu.
|
menu.
|
||||||
.It group[n]
|
.It group-toggle-[n]
|
||||||
Toggle visibility of group n, where n is 1-9.
|
Toggle visibility of group n, where n is 1-9.
|
||||||
.It grouponly[n]
|
.It group-only-[n]
|
||||||
Like
|
Show only group n, where n is 1-9, hiding other groups.
|
||||||
.Ar group[n]
|
.It window-toggle-all
|
||||||
but also hides the other groups.
|
|
||||||
.It nogroup
|
|
||||||
Toggle visibility of all groups.
|
Toggle visibility of all groups.
|
||||||
.It grouptoggle
|
.It window-group
|
||||||
Toggle group membership of current window.
|
Toggle group membership of current window.
|
||||||
.It movetogroup[n]
|
.It window-movetogroup-[n]
|
||||||
Hide current window from display and move to group n, where n is 1-9.
|
Hide current window from display and move to group n, where n is 1-9.
|
||||||
.It cyclegroup
|
.It group-cycle
|
||||||
Forward cycle through groups.
|
Forward cycle through groups.
|
||||||
.It rcyclegroup
|
.It group-rcycle
|
||||||
Reverse cycle through groups.
|
Reverse cycle through groups.
|
||||||
.It cycle
|
.It window-cycle
|
||||||
Forward cycle through windows.
|
Forward cycle through windows.
|
||||||
.It rcycle
|
.It window-rcycle
|
||||||
Reverse cycle through windows.
|
Reverse cycle through windows.
|
||||||
.It cycleingroup
|
.It window-cycle-ingroup
|
||||||
Forward cycle through windows in current group.
|
Forward cycle through windows in current group.
|
||||||
.It rcycleingroup
|
.It window-rcycle-ingroup
|
||||||
Reverse cycle through windows in current group.
|
Reverse cycle through windows in current group.
|
||||||
.It delete
|
.It window-delete
|
||||||
Delete current window.
|
Delete current window.
|
||||||
.It hide
|
.It window-hide
|
||||||
Hide current window.
|
Hide current window.
|
||||||
.It lower
|
.It window-lower
|
||||||
Lower current window.
|
Lower current window.
|
||||||
.It raise
|
.It window-raise
|
||||||
Raise current window.
|
Raise current window.
|
||||||
.It label
|
.It window-menu-label
|
||||||
Label current window.
|
Label current window.
|
||||||
.It freeze
|
.It window-freeze
|
||||||
Freeze current window geometry.
|
Freeze current window geometry.
|
||||||
.It stick
|
.It window-stick
|
||||||
Stick current window to all groups (same as assigning to nogroup).
|
Stick current window to all groups (same as assigning to nogroup).
|
||||||
.It fullscreen
|
.It window-fullscreen
|
||||||
Full-screen current window (gap + border removed).
|
Full-screen current window (gap + border removed).
|
||||||
.It maximize
|
.It window-maximize
|
||||||
Maximize current window (gap + border honored).
|
Maximize current window (gap + border honored).
|
||||||
.It vmaximize
|
.It window-vmaximize
|
||||||
Vertically maximize current window (gap + border honored).
|
Vertically maximize current window (gap + border honored).
|
||||||
.It hmaximize
|
.It window-hmaximize
|
||||||
Horizontally maximize current window (gap + border honored).
|
Horizontally maximize current window (gap + border honored).
|
||||||
.It moveup
|
.It window-htile
|
||||||
Move window
|
|
||||||
.Ar moveamount
|
|
||||||
pixels up.
|
|
||||||
.It movedown
|
|
||||||
Move window
|
|
||||||
.Ar moveamount
|
|
||||||
pixels down.
|
|
||||||
.It moveright
|
|
||||||
Move window
|
|
||||||
.Ar moveamount
|
|
||||||
pixels right.
|
|
||||||
.It moveleft
|
|
||||||
Move window
|
|
||||||
.Ar moveamount
|
|
||||||
pixels left.
|
|
||||||
.It bigmoveup
|
|
||||||
Move window 10 times
|
|
||||||
.Ar moveamount
|
|
||||||
pixels up.
|
|
||||||
.It bigmovedown
|
|
||||||
Move window 10 times
|
|
||||||
.Ar moveamount
|
|
||||||
pixels down.
|
|
||||||
.It bigmoveright
|
|
||||||
Move window 10 times
|
|
||||||
.Ar moveamount
|
|
||||||
pixels right.
|
|
||||||
.It bigmoveleft
|
|
||||||
Move window 10 times
|
|
||||||
.Ar moveamount
|
|
||||||
pixels left.
|
|
||||||
.It resizeup
|
|
||||||
Resize window
|
|
||||||
.Ar moveamount
|
|
||||||
pixels up.
|
|
||||||
.It resizedown
|
|
||||||
Resize window
|
|
||||||
.Ar moveamount
|
|
||||||
pixels down.
|
|
||||||
.It resizeright
|
|
||||||
Resize window
|
|
||||||
.Ar moveamount
|
|
||||||
pixels right.
|
|
||||||
.It resizeleft
|
|
||||||
Resize window
|
|
||||||
.Ar moveamount
|
|
||||||
pixels left.
|
|
||||||
.It bigresizeup
|
|
||||||
Resize window 10 times
|
|
||||||
.Ar moveamount
|
|
||||||
pixels up.
|
|
||||||
.It bigresizedown
|
|
||||||
Resize window 10 times
|
|
||||||
.Ar moveamount
|
|
||||||
pixels down.
|
|
||||||
.It bigresizeright
|
|
||||||
Resize window 10 times
|
|
||||||
.Ar moveamount
|
|
||||||
pixels right.
|
|
||||||
.It bigresizeleft
|
|
||||||
Resize window 10 times
|
|
||||||
.Ar moveamount
|
|
||||||
pixels left.
|
|
||||||
.It ptrmoveup
|
|
||||||
Move pointer
|
|
||||||
.Ar moveamount
|
|
||||||
pixels up.
|
|
||||||
.It ptrmovedown
|
|
||||||
Move pointer
|
|
||||||
.Ar moveamount
|
|
||||||
pixels down.
|
|
||||||
.It ptrmoveright
|
|
||||||
Move pointer
|
|
||||||
.Ar moveamount
|
|
||||||
pixels right.
|
|
||||||
.It ptrmoveleft
|
|
||||||
Move pointer
|
|
||||||
.Ar moveamount
|
|
||||||
pixels left.
|
|
||||||
.It bigptrmoveup
|
|
||||||
Move pointer 10 times
|
|
||||||
.Ar moveamount
|
|
||||||
pixels up.
|
|
||||||
.It bigptrmovedown
|
|
||||||
Move pointer 10 times
|
|
||||||
.Ar moveamount
|
|
||||||
pixels down.
|
|
||||||
.It bigptrmoveright
|
|
||||||
Move pointer 10 times
|
|
||||||
.Ar moveamount
|
|
||||||
pixels right.
|
|
||||||
.It bigptrmoveleft
|
|
||||||
Move pointer 10 times
|
|
||||||
.Ar moveamount
|
|
||||||
pixels left.
|
|
||||||
.It htile
|
|
||||||
Current window is placed at the top of the screen and maximized
|
Current window is placed at the top of the screen and maximized
|
||||||
horizontally, other windows in its group share remaining screen space.
|
horizontally, other windows in its group share remaining screen space.
|
||||||
.It vtile
|
.It window-vtile
|
||||||
Current window is placed on the left of the screen and maximized
|
Current window is placed on the left of the screen and maximized
|
||||||
vertically, other windows in its group share remaining screen space.
|
vertically, other windows in its group share remaining screen space.
|
||||||
.El
|
.It window-move
|
||||||
.Sh MOUSEBIND COMMAND LIST
|
|
||||||
.Bl -tag -width 18n -compact
|
|
||||||
.It window_move
|
|
||||||
Move current window.
|
Move current window.
|
||||||
.It window_resize
|
.It window-resize
|
||||||
Resize current window.
|
Resize current window.
|
||||||
.It window_lower
|
.It window-move-up
|
||||||
Lower current window.
|
Move window
|
||||||
.It window_raise
|
.Ar moveamount
|
||||||
Raise current window.
|
pixels up.
|
||||||
.It window_hide
|
.It window-move-down
|
||||||
Hide current window.
|
Move window
|
||||||
.It window_grouptoggle
|
.Ar moveamount
|
||||||
Toggle group membership of current window.
|
pixels down.
|
||||||
.It cyclegroup
|
.It window-move-right
|
||||||
Forward cycle through groups.
|
Move window
|
||||||
.It rcyclegroup
|
.Ar moveamount
|
||||||
Reverse cycle through groups.
|
pixels right.
|
||||||
.It menu_group
|
.It window-move-left
|
||||||
Launch group list.
|
Move window
|
||||||
.It menu_unhide
|
.Ar moveamount
|
||||||
Launch hidden window list.
|
pixels left.
|
||||||
.It menu_cmd
|
.It window-move-up-big
|
||||||
Launch command list.
|
Move window 10 times
|
||||||
|
.Ar moveamount
|
||||||
|
pixels up.
|
||||||
|
.It window-move-down-big
|
||||||
|
Move window 10 times
|
||||||
|
.Ar moveamount
|
||||||
|
pixels down.
|
||||||
|
.It window-move-right-big
|
||||||
|
Move window 10 times
|
||||||
|
.Ar moveamount
|
||||||
|
pixels right.
|
||||||
|
.It window-move-left-big
|
||||||
|
Move window 10 times
|
||||||
|
.Ar moveamount
|
||||||
|
pixels left.
|
||||||
|
.It window-resize-up
|
||||||
|
Resize window
|
||||||
|
.Ar moveamount
|
||||||
|
pixels up.
|
||||||
|
.It window-resize-down
|
||||||
|
Resize window
|
||||||
|
.Ar moveamount
|
||||||
|
pixels down.
|
||||||
|
.It window-resize-right
|
||||||
|
Resize window
|
||||||
|
.Ar moveamount
|
||||||
|
pixels right.
|
||||||
|
.It window-resize-left
|
||||||
|
Resize window
|
||||||
|
.Ar moveamount
|
||||||
|
pixels left.
|
||||||
|
.It window-resize-up-big
|
||||||
|
Resize window 10 times
|
||||||
|
.Ar moveamount
|
||||||
|
pixels up.
|
||||||
|
.It window-resize-down-big
|
||||||
|
Resize window 10 times
|
||||||
|
.Ar moveamount
|
||||||
|
pixels down.
|
||||||
|
.It window-resize-right-big
|
||||||
|
Resize window 10 times
|
||||||
|
.Ar moveamount
|
||||||
|
pixels right.
|
||||||
|
.It window-resize-left-big
|
||||||
|
Resize window 10 times
|
||||||
|
.Ar moveamount
|
||||||
|
pixels left.
|
||||||
|
.It pointer-move-up
|
||||||
|
Move pointer
|
||||||
|
.Ar moveamount
|
||||||
|
pixels up.
|
||||||
|
.It pointer-move-down
|
||||||
|
Move pointer
|
||||||
|
.Ar moveamount
|
||||||
|
pixels down.
|
||||||
|
.It pointer-move-right
|
||||||
|
Move pointer
|
||||||
|
.Ar moveamount
|
||||||
|
pixels right.
|
||||||
|
.It pointer-move-left
|
||||||
|
Move pointer
|
||||||
|
.Ar moveamount
|
||||||
|
pixels left.
|
||||||
|
.It pointer-move-up-big
|
||||||
|
Move pointer 10 times
|
||||||
|
.Ar moveamount
|
||||||
|
pixels up.
|
||||||
|
.It pointer-move-down-big
|
||||||
|
Move pointer 10 times
|
||||||
|
.Ar moveamount
|
||||||
|
pixels down.
|
||||||
|
.It pointer-move-right-big
|
||||||
|
Move pointer 10 times
|
||||||
|
.Ar moveamount
|
||||||
|
pixels right.
|
||||||
|
.It pointer-move-left-big
|
||||||
|
Move pointer 10 times
|
||||||
|
.Ar moveamount
|
||||||
|
pixels left.
|
||||||
.El
|
.El
|
||||||
.Sh FILES
|
.Sh FILES
|
||||||
.Bl -tag -width "~/.cwmrcXXX" -compact
|
.Bl -tag -width "~/.cwmrcXXX" -compact
|
||||||
@@ -470,23 +461,23 @@ ignore xapm
|
|||||||
ignore xclock
|
ignore xclock
|
||||||
|
|
||||||
# Key bindings
|
# Key bindings
|
||||||
bind CM-r label
|
bind-key CM-r window-menu-label
|
||||||
bind CS-Return "xterm -e top"
|
bind-key CS-Return "xterm -e top"
|
||||||
bind 4-o unmap
|
bind-key C4-equal window-vmaximize
|
||||||
bind CM-equal unmap
|
bind-key C4S-equal window-hmaximize
|
||||||
bind CMS-equal unmap
|
bind-key M-1 group-only-1
|
||||||
bind C4-equal vmaximize
|
bind-key M-2 group-only-2
|
||||||
bind C4S-equal hmaximize
|
bind-key M-3 group-only-3
|
||||||
bind M-1 grouponly1
|
bind-key MS-1 window-movetogroup-1
|
||||||
bind M-2 grouponly2
|
bind-key MS-2 window-movetogroup-2
|
||||||
bind M-3 grouponly3
|
bind-key MS-3 window-movetogroup-3
|
||||||
bind MS-1 movetogroup1
|
unbind-key 4-o
|
||||||
bind MS-2 movetogroup2
|
unbind-key CM-equal
|
||||||
bind MS-3 movetogroup3
|
unbind-key CMS-equal
|
||||||
|
|
||||||
# Mouse bindings
|
# Mouse bindings
|
||||||
mousebind M-2 window_lower
|
bind-mouse M-2 window-lower
|
||||||
mousebind M-3 window_resize
|
bind-mouse M-3 window-resize
|
||||||
.Ed
|
.Ed
|
||||||
.Sh SEE ALSO
|
.Sh SEE ALSO
|
||||||
.Xr cwm 1
|
.Xr cwm 1
|
||||||
|
21
kbfunc.c
21
kbfunc.c
@@ -298,12 +298,13 @@ kbfunc_menu_client(void *ctx, union arg *arg, enum xev xev)
|
|||||||
struct menu *mi;
|
struct menu *mi;
|
||||||
struct menu_q menuq;
|
struct menu_q menuq;
|
||||||
int m = (xev == CWM_XEV_BTN);
|
int m = (xev == CWM_XEV_BTN);
|
||||||
|
int all = (arg->i & CWM_MENU_WINDOW_ALL);
|
||||||
|
|
||||||
old_cc = client_current();
|
old_cc = client_current();
|
||||||
|
|
||||||
TAILQ_INIT(&menuq);
|
TAILQ_INIT(&menuq);
|
||||||
TAILQ_FOREACH(cc, &sc->clientq, entry) {
|
TAILQ_FOREACH(cc, &sc->clientq, entry) {
|
||||||
if (m) {
|
if (!all) {
|
||||||
if (cc->flags & CLIENT_HIDDEN)
|
if (cc->flags & CLIENT_HIDDEN)
|
||||||
menuq_add(&menuq, cc, NULL);
|
menuq_add(&menuq, cc, NULL);
|
||||||
} else
|
} else
|
||||||
@@ -390,6 +391,7 @@ kbfunc_menu_exec(void *ctx, union arg *arg, enum xev xev)
|
|||||||
struct screen_ctx *sc = ctx;
|
struct screen_ctx *sc = ctx;
|
||||||
char **ap, *paths[NPATHS], *path, *pathcpy;
|
char **ap, *paths[NPATHS], *path, *pathcpy;
|
||||||
char tpath[PATH_MAX];
|
char tpath[PATH_MAX];
|
||||||
|
struct stat sb;
|
||||||
const char *label;
|
const char *label;
|
||||||
DIR *dirp;
|
DIR *dirp;
|
||||||
struct dirent *dp;
|
struct dirent *dp;
|
||||||
@@ -432,12 +434,13 @@ kbfunc_menu_exec(void *ctx, union arg *arg, enum xev xev)
|
|||||||
dp->d_name);
|
dp->d_name);
|
||||||
if (l == -1 || l >= sizeof(tpath))
|
if (l == -1 || l >= sizeof(tpath))
|
||||||
continue;
|
continue;
|
||||||
/* skip everything but regular files and symlinks */
|
/* Skip everything but regular files and symlinks. */
|
||||||
if (dp->d_type != DT_REG && dp->d_type != DT_LNK) {
|
if (dp->d_type != DT_REG && dp->d_type != DT_LNK) {
|
||||||
/* use an additional stat-based check in case d_type isn't supported */
|
/* lstat(2) in case d_type isn't supported. */
|
||||||
if (lstat(tpath, &sb) < 0)
|
if (lstat(tpath, &sb) == -1)
|
||||||
continue;
|
continue;
|
||||||
if (!S_ISREG(sb.st_mode) && !S_ISLNK(sb.st_mode))
|
if (!S_ISREG(sb.st_mode) &&
|
||||||
|
!S_ISLNK(sb.st_mode))
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (access(tpath, X_OK) == 0)
|
if (access(tpath, X_OK) == 0)
|
||||||
@@ -449,7 +452,7 @@ kbfunc_menu_exec(void *ctx, union arg *arg, enum xev xev)
|
|||||||
|
|
||||||
if ((mi = menu_filter(sc, &menuq, label, NULL,
|
if ((mi = menu_filter(sc, &menuq, label, NULL,
|
||||||
(CWM_MENU_DUMMY | CWM_MENU_FILE),
|
(CWM_MENU_DUMMY | CWM_MENU_FILE),
|
||||||
search_match_exec_path, NULL)) != NULL) {
|
search_match_exec, search_print_text)) != NULL) {
|
||||||
if (mi->text[0] == '\0')
|
if (mi->text[0] == '\0')
|
||||||
goto out;
|
goto out;
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
@@ -518,13 +521,13 @@ kbfunc_menu_ssh(void *ctx, union arg *arg, enum xev xev)
|
|||||||
if (p - buf + 1 > sizeof(hostbuf))
|
if (p - buf + 1 > sizeof(hostbuf))
|
||||||
continue;
|
continue;
|
||||||
(void)strlcpy(hostbuf, buf, p - buf + 1);
|
(void)strlcpy(hostbuf, buf, p - buf + 1);
|
||||||
menuq_add(&menuq, NULL, hostbuf);
|
menuq_add(&menuq, NULL, "%s", hostbuf);
|
||||||
}
|
}
|
||||||
free(lbuf);
|
free(lbuf);
|
||||||
(void)fclose(fp);
|
(void)fclose(fp);
|
||||||
menu:
|
menu:
|
||||||
if ((mi = menu_filter(sc, &menuq, "ssh", NULL, (CWM_MENU_DUMMY),
|
if ((mi = menu_filter(sc, &menuq, "ssh", NULL, (CWM_MENU_DUMMY),
|
||||||
search_match_exec, NULL)) != NULL) {
|
search_match_text, search_print_text)) != NULL) {
|
||||||
if (mi->text[0] == '\0')
|
if (mi->text[0] == '\0')
|
||||||
goto out;
|
goto out;
|
||||||
l = snprintf(path, sizeof(path), "%s -T '[ssh] %s' -e ssh %s",
|
l = snprintf(path, sizeof(path), "%s -T '[ssh] %s' -e ssh %s",
|
||||||
@@ -550,7 +553,7 @@ kbfunc_menu_client_label(void *ctx, union arg *arg, enum xev xev)
|
|||||||
|
|
||||||
/* dummy is set, so this will always return */
|
/* dummy is set, so this will always return */
|
||||||
mi = menu_filter(cc->sc, &menuq, "label", cc->label, (CWM_MENU_DUMMY),
|
mi = menu_filter(cc->sc, &menuq, "label", cc->label, (CWM_MENU_DUMMY),
|
||||||
search_match_text, NULL);
|
search_match_text, search_print_text);
|
||||||
|
|
||||||
if (!mi->abort) {
|
if (!mi->abort) {
|
||||||
free(cc->label);
|
free(cc->label);
|
||||||
|
8
menu.c
8
menu.c
@@ -126,7 +126,6 @@ menu_filter(struct screen_ctx *sc, struct menu_q *menuq, const char *prompt,
|
|||||||
CurrentTime) != GrabSuccess) {
|
CurrentTime) != GrabSuccess) {
|
||||||
XUnmapWindow(X_Dpy, sc->menu.win);
|
XUnmapWindow(X_Dpy, sc->menu.win);
|
||||||
return(NULL);
|
return(NULL);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
XGetInputFocus(X_Dpy, &focuswin, &focusrevert);
|
XGetInputFocus(X_Dpy, &focuswin, &focusrevert);
|
||||||
@@ -196,7 +195,7 @@ menu_complete_path(struct menu_ctx *mc)
|
|||||||
TAILQ_INIT(&menuq);
|
TAILQ_INIT(&menuq);
|
||||||
|
|
||||||
if ((mi = menu_filter(sc, &menuq, mc->searchstr, NULL,
|
if ((mi = menu_filter(sc, &menuq, mc->searchstr, NULL,
|
||||||
(CWM_MENU_DUMMY), search_match_path_any, NULL)) != NULL) {
|
(CWM_MENU_DUMMY), search_match_path, search_print_text)) != NULL) {
|
||||||
mr->abort = mi->abort;
|
mr->abort = mi->abort;
|
||||||
mr->dummy = mi->dummy;
|
mr->dummy = mi->dummy;
|
||||||
if (mi->text[0] != '\0')
|
if (mi->text[0] != '\0')
|
||||||
@@ -366,11 +365,7 @@ menu_draw(struct menu_ctx *mc, struct menu_q *menuq, struct menu_q *resultq)
|
|||||||
}
|
}
|
||||||
|
|
||||||
TAILQ_FOREACH(mi, resultq, resultentry) {
|
TAILQ_FOREACH(mi, resultq, resultentry) {
|
||||||
if (mc->print != NULL)
|
|
||||||
(*mc->print)(mi, mc->listing);
|
(*mc->print)(mi, mc->listing);
|
||||||
else
|
|
||||||
(void)snprintf(mi->print, sizeof(mi->print),
|
|
||||||
"%s", mi->text);
|
|
||||||
|
|
||||||
XftTextExtentsUtf8(X_Dpy, sc->xftfont,
|
XftTextExtentsUtf8(X_Dpy, sc->xftfont,
|
||||||
(const FcChar8*)mi->print,
|
(const FcChar8*)mi->print,
|
||||||
@@ -671,4 +666,3 @@ menu_windraw(struct screen_ctx *sc, Window win, const char *fmt, ...)
|
|||||||
|
|
||||||
free(text);
|
free(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -53,6 +53,8 @@ mousefunc_client_resize(void *ctx, union arg *arg, enum xev xev)
|
|||||||
CurrentTime) != GrabSuccess)
|
CurrentTime) != GrabSuccess)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
menu_windraw(sc, cc->win, "%4d x %-4d", cc->dim.w, cc->dim.h);
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
XWindowEvent(X_Dpy, cc->win, MOUSEMASK, &ev);
|
XWindowEvent(X_Dpy, cc->win, MOUSEMASK, &ev);
|
||||||
|
|
||||||
@@ -120,6 +122,8 @@ mousefunc_client_move(void *ctx, union arg *arg, enum xev xev)
|
|||||||
CurrentTime) != GrabSuccess)
|
CurrentTime) != GrabSuccess)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
menu_windraw(sc, cc->win, "%4d, %-4d", cc->geom.x, cc->geom.y);
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
XWindowEvent(X_Dpy, cc->win, MOUSEMASK, &ev);
|
XWindowEvent(X_Dpy, cc->win, MOUSEMASK, &ev);
|
||||||
|
|
||||||
|
53
parse.y
53
parse.y
@@ -70,8 +70,9 @@ typedef struct {
|
|||||||
|
|
||||||
%}
|
%}
|
||||||
|
|
||||||
%token FONTNAME STICKY GAP MOUSEBIND
|
%token BINDKEY UNBINDKEY BINDMOUSE UNBINDMOUSE
|
||||||
%token AUTOGROUP BIND COMMAND IGNORE
|
%token FONTNAME STICKY GAP
|
||||||
|
%token AUTOGROUP COMMAND IGNORE
|
||||||
%token YES NO BORDERWIDTH MOVEAMOUNT
|
%token YES NO BORDERWIDTH MOVEAMOUNT
|
||||||
%token COLOR SNAPDIST
|
%token COLOR SNAPDIST
|
||||||
%token ACTIVEBORDER INACTIVEBORDER URGENCYBORDER
|
%token ACTIVEBORDER INACTIVEBORDER URGENCYBORDER
|
||||||
@@ -171,16 +172,6 @@ main : FONTNAME STRING {
|
|||||||
conf_ignore(conf, $2);
|
conf_ignore(conf, $2);
|
||||||
free($2);
|
free($2);
|
||||||
}
|
}
|
||||||
| BIND STRING string {
|
|
||||||
if (!conf_bind_kbd(conf, $2, $3)) {
|
|
||||||
yyerror("invalid bind: %s %s", $2, $3);
|
|
||||||
free($2);
|
|
||||||
free($3);
|
|
||||||
YYERROR;
|
|
||||||
}
|
|
||||||
free($2);
|
|
||||||
free($3);
|
|
||||||
}
|
|
||||||
| GAP NUMBER NUMBER NUMBER NUMBER {
|
| GAP NUMBER NUMBER NUMBER NUMBER {
|
||||||
if ($2 < 0 || $2 > INT_MAX ||
|
if ($2 < 0 || $2 > INT_MAX ||
|
||||||
$3 < 0 || $3 > INT_MAX ||
|
$3 < 0 || $3 > INT_MAX ||
|
||||||
@@ -194,9 +185,9 @@ main : FONTNAME STRING {
|
|||||||
conf->gap.left = $4;
|
conf->gap.left = $4;
|
||||||
conf->gap.right = $5;
|
conf->gap.right = $5;
|
||||||
}
|
}
|
||||||
| MOUSEBIND STRING string {
|
| BINDKEY STRING string {
|
||||||
if (!conf_bind_mouse(conf, $2, $3)) {
|
if (!conf_bind_key(conf, $2, $3)) {
|
||||||
yyerror("invalid mousebind: %s %s", $2, $3);
|
yyerror("invalid bind-key: %s %s", $2, $3);
|
||||||
free($2);
|
free($2);
|
||||||
free($3);
|
free($3);
|
||||||
YYERROR;
|
YYERROR;
|
||||||
@@ -204,6 +195,32 @@ main : FONTNAME STRING {
|
|||||||
free($2);
|
free($2);
|
||||||
free($3);
|
free($3);
|
||||||
}
|
}
|
||||||
|
| UNBINDKEY STRING {
|
||||||
|
if (!conf_bind_key(conf, $2, NULL)) {
|
||||||
|
yyerror("invalid unbind-key: %s", $2);
|
||||||
|
free($2);
|
||||||
|
YYERROR;
|
||||||
|
}
|
||||||
|
free($2);
|
||||||
|
}
|
||||||
|
| BINDMOUSE STRING string {
|
||||||
|
if (!conf_bind_mouse(conf, $2, $3)) {
|
||||||
|
yyerror("invalid bind-mouse: %s %s", $2, $3);
|
||||||
|
free($2);
|
||||||
|
free($3);
|
||||||
|
YYERROR;
|
||||||
|
}
|
||||||
|
free($2);
|
||||||
|
free($3);
|
||||||
|
}
|
||||||
|
| UNBINDMOUSE STRING {
|
||||||
|
if (!conf_bind_mouse(conf, $2, NULL)) {
|
||||||
|
yyerror("invalid unbind-mouse: %s", $2);
|
||||||
|
free($2);
|
||||||
|
YYERROR;
|
||||||
|
}
|
||||||
|
free($2);
|
||||||
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
color : COLOR colors
|
color : COLOR colors
|
||||||
@@ -280,7 +297,8 @@ lookup(char *s)
|
|||||||
static const struct keywords keywords[] = {
|
static const struct keywords keywords[] = {
|
||||||
{ "activeborder", ACTIVEBORDER},
|
{ "activeborder", ACTIVEBORDER},
|
||||||
{ "autogroup", AUTOGROUP},
|
{ "autogroup", AUTOGROUP},
|
||||||
{ "bind", BIND},
|
{ "bind-key", BINDKEY},
|
||||||
|
{ "bind-mouse", BINDMOUSE},
|
||||||
{ "borderwidth", BORDERWIDTH},
|
{ "borderwidth", BORDERWIDTH},
|
||||||
{ "color", COLOR},
|
{ "color", COLOR},
|
||||||
{ "command", COMMAND},
|
{ "command", COMMAND},
|
||||||
@@ -292,12 +310,13 @@ lookup(char *s)
|
|||||||
{ "inactiveborder", INACTIVEBORDER},
|
{ "inactiveborder", INACTIVEBORDER},
|
||||||
{ "menubg", MENUBG},
|
{ "menubg", MENUBG},
|
||||||
{ "menufg", MENUFG},
|
{ "menufg", MENUFG},
|
||||||
{ "mousebind", MOUSEBIND},
|
|
||||||
{ "moveamount", MOVEAMOUNT},
|
{ "moveamount", MOVEAMOUNT},
|
||||||
{ "no", NO},
|
{ "no", NO},
|
||||||
{ "selfont", FONTSELCOLOR},
|
{ "selfont", FONTSELCOLOR},
|
||||||
{ "snapdist", SNAPDIST},
|
{ "snapdist", SNAPDIST},
|
||||||
{ "sticky", STICKY},
|
{ "sticky", STICKY},
|
||||||
|
{ "unbind-key", UNBINDKEY},
|
||||||
|
{ "unbind-mouse", UNBINDMOUSE},
|
||||||
{ "ungroupborder", UNGROUPBORDER},
|
{ "ungroupborder", UNGROUPBORDER},
|
||||||
{ "urgencyborder", URGENCYBORDER},
|
{ "urgencyborder", URGENCYBORDER},
|
||||||
{ "yes", YES}
|
{ "yes", YES}
|
||||||
|
36
search.c
36
search.c
@@ -36,10 +36,8 @@
|
|||||||
#define PATH_ANY 0x0001
|
#define PATH_ANY 0x0001
|
||||||
#define PATH_EXEC 0x0002
|
#define PATH_EXEC 0x0002
|
||||||
|
|
||||||
static void search_match_path(struct menu_q *, struct menu_q *,
|
static void search_match_path_type(struct menu_q *, struct menu_q *,
|
||||||
char *, int);
|
char *, int);
|
||||||
static void search_match_path_exec(struct menu_q *, struct menu_q *,
|
|
||||||
char *);
|
|
||||||
static int strsubmatch(char *, char *, int);
|
static int strsubmatch(char *, char *, int);
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -107,7 +105,13 @@ search_match_client(struct menu_q *menuq, struct menu_q *resultq, char *search)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
search_print_cmd(struct menu *mi, int i)
|
search_print_text(struct menu *mi, int listing)
|
||||||
|
{
|
||||||
|
(void)snprintf(mi->print, sizeof(mi->print), "%s", mi->text);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
search_print_cmd(struct menu *mi, int listing)
|
||||||
{
|
{
|
||||||
struct cmd_ctx *cmd = (struct cmd_ctx *)mi->ctx;
|
struct cmd_ctx *cmd = (struct cmd_ctx *)mi->ctx;
|
||||||
|
|
||||||
@@ -115,7 +119,7 @@ search_print_cmd(struct menu *mi, int i)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
search_print_group(struct menu *mi, int i)
|
search_print_group(struct menu *mi, int listing)
|
||||||
{
|
{
|
||||||
struct group_ctx *gc = (struct group_ctx *)mi->ctx;
|
struct group_ctx *gc = (struct group_ctx *)mi->ctx;
|
||||||
|
|
||||||
@@ -125,7 +129,7 @@ search_print_group(struct menu *mi, int i)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
search_print_client(struct menu *mi, int list)
|
search_print_client(struct menu *mi, int listing)
|
||||||
{
|
{
|
||||||
struct client_ctx *cc = (struct client_ctx *)mi->ctx;
|
struct client_ctx *cc = (struct client_ctx *)mi->ctx;
|
||||||
char flag = ' ';
|
char flag = ' ';
|
||||||
@@ -141,7 +145,8 @@ search_print_client(struct menu *mi, int list)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
search_match_path(struct menu_q *menuq, struct menu_q *resultq, char *search, int flag)
|
search_match_path_type(struct menu_q *menuq, struct menu_q *resultq,
|
||||||
|
char *search, int flag)
|
||||||
{
|
{
|
||||||
char pattern[PATH_MAX];
|
char pattern[PATH_MAX];
|
||||||
glob_t g;
|
glob_t g;
|
||||||
@@ -162,16 +167,10 @@ search_match_path(struct menu_q *menuq, struct menu_q *resultq, char *search, in
|
|||||||
globfree(&g);
|
globfree(&g);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
search_match_path_exec(struct menu_q *menuq, struct menu_q *resultq, char *search)
|
|
||||||
{
|
|
||||||
return(search_match_path(menuq, resultq, search, PATH_EXEC));
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
search_match_path_any(struct menu_q *menuq, struct menu_q *resultq, char *search)
|
search_match_path(struct menu_q *menuq, struct menu_q *resultq, char *search)
|
||||||
{
|
{
|
||||||
return(search_match_path(menuq, resultq, search, PATH_ANY));
|
return(search_match_path_type(menuq, resultq, search, PATH_ANY));
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -208,14 +207,9 @@ search_match_exec(struct menu_q *menuq, struct menu_q *resultq, char *search)
|
|||||||
if (mj == NULL)
|
if (mj == NULL)
|
||||||
TAILQ_INSERT_TAIL(resultq, mi, resultentry);
|
TAILQ_INSERT_TAIL(resultq, mi, resultentry);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
search_match_exec_path(struct menu_q *menuq, struct menu_q *resultq, char *search)
|
|
||||||
{
|
|
||||||
search_match_exec(menuq, resultq, search);
|
|
||||||
if (TAILQ_EMPTY(resultq))
|
if (TAILQ_EMPTY(resultq))
|
||||||
search_match_path_exec(menuq, resultq, search);
|
search_match_path_type(menuq, resultq, search, PATH_EXEC);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
Reference in New Issue
Block a user