summaryrefslogtreecommitdiff
path: root/plugins/mouse
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2003-04-05 17:22:35 +0000
committerDana Jansens <danakj@orodu.net>2003-04-05 17:22:35 +0000
commit038e61197479865d15cb6ef686e80e47bf2fd843 (patch)
treefe6b5ca0e24e118c610740c0d898c555440a4d76 /plugins/mouse
parentbca8082d6d09a16a116c70001469a576b93157ce (diff)
better error msgs
Diffstat (limited to 'plugins/mouse')
-rw-r--r--plugins/mouse/mouseparse.c126
-rw-r--r--plugins/mouse/mouseparse.h8
2 files changed, 134 insertions, 0 deletions
diff --git a/plugins/mouse/mouseparse.c b/plugins/mouse/mouseparse.c
new file mode 100644
index 00000000..d2039dd8
--- /dev/null
+++ b/plugins/mouse/mouseparse.c
@@ -0,0 +1,126 @@
+#include "kernel/action.h"
+#include "kernel/parse.h"
+#include "mouse.h"
+
+void mouseparse(ParseToken *token)
+{
+ static char *top = NULL;
+ static char *context = NULL, *button = NULL;
+ static char *arg_str = NULL;
+ static int arg_int = 0;
+ static MouseAction event = -1;
+ static Action *action = NULL;
+ static gboolean err = FALSE;
+
+ if (err) {
+ if (token->type == TOKEN_NEWLINE)
+ err = FALSE;
+ /* just fall through and free the token */
+ } else if (top == NULL) {
+ if (token->type == TOKEN_IDENTIFIER &&
+ !g_ascii_strcasecmp("mbind", token->data.identifier)) {
+ top = token->data.identifier;
+ return;
+ } else {
+ yyerror("syntax error (expected mbind)");
+ err = TRUE;
+ }
+ } else if (context == NULL) {
+ if (token->type == TOKEN_IDENTIFIER) {
+ context = token->data.identifier;
+ return;
+ } else {
+ yyerror("syntax error (expected Key)");
+ err = TRUE;
+ }
+ } else if (event == (unsigned) -1) {
+ if (token->type == TOKEN_IDENTIFIER) {
+ if (!g_ascii_strcasecmp("press", token->data.identifier))
+ event = MouseAction_Press;
+ else if (!g_ascii_strcasecmp("release", token->data.identifier))
+ event = MouseAction_Release;
+ else if (!g_ascii_strcasecmp("click", token->data.identifier))
+ event = MouseAction_Click;
+ else if (!g_ascii_strcasecmp("doubleclick",token->data.identifier))
+ event = MouseAction_DClick;
+ else if (!g_ascii_strcasecmp("drag", token->data.identifier))
+ event = MouseAction_Motion;
+ if (event != (unsigned) -1)
+ return;
+ else {
+ yyerror("invalid event");
+ err = TRUE;
+ }
+ } else {
+ yyerror("syntax error (expected event)");
+ err = TRUE;
+ }
+ } else if (button == NULL) {
+ if (token->type == TOKEN_IDENTIFIER) {
+ button = token->data.identifier;
+ return;
+ } else {
+ yyerror("syntax error (expected button)");
+ err = TRUE;
+ }
+ } else if (action == NULL) {
+ if (token->type == TOKEN_IDENTIFIER) {
+ action = action_from_string(token->data.identifier);
+
+ /* check for valid actions for motion events */
+ if ((event == MouseAction_Motion) ^
+ (action &&
+ (action->func == action_move ||
+ action->func == action_resize))) {
+ action_free(action);
+ action = NULL;
+ }
+
+ if (action != NULL) {
+ return;
+ } else {
+ yyerror("invalid action");
+ err = TRUE;
+ }
+ } else {
+ yyerror("syntax error (expected action)");
+ err = TRUE;
+ }
+ } else if (token->type == TOKEN_STRING) {
+ arg_str = token->data.string;
+ return;
+ } else if (token->type == TOKEN_INTEGER) {
+ arg_int = token->data.integer;
+ return;
+ } else if (token->type != TOKEN_NEWLINE) {
+ yyerror("syntax error (unexpected trailing token)");
+ } else {
+
+ /* these use the argument */
+ if (action->func == action_execute || action->func == action_restart)
+ action->data.execute.path = g_strdup(arg_str);
+ if ((action->func == action_desktop ||
+ action->func == action_send_to_desktop) &&
+ arg_int)
+ action->data.desktop.desk = (unsigned) arg_int - 1;
+ if (action->func == action_move_relative_horz ||
+ action->func == action_move_relative_vert ||
+ action->func == action_resize_relative_horz ||
+ action->func == action_resize_relative_vert)
+ action->data.relative.delta = arg_int;
+
+ if (mbind(button, context, event, action))
+ action = NULL; /* don't free this if mbind succeeds */
+ else
+ yyerror("failed to add mouse binding");
+ }
+
+ g_free(top); top = NULL;
+ g_free(context); context = NULL;
+ g_free(button); button = NULL;
+ g_free(arg_str); arg_str = NULL;
+ arg_int = 0;
+ event = -1;
+ action_free(action); action = NULL;
+ parse_free_token(token);
+}
diff --git a/plugins/mouse/mouseparse.h b/plugins/mouse/mouseparse.h
new file mode 100644
index 00000000..0d28d59b
--- /dev/null
+++ b/plugins/mouse/mouseparse.h
@@ -0,0 +1,8 @@
+#ifndef __plugins_mouse_mouseparse_h
+#define __plugins_mouse_mouseparse_h
+
+#include "kernel/parse.h"
+
+void mouseparse(ParseToken *token);
+
+#endif