Skip to content

Commit

Permalink
Correctly activate windows even if they're not in the iconic state
Browse files Browse the repository at this point in the history
* exwm.el (exwm--on-ClientMessage): Handle the case where a window is
hidden but not iconic. This code would previously error in some cases
because a buffer wouldn't have an active window even when it was not in
the iconic state, likely due to a focus race somewhere.

fixes #28
fixes #29
fixes #30
  • Loading branch information
Stebalien committed Apr 1, 2024
1 parent bf92108 commit b3e37eb
Showing 1 changed file with 6 additions and 9 deletions.
15 changes: 6 additions & 9 deletions exwm.el
Original file line number Diff line number Diff line change
Expand Up @@ -493,23 +493,20 @@ RAW-DATA contains unmarshalled ClientMessage event data."
;; _NET_ACTIVE_WINDOW.
((= type xcb:Atom:_NET_ACTIVE_WINDOW)
(let ((buffer (exwm--id->buffer id))
iconic window)
window)
(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
(select-frame exwm--floating-frame)
(setq iconic (exwm-layout--iconic-state-p))
(when iconic
(setq window (get-buffer-window nil t))
(unless window
;; State change: iconic => normal.
(set-window-buffer (frame-selected-window exwm--frame)
(current-buffer)))
(setq window (frame-selected-window exwm--frame))
(set-window-buffer window (current-buffer)))
;; Focus transfer.
(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))
Expand Down

0 comments on commit b3e37eb

Please sign in to comment.