#!/usr/bin/perl use strict; use warnings; use Gtk3 '-init'; use Glib 'TRUE', 'FALSE'; use Data::Dumper; my $window = Gtk3::Window->new( 'toplevel' ); $window->set_default_size( 400, 300 ); $window->set_gravity( 'GDK_GRAVITY_CENTER' ); # ? $window->set_title(' Menu' ); $window->set_border_width( 10 ); $window->signal_connect( destroy => sub { Gtk3->main_quit } ); my $sw = Gtk3::ScrolledWindow->new; $window->add( $sw ); my $treeview = Gtk3::TreeView->new; my $renderer = Gtk3::CellRendererText->new; my $column = Gtk3::TreeViewColumn->new_with_attributes( "items", $renderer, 'text' => 0 ); my $menu = Gtk3::Menu->new(); foreach my $context_action ( 'refresh', 'edit' ) { my $item = Gtk3::MenuItem->new_with_label( $context_action ); $menu->append( $item ); $item->show(); #$item->signal_connect( activate => sub { &$context_action() ; } ); } $treeview->append_column( $column ); $treeview->signal_connect( button_press_event => sub { on_tree_click( @_, $menu ) } ); $sw->add( $treeview ); my $model = Gtk3::ListStore->new( qw/ Glib::String / ); for my $item ( qw/ one two three four five / ) { $model->set( $model->append , 0 , $item ); } $treeview->set_model($model); $window->show_all(); Gtk3->main(); sub on_tree_click { my ( $widget, $event, $menu ) = @_; bless $event, 'Gtk3::Gdk::EventButton'; print "widget:\n" . Dumper( $widget ) . "\nevent:\n" . Dumper( $event ) . "\n"; $menu->popup( undef, undef, undef, undef, $event->button(), $event->time()); } sub refresh { print "refreshing ...\n"; } sub edit { print "editing ...\n"; }