Use the 'exwm-randr-output' frame parameter to determine the output
* exwm-randr.el (exwm-randr--refresh): Always set the name of primary output. * exwm-workspace.el (exwm-workspace-switch) (exwm-workspace-move-window): Use 'exwm-randr-output' frame parameter to check if two frames are on the same output.
This commit is contained in:
parent
bfa35c0e38
commit
c821f76dfe
2 changed files with 35 additions and 42 deletions
|
@ -89,7 +89,7 @@ the first one in result being the primary output."
|
|||
|
||||
(defun exwm-randr--refresh ()
|
||||
"Refresh workspaces according to the updated RandR info."
|
||||
(let (output-name geometry output-plist default-geometry)
|
||||
(let (output-name geometry output-plist primary-output default-geometry)
|
||||
;; Query all outputs
|
||||
(with-slots (config-timestamp outputs)
|
||||
(xcb:+request-unchecked+reply exwm--connection
|
||||
|
@ -115,8 +115,9 @@ the first one in result being the primary output."
|
|||
:x x :y y
|
||||
:width width :height height)
|
||||
output-plist (plist-put output-plist output-name geometry))
|
||||
(unless default-geometry ;assume the first output as primary
|
||||
(setq default-geometry geometry)))))))
|
||||
(unless primary-output
|
||||
(setq primary-output output-name
|
||||
default-geometry geometry)))))))
|
||||
(exwm--log "(randr) outputs: %s" output-plist)
|
||||
(when output-plist
|
||||
(when exwm-workspace--fullscreen-frame-count
|
||||
|
@ -128,7 +129,7 @@ the first one in result being the primary output."
|
|||
(frame (elt exwm-workspace--list i)))
|
||||
(unless geometry
|
||||
(setq geometry default-geometry
|
||||
output nil))
|
||||
output primary-output))
|
||||
(set-frame-parameter frame 'exwm-randr-output output)
|
||||
(set-frame-parameter frame 'exwm-geometry geometry)))
|
||||
;; Update workareas.
|
||||
|
|
|
@ -528,18 +528,14 @@ for internal use only."
|
|||
;; Set a default minibuffer frame.
|
||||
(setq default-minibuffer-frame frame))
|
||||
;; Show/Hide X windows.
|
||||
(let ((hide-x-windows-on-old-frame
|
||||
(with-slots ((x1 x)
|
||||
(y1 y))
|
||||
(exwm-workspace--get-geometry frame)
|
||||
(with-slots ((x2 x)
|
||||
(y2 y))
|
||||
(exwm-workspace--get-geometry old-frame)
|
||||
(and (= x1 x2) (= y1 y2))))))
|
||||
(let ((hide-old-workspace
|
||||
(and old-frame
|
||||
(eq (frame-parameter old-frame 'exwm-randr-output)
|
||||
(frame-parameter frame 'exwm-randr-output)))))
|
||||
(dolist (i exwm--id-buffer-alist)
|
||||
(with-current-buffer (cdr i)
|
||||
(if (eq old-frame exwm--frame)
|
||||
(when hide-x-windows-on-old-frame
|
||||
(when hide-old-workspace
|
||||
(exwm-layout--hide exwm--id))
|
||||
(when (eq frame exwm--frame)
|
||||
(let ((window (get-buffer-window nil t)))
|
||||
|
@ -703,7 +699,7 @@ INDEX must not exceed the current number of workspaces."
|
|||
(exwm-workspace--prompt-delete-allowed t))
|
||||
(exwm-workspace--prompt-for-workspace "Move to [+/-]: "))))
|
||||
(let ((frame (exwm-workspace--workspace-from-frame-or-index frame-or-index))
|
||||
x-old y-old x-new y-new should-hide old-frame container)
|
||||
should-hide old-frame container)
|
||||
(unless id (setq id (exwm--buffer->id (window-buffer))))
|
||||
(with-current-buffer (exwm--id->buffer id)
|
||||
(unless (eq exwm--frame frame)
|
||||
|
@ -715,32 +711,22 @@ INDEX must not exceed the current number of workspaces."
|
|||
(concat " " name)))))
|
||||
(setq old-frame exwm--frame
|
||||
exwm--frame frame)
|
||||
;; Save the positions of new & old frames.
|
||||
(with-slots ((x1 x)
|
||||
(y1 y))
|
||||
(exwm-workspace--get-geometry old-frame)
|
||||
(with-slots ((x2 x)
|
||||
(y2 y))
|
||||
(exwm-workspace--get-geometry frame)
|
||||
(setq x-old x1
|
||||
y-old y1
|
||||
x-new x2
|
||||
y-new y2)))
|
||||
(if (and (= x-old x-new)
|
||||
(= y-old y-new))
|
||||
(if (eq (frame-parameter old-frame 'exwm-randr-output)
|
||||
(frame-parameter frame 'exwm-randr-output))
|
||||
;; Switch to a workspace on the same output.
|
||||
(setq should-hide t)
|
||||
;; Check if this frame has the largest timestamp of that output.
|
||||
(let ((timestamp (frame-parameter frame 'exwm-timestamp))
|
||||
(let* ((timestamp (frame-parameter frame 'exwm-timestamp))
|
||||
(output (frame-parameter frame 'exwm-randr-output))
|
||||
(timestamp-active
|
||||
(apply #'max
|
||||
(mapcar (lambda (w)
|
||||
(with-slots (x y)
|
||||
(exwm-workspace--get-geometry w)
|
||||
(if (and (= x x-new)
|
||||
(= y y-new))
|
||||
(frame-parameter w 'exwm-timestamp)
|
||||
-1)))
|
||||
(mapcar
|
||||
(lambda (w)
|
||||
(or (when (eq output
|
||||
(frame-parameter w
|
||||
'exwm-randr-output))
|
||||
(frame-parameter w 'exwm-timestamp))
|
||||
-1))
|
||||
exwm-workspace--list))))
|
||||
(when (< timestamp timestamp-active)
|
||||
;; Switch to a workspace not active on another output.
|
||||
|
@ -762,14 +748,20 @@ INDEX must not exceed the current number of workspaces."
|
|||
;; Floating.
|
||||
(setq container (frame-parameter exwm--floating-frame
|
||||
'exwm-container))
|
||||
(unless (and (= x-old x-new)
|
||||
(= y-old y-new))
|
||||
(unless (eq (frame-parameter old-frame 'exwm-randr-output)
|
||||
(frame-parameter frame 'exwm-randr-output))
|
||||
(with-slots (x y)
|
||||
(xcb:+request-unchecked+reply exwm--connection
|
||||
(make-instance 'xcb:GetGeometry
|
||||
:drawable container))
|
||||
(setq x (+ x (- x-new x-old))
|
||||
y (+ y (- y-new y-old)))
|
||||
(with-slots ((x1 x)
|
||||
(y1 y))
|
||||
(exwm-workspace--get-geometry old-frame)
|
||||
(with-slots ((x2 x)
|
||||
(y2 y))
|
||||
(exwm-workspace--get-geometry frame)
|
||||
(setq x (+ x (- x2 x1))
|
||||
y (+ y (- y2 y1)))))
|
||||
(exwm--set-geometry id x y nil nil)
|
||||
(exwm--set-geometry container x y nil nil)))
|
||||
(if (exwm-workspace--minibuffer-own-frame-p)
|
||||
|
|
Loading…
Reference in a new issue