The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

NAME

Tcl::pTk::XEvent - Limited Support for perl/tk's XEvent in Tcl::pTk

SYNOPSIS

       # Create binding on a widget, using XEvent to get
       #   the mouse x/y position
       $widget->bind(
               '<Motion>',
               sub {
                          
                        my $e = $widget->XEvent;
                        
                        # Get mouse x/y position in the widget
                        my $mouseX = $e->x;
                        my $mouseY = $e->y;

                        print "mouse X/Y = $mouseX/$mouseY\n";
               }
               );

DESCRIPTION

Tcl::pTk::XEvent provides (very) limited support for perl/tk's XEvent mechanism in Tcl::pTk. Currently it only provides support for the x and y calls. Other calls will generate an error message.

For XEvent calls other than x and y, bindings should be converted to use the equivalent Ev() calling as shown below.

Perl/Tk's XEvent Mechanism

Perl/Tk (Tk) provides an additional method (The XEvent mechanism) to get event information during event processing. This was added to perl/tk by adding c-code functions (Tk_EventInfo in tkbind.c and others) to the original Tcl/Tk c-code.

Although the XEvent mechanism is not described in the documents included in the perl/tk package, it is used in many places in the perl/tk code, and in other external perl/tk widgets. The alternative to XEvent is the Ev mechanism, which is documented in the Tk::bind docs (Binding Callbacks and Substitution section).

Example of XEvent and an Ev Equivalent

Example of XEvent

       # Create binding on a widget, using XEvent to get
       #   the mouse x/y position
       $widget->bind(
               '<Motion>',
               sub {
                        my $w = shift;  # Get the event widget
                        my $e = $w->XEvent;
                        
                        # Get mouse x/y position in the widget
                        my $mouseX = $e->x;
                        my $mouseY = $e->y;

                        print "mouse X/Y = $mouseX/$mouseY\n";
               }
               );

Equivalent Example using Ev() calls

This is how a XEvent call should be converted to using the Ev() calls, which are fully supported in Tcl/Tk.

# Create binding on a widget, using Ev calls to get
#   the mouse x/y position
$widget->bind(
        '<Motion>',
        [ sub {
                 my $w = shift;  # Get the event widget
                 my ($x, $y) = @_; # Get x/y passed in from the Ev() calls
                 
                 # Get mouse x/y position in the widget
                 my $mouseX = $x;
                 my $mouseY = $y;

                 print "mouse X/Y = $mouseX/$mouseY\n";
        }, 
           Ev('x'), Ev('y') ]
        
);