From commits at source.squeak.org Wed Jul 1 17:05:12 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Wed, 1 Jul 2020 17:05:12 0000 Subject: [Pkg] The Trunk: Compiler-eem.440.mcz Message-ID: Eliot Miranda uploaded a new version of Compiler to project The Trunk: http://source.squeak.org/trunk/Compiler-eem.440.mcz ==================== Summary ==================== Name: Compiler-eem.440 Author: eem Time: 1 July 2020, 10:05:10.178038 am UUID: a39848b4-1bc8-4b31-93f8-e4f343d1400b Ancestors: Compiler-mt.439 Improve slightly the EncoderForSistaV1 class comment specifying the SistaV1 bytecode set in the light of recent discussion. =============== Diff against Compiler-mt.439 =============== Item was changed: BytecodeEncoder subclass: #EncoderForSistaV1 (excessive size, no diff calculated) From commits at source.squeak.org Fri Jul 3 05:24:38 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 3 Jul 2020 05:24:38 0000 Subject: [Pkg] The Trunk: KernelTests-tpr.383.mcz Message-ID: tim Rowledge uploaded a new version of KernelTests to project The Trunk: http://source.squeak.org/trunk/KernelTests-tpr.383.mcz ==================== Summary ==================== Name: KernelTests-tpr.383 Author: tpr Time: 2 July 2020, 10:24:36.600711 pm UUID: cb4cc7c5-a318-4424-93dd-1414a73dbc32 Ancestors: KernelTests-tonyg.382 Make the AllocationTest work by preventing the requested free space size (in #setFreeSpaceLimi....) from exceeding SmallInteger>maxVal and thereby failing the vmParameter primitive's limit. =============== Diff against KernelTests-tonyg.382 =============== Item was changed: ----- Method: AllocationTest>>setFreeSpaceLimitOf:around: (in category 'support') ----- setFreeSpaceLimitOf: bytes around: aBlock "Attempt to evaluate aBlock with a limit of the requested ammount of free old space, restoring the extant limit after the evaluation." | extantLimit | extantLimit := Smalltalk vmParameterAt: 67. + Smalltalk vmParameterAt: 67 put: ((Smalltalk vmParameterAt: 1) + bytes asInteger min: SmallInteger maxVal). - Smalltalk vmParameterAt: 67 put: (Smalltalk vmParameterAt: 1) + bytes asInteger. ^aBlock ensure: [Smalltalk vmParameterAt: 67 put: extantLimit]! From commits at source.squeak.org Sat Jul 4 18:51:48 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Sat, 4 Jul 2020 18:51:48 0000 Subject: [Pkg] The Trunk: ShoutCore-eem.84.mcz Message-ID: Eliot Miranda uploaded a new version of ShoutCore to project The Trunk: http://source.squeak.org/trunk/ShoutCore-eem.84.mcz ==================== Summary ==================== Name: ShoutCore-eem.84 Author: eem Time: 4 July 2020, 11:51:47.113679 am UUID: 56a7592a-90ef-4c61-8b03-51094781d61f Ancestors: ShoutCore-mt.83 Shout robustness. If anything goes wron with source file access (recursive errors in the debugger, etc) then method getSource may not answer sufficient text and a bounds violation can occur in Shout. This prevents that. =============== Diff against ShoutCore-mt.83 =============== Item was changed: ----- Method: SHParserST80>>initializeVariablesFromContext (in category 'parse support') ----- initializeVariablesFromContext + | contextSourcePcIndex contextSource contextSourceParser | - | contextSourcePcIndex contextSourceParser | contextSourcePcIndex := (context debuggerMap rangeForPC: (context isDead ifTrue: [context endPC] ifFalse: [context pc]) in: context method contextIsActiveContext: true "... to really use the context's pc.") start. + contextSource := context method getSource. contextSourceParser := self class new classOrMetaClass: context method methodClass; environment: self environment; + source: (contextSource first: (contextSourcePcIndex min: contextSource size)); - source: (context method getSource first: contextSourcePcIndex); yourself. contextSourceParser parse. arguments := contextSourceParser activeArguments. + temporaries := contextSourceParser activeTemporaries! - temporaries := contextSourceParser activeTemporaries.! From commits at source.squeak.org Thu Jul 9 13:54:04 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 9 Jul 2020 13:54:04 0000 Subject: [Pkg] The Trunk: CommandLine-TheresaHMartenK.17.mcz Message-ID: Patrick Rein uploaded a new version of CommandLine to project The Trunk: http://source.squeak.org/trunk/CommandLine-TheresaHMartenK.17.mcz ==================== Summary ==================== Name: CommandLine-TheresaHMartenK.17 Author: TheresaHMartenK Time: 20 June 2020, 4:33:21.503561 pm UUID: 1e990100-46c5-7b4a-966c-d1908837d2ca Ancestors: CommandLine-mt.16 Same reason as: ToolBuilder-Morphic-TheresaHMartenK.261 Copy: The current implementation searches for the supplied answer in the valueList and if found returns the value at the found index in the valueList which of course is the supplied answer. However from the behaviour that gets mimicked you would expect the implementation to look for the suppliedAnswer in the labelList - the same as you click on the label and not on its connected value. Additionally this produces less readable / understandable code compared to supplying the label, especially if the value happens to be a block. With the new implementation, the answer is searched in the labelList, and the returned value is the coresponding value from the valueList. =============== Diff against CommandLine-mt.16 =============== Item was changed: ----- Method: DummyUIManager>>chooseFrom:values:lines:title: (in category 'ui requests') ----- chooseFrom: labelList values: valueList lines: linesArray title: aString self askForProvidedAnswerTo: aString ifSupplied: [:answer | (answer = #cancel or: [answer isNil]) ifTrue: [^ nil]. + ^ valueList at: (labelList indexOf: answer) ifAbsent: [ - ^ valueList at: (valueList indexOf: answer) ifAbsent: [ answer isNumber ifTrue: [valueList at: answer ifAbsent: [nil]] ifFalse: [nil]]]. ^ valueList first! From commits at source.squeak.org Thu Jul 9 13:54:15 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 9 Jul 2020 13:54:15 0000 Subject: [Pkg] The Trunk: ToolBuilder-MVC-TheresaHMartenK.60.mcz Message-ID: Patrick Rein uploaded a new version of ToolBuilder-MVC to project The Trunk: http://source.squeak.org/trunk/ToolBuilder-MVC-TheresaHMartenK.60.mcz ==================== Summary ==================== Name: ToolBuilder-MVC-TheresaHMartenK.60 Author: TheresaHMartenK Time: 20 June 2020, 4:32:44.419561 pm UUID: ce7849e7-d47c-434e-8bbd-f6ec2b896a4c Ancestors: ToolBuilder-MVC-mt.59 Same reason as: ToolBuilder-Morphic-TheresaHMartenK.261 Copy: The current implementation searches for the supplied answer in the valueList and if found returns the value at the found index in the valueList which of course is the supplied answer. However from the behaviour that gets mimicked you would expect the implementation to look for the suppliedAnswer in the labelList - the same as you click on the label and not on its connected value. Additionally this produces less readable / understandable code compared to supplying the label, especially if the value happens to be a block. With the new implementation, the answer is searched in the labelList, and the returned value is the coresponding value from the valueList. =============== Diff against ToolBuilder-MVC-mt.59 =============== Item was changed: ----- Method: MVCUIManager>>chooseFrom:values:lines:title: (in category 'ui requests') ----- chooseFrom: labelList values: valueList lines: linesArray title: aString "Choose an item from the given list. Answer the selected item." | menu | self askForProvidedAnswerTo: aString ifSupplied: [:answer | (answer = #cancel or: [answer isNil]) ifTrue: [^ nil]. + ^ valueList at: (labelList indexOf: answer) ifAbsent: [ - ^ valueList at: (valueList indexOf: answer) ifAbsent: [ answer isNumber ifTrue: [valueList at: answer ifAbsent: [nil]] ifFalse: [nil]]]. menu := SelectionMenu labels: labelList lines: linesArray selections: valueList. ^ aString ifEmpty: [menu startUp] ifNotEmpty: [menu startUpWithCaption: aString]! From commits at source.squeak.org Thu Jul 9 13:54:25 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 9 Jul 2020 13:54:25 0000 Subject: [Pkg] The Trunk: ToolBuilder-Morphic-TheresaHMartenK.261.mcz Message-ID: Patrick Rein uploaded a new version of ToolBuilder-Morphic to project The Trunk: http://source.squeak.org/trunk/ToolBuilder-Morphic-TheresaHMartenK.261.mcz ==================== Summary ==================== Name: ToolBuilder-Morphic-TheresaHMartenK.261 Author: TheresaHMartenK Time: 20 June 2020, 4:04:09.471561 pm UUID: ec0bd065-4cc8-7d48-b940-4bf5a0f4a7cf Ancestors: ToolBuilder-Morphic-mt.260 The current implementation searches for the supplied answer in the valueList and if found returns the value at the found index in the valueList which of course is the supplied answer. However from the behaviour that gets mimicked you would expect the implementation to look for the suppliedAnswer in the labelList - the same as you click on the label and not on its connected value. Additionally this produces less readable / understandable code compared to supplying the label, especially if the value happens to be a block. With the new implementation, the answer is searched in the labelList, and the returned value is the coresponding value from the valueList. =============== Diff against ToolBuilder-Morphic-mt.260 =============== Item was changed: ----- Method: MorphicUIManager>>chooseFrom:values:lines:title: (in category 'ui requests') ----- chooseFrom: labelList values: valueList lines: linesArray title: aString "Choose an item from the given list. Answer the selected item." | index | self askForProvidedAnswerTo: aString ifSupplied: [:answer | (answer = #cancel or: [answer isNil]) ifTrue: [^ nil]. + ^ valueList at: (labelList indexOf: answer) ifAbsent: [ - ^ valueList at: (valueList indexOf: answer) ifAbsent: [ answer isNumber ifTrue: [valueList at: answer ifAbsent: [nil]] ifFalse: [nil]]]. index := self chooseFrom: labelList lines: linesArray title: aString. ^ index = 0 ifTrue: [ nil ] ifFalse: [ valueList at: index ]! From commits at source.squeak.org Thu Jul 9 13:54:59 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 9 Jul 2020 13:54:59 0000 Subject: [Pkg] The Trunk: ToolBuilder-Morphic-pre.262.mcz Message-ID: Patrick Rein uploaded a new version of ToolBuilder-Morphic to project The Trunk: http://source.squeak.org/trunk/ToolBuilder-Morphic-pre.262.mcz ==================== Summary ==================== Name: ToolBuilder-Morphic-pre.262 Author: pre Time: 9 July 2020, 3:52:09.108909 pm UUID: 55e57017-8d67-424f-9a7b-2b64ed8af8af Ancestors: ToolBuilder-Morphic-tpr.261, ToolBuilder-Morphic-TheresaHMartenK.261 Merge of ToolBuilder-Morphic-TheresaHMartenK.261 The current implementation searches for the supplied answer in the valueList and if found returns the value at the found index in the valueList which of course is the supplied answer. However from the behaviour that gets mimicked you would expect the implementation to look for the suppliedAnswer in the labelList - the same as you click on the label and not on its connected value. Additionally this produces less readable / understandable code compared to supplying the label, especially if the value happens to be a block. With the new implementation, the answer is searched in the labelList, and the returned value is the coresponding value from the valueList. =============== Diff against ToolBuilder-Morphic-tpr.261 =============== Item was changed: ----- Method: MorphicUIManager>>chooseFrom:values:lines:title: (in category 'ui requests') ----- chooseFrom: labelList values: valueList lines: linesArray title: aString "Choose an item from the given list. Answer the selected item." | index | self askForProvidedAnswerTo: aString ifSupplied: [:answer | (answer = #cancel or: [answer isNil]) ifTrue: [^ nil]. + ^ valueList at: (labelList indexOf: answer) ifAbsent: [ - ^ valueList at: (valueList indexOf: answer) ifAbsent: [ answer isNumber ifTrue: [valueList at: answer ifAbsent: [nil]] ifFalse: [nil]]]. index := self chooseFrom: labelList lines: linesArray title: aString. ^ index = 0 ifTrue: [ nil ] ifFalse: [ valueList at: index ]! From commits at source.squeak.org Sun Jul 12 14:14:05 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Sun, 12 Jul 2020 14:14:05 0000 Subject: [Pkg] The Trunk: Collections-ul.902.mcz Message-ID: Levente Uzonyi uploaded a new version of Collections to project The Trunk: http://source.squeak.org/trunk/Collections-ul.902.mcz ==================== Summary ==================== Name: Collections-ul.902 Author: ul Time: 12 July 2020, 4:13:31.850218 pm UUID: 75865200-256c-40b8-9303-ec9a473c16cf Ancestors: Collections-ul.901 OrderedCollection changes: - override #allButFirstDo: and #allButLastDo: the same way #do: is done to achive better performance - use #to:do: instead of #whileTrue: in all methods iterating over the internal indices =============== Diff against Collections-ul.901 =============== Item was added: + ----- Method: OrderedCollection>>allButFirstDo: (in category 'enumerating') ----- + allButFirstDo: aBlock + "Override the superclass for performance reasons." + + firstIndex + 1 to: lastIndex do: [ :index | + aBlock value: (array at: index) ]! Item was added: + ----- Method: OrderedCollection>>allButLastDo: (in category 'enumerating') ----- + allButLastDo: aBlock + "Override the superclass for performance reasons." + + firstIndex to: lastIndex - 1 do: [ :index | + aBlock value: (array at: index) ]! Item was changed: ----- Method: OrderedCollection>>do: (in category 'enumerating') ----- do: aBlock "Override the superclass for performance reasons." + + firstIndex to: lastIndex do: [ :index | + aBlock value: (array at: index) ]! - | index | - index := firstIndex. - [index <= lastIndex] - whileTrue: - [aBlock value: (array at: index). - index := index + 1]! Item was changed: ----- Method: OrderedCollection>>find: (in category 'private') ----- find: oldObject " This method answers an index in the range firstIndex .. lastIndex, which is meant for internal use only. Never use this method in your code, the methods for public use are: #indexOf: #indexOf:ifAbsent: " + firstIndex to: lastIndex do: [ :index | + (array at: index) = oldObject ifTrue: [ ^index ] ]. - | index | - index := firstIndex. - [index <= lastIndex] - whileTrue: - [(array at: index) = oldObject ifTrue: [^ index]. - index := index + 1]. self errorNotFound: oldObject! Item was changed: ----- Method: OrderedCollection>>remove:ifAbsent: (in category 'removing') ----- remove: oldObject ifAbsent: absentBlock + firstIndex to: lastIndex do: [ :index | + (array at: index) = oldObject ifTrue: [ + self removeIndex: index. + ^oldObject ] ]. + ^absentBlock value! - | index | - index := firstIndex. - [index <= lastIndex] - whileTrue: - [oldObject = (array at: index) - ifTrue: - [self removeIndex: index. - ^ oldObject] - ifFalse: [index := index + 1]]. - ^ absentBlock value! Item was changed: ----- Method: OrderedCollection>>reverseDo: (in category 'enumerating') ----- reverseDo: aBlock "Override the superclass for performance reasons." + + lastIndex to: firstIndex by: -1 do: [ :index | + aBlock value: (array at: index) ]! - | index | - index := lastIndex. - [index >= firstIndex] - whileTrue: - [aBlock value: (array at: index). - index := index - 1]! From commits at source.squeak.org Mon Jul 13 09:48:34 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Mon, 13 Jul 2020 09:48:34 0000 Subject: [Pkg] The Trunk: ST80-mt.256.mcz Message-ID: Marcel Taeumel uploaded a new version of ST80 to project The Trunk: http://source.squeak.org/trunk/ST80-mt.256.mcz ==================== Summary ==================== Name: ST80-mt.256 Author: mt Time: 13 July 2020, 11:48:31.957623 am UUID: 354bbbf1-f342-ca44-92c6-f5556433cecc Ancestors: ST80-mt.255 Makes MVC lists, window titles, menus, and "dialogs" aware of demo/hi-dpi mode. =============== Diff against ST80-mt.255 =============== Item was changed: Paragraph subclass: #ListParagraph instanceVariableNames: '' + classVariableNames: '' - classVariableNames: 'ListStyle' poolDictionaries: '' category: 'ST80-Support'! !ListParagraph commentStamp: '' prior: 0! I represent a special type of Paragraph that is used in the list panes of a browser. I avoid all the composition done by more general Paragraphs, because I know the structure of my Text.! Item was removed: - ----- Method: ListParagraph class>>initialize (in category 'initialization') ----- - initialize - "ListParagraph initialize" - | aFont | - "Allow different line spacing for lists" - aFont := Preferences standardListFont. - ListStyle := TextStyle fontArray: { aFont }. - ListStyle gridForFont: 1 withLead: 1! Item was changed: ----- Method: ListParagraph class>>standardListStyle (in category 'style') ----- standardListStyle + + ^ (TextStyle fontArray: { Preferences standardListFont }) + gridForFont: 1 withLead: 1; + yourself! - ^ ListStyle! Item was changed: ----- Method: ListParagraph class>>withArray:style: (in category 'instance creation') ----- withArray: anArray style: aTextStyleOrNil "Convert an array of strings into a ListParagraph using the given TextStyle." aTextStyleOrNil + ifNil: [^ (super withText: Text new style: self standardListStyle) withArray: anArray] - ifNil: [^ (super withText: Text new style: ListStyle) withArray: anArray] ifNotNil: [^ (super withText: Text new style: aTextStyleOrNil) withArray: anArray]. ! Item was changed: ----- Method: MVCProject>>jumpToProject (in category 'utilities') ----- jumpToProject "Present a list of potential projects and enter the one selected. We use mvcStartUpLeftFlush for possibly no longer valid historical reasons" "Project current jumpToProject" + self jumpToSelection: (self buildJumpToMenu: CustomMenu new) startUp! - self jumpToSelection: (self buildJumpToMenu: CustomMenu new) mvcStartUpLeftFlush! Item was changed: ----- Method: PopUpMenu>>computeLabelParagraph (in category '*ST80-Support') ----- computeLabelParagraph "Answer a Paragraph containing this menu's labels, one per line and centered." + ^ Paragraph withText: labelString asText style: self class standardMenuStyle! - ^ Paragraph withText: labelString asText style: MenuStyle! Item was removed: - ----- Method: PopUpMenu>>mvcStartUpLeftFlush (in category '*ST80-Menus') ----- - mvcStartUpLeftFlush - "Build and invoke this menu with no initial selection. By Jerry Archibald, 4/01. - If in MVC, align menus items with the left margin. - Answer the selection associated with the menu item chosen by the user or nil if none is chosen. - The mechanism for getting left-flush appearance in mvc leaves a tiny possibility for misadventure: if the user, in mvc, puts up the jump-to-project menu, then hits cmd period while it is up, then puts up a second jump-to-project menu before dismissing or proceeding through the debugger, it's possible for mvc popup-menus thereafter to appear left-aligned rather than centered; this very unlikely condition can be cleared by evaluating 'PopUpMenu alignment: 2'" - - | saveAlignment | - saveAlignment := PopUpMenu alignment. - PopUpMenu leftFlush. - ^[self startUp] ensure: - [PopUpMenu alignment: saveAlignment]! Item was changed: View subclass: #StandardSystemView instanceVariableNames: 'labelFrame labelText isLabelComplemented savedSubViews minimumSize maximumSize collapsedViewport expandedViewport labelBits windowBits bitsValid updatablePanes' + classVariableNames: 'CacheBits' - classVariableNames: 'CacheBits LabelStyle' poolDictionaries: '' category: 'ST80-Support'! !StandardSystemView commentStamp: '' prior: 0! I represent a view that has a label above its top left corner. The text in the label identifies the kind of view. In addition to a label, I add control over the maximum and minimum size of the display box of my instance. My default controller is StandardSystemController. The elements of ScheduledControllers, the sole instance of ControlManager, are usually controllers for instances of me.! Item was changed: ----- Method: StandardSystemView class>>initialize (in category 'class initialization') ----- initialize "StandardSystemView initialize" + self doCacheBits.! - self doCacheBits. - self setLabelStyle! Item was removed: - ----- Method: StandardSystemView class>>setLabelStyle (in category 'class initialization') ----- - setLabelStyle - | aFont | - "StandardSystemView setLabelStyle" - aFont := Preferences windowTitleFont. - LabelStyle := TextStyle fontArray: { aFont }. - LabelStyle gridForFont: 1 withLead: 0! Item was added: + ----- Method: StandardSystemView class>>standardLabelStyle (in category 'class initialization') ----- + standardLabelStyle + + ^ (TextStyle fontArray: { Preferences windowTitleFont }) + gridForFont: 1 withLead: 0; + yourself! Item was changed: ----- Method: StandardSystemView>>label: (in category 'label access') ----- label: aString "Set aString to be the receiver's label." labelText := Paragraph withText: (Text fromString: ((aString == nil or: [aString isEmpty]) ifTrue: ['Untitled' copy] ifFalse: [aString])) + style: self class standardLabelStyle. - style: LabelStyle. insetDisplayBox == nil ifTrue: [^ self]. "wait for further initialization" self setLabelRegion! Item was changed: ----- Method: StandardSystemView>>labelHeight (in category 'label access') ----- labelHeight + ^ ((self class standardLabelStyle fontAt: 1) height + 4) max: 20! - ^ ((LabelStyle fontAt: 1) height + 4) max: 20! From commits at source.squeak.org Mon Jul 13 09:49:24 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Mon, 13 Jul 2020 09:49:24 0000 Subject: [Pkg] The Trunk: Tools-mt.982.mcz Message-ID: Marcel Taeumel uploaded a new version of Tools to project The Trunk: http://source.squeak.org/trunk/Tools-mt.982.mcz ==================== Summary ==================== Name: Tools-mt.982 Author: mt Time: 13 July 2020, 11:49:22.018623 am UUID: 870fe86a-ad9d-c34d-9103-645414fb1259 Ancestors: Tools-mt.981 Complements ST80-mt.256 =============== Diff against Tools-mt.981 =============== Item was changed: ----- Method: Browser>>buildAndOpenFullBrowser (in category 'toolbuilder') ----- buildAndOpenFullBrowser "assemble the spec for a full system browser, build it and open it" + | builder window | - | builder windowSpec | builder := ToolBuilder default. "the build-but-don't-open phase is factored out to support the prototypicalToolWindow facility" + window := self buildDefaultBrowserWith: builder. + builder open: window.! - windowSpec := self buildDefaultBrowserWith: builder. - builder open: windowSpec. - - ^self - ! Item was changed: ----- Method: CustomMenu>>build (in category 'private') ----- build "Turn myself into an invokable ActionMenu." | stream | stream := WriteStream on: (String new). labels do: [:label | stream nextPutAll: label; cr]. (labels isEmpty) ifFalse: [stream skip: -1]. "remove final cr" super labels: stream contents + font: Preferences standardMenuFont - font: MenuStyle defaultFont lines: dividers! Item was changed: ----- Method: HierarchyBrowser>>buildAndOpenBrowserLabel: (in category 'toolbuilder') ----- buildAndOpenBrowserLabel: aLabelString "assemble the spec for a class list/hierarchy browser, build it and open it" + | builder window | - | builder windowSpec | builder := ToolBuilder default. + window := self buildDefaultBrowserWith: builder. + aLabelString ifNotNil: [:str | window label: str]. - windowSpec := self buildDefaultBrowserWith: builder. - aLabelString ifNotNil:[:str| windowSpec label: str]. + builder open: window.! - builder open: windowSpec. - - ^self - ! Item was changed: Object subclass: #PopUpMenu instanceVariableNames: 'labelString font lineArray frame form marker selection' + classVariableNames: 'CacheMenuForms' - classVariableNames: 'CacheMenuForms MenuStyle' poolDictionaries: '' category: 'Tools-Menus'! !PopUpMenu commentStamp: '' prior: 0! I represent a list of items. My instances are presented on the display screen in a rectangular area. The user points to an item, pressing a mouse button; the item is highlighted. When the button is released, the highlighted item indicates the selection.! Item was removed: - ----- Method: PopUpMenu class>>alignment (in category 'class initialization') ----- - alignment - - ^ MenuStyle alignment! Item was removed: - ----- Method: PopUpMenu class>>alignment: (in category 'class initialization') ----- - alignment: anAlignment - - ^ MenuStyle alignment: anAlignment! Item was removed: - ----- Method: PopUpMenu class>>initialize (in category 'class initialization') ----- - initialize "PopUpMenu initialize" - (MenuStyle := TextStyle default copy) - gridForFont: TextStyle default defaultFontIndex withLead: 0; - centered. - PopUpMenu allSubInstancesDo: [:m | m rescan]! Item was changed: ----- Method: PopUpMenu class>>labels:lines: (in category 'instance creation') ----- labels: aString lines: anArray "Answer an instance of me whose items are in aString, with lines drawn after each item indexed by anArray." ^ self new labels: aString + font: Preferences standardMenuFont - font: MenuStyle defaultFont lines: anArray! Item was removed: - ----- Method: PopUpMenu class>>leftFlush (in category 'class initialization') ----- - leftFlush - - MenuStyle leftFlush! Item was removed: - ----- Method: PopUpMenu class>>setMenuFontTo: (in category 'class initialization') ----- - setMenuFontTo: aFont - "Set the menu font as indicated" - - MenuStyle := TextStyle fontArray: { aFont }. - MenuStyle - gridForFont: 1 withLead: 0; - centered. - self allSubInstancesDo: [:m | m rescan]! Item was added: + ----- Method: PopUpMenu class>>standardMenuStyle (in category 'class initialization') ----- + standardMenuStyle + + ^ (TextStyle fontArray: { Preferences standardMenuFont }) + gridForFont: 1 withLead: 0; + centered; + yourself! Item was changed: ----- Method: PopUpMenu>>computeForm (in category 'private') ----- computeForm "Compute and answer a Form to be displayed for this menu." + | borderInset paraForm menuForm menuStyle inside | - | borderInset paraForm menuForm inside | borderInset := 4 at 4. + menuStyle := self class standardMenuStyle. + paraForm := ((DisplayText text: labelString asText textStyle: menuStyle) - paraForm := ((DisplayText text: labelString asText textStyle: MenuStyle) foregroundColor: (self userInterfaceTheme textColor ifNil: [Color black]) backgroundColor: (self userInterfaceTheme color ifNil: [Color white])) form. menuForm := Form extent: paraForm extent + (borderInset * 2) depth: paraForm depth. menuForm fill: (0 @ 0 extent: menuForm extent) rule: Form over fillColor: (self userInterfaceTheme color ifNil: [Color white]). menuForm border: menuForm boundingBox width: 2 fillColor: (self userInterfaceTheme borderColor ifNil: [Color black]). paraForm displayOn: menuForm at: borderInset. lineArray == nil ifFalse: [lineArray do: [ :line | menuForm fill: (4 @ ((line * font height) + borderInset y) extent: (menuForm width - 8 @ 1)) rule: Form over fillColor: (self userInterfaceTheme lineColor ifNil: [Color black])]]. frame := Quadrangle new. frame region: menuForm boundingBox. frame borderWidth: 4. inside := frame inside. + marker := inside topLeft extent: (inside width @ menuStyle lineGrid). - marker := inside topLeft extent: (inside width @ MenuStyle lineGrid). selection := 1. ^ form := menuForm ! Item was changed: ----- Method: PopUpMenu>>displayAt:withCaption:during: (in category 'displaying') ----- displayAt: aPoint withCaption: captionOrNil during: aBlock "Display the receiver just to the right of aPoint while aBlock is evaluated. If the receiver is forced off screen, display it just to the right." | delta savedArea captionForm captionSave outerFrame captionText tFrame frameSaveLoc captionBox | marker ifNil: [self computeForm]. frame := frame align: marker leftCenter with: aPoint + (2 at 0). outerFrame := frame. captionOrNil notNil ifTrue: [captionText := (DisplayText text: captionOrNil asText + textStyle: self class standardMenuStyle copy centered) - textStyle: MenuStyle copy centered) foregroundColor: (self userInterfaceTheme textColor ifNil: [Color black]) backgroundColor: (self userInterfaceTheme color ifNil: [Color white]). tFrame := captionText boundingBox insetBy: -2. outerFrame := frame merge: (tFrame align: tFrame bottomCenter with: frame topCenter + (0 at 2))]. delta := outerFrame amountToTranslateWithin: Display boundingBox. frame right > Display boundingBox right ifTrue: [delta := 0 - frame width @ delta y]. frame := frame translateBy: delta. captionOrNil notNil ifTrue: [captionForm := captionText form. captionBox := captionForm boundingBox expandBy: 4. captionBox := captionBox align: captionBox bottomCenter with: frame topCenter + (0 at 2). captionSave := Form fromDisplay: captionBox. Display border: captionBox width: 4 fillColor: (self userInterfaceTheme color ifNil: [Color white]). Display border: captionBox width: 2 fillColor: (self userInterfaceTheme textColor ifNil: [Color black]). captionForm displayAt: captionBox topLeft + 4]. marker := marker align: marker leftCenter with: aPoint + delta + (2 at 0). savedArea := Form fromDisplay: frame. self menuForm displayOn: Display at: (frameSaveLoc := frame topLeft). selection ~= 0 ifTrue: [Display reverse: marker]. Cursor normal showWhile: aBlock. savedArea displayOn: Display at: frameSaveLoc. captionOrNil notNil ifTrue: [captionSave displayOn: Display at: captionBox topLeft]! Item was changed: ----- Method: PopUpMenu>>frameHeight (in category 'accessing') ----- frameHeight "Designed to avoid the entire frame computation (includes MVC form), since the menu may well end up being displayed in Morphic anyway." | nItems | frame ifNotNil: [^ frame height]. nItems := 1 + (labelString occurrencesOf: Character cr). + ^ (nItems * self class standardMenuStyle lineGrid) + 4 "border width"! - ^ (nItems * MenuStyle lineGrid) + 4 "border width"! Item was changed: ----- Method: PopUpMenu>>rescan (in category 'private') ----- rescan "Cause my form to be recomputed after a font change." labelString == nil ifTrue: [labelString := 'NoText!!']. + self labels: labelString font: Preferences standardMenuFont lines: lineArray. - self labels: labelString font: (MenuStyle fontAt: 1) lines: lineArray. frame := marker := form := nil. "PopUpMenu allSubInstancesDo: [:m | m rescan]"! From commits at source.squeak.org Mon Jul 13 09:49:45 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Mon, 13 Jul 2020 09:49:45 0000 Subject: [Pkg] The Trunk: 60Deprecated-mt.79.mcz Message-ID: Marcel Taeumel uploaded a new version of 60Deprecated to project The Trunk: http://source.squeak.org/trunk/60Deprecated-mt.79.mcz ==================== Summary ==================== Name: 60Deprecated-mt.79 Author: mt Time: 13 July 2020, 11:49:44.479623 am UUID: 2481d272-5ff4-1f45-a526-3cfcf05bf11e Ancestors: 60Deprecated-mt.78 Complements ST80-mt.256 =============== Diff against 60Deprecated-mt.78 =============== Item was changed: ----- Method: StandardFileMenu>>makeFileMenuFor: (in category 'menu building') ----- makeFileMenuFor: aDirectory "Initialize an instance of me to operate on aDirectory" | theMenu | pattern ifNil: [pattern := {'*'}]. Cursor wait showWhile: [self labels: (self menuLabelsString: aDirectory) + font: Preferences standardMenuFont - font: (MenuStyle fontAt: 1) lines: (self menuLinesArray: aDirectory). theMenu := self selections: (self menuSelectionsArray: aDirectory)]. ^theMenu! From commits at source.squeak.org Tue Jul 14 13:10:12 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Tue, 14 Jul 2020 13:10:12 0000 Subject: [Pkg] The Trunk: ToolBuilder-MVC-mt.61.mcz Message-ID: Marcel Taeumel uploaded a new version of ToolBuilder-MVC to project The Trunk: http://source.squeak.org/trunk/ToolBuilder-MVC-mt.61.mcz ==================== Summary ==================== Name: ToolBuilder-MVC-mt.61 Author: mt Time: 14 July 2020, 3:10:12.065552 pm UUID: 39b7e9cc-2da0-48b8-abc4-da349a22f903 Ancestors: ToolBuilder-MVC-TheresaHMartenK.60 Fixes layout bug in MVC windows. =============== Diff against ToolBuilder-MVC-TheresaHMartenK.60 =============== Item was added: + ----- Method: MVCToolBuilder>>buildAll:in: (in category 'building') ----- + buildAll: aList in: newParent + "Overridden to propagate reduced topSize to widgets." + + | priorTopSize | + priorTopSize := topSize. + topSize := newParent window. + super buildAll: aList in: newParent. + topSize := priorTopSize.! Item was removed: - ----- Method: MVCToolBuilder>>positionSubviewsWithin: (in category 'private') ----- - positionSubviewsWithin: widget - "Translate subviews to position the viewport of each subView relative to - the widget window origin. If subviews are repositioned, as in a row of button - views arranged within a view, then the transformations will later be rescaled - to fit the subviews within the widget window." - - widget subViews ifNotNil: [:subViews | - subViews isEmpty ifFalse: [ | translation | - translation := widget window origin - subViews first window origin. - subViews do: [:v | - v setTransformation: (v transformation translateBy: translation)]]]. - ! Item was changed: ----- Method: MVCToolBuilder>>setFrame:in: (in category 'private') ----- setFrame: fractionsRectangleOrLayoutFrame in: widget + | win | + fractionsRectangleOrLayoutFrame ifNil: [ + "Translate subviews to position the viewport of each subView relative to + the widget window origin. If subviews are repositioned, as in a row of button + views arranged within a view, then the transformations will later be rescaled + to fit the subviews within the widget window." + self flag: #nonProportionalLayout. "See #setLayout:in:." + widget setTransformation: (widget transformation translateBy: parent window origin - widget window origin). + ^ self]. + - fractionsRectangleOrLayoutFrame ifNil: [^nil]. win := fractionsRectangleOrLayoutFrame isRectangle ifTrue: [self asWindow: fractionsRectangleOrLayoutFrame] ifFalse: [fractionsRectangleOrLayoutFrame layout: nil in: topSize]. "assume LayoutFrame" widget window: win.! Item was changed: ----- Method: MVCToolBuilder>>setLayout:in: (in category 'private') ----- setLayout: layout in: widget "Arrange subview horizontally or vertically according to layout directive. If the subview dimensions were specified with layout frames rather than explicit rectangle sizes, then their window horizontal or vertical dimensions will be resized as needed to fit within the widget extent." - self positionSubviewsWithin: widget. layout == #proportional ifTrue:[^self]. layout == #horizontal ifTrue:[ | prev subViewWidth widgetWidth xScale | subViewWidth := (widget subViews collect: [:e | e window extent x]) sum. widgetWidth := widget window extent x. xScale := widgetWidth / subViewWidth. "to adjust corner of prev prior to align:" prev := nil. widget subViews do:[:next| | newWindowWidth newCorner | prev ifNotNil:[ "resize prev window prior to aligning next" xScale < 1 ifTrue: [ "proportional placement spec requires resizing" newWindowWidth := (prev window extent x * xScale) truncated. newCorner := (prev window origin x + newWindowWidth)@(prev window corner y). prev setWindow: (prev window origin corner: newCorner)]. next align: next viewport topLeft with: prev viewport topRight. ]. prev := next. ]. ^self]. layout == #vertical ifTrue:[ | prev subViewHeight widgetHeight yScale | subViewHeight := (widget subViews collect: [:e | e window extent y]) sum. widgetHeight := widget window extent y. yScale := widgetHeight / subViewHeight. "to adjust corner of prev prior to align:" prev := nil. widget subViews do:[:next| | newWindowHeight newCorner | prev ifNotNil:[ "resize prev window prior to aligning next" yScale < 1 ifTrue: [ "proportional placement spec requires resizing" newWindowHeight := (prev window extent y * yScale) truncated. newCorner := (prev window corner x)@(prev window origin y + newWindowHeight). prev setWindow: (prev window origin corner: newCorner)]. next align: next viewport topLeft with: prev viewport bottomLeft. ]. prev := next. ]. ^self]. ^self error: 'Unknown layout: ', layout.! From commits at source.squeak.org Wed Jul 15 07:04:35 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Wed, 15 Jul 2020 07:04:35 0000 Subject: [Pkg] The Trunk: PreferenceBrowser-mt.105.mcz Message-ID: Marcel Taeumel uploaded a new version of PreferenceBrowser to project The Trunk: http://source.squeak.org/trunk/PreferenceBrowser-mt.105.mcz ==================== Summary ==================== Name: PreferenceBrowser-mt.105 Author: mt Time: 15 July 2020, 9:04:35.150352 am UUID: 6f3e4cc4-0188-4748-abd0-b8f6e3bec8f6 Ancestors: PreferenceBrowser-mt.104 Minor tweaks of visuals in preference browser to match other tools' appearance. =============== Diff against PreferenceBrowser-mt.104 =============== Item was changed: ----- Method: PreferenceBrowserMorph>>basicButton (in category 'submorphs - buttons') ----- basicButton ^ PluggableButtonMorph new model: self model; offColor: self paneColor; hResizing: #spaceFill; + vResizing: #spaceFill; layoutInset: 4; yourself! Item was changed: ----- Method: PreferenceBrowserMorph>>buttonRowLayoutFrame (in category 'submorphs - buttons') ----- buttonRowLayoutFrame + ^LayoutFrame fractions: (0 at 0 corner: 1 at 0) offsets: (0 at 0 corner: 0@ (Preferences standardButtonFont height * 2))! - ^LayoutFrame fractions: (0 at 0 corner: 1 at 0) offsets: (0 at 0 corner: 0@ (TextStyle defaultFont height * 2.5))! Item was changed: ----- Method: PreferenceBrowserMorph>>mainPanel (in category 'submorphs - main panel') ----- mainPanel ^mainPanel ifNil: [mainPanel := BorderedMorph new color: Color transparent; borderWidth: 0; hResizing: #spaceFill; vResizing: #spaceFill; cellGap: 5; changeProportionalLayout; on: #mouseEnter send: #paneTransition: to: self; addMorphBack: self newCategoryList; addMorphBack: self preferenceList; + layoutFrame: (LayoutFrame fractions: (0 at 0 corner: 1 at 1) offsets: (0@ self searchTextFieldLayoutFrame bottomOffset corner: 0 at 0)); - layoutFrame: (LayoutFrame fractions: (0 at 0 corner: 1 at 1) offsets: (0@ 30 corner: 0 at 0)); addPaneSplitters; yourself].! Item was changed: ----- Method: PreferenceBrowserMorph>>newButtonRow (in category 'submorphs - buttons') ----- newButtonRow ^BorderedMorph new color: Color transparent; borderWidth: 0; cellGap: 2; - layoutInset: 2; layoutPolicy: TableLayout new; listDirection: #leftToRight; listCentering: #topLeft; cellPositioning: #topLeft; on: #mouseEnter send: #paneTransition: to: self; on: #mouseLeave send: #paneTransition: to: self; addMorphBack: self defaultButton; addMorphBack: self newSeparator; addMorphBack: self saveButton; addMorphBack: self loadButton; addMorphBack: self newSeparator; addMorphBack: self saveToDiskButton; addMorphBack: self loadFromDiskButton; addMorphBack: self newSeparator; addMorphBack: self themeButton; addMorphBack: self newTransparentFiller; addMorphBack: self helpButton; yourself.! Item was removed: - ----- Method: PreferenceBrowserMorph>>newSearchButton (in category 'submorphs - search panel') ----- - newSearchButton - ^self basicButton - label: 'search' translated; - actionSelector: #searchSelected; - setBalloonText: - 'Type what you want to search for here, then hit ', - 'the "Search" button, or else hit RETURN or ENTER' translated.! Item was removed: - ----- Method: PreferenceBrowserMorph>>newSearchPanel (in category 'submorphs - search panel') ----- - newSearchPanel - | bottom | - bottom := Morph new - color: Color transparent; - cellGap: 5; - layoutPolicy: TableLayout new; - listDirection: #leftToRight; - listCentering: #topLeft; - cellPositioning: #topLeft; - hResizing: #spaceFill; - vResizing: #shrinkWrap; - addMorphBack: self newSearchTextField - yourself. - ^Morph new - color: Color transparent; - layoutPolicy: TableLayout new; - listDirection: #topToBottom; - listCentering: #topLeft; - cellPositioning: #topLeft; - hResizing: #spaceFill; - vResizing: #shrinkWrap; - cellGap: 3; - addMorphBack: (StringMorph contents: 'Search preferences for: '); - addMorphBack: bottom; - yourself.! Item was changed: ----- Method: PreferenceBrowserMorph>>newSearchTextField (in category 'submorphs - search panel') ----- newSearchTextField | ptm | ptm := PluggableTextMorphPlus on: self model text: #searchPatternNeverTriggered accept: #searchPattern:. ptm minimumHeight: 0; balloonText: 'Search preferences ...'; hideScrollBarsIndefinitely; + layoutFrame: self searchTextFieldLayoutFrame; - layoutFrame: (LayoutFrame fractions: (0 at 0 corner: 1 at 0) offsets: (0 at 0 corner: 0@ (TextStyle default lineGrid * 2))); borderInset; vResizing: #spaceFill; hResizing: #spaceFill; acceptOnCR: true; onKeyStrokeSend: #value to: [ ptm hasUnacceptedEdits ifTrue: [ ptm accept ] ]. ^ptm.! Item was added: + ----- Method: PreferenceBrowserMorph>>searchTextFieldLayoutFrame (in category 'submorphs - search panel') ----- + searchTextFieldLayoutFrame + + ^ LayoutFrame + fractions: (0 at 0 corner: 1 at 0) + offsets: (0 at 0 corner: 0@ (Preferences standardDefaultTextFont height * 3/2) rounded)! From commits at source.squeak.org Wed Jul 15 07:10:22 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Wed, 15 Jul 2020 07:10:22 0000 Subject: [Pkg] The Trunk: Morphic-mt.1669.mcz Message-ID: Marcel Taeumel uploaded a new version of Morphic to project The Trunk: http://source.squeak.org/trunk/Morphic-mt.1669.mcz ==================== Summary ==================== Name: Morphic-mt.1669 Author: mt Time: 15 July 2020, 9:10:16.659352 am UUID: 13e754ac-84e8-403c-8bf8-be99b1586fbb Ancestors: Morphic-cbc.1668 Fixes icon scaling in tree widgets. =============== Diff against Morphic-cbc.1668 =============== Item was changed: ----- Method: IndentingListItemMorph>>initWithContents:prior:forList:indentLevel: (in category 'initialization') ----- initWithContents: anObject prior: priorMorph forList: hostList indentLevel: newLevel container := hostList. complexContents := anObject. anObject addDependent: self. self initWithContents: self getLabel font: Preferences standardListFont emphasis: nil. indentLevel := 0. isExpanded := false. nextSibling := firstChild := nil. priorMorph ifNotNil: [ priorMorph nextSibling: self. ]. indentLevel := newLevel. + icon := self getIcon scaleIconToDisplay. - icon := self getIcon. self extent: self minWidth @ self minHeight! Item was changed: ----- Method: IndentingListItemMorph>>refresh (in category 'initialization') ----- refresh self contents: self getLabel. + icon := self getIcon scaleIconToDisplay. - icon := self getIcon. (self valueOfProperty: #wasRefreshed ifAbsent: [false]) ifFalse: [ self setProperty: #wasRefreshed toValue: true].! From commits at source.squeak.org Wed Jul 15 09:22:36 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Wed, 15 Jul 2020 09:22:36 0000 Subject: [Pkg] The Trunk: Kernel-mt.1333.mcz Message-ID: Marcel Taeumel uploaded a new version of Kernel to project The Trunk: http://source.squeak.org/trunk/Kernel-mt.1333.mcz ==================== Summary ==================== Name: Kernel-mt.1333 Author: mt Time: 15 July 2020, 11:22:34.685718 am UUID: 4e50519a-d1e3-4a74-85cc-3c02660d650f Ancestors: Kernel-nice.1332 Clean up code for non-event-based input processing, primarily used in ST80. Moves some methods to ST80 package. Needs more work to remove all sends from Morphic such as #shiftPressed etc. Also rely on in-image interrupt-key handling only. Recent VMs do not fire the old-style interrupt semaphore anymore. See #userInterruptWatcher. =============== Diff against Kernel-nice.1332 =============== Item was changed: Object subclass: #EventSensor instanceVariableNames: 'mouseButtons mousePosition mouseWheelDelta keyboardBuffer interruptKey interruptSemaphore eventQueue inputSemaphore lastEventPoll hasInputSemaphore' + classVariableNames: 'ButtonDecodeTable EventPollPeriod EventTicklerProcess InterruptWatcherProcess KeyDecodeTable' - classVariableNames: 'ButtonDecodeTable EventPollPeriod EventTicklerProcess InterruptSemaphore InterruptWatcherProcess KeyDecodeTable' poolDictionaries: 'EventSensorConstants' category: 'Kernel-Processes'! !EventSensor commentStamp: 'mt 12/13/2019 14:38' prior: 0! An EventSensor is an interface to the user input devices. There is at least one instance of EventSensor named Sensor in the system. EventSensor is a replacement for the earlier InputSensor implementation based on a set of (optional) event primitives. An EventSensor updates its state when events are received so that all state based users of Sensor (e.g., Sensor keyboard, Sensor leftShiftDown, Sensor mouseButtons) will work exactly as before, by moving the current VM mechanisms into EventSensor itself. An optional input semaphore is part of the new design. For platforms that support true asynchronous event notification, the semaphore will be signaled to indicate pending events. On platforms that do not support asynchronous notifications about events, the UI will have to poll EventSensor periodically to read events from the VM. Instance variables: mouseButtons - mouse button state as replacement for primMouseButtons mousePosition - mouse position as replacement for primMousePt keyboardBuffer - keyboard input buffer interruptKey - currently defined interrupt key interruptSemaphore - the semaphore signaled when the interruptKey is detected eventQueue - an optional event queue for event driven applications inputSemaphore - the semaphore signaled by the VM if asynchronous event notification is supported lastEventPoll - the last millisecondClockValue at which we called fetchMoreEvents hasInputSemaphore - true if my inputSemaphore has actually been signaled at least once. Class variables: ButtonDecodeTable - maps mouse buttons as reported by the VM to ones reported in the events. KeyDecodeTable SmallInteger>> - maps some keys and their modifiers to other keys (used for instance to map Ctrl-X to Alt-X) InterruptSemaphore - signalled by the the VM and/or the event loop upon receiving an interrupt keystroke. InterruptWatcherProcess - waits on the InterruptSemaphore and then responds as appropriate. EventPollPeriod - the number of milliseconds to wait between polling for more events in the userInterruptHandler. EventTicklerProcess - the process that makes sure that events are polled for often enough (at least every EventPollPeriod milliseconds). Event format: The current event format is very simple. Each event is recorded into an 8 element array. All events must provide some SmallInteger ID (the first field in the event buffer) and a time stamp (the second field in the event buffer), so that the difference between the time stamp of an event and the current time can be reported. Currently, the following events are defined: Null event ============= The Null event is returned when the ST side asks for more events but no more events are available. Structure: [1] - event type 0 [2-8] - unused Mouse event structure ========================== Mouse events are generated when mouse input is detected. [1] - event type 1 [2] - time stamp [3] - mouse x position [4] - mouse y position [5] - button state; bitfield with the following entries: 1 - 2r001 yellow (e.g., right) button 2 - 2r010 blue (e.g., middle) button 4 - 2r100 red (e.g., left) button [all other bits are currently undefined] [6] - modifier keys; bitfield with the following entries: 1 - shift key 2 - ctrl key 4 - (Mac specific) option key 8 - Cmd/Alt key [all other bits are currently undefined] [7] - reserved. [8] - host window id. Keyboard events ==================== Keyboard events are generated when keyboard input is detected. [1] - event type 2 [2] - time stamp [3] - character code (Ascii) For now the character code is in Mac Roman encoding. See #macToSqueak. For key press/release (see [4]), character codes are normalized. [4] - press state; integer with the following meaning 0 - character (aka. key stroke or key still pressed) 1 - key press (aka. key down) 2 - key release (aka. key up) [5] - modifier keys (same as in mouse events) For key press/release (see [4]), modifier keys are still accessible. [6] - character code (Unicode UTF32) Manual decoding via KeyboardInputInterpreter possible. For key press/release (see [4]), character codes are normalized. [7] - reserved. [8] - host window id. Mouse-wheel event structure ========================== Mouse-wheel events are generated when mouse-wheel input is detected. [1] - event type 7 [2] - time stamp [3] - horizontal scroll delta [4] - vertical scroll delta [5] - button state (same as in mouse events) [6] - modifier keys (same as in mouse events) [7] - reserved. [8] - host window id. ! Item was removed: - ----- Method: EventSensor>>characterForKeycode: (in category 'keyboard') ----- - characterForKeycode: keycode - "Map the given keycode to a Smalltalk character object. Encoding: - A keycode is 12 bits: <4 modifer bits><8 bit ISO character> - Modifier bits are: