all repos — openbox @ 2037631f753753a5c1ee9b2475b55658c3bb6eea

openbox fork - make it a bit more like ryudo

Fixing the stupid case when an invalid key is given and epist would hog the keyboard
Marius Nita marius@cs.pdx.edu
commit

2037631f753753a5c1ee9b2475b55658c3bb6eea

parent

5bb8616d44345e1f1896d94af9ea257439234179

1 files changed, 24 insertions(+), 10 deletions(-)

jump to
M util/epist/keytree.ccutil/epist/keytree.cc

@@ -29,6 +29,7 @@ #include "epist.hh"

#include "config.hh" #include <string> +#include <iostream> using std::string;

@@ -84,18 +85,26 @@ }

void keytree::ungrabDefaults(screen *scr) { + Action *act; + ChildList::const_iterator it, end = _head->children.end(); - for (it = _head->children.begin(); it != end; ++it) - if ( (*it)->action && (*it)->action->type() != Action::toggleGrabs) - scr->ungrabKey( (*it)->action->keycode(), (*it)->action->modifierMask() ); + for (it = _head->children.begin(); it != end; ++it) { + act = (*it)->action; + if (act && act->type() != Action::toggleGrabs) + scr->ungrabKey(act->keycode(), act->modifierMask()); + } } void keytree::grabChildren(keynode *node, screen *scr) { + Action *act; + ChildList::const_iterator it, end = node->children.end(); - for (it = node->children.begin(); it != end; ++it) - if ( (*it)->action ) - scr->grabKey( (*it)->action->keycode(), (*it)->action->modifierMask() ); + for (it = node->children.begin(); it != end; ++it) { + act = (*it)->action; + if (act) + scr->grabKey(act->keycode(), act->modifierMask()); + } } void keytree::ungrabChildren(keynode *node, screen *scr)

@@ -178,8 +187,6 @@

void keytree::addAction(Action::ActionType action, unsigned int mask, string key, string arg) { - keynode *tmp = new keynode; - if (action == Action::toggleGrabs && _current != _head) { // the toggleGrabs key can only be set up as a root key, since if // it was a chain key, we'd have to not ungrab the whole chain up

@@ -187,9 +194,16 @@ // to that key. which kinda defeats the purpose of this function.

return; } + KeySym sym = XStringToKeysym(key.c_str()); + + if (sym == 0) { + std::cerr << "Key " << key << " is invalid! (Action ignored)\n"; + return; + } + + keynode *tmp = new keynode; tmp->action = new Action(action, - XKeysymToKeycode(_display, - XStringToKeysym(key.c_str())), + XKeysymToKeycode(_display, sym), mask, arg); tmp->parent = _current; _current->children.push_back(tmp);