]>
Dogcows Code - chaz/openbox/blob - scripts/motion.py
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 # are all the modifiers this started with still pressed?
84 if not _motion_mask
& data
.state
:
96 global _screen
, _client
, _cx
, _cy
, _dx
, _dy
98 # get destination x/y for the *frame*
99 x
= _cx
+ _dx
+ _client
.frame
.area().x() - _client
.area().x()
100 y
= _cy
+ _dy
+ _client
.frame
.area().y() - _client
.area().y()
102 global _last_x
, _last_y
104 fs
= _client
.frame
.size()
105 w
= _client
.area().width() + fs
.left
+ fs
.right
106 h
= _client
.area().height() + fs
.top
+ fs
.bottom
107 # use the area based on the struts
108 area
= ob
.openbox
.screen(_screen
).area(_client
.desktop())
110 r
= area
.right() - w
+ 1
112 b
= area
.bottom() - h
+ 1
114 if _last_x
> x
and x
< l
and x
>= l
- EDGE_RESISTANCE
:
117 if _last_x
< x
and x
> r
and x
<= r
+ EDGE_RESISTANCE
:
120 if _last_y
> y
and y
< t
and y
>= t
- EDGE_RESISTANCE
:
123 if _last_y
< y
and y
> b
and y
<= b
+ EDGE_RESISTANCE
:
135 # draw the outline ...
141 global _popwidget
, _poplabel
142 text
= "X: " + str(x
) + " Y: " + str(y
)
144 _popwidget
= otk
.Widget(_screen
, ob
.openbox
,
145 otk
.Widget
.Horizontal
, 0, 1)
146 _poplabel
= otk
.Label(_popwidget
)
147 _poplabel
.setHighlighted(1)
148 _poplabel
.setText(text
)
149 scsize
= otk
.display
.screenInfo(_screen
).size()
150 size
= _poplabel
.minSize()
151 _popwidget
.moveresize(otk
.Rect((scsize
.width() - size
.width()) / 2,
152 (scsize
.height() - size
.height()) / 2,
153 size
.width(), size
.height()))
157 if not data
.client
: return
159 # not-normal windows dont get moved
160 if not data
.client
.normal(): return
162 global _screen
, _client
, _cx
, _cy
, _dx
, _dy
, _motion_mask
163 _screen
= data
.screen
164 _client
= data
.client
165 _cx
= data
.press_clientx
166 _cy
= data
.press_clienty
167 _dx
= data
.xroot
- data
.pressx
168 _dy
= data
.yroot
- data
.pressy
169 _motion_mask
= data
.state
173 ob
.kgrab(_screen
, _motion_grab
)
177 global MOVE_RUBBERBAND
178 global _inmove
, _popwidget
, _poplabel
190 global _screen
, _client
, _cx
, _cy
, _cw
, _ch
, _px
, _py
, _dx
, _dy
195 # pick a corner to anchor
196 if not (RESIZE_NEAREST
or _context
== ob
.MouseContext
.Grip
):
197 corner
= ob
.Client
.TopLeft
203 corner
= ob
.Client
.BottomRight
206 corner
= ob
.Client
.BottomLeft
210 corner
= ob
.Client
.TopRight
213 corner
= ob
.Client
.TopLeft
218 if RESIZE_RUBBERBAND
:
219 # draw the outline ...
222 _client
.resize(corner
, w
, h
)
225 global _popwidget
, _poplabel
226 ls
= _client
.logicalSize()
227 text
= "W: " + str(ls
.width()) + " H: " + str(ls
.height())
229 _popwidget
= otk
.Widget(_screen
, ob
.openbox
,
230 otk
.Widget
.Horizontal
, 0, 1)
231 _poplabel
= otk
.Label(_popwidget
)
232 _poplabel
.setHighlighted(1)
233 _poplabel
.setText(text
)
234 scsize
= otk
.display
.screenInfo(_screen
).size()
235 size
= _poplabel
.minSize()
236 _popwidget
.moveresize(otk
.Rect((scsize
.width() - size
.width()) / 2,
237 (scsize
.height() - size
.height()) / 2,
238 size
.width(), size
.height()))
242 if not data
.client
: return
244 # not-normal windows dont get resized
245 if not data
.client
.normal(): return
247 global _screen
, _client
, _cx
, _cy
, _cw
, _ch
, _px
, _py
, _dx
, _dy
249 _screen
= data
.screen
250 _client
= data
.client
251 _cx
= data
.press_clientx
252 _cy
= data
.press_clienty
253 _cw
= data
.press_clientwidth
254 _ch
= data
.press_clientheight
257 _dx
= data
.xroot
- _px
258 _dy
= data
.yroot
- _py
259 _motion_mask
= data
.state
263 ob
.kgrab(_screen
, _motion_grab
)
266 def _end_resize(data
):
267 global RESIZE_RUBBERBAND
, _inresize
268 global _popwidget
, _poplabel
270 r
= RESIZE_RUBBERBAND
271 RESIZE_RUBBERBAND
= 0
273 RESIZE_RUBBERBAND
= r
This page took 0.046263 seconds and 4 git commands to generate.