http://www.perlmonks.org?node_id=1013999


in reply to Re^3: Tkx g_bind to menu on listbox only for selected row
in thread Tkx g_bind to menu on listbox only for selected row

Thanks for the reply again. I've almost made it work. My problem now is that the y-coordinate returned gets interpreted by nearest() in a way that I don't expect: nearest() seems to expect a y-coordinate relative to the top of the listbox widget, but the y-coordinate given is actually the absolute, screen, coordinate.

Here's my code snippet:

$list->g_bind("<Motion>", [sub { my($x,$y) = @_; my @sel_list = $list->curselection(); my $on_target = 0; my $current_index = $list->nearest($y); print "y = " . $y . "current_index = " . $current_index . "\n"; # +test if (length($sel_list[0]) > 0) { my @sel_list_items = split(/ /,$sel_list[0]); if (scalar(@sel_list_items) > 1) { foreach my $sel_list_item (@sel_list_items) { print "sel_list_item = " . $sel_list_item . "\n"; # te +st if ($sel_list_item eq $current_index) { $on_target = 1; } } } } print "on_target = " . $on_target . "\n"; # test if ($on_target == 1) { $listmenu->g_tk___popup($x,$y) } }, Tkx::Ev("%X", "%Y")]);

I can see that the current_index is always larger than I would expect it to be. Apologies if I am missing something simple!

Replies are listed 'Best First'.
Re^5: Tkx g_bind to menu on listbox only for selected row
by Anonymous Monk on Jan 18, 2013 at 10:03 UTC
    %X and %Y are not %x and %y, you want %y

      Thanks. I am sure you are right, but I need %X and %Y to get the position of the context menu right. How do I go about getting both sets of coordinates bound to the same Motion event?

        $lb->g_bind( "<Enter>", [ sub { my ( $X, $Y, $y, $lb ) = @_; warn " $X,$Y,$y,$lb " }, Tkx::Ev(qw' %X %Y %y '), $lb, ], );