1 ############################################################################
2 ### Functions that provide callbacks for motion events to move and ###
3 ### resize windows. ###
4 ############################################################################
6 #############################################################################
7 ### Options that can be modified to change the functions' behaviors. ###
8 #############################################################################
10 """The amount of resistance to provide to moving a window past a screen
11 boundary. Specify a value of 0 to disable edge resistance."""
13 """Display a coordinates popup when moving windows."
15 """NOT
IMPLEMENTED (yet?
)
16 Display an outline
while moving instead of moving the actual window
,
17 until the move
is completed
. Good
for slower systems
."""
19 """Display a size popup when resizing windows
."""
21 """NOT
IMPLEMENTED (yet?
)
22 Display an outline
while resizing instead of resizing the actual
23 window
, until the resize
is completed
. Good
for slower systems
."""
25 """Non
-zero to resize
from the corner nearest where the mouse
is, 0 to
26 resize always
from the bottom right corner
."""
27 #############################################################################
30 """Moves the window interactively
. This should only be used
with
31 MouseAction
.Motion events
. If MOVE_POPUP
or MOVE_RUBBERBAND
is enabled
,
32 then the end_move function needs to be bound
as well
."""
36 """Complete the interactive move of a window
."""
40 """Resizes the window interactively
. This should only be used
with
41 MouseMotion events
. If RESIZE_POPUP
or RESIZE_RUBBERBAND
is enabled
,
42 then the end_resize function needs to be bound
as well
."""
46 """Complete the interactive resize of a window
."""
49 ###########################################################################
50 ###########################################################################
52 ###########################################################################
53 ### Internal stuff, should not be accessed outside the module. ###
54 ###########################################################################
80 def _motion_grab(data):
81 global _motion_mask, _inmove, _inresize;
83 if data.action == ob.KeyAction.Release:
84 # have all the modifiers this started with been released?
85 if not _motion_mask & data.state:
97 global _screen, _client, _cx, _cy, _dx, _dy
99 # get destination x/y for the *frame*
100 x = _cx + _dx + _client.frame.rect().x() - _client.area().x()
101 y = _cy + _dy + _client.frame.rect().y() - _client.area().y()
103 global _last_x, _last_y
105 fs = _client.frame.size()
106 w = _client.area().width() + fs.left + fs.right
107 h = _client.area().height() + fs.top + fs.bottom
108 # use the area based on the struts
109 area = ob.openbox.screen(_screen).area()
111 r = area.right() - w + 1
113 b = area.bottom() - h + 1
115 if _last_x > x and x < l and x >= l - EDGE_RESISTANCE:
118 if _last_x < x and x > r and x <= r + EDGE_RESISTANCE:
121 if _last_y > y and y < t and y >= t - EDGE_RESISTANCE:
124 if _last_y < y and y > b and y <= b + EDGE_RESISTANCE:
136 # draw the outline ...
142 global _popwidget, _poplabel
143 style = ob.openbox.screen(_screen).style()
144 font = style.labelFont()
145 text = "X: " + str(x) + " Y: " + str(y)
146 length = font.measureString(text)
148 _popwidget = otk.Widget(ob.openbox, style,
149 otk.Widget.Horizontal, 0,
150 style.bevelWidth(), 1)
151 _popwidget.setTexture(style.titlebarFocusBackground())
152 _poplabel = otk.Label(_popwidget)
153 _poplabel.setTexture(style.labelFocusBackground())
154 _poplabel.fitString(text)
155 _poplabel.setText(text)
157 area = otk.display.screenInfo(_screen).rect()
158 _popwidget.move(area.x() + (area.width() -
159 _popwidget.width()) / 2,
160 area.y() + (area.height() -
161 _popwidget.height()) / 2)
165 if not data.client: return
167 # not-normal windows dont get moved
168 if not data.client.normal(): return
170 global _screen, _client, _cx, _cy, _dx, _dy
171 _screen = data.screen
172 _client = data.client
173 _cx = data.press_clientx
174 _cy = data.press_clienty
175 _dx = data.xroot - data.pressx
176 _dy = data.yroot - data.pressy
180 ob.kgrab(_screen, _motion_grab)
184 global MOVE_RUBBERBAND
185 global _inmove, _popwidget, _poplabel
197 global _screen, _client, _cx, _cy, _cw, _ch, _px, _py, _dx, _dy
202 # pick a corner to anchor
203 if not (RESIZE_NEAREST or _context == ob.MouseContext.Grip):
204 corner = ob.Client.TopLeft
210 corner = ob.Client.BottomRight
213 corner = ob.Client.BottomLeft
217 corner = ob.Client.TopRight
220 corner = ob.Client.TopLeft
225 if RESIZE_RUBBERBAND:
226 # draw the outline ...
229 _client.resize(corner, w, h)
232 global _popwidget, _poplabel
233 style = ob.openbox.screen(_screen).style()
234 ls = _client.logicalSize()
235 text = "W: " + str(ls.x()) + " H: " + str(ls.y())
237 _popwidget = otk.Widget(ob.openbox, style,
238 otk.Widget.Horizontal, 0,
239 style.bevelWidth(), 1)
240 _popwidget.setTexture(style.titlebarFocusBackground())
241 _poplabel = otk.Label(_popwidget)
242 _poplabel.setTexture(style.labelFocusBackground())
243 _poplabel.fitString(text)
244 _poplabel.setText(text)
245 area = otk.display.screenInfo(_screen).rect()
247 _popwidget.move(area.x() + (area.width() -
248 _popwidget.width()) / 2,
249 area.y() + (area.height() -
250 _popwidget.height()) / 2)
254 if not data.client: return
256 # not-normal windows dont get resized
257 if not data.client.normal(): return
259 global _screen, _client, _cx, _cy, _cw, _ch, _px, _py, _dx, _dy
260 _screen = data.screen
261 _client = data.client
262 _cx = data.press_clientx
263 _cy = data.press_clienty
264 _cw = data.press_clientwidth
265 _ch = data.press_clientheight
268 _dx = data.xroot - _px
269 _dy = data.yroot - _py
273 ob.kgrab(_screen, _motion_grab)
276 def _end_resize(data):
277 global RESIZE_RUBBERBAND, _inresize
278 global _popwidget, _poplabel
280 r = RESIZE_RUBBERBAND
281 RESIZE_RUBBERBAND = 0
283 RESIZE_RUBBERBAND = r