________________________________________ >From: gtk-perl-list-boun...@gnome.org [mailto:gtk-perl-list-boun...@gnome.org] >On Behalf Of MICHAEL MCGINN >Sent: Monday, October 26, 2009 8:32 PM >To: gtk-perl-list@gnome.org >Subject: Multiple menu popups with a single Gtk2::SimpleList > >Hi, > >I'm trying to display a popup menu in a Gtk2::SimpleList which can have >different menu choices depending on the data in the Gtk2::SimpleList. > >The menu popup choices are driven by the value selected from a Gtk2::ComboBox. >There is a signal on the combobox that runs the popup sub below when the value >changes. > >The first time the popup menu is invoked it displays correctly; displaying the >appropriate popup menu. The next time I select a different value from the >Gtk2::ComboBox and right click it a row in the Gtk2::SimpleList, it continues >to show the old popup in addition to the new one. > >It's seems the Gtk2::SimpleList won't let go of menus you associate. > >Here is a sample code snippet of what's not working. >sub popup { > >my $menu; > >if ($type eq 'type1') { > $menu = Gtk2::Menu->new(); > my $menu_item = Gtk2::MenuItem->('Properties'); > $menu_item->signal_connect(activate => sub { > # do something > }); > > $menu->append($menu_item); > >} elsif ($type eq 'type2') { > $menu = Gtk2::Menu->new(); > my $menu_item = Gtk2::MenuItem->('View'); > $menu_item->signal_connect(activate => sub { > # do something else > }); > > $menu->append($menu_item); >} > >$simple_list =>signal_connect('button-press-event' => sub { > my ($widget, $event) = @_; > return FALSE unless $event->button eq 3; > > $menu->popup ( > undef, > undef, > undef, > undef, > $event->button, > $event->time); >} > >$menu->show_all; > >}
Correct, every time you call signal_connect, you are adding another callback to be executed when the event happens. You could try creating two menus, the decide which one to show in the callback. my $menu1 = ... my $menu2 = ... $simple_list =>signal_connect('button-press-event' => sub { my ($widget, $event) = @_; return FALSE unless $event->button eq 3; if ( some condition ... ) { $menu1->popup ( undef, undef, undef, undef, $event->button, $event->time ); } else { $menu2->popup ( undef, undef, undef, undef, $event->button, $event->time ); } } It's also worth noting you can disconnect signals. my $handler_id = $simple_list =>signal_connect('button-press-event' => sub { ... }); $simple_list->signal_disconnect($handler_id);
_______________________________________________ gtk-perl-list mailing list gtk-perl-list@gnome.org http://mail.gnome.org/mailman/listinfo/gtk-perl-list