Le 12/09/2012 07:33, Stéphane Ducasse a écrit :
if you have code that ease the replacement of hardcoded binding by key mapper, 
publish it so that we integrate
it like that everybody will benefit from it.

Stef

Ok, I'll start to provide slices under 6656, and describe what I plan to do.

Update KMDispatcher to:

- Ensure a specific ordering of targets (local first, then the rest). The current keymapObservers has a bug: it returns a Set of targets.

-- Why is KMDispatcher>>staticTargets deprecated ? This is where all the shortcuts for Nautilus are defined, as well as some shortcuts for SmalltalkEditor / Spotlight / TextEditor / TextMorph (looks like an attempt at replacing the Morphic shortcuts). -- Someone is using the perInstanceTarget ? It's a lot easier to use on:do: and the directKeymap.

- Ensure that all ctrl and cmd shorcuts are processed by KMDispatch so that they are not given to the Morphic shortcut processing code.

-- legacy tracking and testing needed for that, please ! Do you think it's better to keep the staticTargets or should legacy shortcuts be moved to on:do: below ? How often is the staticTargets thing built (Oh, every time a method with pragma <keymap> is compiled) ?

- Add a directKeymapOnly flag to restrict dispatch to the directKeymap (for users of on:do:)

Update Morphic

- Any idea about how to setup a link between a model and any Morph to give access to the keymap ? It's easy once you know the target Morphs, but how to build this knowledge and avoid code like :

targetShortcutMorph
"Get the real, lowest level morph we need to touch the key dispatch for. What a mess!"

        ^ self textModel widget submorphs first submorphs first

Update Spec.

- Easy.

Remove unneeded key processing code in Morphic (shouldn't be called anymore except for non-ctrl, non-cmd key events), and complete the shortcuts (navigation keys, special keys for specific Morphs, like <space> for MorphButton).

Your opinion ? Anything I missed ?

Thierry



Yes, I was thinking of the $a cmd | $a cmd shift thing.

Oh, the ugly code (the one that changes the KMDispatcher, right ?). It's 
patching the relevant Morphs. The solution you use when you want to hack 
Morphic without recoding it :(

Anything better than that would do, a Spec or Morphic API for the application 
to be able to reset/recode shortcuts when needed :) a nice when: #keymapChange 
do: aBlock.

Some of the work is to switch to hardcoded Keymappings... and to allow dynamic, 
instance-based control as well.

What I tried is to remove all hardcoded shortcuts, and it works. I then merged 
my menus and shortcuts, and made sure my application could control which 
shortcuts were active. But, in the process, I desactivated for my instances the 
global Keymaps, the one Nautilus uses for its shortcuts.

Thierry

________________________________________
De : [email protected] 
[[email protected]] de la part de Camillo Bruni 
[[email protected]]
Date d'envoi : mardi 11 septembre 2012 22:48
À : [email protected]
Objet : Re: [Pharo-project] RE :  Keymapping KMShortcut combining

On 2012-09-11, at 22:21, GOUBIER Thierry <[email protected]> wrote:

I've seen the combination and modifiers for Keymapper already; what I would 
like is the alternative :

Either
Character tab
or
Character tab ctrl

(because I've linked tab to nextFocus in a TreeModel, and ctrl + tab in a 
TextModel (since tab can't be used)) Ok, not much of a gain anyway, so no need 
to add this to Keymapper.

I though once about this as well, so you can do something like
$a cmd | $a cmd shift


Ben, Guillermo and Stéphane, in AltBrowser, all hard-coded shortcuts are 
desactivated and only the AltBrowser defined shortcuts are active (and those 
shortcuts are dependent on the selection and resetted on each selection change 
: it's mostly a recreation of the existing shortcuts, like doIt, copy/paste, 
navigation, etc...). It takes as code :

- A subclass of KMDispatcher with two methods (keymapObservers and 
dispatchKeystroke:).
- The code to replace each necessary KMDispatcher by this subclass.
- The code to reset and add shortcuts to those KMDispatchers.

As far as I remember I once had my own image which used KM shortcuts for all 
the default
shortcuts with proper Settings entries (maybe I find the image somewhere so I 
can share
the settings code (cause it's really only copy pasting...)

So, apart from a bit of incompatibility (ListModel shortcuts in Spec), for Spec 
it's really easy to push that once you review why I had to do that change to 
KMDispatcher. For the other parts (SmalltalkEditor), it's a matter of replacing 
some class configs by KMShortcuts. I believe someone with Nautilus knowledge 
would be nice : it is the heaviest user of shortcuts, and I really don't use 
shortcuts in the same way. A merge of both is probably necessary.

For example, I have this method, called each time the selection changes :

updateTextKeymap
   "Update the text keymap. Change the key dispatcher if needed. Change all 
dispatchers to force and really force default shortcuts not to be used."

   | keyMorph |
   keyMorph := self targetShortcutMorph.
   (textModel widget kmDispatcher isKindOf: AltKMDispatcher)
       ifFalse: [ textModel widget setProperty: #kmDispatcher toValue: 
(AltKMDispatcher target: textModel widget) ].
   (keyMorph kmDispatcher isKindOf: AltKMDispatcher)
       ifFalse: [ keyMorph setProperty: #kmDispatcher toValue: (AltKMDispatcher 
target: keyMorph) ]
       ifTrue: [ keyMorph kmDispatcher reset ].
   self selectedItem notNil
       ifTrue: [ self selectedItem item buildTextShortcutsOn: keyMorph with: 
self ]

And, in the select object side :

buildTextShortcutsOn: aKMDispatcher with: aRequestor
   "This is an attempt at handling shortcuts... Which works, with the help of a 
custom KMDispatcher."

   (Pragma allNamed: #textAreaCommand from: self class to: ABAbstractNode)
       do: [ :e |
           (self perform: e selector)
               do: [ :c |
                   | command |
                   command := c on: aRequestor textModel for: aRequestor.
                   command buildShortcut: aKMDispatcher ] ]

And then the shortcut itself in the Command object.

buildShortcut: aKMDispatcher
   "Add a shortcut to the keymap. Conditions : must have a keystroke, must 
wantsKeyboard and must be active."

   (self keystroke isNil or: [ self wantsKeyboard not or: [ self isActive not ] 
])
       ifTrue: [ ^ self ].
   aKMDispatcher
       on: self keystroke
       do: [ self execute ]

As you see, the use of KMDispatcher is dynamic and very simple, so I need your 
comments on how that would fit with Nautilus and the global keymaps, that I 
have disconnected in my case because they interfere in two ways : KMDispatch 
randomly chooses which will apply, and that disallows instance based overriding 
of shortcuts, and I don't want to have to mask all pre-existing shortcuts to 
avoid pass-through effect (a shortcut get applied because a global map has it 
and me, for my application, I don't want that to happen).

given that I am a total ignorant :P, can you explain again in different words 
why you need
the "ugly" code above?

If you remove all the hardcoded shortcuts, is your dynamic KMDispatcher switch 
still necessary?

I still remember a vague discussion with Guillermo about how to handle local
overrides of keyboard shortcuts, wish I had made a picture of that draft back 
then :P

But I think we need a bit more general solution for that problem
(of course if yours works right now, we should definitely go for it now!)









--
Thierry Goubier
CEA list
Laboratoire des Fondations des Systèmes Temps Réel Embarqués
91191 Gif sur Yvette Cedex
France
Phone/Fax: +33 (0) 1 69 08 32 92 / 83 95

Reply via email to