new key code with keyboard grabs and such, thanks to ManMower. Kills the "key leak" bug, and makes everything work better and faster! woot
This commit is contained in:
parent
4eaa65510b
commit
e429ce39de
4 changed files with 44 additions and 41 deletions
|
@ -300,4 +300,9 @@ void Display::ungrabKey(unsigned int keycode, unsigned int modifiers,
|
||||||
grab_window);
|
grab_window);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Display::ungrabAllKeys(Window grab_window) const
|
||||||
|
{
|
||||||
|
XUngrabKey(_display, AnyKey, AnyModifier, grab_window);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -133,6 +133,7 @@ public:
|
||||||
bool allow_scroll_lock) const;
|
bool allow_scroll_lock) const;
|
||||||
void ungrabKey(unsigned int keycode, unsigned int modifiers,
|
void ungrabKey(unsigned int keycode, unsigned int modifiers,
|
||||||
Window grab_window) const;
|
Window grab_window) const;
|
||||||
|
void ungrabAllKeys(Window grab_window) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -145,9 +145,10 @@ Bindings::Bindings()
|
||||||
: _curpos(&_keytree),
|
: _curpos(&_keytree),
|
||||||
_resetkey(0,0),
|
_resetkey(0,0),
|
||||||
_timer((otk::Timer *) 0),
|
_timer((otk::Timer *) 0),
|
||||||
_keybgrab_callback(0, 0)
|
_keybgrab_callback(0, 0),
|
||||||
|
_grabbed(0)
|
||||||
{
|
{
|
||||||
// setResetKey("C-g"); // set the default reset key
|
setResetKey("C-g"); // set the default reset key
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -155,7 +156,10 @@ Bindings::~Bindings()
|
||||||
{
|
{
|
||||||
if (_timer)
|
if (_timer)
|
||||||
delete _timer;
|
delete _timer;
|
||||||
|
if (_grabbed) {
|
||||||
|
_grabbed = false;
|
||||||
|
XUngrabKeyboard(**otk::display, CurrentTime);
|
||||||
|
}
|
||||||
removeAllKeys();
|
removeAllKeys();
|
||||||
//removeAllButtons(); // this is done by each client as they are unmanaged
|
//removeAllButtons(); // this is done by each client as they are unmanaged
|
||||||
removeAllEvents();
|
removeAllEvents();
|
||||||
|
@ -296,13 +300,8 @@ void Bindings::setResetKey(const std::string &key)
|
||||||
{
|
{
|
||||||
Binding b(0, 0);
|
Binding b(0, 0);
|
||||||
if (translate(key, b)) {
|
if (translate(key, b)) {
|
||||||
// grab the server here to make sure no key pressed go missed
|
|
||||||
otk::display->grab();
|
|
||||||
grabKeys(false);
|
|
||||||
_resetkey.key = b.key;
|
_resetkey.key = b.key;
|
||||||
_resetkey.modifiers = b.modifiers;
|
_resetkey.modifiers = b.modifiers;
|
||||||
grabKeys(true);
|
|
||||||
otk::display->ungrab();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -341,28 +340,17 @@ void Bindings::grabKeys(bool grab)
|
||||||
Screen *sc = openbox->screen(i);
|
Screen *sc = openbox->screen(i);
|
||||||
if (!sc) continue; // not a managed screen
|
if (!sc) continue; // not a managed screen
|
||||||
Window root = otk::display->screenInfo(i)->rootWindow();
|
Window root = otk::display->screenInfo(i)->rootWindow();
|
||||||
|
if (!grab) {
|
||||||
KeyBindingTree *p = _curpos->first_child;
|
otk::display->ungrabAllKeys(root);
|
||||||
while (p) {
|
continue;
|
||||||
if (grab) {
|
|
||||||
otk::display->grabKey(p->binding.key, p->binding.modifiers,
|
|
||||||
root, false, GrabModeAsync, GrabModeAsync,
|
|
||||||
false);
|
|
||||||
}
|
}
|
||||||
else
|
KeyBindingTree *p = _keytree.first_child;
|
||||||
otk::display->ungrabKey(p->binding.key, p->binding.modifiers,
|
while (p) {
|
||||||
root);
|
otk::display->grabKey(p->binding.key, p->binding.modifiers,
|
||||||
|
root, false, GrabModeAsync, GrabModeSync,
|
||||||
|
false);
|
||||||
p = p->next_sibling;
|
p = p->next_sibling;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_resetkey.key)
|
|
||||||
if (grab)
|
|
||||||
otk::display->grabKey(_resetkey.key, _resetkey.modifiers,
|
|
||||||
root, false, GrabModeAsync, GrabModeAsync,
|
|
||||||
false);
|
|
||||||
else
|
|
||||||
otk::display->ungrabKey(_resetkey.key, _resetkey.modifiers,
|
|
||||||
root);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -390,6 +378,7 @@ void Bindings::ungrabKeyboard()
|
||||||
if (!_keybgrab_callback.callback) return; // not grabbed
|
if (!_keybgrab_callback.callback) return; // not grabbed
|
||||||
|
|
||||||
_keybgrab_callback = KeyCallbackData(0, 0);
|
_keybgrab_callback = KeyCallbackData(0, 0);
|
||||||
|
if (!_grabbed) /* don't release out from under keychains */
|
||||||
XUngrabKeyboard(**otk::display, CurrentTime);
|
XUngrabKeyboard(**otk::display, CurrentTime);
|
||||||
XUngrabPointer(**otk::display, CurrentTime);
|
XUngrabPointer(**otk::display, CurrentTime);
|
||||||
}
|
}
|
||||||
|
@ -427,6 +416,7 @@ void Bindings::fireKey(int screen, unsigned int modifiers, unsigned int key,
|
||||||
|
|
||||||
if (key == _resetkey.key && modifiers == _resetkey.modifiers) {
|
if (key == _resetkey.key && modifiers == _resetkey.modifiers) {
|
||||||
resetChains(this);
|
resetChains(this);
|
||||||
|
XAllowEvents(**otk::display, AsyncKeyboard, CurrentTime);
|
||||||
} else {
|
} else {
|
||||||
KeyBindingTree *p = _curpos->first_child;
|
KeyBindingTree *p = _curpos->first_child;
|
||||||
while (p) {
|
while (p) {
|
||||||
|
@ -437,18 +427,23 @@ void Bindings::fireKey(int screen, unsigned int modifiers, unsigned int key,
|
||||||
_timer = new otk::Timer(5000, // 5 second timeout
|
_timer = new otk::Timer(5000, // 5 second timeout
|
||||||
(otk::Timer::TimeoutHandler)resetChains,
|
(otk::Timer::TimeoutHandler)resetChains,
|
||||||
this);
|
this);
|
||||||
// grab the server here to make sure no key presses get missed
|
if (!_grabbed && !_keybgrab_callback.callback) {
|
||||||
otk::display->grab();
|
Window root = otk::display->screenInfo(screen)->rootWindow();
|
||||||
grabKeys(false);
|
//grab should never fail because we should have a sync grab at
|
||||||
|
//this point
|
||||||
|
XGrabKeyboard(**otk::display, root, 0, GrabModeAsync,
|
||||||
|
GrabModeSync, CurrentTime);
|
||||||
|
_grabbed = true;
|
||||||
_curpos = p;
|
_curpos = p;
|
||||||
grabKeys(true);
|
}
|
||||||
otk::display->ungrab();
|
XAllowEvents(**otk::display, AsyncKeyboard, CurrentTime);
|
||||||
} else {
|
} else {
|
||||||
Client *c = openbox->focusedClient();
|
Client *c = openbox->focusedClient();
|
||||||
KeyData data(screen, c, time, modifiers, key, action);
|
KeyData data(screen, c, time, modifiers, key, action);
|
||||||
KeyCallbackList::iterator it, end = p->callbacks.end();
|
KeyCallbackList::iterator it, end = p->callbacks.end();
|
||||||
for (it = p->callbacks.begin(); it != end; ++it)
|
for (it = p->callbacks.begin(); it != end; ++it)
|
||||||
it->fire(&data);
|
it->fire(&data);
|
||||||
|
XAllowEvents(**otk::display, AsyncKeyboard, CurrentTime);
|
||||||
resetChains(this);
|
resetChains(this);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -464,12 +459,12 @@ void Bindings::resetChains(Bindings *self)
|
||||||
delete self->_timer;
|
delete self->_timer;
|
||||||
self->_timer = (otk::Timer *) 0;
|
self->_timer = (otk::Timer *) 0;
|
||||||
}
|
}
|
||||||
// grab the server here to make sure no key pressed go missed
|
|
||||||
otk::display->grab();
|
|
||||||
self->grabKeys(false);
|
|
||||||
self->_curpos = &self->_keytree;
|
self->_curpos = &self->_keytree;
|
||||||
self->grabKeys(true);
|
if (self->_grabbed) {
|
||||||
otk::display->ungrab();
|
self->_grabbed = false;
|
||||||
|
if (!self->_keybgrab_callback.callback)
|
||||||
|
XUngrabKeyboard(**otk::display, CurrentTime);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -117,6 +117,8 @@ private:
|
||||||
|
|
||||||
KeyCallbackData _keybgrab_callback;
|
KeyCallbackData _keybgrab_callback;
|
||||||
|
|
||||||
|
bool _grabbed;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
//! Initializes an Bindings object
|
//! Initializes an Bindings object
|
||||||
Bindings();
|
Bindings();
|
||||||
|
|
Loading…
Reference in a new issue