From d8281abca4bc5182040a7866560a1806c59176d4 Mon Sep 17 00:00:00 2001 From: Chris Feng Date: Wed, 3 Feb 2016 13:23:55 +0800 Subject: [PATCH] Avoid unnecessary changes of stacking order * exwm-input.el (exwm-input--update-focus): Only restack a tiling X window when it's not the last but one sibling. This should reduce flickering. --- exwm-input.el | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/exwm-input.el b/exwm-input.el index 156399c..f84b5fc 100644 --- a/exwm-input.el +++ b/exwm-input.el @@ -110,20 +110,34 @@ It's updated in several occasions, and only used by `exwm-input--set-focus'.") (exwm--log "Set focus on #x%x" exwm--id) (exwm-input--set-focus exwm--id) ;; Adjust stacking orders - (xcb:+request exwm--connection - (make-instance 'xcb:ConfigureWindow - :window exwm--container - :value-mask xcb:ConfigWindow:StackMode - :stack-mode (if exwm--floating-frame - xcb:StackMode:Above - xcb:StackMode:Below))) + (if exwm--floating-frame + ;; Put this floating X window at top. + (xcb:+request exwm--connection + (make-instance 'xcb:ConfigureWindow + :window exwm--container + :value-mask xcb:ConfigWindow:StackMode + :stack-mode xcb:StackMode:TopIf)) + ;; This should be the last X window but one in the siblings. + (with-slots (children) + (xcb:+request-unchecked+reply exwm--connection + (make-instance 'xcb:QueryTree + :window + (frame-parameter exwm--frame + 'exwm-workspace))) + (unless (eq (cadr children) exwm--container) + (xcb:+request exwm--connection + (make-instance 'xcb:ConfigureWindow + :window exwm--container + :value-mask xcb:ConfigWindow:StackMode + :stack-mode xcb:StackMode:Below))))) + ;; Make sure Emacs frames are at bottom. (xcb:+request exwm--connection (make-instance 'xcb:ConfigureWindow :window (frame-parameter (or exwm--floating-frame exwm--frame) 'exwm-outer-id) :value-mask xcb:ConfigWindow:StackMode - :stack-mode xcb:StackMode:Below)) + :stack-mode xcb:StackMode:BottomIf)) (xcb:flush exwm--connection)) (when (eq (selected-window) exwm-input--focus-window) (exwm--log "Focus on %s" exwm-input--focus-window)