Fandom

Sawfish

Multihead placed patch

773pages on
this wiki
Add New Page
Talk0 Share

Ad blocker interference detected!


Wikia is a free-to-use site that makes money from advertising. We have a modified experience for viewers using ad blockers

Wikia is not accessible if you’ve made further modifications. Remove the custom ad blocker rule(s) and the page will load as expected.

Browse all patches

Author Edit

Fuchur

Synopsis Edit

This patch fix window placement with multihead setup. Look here

Patch Edit

diff -urNad sawfish.orgi/lisp/sawfish/wm/misc.jl sawfish/lisp/sawfish/wm/misc.jl
--- sawfish.orgi/lisp/sawfish/wm/misc.jl	2007-12-01 13:37:04.000000000 +0100
+++ sawfish/lisp/sawfish/wm/misc.jl	2007-12-01 13:40:45.000000000 +0100
@@ -119,29 +119,34 @@
 
 (define (current-head #!optional (w (input-focus)))
   "Return the id of the `current' head."
-  (or (and w (let ((point (window-position w))
-		   (dims (window-dimensions w)))
-	       (find-head (+ (car point) (quotient (car dims) 2))
-			  (+ (cdr point) (quotient (cdr dims) 2)))))
-      (pointer-head)))
+  (require 'sawfish.wm.windows)
+  (if (not (desktop-window-p w))
+      (or (and w (let ((point (window-position w))
+                       (dims (window-dimensions w)))
+                   (find-head (+ (car point) (quotient (car dims) 2))
+                              (+ (cdr point) (quotient (cdr dims) 2)))))
+          (pointer-head))
+    (pointer-head)))
 
-(define (current-head-dimensions #!optional w)
+(define (current-head-dimensions #!optional (w (input-focus)))
   "Return a cons-cell defining the size in pixels of the current head (that
-containing the window W, or the pointer if W is false). Returns the screen
-dimensions if no such head can be identified."
-  (let ((head (current-head w)))
-    (if head
-	(head-dimensions head)
-      (screen-dimensions))))
+containing the window W, or containing the window with input focus if W is
+false). Returns the screen dimensions if no such head can be identified."
+  (or (and w (let ((head (current-head w)))
+               (if head
+                   (head-dimensions head)
+                 (screen-dimensions))))
+      (head-dimensions (pointer-head))))
 
-(define (current-head-offset #!optional w)
+(define (current-head-offset #!optional (w (input-focus)))
   "Return a cons-cell defining the origin of the current head (that
-containing the window W, or the pointer if W is false). Returns '(0 . 0)
-if no such head can be identified."
-  (let ((head (current-head w)))
-    (if head
-	(head-offset head)
-      (cons 0 0))))
+containing the window W, or containing the window with input focus if W is
+false). Returns '(0 . 0) if no such head can be identified."
+  (or (and w (let ((head (current-head w)))
+               (if head
+                   (head-offset head)
+                 (cons 0 0))))
+      (head-offset (pointer-head))))
 
 (define (load-module name)
   "Ensure that the module called NAME has been loaded. Note that this does
diff -urNad sawfish.orgi/lisp/sawfish/wm/placement/top-left.jl sawfish/lisp/sawfish/wm/placement/top-left.jl
--- sawfish.orgi/lisp/sawfish/wm/placement/top-left.jl	2007-12-01 13:37:04.000000000 +0100
+++ sawfish/lisp/sawfish/wm/placement/top-left.jl	2007-12-01 13:41:12.000000000 +0100
@@ -86,7 +86,7 @@
 	    (t (loop (next-position point))))))
 
   (define (place-window-top-left w)
-    (let* ((workarea (calculate-workarea #:window w))
+    (let* ((workarea (calculate-workarea #:window w #:head (current-head)))
 	   (dims (window-dimensions w))
 	   (f-dims (window-frame-dimensions w))
 	   (hints (window-size-hints w))
diff -urNad sawfish.orgi/lisp/sawfish/wm/placement.jl sawfish/lisp/sawfish/wm/placement.jl
--- sawfish.orgi/lisp/sawfish/wm/placement.jl	2007-12-01 13:37:04.000000000 +0100
+++ sawfish/lisp/sawfish/wm/placement.jl	2007-12-01 13:41:29.000000000 +0100
@@ -210,6 +210,6 @@
   (define-placement-mode 'randomly place-window-randomly #:for-normal t #:for-dialogs t)
   (define-placement-mode 'interactively place-window-interactively #:for-normal t)
   (define-placement-mode 'centered place-window-centered #:for-normal t #:for-dialogs t)
-  (define-placement-mode 'centered-on-parent place-window-centered-on-parent #:for-dialogs t)
-  (define-placement-mode 'under-pointer place-window-under-pointer #:for-dialogs t)
+  (define-placement-mode 'centered-on-parent place-window-centered-on-parent #:for-normal t #:for-dialogs t)
+  (define-placement-mode 'under-pointer place-window-under-pointer #:for-normal t #:for-dialogs t)
   (define-placement-mode 'none nop #:for-normal t #:for-dialogs t))

Community's reasons for inclusion or rejection Edit

  • Wtf vote: pondering. I have dualhead also, and I can reproduce the bad behaviour you explained in this post so I'm eager to apply it. But I prefer some other's people opinion on how invasive this patch is, because I am in no good position to judge this. Janek Kozicki 00:08, 19 January 2008 (UTC)


  • I will try to explain what happens with xinerame setup without the patch.

In function current-head: If you use e.g. nautilus to draw the desktop and you click on a desktop icon, function current-head calculated with the complete nautilus/desktop root window by var window-dimensions. If the right screen have 1280x1024 and the left 1280x1024 then (2560 . 1024) is use for the var window-dimensions. Var find-head in function current-head returns so always 1. It is difficult to explain (for me) but you can test it with: sawfish-client -e "(current-head (select-window))" and click on your desktop if you have two Heads with the same geometry and nautilus running it always returns 1. In function current-head-dimensions and current-head-offset: It returns current-head-dimensions and current-head-offset from head were the pointer is: Open an shell type in the shell: sawfish-client -e "(current-head-offset)" move your mouse to a other head as the shell and press enter. It returns by current-head-dimensions or current-head-offset from head where the pointer is. The patch fix this and windows now will placed correctly. I have test it with one head, with xinerame, no xinerama and twinview with two heads and it works but it is my first lisp code/patch. I hope my patch is better as my english :). fuchur

  • Yes vote: yes. ok, patch accepted with improved function comments by Andrea Vettorello. Thanks a lot Janek Kozicki 16:40, 20 January 2008 (UTC)

Also on Fandom

Random Wiki