the bindings tree might work now
This commit is contained in:
parent
ee14d8a3cc
commit
35c3e996b5
3 changed files with 46 additions and 7 deletions
|
@ -40,14 +40,52 @@ void OBBindings::display()
|
||||||
|
|
||||||
bool OBBindings::translate(const std::string &str, Binding &b)
|
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('-');
|
std::string::size_type keybegin = str.find_last_of('-');
|
||||||
std::string key(str, keybegin != std::string::npos ? keybegin + 1 : 0);
|
keybegin = (keybegin == std::string::npos) ? 0 : keybegin + 1;
|
||||||
|
std::string key(str, keybegin);
|
||||||
|
|
||||||
// XXX: get some modifiers up in the hizzie
|
// XXX: get some modifiers up in the hizzie
|
||||||
|
// parse out the requested modifier keys
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
printf("got modifier: got modifier: %s\n", mod.c_str());
|
||||||
|
|
||||||
|
begin = end + 1;
|
||||||
|
}
|
||||||
|
|
||||||
KeySym sym = XStringToKeysym(const_cast<char *>(key.c_str()));
|
KeySym sym = XStringToKeysym(const_cast<char *>(key.c_str()));
|
||||||
if (sym == NoSymbol) return false;
|
if (sym == NoSymbol) return false;
|
||||||
b.modifiers = Mod1Mask; // XXX: no way
|
b.modifiers = mods;
|
||||||
b.key = XKeysymToKeycode(otk::OBDisplay::display, sym);
|
b.key = XKeysymToKeycode(otk::OBDisplay::display, sym);
|
||||||
return b.key != 0;
|
return b.key != 0;
|
||||||
}
|
}
|
||||||
|
@ -111,7 +149,7 @@ OBBindings::~OBBindings()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void assimilate(BindingTree *parent, BindingTree *node)
|
void OBBindings::assimilate(BindingTree *node)
|
||||||
{
|
{
|
||||||
BindingTree *a, *b, *tmp, *last;
|
BindingTree *a, *b, *tmp, *last;
|
||||||
|
|
||||||
|
@ -128,9 +166,9 @@ static void assimilate(BindingTree *parent, BindingTree *node)
|
||||||
if (a->binding != b->binding) {
|
if (a->binding != b->binding) {
|
||||||
a = a->next_sibling;
|
a = a->next_sibling;
|
||||||
} else {
|
} else {
|
||||||
tmp = b;
|
tmp = b;
|
||||||
b = b->first_child;
|
b = b->first_child;
|
||||||
delete tmp;
|
delete tmp;
|
||||||
a = a->first_child;
|
a = a->first_child;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -206,7 +244,7 @@ bool OBBindings::add(const StringVect &keylist, int id)
|
||||||
}
|
}
|
||||||
|
|
||||||
// assimilate this built tree into the main tree
|
// assimilate this built tree into the main tree
|
||||||
assimilate(&_tree, tree); // assimilation destroys/uses the tree
|
assimilate(tree); // assimilation destroys/uses the tree
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -51,6 +51,7 @@ private:
|
||||||
int find(BindingTree *search);
|
int find(BindingTree *search);
|
||||||
bool translate(const std::string &str, Binding &b);
|
bool translate(const std::string &str, Binding &b);
|
||||||
BindingTree *buildtree(const StringVect &keylist, int id);
|
BindingTree *buildtree(const StringVect &keylist, int id);
|
||||||
|
void OBBindings::assimilate(BindingTree *node);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
//! Initializes an OBBinding object
|
//! Initializes an OBBinding object
|
||||||
|
|
|
@ -150,7 +150,7 @@ Openbox::Openbox(int argc, char **argv)
|
||||||
_bindings = new OBBindings();
|
_bindings = new OBBindings();
|
||||||
|
|
||||||
OBBindings::StringVect v;
|
OBBindings::StringVect v;
|
||||||
v.push_back("C-x");
|
v.push_back("C-A-x");
|
||||||
v.push_back("C-y");
|
v.push_back("C-y");
|
||||||
v.push_back("v");
|
v.push_back("v");
|
||||||
_bindings->add(v, 1);
|
_bindings->add(v, 1);
|
||||||
|
|
Loading…
Reference in a new issue