]> Dogcows Code - chaz/openbox/blobdiff - util/epist/parser.cc
workaround for swig problem
[chaz/openbox] / util / epist / parser.cc
index 7741d2f7c09eb57e73ba4b9b00c36f72a12693cc..f6ed589e4ed8449eb67b28e6e7339f63ccab1667 100644 (file)
 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 // DEALINGS IN THE SOFTWARE.
 
+#ifdef    HAVE_CONFIG_H
+#  include "../../config.h"
+#endif // HAVE_CONFIG_H
+
 extern "C" {
 #include <stdio.h>
 #include <string.h>
@@ -27,12 +31,14 @@ extern "C" {
 
 #include "parser.hh"
 #include <string>
+#include <iostream>
 
 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)
 {
 }
 
@@ -48,13 +54,29 @@ void parser::parse(string rc_file)
 
   yyin = fopen(rc_file.c_str(), "r");
 
-  yyparse(this);
+  if (yyin) {
+    yyparse(this);
+    fclose(yyin);
+  } else {
+    std::cerr << "ERROR: Configuration file could not be opened/found.\n";
+  }
 
-  fclose(yyin);
   _kt->reset();
   _kt->initialize();
 }
 
+void parser::setKey(string key)
+{ 
+  KeySym sym = XStringToKeysym(key.c_str());
+
+  if (sym == 0) {
+    std::cerr << "ERROR: Invalid key (" << key << ")! This may cause odd behavior.\n";
+    _add = false;
+  } else {
+    _key = key;
+  }
+}
+
 void parser::setAction(string act)
 {
   struct {
@@ -116,39 +138,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()
@@ -166,10 +205,11 @@ void parser::endChain()
 
 void parser::setChainBinding()
 {
-  if (_mask != 0 && _key != "") {
+  if (_add)
     _kt->setCurrentNodeProps(Action::noaction, _mask, _key, "");
-    reset();
-  }
+  
+  _add = true;
+  reset();
 }
 
 void parser::reset()
This page took 0.022912 seconds and 4 git commands to generate.