branch: externals/exwm
commit 3d7a54b713d9e5e95282d566b5052b654c4a5ee3
Author: Steven Allen <[email protected]>
Commit: Steven Allen <[email protected]>

    Fix sticky-window support
    
    Apparently sticky windows were already supported but ONLY if/when they
    declared themselves sticky initially.
    
    * exwm-layout.el (exwm-layout--hide): Use HEX to specify the "all
    desktop" constant to make it clear what this is.
    * exwm.el (exwm--update-desktop): Move the body of the logic into a new
    `exwm--set-desktop' function.
    (exwm--set-desktop): New function that sets a window's desktop, handling
    the "sticky" constant.
    (exwm--on-net-wm-desktop): Call `exwm--set-desktop' instead of
    immediately moving the window to a new workspace.  (fixes #172)
---
 exwm-layout.el |  2 +-
 exwm.el        | 56 ++++++++++++++++++++++++++++----------------------------
 2 files changed, 29 insertions(+), 29 deletions(-)

diff --git a/exwm-layout.el b/exwm-layout.el
index 229d80147e..b807624554 100644
--- a/exwm-layout.el
+++ b/exwm-layout.el
@@ -151,7 +151,7 @@ See variable `exwm-layout-auto-iconify'."
     (unless (or (exwm-layout--iconic-state-p)
                 (and exwm--floating-frame
                      exwm--desktop
-                     (= 4294967295. exwm--desktop)))
+                     (= #xffffffff exwm--desktop)))
       (exwm--log "Hide #x%x" id)
       (when exwm--floating-frame
         (let* ((container (frame-parameter exwm--floating-frame
diff --git a/exwm.el b/exwm.el
index 6728d4949e..e2c8751fdc 100644
--- a/exwm.el
+++ b/exwm.el
@@ -181,29 +181,33 @@ Set during `exwm--init'.")
   "Update _NET_WM_DESKTOP.
 Argument XWIN contains the X window of the `exwm-mode' buffer."
   (exwm--log "#x%x" xwin)
-  (with-current-buffer (exwm--id->buffer xwin)
-    (let ((reply (xcb:+request-unchecked+reply exwm--connection
-                     (make-instance 'xcb:ewmh:get-_NET_WM_DESKTOP
-                                    :window xwin)))
-          desktop)
-      (when reply
-        (setq desktop (slot-value reply 'value))
-        (cond
-         ((and desktop (= desktop 4294967295.))
-          (unless (or (not exwm--floating-frame)
-                      (eq exwm--frame exwm-workspace--current)
-                      (and exwm--desktop
-                           (= desktop exwm--desktop)))
-            (exwm-layout--show xwin (frame-root-window exwm--floating-frame)))
-          (setq exwm--desktop desktop))
-         ((and desktop
-               (< desktop (exwm-workspace--count))
-               (if exwm--desktop
-                   (/= desktop exwm--desktop)
-                 (/= desktop (exwm-workspace--position exwm--frame))))
-          (exwm-workspace-move-window desktop xwin))
-         (t
-          (exwm-workspace--set-desktop xwin)))))))
+  (with-slots (value)
+      (xcb:+request-unchecked+reply exwm--connection
+          (make-instance 'xcb:ewmh:get-_NET_WM_DESKTOP
+                         :window xwin))
+    (exwm--set-desktop xwin value)))
+
+(defun exwm--set-desktop (id desktop)
+  "Set ID's workspace to DESKTOP."
+  (when-let* ((buffer (exwm--id->buffer id))
+              (_(buffer-live-p buffer)))
+    (with-current-buffer buffer
+      (cond
+       ((and desktop (= desktop #xffffffff))
+        (unless (or (not exwm--floating-frame)
+                    (eq exwm--frame exwm-workspace--current)
+                    (and exwm--desktop
+                         (= desktop exwm--desktop)))
+          (exwm-layout--show id (frame-root-window exwm--floating-frame)))
+        (setq exwm--desktop desktop))
+       ((and desktop
+             (< desktop (exwm-workspace--count))
+             (if exwm--desktop
+                 (/= desktop exwm--desktop)
+               (/= desktop (exwm-workspace--position exwm--frame))))
+        (exwm-workspace-move-window desktop id))
+       (t
+        (exwm-workspace--set-desktop id))))))
 
 (defun exwm--update-window-type (id &optional force)
   "Update `exwm-window-type' from _NET_WM_WINDOW_TYPE.
@@ -701,11 +705,7 @@ DATA contains unmarshalled PropertyNotify event data."
 
 (defun exwm--on-net-wm-desktop (id data)
   "Handle _NET_WM_DESKTOP message with ID and DATA."
-  (let ((buffer (exwm--id->buffer id))
-        (workspace (elt data 0)))
-    (when (and (buffer-live-p buffer)
-               (not (= workspace #xffffffff))) ;; TODO #172
-      (exwm-workspace-move-window workspace id))))
+  (exwm--set-desktop id (elt data 0)))
 
 (defun exwm--on-net-wm-state (id data)
   "Handle _NET_WM_STATE message with ID and DATA."

Reply via email to