From 048994c7948528630b5c13f56dd22a9b2972e09c Mon Sep 17 00:00:00 2001 From: Chris Feng Date: Mon, 10 Aug 2015 14:23:37 +0800 Subject: [PATCH] Remove redundant code caused by the concurrency of events (continued) Remove `exwm--with-current-id`, which was introduced to as a wrapper to `with-current-buffer` to do extra checks. Note that in functions run as hooks, the validation of window ID is still required as they are not synchronized with events. --- exwm-input.el | 37 ++++++++++++++++++++----------------- exwm-layout.el | 4 +++- exwm-manage.el | 4 ++-- exwm.el | 26 +++++++++----------------- 4 files changed, 34 insertions(+), 37 deletions(-) diff --git a/exwm-input.el b/exwm-input.el index 97dfd53..24aa94a 100644 --- a/exwm-input.el +++ b/exwm-input.el @@ -56,7 +56,7 @@ It's updated in several occasions, and only used by `exwm-input--set-focus'.") (defun exwm-input--set-focus (id) "Set input focus to window ID in a proper way." - (exwm--with-current-id id + (with-current-buffer (exwm--id->buffer id) (exwm--log "Set focus ID to #x%x" id) (setq exwm-input--focus-id id) (if (and (not exwm--hints-input) @@ -105,21 +105,24 @@ It's updated in several occasions, and only used by `exwm-input--set-focus'.") exwm--floating-frame) (x-focus-frame exwm--floating-frame))) ;; Finally focus the window - (exwm-input--set-focus exwm-input--focus-id)) - (exwm--with-current-id exwm-input--focus-id - (exwm--log "Set focus ID to #x%x" xcb:Window:None) - (setq exwm-input--focus-id xcb:Window:None) - (let ((frame (selected-frame))) - (if exwm--floating-frame - (unless (or (eq frame exwm--floating-frame) - (active-minibuffer-window)) - ;; Redirect input focus to the workspace frame - (exwm--log "Redirect input focus (%s => %s)" - exwm--floating-frame frame) - (redirect-frame-focus exwm--floating-frame frame)) - ;; Focus the workspace frame - (exwm--log "Focus on workspace %s" frame) - (x-focus-frame frame)))))) + (when (exwm--id->buffer exwm-input--focus-id) + (exwm-input--set-focus exwm-input--focus-id))) + (let ((buffer (exwm--id->buffer exwm-input--focus-id))) + (when buffer + (with-current-buffer buffer + (exwm--log "Set focus ID to #x%x" xcb:Window:None) + (setq exwm-input--focus-id xcb:Window:None) + (let ((frame (selected-frame))) + (if exwm--floating-frame + (unless (or (eq frame exwm--floating-frame) + (active-minibuffer-window)) + ;; Redirect input focus to the workspace frame + (exwm--log "Redirect input focus (%s => %s)" + exwm--floating-frame frame) + (redirect-frame-focus exwm--floating-frame frame)) + ;; Focus the workspace frame + (exwm--log "Focus on workspace %s" frame) + (x-focus-frame frame)))))))) (setq exwm-input--focus-lock nil))) (defun exwm-input--finish-key-sequence () @@ -163,7 +166,7 @@ It's updated in several occasions, and only used by `exwm-input--set-focus'.") (t ;; Click to focus (unless (and (boundp 'exwm--id) (= event exwm--id)) - (exwm--with-current-id event + (with-current-buffer (exwm--id->buffer event) (select-frame-set-input-focus (or exwm--floating-frame exwm--frame)) (select-window (get-buffer-window nil 'visible)))) diff --git a/exwm-layout.el b/exwm-layout.el index 4ae4859..5d056af 100644 --- a/exwm-layout.el +++ b/exwm-layout.el @@ -34,7 +34,9 @@ (make-instance 'xcb:icccm:set-WM_STATE :window id :state xcb:icccm:WM_STATE:NormalState :icon xcb:Window:None)) - (let* ((edges (or (exwm--with-current-id id exwm--floating-edges) + (let* ((buffer (exwm--id->buffer id)) + (edges (or (and buffer + (with-current-buffer buffer exwm--floating-edges)) (window-inside-pixel-edges window))) (x (elt edges 0)) (y (elt edges 1)) diff --git a/exwm-manage.el b/exwm-manage.el index 6c22948..9d98607 100644 --- a/exwm-manage.el +++ b/exwm-manage.el @@ -35,7 +35,7 @@ corresponding buffer.") (defun exwm-manage--update-geometry (id &optional force) "Update window geometry." - (exwm--with-current-id id + (with-current-buffer (exwm--id->buffer id) (unless (and exwm--geometry (not force)) (let ((reply (xcb:+request-unchecked+reply exwm--connection (make-instance 'xcb:GetGeometry :drawable id)))) @@ -137,7 +137,7 @@ corresponding buffer.") (exwm-input-grab-keyboard id) (exwm-workspace--update-switch-history) (setq exwm-input--focus-lock nil) ;unlocked in advance - (exwm--with-current-id id + (with-current-buffer (exwm--id->buffer id) (run-hooks 'exwm-manage-finish-hook)))) (setq exwm-input--focus-lock nil)) diff --git a/exwm.el b/exwm.el index 4c4d4af..95b6742 100644 --- a/exwm.el +++ b/exwm.el @@ -208,17 +208,9 @@ (exwm-layout--refresh) (exwm-input-grab-keyboard)))) -(defmacro exwm--with-current-id (id &rest body) - "Evaluate BODY in the context of the buffer corresponding to window ID." - (declare (indent 1)) - `(when ,id - (let ((buffer (exwm--id->buffer ,id))) - (when buffer - (with-current-buffer buffer ,@body))))) - (defun exwm--update-window-type (id &optional force) "Update _NET_WM_WINDOW_TYPE." - (exwm--with-current-id id + (with-current-buffer (exwm--id->buffer id) (unless (and exwm-window-type (not force)) (let ((reply (xcb:+request-unchecked+reply exwm--connection (make-instance 'xcb:ewmh:get-_NET_WM_WINDOW_TYPE @@ -231,7 +223,7 @@ (defun exwm--update-class (id &optional force) "Update WM_CLASS." - (exwm--with-current-id id + (with-current-buffer (exwm--id->buffer id) (unless (and exwm-instance-name exwm-class-name (not force)) (let ((reply (xcb:+request-unchecked+reply exwm--connection (make-instance 'xcb:icccm:get-WM_CLASS :window id)))) @@ -246,7 +238,7 @@ (defun exwm--update-utf8-title (id &optional force) "Update _NET_WM_NAME." - (exwm--with-current-id id + (with-current-buffer (exwm--id->buffer id) (when (or force (not exwm-title)) (let ((reply (xcb:+request-unchecked+reply exwm--connection (make-instance 'xcb:ewmh:get-_NET_WM_NAME :window id)))) @@ -258,7 +250,7 @@ (defun exwm--update-ctext-title (id &optional force) "Update WM_NAME." - (exwm--with-current-id id + (with-current-buffer (exwm--id->buffer id) (unless (or exwm--title-is-utf8 (and exwm-title (not force))) (let ((reply (xcb:+request-unchecked+reply exwm--connection @@ -275,7 +267,7 @@ (defun exwm--update-transient-for (id &optional force) "Update WM_TRANSIENT_FOR." - (exwm--with-current-id id + (with-current-buffer (exwm--id->buffer id) (unless (and exwm-transient-for (not force)) (let ((reply (xcb:+request-unchecked+reply exwm--connection (make-instance 'xcb:icccm:get-WM_TRANSIENT_FOR @@ -285,7 +277,7 @@ (defun exwm--update-normal-hints (id &optional force) "Update WM_NORMAL_HINTS." - (exwm--with-current-id id + (with-current-buffer (exwm--id->buffer id) (unless (and (not force) (or exwm--normal-hints-x exwm--normal-hints-y exwm--normal-hints-width exwm--normal-hints-height @@ -332,7 +324,7 @@ (defun exwm--update-hints (id &optional force) "Update WM_HINTS." - (exwm--with-current-id id + (with-current-buffer (exwm--id->buffer id) (unless (and (not force) exwm--hints-input exwm--hints-urgency) (let ((reply (xcb:+request-unchecked+reply exwm--connection (make-instance 'xcb:icccm:get-WM_HINTS :window id)))) @@ -351,7 +343,7 @@ (defun exwm--update-protocols (id &optional force) "Update WM_PROTOCOLS." - (exwm--with-current-id id + (with-current-buffer (exwm--id->buffer id) (unless (and exwm--protocols (not force)) (let ((reply (xcb:+request-unchecked+reply exwm--connection (make-instance 'xcb:icccm:get-WM_PROTOCOLS @@ -361,7 +353,7 @@ (defun exwm--update-state (id &optional force) "Update WM_STATE." - (exwm--with-current-id id + (with-current-buffer (exwm--id->buffer id) (unless (and exwm-state (not force)) (let ((reply (xcb:+request-unchecked+reply exwm--connection (make-instance 'xcb:icccm:get-WM_STATE :window id))))