From 97daba20ad22f05f2e4c1347ff86d6c957142a0a Mon Sep 17 00:00:00 2001 From: Chris Feng Date: Sat, 6 Feb 2016 20:33:56 +0800 Subject: Improve bc80eefe * exwm-layout.el (exwm-layout--set-frame-fullscreen): * exwm-randr.el (exwm-randr--refresh): * exwm-workspace.el (exwm-workspace--resize-minibuffer): (exwm-workspace-switch): * exwm.el (exwm--on-ClientMessage): Calling `exwm-workspace-switch' in bc80eefe does not work correctly sometimes. This commit improves it by directly specify the geometry info rather than getting it from Emacs frame. --- exwm-layout.el | 2 ++ exwm-randr.el | 6 +++--- exwm-workspace.el | 52 +++++++++++++++++++++++++++++++--------------------- exwm.el | 4 +--- 4 files changed, 37 insertions(+), 27 deletions(-) diff --git a/exwm-layout.el b/exwm-layout.el index 316bf62a7485..0dc5e1ac0285 100644 --- a/exwm-layout.el +++ b/exwm-layout.el @@ -203,6 +203,8 @@ (id (frame-parameter frame 'exwm-outer-id)) (workspace (frame-parameter frame 'exwm-workspace))) (with-slots (x y width height) geometry + (when (eq frame exwm-workspace--current) + (exwm-workspace--resize-minibuffer width height)) (exwm-layout--resize-container id workspace x y width height) (xcb:flush exwm--connection)))) diff --git a/exwm-randr.el b/exwm-randr.el index 566f4eeaad7e..7e0d9bab64fe 100644 --- a/exwm-randr.el +++ b/exwm-randr.el @@ -103,6 +103,8 @@ (frame-parameter frame 'exwm-workspace) x y width height) + (when (eq frame exwm-workspace--current) + (exwm-workspace--resize-minibuffer width height)) (setq workareas (nconc workareas (list x y width (- height workarea-offset))) @@ -116,9 +118,7 @@ (make-instance 'xcb:ewmh:set-_NET_DESKTOP_VIEWPORT :window exwm--root :data (vconcat viewports))) - (xcb:flush exwm--connection)) - ;; Force update workspace settings. - (exwm-workspace-switch exwm-workspace-current-index t)) + (xcb:flush exwm--connection))) (defvar exwm-randr-screen-change-hook nil "Normal hook run when screen changes.") diff --git a/exwm-workspace.el b/exwm-workspace.el index 9669428c85f9..1c23ca0229da 100644 --- a/exwm-workspace.el +++ b/exwm-workspace.el @@ -111,6 +111,29 @@ Value nil means to use the default position which is fixed at bottom, while (defvar exwm-workspace--display-echo-area-timer nil "Timer for auto-hiding echo area.") +(defun exwm-workspace--resize-minibuffer (&optional width height) + "Resize minibuffer (and its container) to fit the size of workspace. + +If WIDTH and HEIGHT of the workspace is not specified, they're get from the +workspace frame." + (let ((y (if (eq exwm-workspace-minibuffer-position 'top) + 0 + (- (or height (frame-pixel-height exwm-workspace--current)) + (frame-pixel-height exwm-workspace--minibuffer)))) + (width (or width (frame-pixel-width exwm-workspace--current))) + (container (frame-parameter exwm-workspace--minibuffer + 'exwm-container))) + (xcb:+request exwm--connection + (make-instance 'xcb:ConfigureWindow + :window container + :value-mask (logior xcb:ConfigWindow:Y + xcb:ConfigWindow:Width + xcb:ConfigWindow:StackMode) + :y y + :width width + :stack-mode xcb:StackMode:Above)) + (set-frame-width exwm-workspace--minibuffer width nil t))) + ;;;###autoload (defun exwm-workspace-switch (index &optional force) "Switch to workspace INDEX. Query for INDEX if it's not specified. @@ -148,27 +171,14 @@ The optional FORCE option is for internal use only." (if (not (memq exwm-workspace-minibuffer-position '(top bottom))) (setq default-minibuffer-frame frame) ;; Resize/reposition the minibuffer frame - (let ((x 0) - (y (if (eq exwm-workspace-minibuffer-position 'top) - 0 - (- (frame-pixel-height frame) - (frame-pixel-height exwm-workspace--minibuffer)))) - (width (x-display-pixel-width)) - (container (frame-parameter exwm-workspace--minibuffer - 'exwm-container))) - (xcb:+request exwm--connection - (make-instance 'xcb:ReparentWindow - :window container - :parent (frame-parameter frame 'exwm-workspace) - :x x :y y)) - (xcb:+request exwm--connection - (make-instance 'xcb:ConfigureWindow - :window container - :value-mask (logior xcb:ConfigWindow:Width - xcb:ConfigWindow:StackMode) - :width width - :stack-mode xcb:StackMode:Above)) - (set-frame-width exwm-workspace--minibuffer width nil t))) + (xcb:+request exwm--connection + (make-instance 'xcb:ReparentWindow + :window + (frame-parameter exwm-workspace--minibuffer + 'exwm-container) + :parent (frame-parameter frame 'exwm-workspace) + :x 0 :y 0)) + (exwm-workspace--resize-minibuffer)) ;; Hide windows in other workspaces by preprending a space (unless exwm-workspace-show-all-buffers (dolist (i exwm--id-buffer-alist) diff --git a/exwm.el b/exwm.el index 4335c814cf49..720274fdcbb9 100644 --- a/exwm.el +++ b/exwm.el @@ -341,9 +341,7 @@ :window id :data (vector xcb:Atom:_NET_WM_STATE_FULLSCREEN))) - (xcb:flush exwm--connection))) - ;; Force update workspace settings. - (exwm-workspace-switch exwm-workspace-current-index t)) + (xcb:flush exwm--connection)))) (when buffer ;ensure it's managed (with-current-buffer buffer ;; _NET_WM_STATE_MODAL -- cgit 1.4.1