home *** CD-ROM | disk | FTP | other *** search
- # Copyright (c) 1990 The Regents of the University of California.
- # Copyright (c) 1994-1996 Sun Microsystems, Inc.
- # See the file "license.terms" for information on usage and redistribution
- # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
- #
- #
-
- =head1 NAME
-
- Tk::bind - Arrange for X events to invoke callbacks
-
- =for category Binding Events and Callbacks
-
- =head1 SYNOPSIS
-
- Retrieve bindings:
-
- S< >I<$widget>-E<gt>B<bind>
-
- S< >I<$widget>-E<gt>B<bind>(I<tag>)
-
- S< >I<$widget>-E<gt>B<bind>(I<sequence>)
-
- S< >I<$widget>-E<gt>B<bind>(I<tag>,I<sequence>)
-
- Associate and destroy bindings:
-
- S< >I<$widget>-E<gt>B<bind>(I<sequence>,I<callback>)
-
- S< >I<$widget>-E<gt>B<bind>(I<tag>,I<sequence>,I<callback>)
-
- =head1 DESCRIPTION
-
- The B<bind> method associates callbacks with X events.
- If I<callback> is specified, B<bind> will
- arrange for I<callback> to be evaluated whenever
- the event(s) given by I<sequence> occur in the window(s)
- identified by I<$widget> or I<tag>.
- If I<callback> is an empty string then the current binding for
- I<sequence> is destroyed, leaving I<sequence> unbound.
- In all of the cases where a I<callback> argument is provided,
- B<bind> returns an empty string.
-
- If I<sequence> is specified without a I<callback>, then the
- callback currently bound to I<sequence> is returned, or
- B<undef> is returned if there is no binding for I<sequence>.
- If neither I<sequence> nor I<callback> is specified, then the
- return value is a list whose elements are all the sequences
- for which there exist bindings for I<tag>.
-
- If no I<tag> is specified then the B<bind> refers to I<$widget>.
- If I<tag> is specified then it is typically a class name and the B<bind>
- refers to all instances of the class on the B<MainWindow> associated
- with I<$widget>. (It is possible for I<tag> to be another "widget object"
- but this practice is deprecated.) Perl's B<ref>(I<$object>) can be used
- to get the class name of any object.
- Each window has an associated list of tags, and a binding applies
- to a particular window if its tag is among those specified for
- the window.
- Although the B<bindtags> method may be used to assign an
- arbitrary set of binding tags to a window, the default binding
- tags provide the following behavior:
-
- If a tag is the name of an internal window the binding applies
- to that window.
-
- If the tag is the name of a toplevel window the binding applies
- to the toplevel window and all its internal windows.
-
- If the tag is the name of a class of widgets, such as B<Tk::Button>,
- the binding applies to all widgets in that class;
-
- If I<tag> has the value B<all>,
- the binding applies to all windows descended from the MainWindow
- of the application.
-
- =head1 EVENT PATTERNS
-
- The I<sequence> argument specifies a sequence of one or more
- event patterns, with optional white space between the patterns. Each
- event pattern has the following syntax:
-
- S< >'<modifier-modifier-type-detail>'
-
- The entire event pattern is surrounded by angle brackets, and normally
- needs to be quoted, as angle brackets are special to perl.
- Inside the angle brackets are zero or more modifiers, an event
- type, and an extra piece of information (I<detail>) identifying
- a particular button or keysym. Any of the fields may be omitted,
- as long as at least one of I<type> and I<detail> is present.
- The fields must be separated by white space or dashes.
-
- A second form of pattern is used to specify a user-defined, named virtual
- event; see L<Tk::event> for details. It has the following syntax:
-
- S< ><<name>>
-
- The entire virtual event pattern is surrounded by double angle brackets.
- Inside the angle brackets is the user-defined name of the virtual event.
- Modifiers, such as B<Shift> or B<Control>, may not be combined with a
- virtual event to modify it. Bindings on a virtual event may be created
- before the virtual event is defined, and if the definition of a virtual
- event changes dynamically, all windows bound to that virtual event will
- respond immediately to the new definition.
-
- =head1 MODIFIERS
-
- Modifiers consist of any of the following values:
-
- Control Mod2, M2
- Shift Mod3, M3
- Lock Mod4, M4
- Button1, B1 Mod5, M5
- Button2, B2 Meta, M
- Button3, B3 Alt
- Button4, B4 Double
- Button5, B5 Triple
- Mod1, M1
-
- Where more than one value is listed, separated by commas, the values
- are equivalent.
- Most of the modifiers have the obvious X meanings.
- For example, B<Button1> requires that
- button 1 be depressed when the event occurs.
- For a binding to match a given event, the modifiers in the event
- must include all of those specified in the event pattern.
- An event may also contain additional modifiers not specified in
- the binding.
- For example, if button 1 is pressed while the shift and control keys
- are down, the pattern B<E<lt>Control-Button-1E<gt>> will match
- the event, but B<E<lt>Mod1-Button-1E<gt>> will not.
- If no modifiers are specified, then any combination of modifiers may
- be present in the event.
-
- B<Meta> and B<M> refer to whichever of the
- B<M1> through B<M5> modifiers is associated with the meta
- key(s) on the keyboard (keysyms B<Meta_R> and B<Meta_L>).
- If there are no meta keys, or if they are not associated with any
- modifiers, then B<Meta> and B<M> will not match any events.
- Similarly, the B<Alt> modifier refers to whichever modifier
- is associated with the alt key(s) on the keyboard (keysyms
- B<Alt_L> and B<Alt_R>).
-
- The B<Double> and B<Triple> modifiers are a convenience
- for specifying double mouse clicks and other repeated
- events. They cause a particular event pattern to be
- repeated 2 or 3 times, and also place a time and space requirement
- on the sequence: for a sequence of events to match a B<Double>
- or B<Triple> pattern, all of the events must occur close together
- in time and without substantial mouse motion in between.
- For example, B<E<lt>Double-Button-1E<gt>>
- is equivalent to B<E<lt>Button-1E<gt>E<lt>Button-1E<gt>> with the extra
- time and space requirement.
-
- =head1 EVENT TYPES
-
- The I<type> field may be any of the standard X event types, with a
- few extra abbreviations. Below is a list of all the valid types;
- where two names appear together, they are synonyms.
-
- ButtonPress, Button Expose Map
- ButtonRelease FocusIn Motion
- Circulate FocusOut Property
- Colormap Gravity Reparent
- Configure KeyPress, Key Unmap
- Destroy KeyRelease Visibility
- Enter Leave Activate
- Deactivate
-
- The last part of a long event specification is I<detail>. In the
- case of a B<ButtonPress> or B<ButtonRelease> event, it is the
- number of a button (1-5). If a button number is given, then only an
- event on that particular button will match; if no button number is
- given, then an event on any button will match. Note: giving a
- specific button number is different than specifying a button modifier;
- in the first case, it refers to a button being pressed or released,
- while in the second it refers to some other button that is already
- depressed when the matching event occurs. If a button
- number is given then I<type> may be omitted: if will default
- to B<ButtonPress>. For example, the specifier B<E<lt>1E<gt>>
- is equivalent to B<E<lt>ButtonPress-1E<gt>>.
-
- If the event type is B<KeyPress> or B<KeyRelease>, then
- I<detail> may be specified in the form of an X keysym. Keysyms
- are textual specifications for particular keys on the keyboard;
- they include all the alphanumeric ASCII characters (e.g. ``a'' is
- the keysym for the ASCII character ``a''), plus descriptions for
- non-alphanumeric characters (``comma'' is the keysym for the comma
- character), plus descriptions for all the non-ASCII keys on the
- keyboard (``Shift_L'' is the keysm for the left shift key, and
- ``F1'' is the keysym for the F1 function key, if it exists). The
- complete list of keysyms is not presented here; it is
- available in other X documentation and may vary from system to
- system.
- If necessary, you can use the B<'K'> notation described below
- to print out the keysym name for a particular key.
- If a keysym I<detail> is given, then the
- I<type> field may be omitted; it will default to B<KeyPress>.
- For example, B<E<lt>Control-commaE<gt>> is equivalent to
- B<E<lt>Control-KeyPress-commaE<gt>>.
-
- =head1 BINDING CALLBACKS AND SUBSTITUTIONS
-
- The I<callback> argument to B<bind> is a perl/Tk callback.
- which will be executed whenever the given event sequence occurs.
- (See L<Tk::callbacks> for description of the possible forms.)
- I<Callback> will be associated with the same B<MainWindow>
- that is associated with the I<$widget> that was used to invoke
- the B<bind> method, and it will run as though called from B<MainLoop>.
- If I<callback> contains
- any B<Ev>(I<%>) calls, then each "nested" B<Ev>(I<%>)
- "callback" will be evaluated when the event occurs to form arguments
- to be passed to the main I<callback>.
- The replacement
- depends on the character I<%>, as defined in the
- list below. Unless otherwise indicated, the
- replacement string is the numeric (decimal) value of the given field from
- the current event. Perl/Tk has enhanced this mechanism slightly compared
- to the comparable Tcl/Tk mechanism. The enhancements are not yet all
- reflected in the list below.
- Some of the substitutions are only valid for
- certain types of events; if they are used for other types of events
- the value substituted is undefined (not the same as B<undef>!).
-
- =over 4
-
- =item B<'#'>
-
- The number of the last client request processed by the server
- (the I<serial> field from the event). Valid for all event
- types.
-
- =item B<'a'>
-
- The I<above> field from the event,
- formatted as a hexadecimal number.
- Valid only for B<Configure> events.
-
- =item B<'b'>
-
- The number of the button that was pressed or released. Valid only
- for B<ButtonPress> and B<ButtonRelease> events.
-
- =item B<'c'>
-
- The I<count> field from the event. Valid only for B<Expose> events.
-
- =item B<'d'>
-
- The I<detail> field from the event. The B<'d'> is replaced by
- a string identifying the detail. For B<Enter>,
- B<Leave>, B<FocusIn>, and B<FocusOut> events,
- the string will be one of the following:
-
- =over 8
-
- NotifyAncestor NotifyNonlinearVirtual
- NotifyDetailNone NotifyPointer
- NotifyInferior NotifyPointerRoot
- NotifyNonlinear NotifyVirtual
-
- For events other than these, the substituted string is undefined.
- (Note that this is I<not> the same as Detail part of sequence
- use to specify the event.)
-
- =back
-
- =item B<'f'>
-
- The I<focus> field from the event (B<0> or B<1>). Valid only
- for B<Enter> and B<Leave> events.
-
- =item B<'h'>
-
- The I<height> field from the event. Valid only for B<Configure>,
- B<Expose>, and B<GraphicsExpose> events.
-
- =item B<'k'>
-
- The I<keycode> field from the event. Valid only for B<KeyPress>
- and B<KeyRelease> events.
-
- =item B<'m'>
-
- The I<mode> field from the event. The substituted string is one of
- B<NotifyNormal>, B<NotifyGrab>, B<NotifyUngrab>, or
- B<NotifyWhileGrabbed>. Valid only for B<EnterWindow>,
- B<FocusIn>, B<FocusOut>, and B<LeaveWindow> events.
-
- =item B<'o'>
-
- The I<override_redirect> field from the event. Valid only for
- B<Map>, B<Reparent>, and B<Configure> events.
-
- =item B<'p'>
-
- The I<place> field from the event, substituted as one of the
- strings B<PlaceOnTop> or B<PlaceOnBottom>. Valid only
- for B<Circulate> events.
-
- =item B<'s'>
-
- The I<state> field from the event. For B<ButtonPress>,
- B<ButtonRelease>, B<Enter>, B<KeyPress>, B<KeyRelease>,
- B<Leave>, and B<Motion> events, a decimal string
- is substituted. For B<Visibility>, one of the strings
- B<VisibilityUnobscured>, B<VisibilityPartiallyObscured>,
- and B<VisibilityFullyObscured> is substituted.
-
- =item B<'t'>
-
- The I<time> field from the event. Valid only for events that
- contain a I<time> field.
-
- =item B<'w'>
-
- The I<width> field from the event. Valid only for
- B<Configure>, B<Expose>, and B<GraphicsExpose> events.
-
- =item B<'x'>
-
- The I<x> field from the event. Valid only for events containing
- an I<x> field.
-
- =item B<'y'>
-
- The I<y> field from the event. Valid only for events containing
- a I<y> field.
-
- =item B<'@'>
-
- The string "@I<x,y>" where I<x> and I<y> are as above.
- Valid only for events containing I<x> and I<y> fields.
- This format is used my methods of B<Tk::Text> and similar widgets.
-
- =item B<'A'>
-
- Substitutes the ASCII character corresponding to the event, or
- the empty string if the event doesn't correspond to an ASCII character
- (e.g. the shift key was pressed). B<XLookupString> does all the
- work of translating from the event to an ASCII character.
- Valid only for B<KeyPress> and B<KeyRelease> events.
-
- =item B<'B'>
-
- The I<border_width> field from the event. Valid only for
- B<Configure> events.
-
- =item B<'E'>
-
- The I<send_event> field from the event. Valid for all event types.
-
- =item B<'K'>
-
- The keysym corresponding to the event, substituted as a textual
- string. Valid only for B<KeyPress> and B<KeyRelease> events.
-
- =item B<'N'>
-
- The keysym corresponding to the event, substituted as
- a decimal
- number. Valid only for B<KeyPress> and B<KeyRelease> events.
-
- =item B<'R'>
-
- The I<root> window identifier from the event. Valid only for
- events containing a I<root> field.
-
- =item B<'S'>
-
- The I<subwindow> window identifier from the event,
- as an object if it is one otherwise as a hexadecimal number.
- Valid only for events containing a I<subwindow> field.
-
- =item B<'T'>
-
- The I<type> field from the event. Valid for all event types.
-
- =item B<'W'>
-
- The window to which the event was reported (the
- $widget field from the event) - as an perl/Tk object.
- Valid for all event types.
-
- =item B<'X'>
-
- The I<x_root> field from the event.
- If a virtual-root window manager is being used then the substituted
- value is the corresponding x-coordinate in the virtual root.
- Valid only for
- B<ButtonPress>, B<ButtonRelease>, B<KeyPress>, B<KeyRelease>,
- and B<Motion> events.
-
- =item B<'Y'>
-
- The I<y_root> field from the event.
- If a virtual-root window manager is being used then the substituted
- value is the corresponding y-coordinate in the virtual root.
- Valid only for
- B<ButtonPress>, B<ButtonRelease>, B<KeyPress>, B<KeyRelease>,
- and B<Motion> events.
-
- =back
-
- =head1 MULTIPLE MATCHES
-
- It is possible for several bindings to match a given X event.
- If the bindings are associated with different I<tag>'s,
- then each of the bindings will be executed, in order.
- By default, a class binding will be executed first, followed
- by a binding for the widget, a binding for its toplevel, and
- an B<all> binding.
- The B<bindtags> method may be used to change this order for
- a particular window or to associate additional binding tags with
- the window.
-
- B<return> and B<Tk-E<gt>break> may be used inside a
- callback to control the processing of matching callbacks.
- If B<return> is invoked, then the current callback
- is terminated but Tk will continue processing callbacks
- associated with other I<tag>'s.
- If B<Tk-E<gt>break> is invoked within a callback,
- then that callback terminates and no other callbacks will be invoked
- for the event.
- (B<Tk-E<gt>break> is implemented via perl's B<die> with a special value
- which is "caught" by the perl/Tk "glue" code.)
-
- If more than one binding matches a particular event and they
- have the same I<tag>, then the most specific binding
- is chosen and its callback is evaluated.
- The following tests are applied, in order, to determine which of
- several matching sequences is more specific:
- (a) an event pattern that specifies a specific button or key is more specific
- than one that doesn't;
- (b) a longer sequence (in terms of number
- of events matched) is more specific than a shorter sequence;
- (c) if the modifiers specified in one pattern are a subset of the
- modifiers in another pattern, then the pattern with more modifiers
- is more specific.
- (d) a virtual event whose physical pattern matches the sequence is less
- specific than the same physical pattern that is not associated with a
- virtual event.
- (e) given a sequence that matches two or more virtual events, one
- of the virtual events will be chosen, but the order is undefined.
-
- If the matching sequences contain more than one event, then tests
- (c)-(e) are applied in order from the most recent event to the least recent
- event in the sequences. If these tests fail to determine a winner, then the
- most recently registered sequence is the winner.
-
- If there are two (or more) virtual events that are both triggered by the
- same sequence, and both of those virtual events are bound to the same window
- tag, then only one of the virtual events will be triggered, and it will
- be picked at random:
-
- $widget->eventAdd('<<Paste>>' => '<Control-y>');
- $widget->eventAdd('<<Paste>>' => '<Button-2>');
- $widget->eventAdd <<Scroll>>' => '<Button-2>');
- $widget->bind('Tk::Entry','<<Paste>>',sub { print 'Paste'});
- $widget->bind('Tk::Entry','<<Scroll>>', sub {print 'Scroll'});
-
- If the user types Control-y, the B<E<lt>E<lt>PasteE<gt>E<gt>> binding
- will be invoked, but if the user presses button 2 then one of
- either the B<E<lt>E<lt>PasteE<gt>E<gt>> or the B<E<lt>E<lt>ScrollE<gt>E<gt>> bindings will
- be invoked, but exactly which one gets invoked is undefined.
-
- If an X event does not match any of the existing bindings, then the
- event is ignored.
- An unbound event is not considered to be an error.
-
- =head1 MULTI-EVENT SEQUENCES AND IGNORED EVENTS
-
- When a I<sequence> specified in a B<bind> method contains
- more than one event pattern, then its callback is executed whenever
- the recent events (leading up to and including the current event)
- match the given sequence. This means, for example, that if button 1 is
- clicked repeatedly the sequence B<E<lt>Double-ButtonPress-1E<gt>> will match
- each button press but the first.
- If extraneous events that would prevent a match occur in the middle
- of an event sequence then the extraneous events are
- ignored unless they are B<KeyPress> or B<ButtonPress> events.
- For example, B<E<lt>Double-ButtonPress-1E<gt>> will match a sequence of
- presses of button 1, even though there will be B<ButtonRelease>
- events (and possibly B<Motion> events) between the
- B<ButtonPress> events.
- Furthermore, a B<KeyPress> event may be preceded by any number
- of other B<KeyPress> events for modifier keys without the
- modifier keys preventing a match.
- For example, the event sequence B<aB> will match a press of the
- B<a> key, a release of the B<a> key, a press of the B<Shift>
- key, and a press of the B<b> key: the press of B<Shift> is
- ignored because it is a modifier key.
- Finally, if several B<Motion> events occur in a row, only
- the last one is used for purposes of matching binding sequences.
-
- =head1 ERRORS
-
- If an error occurs in executing the callback for a binding then the
- B<Tk::Error> mechanism is used to report the error.
- The B<Tk::Error> mechanism will be executed at same call level,
- and associated with the same B<MainWindow> as
- as the callback was invoked.
-
- =head1 CAVEATS
-
- Note that for the B<Canvas> widget, the call to B<bind> has to be
- fully qualified. This is because there is already a bind method for
- the B<Canvas> widget, which binds individual canvas tags.
-
- S< >I<$canvas>-E<gt>B<Tk::bind>
-
- =head1 SEE ALSO
-
- L<Tk::Error|Tk::Error>
- L<Tk::callbacks|Tk::callbacks>
- L<Tk::bindtags|Tk::bindtags>
-
- =head1 KEYWORDS
-
- Event, binding
-
- =cut
-
-