Two days ago I removed lots of unused code. The old code obscured the shape 
of Leo's actual key-binding scheme. I have just updated the section << Key 
bindings, an overview >> in leoKeys.py as follows::

The big pictures of key bindings:
    
1. Code in leoKeys.py and in leoConfig.py converts user key settings to
   various Python **binding dictionaries** defined in leoKeys.py.
   
2. An instance of leoQtEventFilter should be attached to all visible panes
   in Leo's main window. g.app.gui.setFilter does this.
   
3. leoQtEventFilter.eventFilter calls k.masterKeyhandler for every
   keystroke. eventFilter passes only just the event argument to
   k.masterKeyHandler. The event arg gives both the widget in which the
   event occurs and the keystroke.
   
4. k.masterKeyHandler and its helpers use the event argument and the binding
   dictionaries to execute the Leo command (if any) associated with the
   incoming keystroke.
   
Important details:

1. g.app.gui.setFilter allows various traces and assertions to be made
   uniformly. The obj argument to setFilter is a QWidget object; the w
   argument to setFilter can be either the same as obj, or a Leo wrapper
   class the supports the HighLevelInterface protocol. **Important**: the
   types of obj and w are not actually all that important, as discussed
   next.
   
2. The logic in k.masterKeyHandler and its helpers is long and involved:

A. k.getPaneBinding associates a command with the incoming keystroke based
   on a) the widget's name and b) whether the widget is a text widget
   (which depends on the type of the widget).
   
   To do this, k.getPaneBinding uses a **binding priority table**. This
   table is defined within k.getPaneBinding itself. The table indicates
   which of several possible bindings should have priority. For instance,
   if the widget is a text widget, a user binding for a 'text' widget takes
   priority over a default key binding. Similarly, if the widget is Leo's
   tree widget, a 'tree' binding has top priority. There are many other
   details encapsulated in the table. The exactly details of the binding
   priority table are open to debate, but in practice the resulting
   bindings are as expected.
   
B. If k.getPaneBinding finds a command associated with the incoming
   keystroke, k.masterKeyHandler calls k.masterCommand to execute the
   command. k.masterCommand handles many complex. See the source code for
   details.
   
C. If k.getPaneBinding fails to bind the incoming keystroke to a command,
   k.masterKeyHandler calls k.handleUnboundKeys to handle the keystroke.
   Depending on the widget, and settings, and the keystroke,
   k.handleUnboundKeys may do nothing, or it may call k.masterCommand to
   insert a plain key into the widget.
Edward

-- 
You received this message because you are subscribed to the Google Groups 
"leo-editor" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to leo-editor+unsubscr...@googlegroups.com.
To post to this group, send email to leo-editor@googlegroups.com.
Visit this group at http://groups.google.com/group/leo-editor.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to