############################################################################
-### Functions that provide callbacks for motion events to move and ###
-### windows. ###
+### Functions that provide callbacks for motion events to move and ###
+### resize windows. ###
############################################################################
#############################################################################
### is, 0 to resize always from the bottom right corner. ###
resize_nearest = 1 ###
### ###
+### ###
+# Provides: ###
+# def move(data): ###
+# """Moves the window interactively. This should only be used with ###
+# MouseMotion events. If move_popup or move_rubberband is enabled, ###
+# then the end_move function needs to be bound as well.""" ###
+# def end_move(data): ###
+# """Complete the interactive move of a window.""" ###
+# def resize(data): ###
+# """Resizes the window interactively. This should only be used with ###
+# MouseMotion events""" ###
+# def end_resize(data): ###
+# """Complete the interactive resize of a window.""" ###
+### ###
#############################################################################
import ob
_poplabel = 0
# motion state
-_inmotion = 0
+_inmove = 0
+_inresize = 0
# last motion data
_cx = 0
_client = 0
_screen = 0
+_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
+
def _do_move():
global _screen, _client, _cx, _cy, _dx, _dy
_poplabel = otk.Label(_popwidget)
_poplabel.setTexture(style.labelFocusBackground())
_popwidget.show(1)
- _poplabel.resize(length, font.height())
+ _poplabel.fitString(text)
_poplabel.setText(text)
area = otk.display.screenInfo(_screen).rect()
_popwidget.update()
_dx = data.xroot - data.pressx
_dy = data.yroot - data.pressy
_do_move()
- _inmotion = 1
+ global _inmove
+ if not _inmove:
+ ob.kgrab(_screen, _motion_grab)
+ _inmove = 1
def end_move(data):
"""Complete the interactive move of a window."""
- global move_rubberband, _inmotion
+ global move_rubberband, _inmove
global _popwidget, _poplabel
- if _inmotion:
+ if _inmove:
r = move_rubberband
move_rubberband = 0
_do_move()
move_rubberband = r
- _inmotion = 0
+ _inmove = 0
_poplabel = 0
_popwidget = 0
+ ob.kungrab()
def _do_resize():
global _screen, _client, _cx, _cy, _cw, _ch, _px, _py, _dx, _dy
+ dx = _dx
+ dy = _dy
+
# pick a corner to anchor
if not (resize_nearest or _context == ob.MouseContext.Grip):
corner = ob.Client.TopLeft
if y < _ch / 2:
if x < _cw / 2:
corner = ob.Client.BottomRight
- _dx *= -1
+ dx *= -1
else:
corner = ob.Client.BottomLeft
- _dy *= -1
+ dy *= -1
else:
if x < _cw / 2:
corner = ob.Client.TopRight
- _dx *= -1
+ dx *= -1
else:
corner = ob.Client.TopLeft
- w = _cw + _dx
- h = _ch + _dy
+ w = _cw + dx
+ h = _ch + dy
global resize_popup
if resize_rubberband:
_dx = data.xroot - _px
_dy = data.yroot - _py
_do_resize()
- _inmotion = 1
+ global _inresize
+ if not _inresize:
+ ob.kgrab(_screen, _motion_grab)
+ _inresize = 1
def end_resize(data):
"""Complete the interactive resize of a window."""
- global resize_rubberband, _inmotion
+ global resize_rubberband, _inresize
global _popwidget, _poplabel
- if _inmotion:
+ if _inresize:
r = resize_rubberband
resize_rubberband = 0
_do_resize()
resize_rubberband = r
- _inmotion = 0
+ _inresize = 0
_poplabel = 0
_popwidget = 0
+ ob.kungrab()