Tony Garnock-Jones uploaded a new version of Kernel to project The Trunk:
http://source.squeak.org/trunk/Kernel-tonyg.1344.mcz
==================== Summary ====================
Name: Kernel-tonyg.1344
Author: tonyg
Time: 8 October 2020, 11:35:47.705963 pm
UUID: d68b8946-be04-4e8c-9a2d-76e31736aa4b
Ancestors: Kernel-dtl.1343
Avoid explicit mention of Promise in a handful of places, preferring instead some means of specifying "the currently-relevant kind of Promise". Useful for subclasses of Promise.
=============== Diff against Kernel-dtl.1343 ===============
Item was changed:
----- Method: Promise class>>ifRejected: (in category 'instance creation') -----
ifRejected: aBlock
+ ^ self basicNew initializeWithIfRejected: aBlock.!
- ^ Promise basicNew initializeWithIfRejected: aBlock.!
Item was changed:
----- Method: Promise class>>unit: (in category 'instance creation') -----
unit: anObject
"Return a resolved Promise. #new is the other half of Promise's unit function; #new returns an unresolved Promise."
+ ^ self basicNew initializeWithResolvedValue: anObject.!
- ^ Promise basicNew initializeWithResolvedValue: anObject.!
Item was changed:
----- Method: Promise>>then:ifRejected: (in category 'monad') -----
then: resolvedBlock ifRejected: errBlock
"Return a Promise that, if it resolves, runs the resolvedBlock. If resolution throws an Exception, it runs the errBlock."
| p |
+ p := self species new.
- p := Promise new.
resolvedBlock
ifNil: [self whenResolved: [:v | p resolveWith: v]]
ifNotNil: [
self whenResolved: [:v |
[p resolveWith: (resolvedBlock value: v)]
on: Error do: [:e | p rejectWith: e]]].
errBlock
ifNil: [self whenRejected: [:e | p rejectWith: e]]
ifNotNil: [
self whenRejected: [:e |
[p resolveWith: (errBlock value: e)]
on: Error do: [:e2 | p rejectWith: e2]]].
^ p.!
Eliot Miranda uploaded a new version of EToys to project The Trunk:
http://source.squeak.org/trunk/EToys-eem.405.mcz
==================== Summary ====================
Name: EToys-eem.405
Author: eem
Time: 8 October 2020, 11:35:40.630409 am
UUID: c661ab6d-7d37-4723-ab5b-f049ea31b5c2
Ancestors: EToys-eem.404
CameraInterface: surface the little known fact that 352@288 is a supported resolution, at least on WIndows and Mac (and that due to downsampling to 320@280 352@288 may give a cnsiderably higher frame rate, on my ASUS VivoBook S laptop with WIndows 10 Home Ed, 9 fps vs 7 fps).
=============== Diff against EToys-eem.404 ===============
Item was changed:
----- Method: CameraInterface class>>interruptDrivenVideoTest: (in category 'test') -----
interruptDrivenVideoTest: camNum
"A quick test of video input. Displays video on the screen until the mouse is pressed.
Answer nil if the interrupt-driven interface is unavailable."
"self interruptDrivenVideoTest: 1"
"self interruptDrivenVideoTest: 2"
"[self interruptDrivenVideoTest: 2] fork.
self interruptDrivenVideoTest: 1"
| semaphore height |
height := 16.
1 to: camNum - 1 do:
[:camIndex| "N.B. the of an unopened camera is 0@0"
height := height + (CameraInterface frameExtent: camIndex) y + 16].
(CameraInterface cameraIsOpen: camNum) ifFalse:
+ [(CameraInterface openCamera: camNum width: 352 height: 288) ifNil:
- [(CameraInterface openCamera: camNum width: 320 height: 240) ifNil:
[self inform: 'no camera'.
^nil]].
semaphore := Semaphore new.
[CameraInterface camera: camNum setSemaphore: (Smalltalk registerExternalObject: semaphore)]
on: Error
do: [:err|
Smalltalk unregisterExternalObject: semaphore.
self inform: 'interrupt-driven camera interface unavailable: ', err messageText.
^nil].
[| f n startTime frameCount msecs fps |
[semaphore wait.
+ "N.B. the frame extent may not be known until the delivery of the first frame.
- "N.B. the frame extet may not be known until the delivery of the first frame.
Si we have to delay initialization."
startTime ifNil:
[(self frameExtent: camNum) x = 0 ifTrue: [self inform: 'no camera'. ^nil].
f := Form extent: (CameraInterface frameExtent: camNum) depth: 32.
frameCount := 0.
startTime := Time millisecondClockValue].
Sensor anyButtonPressed] whileFalse:
[n := CameraInterface getFrameForCamera: camNum into: f bits.
n > 0 ifTrue:
[frameCount := frameCount + 1.
f displayAt: 16 @ height]].
msecs := Time millisecondClockValue - startTime.
fps := (frameCount * 1000) // msecs.
^frameCount printString, ' frames at ', fps printString, ' frames/sec']
ensure:
[CameraInterface closeCamera: camNum.
Smalltalk unregisterExternalObject: semaphore.
Sensor waitNoButton]!
Eliot Miranda uploaded a new version of System to project The Trunk:
http://source.squeak.org/trunk/System-eem.1177.mcz
==================== Summary ====================
Name: System-eem.1177
Author: eem
Time: 8 October 2020, 11:16:38.655114 am
UUID: b65f0705-bbc0-45b7-8f9c-6cc95281cbd5
Ancestors: System-mt.1176
More accurate description of vm parameter 48 (the image header flags).
=============== Diff against System-mt.1176 ===============
Item was changed:
----- Method: SmalltalkImage>>vmParameterAt: (in category 'vm parameters') -----
vmParameterAt: parameterIndex
"parameterIndex is a positive integer corresponding to one of the VM's internal parameter/metric registers.
Answer with the current value of that register. Fail if parameterIndex has no corresponding register.
VM parameters are numbered as follows:
1 byte size of old-space (read-only)
2 byte size of young-space (read-only)
3 byte size of object memory (read-only)
4 allocationCount (read-only; nil in Cog VMs)
5 allocations between GCs (read-write; nil in Cog VMs)
6 survivor count tenuring threshold (read-write)
7 full GCs since startup (read-only)
8 total milliseconds in full GCs since startup (read-only)
9 incremental GCs since startup (read-only; scavenging GCs on Spur)
10 total milliseconds in incremental/scavenging GCs since startup (read-only)
11 tenures of surving objects since startup (read-only)
12-15 specific to the translating VM
16 total microseconds in idle since startup
17 proportion of code zone available for use (Sista VMs only; read-write)
18 total milliseconds in full GC compaction since startup (a portion of parameter 8)
19 scavenge threshold; the effective size of eden
20 utc microseconds at VM start-up (actually at time initialization, which precedes image load) (newer Cog VMs only).
21 root (remembered) table size (read-only)
22 root (remembered) table overflows since startup (read-only)
23 bytes of extra memory to reserve for VM buffers, plugins, etc.
24 memory threshold above which to shrink object memory (read-write)
25 ammount to grow by when growing object memory (read-write)
26 interruptChecksEveryNms - force an ioProcessEvents every N milliseconds (read-write)
27 number of times mark loop iterated for current IGC/FGC (read-only) includes ALL marking
28 number of times sweep loop iterated for current IGC/FGC (read-only)
29 number of times make forward loop iterated for current IGC/FGC (read-only)
30 number of times compact move loop iterated for current IGC/FGC (read-only)
31 number of grow memory requests (read-only)
32 number of shrink memory requests (read-only)
33 number of root table entries used for current IGC/FGC (read-only)
34 bytes allocated in total since start-up or reset (read-write)
35 number of survivor objects after current IGC/FGC (read-only)
36 millisecond clock when current IGC/FGC completed (read-only)
37 number of marked objects for Roots of the world, not including Root Table entries for current IGC/FGC (read-only)
38 milliseconds taken by current IGC (read-only)
39 Number of finalization signals for Weak Objects pending when current IGC/FGC completed (read-only)
40 BytesPerWord for this image
41 imageFormatVersion for the VM
42 number of stack pages in use (Cog Stack VM only, otherwise nil)
43 desired number of stack pages (stored in image file header, max 65535; Cog VMs only, otherwise nil)
44 size of eden, in bytes (Cog VMs only, otherwise nil)
45 desired size of eden, in bytes (stored in image file header; Cog VMs only, otherwise nil)
46 size of machine code zone, in bytes (stored in image file header; Cog JIT VM only, otherwise nil)
47 desired size of machine code zone, in bytes (applies at startup only, stored in image file header; Cog JIT VM only)
+ 48 various properties stored in the image header (that instruct the VM) as an integer encoding an array of bit flags.
- 48 various properties of the Cog VM as an integer encoding an array of bit flags.
Bit 0: tells the VM that the image's Process class has threadId as its 5th inst var (after nextLink, suspendedContext, priority & myList)
Bit 1: on Cog JIT VMs asks the VM to set the flag bit in interpreted methods
Bit 2: if set, preempting a process puts it to the head of its run queue, not the back,
i.e. preempting a process by a higher priority one will not cause the preempted process to yield
to others at the same priority.
Bit 3: in a muilt-threaded VM, if set, the Window system will only be accessed from the first VM thread
Bit 4: in a Spur vm, if set, causes weaklings and ephemerons to be queued individually for finalization
Bit 5: if set, implies wheel events will be delivered as such and not mapped to arrow key events
Bit 6: if set, implies arithmetic primitives will fail if given arguments of different types (float vs int)
49 the size of the external semaphore table (read-write; Cog VMs only)
50-51 reserved for VM parameters that persist in the image (such as eden above)
52 root (remembered) table maximum size (read-only)
53 the number of oldSpace segments (Spur only, otherwise nil)
54 total size of free old space (Spur only, otherwise nil)
55 ratio of growth and image size at or above which a GC will be performed post scavenge (Spur only, otherwise nil)
56 number of process switches since startup (read-only)
57 number of ioProcessEvents calls since startup (read-only)
58 number of forceInterruptCheck (Cog VMs) or quickCheckInterruptCalls (non-Cog VMs) calls since startup (read-only)
59 number of check event calls since startup (read-only)
60 number of stack page overflows since startup (read-only; Cog VMs only)
61 number of stack page divorces since startup (read-only; Cog VMs only)
62 number of machine code zone compactions since startup (read-only; Cog VMs only)
63 milliseconds taken by machine code zone compactions since startup (read-only; Cog VMs only)
64 current number of machine code methods (read-only; Cog VMs only)
65 In newer Cog VMs a set of flags describing VM features,
if non-zero bit 0 implies multiple bytecode set support;
if non-zero bit 1 implies read-only object support;
if non-zero bit 2 implies the VM suffers from using an ITIMER heartbeat (if 0 it has a thread that provides the heartbeat)
(read-only; Cog VMs only; nil in older Cog VMs, a boolean answering multiple bytecode support in not so old Cog VMs)
66 the byte size of a stack page in the stack zone (read-only; Cog VMs only)
67 the maximum allowed size of old space in bytes, 0 implies no internal limit (Spur VMs only).
68 the average number of live stack pages when scanned by GC (at scavenge/gc/become et al)
69 the maximum number of live stack pages when scanned by GC (at scavenge/gc/become et al)
70 the value of VM_PROXY_MAJOR (the interpreterProxy major version number)
71 the value of VM_PROXY_MINOR (the interpreterProxy minor version number)
72 total milliseconds in full GCs Mark phase since startup (read-only)
73 total milliseconds in full GCs Sweep phase since startup (read-only, can be 0 depending on compactors)
74 maximum pause time due to segment allocation"
<primitive: 254>
self primitiveFailed!
Eliot Miranda uploaded a new version of SystemReporter to project The Trunk:
http://source.squeak.org/trunk/SystemReporter-eem.44.mcz
==================== Summary ====================
Name: SystemReporter-eem.44
Author: eem
Time: 8 October 2020, 11:14:05.212321 am
UUID: 842b9b5f-c8de-456a-a871-1fc9725c3ff0
Ancestors: SystemReporter-eem.43
More accurate labelling of vm parameter 48 (the image header flags).
=============== Diff against SystemReporter-eem.43 ===============
Item was changed:
----- Method: SystemReporter>>reportVMParameters: (in category 'reporting') -----
reportVMParameters: aStream
| vmParameters isStack isCog isSpur |
self header: 'Virtual Machine Parameters' on: aStream.
vmParameters := Smalltalk vm getVMParameters.
isStack := (vmParameters at: 42 ifAbsent: [0]) ~= 0. "42 = number of stack pages available"
isCog := isStack and: [(vmParameters at: 46) ~= 0]. "46 is machine code zone size"
isSpur := isStack and: [(vmParameters at: 41) anyMask: 2r10000]. "41 is imageFormatVersion for the VM; bit 16 is the Spur bit"
(isSpur
ifFalse:
[#( 1 'size of old space'
2 'size of young+old space'
3 'size of memory'
4 'allocationCount'
5 'allocations between GCs'
6 'survivor count tenuring threshold')]
ifTrue:
[#( 1 'size of old space'
2 'used bytes in new space (used eden + used past space)'
3 'size of heap')]),
#( 7 'full GCs since startup'
8 'total milliseconds in full GCs since startup'),
(isSpur
ifFalse: [#( 9 'incremental GCs since startup'
10 'total milliseconds in incremental GCs since startup'
11 'tenures of surving objects since startup'),
{12 to: 19. 'specific to the translating VM'}]
ifTrue: [#( 9 'scavenging GCs since startup'
10 'total milliseconds in scavenging GCs since startup'
11 'tenures of surving objects since startup'),
{12 to: 15. 'reserved for future use'},
#( 16 'total microseconds in idle since startup'
17 'proportion of code zone available for use (Sista VMs only; read-write)'
18 'total milliseconds in full GC compaction since startup (a portion of parameter 8)'
19 'scavenge threshold; the effective size of eden')]),
#( 20 'utc microseconds at startup (if non-zero)'
21 'root/remembered table size (occupancy)'
22 'root/remembered table overflows since startup'
23 'bytes of extra memory to reserve for VM buffers, plugins, etc.'
24 'free memory threshold above which object memory will be shrunk'
25 'memory headroom when growing object memory'),
(isStack
ifFalse:
[#( 26 'interruptChecksEveryNms - force an ioProcessEvents every N milliseconds, in case the image is not calling getNextEvent often')]
ifTrue:
[#( 26 'heartbeat period (ms; see #58)')]),
(isSpur
ifFalse:
[#( 27 'number of times mark loop iterated for current IGC/FGC includes ALL marking'
28 'number of times sweep loop iterated for current IGC/FGC'
29 'number of times make forward loop iterated for current IGC/FGC'
30 'number of times compact move loop iterated for current IGC/FGC')]
ifTrue: [#()]),
#( 31 'number of grow memory requests'
32 'number of shrink memory requests'),
(isSpur
ifFalse:
[#( 33 'number of root table entries used for current IGC/FGC'
34 'number of allocations done before current IGC/FGC'
35 'number of survivor objects after current IGC/FGC'
36 'millisecond clock when current IGC/FGC completed'
37 'number of marked objects for Roots of the world, not including Root Table entries for current IGC/FGC'
38 'milliseconds taken by current IGC'
39 'Number of finalization signals for Weak Objects pending when current IGC/FGC completed')]
ifTrue:
[#( 33 'number of root table entries at last scavenge'
35 'number of survivor objects at last scavenge (if non-zero)'
36 'millisecond clock when current scavenge completed'
38 'milliseconds taken by current scavenge'
39 'Number of finalization signals for Weak Objects pending when current SGC/FGC completed')]),
#( 40 'VM word size - 4 or 8'),
(isStack
ifTrue:
[#(
41 'imageFormatVersion for the VM'
42 'number of stack pages available'
43 'desired number of stack pages (stored in image file header, max 65535)'
44 'size of eden, in bytes'
45 'desired size of eden, in bytes (stored in image file header)'
46 'machine code zone size, in bytes (0 in Stack VM)'
+ 47 'desired machine code zone size (0 => default 1Mb to 2Mb depending on processor)'),
+ { 48. 'Persistent image header flags\ bit 0: implies Process has threadId as its 4th inst var\ bit 1: if set, methods that are interpreted will have the flag bit set in their header\ bit 2: if set, implies preempting a process does not put it to the back of its run queue\ bit 3: if set, implies the GUI should run on the first thread and event queues should not be accessed from other threads\ bit 4: if set, implies the new finalization scheme where WeakArrays are queued\ bit 5: if set, implies wheel events will be delivered as such and not mapped to arrow key events\ bit 6: if set, implies arithmetic primitives will fail if given arguments of different types (float vs int)' withCRs },
+ #( 49 'max size the image promises to grow the external semaphore table to'),
- 47 'desired machine code zone size (0 => default 1Mb to 2Mb depending on processor)'
- 48 'various persistent image header flags. See getCogVMFlags in the VM source.'
- 49 'max size the image promises to grow the external semaphore table to'),
(isSpur
ifFalse:
[{ 50 to: 51. 'reserved for VM parameters that persist in the image (such as size of eden above)'.
52 to: 56. 'specific to Spur' }]
ifTrue:
[{ 50 to: 51. 'reserved for VM parameters that persist in the image (such as size of eden above)' },
#( 52 'root/remembered table capacity'
53 'number of old space segments'
54 'total free old space'
55 'ratio of growth and image size at or above which a GC will be performed post scavenge')]),
#( 56 'number of process switches since startup'
57 'number of ioProcessEvents calls since startup'
58 'number of forceInterruptCheck calls since startup'
59 'number of check event calls since startup'
60 'number of stack page overflows since startup'
61 'number of stack page divorces since startup'
62 'compiled code compactions since startup'),
(isCog
ifFalse:
[#()]
ifTrue:
[#( 63 'total milliseconds in compiled code compactions since startup'
64 'the number of methods that currently have jitted machine-code')]),
{ 65. 'Cog feature flags\ bit 0: set if the VM supports MULTIPLE_BYTECODE_SETS.\ bit 1: set if the VM supports read-only objects.\ bit 2: set if the VM has an ITIMER_HEARTBEAT' withCRs.
66. 'the byte size of a stack page'.},
(isSpur
ifFalse:
[{ 67 to: 69. 'reserved for more Cog-related info' }]
ifTrue:
[#( 67 'the maximum allowed size of old space (if zero there is no limit)'
68 'the average number of live stack pages when scanned by scavenge/gc/become'
69 'the maximum number of live stack pages when scanned by scavenge/gc/become')]),
#( 70 'the vmProxyMajorVersion (the interpreterProxy VM_MAJOR_VERSION)'
71 'the vmProxyMinorVersion (the interpreterProxy VM_MINOR_VERSION)')]
ifFalse:
[#()])
pairsDo: [:idx :desc | | value values |
aStream nextPut: $#.
idx isInteger
ifTrue:
[value := vmParameters at: idx.
aStream print: idx; tab: (idx < 10 ifTrue: [2] ifFalse: [1]); nextPutAll: ((value isInteger and: [idx ~= 41]) ifTrue: [value asStringWithCommas] ifFalse: [value printString])]
ifFalse:
[value := vmParameters at: idx first.
aStream print: idx first; next: 2 put: $.; print: idx last; tab.
values := idx collect: [:i| vmParameters at: i].
values asSet size = 1
ifTrue: [aStream print: value]
ifFalse: [values do: [:v| aStream print: v] separatedBy: [aStream nextPutAll: ', ']]].
aStream tab; nextPutAll: desc; cr]!
Marcel Taeumel uploaded a new version of Morphic to project The Trunk:
http://source.squeak.org/trunk/Morphic-mt.1696.mcz
==================== Summary ====================
Name: Morphic-mt.1696
Author: mt
Time: 8 October 2020, 4:57:26.632753 pm
UUID: 224174d5-5e2f-ac4c-a356-8223edc18ebc
Ancestors: Morphic-mt.1695
Complements System-mt.1176.
=============== Diff against Morphic-mt.1695 ===============
Item was changed:
----- Method: MorphicProject>>makeThumbnail (in category 'menu messages') -----
makeThumbnail
"Make a thumbnail image of this project from the Display."
world displayWorldSafely. "clean pending damage"
+ super makeThumbnail.
+ (Smalltalk at: #InternalThreadNavigationMorph) ifNotNil: [:tnMorph |
+ tnMorph cacheThumbnailFor: self].
+ ^ thumbnail!
- ^super makeThumbnail.!
Marcel Taeumel uploaded a new version of Morphic to project The Trunk:
http://source.squeak.org/trunk/Morphic-mt.1695.mcz
==================== Summary ====================
Name: Morphic-mt.1695
Author: mt
Time: 8 October 2020, 4:51:31.5986 pm
UUID: 5d2d4f82-0a28-0b4e-8909-c4b1b1cb0e78
Ancestors: Morphic-mt.1694
In Morphic projects, ensure that [cmd]+[dot] will always continue drawing.
=============== Diff against Morphic-mt.1694 ===============
Item was changed:
----- Method: MorphicProject>>interruptCleanUpFor: (in category 'scheduling & debugging') -----
interruptCleanUpFor: interruptedProcess
"Clean up things in case of a process interrupt."
super interruptCleanUpFor: interruptedProcess.
self uiProcess == interruptedProcess ifTrue: [
ActiveHand ifNotNil: [ActiveHand interrupted].
ActiveWorld := world. "reinstall active globals"
ActiveHand := world primaryHand.
ActiveHand interrupted. "make sure this one's interrupted too"
ActiveEvent := nil.
+ world removeProperty: #shouldDisplayWorld.
+
Preferences eToyFriendly
+ ifTrue: [world stopRunningAll]].!
- ifTrue: [Project current world stopRunningAll]].!
Marcel Taeumel uploaded a new version of Morphic to project The Trunk:
http://source.squeak.org/trunk/Morphic-ct.1693.mcz
==================== Summary ====================
Name: Morphic-ct.1693
Author: ct
Time: 7 October 2020, 1:51:31.244742 pm
UUID: 44dd03e5-ba2e-0449-bdcc-162507d4bb77
Ancestors: Morphic-eem.1686
Fixes unnecessary layout hickup during repositioning a SystemProgressMorph. Speeds up Collection >> #do:displayingProgress: significantly.
See http://forum.world.st/Overhead-of-SystemProgressMorph-do-displayingProgress… for more information. Thanks to Marcel for the tip! :-)
=============== Diff against Morphic-eem.1686 ===============
Item was added:
+ ----- Method: SystemProgressMorph>>extent: (in category 'as yet unclassified') -----
+ extent: foo
+
+ "self haltIf: [self extent ~= foo]."
+ ^ super extent:foo!
Item was changed:
----- Method: SystemProgressMorph>>reposition (in category 'private') -----
reposition
"Put ourself in the requested position on the display, but ensure completely within the bounds of the display"
| position |
self bounds:
+ ((self bounds
- ((self fullBounds
align: self fullBounds center
with: (self requestedPosition ifNil: [ self fullBounds center ])) translatedToBeWithin: Display boundingBox).
"Check to see if labels are wider than progress bars. In that case do
a centered instead of the default left aligned layout."
position := self width > (Inset x * 2 + (self borderWidth * 2) + BarWidth)
ifTrue: [ #topCenter ]
ifFalse: [ #leftCenter ].
self cellPositioning: position!
Marcel Taeumel uploaded a new version of Morphic to project The Trunk:
http://source.squeak.org/trunk/Morphic-mt.1694.mcz
==================== Summary ====================
Name: Morphic-mt.1694
Author: mt
Time: 8 October 2020, 1:33:30.775799 pm
UUID: 3a8e59fb-2478-664c-93e8-131f20222cf0
Ancestors: Morphic-tonyg.1687, Morphic-ct.1693
Merges and tweaks Morphic-ct.1693.
Note that label positioning now works as implemented in system progress bars: #leftCenter for short labels, #topCenter for labels longer than the bar. Do we want to keep it that way or center always?
=============== Diff against Morphic-tonyg.1687 ===============
Item was changed:
----- Method: SystemProgressMorph>>reposition (in category 'private') -----
reposition
+ "Put ourself in the requested position on the display, but ensure completely within the bounds of the display. Compute layout first via #fullBounds to get correct #center."
+
+ self fullBounds.
- "Put ourself in the requested position on the display, but ensure completely within the bounds of the display"
- | position |
self bounds:
+ ((self bounds
+ align: self center
+ with: (self requestedPosition ifNil: [ self center ]))
+ translatedToBeWithin: self currentWorld bounds).
+
+ "Check to see if labels are wider than progress bars. In that case do a centered instead of the default left aligned layout."
+ self cellPositioning:
+ (self layoutExtent x > BarWidth
+ ifTrue: [ #topCenter ]
+ ifFalse: [ #leftCenter ]).!
- ((self fullBounds
- align: self fullBounds center
- with: (self requestedPosition ifNil: [ self fullBounds center ])) translatedToBeWithin: Display boundingBox).
- "Check to see if labels are wider than progress bars. In that case do
- a centered instead of the default left aligned layout."
- position := self width > (Inset x * 2 + (self borderWidth * 2) + BarWidth)
- ifTrue: [ #topCenter ]
- ifFalse: [ #leftCenter ].
- self cellPositioning: position!