From eafd031c556ecfe986c656ca72fcde7e06ac819a Mon Sep 17 00:00:00 2001 From: Chris Feng Date: Mon, 7 Sep 2015 17:33:22 +0800 Subject: [PATCH] Allow hide/show mode-line on floating frames * exwm-core.el: new buffer-local variable exwm--floating-mode-line-format for saving mode-line-format when mode-line is hidden * exwm-floating.el (exwm-floating--fit-frame-to-window) (exwm-floating-hide-mode-line, exwm-floating-show-mode-line): new functions for resizing frames, hiding/showing mode-line respectively; (exwm-floating--set-floating): use exwm-floating--fit-frame-to-window to resize frames --- exwm-core.el | 15 +++++------ exwm-floating.el | 65 ++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 62 insertions(+), 18 deletions(-) diff --git a/exwm-core.el b/exwm-core.el index 9810de4f7..74eb94fc4 100644 --- a/exwm-core.el +++ b/exwm-core.el @@ -78,13 +78,14 @@ "Event mask set on all managed windows.") ;; Internal variables -(defvar-local exwm--id nil) ;window ID -(defvar-local exwm--frame nil) ;workspace frame -(defvar-local exwm--floating-frame nil) ;floating frame -(defvar-local exwm--floating-edges nil) ;four edges -(defvar-local exwm--fullscreen nil) ;used in fullscreen -(defvar-local exwm--floating-frame-geometry nil) ;in fullscreen -(defvar-local exwm--fixed-size nil) ;fixed size +(defvar-local exwm--id nil) ;window ID +(defvar-local exwm--frame nil) ;workspace frame +(defvar-local exwm--floating-frame nil) ;floating frame +(defvar-local exwm--floating-edges nil) ;four edges +(defvar-local exwm--floating-mode-line-format nil) ;save mode-line-format +(defvar-local exwm--fullscreen nil) ;used in fullscreen +(defvar-local exwm--floating-frame-geometry nil) ;in fullscreen +(defvar-local exwm--fixed-size nil) ;fixed size (defvar-local exwm--on-KeyPress ;KeyPress event handler #'exwm-input--on-KeyPress-line-mode) ;; Properties diff --git a/exwm-floating.el b/exwm-floating.el index 6bb635a56..4ea495d0d 100644 --- a/exwm-floating.el +++ b/exwm-floating.el @@ -166,17 +166,7 @@ (+ width exwm-floating-border-width) (+ height exwm-floating-border-width)))) ;; Fit frame to client - (xcb:+request exwm--connection - (make-instance 'xcb:ConfigureWindow - :window outer-id - :value-mask (logior xcb:ConfigWindow:Width - xcb:ConfigWindow:Height - xcb:ConfigWindow:StackMode) - :width (+ width (* 2 exwm-floating-border-width)) - :height (+ height (* 2 exwm-floating-border-width) - (window-mode-line-height) - (window-header-line-height)) - :stack-mode xcb:StackMode:Above)) ;top-most + (exwm-floating--fit-frame-to-window outer-id width height) ;; Reparent window to this frame (xcb:+request exwm--connection (make-instance 'xcb:ChangeWindowAttributes @@ -246,6 +236,59 @@ (exwm-floating--unset-floating exwm--id) (exwm-floating--set-floating exwm--id)))) +(defun exwm-floating--fit-frame-to-window (&optional frame-outer-id + width height) + "Resize a floating frame to make it fit the size of the window. + +Default to resize `exwm--floating-frame' unless FRAME-OUTER-ID is non-nil. +This function will issue an `xcb:GetGeometry' request unless WIDTH and HEIGHT +are provided. You should call `xcb:flush' and assign `window-size-fixed' a +non-nil value afterwards." + (setq window-size-fixed nil) + (unless (and width height) + (let ((geometry (xcb:+request-unchecked+reply exwm--connection + (make-instance 'xcb:GetGeometry :drawable exwm--id)))) + (setq width (slot-value geometry 'width) + height (slot-value geometry 'height)))) + (xcb:+request exwm--connection + (make-instance 'xcb:ConfigureWindow + :window (or frame-outer-id + (frame-parameter exwm--floating-frame + 'exwm-outer-id)) + :value-mask (logior xcb:ConfigWindow:Width + xcb:ConfigWindow:Height + xcb:ConfigWindow:StackMode) + :width (+ width (* 2 exwm-floating-border-width)) + :height (+ height (* 2 exwm-floating-border-width) + (window-mode-line-height) + (window-header-line-height)) + :stack-mode xcb:StackMode:Above))) ;top-most + +(defun exwm-floating-hide-mode-line () + "Hide mode-line of a floating frame." + (interactive) + (unless (eq major-mode 'exwm-mode) + (user-error "[EXWM] Please use this command with EXWM buffers")) + (when (and exwm--floating-frame mode-line-format) + (setq exwm--floating-mode-line-format mode-line-format + mode-line-format nil) + (exwm-floating--fit-frame-to-window) + (xcb:flush exwm--connection) + (setq window-size-fixed t))) + +(defun exwm-floating-show-mode-line () + "Show mode-line of a floating frame." + (interactive) + (unless (eq major-mode 'exwm-mode) + (user-error "[EXWM] Please use this command with EXWM buffers")) + (when (and exwm--floating-frame (not mode-line-format)) + (setq mode-line-format exwm--floating-mode-line-format + exwm--floating-mode-line-format nil) + (exwm-floating--fit-frame-to-window) + (exwm-input-grab-keyboard) ;mode-line-format may be outdated + (xcb:flush exwm--connection) + (setq window-size-fixed t))) + (defvar exwm-floating--moveresize-calculate nil "Calculate move/resize parameters [frame-id event-mask x y width height].")