]>
Dogcows Code - chaz/openbox/blob - motion.py
ef05b2792a49eb1d24c15be3711fccc58f5fd951
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 print _motion_mask
, data
.state
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
.area().x() - _client
.area().x()
101 y
= _cy
+ _dy
+ _client
.frame
.area().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(_client
.desktop())
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 text
= "X: " + str(x
) + " Y: " + str(y
)
145 _popwidget
= otk
.Widget(_screen
, ob
.openbox
,
146 otk
.Widget
.Horizontal
, 0, 1)
147 _poplabel
= otk
.Label(_popwidget
)
148 _poplabel
.setHighlighted(1)
149 _poplabel
.setText(text
)
150 scsize
= otk
.display
.screenInfo(_screen
).size()
151 size
= _poplabel
.minSize()
152 _popwidget
.moveresize(otk
.Rect((scsize
.width() - size
.width()) / 2,
153 (scsize
.height() - size
.height()) / 2,
154 size
.width(), size
.height()))
158 if not data
.client
: return
160 # not-normal windows dont get moved
161 if not data
.client
.normal(): return
163 global _screen
, _client
, _cx
, _cy
, _dx
, _dy
, _motion_mask
164 _screen
= data
.screen
165 _client
= data
.client
166 _cx
= data
.press_clientx
167 _cy
= data
.press_clienty
168 _dx
= data
.xroot
- data
.pressx
169 _dy
= data
.yroot
- data
.pressy
170 _motion_mask
= data
.state
174 ob
.kgrab(_screen
, _motion_grab
)
178 global MOVE_RUBBERBAND
179 global _inmove
, _popwidget
, _poplabel
191 global _screen
, _client
, _cx
, _cy
, _cw
, _ch
, _px
, _py
, _dx
, _dy
196 # pick a corner to anchor
197 if not (RESIZE_NEAREST
or _context
== ob
.MouseContext
.Grip
):
198 corner
= ob
.Client
.TopLeft
204 corner
= ob
.Client
.BottomRight
207 corner
= ob
.Client
.BottomLeft
211 corner
= ob
.Client
.TopRight
214 corner
= ob
.Client
.TopLeft
219 if RESIZE_RUBBERBAND
:
220 # draw the outline ...
223 _client
.resize(corner
, w
, h
)
226 global _popwidget
, _poplabel
227 ls
= _client
.logicalSize()
228 text
= "W: " + str(ls
.width()) + " H: " + str(ls
.height())
230 _popwidget
= otk
.Widget(_screen
, ob
.openbox
,
231 otk
.Widget
.Horizontal
, 0, 1)
232 _poplabel
= otk
.Label(_popwidget
)
233 _poplabel
.setHighlighted(1)
234 _poplabel
.setText(text
)
235 scsize
= otk
.display
.screenInfo(_screen
).size()
236 size
= _poplabel
.minSize()
237 _popwidget
.moveresize(otk
.Rect((scsize
.width() - size
.width()) / 2,
238 (scsize
.height() - size
.height()) / 2,
239 size
.width(), size
.height()))
243 if not data
.client
: return
245 # not-normal windows dont get resized
246 if not data
.client
.normal(): return
248 global _screen
, _client
, _cx
, _cy
, _cw
, _ch
, _px
, _py
, _dx
, _dy
250 _screen
= data
.screen
251 _client
= data
.client
252 _cx
= data
.press_clientx
253 _cy
= data
.press_clienty
254 _cw
= data
.press_clientwidth
255 _ch
= data
.press_clientheight
258 _dx
= data
.xroot
- _px
259 _dy
= data
.yroot
- _py
260 _motion_mask
= data
.state
264 ob
.kgrab(_screen
, _motion_grab
)
267 def _end_resize(data
):
268 global RESIZE_RUBBERBAND
, _inresize
269 global _popwidget
, _poplabel
271 r
= RESIZE_RUBBERBAND
272 RESIZE_RUBBERBAND
= 0
274 RESIZE_RUBBERBAND
= r
This page took 0.046344 seconds and 3 git commands to generate.