Gtk2: making a popup window on mouse click



What I want to do is to have a the program run in a system tray. when the user left clicks the system tray icon the window ('popup') is set to show. Also, when the user left clicks on the system tray the window is hidden again. How can I get this to work? I have a small snippet of code that I a have started with: (Note: this is only simplified version of code used to help out the question, I'm not sure if this code works)
#!/usr/bin/perl -w
use strict;
use warnings;
use threads;
use threads::shared;
use Glib qw/TRUE FALSE/;
use Gtk2 '-init';
use Gtk2::TrayIcon;
use Net::SFTP::Foreign;

#user variables
my $icon_main = Gtk2::Gdk::Pixbuf->new_from_file("/home/deadpickle/Desktop/Gtk2/test.png");
my $icon_nav = Gtk2::Gdk::Pixbuf->new_from_file("/home/deadpickle/Desktop/Gtk2/uvnav.png");
my $icon_vci = Gtk2::Gdk::Pixbuf->new_from_file("/home/deadpickle/Desktop/Gtk2/vci.png");
my $time = 1200000;

#global variables
my $user : shared = 'uas';
my $server : shared = 'updraft.unl.edu';
my $local_waypoint : shared = '/local';
my $remote_waypoint : shared = '/remote';
my $waytemp : shared = 'waytemp';
my $wayfinal : shared = 'wayfinal';
my $file = 'default.cfg';
my $local_uaspos : shared = '/local';
my $remote_uaspos : shared = '/remote';
my $local_uas : shared = '/local';
my $remote_uas : shared = '/remote';
my $die : shared = 0;
my $sftp_connect : shared = 0;
my $current_controls = 0;

#icon goes in box, box goes in tray
my $icon = Gtk2::Image->new_from_pixbuf($icon_main);
my $eventbox = Gtk2::EventBox->new;
$eventbox->add($icon);
my $tray = Gtk2::TrayIcon->new('Test');
$tray->add($eventbox);

#threads
my $thread_1 = threads->new( \&sftp);

#tooltip
my $tooltip = Gtk2::Tooltips->new;
$tooltip->set_tip($tray, "GRRUVI v1.0");

#events and timeouts
$eventbox->signal_connect('button_release_event', \&click);

#show tray
$tray->show_all;

#end event loop
Gtk2->main;


#handles tray clicks
sub click {

    #left mouse button
    if ($_[1]->button == 1) {
       
        #Window show/hide controls
  
    }
   
    #right mouse button
    elsif ($_[1]->button == 3) {
        &menu;
    }
    return 1;
}


#right click menu
sub menu {
    my $menu = Gtk2::Menu->new();

    #VCI
    my $menu_VCI = Gtk2::ImageMenuItem->new_with_label("VCI");
    $menu_VCI->set_image(Gtk2::Image->new_from_stock('gtk-refresh', 'menu'));
    $menu->add($menu_VCI);

    #configure
    my $menu_pref = Gtk2::ImageMenuItem->new_with_label("Configure");
    $menu_pref->set_image(Gtk2::Image->new_from_stock('gtk-preferences', 'menu'));
    $menu->add($menu_pref);

    #separator
    my $menu_sep = Gtk2::SeparatorMenuItem->new();
    $menu->add($menu_sep);

    #Quit
    my $menu_quit = Gtk2::ImageMenuItem->new_with_label("Quit");
    $menu_quit->signal_connect(activate => \&exit_threads);
    $menu_quit->set_image(Gtk2::Image->new_from_stock('gtk-quit', 'menu'));
    $menu->add($menu_quit);
     
    $menu->show_all;

    #popup menu, the three is for right mouse button
    $menu->popup(undef,undef,undef,3,undef,undef);

    return 1;
}

#Program interfaces
sub interface {
    my $interface = Gtk2::Window->new('popup');
    $interface->set_position('center');
   
    #Eventbox for capturing the mouse click
    my $eventbox_interface = Gtk2::EventBox->new;
   
    #table to contain the widgets
    my $table_interface = Gtk2::Table->new( 8, 2, FALSE);
   
    #menu items for VCI
    if ( $current_controls == 1) {
       
        #Labels
        my $label_vci_downloading = Gtk2::Label->new( 'Downloading');
        my $label_vci_uploading = Gtk2::Label->new( 'Uploading');
       
        #Bold text for the Main Labels
        my $fontdescription = Gtk2::Pango::FontDescription->new;
        $fontdescription->set_weight( 'bold');
        $label_vci_uploading->modify_font( $fontdescription);
        $label_vci_downloading->modify_font( $fontdescription);
       
        #labels for the progressbars
        my $label_vci_uasposition = Gtk2::Label->new( 'uasposition');
        my $label_vci_waytemp1 = Gtk2::Label->new( 'waytemp');
        my $label_vci_waytemp2 = Gtk2::Label->new( 'waytemp');
        my $label_vci_wayfinal = Gtk2::Label->new( 'wayfinal');
       
        #Horizontal Separator
        my $hseparator_vci = Gtk2::HSeparator->new;
       
        #Connect button-> will switch to stop after press
        my $menu_vci_connect = Gtk2::Button->new("Connect");
       
        #Attach the widgets to the table
        $table_interface->attach_defaults( $label_vci_uploading, 0, 2, 0, 1);
        $table_interface->attach_defaults( $label_vci_uasposition, 0, 1, 1, 2);
        $table_interface->attach_defaults( $label_vci_waytemp1, 0, 1, 2, 3);
        $table_interface->attach_defaults( $label_vci_wayfinal, 0, 1, 3, 4);
        $table_interface->attach_defaults( $label_vci_downloading, 0, 2, 4, 5);
        $table_interface->attach_defaults( $label_vci_waytemp2, 0, 1, 5, 6);
        $table_interface->attach_defaults( $hseparator_vci, 0, 2, 6, 7);
        $table_interface->attach_defaults( $menu_vci_connect, 1, 2, 7, 8);
    }
   
    #add the widgets to the window: widgets->table->eventbox->window
    $eventbox_interface->add( $table_interface);
    $interface->add( $eventbox_interface);

    $interface->show_all;
   
    $interface->signal_connect( 'button-release-event' => sub { $interface->hide_all});
}

--
Jamie Lahowetz

[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]