%{ #include "mouse.h" #include #ifdef HAVE_STDIO_H # include #endif static int lineno; static char *path; static gboolean error; static char *context; static char *event; static char *button; static char *action; static void endofline(); static int mparsewrap(); static void gotfield(); static void addbinding(); %} field [A-Za-z0-9][-A-Za-z0-9]* white [ \t]* %% ^{white}#.*\n lineno++; {field} gotfield(); \n endofline(); [ \t] . error = TRUE; %% static void gotfield() { if (context == NULL) context = g_strdup(mparsetext); else if (event == NULL) event = g_strdup(mparsetext); else if (button == NULL) button = g_strdup(mparsetext); else if (action == NULL) action = g_strdup(mparsetext); else error = TRUE; } static void endofline() { if (!error && context && event && button && action) addbinding(); else if (error || context || event || button || action) g_warning("Parser error in '%s' on line %d", path, lineno); error = FALSE; g_free(context); g_free(event); g_free(button); g_free(action); context = event = button = action = NULL; ++lineno; } static void addbinding() { Action *a = NULL; MouseAction mact; if (!g_ascii_strcasecmp(event, "press")) mact = MouseAction_Press; else if (!g_ascii_strcasecmp(event, "release")) mact = MouseAction_Release; else if (!g_ascii_strcasecmp(event, "click")) mact = MouseAction_Click; else if (!g_ascii_strcasecmp(event, "doubleclick")) mact = MouseAction_DClick; else if (!g_ascii_strcasecmp(event, "drag")) mact = MouseAction_Motion; else { g_warning("Invalid event '%s' in '%s' on line %d", event, path, lineno); return; } a = action_from_string(action); if (mact == MouseAction_Motion) { if (a && !(a->func == action_move || a->func == action_resize)) { action_free(a); a = NULL; } /* the below types cannot be used with !motion events, or at all with mouse bindings */ } else if (a && (a->func == action_move || a->func == action_resize || a->func == action_execute || a->func == action_desktop || a->func == action_move_relative_horz || a->func == action_move_relative_vert || a->func == action_resize_relative_horz || a->func == action_resize_relative_vert)) { action_free(a); a = NULL; } if (a == NULL) { g_warning("Invalid action '%s' in '%s' on line %d", action, path, lineno); return; } if (!mbind(button, context, mact, a)) { action_free(a); g_warning("Unable to add binding '%s %s %s %s'", context, event, button, action); } } static int mparsewrap() { g_free(context); g_free(event); g_free(button); g_free(action); return 1; } void mouserc_parse() { path = g_build_filename(g_get_home_dir(), ".openbox", "mouserc", NULL); if ((mparsein = fopen(path, "r")) == NULL) { g_free(path); path = g_build_filename(RCDIR, "mouserc", NULL); if ((mparsein = fopen(path, "r")) == NULL) { g_warning("No mouserc file found!"); g_free(path); return; } } lineno = 1; error = FALSE; context = event = button = action = NULL; mparselex(); g_free(path); }