diff options
Diffstat (limited to 'util/epist/parser.cc')
| -rw-r--r-- | util/epist/parser.cc | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/util/epist/parser.cc b/util/epist/parser.cc new file mode 100644 index 00000000..660a876f --- /dev/null +++ b/util/epist/parser.cc @@ -0,0 +1,145 @@ +extern "C" { +#include <stdio.h> +} +#include "parser.hh" + +parser::parser(keytree *kt) + : _mask(0), _action(Action::noaction), _key(""), _arg(""), _kt(kt) +{ +} + +parser::~parser() +{ + // nothing to see here. move along. +} + +void parser::parse(string rc_file) +{ + extern int yyparse(void *); + extern FILE *yyin; + + yyin = fopen(rc_file.c_str(), "r"); + + yyparse(this); + + fclose(yyin); + _kt->reset(); +} + +void parser::setAction(string act) +{ + struct { + string str; + Action::ActionType act; + } + actions[] = { + { "noaction", Action::noaction }, + { "execute", Action::execute }, + { "iconify", Action::iconify }, + { "raise", Action::raise }, + { "lower", Action::lower }, + { "close", Action::close }, + { "toggleshade", Action::toggleshade }, + { "toggleomnipresent", Action::toggleomnipresent }, + { "moveWindowUp", Action::moveWindowUp }, + { "moveWindowDown", Action::moveWindowDown }, + { "moveWindowLeft", Action::moveWindowLeft }, + { "moveWindowRight", Action::moveWindowRight }, + { "resizeWindowWidth", Action::resizeWindowWidth }, + { "resizeWindowHeight", Action::resizeWindowHeight }, + { "toggleMaximizeFull", Action::toggleMaximizeFull }, + { "toggleMaximizeVertical", Action::toggleMaximizeVertical }, + { "toggleMaximizeHorizontal", Action::toggleMaximizeHorizontal }, + { "sendToWorkspace", Action::sendToWorkspace }, + { "nextWindow", Action::nextWindow }, + { "prevWindow", Action::prevWindow }, + { "nextWindowOnAllWorkspaces", Action::nextWindowOnAllWorkspaces }, + { "prevWindowOnAllWorkspaces", Action::prevWindowOnAllWorkspaces }, + { "nextWindowOnAllScreens", Action::nextWindowOnAllScreens }, + { "prevWindowOnAllScreens", Action::prevWindowOnAllScreens }, + { "nextWindowOfClass", Action::nextWindowOfClass }, + { "prevWindowOfClass", Action::prevWindowOfClass }, + { "nextWindowOfClassOnAllWorkspaces", Action::nextWindowOfClassOnAllWorkspaces }, + { "prevWindowOfClassOnAllWorkspaces", Action::prevWindowOfClassOnAllWorkspaces }, + { "changeWorkspace", Action::changeWorkspace }, + { "nextWorkspace", Action::nextWorkspace }, + { "prevWorkspace", Action::prevWorkspace }, + { "nextScreen", Action::nextScreen }, + { "prevScreen", Action::prevScreen }, + { "showRootMenu", Action::showRootMenu }, + { "showWorkspaceMenu", Action::showWorkspaceMenu }, + { "stringChain", Action::stringChain }, + { "keyChain", Action::keyChain }, + { "numberChain", Action::numberChain }, + { "cancel", Action::cancel }, + { "", Action::noaction } + }; + + bool found = false; + + for (int i = 0; actions[i].str != ""; ++i) { + if (actions[i].str == act) { + _action = actions[i].act; + found = true; + } + } + + if (!found) + _action = Action::noaction; +} + +void parser::addModifier(string mod) +{ + struct { + string str; + unsigned int mask; + } + modifiers[] = { + { "Mod1", Mod1Mask }, + { "Mod2", Mod2Mask }, + { "Mod3", Mod3Mask }, + { "Control", ControlMask }, + { "Shift", ShiftMask }, + { "", 0 } + }; + + for (int i = 0; modifiers[i].str != ""; ++i) { + if (modifiers[i].str == mod) + _mask |= modifiers[i].mask; + } +} + +void parser::endAction() +{ + _kt->addAction(_action, _mask, _key, _arg); + reset(); +} + +void parser::startChain() +{ + _kt->advanceOnNewNode(); + setChainBinding(); + reset(); +} + +void parser::endChain() +{ + _kt->retract(); + reset(); +} + +void parser::setChainBinding() +{ + if (_mask != 0 && _key != "") { + _kt->setCurrentNodeProps(Action::noaction, _mask, _key, ""); + reset(); + } +} + +void parser::reset() +{ + _mask = 0; + _action = Action::noaction; + _key = ""; + _arg = ""; +} |
