about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--exwm-core.el15
-rw-r--r--exwm-floating.el65
2 files changed, 62 insertions, 18 deletions
diff --git a/exwm-core.el b/exwm-core.el
index 9810de4f749e..74eb94fc4969 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 6bb635a5657d..4ea495d0d256 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].")