From ce2191c444ae29edf669790a1002238b8fc90ac4 Mon Sep 17 00:00:00 2001 From: Manuel Giraud Date: Wed, 12 Oct 2022 10:47:11 +0200 Subject: [PATCH] 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. --- exwm.el | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/exwm.el b/exwm.el index b025f6b49..1bfeb3638 100644 --- a/exwm.el +++ b/exwm.el @@ -420,8 +420,8 @@ (setq type (slot-value obj 'type) id (slot-value obj 'window) data (slot-value (slot-value obj 'data) 'data32)) - (exwm--log "atom=%s(%s)" (x-get-atom-name type exwm-workspace--current) - type) + (exwm--log "atom=%s(%s) id=#x%x data=%s" (x-get-atom-name type exwm-workspace--current) + type (or id 0) data) (cond ;; _NET_NUMBER_OF_DESKTOPS. ((= type xcb:Atom:_NET_NUMBER_OF_DESKTOPS) @@ -443,7 +443,8 @@ ((= type xcb:Atom:_NET_ACTIVE_WINDOW) (let ((buffer (exwm--id->buffer id)) 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 (when (eq exwm--frame exwm-workspace--current) (if exwm--floating-frame @@ -457,7 +458,11 @@ (setq window (get-buffer-window nil t)) (when (or iconic (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. ((= type xcb:Atom:_NET_CLOSE_WINDOW) (let ((buffer (exwm--id->buffer id)))