about summary refs log tree commit diff
diff options
context:
space:
mode:
authorChris Feng <chris.w.feng@gmail.com>2016-05-24T04·30+0800
committerChris Feng <chris.w.feng@gmail.com>2016-05-24T04·30+0800
commit3dba5f156f2670f6226db80281a5879762259154 (patch)
tree0217cc3ac6e8c1afd90e0663566174ecca43bd88
parent1b2ae3749e98b83f94cc19cef8830ce823c63367 (diff)
Manage a certain type of undecorated X windows
* exwm-core.el (exwm--mwm-hints): Removed.
(exwm--mwm-hints-decorations): New buffer-local variable for
indicating whether the X window should have decorations.
* exwm-floating.el (exwm-floating--set-floating): Hide the mode-line
of undecorated floating X windows by default.
* exwm-manage.el (exwm-manage--update-mwm-hints):
Set exwm--mwm-hints-decorations;
(exwm-manage--manage-window): Manage an undecorated X window if its
input model is not 'No Input' or 'Globally Active'.
-rw-r--r--exwm-core.el2
-rw-r--r--exwm-floating.el6
-rw-r--r--exwm-manage.el23
3 files changed, 22 insertions, 9 deletions
diff --git a/exwm-core.el b/exwm-core.el
index e202d4ee47b7..9eb6b62f66a1 100644
--- a/exwm-core.el
+++ b/exwm-core.el
@@ -116,7 +116,7 @@
 (defvar-local exwm--hints-input nil)
 (defvar-local exwm--hints-urgency nil)
 ;; _MOTIF_WM_HINTS
-(defvar-local exwm--mwm-hints nil)
+(defvar-local exwm--mwm-hints-decorations t)
 
 (defvar exwm-mode-map
   (let ((map (make-sparse-keymap)))
diff --git a/exwm-floating.el b/exwm-floating.el
index b3a5b18482a2..d4f57b73d2f9 100644
--- a/exwm-floating.el
+++ b/exwm-floating.el
@@ -159,6 +159,12 @@
                                     (- (elt edges 2) (elt edges 0)))))
            (frame-height (+ height (- (frame-pixel-height frame)
                                       (- (elt edges 3) (elt edges 1))))))
+      ;; Check `exwm--mwm-hints-decorations'.
+      (unless exwm--mwm-hints-decorations
+        (setq frame-height (- frame-height (window-mode-line-height
+                                            (frame-root-window frame)))
+              exwm--mode-line-format mode-line-format
+              mode-line-format nil))
       (set-frame-size frame frame-width frame-height t)
       ;; Create the frame container as the parent of the frame and
       ;; a child of the X window container.
diff --git a/exwm-manage.el b/exwm-manage.el
index 1c63134ba2a7..3dcdf795b68e 100644
--- a/exwm-manage.el
+++ b/exwm-manage.el
@@ -48,7 +48,7 @@ corresponding buffer.")
 (defun exwm-manage--update-mwm-hints (id &optional force)
   "Update _MOTIF_WM_HINTS."
   (with-current-buffer (exwm--id->buffer id)
-    (unless (and exwm--mwm-hints (not force))
+    (unless (and (not exwm--mwm-hints-decorations) (not force))
       (let ((reply (xcb:+request-unchecked+reply exwm--connection
                        (make-instance 'xcb:icccm:-GetProperty
                                       :window id
@@ -56,7 +56,17 @@ corresponding buffer.")
                                       :type exwm-manage--_MOTIF_WM_HINTS
                                       :long-length 5))))
         (when reply
-          (setq exwm--mwm-hints (append (slot-value reply 'value) nil)))))))
+          ;; Check MotifWmHints.decorations.
+          (with-slots (value) reply
+            (setq value (append value nil))
+            (when (and value
+                       ;; See <Xm/MwmUtil.h> for fields definitions.
+                       (/= 0 (logand
+                              (elt value 0) ;MotifWmHints.flags
+                              2))           ;MWM_HINTS_DECORATIONS
+                       (= 0
+                          (elt value 2))) ;MotifWmHints.decorations
+              (setq exwm--mwm-hints-decorations nil))))))))
 
 (defvar exwm-workspace--current)
 (defvar exwm-workspace--switch-history-outdated)
@@ -90,6 +100,7 @@ corresponding buffer.")
       (exwm--update-class id)
       (exwm--update-transient-for id)
       (exwm--update-normal-hints id)
+      (exwm--update-hints id)
       (exwm-manage--update-geometry id)
       (exwm-manage--update-mwm-hints id)
       ;; No need to manage (please check OverrideRedirect outside)
@@ -100,11 +111,8 @@ corresponding buffer.")
                   (memq xcb:Atom:_NET_WM_WINDOW_TYPE_DIALOG exwm-window-type)
                   (memq xcb:Atom:_NET_WM_WINDOW_TYPE_NORMAL exwm-window-type)))
              ;; Check the _MOTIF_WM_HINTS property.
-             (and exwm--mwm-hints
-                  ;; See <Xm/MwmUtil.h> for fields definitions.
-                  (/= 0 (logand (elt exwm--mwm-hints 0) ;MotifWmHints.flags
-                                2))             ;MWM_HINTS_DECORATIONS
-                  (= 0 (elt exwm--mwm-hints 2)) ;MotifWmHints.decorations
+             (and (not exwm--mwm-hints-decorations)
+                  (not exwm--hints-input)
                   ;; Floating windows only
                   (or exwm-transient-for exwm--fixed-size
                       (memq xcb:Atom:_NET_WM_WINDOW_TYPE_UTILITY
@@ -202,7 +210,6 @@ corresponding buffer.")
                          :data (vconcat (mapcar #'car exwm--id-buffer-alist))))
       (xcb:flush exwm--connection)
       (exwm--update-title id)
-      (exwm--update-hints id)
       (exwm--update-protocols id)
       (exwm--update-state id)
       (if (or exwm-transient-for exwm--fixed-size