cvsimport

This commit is contained in:
okan 2014-01-29 22:30:00 +00:00
commit 1fd3fc4997
7 changed files with 99 additions and 75 deletions

View File

@ -106,6 +106,11 @@ union arg {
int i; int i;
}; };
union press {
KeySym keysym;
unsigned int button;
};
enum cursor_font { enum cursor_font {
CF_DEFAULT, CF_DEFAULT,
CF_MOVE, CF_MOVE,
@ -259,26 +264,17 @@ struct screen_ctx {
}; };
TAILQ_HEAD(screen_ctx_q, screen_ctx); TAILQ_HEAD(screen_ctx_q, screen_ctx);
struct keybinding { struct binding {
TAILQ_ENTRY(keybinding) entry; TAILQ_ENTRY(binding) entry;
void (*callback)(struct client_ctx *, union arg *); void (*callback)(struct client_ctx *, union arg *);
union arg argument; union arg argument;
unsigned int modmask; unsigned int modmask;
KeySym keysym; union press press;
int flags; int flags;
int argtype; int argtype;
}; };
TAILQ_HEAD(keybinding_q, keybinding); TAILQ_HEAD(keybinding_q, binding);
TAILQ_HEAD(mousebinding_q, binding);
struct mousebinding {
TAILQ_ENTRY(mousebinding) entry;
void (*callback)(struct client_ctx *, union arg *);
union arg argument;
unsigned int modmask;
unsigned int button;
int flags;
};
TAILQ_HEAD(mousebinding_q, mousebinding);
struct cmd { struct cmd {
TAILQ_ENTRY(cmd) entry; TAILQ_ENTRY(cmd) entry;
@ -302,10 +298,10 @@ TAILQ_HEAD(menu_q, menu);
struct conf { struct conf {
struct keybinding_q keybindingq; struct keybinding_q keybindingq;
struct mousebinding_q mousebindingq;
struct autogroupwin_q autogroupq; struct autogroupwin_q autogroupq;
struct winmatch_q ignoreq; struct winmatch_q ignoreq;
struct cmd_q cmdq; struct cmd_q cmdq;
struct mousebinding_q mousebindingq;
#define CONF_STICKY_GROUPS 0x0001 #define CONF_STICKY_GROUPS 0x0001
int flags; int flags;
#define CONF_BWIDTH 1 #define CONF_BWIDTH 1
@ -493,7 +489,7 @@ void kbfunc_cmdexec(struct client_ctx *, union arg *);
void kbfunc_cwm_status(struct client_ctx *, union arg *); void kbfunc_cwm_status(struct client_ctx *, union arg *);
void kbfunc_exec(struct client_ctx *, union arg *); void kbfunc_exec(struct client_ctx *, union arg *);
void kbfunc_lock(struct client_ctx *, union arg *); void kbfunc_lock(struct client_ctx *, union arg *);
void kbfunc_menu_search(struct client_ctx *, union arg *); void kbfunc_menu_cmd(struct client_ctx *, union arg *);
void kbfunc_ssh(struct client_ctx *, union arg *); void kbfunc_ssh(struct client_ctx *, union arg *);
void kbfunc_term(struct client_ctx *, union arg *); void kbfunc_term(struct client_ctx *, union arg *);
void kbfunc_tile(struct client_ctx *, union arg *); void kbfunc_tile(struct client_ctx *, union arg *);
@ -534,7 +530,7 @@ int conf_bind_mouse(struct conf *, const char *,
const char *); const char *);
void conf_clear(struct conf *); void conf_clear(struct conf *);
void conf_client(struct client_ctx *); void conf_client(struct client_ctx *);
void conf_cmd_add(struct conf *, const char *, int conf_cmd_add(struct conf *, const char *,
const char *); const char *);
void conf_cursor(struct conf *); void conf_cursor(struct conf *);
void conf_grab_kbd(Window); void conf_grab_kbd(Window);

98
conf.c
View File

@ -32,26 +32,52 @@
#include "calmwm.h" #include "calmwm.h"
static const char *conf_bind_getmask(const char *, unsigned int *); static const char *conf_bind_getmask(const char *, unsigned int *);
static void conf_unbind_kbd(struct conf *, struct keybinding *); static void conf_cmd_remove(struct conf *, const char *);
static void conf_unbind_mouse(struct conf *, struct mousebinding *); static void conf_unbind_kbd(struct conf *, struct binding *);
static void conf_unbind_mouse(struct conf *, struct binding *);
/* Add an command menu entry to the end of the menu */ int
void
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 *cmd;
/* "term" and "lock" have special meanings. */ /* "term" and "lock" have special meanings. */
if (strcmp(name, "term") == 0) if (strcmp(name, "term") == 0) {
(void)strlcpy(c->termpath, path, sizeof(c->termpath)); if (strlcpy(c->termpath, path, sizeof(c->termpath)) >=
else if (strcmp(name, "lock") == 0) sizeof(c->termpath))
(void)strlcpy(c->lockpath, path, sizeof(c->lockpath)); return (0);
else { } else if (strcmp(name, "lock") == 0) {
struct cmd *cmd = xmalloc(sizeof(*cmd)); if (strlcpy(c->lockpath, path, sizeof(c->lockpath)) >=
(void)strlcpy(cmd->name, name, sizeof(cmd->name)); sizeof(c->lockpath))
(void)strlcpy(cmd->path, path, sizeof(cmd->path)); return (0);
} else {
cmd = xmalloc(sizeof(*cmd));
conf_cmd_remove(c, name);
if (strlcpy(cmd->name, name, sizeof(cmd->name)) >=
sizeof(cmd->name))
return (0);
if (strlcpy(cmd->path, path, sizeof(cmd->path)) >=
sizeof(cmd->path))
return (0);
TAILQ_INSERT_TAIL(&c->cmdq, cmd, entry); TAILQ_INSERT_TAIL(&c->cmdq, cmd, entry);
} }
return (1);
} }
static void
conf_cmd_remove(struct conf *c, const char *name)
{
struct cmd *cmd = NULL, *cmdnxt;
TAILQ_FOREACH_SAFE(cmd, &c->cmdq, entry, cmdnxt) {
if (strcmp(cmd->name, name) == 0) {
TAILQ_REMOVE(&c->cmdq, cmd, entry);
free(cmd);
}
}
}
void void
conf_autogroup(struct conf *c, int no, const char *val) conf_autogroup(struct conf *c, int no, const char *val)
{ {
@ -249,9 +275,8 @@ conf_init(struct conf *c)
for (i = 0; i < nitems(color_binds); i++) for (i = 0; i < nitems(color_binds); i++)
c->color[i] = xstrdup(color_binds[i]); c->color[i] = xstrdup(color_binds[i]);
/* Default term/lock */ conf_cmd_add(c, "lock", "xlock");
(void)strlcpy(c->termpath, "xterm", sizeof(c->termpath)); conf_cmd_add(c, "term", "xterm");
(void)strlcpy(c->lockpath, "xlock", sizeof(c->lockpath));
(void)snprintf(c->known_hosts, sizeof(c->known_hosts), "%s/%s", (void)snprintf(c->known_hosts, sizeof(c->known_hosts), "%s/%s",
homedir, ".ssh/known_hosts"); homedir, ".ssh/known_hosts");
@ -263,10 +288,9 @@ void
conf_clear(struct conf *c) conf_clear(struct conf *c)
{ {
struct autogroupwin *ag; struct autogroupwin *ag;
struct keybinding *kb; struct binding *kb, *mb;
struct winmatch *wm; struct winmatch *wm;
struct cmd *cmd; struct cmd *cmd;
struct mousebinding *mb;
int i; int i;
while ((cmd = TAILQ_FIRST(&c->cmdq)) != NULL) { while ((cmd = TAILQ_FIRST(&c->cmdq)) != NULL) {
@ -329,7 +353,7 @@ static const struct {
{ "lower", kbfunc_client_lower, CWM_WIN, {0} }, { "lower", kbfunc_client_lower, CWM_WIN, {0} },
{ "raise", kbfunc_client_raise, CWM_WIN, {0} }, { "raise", kbfunc_client_raise, CWM_WIN, {0} },
{ "search", kbfunc_client_search, 0, {0} }, { "search", kbfunc_client_search, 0, {0} },
{ "menusearch", kbfunc_menu_search, 0, {0} }, { "menusearch", kbfunc_menu_cmd, 0, {0} },
{ "hide", kbfunc_client_hide, CWM_WIN, {0} }, { "hide", kbfunc_client_hide, CWM_WIN, {0} },
{ "cycle", kbfunc_client_cycle, 0, {.i = CWM_CYCLE} }, { "cycle", kbfunc_client_cycle, 0, {.i = CWM_CYCLE} },
{ "rcycle", kbfunc_client_cycle, 0, {.i = CWM_RCYCLE} }, { "rcycle", kbfunc_client_cycle, 0, {.i = CWM_RCYCLE} },
@ -466,16 +490,16 @@ conf_bind_getmask(const char *name, unsigned int *mask)
int int
conf_bind_kbd(struct conf *c, const char *bind, const char *cmd) conf_bind_kbd(struct conf *c, const char *bind, const char *cmd)
{ {
struct keybinding *kb; struct binding *kb;
const char *key; const char *key;
unsigned int i, mask; unsigned int i, mask;
kb = xcalloc(1, sizeof(*kb)); kb = xcalloc(1, sizeof(*kb));
key = conf_bind_getmask(bind, &mask); key = conf_bind_getmask(bind, &mask);
kb->modmask |= mask; kb->modmask |= mask;
kb->keysym = XStringToKeysym(key); kb->press.keysym = XStringToKeysym(key);
if (kb->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);
@ -510,15 +534,15 @@ conf_bind_kbd(struct conf *c, const char *bind, const char *cmd)
} }
static void static void
conf_unbind_kbd(struct conf *c, struct keybinding *unbind) conf_unbind_kbd(struct conf *c, struct binding *unbind)
{ {
struct keybinding *key = NULL, *keynxt; struct binding *key = NULL, *keynxt;
TAILQ_FOREACH_SAFE(key, &c->keybindingq, entry, keynxt) { TAILQ_FOREACH_SAFE(key, &c->keybindingq, entry, keynxt) {
if (key->modmask != unbind->modmask) if (key->modmask != unbind->modmask)
continue; continue;
if (key->keysym == unbind->keysym) { if (key->press.keysym == unbind->press.keysym) {
TAILQ_REMOVE(&c->keybindingq, key, entry); TAILQ_REMOVE(&c->keybindingq, key, entry);
if (key->argtype & ARG_CHAR) if (key->argtype & ARG_CHAR)
free(key->argument.c); free(key->argument.c);
@ -549,15 +573,15 @@ static const struct {
int int
conf_bind_mouse(struct conf *c, const char *bind, const char *cmd) conf_bind_mouse(struct conf *c, const char *bind, const char *cmd)
{ {
struct mousebinding *mb; struct binding *mb;
const char *button, *errstr; const char *button, *errstr;
unsigned int i, mask; unsigned int i, mask;
mb = xcalloc(1, sizeof(*mb)); mb = xcalloc(1, sizeof(*mb));
button = conf_bind_getmask(bind, &mask); button = conf_bind_getmask(bind, &mask);
mb->modmask |= mask; mb->modmask |= mask;
mb->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);
@ -587,15 +611,15 @@ conf_bind_mouse(struct conf *c, const char *bind, const char *cmd)
} }
static void static void
conf_unbind_mouse(struct conf *c, struct mousebinding *unbind) conf_unbind_mouse(struct conf *c, struct binding *unbind)
{ {
struct mousebinding *mb = NULL, *mbnxt; struct binding *mb = NULL, *mbnxt;
TAILQ_FOREACH_SAFE(mb, &c->mousebindingq, entry, mbnxt) { TAILQ_FOREACH_SAFE(mb, &c->mousebindingq, entry, mbnxt) {
if (mb->modmask != unbind->modmask) if (mb->modmask != unbind->modmask)
continue; continue;
if (mb->button == unbind->button) { if (mb->press.button == unbind->press.button) {
TAILQ_REMOVE(&c->mousebindingq, mb, entry); TAILQ_REMOVE(&c->mousebindingq, mb, entry);
free(mb); free(mb);
} }
@ -622,25 +646,25 @@ conf_cursor(struct conf *c)
void void
conf_grab_mouse(Window win) conf_grab_mouse(Window win)
{ {
struct mousebinding *mb; struct binding *mb;
xu_btn_ungrab(win); xu_btn_ungrab(win);
TAILQ_FOREACH(mb, &Conf.mousebindingq, entry) { TAILQ_FOREACH(mb, &Conf.mousebindingq, entry) {
if (mb->flags & CWM_WIN) if (mb->flags & CWM_WIN)
xu_btn_grab(win, mb->modmask, mb->button); xu_btn_grab(win, mb->modmask, mb->press.button);
} }
} }
void void
conf_grab_kbd(Window win) conf_grab_kbd(Window win)
{ {
struct keybinding *kb; struct binding *kb;
xu_key_ungrab(win); xu_key_ungrab(win);
TAILQ_FOREACH(kb, &Conf.keybindingq, entry) TAILQ_FOREACH(kb, &Conf.keybindingq, entry)
xu_key_grab(win, kb->modmask, kb->keysym); xu_key_grab(win, kb->modmask, kb->press.keysym);
} }
static char *cwmhints[] = { static char *cwmhints[] = {

14
cwmrc.5
View File

@ -14,7 +14,7 @@
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.\" .\"
.Dd $Mdocdate: December 13 2013 $ .Dd $Mdocdate: December 16 2013 $
.Dt CWMRC 5 .Dt CWMRC 5
.Os .Os
.Sh NAME .Sh NAME
@ -64,8 +64,8 @@ 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 Ar keys command
Cause the creation of a keybinding, or replacement of a default Cause the creation of a key binding, or replacement of a default
keybinding. key binding.
The modifier keys come first, followed by a The modifier keys come first, followed by a
.Sq - . .Sq - .
.Pp .Pp
@ -96,7 +96,7 @@ A special
.Ar command .Ar command
keyword keyword
.Dq unmap .Dq unmap
can be used to remove the named keybinding. can be used to remove the named key binding.
This can be used to remove a binding which conflicts with an This can be used to remove a binding which conflicts with an
application. application.
.Pp .Pp
@ -148,7 +148,7 @@ and
.Nm lock .Nm lock
have a special meaning. have a special meaning.
They point to the terminal and screen locking programs specified by They point to the terminal and screen locking programs specified by
keybindings. key bindings.
The defaults are The defaults are
.Xr xterm 1 .Xr xterm 1
and and
@ -258,7 +258,7 @@ ignore xwi
ignore xapm ignore xapm
ignore xclock ignore xclock
# Keybindings # Key bindings
bind CM-r label bind CM-r label
bind CS-Return "xterm -e top" bind CS-Return "xterm -e top"
bind 4-o unmap bind 4-o unmap
@ -273,7 +273,7 @@ bind MS-1 movetogroup1
bind MS-2 movetogroup2 bind MS-2 movetogroup2
bind MS-3 movetogroup3 bind MS-3 movetogroup3
# Mousebindings # Mouse bindings
mousebind M-2 window_lower mousebind M-2 window_lower
mousebind M-3 window_resize mousebind M-3 window_resize
.Ed .Ed

View File

@ -167,7 +167,7 @@ kbfunc_client_search(struct client_ctx *cc, union arg *arg)
} }
void void
kbfunc_menu_search(struct client_ctx *cc, union arg *arg) kbfunc_menu_cmd(struct client_ctx *cc, union arg *arg)
{ {
struct screen_ctx *sc = cc->sc; struct screen_ctx *sc = cc->sc;
struct cmd *cmd; struct cmd *cmd;

View File

@ -221,7 +221,6 @@ mousefunc_menu_unhide(struct client_ctx *cc, union arg *arg)
old_cc = client_current(); old_cc = client_current();
TAILQ_INIT(&menuq); TAILQ_INIT(&menuq);
TAILQ_FOREACH(cc, &Clientq, entry) TAILQ_FOREACH(cc, &Clientq, entry)
if (cc->flags & CLIENT_HIDDEN) { if (cc->flags & CLIENT_HIDDEN) {
wname = (cc->label) ? cc->label : cc->name; wname = (cc->label) ? cc->label : cc->name;
@ -235,8 +234,8 @@ mousefunc_menu_unhide(struct client_ctx *cc, union arg *arg)
if (TAILQ_EMPTY(&menuq)) if (TAILQ_EMPTY(&menuq))
return; return;
mi = menu_filter(sc, &menuq, NULL, NULL, 0, NULL, NULL); if ((mi = menu_filter(sc, &menuq, NULL, NULL, 0,
if (mi != NULL) { NULL, NULL)) != NULL) {
cc = (struct client_ctx *)mi->ctx; cc = (struct client_ctx *)mi->ctx;
client_unhide(cc); client_unhide(cc);
@ -252,19 +251,19 @@ void
mousefunc_menu_cmd(struct client_ctx *cc, union arg *arg) mousefunc_menu_cmd(struct client_ctx *cc, union arg *arg)
{ {
struct screen_ctx *sc = cc->sc; struct screen_ctx *sc = cc->sc;
struct cmd *cmd;
struct menu *mi; struct menu *mi;
struct menu_q menuq; struct menu_q menuq;
struct cmd *cmd;
TAILQ_INIT(&menuq); TAILQ_INIT(&menuq);
TAILQ_FOREACH(cmd, &Conf.cmdq, entry) TAILQ_FOREACH(cmd, &Conf.cmdq, entry)
menuq_add(&menuq, cmd, "%s", cmd->name); menuq_add(&menuq, cmd, "%s", cmd->name);
if (TAILQ_EMPTY(&menuq)) if (TAILQ_EMPTY(&menuq))
return; return;
mi = menu_filter(sc, &menuq, NULL, NULL, 0, NULL, NULL); if ((mi = menu_filter(sc, &menuq, NULL, NULL, 0,
if (mi != NULL) NULL, NULL)) != NULL)
u_spawn(((struct cmd *)mi->ctx)->path); u_spawn(((struct cmd *)mi->ctx)->path);
menuq_clear(&menuq); menuq_clear(&menuq);

View File

@ -139,7 +139,12 @@ main : FONTNAME STRING {
conf->snapdist = $2; conf->snapdist = $2;
} }
| COMMAND STRING string { | COMMAND STRING string {
conf_cmd_add(conf, $2, $3); if (!conf_cmd_add(conf, $2, $3)) {
yyerror("command name/path too long");
free($2);
free($3);
YYERROR;
}
free($2); free($2);
free($3); free($3);
} }

View File

@ -224,12 +224,12 @@ xev_handle_buttonpress(XEvent *ee)
{ {
XButtonEvent *e = &ee->xbutton; XButtonEvent *e = &ee->xbutton;
struct client_ctx *cc, fakecc; struct client_ctx *cc, fakecc;
struct mousebinding *mb; struct binding *mb;
e->state &= ~IGNOREMODMASK; e->state &= ~IGNOREMODMASK;
TAILQ_FOREACH(mb, &Conf.mousebindingq, entry) { TAILQ_FOREACH(mb, &Conf.mousebindingq, entry) {
if (e->button == mb->button && e->state == mb->modmask) if (e->button == mb->press.button && e->state == mb->modmask)
break; break;
} }
@ -263,7 +263,7 @@ xev_handle_keypress(XEvent *ee)
{ {
XKeyEvent *e = &ee->xkey; XKeyEvent *e = &ee->xkey;
struct client_ctx *cc = NULL, fakecc; struct client_ctx *cc = NULL, fakecc;
struct keybinding *kb; struct binding *kb;
KeySym keysym, skeysym; KeySym keysym, skeysym;
unsigned int modshift; unsigned int modshift;
@ -273,7 +273,7 @@ xev_handle_keypress(XEvent *ee)
e->state &= ~IGNOREMODMASK; e->state &= ~IGNOREMODMASK;
TAILQ_FOREACH(kb, &Conf.keybindingq, entry) { TAILQ_FOREACH(kb, &Conf.keybindingq, entry) {
if (keysym != kb->keysym && skeysym == kb->keysym) if (keysym != kb->press.keysym && skeysym == kb->press.keysym)
modshift = ShiftMask; modshift = ShiftMask;
else else
modshift = 0; modshift = 0;
@ -281,7 +281,7 @@ xev_handle_keypress(XEvent *ee)
if ((kb->modmask | modshift) != e->state) if ((kb->modmask | modshift) != e->state)
continue; continue;
if (kb->keysym == (modshift == 0 ? keysym : skeysym)) if (kb->press.keysym == (modshift == 0 ? keysym : skeysym))
break; break;
} }