package Tk::Doubleclick; require Exporter; our @ISA = qw(Exporter); our @EXPORT = qw(bindClicks); sub bindClicks { my %arg = @_; my $btn = delete $arg{-widget}; my $delay = delete $arg{-delay} || 300; my $args1 = delete $arg{-single}; my $args2 = delete $arg{-double}; my $clicked = delete $arg{-button} || 'left'; my %btnTable = ( left => 1, center => 2, right => 3 ); my $mousenum = $btnTable{$clicked} || $clicked; $mousenum = 1 unless ($mousenum =~ /^[123]$/); my $single = $args1; if (ref $args1 eq 'ARRAY'){ $single = shift @$args1; }else{ $args1 = []; } my $double = $args2; if (ref $args2 eq 'ARRAY'){ $double = shift @$args2; }else{ $args2 = []; } my $nclicks = 0; my $c_cmd = sub { ++$nclicks; $btn->after($delay => sub { my $count = $nclicks; $nclicks = 0; if ($count > 1) { $double->(@$args2); } elsif ($count == 1) { $single->(@$args1); } }); }; my $button_name = ""; $btn->bind($button_name => $c_cmd); } 1; =head1 NAME Tk::Doubleclick - Correct handling of single vs double click callback bindings =head1 SYNOPSIS use Tk::Doubleclick; bindClicks( -delay => 500, -widget => $button_widget, -button => 'left', -single => [ \&callback, @args ], # with arguments -double => \&callback, # without arguments ); =head1 OPTIONS =over 5 =item -delay Maximum delay time detween clicks in milliseconds. Default = 300. =item -widget Widget to bind to mousebuttons. =item -button Mouse button to bind. Options are left, center, right, 1, 2, 3. Default = left. =item -single Single click callback. To include arguments, use array reference. =item -double Double click callback. To include arguments, use array reference. =back =cut