Use a global counter for expose letters instead of a sort based on window Xid.
authorPhilippe Brochard <pbrochard@common-lisp.net>
Tue, 30 Jul 2013 16:50:01 +0000 (30 18:50 +0200)
committerPhilippe Brochard <pbrochard@common-lisp.net>
Tue, 30 Jul 2013 16:50:01 +0000 (30 18:50 +0200)
src/clfswm-circulate-mode.lisp
src/clfswm-expose-mode.lisp
src/clfswm.lisp
src/package.lisp

index 6d8a765..8f1a1bd 100644 (file)
@@ -44,7 +44,8 @@
         (len (length text)))
     (xlib:draw-glyphs *pixmap-buffer* *circulate-gc*
                      (truncate (/ (- *circulate-width* (* (xlib:max-char-width *circulate-font*) len)) 2))
-                     (truncate (/ (+ *circulate-height* (- (xlib:font-ascent *circulate-font*) (xlib:font-descent *circulate-font*))) 2))
+                     (truncate (/ (+ *circulate-height* (- (xlib:font-ascent *circulate-font*)
+                                                            (xlib:font-descent *circulate-font*))) 2))
                      text))
   (copy-pixmap-buffer *circulate-window* *circulate-gc*))
 
index fbbb7d0..f4354ba 100644 (file)
@@ -26,7 +26,6 @@
 (in-package :clfswm)
 
 (defparameter *expose-font* nil)
-(defparameter *expose-child-list* nil)
 (defparameter *expose-selected-child* nil)
 
 (defstruct expose-child child key window gc string)
   (throw 'exit-expose-loop t))
 
 
-
-
-(defun expose-sort (predicate type)
-  (lambda (x y)
-    (funcall predicate (funcall type x) (funcall type y))))
-
 (defun expose-associate-keys ()
-  (let* ((acc nil)
-         (n 0)
-         (win-list (sort (get-all-windows) (expose-sort #'< #'xlib:window-id)))
-         (frame-list (sort (get-all-frames) (expose-sort #'< #'frame-number))))
-    (loop for c in win-list
-       do (push (make-expose-child :child c :key (number->letter n)) acc)
-         (incf n))
-    (loop for c in frame-list
-       do (unless (child-equal-p c *root-frame*)
-            (push (make-expose-child :child c :key (number->letter n)) acc)
-            (incf n)))
-    (nreverse acc)))
+  (let* ((all nil)
+         (new nil))
+    (with-all-children-reversed (*root-frame* child)
+      (unless (child-equal-p child *root-frame*)
+        (push child all)
+        (unless (member child *expose-child-list* :test #'child-equal-p :key #'expose-child-child)
+          (push (make-expose-child :child child :key (number->letter *expose-current-number*)) new)
+          (incf *expose-current-number*))))
+    (append (remove-if-not (lambda (x) (member x all :test #'child-equal-p)) *expose-child-list*
+                           :key #'expose-child-child)
+            (nreverse new))))
 
 
 
       (xlib:destroy-window it)))
   (when *expose-font*
     (xlib:close-font *expose-font*))
-  (expose-unpresent-windows)
-  (setf *expose-child-list* nil))
+  (expose-unpresent-windows))
 
 (defun expose-focus-child (child)
   (let ((parent (typecase child
index cbecb5e..090decd 100644 (file)
                                            :depth (xlib:screen-root-depth *screen*)
                                            :drawable *root*)
        *in-second-mode* nil
-        *x-error-count* 0)
+        *x-error-count* 0
+        *expose-current-number* 0
+        *expose-child-list* nil)
   (store-root-background)
   (init-modifier-list)
   (xgrab-init-pointer)
index f45bcc1..5149953 100644 (file)
@@ -81,6 +81,9 @@ It is particulary useful with CLISP/MIT-CLX.")
 (defparameter *background-image* nil)
 (defparameter *background-gc* nil)
 
+(defparameter *expose-current-number* 0)
+(defparameter *expose-child-list* nil)
+
 (defconfig *loop-timeout* 1 nil
            "Maximum time (in seconds) to wait before calling *loop-hook*")