aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorokan2013-05-22 16:32:15 +0000
committerokan2013-05-22 16:32:15 +0000
commit1ea4db26e9ce71da6e81886df5de1c593f85d0f7 (patch)
treec99eab22e1a4de376da48e943cf065249e510319
parent4d300eb9f8360589cdd8e04c639a3cb9c13eb15d (diff)
downloadcwm-1ea4db26e9ce71da6e81886df5de1c593f85d0f7.tar.gz
move validation of pointer Button into conf_mousebind so we check
validity during the parse phase and not bother adding it to the queue, instead of each time a client needs to grab (when it's too late); furthermore, make this a config error, stop parsing and load the default config.
-rw-r--r--calmwm.h4
-rw-r--r--conf.c46
-rw-r--r--parse.y9
3 files changed, 32 insertions, 27 deletions
diff --git a/calmwm.h b/calmwm.h
index a80fde3..b139795 100644
--- a/calmwm.h
+++ b/calmwm.h
@@ -15,7 +15,7 @@
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
- * $OpenBSD: calmwm.h,v 1.208 2013/05/21 00:29:20 okan Exp $
+ * $OpenBSD: calmwm.h,v 1.209 2013/05/22 16:32:15 okan Exp $
*/
#ifndef _CALMWM_H_
@@ -439,7 +439,7 @@ void conf_grab(struct conf *, struct keybinding *);
void conf_grab_mouse(struct client_ctx *);
void conf_init(struct conf *);
void conf_ignore(struct conf *, char *);
-void conf_mousebind(struct conf *, char *, char *);
+int conf_mousebind(struct conf *, char *, char *);
void conf_screen(struct screen_ctx *);
void conf_ungrab(struct conf *, struct keybinding *);
diff --git a/conf.c b/conf.c
index 1e386a2..b49b489 100644
--- a/conf.c
+++ b/conf.c
@@ -15,7 +15,7 @@
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
- * $OpenBSD: conf.c,v 1.129 2013/05/20 20:21:04 okan Exp $
+ * $OpenBSD: conf.c,v 1.130 2013/05/22 16:32:15 okan Exp $
*/
#include <sys/param.h>
@@ -577,11 +577,14 @@ static struct {
{ "menu_cmd", mousefunc_menu_cmd, MOUSEBIND_CTX_ROOT },
};
-void
+static unsigned int mouse_btns[] = { Button1, Button2, Button3 };
+
+int
conf_mousebind(struct conf *c, char *name, char *binding)
{
struct mousebinding *current_binding;
char *substring, *tmp;
+ u_int button;
const char *errstr;
u_int i;
@@ -600,16 +603,27 @@ conf_mousebind(struct conf *c, char *name, char *binding)
} else
substring = name;
- current_binding->button = strtonum(substring, 1, 3, &errstr);
+ button = strtonum(substring, 1, 3, &errstr);
if (errstr)
- warnx("number of buttons is %s: %s", errstr, substring);
+ warnx("button number is %s: %s", errstr, substring);
+
+ for (i = 0; i < nitems(mouse_btns); i++) {
+ if (button == mouse_btns[i]) {
+ current_binding->button = button;
+ break;
+ }
+ }
+ if (!current_binding->button || errstr) {
+ free(current_binding);
+ return (0);
+ }
/* We now have the correct binding, remove duplicates. */
conf_mouseunbind(c, current_binding);
if (strcmp("unmap", binding) == 0) {
free(current_binding);
- return;
+ return (1);
}
for (i = 0; i < nitems(name_to_mousefunc); i++) {
@@ -619,8 +633,10 @@ conf_mousebind(struct conf *c, char *name, char *binding)
current_binding->context = name_to_mousefunc[i].context;
current_binding->callback = name_to_mousefunc[i].handler;
TAILQ_INSERT_TAIL(&c->mousebindingq, current_binding, entry);
- return;
+ return (1);
}
+
+ return (0);
}
static void
@@ -646,26 +662,10 @@ void
conf_grab_mouse(struct client_ctx *cc)
{
struct mousebinding *mb;
- u_int button;
TAILQ_FOREACH(mb, &Conf.mousebindingq, entry) {
if (mb->context != MOUSEBIND_CTX_WIN)
continue;
-
- switch(mb->button) {
- case 1:
- button = Button1;
- break;
- case 2:
- button = Button2;
- break;
- case 3:
- button = Button3;
- break;
- default:
- warnx("strange button in mousebinding\n");
- continue;
- }
- xu_btn_grab(cc->win, mb->modmask, button);
+ xu_btn_grab(cc->win, mb->modmask, mb->button);
}
}
diff --git a/parse.y b/parse.y
index 4a41710..c21461c 100644
--- a/parse.y
+++ b/parse.y
@@ -1,4 +1,4 @@
-/* $OpenBSD: parse.y,v 1.43 2013/05/22 13:02:14 okan Exp $ */
+/* $OpenBSD: parse.y,v 1.44 2013/05/22 16:32:15 okan Exp $ */
/*
* Copyright (c) 2002, 2003, 2004 Henning Brauer <henning@openbsd.org>
@@ -171,7 +171,12 @@ main : FONTNAME STRING {
conf->gap.right = $5;
}
| MOUSEBIND STRING string {
- conf_mousebind(conf, $2, $3);
+ if (!conf_mousebind(conf, $2, $3)) {
+ yyerror("invalid mousebind: %s %s", $2, $3);
+ free($2);
+ free($3);
+ YYERROR;
+ }
free($2);
free($3);
}