Mercurial > hg > indyvon
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]