changeset 73:0465aaf01664

Keep old context observers until rendering is complete.
author Mikhail Kryshen <mikhail@kryshen.net>
date Mon, 30 Aug 2010 06:01:27 +0400
parents 76f4126aba84
children a823dd0c2736
files src/net/kryshen/indyvon/core.clj
diffstat 1 files changed, 18 insertions(+), 14 deletions(-) [+]
line diff
     1.1 --- a/src/net/kryshen/indyvon/core.clj	Mon Aug 30 05:47:57 2010 +0400
     1.2 +++ b/src/net/kryshen/indyvon/core.clj	Mon Aug 30 06:01:27 2010 +0400
     1.3 @@ -119,7 +119,6 @@
     1.4  (def observers (atom nil))
     1.5  
     1.6  ;; TODO: groups should be weakly referenced.
     1.7 -;; Need persistent analog of java.util.WeakHashMap.
     1.8  (defn add-observer
     1.9    "Add observer fn for the target to the specified group."
    1.10    [group target f]
    1.11 @@ -132,15 +131,15 @@
    1.12    (swap! observers dissoc group)
    1.13    nil)
    1.14  
    1.15 -;; (defn- replace-observer-group*
    1.16 -;;   [observers old-id new-id]
    1.17 -;;   (let [group (get observers old-id)]
    1.18 -;;     (assoc (dissoc observers old-id)
    1.19 -;;       new-id group)))
    1.20 +(defn- replace-observer-group*
    1.21 +  [observers old-id new-id]
    1.22 +  (let [group (get observers old-id)]
    1.23 +    (assoc (dissoc observers old-id)
    1.24 +      new-id group)))
    1.25  
    1.26 -;; (defn- replace-observer-group
    1.27 -;;   [old-id new-id]
    1.28 -;;   (swap! observers replace-observer-group* old-id new-id))
    1.29 +(defn- replace-observer-group
    1.30 +  [old-id new-id]
    1.31 +  (swap! observers replace-observer-group* old-id new-id))
    1.32  
    1.33  (defn update
    1.34    "Notify observers."
    1.35 @@ -341,11 +340,16 @@
    1.36         (apply-theme)
    1.37         (with-color (:back-color *theme*)
    1.38           (.fillRect graphics 0 0 width height))
    1.39 -       (remove-observer-group layer)
    1.40 -       (try
    1.41 -         (render! layer)
    1.42 -         (finally
    1.43 -          (commit event-dispatcher))))))
    1.44 +       (let [tmp-group (Object.)]
    1.45 +         ;; Keep current context observers until the rendering is complete.
    1.46 +         ;; Some observers may be invoked twice if they appear in both
    1.47 +         ;; groups until tmp-group is removed.
    1.48 +         (replace-observer-group layer tmp-group)
    1.49 +         (try
    1.50 +           (render! layer)
    1.51 +           (finally
    1.52 +            (remove-observer-group tmp-group)
    1.53 +            (commit event-dispatcher)))))))
    1.54  
    1.55  (defn root-size
    1.56    ([layer font-context]