DeviceWorkstation.st
changeset 1078 f7b6f15899ab
parent 1075 62f0cfb3c956
child 1079 7d01a4641ef0
--- a/DeviceWorkstation.st	Wed Oct 16 10:58:47 1996 +0200
+++ b/DeviceWorkstation.st	Fri Oct 18 14:36:43 1996 +0200
@@ -84,7 +84,7 @@
       resolutionVer   <Number>          pixels per vertical millimeter
 
       idToViewMapping <Dictionary>      maps view-ids to views
-      knownViews      <Collection>      all views known
+      knownViews      <WeakArray>       all of my known views
       knownIds        <Collection>      corresponding device-view ids
       knownBitmaps    <Collection>      all known device bitmaps
       knownBitmapIds  <Collection>      corresponding device-bitmap ids
@@ -568,12 +568,14 @@
 !
 
 knownViews
-    "return a collection of all known views"
+    "return a (non-weak) collection of all known views"
 
     |views|
 
     views := IdentitySet new.
-    knownViews do:[:v | v notNil ifTrue:[views add:v]].
+    knownViews do:[:v | 
+		        (v notNil and:[v ~~ 0]) ifTrue:[views add:v]
+		  ].
     ^ views
 
     "Modified: 15.10.1996 / 12:47:35 / cg"
@@ -2254,9 +2256,16 @@
         
                 
     knownViews notNil ifTrue:[
-      knownViews do:[:aView |
+      1 to:knownViews size do:[:index |
+	  |aView|
+
+	  aView := knownViews at:index.
 	  aView notNil ifTrue:[
-	      aBlock value:aView
+	      aView == 0 ifTrue:[
+	          knownViews at:index put:nil
+	      ] ifFalse:[
+	          aBlock value:aView
+	      ]
 	  ]
       ]
     ]
@@ -2654,9 +2663,10 @@
     knownViews notNil ifTrue:[
 	(knownViews findFirst:[:slot | 
 		slot notNil 
+		and:[slot ~~ 0
 		and:[slot isRootView not 
 		and:[slot superView isNil
-		and:[slot shown]]]]) == 0 ifTrue:[
+		and:[slot shown]]]]]) == 0 ifTrue:[
 	    "/ my last view was closed
 	    dispatching := false.
 	    'DEVWORKST: finished dispatch (last view closed)' infoPrintCR.
@@ -4333,6 +4343,9 @@
 	freeIdx := 1.
     ] ifFalse:[
 	freeIdx := knownViews identityIndexOf:nil.
+	freeIdx == 0 ifTrue:[
+	    freeIdx := knownViews identityIndexOf:0
+	].
 
 "/        1 to:knownViews size do:[:idx |
 "/            |id|
@@ -4408,7 +4421,10 @@
 	 destroy it ...
 	"
 	1 to:knownViews size do:[:idx |
-	    (knownViews at:idx) isNil ifTrue:[
+	    |v|
+
+	    ((v := knownViews at:idx) isNil 
+	    or:[v == 0]) ifTrue:[
 		id := knownIds at:idx.
 		id notNil ifTrue:[
 		    knownIds at:idx put:nil.
@@ -4425,13 +4441,19 @@
 viewFromId:aWindowID
     "given an Id, return the corresponding view."
 
-    |index|
+    |index v|
 
 "/    ^ idToViewMapping at:aNumber ifAbsent:[nil].
 
     index := knownIds indexOf:aWindowID.
     index == 0 ifTrue:[^ nil].
-    ^ knownViews at:index.
+    v := knownViews at:index.
+    v == 0 ifTrue:[
+	knownViews at:index put:nil.
+	knownIds at:index put:nil.
+	^ nil
+    ].
+    ^ v
 ! !
 
 !DeviceWorkstation methodsFor:'window stuff'!
@@ -4526,7 +4548,9 @@
 	knownViews do:[:aView |
 	    |c vid cid|
 
-	    (aView notNil and:[(vid := aView id) notNil]) ifTrue:[
+	    (aView notNil 
+	    and:[aView ~~ 0
+	    and:[(vid := aView id) notNil]]) ifTrue:[
 		c := aView cursor.
 		(c notNil and:[(cid := c id) notNil]) ifTrue:[
 		    self setCursor:cid in:vid
@@ -4576,7 +4600,9 @@
 	    knownViews do:[:aView |
 		|vid|
 
-		(aView notNil and:[(vid := aView id) notNil]) ifTrue:[
+		(aView notNil 
+		and:[aView ~~ 0
+		and:[(vid := aView id) notNil]]) ifTrue:[
 		    self setCursor:id in:vid
 		]
 	    ].
@@ -4699,6 +4725,6 @@
 !DeviceWorkstation class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libview/DeviceWorkstation.st,v 1.138 1996-10-15 11:53:13 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libview/DeviceWorkstation.st,v 1.139 1996-10-18 12:36:24 cg Exp $'
 ! !
 DeviceWorkstation initialize!