Add a command to interactively move X window to the current workspace
* exwm-workspace.el (exwm-workspace-move-window): Hide buffer on the original Emacs window when moving an X window to the current workspace. * exwm-workspace.el: New function exwm-workspace-switch-to-window for interactively moving an X window on another workspace to the current one.
This commit is contained in:
parent
5373c1df1a
commit
3f2f844569
1 changed files with 29 additions and 2 deletions
|
@ -174,7 +174,7 @@ The optional FORCE option is for internal use only."
|
||||||
(user-error "[EXWM] Workspace index out of range: %d" index))
|
(user-error "[EXWM] Workspace index out of range: %d" index))
|
||||||
(with-current-buffer (exwm--id->buffer id)
|
(with-current-buffer (exwm--id->buffer id)
|
||||||
(let ((frame (elt exwm-workspace--list index)))
|
(let ((frame (elt exwm-workspace--list index)))
|
||||||
(when (not (equal exwm--frame frame))
|
(unless (eq exwm--frame frame)
|
||||||
(let ((name (replace-regexp-in-string "^\\s-*" "" (buffer-name))))
|
(let ((name (replace-regexp-in-string "^\\s-*" "" (buffer-name))))
|
||||||
(exwm-workspace-rename-buffer
|
(exwm-workspace-rename-buffer
|
||||||
(if (= index exwm-workspace-current-index) name (concat " " name))))
|
(if (= index exwm-workspace-current-index) name (concat " " name))))
|
||||||
|
@ -191,7 +191,12 @@ The optional FORCE option is for internal use only."
|
||||||
:x 0 :y 0))
|
:x 0 :y 0))
|
||||||
(xcb:flush exwm--connection))
|
(xcb:flush exwm--connection))
|
||||||
;; Move the window itself
|
;; Move the window itself
|
||||||
|
(if (/= index exwm-workspace-current-index)
|
||||||
(bury-buffer)
|
(bury-buffer)
|
||||||
|
(set-window-buffer (get-buffer-window (current-buffer) t)
|
||||||
|
(or (get-buffer "*scratch*")
|
||||||
|
(prog1 (get-buffer-create "*scratch*")
|
||||||
|
(set-buffer-major-mode "*scratch*")))))
|
||||||
(exwm-layout--hide id)
|
(exwm-layout--hide id)
|
||||||
(xcb:+request exwm--connection
|
(xcb:+request exwm--connection
|
||||||
(make-instance 'xcb:ReparentWindow
|
(make-instance 'xcb:ReparentWindow
|
||||||
|
@ -203,6 +208,28 @@ The optional FORCE option is for internal use only."
|
||||||
(exwm--id->buffer id)))))
|
(exwm--id->buffer id)))))
|
||||||
(exwm-workspace--update-switch-history)))
|
(exwm-workspace--update-switch-history)))
|
||||||
|
|
||||||
|
(defun exwm-workspace-switch-to-window ()
|
||||||
|
"Make the current Emacs window display another X window."
|
||||||
|
(interactive)
|
||||||
|
;; Show all buffers
|
||||||
|
(dolist (pair exwm--id-buffer-alist)
|
||||||
|
(with-current-buffer (cdr pair)
|
||||||
|
(when (= ?\s (aref (buffer-name) 0))
|
||||||
|
(rename-buffer (substring (buffer-name) 1)))))
|
||||||
|
(let ((buffer (read-buffer "Switch to window: " nil t)))
|
||||||
|
(when buffer
|
||||||
|
(with-current-buffer buffer
|
||||||
|
(when (and (eq major-mode 'exwm-mode)
|
||||||
|
(not (eq exwm--frame exwm-workspace--current)))
|
||||||
|
(exwm-workspace-move-window exwm-workspace-current-index
|
||||||
|
exwm--id)))))
|
||||||
|
;; Hide buffers on other workspaces
|
||||||
|
(dolist (pair exwm--id-buffer-alist)
|
||||||
|
(with-current-buffer (cdr pair)
|
||||||
|
(unless (or (eq exwm--frame exwm-workspace--current)
|
||||||
|
(= ?\s (aref (buffer-name) 0)))
|
||||||
|
(rename-buffer (concat " " (buffer-name)))))))
|
||||||
|
|
||||||
(defun exwm-workspace-rename-buffer (newname)
|
(defun exwm-workspace-rename-buffer (newname)
|
||||||
"Rename a buffer."
|
"Rename a buffer."
|
||||||
(let ((hidden (= ?\s (aref newname 0)))
|
(let ((hidden (= ?\s (aref newname 0)))
|
||||||
|
|
Loading…
Reference in a new issue