]>
Dogcows Code - chaz/openbox/blob - scripts/motion.py
410ee4d6c1e775d6330ccfb930ec60e0a654919c
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 """When this is non-zero, the coordinates popups will be centered on the
14 screen. When zero, they will appear in the upper-left corner."""
16 """Display a coordinates popup when moving windows."""
18 """NOT IMPLEMENTED (yet?)
19 Display an outline while moving instead of moving the actual window,
20 until the move is completed. Good for slower systems."""
22 """Display a size popup when resizing windows."""
24 """NOT IMPLEMENTED (yet?)
25 Display an outline while resizing instead of resizing the actual
26 window, until the resize is completed. Good for slower systems."""
28 """Non-zero to resize from the corner nearest where the mouse is, 0 to
29 resize always from the bottom right corner."""
30 #############################################################################
33 """Moves the window interactively. This should only be used with
34 MouseAction.Motion events. If MOVE_POPUP or MOVE_RUBBERBAND is enabled,
35 then the end_move function needs to be bound as well."""
39 """Complete the interactive move of a window."""
43 """Resizes the window interactively. This should only be used with
44 MouseMotion events. If RESIZE_POPUP or RESIZE_RUBBERBAND is enabled,
45 then the end_resize function needs to be bound as well."""
49 """Complete the interactive resize of a window."""
52 ###########################################################################
53 ###########################################################################
55 ###########################################################################
56 ### Internal stuff, should not be accessed outside the module. ###
57 ###########################################################################
83 def _motion_grab(data
):
84 global _motion_mask
, _inmove
, _inresize
;
86 # are all the modifiers this started with still pressed?
87 if not _motion_mask
& data
.state
:
99 global _screen
, _client
, _cx
, _cy
, _dx
, _dy
101 # get destination x/y for the *frame*
102 x
= _cx
+ _dx
+ _client
.frame
.area().x() - _client
.area().x()
103 y
= _cy
+ _dy
+ _client
.frame
.area().y() - _client
.area().y()
105 global _last_x
, _last_y
107 fs
= _client
.frame
.size()
108 w
= _client
.area().width() + fs
.left
+ fs
.right
109 h
= _client
.area().height() + fs
.top
+ fs
.bottom
110 # use the area based on the struts
111 area
= ob
.openbox
.screen(_screen
).area(_client
.desktop())
113 r
= area
.right() - w
+ 1
115 b
= area
.bottom() - h
+ 1
117 if _last_x
> x
and x
< l
and x
>= l
- EDGE_RESISTANCE
:
120 if _last_x
< x
and x
> r
and x
<= r
+ EDGE_RESISTANCE
:
123 if _last_y
> y
and y
< t
and y
>= t
- EDGE_RESISTANCE
:
126 if _last_y
< y
and y
> b
and y
<= b
+ EDGE_RESISTANCE
:
138 # draw the outline ...
141 _client
.move(x
, y
, final
)
144 global _popwidget
, _poplabel
145 text
= "X: " + str(x
) + " Y: " + str(y
)
147 _popwidget
= otk
.Widget(_screen
, ob
.openbox
,
148 otk
.Widget
.Horizontal
, 0, 1)
149 _poplabel
= otk
.Label(_popwidget
)
150 _poplabel
.setHighlighted(1)
151 _poplabel
.setText(text
)
153 scsize
= ob
.openbox
.screen(_screen
).size()
154 x
= (scsize
.width() - size
.width()) / 2
155 y
= (scsize
.height() - size
.height()) / 2
158 size
= _poplabel
.minSize()
159 _popwidget
.moveresize(otk
.Rect(x
, y
, size
.width(), size
.height()))
163 if not data
.client
: return
165 # not-normal windows dont get moved
166 if not data
.client
.normal(): return
168 global _screen
, _client
, _cx
, _cy
, _dx
, _dy
, _motion_mask
169 _screen
= data
.screen
170 _client
= data
.client
171 _cx
= data
.press_clientx
172 _cy
= data
.press_clienty
173 _dx
= data
.xroot
- data
.pressx
174 _dy
= data
.yroot
- data
.pressy
175 _motion_mask
= data
.state
179 ob
.kgrab(_screen
, _motion_grab
)
183 global MOVE_RUBBERBAND
184 global _inmove
, _popwidget
, _poplabel
196 global _screen
, _client
, _cx
, _cy
, _cw
, _ch
, _px
, _py
, _dx
, _dy
201 # pick a corner to anchor
202 if not (RESIZE_NEAREST
or _context
== ob
.MouseContext
.Grip
):
203 corner
= ob
.Client
.TopLeft
209 corner
= ob
.Client
.BottomRight
212 corner
= ob
.Client
.BottomLeft
216 corner
= ob
.Client
.TopRight
219 corner
= ob
.Client
.TopLeft
224 if RESIZE_RUBBERBAND
:
225 # draw the outline ...
228 _client
.resize(corner
, w
, h
)
231 global _popwidget
, _poplabel
232 ls
= _client
.logicalSize()
233 text
= "W: " + str(ls
.width()) + " H: " + str(ls
.height())
235 _popwidget
= otk
.Widget(_screen
, ob
.openbox
,
236 otk
.Widget
.Horizontal
, 0, 1)
237 _poplabel
= otk
.Label(_popwidget
)
238 _poplabel
.setHighlighted(1)
239 _poplabel
.setText(text
)
241 scsize
= ob
.openbox
.screen(_screen
).size()
242 x
= (scsize
.width() - size
.width()) / 2
243 y
= (scsize
.height() - size
.height()) / 2
246 size
= _poplabel
.minSize()
247 _popwidget
.moveresize(otk
.Rect(x
, y
, size
.width(), size
.height()))
251 if not data
.client
: return
253 # not-normal windows dont get resized
254 if not data
.client
.normal(): return
256 global _screen
, _client
, _cx
, _cy
, _cw
, _ch
, _px
, _py
, _dx
, _dy
258 _screen
= data
.screen
259 _client
= data
.client
260 _cx
= data
.press_clientx
261 _cy
= data
.press_clienty
262 _cw
= data
.press_clientwidth
263 _ch
= data
.press_clientheight
266 _dx
= data
.xroot
- _px
267 _dy
= data
.yroot
- _py
268 _motion_mask
= data
.state
272 ob
.kgrab(_screen
, _motion_grab
)
275 def _end_resize(data
):
276 global RESIZE_RUBBERBAND
, _inresize
277 global _popwidget
, _poplabel
279 r
= RESIZE_RUBBERBAND
280 RESIZE_RUBBERBAND
= 0
282 RESIZE_RUBBERBAND
= r
This page took 0.045403 seconds and 3 git commands to generate.