mirror of
https://github.com/emacs-exwm/exwm.git
synced 2024-11-30 16:07:59 +01:00
Fix emacsclient issues
* exwm-workspace.el (exwm-workspace--client-p): New function for testing emacsclient frames. (exwm-workspace--update-minibuffer-height) (exwm-workspace--on-minibuffer-setup) (exwm-workspace--on-minibuffer-exit, exwm-workspace--on-echo-area-dirty) (exwm-workspace--on-echo-area-clear): * exwm-input.el (exwm-input--on-buffer-list-update) (exwm-input--on-minibuffer-setup): * exwm-layout.el (exwm-layout--on-minibuffer-setup) (exwm-layout--on-echo-area-change): Use it. * exwm-workspace.el (exwm-workspace--add-frame-as-workspace): Always clear the 'client' frame parameter. (exwm-workspace--init): Fix a typo.
This commit is contained in:
parent
e7ff9a9f90
commit
f04b041cae
3 changed files with 42 additions and 32 deletions
|
@ -79,6 +79,9 @@ It's updated in several occasions, and only used by `exwm-input--set-focus'.")
|
||||||
(exwm-input--set-active-window id)
|
(exwm-input--set-active-window id)
|
||||||
(xcb:flush exwm--connection))))
|
(xcb:flush exwm--connection))))
|
||||||
|
|
||||||
|
(declare-function exwm-workspace--client-p "exwm-workspace.el"
|
||||||
|
(&optional frame))
|
||||||
|
|
||||||
(defvar exwm-input--update-focus-window nil "The (Emacs) window to be focused.
|
(defvar exwm-input--update-focus-window nil "The (Emacs) window to be focused.
|
||||||
|
|
||||||
This value should always be overwritten.")
|
This value should always be overwritten.")
|
||||||
|
@ -87,7 +90,7 @@ This value should always be overwritten.")
|
||||||
"Run in `buffer-list-update-hook' to track input focus."
|
"Run in `buffer-list-update-hook' to track input focus."
|
||||||
(when (and (not (minibufferp)) ;Do not set input focus on minibuffer window.
|
(when (and (not (minibufferp)) ;Do not set input focus on minibuffer window.
|
||||||
(eq (current-buffer) (window-buffer)) ;e.g. `with-temp-buffer'.
|
(eq (current-buffer) (window-buffer)) ;e.g. `with-temp-buffer'.
|
||||||
(frame-parameter nil 'exwm-outer-id)) ;e.g. emacsclient frame.
|
(not (exwm-workspace--client-p)))
|
||||||
(setq exwm-input--update-focus-window (selected-window))
|
(setq exwm-input--update-focus-window (selected-window))
|
||||||
(exwm-input--update-focus-defer)))
|
(exwm-input--update-focus-defer)))
|
||||||
|
|
||||||
|
@ -183,8 +186,9 @@ This value should always be overwritten.")
|
||||||
|
|
||||||
(defun exwm-input--on-minibuffer-setup ()
|
(defun exwm-input--on-minibuffer-setup ()
|
||||||
"Run in `minibuffer-setup-hook' to set input focus."
|
"Run in `minibuffer-setup-hook' to set input focus."
|
||||||
;; Set input focus on the Emacs frame
|
(unless (exwm-workspace--client-p)
|
||||||
(x-focus-frame (window-frame (minibuffer-selected-window))))
|
;; Set input focus on the Emacs frame
|
||||||
|
(x-focus-frame (window-frame (minibuffer-selected-window)))))
|
||||||
|
|
||||||
(defun exwm-input--set-active-window (&optional id)
|
(defun exwm-input--set-active-window (&optional id)
|
||||||
"Set _NET_ACTIVE_WINDOW."
|
"Set _NET_ACTIVE_WINDOW."
|
||||||
|
|
|
@ -375,9 +375,12 @@ selected by `other-buffer'."
|
||||||
(exwm-layout--set-client-list-stacking)
|
(exwm-layout--set-client-list-stacking)
|
||||||
(xcb:flush exwm--connection))))
|
(xcb:flush exwm--connection))))
|
||||||
|
|
||||||
|
(declare-function exwm-workspace--client-p "exwm-workspace.el"
|
||||||
|
(&optional frame))
|
||||||
|
|
||||||
(defun exwm-layout--on-minibuffer-setup ()
|
(defun exwm-layout--on-minibuffer-setup ()
|
||||||
"Refresh layout when minibuffer grows."
|
"Refresh layout when minibuffer grows."
|
||||||
(when (frame-parameter nil 'exwm-outer-id)
|
(unless (exwm-workspace--client-p)
|
||||||
(run-with-idle-timer 0.01 nil ;FIXME
|
(run-with-idle-timer 0.01 nil ;FIXME
|
||||||
(lambda ()
|
(lambda ()
|
||||||
(when (< 1 (window-height (minibuffer-window)))
|
(when (< 1 (window-height (minibuffer-window)))
|
||||||
|
@ -386,8 +389,7 @@ selected by `other-buffer'."
|
||||||
(defun exwm-layout--on-echo-area-change (&optional dirty)
|
(defun exwm-layout--on-echo-area-change (&optional dirty)
|
||||||
"Run when message arrives or in `echo-area-clear-hook' to refresh layout."
|
"Run when message arrives or in `echo-area-clear-hook' to refresh layout."
|
||||||
(when (and (current-message)
|
(when (and (current-message)
|
||||||
;; Exclude non-graphical frames.
|
(not (exwm-workspace--client-p))
|
||||||
(frame-parameter nil 'exwm-outer-id)
|
|
||||||
(or (cl-position ?\n (current-message))
|
(or (cl-position ?\n (current-message))
|
||||||
(> (length (current-message))
|
(> (length (current-message))
|
||||||
(frame-width exwm-workspace--current))))
|
(frame-width exwm-workspace--current))))
|
||||||
|
|
|
@ -48,6 +48,10 @@ NIL if FRAME is not a workspace"
|
||||||
"Return t if FRAME is a workspace."
|
"Return t if FRAME is a workspace."
|
||||||
(memq frame exwm-workspace--list))
|
(memq frame exwm-workspace--list))
|
||||||
|
|
||||||
|
(defsubst exwm-workspace--client-p (&optional frame)
|
||||||
|
"Return non-nil if FRAME is an emacsclient frame."
|
||||||
|
(frame-parameter frame 'client))
|
||||||
|
|
||||||
(defun exwm-workspace--workspace-from-frame-or-index (frame-or-index)
|
(defun exwm-workspace--workspace-from-frame-or-index (frame-or-index)
|
||||||
"Retrieve the workspace frame from FRAME-OR-INDEX."
|
"Retrieve the workspace frame from FRAME-OR-INDEX."
|
||||||
(cond
|
(cond
|
||||||
|
@ -882,24 +886,25 @@ Please check `exwm-workspace--minibuffer-own-frame-p' first."
|
||||||
|
|
||||||
(defun exwm-workspace--update-minibuffer-height (&optional echo-area)
|
(defun exwm-workspace--update-minibuffer-height (&optional echo-area)
|
||||||
"Update the minibuffer frame height."
|
"Update the minibuffer frame height."
|
||||||
(let ((height
|
(unless (exwm-workspace--client-p)
|
||||||
(with-current-buffer
|
(let ((height
|
||||||
(window-buffer (minibuffer-window exwm-workspace--minibuffer))
|
(with-current-buffer
|
||||||
(max 1
|
(window-buffer (minibuffer-window exwm-workspace--minibuffer))
|
||||||
(if echo-area
|
(max 1
|
||||||
(let ((width (frame-width exwm-workspace--minibuffer))
|
(if echo-area
|
||||||
(result 0))
|
(let ((width (frame-width exwm-workspace--minibuffer))
|
||||||
(mapc (lambda (i)
|
(result 0))
|
||||||
(setq result
|
(mapc (lambda (i)
|
||||||
(+ result
|
(setq result
|
||||||
(ceiling (1+ (length i)) width))))
|
(+ result
|
||||||
(split-string (or (current-message) "") "\n"))
|
(ceiling (1+ (length i)) width))))
|
||||||
result)
|
(split-string (or (current-message) "") "\n"))
|
||||||
(count-screen-lines))))))
|
result)
|
||||||
(when (and (integerp max-mini-window-height)
|
(count-screen-lines))))))
|
||||||
(> height max-mini-window-height))
|
(when (and (integerp max-mini-window-height)
|
||||||
(setq height max-mini-window-height))
|
(> height max-mini-window-height))
|
||||||
(set-frame-height exwm-workspace--minibuffer height)))
|
(setq height max-mini-window-height))
|
||||||
|
(set-frame-height exwm-workspace--minibuffer height))))
|
||||||
|
|
||||||
(defun exwm-workspace--on-ConfigureNotify (data _synthetic)
|
(defun exwm-workspace--on-ConfigureNotify (data _synthetic)
|
||||||
"Adjust the container to fit the minibuffer frame."
|
"Adjust the container to fit the minibuffer frame."
|
||||||
|
@ -986,8 +991,7 @@ Please check `exwm-workspace--minibuffer-own-frame-p' first."
|
||||||
(defun exwm-workspace--on-minibuffer-setup ()
|
(defun exwm-workspace--on-minibuffer-setup ()
|
||||||
"Run in minibuffer-setup-hook to show the minibuffer and its container."
|
"Run in minibuffer-setup-hook to show the minibuffer and its container."
|
||||||
(when (and (= 1 (minibuffer-depth))
|
(when (and (= 1 (minibuffer-depth))
|
||||||
;; Exclude non-graphical frames.
|
(not (exwm-workspace--client-p)))
|
||||||
(frame-parameter nil 'exwm-outer-id))
|
|
||||||
(add-hook 'post-command-hook #'exwm-workspace--update-minibuffer-height)
|
(add-hook 'post-command-hook #'exwm-workspace--update-minibuffer-height)
|
||||||
(exwm-workspace--show-minibuffer))
|
(exwm-workspace--show-minibuffer))
|
||||||
;; FIXME: This is a temporary fix for the *Completions* buffer not
|
;; FIXME: This is a temporary fix for the *Completions* buffer not
|
||||||
|
@ -1008,8 +1012,7 @@ Please check `exwm-workspace--minibuffer-own-frame-p' first."
|
||||||
(defun exwm-workspace--on-minibuffer-exit ()
|
(defun exwm-workspace--on-minibuffer-exit ()
|
||||||
"Run in minibuffer-exit-hook to hide the minibuffer container."
|
"Run in minibuffer-exit-hook to hide the minibuffer container."
|
||||||
(when (and (= 1 (minibuffer-depth))
|
(when (and (= 1 (minibuffer-depth))
|
||||||
;; Exclude non-graphical frames.
|
(not (exwm-workspace--client-p)))
|
||||||
(frame-parameter nil 'exwm-outer-id))
|
|
||||||
(remove-hook 'post-command-hook #'exwm-workspace--update-minibuffer-height)
|
(remove-hook 'post-command-hook #'exwm-workspace--update-minibuffer-height)
|
||||||
(exwm-workspace--hide-minibuffer)))
|
(exwm-workspace--hide-minibuffer)))
|
||||||
|
|
||||||
|
@ -1018,8 +1021,7 @@ Please check `exwm-workspace--minibuffer-own-frame-p' first."
|
||||||
(defun exwm-workspace--on-echo-area-dirty ()
|
(defun exwm-workspace--on-echo-area-dirty ()
|
||||||
"Run when new message arrives to show the echo area and its container."
|
"Run when new message arrives to show the echo area and its container."
|
||||||
(when (and (not (active-minibuffer-window))
|
(when (and (not (active-minibuffer-window))
|
||||||
;; Exclude non-graphical frames.
|
(not (exwm-workspace--client-p))
|
||||||
(frame-parameter nil 'exwm-outer-id)
|
|
||||||
(or (current-message)
|
(or (current-message)
|
||||||
cursor-in-echo-area))
|
cursor-in-echo-area))
|
||||||
(exwm-workspace--update-minibuffer-height t)
|
(exwm-workspace--update-minibuffer-height t)
|
||||||
|
@ -1033,7 +1035,7 @@ Please check `exwm-workspace--minibuffer-own-frame-p' first."
|
||||||
|
|
||||||
(defun exwm-workspace--on-echo-area-clear ()
|
(defun exwm-workspace--on-echo-area-clear ()
|
||||||
"Run in echo-area-clear-hook to hide echo area container."
|
"Run in echo-area-clear-hook to hide echo area container."
|
||||||
(when (frame-parameter nil 'exwm-outer-id) ;Exclude non-graphical frames.
|
(unless (exwm-workspace--client-p)
|
||||||
(unless (active-minibuffer-window)
|
(unless (active-minibuffer-window)
|
||||||
(exwm-workspace--hide-minibuffer))
|
(exwm-workspace--hide-minibuffer))
|
||||||
(when exwm-workspace--display-echo-area-timer
|
(when exwm-workspace--display-echo-area-timer
|
||||||
|
@ -1153,6 +1155,8 @@ Please check `exwm-workspace--minibuffer-own-frame-p' first."
|
||||||
(set-frame-parameter frame 'exwm-outer-id outer-id)
|
(set-frame-parameter frame 'exwm-outer-id outer-id)
|
||||||
(set-frame-parameter frame 'exwm-container container)
|
(set-frame-parameter frame 'exwm-container container)
|
||||||
(set-frame-parameter frame 'exwm-workspace workspace)
|
(set-frame-parameter frame 'exwm-workspace workspace)
|
||||||
|
;; In case it's created by emacsclient.
|
||||||
|
(set-frame-parameter frame 'client nil)
|
||||||
;; Copy RandR frame parameters from the first workspace to
|
;; Copy RandR frame parameters from the first workspace to
|
||||||
;; prevent potential problems. The values do not matter here as
|
;; prevent potential problems. The values do not matter here as
|
||||||
;; they'll be updated by the RandR module later.
|
;; they'll be updated by the RandR module later.
|
||||||
|
@ -1324,7 +1328,7 @@ applied to all subsequently created X frames."
|
||||||
(unless (frame-parameter i 'window-id)
|
(unless (frame-parameter i 'window-id)
|
||||||
(setq initial-workspaces (delq i initial-workspaces))))
|
(setq initial-workspaces (delq i initial-workspaces))))
|
||||||
(setq exwm-workspace--client
|
(setq exwm-workspace--client
|
||||||
(frame-parameter (car exwm-workspace--list) 'client))
|
(frame-parameter (car initial-workspaces) 'client))
|
||||||
(let ((f (car initial-workspaces)))
|
(let ((f (car initial-workspaces)))
|
||||||
;; Remove the possible internal border.
|
;; Remove the possible internal border.
|
||||||
(set-frame-parameter f 'internal-border-width 0)
|
(set-frame-parameter f 'internal-border-width 0)
|
||||||
|
|
Loading…
Reference in a new issue