}
+static bool modvalue(const std::string &mod, unsigned int *val)
+{
+ if (mod == "C") { // control
+ *val |= ControlMask;
+ } else if (mod == "S") { // shift
+ *val |= ShiftMask;
+ } else if (mod == "A" || // alt/mod1
+ mod == "M" ||
+ mod == "M1" ||
+ mod == "Mod1") {
+ *val |= Mod1Mask;
+ } else if (mod == "M2" || // mod2
+ mod == "Mod2") {
+ *val |= Mod2Mask;
+ } else if (mod == "M3" || // mod3
+ mod == "Mod3") {
+ *val |= Mod3Mask;
+ } else if (mod == "W" || // windows/mod4
+ mod == "M4" ||
+ mod == "Mod4") {
+ *val |= Mod4Mask;
+ } else if (mod == "M5" || // mod5
+ mod == "Mod5") {
+ *val |= Mod5Mask;
+ } else { // invalid
+ return false;
+ }
+ return true;
+}
bool OBBindings::translate(const std::string &str, Binding &b)
{
- unsigned int mods = 0;
-
// parse out the base key name
std::string::size_type keybegin = str.find_last_of('-');
keybegin = (keybegin == std::string::npos) ? 0 : keybegin + 1;
std::string key(str, keybegin);
- // XXX: get some modifiers up in the hizzie
// parse out the requested modifier keys
+ unsigned int modval = 0;
std::string::size_type begin = 0, end;
while (begin != keybegin) {
end = str.find_first_of('-', begin);
std::string mod(str, begin, end-begin);
-
- if (mod == "C") { // control
- mods |= ControlMask;
- } else if (mod == "S") { // shift
- mods |= ShiftMask;
- } else if (mod == "A" || // alt/mod1
- mod == "M" ||
- mod == "M1" ||
- mod == "Mod1") {
- mods |= Mod1Mask;
- } else if (mod == "M2" || // mod2
- mod == "Mod2") {
- mods |= Mod2Mask;
- } else if (mod == "M3" || // mod3
- mod == "Mod3") {
- mods |= Mod3Mask;
- } else if (mod == "W" || // windows/mod4
- mod == "M4" ||
- mod == "Mod4") {
- mods |= Mod4Mask;
- } else if (mod == "M5" || // mod5
- mod == "Mod5") {
- mods |= Mod5Mask;
- } else { // invalid
+ if (!modvalue(mod, &modval)) {
printf(_("Invalid modifier element in key binding: %s\n"), mod.c_str());
return false;
}
+
begin = end + 1;
}
-
+
+ // set the binding
KeySym sym = XStringToKeysym(const_cast<char *>(key.c_str()));
if (sym == NoSymbol) return false;
- b.modifiers = mods;
+ b.modifiers = modval;
b.key = XKeysymToKeycode(otk::OBDisplay::display, sym);
return b.key != 0;
}
+static void destroytree(BindingTree *tree)
+{
+ while (tree) {
+ BindingTree *c = tree->first_child;
+ delete tree;
+ tree = c;
+ }
+}
+
BindingTree *OBBindings::buildtree(const StringVect &keylist, int id)
{
if (keylist.empty()) return 0; // nothing in the list.. return 0
- BindingTree *ret = new BindingTree(id), *p = 0;
+ BindingTree *ret = 0, *p;
- StringVect::const_iterator it, end = keylist.end();
- for (it = keylist.begin(); it != end; ++it) {
- if (p)
- p = p->first_child = new BindingTree(id);
- else
- p = ret; // the first node
-
- if (!translate(*it, p->binding))
- break;
- p->text = *it;
- }
- if (it != end) {
- // build failed.. clean up and return 0
+ StringVect::const_reverse_iterator it, end = keylist.rend();
+ for (it = keylist.rbegin(); it != end; ++it) {
p = ret;
- while (p->first_child) {
- BindingTree *c = p->first_child;
- delete p;
- p = c;
+ ret = new BindingTree(id);
+ if (!p) ret->chain = false;
+ ret->first_child = p;
+ if (!translate(*it, ret->binding)) {
+ destroytree(ret);
+ ret = 0;
+ break;
}
- delete p;
- return 0;
- } else {
- // set the proper chain status on the last node
- p->chain = false;
+ ret->text = *it; // XXX: rm me
}
-
-// printf("BUILDING:\n");
-// print_branch(ret, "");
-
- // successfully built a tree
return ret;
}
-static void destroytree(BindingTree *tree)
-{
- while (tree) {
- BindingTree *c = tree->first_child;
- delete tree;
- tree = c;
- }
-}
OBBindings::OBBindings()
{