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):
|
||||
global _motion_mask, _inmove, _inresize;
|
||||
|
||||
if data.action == ob.KeyAction.Release:
|
||||
# have all the modifiers this started with been released?
|
||||
if not _motion_mask & data.state:
|
||||
if _inmove:
|
||||
_end_move(data)
|
||||
elif _inresize:
|
||||
_end_resize(data)
|
||||
else:
|
||||
raise RuntimeError
|
||||
# are all the modifiers this started with still pressed?
|
||||
print _motion_mask, data.state
|
||||
if not _motion_mask == data.state:
|
||||
if _inmove:
|
||||
_end_move(data)
|
||||
elif _inresize:
|
||||
_end_resize(data)
|
||||
else:
|
||||
raise RuntimeError
|
||||
|
||||
_last_x = 0
|
||||
_last_y = 0
|
||||
|
@ -160,13 +160,14 @@ def _move(data):
|
|||
# not-normal windows dont get moved
|
||||
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
|
||||
_client = data.client
|
||||
_cx = data.press_clientx
|
||||
_cy = data.press_clienty
|
||||
_dx = data.xroot - data.pressx
|
||||
_dy = data.yroot - data.pressy
|
||||
_motion_mask = data.state
|
||||
_do_move()
|
||||
global _inmove
|
||||
if not _inmove:
|
||||
|
@ -245,6 +246,7 @@ def _resize(data):
|
|||
if not data.client.normal(): return
|
||||
|
||||
global _screen, _client, _cx, _cy, _cw, _ch, _px, _py, _dx, _dy
|
||||
global _motion_mask
|
||||
_screen = data.screen
|
||||
_client = data.client
|
||||
_cx = data.press_clientx
|
||||
|
@ -255,6 +257,7 @@ def _resize(data):
|
|||
_py = data.pressy
|
||||
_dx = data.xroot - _px
|
||||
_dy = data.yroot - _py
|
||||
_motion_mask = data.state
|
||||
_do_resize()
|
||||
global _inresize
|
||||
if not _inresize:
|
||||
|
|
|
@ -218,15 +218,18 @@ class _cycledata:
|
|||
done = 0
|
||||
notreverting = 1
|
||||
# have all the modifiers this started with been released?
|
||||
if (data.action == ob.KeyAction.Release and
|
||||
not self.state & data.state):
|
||||
if not self.state == data.state:
|
||||
done = 1
|
||||
# has Escape been pressed?
|
||||
elif data.action == ob.KeyAction.Press and data.key == "Escape":
|
||||
done = 1
|
||||
notreverting = 0
|
||||
# revert
|
||||
self.menupos = 0
|
||||
elif data.action == ob.KeyAction.Press:
|
||||
# has Escape been pressed?
|
||||
if data.key == "Escape":
|
||||
done = 1
|
||||
notreverting = 0
|
||||
# revert
|
||||
self.menupos = 0
|
||||
# has Enter been pressed?
|
||||
elif data.key == "Return":
|
||||
done = 1
|
||||
|
||||
if done:
|
||||
# activate, and deiconify/unshade/raise
|
||||
|
|
|
@ -230,6 +230,26 @@ void Actions::keyPressHandler(const XKeyEvent &e)
|
|||
// kill off the Button1Mask etc, only want the modifiers
|
||||
unsigned int state = e.state & (ControlMask | ShiftMask | Mod1Mask |
|
||||
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()->
|
||||
fireKey(otk::display->findScreen(e.root)->screen(),
|
||||
state, e.keycode, e.time, KeyAction::Press);
|
||||
|
|
Loading…
Reference in a new issue