From 63402b0efc19a50e89d868fad3f91b134170aab6 Mon Sep 17 00:00:00 2001 From: Chris Feng Date: Sat, 8 Aug 2015 20:12:07 +0800 Subject: Correct layout refresh problems * Relax the conditions to refresh layout; this may introduce some overheads though * Fix the problem when `*scratch*` buffer is killed; close #12 * Enhance `exwm-reset` by forcing layout refresh in it. This should allow users to overcome some layout bugs --- exwm-layout.el | 34 ++++++++++++++++++---------------- exwm.el | 3 +++ 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/exwm-layout.el b/exwm-layout.el index 1dd8333bb420..906357ed3448 100644 --- a/exwm-layout.el +++ b/exwm-layout.el @@ -157,23 +157,25 @@ (setq exwm--fullscreen nil) (exwm-input-grab-keyboard))) -(defvar exwm-layout--window-configuration (current-window-configuration) - "Last saved window configuration, for avoiding unnecessary refreshes.") - (defun exwm-layout--refresh () "Refresh layout." - (unless (compare-window-configurations exwm-layout--window-configuration - (current-window-configuration)) - (exwm--log "Refresh layout") - (setq exwm-layout--window-configuration (current-window-configuration)) - (let ((frame (selected-frame)) - windows) - (if (not (memq frame exwm-workspace--list)) - ;; Refresh a floating frame - (when (eq major-mode 'exwm-mode) - (with-current-buffer (window-buffer (frame-first-window frame)) - (exwm-layout--show exwm--id (frame-first-window frame)))) - ;; Refresh the whole workspace + (let ((frame (selected-frame)) + windows placeholder) + (if (not (memq frame exwm-workspace--list)) + ;; Refresh a floating frame + (progn + (cl-assert (eq major-mode 'exwm-mode)) + (let ((window (frame-first-window frame))) + (with-current-buffer (window-buffer window) + (exwm--log "Refresh floating window #x%x" exwm--id) + (exwm-layout--show exwm--id window)))) + ;; Refresh the whole workspace + ;; Workspaces other than the active one can also be refreshed (RandR) + (exwm--log "Refresh workspace %s" frame) + (let ((placeholder (get-buffer "*scratch*"))) + (unless placeholder ;create the *scratch* buffer if it's killed + (setq placeholder (get-buffer-create "*scratch*")) + (set-buffer-major-mode placeholder)) (dolist (pair exwm--id-buffer-alist) (with-current-buffer (cdr pair) ;; Exclude windows on other workspaces and floating frames @@ -183,7 +185,7 @@ (exwm-layout--hide exwm--id) (exwm-layout--show exwm--id (car windows)) (dolist (i (cdr windows)) - (set-window-buffer i "*scratch*")))))))))) + (set-window-buffer i placeholder)))))))))) (defun exwm-layout--init () "Initialize layout module." diff --git a/exwm.el b/exwm.el index 984f8eee5ecf..7c9fa59410c1 100644 --- a/exwm.el +++ b/exwm.el @@ -201,6 +201,8 @@ ;; Force update input focus (setq exwm-input--focus-id xcb:Window:None) (exwm-input--update-focus) + ;; Force refresh + (exwm-layout--refresh) (exwm-input-grab-keyboard)))) (defmacro exwm--with-current-id (id &rest body) @@ -396,6 +398,7 @@ (exwm--update-protocols id t)) ((= atom xcb:Atom:WM_STATE) (exwm--update-state id t)) + ((= atom xcb:Atom:_NET_WM_USER_TIME)) ;ignored (t (exwm--log "Unhandled PropertyNotify: %s(%d)" (x-get-atom-name atom) atom))))))) -- cgit 1.4.1