############################################################################
-### Functions that provide callbacks for motion events to move and ###
-### windows. ###
+### Functions that provide callbacks for motion events to move and ###
+### resize windows. ###
############################################################################
#############################################################################
### Options that can be modified to change the functions' behaviors. ###
### ###
+# edge_resistance - the amount of resistance to provide to moving a ###
+### window past a screen boundary. Specify a value of 0 ###
+### to disable edge resistance. ###
+edge_resistance = 10 ###
+### ###
# move_popup - display a coordinates popup when moving windows. ###
move_popup = 1 ###
### ###
### 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
else:
raise RuntimeError
+_last_x = 0
+_last_y = 0
+
def _do_move():
global _screen, _client, _cx, _cy, _dx, _dy
- x = _cx + _dx
- y = _cy + _dy
+ # get destination x/y for the *frame*
+ x = _cx + _dx + _client.frame.rect().x() - _client.area().x()
+ y = _cy + _dy + _client.frame.rect().y() - _client.area().y()
+
+ global edge_resistance
+ global _last_x, _last_y
+ if edge_resistance:
+ fs = _client.frame.size()
+ w = _client.area().width() + fs.left + fs.right
+ h = _client.area().height() + fs.top + fs.bottom
+ # use the area based on the struts
+ area = ob.openbox.screen(_screen).area()
+ l = area.left()
+ r = area.right() - w + 1
+ t = area.top()
+ b = area.bottom() - h + 1
+ # left screen edge
+ if _last_x > x and x < l and x >= l - edge_resistance:
+ x = l
+ # right screen edge
+ if _last_x < x and x > r and x <= r + edge_resistance:
+ x = r
+ # top screen edge
+ if _last_y > y and y < t and y >= t - edge_resistance:
+ y = t
+ # right screen edge
+ if _last_y < y and y > b and y <= b + edge_resistance:
+ y = b
+
+ global _inmove
+ if not _inmove:
+ _last_x = 0
+ _last_y = 0
+ else:
+ _last_x = x
+ _last_y = y
global move_rubberband
if move_rubberband:
_popwidget.setTexture(style.titlebarFocusBackground())
_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()
+ area = otk.display.screenInfo(_screen).rect()
_popwidget.move(area.x() + (area.width() -
_popwidget.width()) / 2,
area.y() + (area.height() -
_popwidget.height()) / 2)
+ _popwidget.show(1)
def move(data):
"""Moves the window interactively. This should only be used with
global _inmove
if not _inmove:
ob.kgrab(_screen, _motion_grab)
- print "GRAB"
_inmove = 1
def end_move(data):
_inmove = 0
_poplabel = 0
_popwidget = 0
- print "UNGRAB"
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:
_popwidget.setTexture(style.titlebarFocusBackground())
_poplabel = otk.Label(_popwidget)
_poplabel.setTexture(style.labelFocusBackground())
- _popwidget.show(1)
_poplabel.fitString(text)
_poplabel.setText(text)
area = otk.display.screenInfo(_screen).rect()
_popwidget.width()) / 2,
area.y() + (area.height() -
_popwidget.height()) / 2)
+ _popwidget.show(1)
def resize(data):
"""Resizes the window interactively. This should only be used with