]> Dogcows Code - chaz/openbox/blobdiff - scripts/motion.py
force a binding with a modifier
[chaz/openbox] / scripts / motion.py
index 845476780424ae74c2edde1f70887e7e2bc29f7c..03546b84e74147ee01fdf0621053f7987e3b0484 100644 (file)
@@ -6,6 +6,11 @@
 #############################################################################
 ### 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                                                            ###
 ###                                                                       ###
@@ -81,11 +86,48 @@ def _motion_grab(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
+    # get destination x/y for the *frame*
+    x = _cx + _dx + _client.frame.rect().x() - _client.area().x()
+    y = _cy + _dy + _client.frame.rect().y() - _client.area().y()
+
+    global edge_resistance
+    global _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
+
+    global _inmove
+    if not _inmove:
+        _last_x = 0
+        _last_y = 0
+    else:
+        _last_x = x
+        _last_y = y
 
     global move_rubberband
     if move_rubberband:
@@ -108,15 +150,15 @@ def _do_move():
             _popwidget.setTexture(style.titlebarFocusBackground())
             _poplabel = otk.Label(_popwidget)
             _poplabel.setTexture(style.labelFocusBackground())
-            _popwidget.show(1)
         _poplabel.fitString(text)
         _poplabel.setText(text)
-        area = otk.display.screenInfo(_screen).rect()
         _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
@@ -203,7 +245,6 @@ def _do_resize():
             _popwidget.setTexture(style.titlebarFocusBackground())
             _poplabel = otk.Label(_popwidget)
             _poplabel.setTexture(style.labelFocusBackground())
-            _popwidget.show(1)
         _poplabel.fitString(text)
         _poplabel.setText(text)
         area = otk.display.screenInfo(_screen).rect()
@@ -212,6 +253,7 @@ def _do_resize():
                                     _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
This page took 0.021587 seconds and 4 git commands to generate.