TIP #204: Virtual Events for Keyboard Traversal
_____________________________________________________________________________
TIP:	204
Title:	Virtual Events for Keyboard Traversal
Version:	$Revision: 1.5 $
Authors:	Joe English <jenglish@users.sourceforge.net>
State:	Final
Type:	Project
Tcl-Version:	8.5
Vote:	Done
Created:	Mon Jun 21 00:00:00 UTC 2004
Abstract
Proposes using two new virtual events, <<TraverseIn>> and <<TraverseOut>>, to notify widgets of keyboard navigation events.
Rationale
Certain widgets need to perform some action when they receive and/or lose keyboard focus because of keyboard traversal. For example, tabbing into an Entry or Spinbox widget selects the widget contents.
This cannot be done with a <FocusIn> binding, since widgets may receive <FocusIn> events for reasons other than keyboard traversal.
Tk currently implements this feature with special-case logic that checks the target window's widget class in the tk::TabToWindow procedure. The drawback to this approach is that it only works for the built-in widgets; third party widget sets like BWidget[http://tcllib.sf.net/], IWidgets[http://sf.net/projects/incrtcl/], and Tile[http://tktable.sf.net/tile/] must implement their own workarounds.
Proposal
Change the standard Tk bindings for <Key-Tab> and <Shift-Key-Tab> to do the following:
Send a <<TraverseOut>> virtual event to the current focus window, if any;
Set the focus to the new window;
Send a <<TraverseIn>> virtual event to the new window.
Additionally, move the current code to handle traversal to Entry and Spinbox widgets from tk::TabToWindow to class bindings.
Implementation
See Tk Patch #976928[http://sourceforge.net/support/tracker.php?aid=976928].
The BWidget package has used an identical scheme since version 1.7; see Tcllib bug #720032[http://sourceforge.net/support/tracker.php?aid=720032] for details.
Copyright
This document has been placed in the public domain.
_____________________________________________________________________________
Colophon
TIP AutoGenerator - written by Donal K. Fellows