X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=util%2Fepist%2Fparser.cc;fp=util%2Fepist%2Fparser.cc;h=00be5d7e9fe8da72f6b0183a29a5bcccaf410ea1;hb=18f704edd0938355622049d853c1ce3cdfaee168;hp=d1df9f1ff1b2416cbf067b68887197b8c8dedb54;hpb=37ccfef89546e38fe8c0ab1e039a8abdff8bd588;p=chaz%2Fopenbox diff --git a/util/epist/parser.cc b/util/epist/parser.cc index d1df9f1f..00be5d7e 100644 --- a/util/epist/parser.cc +++ b/util/epist/parser.cc @@ -31,12 +31,14 @@ extern "C" { #include "parser.hh" #include +#include using std::string; +using std::cout; parser::parser(keytree *kt, Config *conf) : _kt(kt), _config(conf), _mask(0), _action(Action::noaction), - _key(""), _arg("") + _key(""), _arg(""), _add(true) { } @@ -120,39 +122,56 @@ void parser::setAction(string act) if ( strcasecmp(actions[i].str, act.c_str()) == 0 ) { _action = actions[i].act; found = true; + break; } } - if (!found) - _action = Action::noaction; + if (!found) { + cout << "ERROR: Invalid action (" << act << "). Binding ignored.\n"; + _add = false; + } } void parser::addModifier(string mod) { struct { - string str; + const char *str; unsigned int mask; } modifiers[] = { - { "Mod1", Mod1Mask }, - { "Mod2", Mod2Mask }, - { "Mod3", Mod3Mask }, - { "Mod4", Mod4Mask }, - { "Control", ControlMask }, - { "Shift", ShiftMask }, + { "mod1", Mod1Mask }, + { "mod2", Mod2Mask }, + { "mod3", Mod3Mask }, + { "mod4", Mod4Mask }, + { "mod5", Mod5Mask }, + { "control", ControlMask }, + { "shift", ShiftMask }, { "", 0 } }; + bool found = false; + for (int i = 0; modifiers[i].str != ""; ++i) { - if (modifiers[i].str == mod) + if ( strcasecmp(modifiers[i].str, mod.c_str()) == 0 ) { _mask |= modifiers[i].mask; + found = true; + break; + } + } + + if (!found) { + cout << "ERROR: Invalid modifier (" << mod << "). Binding ignored.\n"; + _add = false; } } void parser::endAction() { - _kt->addAction(_action, _mask, _key, _arg); + if (_add) + _kt->addAction(_action, _mask, _key, _arg); reset(); + + _add = true; } void parser::startChain() @@ -171,6 +190,10 @@ void parser::endChain() void parser::setChainBinding() { if (_mask != 0 && _key != "") { + if (!_add) { + cout << "Error: Bad modifier detected on chain's root key.\n"; + _add = true; + } _kt->setCurrentNodeProps(Action::noaction, _mask, _key, ""); reset(); }