about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--exwm-core.el6
-rw-r--r--exwm-workspace.el22
2 files changed, 24 insertions, 4 deletions
diff --git a/exwm-core.el b/exwm-core.el
index f0508c602967..09e16582be6a 100644
--- a/exwm-core.el
+++ b/exwm-core.el
@@ -199,6 +199,12 @@
     ["Swap workspaces" exwm-workspace-swap]
     ["Move X window to" exwm-workspace-move-window :keys "C-c C-m"]
     ["Move X window from" exwm-workspace-switch-to-buffer]
+    ["Attach minibuffer" exwm-workspace-attach-minibuffer
+     (and (exwm-workspace--minibuffer-own-frame-p)
+          (not (exwm-workspace--minibuffer-attached-p)))]
+    ["Detach minibuffer" exwm-workspace-detach-minibuffer
+     (and (exwm-workspace--minibuffer-own-frame-p)
+          (exwm-workspace--minibuffer-attached-p))]
     ["Switch workspace" exwm-workspace-switch]
     ;; Place this entry at bottom to avoid selecting others by accident.
     ("Switch to" :filter
diff --git a/exwm-workspace.el b/exwm-workspace.el
index 80a7cbd21525..e33144ec6a7b 100644
--- a/exwm-workspace.el
+++ b/exwm-workspace.el
@@ -1164,6 +1164,17 @@ Please check `exwm-workspace--minibuffer-own-frame-p' first."
       ;; If the current workspace is deleted, switch to next one.
       (when (eq frame exwm-workspace--current)
         (exwm-workspace-switch nextw)))
+    ;; Reparent out the frame.
+    (xcb:+request exwm--connection
+        (make-instance 'xcb:ReparentWindow
+                       :window (frame-parameter frame 'exwm-outer-id)
+                       :parent exwm--root
+                       :x 0
+                       :y 0))
+    ;; Destroy the containers.
+    (xcb:+request exwm--connection
+        (make-instance 'xcb:DestroyWindow
+                       :window (frame-parameter frame 'exwm-workspace)))
     ;; Update EWMH properties.
     (exwm-workspace--update-ewmh-props)
     ;; Update switch history.
@@ -1234,7 +1245,7 @@ applied to all subsequently created X frames."
       (setq exwm-workspace--minibuffer
             (make-frame '((window-system . x) (minibuffer . only)
                           (left . 10000) (right . 10000)
-                          (width . 0) (height . 0)
+                          (width . 1) (height . 1)
                           (internal-border-width . 0)
                           (client . nil))))
       ;; Remove/hide existing frames.
@@ -1351,9 +1362,12 @@ applied to all subsequently created X frames."
 
 (defun exwm-workspace--post-init ()
   "The second stage in the initialization of the workspace module."
-  ;; Make the workspaces fullscreen.
-  (dolist (i exwm-workspace--list)
-    (set-frame-parameter i 'fullscreen 'fullboth))
+  (when exwm-workspace--client
+    ;; Reset the 'fullscreen' frame parameter to make emacsclinet frames
+    ;; fullscreen (even without the RandR module enabled).
+    (dolist (i exwm-workspace--list)
+      (set-frame-parameter i 'fullscreen nil)
+      (set-frame-parameter i 'fullscreen 'fullboth)))
   ;; Wait until all workspace frames are resized.
   (with-timeout (1)
     (while (< exwm-workspace--fullscreen-frame-count (exwm-workspace--count))