add the lexer
This commit is contained in:
parent
647b4ff43f
commit
9f064164a4
3 changed files with 277 additions and 1 deletions
|
@ -7,5 +7,4 @@ Makefile.in
|
|||
translate.lo
|
||||
lex.mparse.c
|
||||
lex.mparse.lo
|
||||
mouserc_parse.l
|
||||
mouserc_parse.lo
|
||||
|
|
|
@ -1,3 +1,52 @@
|
|||
# Mouserc - Mouse bindings for Openbox
|
||||
|
||||
# Context : The place where the mouse click takes place
|
||||
# * Titlebar - A client's titlebar (the top of the frame)
|
||||
# * Handle - A client's handle (the bottom of the frame)
|
||||
# * Client - A client (the actual window inside the frame, clicks in this
|
||||
# context also get passed through to the client)
|
||||
# * Frame - A client's entire frame (clicks in this context do not get passed
|
||||
# through to the client)
|
||||
# * Icon - A client's icon (in the titlebar)
|
||||
# * AllDesktops - A client's omnipresent button (in the titlebar)
|
||||
# * Iconify - A client's iconify button (in the titlebar)
|
||||
# * Maximize - A client's maximize button (in the titlebar)
|
||||
# * Close - A client's close button (in the titlebar)
|
||||
# * Root - The root window (the desktop background, these are often blocked
|
||||
# by programs with desktop windows, and are not
|
||||
# available on rootless X servers (like OSX))
|
||||
# * TLCorner - The top-left corner of the frame (if supported by the
|
||||
# engine)
|
||||
# * TRCorner - The top-right corner of the frame (if supported by the
|
||||
# engine)
|
||||
# * BLCorner - The bottom-left corner of the frame (if supported by the
|
||||
# engine)
|
||||
# * BRCorner - The bottom-right corner of the frame (if supported by the
|
||||
# engine)
|
||||
# Other contexts may be created by engines.
|
||||
|
||||
# Event : The type of mouse action to bind
|
||||
# * Press - A button is pressed
|
||||
# * Release - A button is released
|
||||
# * Click - A button is pressed and released
|
||||
# * DoubleClick - A button is pressed and released twice quickly
|
||||
# * Drag - A button is held and the mouse is moved
|
||||
|
||||
# Button : The mouse button which is performing the Event
|
||||
# A string composed of [<modifier>-]<button>. A button can have 0 or more
|
||||
# modifiers.
|
||||
# Valid modifiers are Mod1 ('A' is an alias for this), Mod2, Mod3, Mod4 ('W'
|
||||
# is an alias for this), and Mod5.
|
||||
# Valid buttons are Left, Right, Middle, Up, Down, or any number > 0
|
||||
|
||||
# Action: The action to be performed then the Event occurs with the Button in
|
||||
# the context.
|
||||
# Value actions are:
|
||||
# * Focus - Focus the client
|
||||
#
|
||||
|
||||
# All options are case insensitive.
|
||||
|
||||
#Context Event Button Action
|
||||
|
||||
Titlebar Drag Left Move
|
||||
|
|
228
plugins/mouse/mouserc_parse.l
Normal file
228
plugins/mouse/mouserc_parse.l
Normal file
|
@ -0,0 +1,228 @@
|
|||
%{
|
||||
#include "mouse.h"
|
||||
#include <glib.h>
|
||||
#ifdef HAVE_STDIO_H
|
||||
# include <stdio.h>
|
||||
#endif
|
||||
|
||||
static int lineno;
|
||||
static char *path;
|
||||
static gboolean comment;
|
||||
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]+
|
||||
sep [ \t]+
|
||||
white [ \t]*
|
||||
|
||||
%%
|
||||
|
||||
^{white}# comment = TRUE;
|
||||
{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 (!comment) {
|
||||
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);
|
||||
}
|
||||
|
||||
comment = 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;
|
||||
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;
|
||||
}
|
||||
|
||||
if (!g_ascii_strcasecmp(action, "focus")) {
|
||||
a = action_new(action_focus);
|
||||
} else if (!g_ascii_strcasecmp(action, "unfocus")) {
|
||||
a = action_new(action_unfocus);
|
||||
} else if (!g_ascii_strcasecmp(action, "iconify")) {
|
||||
a = action_new(action_iconify);
|
||||
} else if (!g_ascii_strcasecmp(action, "raise")) {
|
||||
a = action_new(action_raise);
|
||||
} else if (!g_ascii_strcasecmp(action, "lower")) {
|
||||
a = action_new(action_lower);
|
||||
} else if (!g_ascii_strcasecmp(action, "focusraise")) {
|
||||
a = action_new(action_focusraise);
|
||||
} else if (!g_ascii_strcasecmp(action, "close")) {
|
||||
a = action_new(action_close);
|
||||
} else if (!g_ascii_strcasecmp(action, "kill")) {
|
||||
a = action_new(action_kill);
|
||||
} else if (!g_ascii_strcasecmp(action, "shade")) {
|
||||
a = action_new(action_shade);
|
||||
} else if (!g_ascii_strcasecmp(action, "unshade")) {
|
||||
a = action_new(action_unshade);
|
||||
} else if (!g_ascii_strcasecmp(action, "toggleshade")) {
|
||||
a = action_new(action_toggle_shade);
|
||||
} else if (!g_ascii_strcasecmp(action, "toggleomnipresent")) {
|
||||
a = action_new(action_toggle_omnipresent);
|
||||
} else if (!g_ascii_strcasecmp(action, "maximizefull")) {
|
||||
a = action_new(action_maximize_full);
|
||||
} else if (!g_ascii_strcasecmp(action, "unmaximizefull")) {
|
||||
a = action_new(action_unmaximize_full);
|
||||
} else if (!g_ascii_strcasecmp(action, "togglemaximizefull")) {
|
||||
a = action_new(action_toggle_maximize_full);
|
||||
} else if (!g_ascii_strcasecmp(action, "maximizehorz")) {
|
||||
a = action_new(action_maximize_horz);
|
||||
} else if (!g_ascii_strcasecmp(action, "unmaximizehorz")) {
|
||||
a = action_new(action_unmaximize_horz);
|
||||
} else if (!g_ascii_strcasecmp(action, "togglemaximizehorz")) {
|
||||
a = action_new(action_toggle_maximize_horz);
|
||||
} else if (!g_ascii_strcasecmp(action, "maximizevert")) {
|
||||
a = action_new(action_maximize_vert);
|
||||
} else if (!g_ascii_strcasecmp(action, "unmaximizevert")) {
|
||||
a = action_new(action_unmaximize_vert);
|
||||
} else if (!g_ascii_strcasecmp(action, "togglemaximizevert")) {
|
||||
a = action_new(action_toggle_maximize_vert);
|
||||
} else if (!g_ascii_strcasecmp(action, "sendtonextdesktop")) {
|
||||
a = action_new(action_send_to_next_desktop);
|
||||
a->data.sendtonextprev.wrap = FALSE;
|
||||
a->data.sendtonextprev.follow = TRUE;
|
||||
} else if (!g_ascii_strcasecmp(action, "sendtonextdesktopwrap")) {
|
||||
a = action_new(action_send_to_next_desktop);
|
||||
a->data.sendtonextprev.wrap = TRUE;
|
||||
a->data.sendtonextprev.follow = TRUE;
|
||||
} else if (!g_ascii_strcasecmp(action, "sendtopreviousdesktop")) {
|
||||
a = action_new(action_send_to_previous_desktop);
|
||||
a->data.sendtonextprev.wrap = FALSE;
|
||||
a->data.sendtonextprev.follow = TRUE;
|
||||
} else if (!g_ascii_strcasecmp(action, "sendtopreviousdesktopwrap")) {
|
||||
a = action_new(action_send_to_previous_desktop);
|
||||
a->data.sendtonextprev.wrap = TRUE;
|
||||
a->data.sendtonextprev.follow = TRUE;
|
||||
} else if (!g_ascii_strcasecmp(action, "nextdesktop")) {
|
||||
a = action_new(action_next_desktop);
|
||||
a->data.nextprevdesktop.wrap = FALSE;
|
||||
} else if (!g_ascii_strcasecmp(action, "nextdesktopwrap")) {
|
||||
a = action_new(action_next_desktop);
|
||||
a->data.nextprevdesktop.wrap = TRUE;
|
||||
} else if (!g_ascii_strcasecmp(action, "previousdesktop")) {
|
||||
a = action_new(action_previous_desktop);
|
||||
a->data.nextprevdesktop.wrap = FALSE;
|
||||
} else if (!g_ascii_strcasecmp(action, "previousdesktopwrap")) {
|
||||
a = action_new(action_previous_desktop);
|
||||
a->data.nextprevdesktop.wrap = TRUE;
|
||||
} else if (!g_ascii_strcasecmp(action, "nextdesktopcolumn")) {
|
||||
a = action_new(action_next_desktop_column);
|
||||
a->data.nextprevdesktop.wrap = FALSE;
|
||||
} else if (!g_ascii_strcasecmp(action, "nextdesktopcolumnwrap")) {
|
||||
a = action_new(action_next_desktop_column);
|
||||
a->data.nextprevdesktop.wrap = TRUE;
|
||||
} else if (!g_ascii_strcasecmp(action, "previousdesktopcolumn")) {
|
||||
a = action_new(action_previous_desktop_column);
|
||||
a->data.nextprevdesktop.wrap = FALSE;
|
||||
} else if (!g_ascii_strcasecmp(action, "previousdesktopcolumnwrap")) {
|
||||
a = action_new(action_previous_desktop_column);
|
||||
a->data.nextprevdesktop.wrap = TRUE;
|
||||
} else if (!g_ascii_strcasecmp(action, "nextdesktoprow")) {
|
||||
a = action_new(action_next_desktop_row);
|
||||
a->data.nextprevdesktop.wrap = FALSE;
|
||||
} else if (!g_ascii_strcasecmp(action, "nextdesktoprowwrap")) {
|
||||
a = action_new(action_next_desktop_row);
|
||||
a->data.nextprevdesktop.wrap = TRUE;
|
||||
} else if (!g_ascii_strcasecmp(action, "previousdesktoprow")) {
|
||||
a = action_new(action_previous_desktop_row);
|
||||
a->data.nextprevdesktop.wrap = FALSE;
|
||||
} else if (!g_ascii_strcasecmp(action, "previousdesktoprowwrap")) {
|
||||
a = action_new(action_previous_desktop_row);
|
||||
a->data.nextprevdesktop.wrap = TRUE;
|
||||
} else if (!g_ascii_strcasecmp(action, "move")) {
|
||||
a = action_new(action_move);
|
||||
} else if (!g_ascii_strcasecmp(action, "resize")) {
|
||||
a = action_new(action_resize);
|
||||
} else {
|
||||
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;
|
||||
comment = FALSE;
|
||||
error = FALSE;
|
||||
context = event = button = action = NULL;
|
||||
|
||||
mparselex();
|
||||
|
||||
g_free(path);
|
||||
}
|
Loading…
Reference in a new issue