scripts/motion.py (raw)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 |
############################################################################ ### Functions that provide callbacks for motion events to move and ### ### resize windows. ### ############################################################################ ############################################################################# ### Options that can be modified to change the functions' behaviors. ### ### ### # edge_resistance - the amount of resistance to provide to moving a ### ### window past a screen boundary. Specify a value of 0 ### ### to disable edge resistance. ### edge_resistance = 10 ### ### ### # move_popup - display a coordinates popup when moving windows. ### move_popup = 1 ### ### ### # NOT IMPLEMENTED (yet?) ### # move_rubberband - display an outline while moving instead of moving the ### ### actual window, until the move is completed. Good for ### ### slower systems. ### move_rubberband = 0 ### ### ### # resize_popup - display a size popup when resizing windows. ### resize_popup = 1 ### ### ### # NOT IMPLEMENTED (yet?) ### # resize_rubberband - display an outline while resizing instead of ### ### resizing the actual window, until the resize is ### ### completed. Good for slower systems. ### resize_rubberband = 0 ### ### ### # resize_nearest - 1 to resize from the corner nearest where the mouse ### ### is, 0 to resize always from the bottom right corner. ### resize_nearest = 1 ### ### ### ### ### # Provides: ### # def move(data): ### # """Moves the window interactively. This should only be used with ### # MouseMotion events. If move_popup or move_rubberband is enabled, ### # then the end_move function needs to be bound as well.""" ### # def end_move(data): ### # """Complete the interactive move of a window.""" ### # def resize(data): ### # """Resizes the window interactively. This should only be used with ### # MouseMotion events""" ### # def end_resize(data): ### # """Complete the interactive resize of a window.""" ### ### ### ############################################################################# import ob import otk _popwidget = 0 _poplabel = 0 # motion state _inmove = 0 _inresize = 0 # last motion data _cx = 0 _cy = 0 _cw = 0 _ch = 0 _px = 0 _py = 0 _dx = 0 _dy = 0 _client = 0 _screen = 0 _motion_mask = 0 def _motion_grab(data): global _motion_mask, _inmove, _inresize; if data.action == ob.KeyAction.Release: # have all the modifiers this started with been released? if not _motion_mask & data.state: if _inmove: end_move(data) elif _inresize: end_resize(data) else: raise RuntimeError _last_x = 0 _last_y = 0 def _do_move(): global _screen, _client, _cx, _cy, _dx, _dy x = _cx + _dx y = _cy + _dy global edge_resistance, _last_x, _last_y if edge_resistance: fs = _client.frame.size() w = _client.area().width() + fs.left + fs.right h = _client.area().height() + fs.top + fs.bottom # use the area based on the struts area = ob.openbox.screen(_screen).area() l = area.left() r = area.right() - w + 1 t = area.top() b = area.bottom() - h + 1 # left screen edge if _last_x > x and x < l and x >= l - edge_resistance: x = l # right screen edge if _last_x < x and x > r and x <= r + edge_resistance: x = r # top screen edge if _last_y > y and y < t and y >= t - edge_resistance: y = t # right screen edge if _last_y < y and y > b and y <= b + edge_resistance: y = b _last_x = x _last_y = y global move_rubberband if move_rubberband: # draw the outline ... f=0 else: _client.move(x, y) global move_popup if move_popup: global _popwidget, _poplabel style = ob.openbox.screen(_screen).style() font = style.labelFont() text = "X: " + str(x) + " Y: " + str(y) length = font.measureString(text) if not _popwidget: _popwidget = otk.Widget(ob.openbox, style, otk.Widget.Horizontal, 0, style.bevelWidth(), 1) _popwidget.setTexture(style.titlebarFocusBackground()) _poplabel = otk.Label(_popwidget) _poplabel.setTexture(style.labelFocusBackground()) _poplabel.fitString(text) _poplabel.setText(text) _popwidget.update() area = otk.display.screenInfo(_screen).rect() _popwidget.move(area.x() + (area.width() - _popwidget.width()) / 2, area.y() + (area.height() - _popwidget.height()) / 2) _popwidget.show(1) def move(data): """Moves the window interactively. This should only be used with MouseMotion events. If move_popup or move_rubberband is enabled, then the end_move function needs to be bound as well.""" if not data.client: return # not-normal windows dont get moved if not data.client.normal(): return global _screen, _client, _cx, _cy, _dx, _dy _screen = data.screen _client = data.client _cx = data.press_clientx _cy = data.press_clienty _dx = data.xroot - data.pressx _dy = data.yroot - data.pressy _do_move() global _inmove if not _inmove: ob.kgrab(_screen, _motion_grab) _inmove = 1 def end_move(data): """Complete the interactive move of a window.""" global move_rubberband, _inmove global _popwidget, _poplabel if _inmove: r = move_rubberband move_rubberband = 0 _do_move() move_rubberband = r _inmove = 0 _poplabel = 0 _popwidget = 0 ob.kungrab() def _do_resize(): global _screen, _client, _cx, _cy, _cw, _ch, _px, _py, _dx, _dy dx = _dx dy = _dy # pick a corner to anchor if not (resize_nearest or _context == ob.MouseContext.Grip): corner = ob.Client.TopLeft else: x = _px - _cx y = _py - _cy if y < _ch / 2: if x < _cw / 2: corner = ob.Client.BottomRight dx *= -1 else: corner = ob.Client.BottomLeft dy *= -1 else: if x < _cw / 2: corner = ob.Client.TopRight dx *= -1 else: corner = ob.Client.TopLeft w = _cw + dx h = _ch + dy global resize_popup if resize_rubberband: # draw the outline ... f=0 else: _client.resize(corner, w, h) global resize_popup if resize_popup: global _popwidget, _poplabel style = ob.openbox.screen(_screen).style() ls = _client.logicalSize() text = "W: " + str(ls.x()) + " H: " + str(ls.y()) if not _popwidget: _popwidget = otk.Widget(ob.openbox, style, otk.Widget.Horizontal, 0, style.bevelWidth(), 1) _popwidget.setTexture(style.titlebarFocusBackground()) _poplabel = otk.Label(_popwidget) _poplabel.setTexture(style.labelFocusBackground()) _poplabel.fitString(text) _poplabel.setText(text) area = otk.display.screenInfo(_screen).rect() _popwidget.update() _popwidget.move(area.x() + (area.width() - _popwidget.width()) / 2, area.y() + (area.height() - _popwidget.height()) / 2) _popwidget.show(1) def resize(data): """Resizes the window interactively. This should only be used with MouseMotion events""" if not data.client: return # not-normal windows dont get resized if not data.client.normal(): return global _screen, _client, _cx, _cy, _cw, _ch, _px, _py, _dx, _dy _screen = data.screen _client = data.client _cx = data.press_clientx _cy = data.press_clienty _cw = data.press_clientwidth _ch = data.press_clientheight _px = data.pressx _py = data.pressy _dx = data.xroot - _px _dy = data.yroot - _py _do_resize() global _inresize if not _inresize: ob.kgrab(_screen, _motion_grab) _inresize = 1 def end_resize(data): """Complete the interactive resize of a window.""" global resize_rubberband, _inresize global _popwidget, _poplabel if _inresize: r = resize_rubberband resize_rubberband = 0 _do_resize() resize_rubberband = r _inresize = 0 _poplabel = 0 _popwidget = 0 ob.kungrab() |