Hello,

I've always found that stumpwm's interactive frame resize was a bit 
un-intuative with respect to the position of windows and how they are resized.  
This patch helps alleviate this by changing the idea of resizing frames to 
moving the divider between the adjacent frames.

Windows are resized now based on their position in the head frame: either 
touching the left edge or touching the right edge.  Windows in the middle are 
assumed to be touching the left edge.  Windows on the left edge get larger 
horizontally when pressing C-f and smaller using C-b; windows on the right edge 
are the opposite. An identical strategy is used for vertical resizing. 

This has been tested on a 2 monitor setup and works as expected.

Attached is a patch to implement this behaviour and hopefully people find it 
useful and a better resizing experience.  I know I do :)

--
Burton Samograd
git diff
diff --git a/iresize.lisp b/iresize.lisp
index 3b237ca..0cad17f 100644
--- a/iresize.lisp
+++ b/iresize.lisp
@@ -39,50 +39,58 @@
   (setf *resize-increment* val)
   (update-resize-map))
 
-(defun update-resize-map ()
+(defun update-resize-map (fx fy fh fw dh dw)
   (let ((m (or *resize-map* (setf *resize-map* (make-sparse-keymap)))))
     (let ((i *resize-increment*))
-      (labels ((dk (m k c)
-                 (define-key m k (format nil c i))))
-        (dk m (kbd "Up") "resize 0 -~D")
-        (dk m (kbd "C-p") "resize 0 -~D")
-        (dk m (kbd "p") "resize 0 -~D")
-        (dk m (kbd "k") "resize 0 -~D")
-
-        (dk m (kbd "Down") "resize 0 ~D")
-        (dk m (kbd "C-n") "resize 0 ~D")
-        (dk m (kbd "n") "resize 0 ~D")
-        (dk m (kbd "j") "resize 0 ~D")
-
-        (dk m (kbd "Left") "resize -~D 0")
-        (dk m (kbd "C-b") "resize -~D 0")
-        (dk m (kbd "b") "resize -~D 0")
-        (dk m (kbd "h") "resize -~D 0")
-
-        (dk m (kbd "Right") "resize ~D 0")
-        (dk m (kbd "C-f") "resize ~D 0")
-        (dk m (kbd "f") "resize ~D 0")
-        (dk m (kbd "l") "resize ~D 0")
-        (define-key m (kbd "RET") "exit-iresize")
-        (define-key m (kbd "C-g") "abort-iresize")
-        (define-key m (kbd "ESC") "abort-iresize")))))
-
-(update-resize-map)
+      (labels ((dks (m keys c)
+                 (let ((cmd (format nil c i)))
+                   (dolist (k keys)
+                     (define-key m (kbd k) cmd)))))
+        (if (or (= fx 0)
+                (< (+ fx fw) dw))
+            (progn
+              (dks m '("Right" "f" "l" "C-f") "resize ~D 0")
+              (dks m '("Left"  "b" "h" "C-b") "resize -~D 0"))
+            (progn
+              (dks m '("Right" "f" "l" "C-f") "resize -~D 0")
+              (dks m '("Left"  "b" "h" "C-b") "resize ~D 0")))
+        (if (or (= fy 0)
+                (< (+ fy fh) dh))
+            (progn
+              (dks m '("Up" "p" "k" "C-p") "resize 0 -~D")
+              (dks m '("Down" "n" "j" "C-n") "resize 0 ~D"))
+            (progn
+              (dks m '("Up" "p" "k" "C-p") "resize 0 ~D")
+              (dks m '("Down" "n" "j" "C-n") "resize 0 -~D")))))
+    
+    (define-key m (kbd "RET") "exit-iresize")
+    (define-key m (kbd "C-g") "abort-iresize")
+    (define-key m (kbd "ESC") "abort-iresize")))
 
 (defcommand (iresize tile-group) () ()
   "Start the interactive resize mode. A new keymap specific to
 resizing the current frame is loaded. Hit @key{C-g}, @key{RET}, or
 @key{ESC} to exit."
-  (let ((frame (tile-group-current-frame (current-group))))
-    (if (atom (tile-group-frame-head (current-group) (frame-head (current-group) frame)))
+  (let* ((group (current-group))
+         (frame (tile-group-current-frame group))
+         (head-frame (frame-head group (tile-group-current-frame group)))
+         (dx (frame-x head-frame))
+         (dh (frame-height head-frame))
+         (dw (frame-width head-frame))
+         (fx (- (frame-x frame) dx))
+         (fy (frame-y frame))
+         (fh (frame-height frame))
+         (fw (frame-width frame)))
+    (if (atom (tile-group-frame-head group (frame-head group frame)))
         (message "There's only 1 frame!")
         (progn
           (when *resize-hides-windows*
-            (dolist (f (head-frames (current-group) (current-head)))
-              (clear-frame f (current-group))))
+            (dolist (f (head-frames group (current-head)))
+              (clear-frame f group)))
           (message "Resize Frame")
+          (update-resize-map fx fy fh fw dh fw)
           (push-top-map *resize-map*)
-          (draw-frame-outlines (current-group) (current-head)))
+          (draw-frame-outlines group (current-head)))
         ;;   (setf *resize-backup* (copy-frame-tree (current-group)))
         )))
 
_______________________________________________
Stumpwm-devel mailing list
Stumpwm-devel@nongnu.org
https://lists.nongnu.org/mailman/listinfo/stumpwm-devel

Reply via email to