]>
Dogcows Code - chaz/openbox/blob - motion.py
c32c1e62a7fe86c014253a5c6af6a030ebef1432
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
.FocusLabel(_popwidget
)
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
.FocusLabel(_popwidget
)
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
This page took 0.045249 seconds and 3 git commands to generate.