make stacked cycling work without a modifier-key binding, i think. cleaner checking for modifiers in motion and stackedcycle.
This commit is contained in:
parent
5af3950710
commit
6ae8608aed
3 changed files with 44 additions and 18 deletions
|
@ -80,15 +80,15 @@ _motion_mask = 0
|
||||||
def _motion_grab(data):
|
def _motion_grab(data):
|
||||||
global _motion_mask, _inmove, _inresize;
|
global _motion_mask, _inmove, _inresize;
|
||||||
|
|
||||||
if data.action == ob.KeyAction.Release:
|
# are all the modifiers this started with still pressed?
|
||||||
# have all the modifiers this started with been released?
|
print _motion_mask, data.state
|
||||||
if not _motion_mask & data.state:
|
if not _motion_mask == data.state:
|
||||||
if _inmove:
|
if _inmove:
|
||||||
_end_move(data)
|
_end_move(data)
|
||||||
elif _inresize:
|
elif _inresize:
|
||||||
_end_resize(data)
|
_end_resize(data)
|
||||||
else:
|
else:
|
||||||
raise RuntimeError
|
raise RuntimeError
|
||||||
|
|
||||||
_last_x = 0
|
_last_x = 0
|
||||||
_last_y = 0
|
_last_y = 0
|
||||||
|
@ -160,13 +160,14 @@ def _move(data):
|
||||||
# not-normal windows dont get moved
|
# not-normal windows dont get moved
|
||||||
if not data.client.normal(): return
|
if not data.client.normal(): return
|
||||||
|
|
||||||
global _screen, _client, _cx, _cy, _dx, _dy
|
global _screen, _client, _cx, _cy, _dx, _dy, _motion_mask
|
||||||
_screen = data.screen
|
_screen = data.screen
|
||||||
_client = data.client
|
_client = data.client
|
||||||
_cx = data.press_clientx
|
_cx = data.press_clientx
|
||||||
_cy = data.press_clienty
|
_cy = data.press_clienty
|
||||||
_dx = data.xroot - data.pressx
|
_dx = data.xroot - data.pressx
|
||||||
_dy = data.yroot - data.pressy
|
_dy = data.yroot - data.pressy
|
||||||
|
_motion_mask = data.state
|
||||||
_do_move()
|
_do_move()
|
||||||
global _inmove
|
global _inmove
|
||||||
if not _inmove:
|
if not _inmove:
|
||||||
|
@ -245,6 +246,7 @@ def _resize(data):
|
||||||
if not data.client.normal(): return
|
if not data.client.normal(): return
|
||||||
|
|
||||||
global _screen, _client, _cx, _cy, _cw, _ch, _px, _py, _dx, _dy
|
global _screen, _client, _cx, _cy, _cw, _ch, _px, _py, _dx, _dy
|
||||||
|
global _motion_mask
|
||||||
_screen = data.screen
|
_screen = data.screen
|
||||||
_client = data.client
|
_client = data.client
|
||||||
_cx = data.press_clientx
|
_cx = data.press_clientx
|
||||||
|
@ -255,6 +257,7 @@ def _resize(data):
|
||||||
_py = data.pressy
|
_py = data.pressy
|
||||||
_dx = data.xroot - _px
|
_dx = data.xroot - _px
|
||||||
_dy = data.yroot - _py
|
_dy = data.yroot - _py
|
||||||
|
_motion_mask = data.state
|
||||||
_do_resize()
|
_do_resize()
|
||||||
global _inresize
|
global _inresize
|
||||||
if not _inresize:
|
if not _inresize:
|
||||||
|
|
|
@ -218,15 +218,18 @@ class _cycledata:
|
||||||
done = 0
|
done = 0
|
||||||
notreverting = 1
|
notreverting = 1
|
||||||
# have all the modifiers this started with been released?
|
# have all the modifiers this started with been released?
|
||||||
if (data.action == ob.KeyAction.Release and
|
if not self.state == data.state:
|
||||||
not self.state & data.state):
|
|
||||||
done = 1
|
done = 1
|
||||||
# has Escape been pressed?
|
elif data.action == ob.KeyAction.Press:
|
||||||
elif data.action == ob.KeyAction.Press and data.key == "Escape":
|
# has Escape been pressed?
|
||||||
done = 1
|
if data.key == "Escape":
|
||||||
notreverting = 0
|
done = 1
|
||||||
# revert
|
notreverting = 0
|
||||||
self.menupos = 0
|
# revert
|
||||||
|
self.menupos = 0
|
||||||
|
# has Enter been pressed?
|
||||||
|
elif data.key == "Return":
|
||||||
|
done = 1
|
||||||
|
|
||||||
if done:
|
if done:
|
||||||
# activate, and deiconify/unshade/raise
|
# activate, and deiconify/unshade/raise
|
||||||
|
|
|
@ -230,6 +230,26 @@ void Actions::keyPressHandler(const XKeyEvent &e)
|
||||||
// kill off the Button1Mask etc, only want the modifiers
|
// kill off the Button1Mask etc, only want the modifiers
|
||||||
unsigned int state = e.state & (ControlMask | ShiftMask | Mod1Mask |
|
unsigned int state = e.state & (ControlMask | ShiftMask | Mod1Mask |
|
||||||
Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask);
|
Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask);
|
||||||
|
|
||||||
|
// add to the state the mask of the modifier being pressed, if it is
|
||||||
|
// a modifier key being pressed (this is a little ugly..)
|
||||||
|
const XModifierKeymap *map = otk::display->modifierMap();
|
||||||
|
const int mask_table[] = {
|
||||||
|
ShiftMask, LockMask, ControlMask, Mod1Mask,
|
||||||
|
Mod2Mask, Mod3Mask, Mod4Mask, Mod5Mask
|
||||||
|
};
|
||||||
|
KeyCode *kp = map->modifiermap;
|
||||||
|
for (int i = 0, n = sizeof(mask_table)/sizeof(mask_table[0]); i < n; ++i) {
|
||||||
|
for (int k = 0; k < map->max_keypermod; ++k) {
|
||||||
|
if (*kp == e.keycode) { // found the keycode
|
||||||
|
state |= mask_table[i]; // add the mask for it
|
||||||
|
i = n; // cause the first loop to break;
|
||||||
|
break; // get outta here!
|
||||||
|
}
|
||||||
|
++kp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
openbox->bindings()->
|
openbox->bindings()->
|
||||||
fireKey(otk::display->findScreen(e.root)->screen(),
|
fireKey(otk::display->findScreen(e.root)->screen(),
|
||||||
state, e.keycode, e.time, KeyAction::Press);
|
state, e.keycode, e.time, KeyAction::Press);
|
||||||
|
|
Loading…
Reference in a new issue