Focus workspace frames upon _NET_ACTIVE_WINDOW

* exwm.el (exwm--on-ClientMessage): Take care of focusing
workspace frames when a _NET_ACTIVE_WINDOW message is received for
a workspace frame.  This is responsibility of the window manager
when it advertises _NET_ACTIVE_WINDOW support, which we do.
Emacs versions before 29 took care of setting the input focus to
the frame.

Thanks-to: Po Lu for the work on Emacs and assistance with this
           issue.
This commit is contained in:
Manuel Giraud 2022-10-12 10:47:11 +02:00 committed by Adrián Medraño Calvo
parent e43bd78258
commit ce2191c444

13
exwm.el
View file

@ -420,8 +420,8 @@
(setq type (slot-value obj 'type) (setq type (slot-value obj 'type)
id (slot-value obj 'window) id (slot-value obj 'window)
data (slot-value (slot-value obj 'data) 'data32)) data (slot-value (slot-value obj 'data) 'data32))
(exwm--log "atom=%s(%s)" (x-get-atom-name type exwm-workspace--current) (exwm--log "atom=%s(%s) id=#x%x data=%s" (x-get-atom-name type exwm-workspace--current)
type) type (or id 0) data)
(cond (cond
;; _NET_NUMBER_OF_DESKTOPS. ;; _NET_NUMBER_OF_DESKTOPS.
((= type xcb:Atom:_NET_NUMBER_OF_DESKTOPS) ((= type xcb:Atom:_NET_NUMBER_OF_DESKTOPS)
@ -443,7 +443,8 @@
((= type xcb:Atom:_NET_ACTIVE_WINDOW) ((= type xcb:Atom:_NET_ACTIVE_WINDOW)
(let ((buffer (exwm--id->buffer id)) (let ((buffer (exwm--id->buffer id))
iconic window) iconic window)
(when (buffer-live-p buffer) (if (buffer-live-p buffer)
;; Either an `exwm-mode' buffer (an X window) or a floating frame.
(with-current-buffer buffer (with-current-buffer buffer
(when (eq exwm--frame exwm-workspace--current) (when (eq exwm--frame exwm-workspace--current)
(if exwm--floating-frame (if exwm--floating-frame
@ -457,7 +458,11 @@
(setq window (get-buffer-window nil t)) (setq window (get-buffer-window nil t))
(when (or iconic (when (or iconic
(not (eq window (selected-window)))) (not (eq window (selected-window))))
(select-window window)))))))) (select-window window)))))
;; A workspace.
(dolist (f exwm-workspace--list)
(when (eq id (frame-parameter f 'exwm-outer-id))
(x-focus-frame f t))))))
;; _NET_CLOSE_WINDOW. ;; _NET_CLOSE_WINDOW.
((= type xcb:Atom:_NET_CLOSE_WINDOW) ((= type xcb:Atom:_NET_CLOSE_WINDOW)
(let ((buffer (exwm--id->buffer id))) (let ((buffer (exwm--id->buffer id)))