[squeak-dev] The Trunk: Kernel-mt.1289.mcz
Nicolas Cellier
nicolas.cellier.aka.nice at gmail.com
Sat Dec 28 15:52:22 UTC 2019
Le jeu. 19 déc. 2019 à 11:46, <commits at source.squeak.org> a écrit :
> Marcel Taeumel uploaded a new version of Kernel to project The Trunk:
> http://source.squeak.org/trunk/Kernel-mt.1289.mcz
>
> ==================== Summary ====================
>
> Name: Kernel-mt.1289
> Author: mt
> Time: 19 December 2019, 11:45:58.637761 am
> UUID: e9f9d6a0-0ce8-114e-b3d2-26b481f590a1
> Ancestors: Kernel-mt.1288
>
> - fixes ctrl <-> alt key swapping bug in #processEvent:
> - fixes ctrl <-> alt key swapping by extending the range to the same range
> as for "duplicate *all*"
> - LINUX ONLY: fixes swapping and duplication of ctrl/alt keys
> - LINUX ONLY: maps controls keys that arrive as ASCII 64 to 127 down to
> ASCII 0 to 31
> - document that other (older) "duplicate keys" preference to be deprecated
> after the 5.3 release
>
> So, the current VM 201911282316 should be fine for all platforms for
> Squeak 5.3 at the moment.
>
> =============== Diff against Kernel-mt.1288 ===============
>
> Item was added:
> + ----- Method: EventSensor class>>installControlKeyEntryFor: (in category
> 'key decode table') -----
> + installControlKeyEntryFor: aPrintableCharacter
> +
> + | upper lower |
> + self assert: (aPrintableCharacter asInteger between: 64 and: 95).
> +
> + upper := aPrintableCharacter asInteger.
> + lower := aPrintableCharacter asInteger bitOr: 16r20.
> +
> + "For Unix/Linux VMs as of version 201911282316, no control
> characters will be sent from the VM. Avoid check for #platformName because
> the extra mapping will not affect others anyway."
> + self flag: #unixOnly.
> + KeyDecodeTable at: { lower . 2 "ctrl" } put: { lower bitAnd: 16r9F
> . 2 "ctrl" }.
> + KeyDecodeTable at: { upper . 2 bitOr: 1 "ctrl+shift" } put: {
> upper bitAnd: 16r9F . 2 bitOr: 1 "ctrl+shift" }.!
>
I have fixed this in
https://github.com/OpenSmalltalk/opensmalltalk-vm/pull/460
We can remove that hack if we adopt the VM at SHA
83e43ee7138f8a1b76ed774c3972f2691776778a as I suggested (after mouse wheel
fixes https://github.com/OpenSmalltalk/opensmalltalk-vm/pull/461 and
https://github.com/OpenSmalltalk/opensmalltalk-vm/pull/462)
IMO, we should adopt that VM, it restores compatibility with older ones.
> Item was changed:
> ----- Method: EventSensor class>>installDuplicateKeyEntryFor: (in
> category 'key decode table') -----
> installDuplicateKeyEntryFor: aPrintableCharacter
> "Updates the key-decode table, which maps between pairs of
> {character code . modifier code}. See the class comment for more
> information.
> Note that the bitmask 16r9F removes the high bits, which subtracts
> 64 from the key code for (upper) $A to $Z and 96 for (lower) $a to $z. The
> VM sends non-printable control characters for [ctrl]+[A-Za-Z] in ASCII <
> 32, but the given character is expected to be ASCII >= 32 and thus
> printable. So we have to convert printable characters to control characters
> in this mapping table."
>
> | upper lower |
> upper := aPrintableCharacter asUppercase asInteger.
> lower := aPrintableCharacter asLowercase asInteger.
>
> KeyDecodeTable at: { lower bitAnd: 16r9F . 2 "ctrl" } put: { lower
> . 8 "cmd/alt" }.
> KeyDecodeTable at: { upper bitAnd: 16r9F . 2 bitOr: 1 "ctrl+shift"
> } put: { upper . 8 bitOr: 1 "cmd/alt+shift" }.
> +
> + "For Unix/Linux VMs as of version 201911282316, no control
> characters will be sent from the VM. Avoid check for #platformName because
> the extra mapping will not affect others anyway."
> + self flag: #unixOnly.
> + KeyDecodeTable at: { lower . 2 "ctrl" } put: { lower . 8 "cmd/alt"
> }.
> + KeyDecodeTable at: { upper . 2 bitOr: 1 "ctrl+shift" } put: {
> upper . 8 bitOr: 1 "cmd/alt+shift" }.!
> - !
>
> Item was changed:
> ----- Method: EventSensor class>>installKeyDecodeTable (in category
> 'class initialization') -----
> installKeyDecodeTable
> + "Create a decode table that swaps or duplicates some keys if the
> respective preference is set."
> +
> - "Create a decode table that swaps some keys if
> - Preferences swapControlAndAltKeys is set"
> KeyDecodeTable := Dictionary new.
> +
> + "In any case, ensure that control keys are mapped correctly."
> + self flag: #toRemove. "mt: If all VMs send the correct control
> keys on all platforms, we will remove this mapping."
> + 64 "$@" to: 95 "$_"do: [:keyCode | self installControlKeyEntryFor:
> keyCode asCharacter].
> +
> - Preferences duplicateControlAndAltKeys
> - ifTrue: [ self defaultCrossPlatformKeys do:
> - [ :c | self installDuplicateKeyEntryFor: c
> ] ].
> Preferences swapControlAndAltKeys
> + ifTrue: [ (Character allByteCharacters select: [:ea | ea
> isAlphaNumeric]) do:
> - ifTrue: [ self defaultCrossPlatformKeys do:
> [ :c | self installSwappedKeyEntryFor: c ]
> ].
> Preferences duplicateAllControlAndAltKeys
> ifTrue: [ (Character allByteCharacters select: [:ea | ea
> isAlphaNumeric]) do:
> [ :c | self installDuplicateKeyEntryFor: c
> ] ].
> +
> + self flag: #toDeprecate. "mt: This mapping should be deprecated in
> the future."
> + Preferences duplicateControlAndAltKeys
> + ifTrue: [ self defaultCrossPlatformKeys do:
> + [ :c | self installDuplicateKeyEntryFor: c
> ] ].
> !
>
> Item was changed:
> ----- Method: EventSensor class>>installSwappedKeyEntryFor: (in category
> 'key decode table') -----
> installSwappedKeyEntryFor: aPrintableCharacter
> "Updates the key-decode table, which maps between pairs of
> {character code . modifier code}. See the class comment for more
> information.
> Note that the bitmask 16r9F removes the high bits, which subtracts
> 64 from the key code for (upper) $A to $Z and 96 for (lower) $a to $z. The
> VM sends non-printable control characters for [ctrl]+[A-Za-Z] in ASCII <
> 32, but the given character is expected to be ASCII >= 32 and thus
> printable. So we have to convert printable characters to control characters
> in this mapping table."
>
> | upper lower |
> upper := aPrintableCharacter asUppercase asInteger.
> lower := aPrintableCharacter asLowercase asInteger.
>
> KeyDecodeTable at: { lower bitAnd: 16r9F . 2 "ctrl" } put: { lower
> . 8 "cmd/alt" }.
> KeyDecodeTable at: { lower . 8 "cmd/alt" } put: { lower bitAnd:
> 16r9F . 2 "ctrl" }.
> KeyDecodeTable at: { upper bitAnd: 16r9F . 2 bitOr: 1 "ctrl+shift"
> } put: { upper . 8 bitOr: 1 "cmd/alt+shift" }.
> + KeyDecodeTable at: { upper . 8 bitOr: 1 "cmd/alt+shift" } put: {
> upper bitAnd: 16r9F . 2 bitOr: 1 "ctrl+shift" }.
> +
> + "For Unix/Linux VMs as of version 201911282316, no control
> characters will be sent from the VM. Avoid check for #platformName because
> the extra mapping will not affect others anyway."
> + self flag: #unixOnly.
> + KeyDecodeTable at: { lower . 2 "ctrl" } put: { lower . 8 "cmd/alt"
> }.
> + KeyDecodeTable at: { upper . 2 bitOr: 1 "ctrl+shift" } put: {
> upper . 8 bitOr: 1 "cmd/alt+shift" }.!
> - KeyDecodeTable at: { upper . 8 bitOr: 1 "cmd/alt+shift" } put: {
> upper bitAnd: 16r9F . 2 bitOr: 1 "ctrl+shift" }.!
>
> Item was changed:
> ----- Method: EventSensor>>processEvent: (in category 'private-I/O')
> -----
> processEvent: evt
> "Process a single event. This method is run at high priority."
> | type buttons window |
> type := evt at: 1.
>
> "Only process main window events, forward others to host window
> proxies"
> window := evt at: 8.
> (window isNil or: [window isZero]) ifTrue:
> [window := 1.
> evt at: 8 put: window].
> window = 1 ifFalse: [
> ^Smalltalk at: #HostWindowProxy ifPresent: [:w | w
> processEvent: evt]].
>
> "Tackle mouse events and mouse wheel events first"
> (type = EventTypeMouse or: [type = EventTypeMouseWheel])
> ifTrue: [buttons := (ButtonDecodeTable at: (evt at: 5) +
> 1).
> evt at: 5 put: (Smalltalk platformName =
> 'Mac OS'
> ifTrue: [ buttons ]
> ifFalse: [ self
> mapButtons: buttons modifiers: (evt at: 6) ]).
> self queueEvent: evt.
> type = EventTypeMouse ifTrue: [self
> processMouseEvent: evt].
> type = EventTypeMouseWheel ifTrue: [self
> processMouseWheelEvent: evt].
> ^self].
>
> "Store the event in the queue if there's any"
> type = EventTypeKeyboard
> ifTrue: [ "Check if the event is a user interrupt"
> ((evt at: 4) = EventKeyChar
> and: [((evt at: 3)
> bitOr: (((evt at: 5)
> bitAnd: 8)
> bitShift: 8))
> = interruptKey])
> ifTrue: ["interrupt key is meta -
> not reported as event"
> ^
> interruptSemaphore signal].
> "Decode keys for characters (i.e., duplicate or
> swap, ctrl <-> alt/cmd)."
> (evt at: 4) = EventKeyChar
> + ifTrue: [ | unicode ascii |
> + "Copy lookup key first in case of
> key swap."
> + unicode := {evt at: 6. evt at: 5}.
> + ascii := {evt at: 3. evt at: 5}.
> - ifTrue: [
> KeyDecodeTable "Unicode character
> first"
> + at: unicode
> - at: {evt at: 6. evt at: 5}
> ifPresent: [:a | evt at: 6
> put: a first;
> at: 5
> put: a second].
> KeyDecodeTable "ASCII character
> second"
> + at: ascii
> - at: {evt at: 3. evt at: 5}
> ifPresent: [:a | evt at: 3
> put: a first;
> at: 5
> put: a second]].
> self queueEvent: evt.
> self processKeyboardEvent: evt .
> ^self ].
>
> "Handle all events other than Keyboard or Mouse."
> self queueEvent: evt.
> !
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20191228/6e8b0e15/attachment.html>
More information about the Squeak-dev
mailing list
|