in reply to Gtk2: main window visibility

Yes, is_visible....

Replies are listed 'Best First'.
Re^2: Gtk2: main window visibility
by deadpickle (Pilgrim) on Jul 30, 2007 at 03:25 UTC
    I cant seem to figure this out and am wondering if anyone has any ideas. The user should do this: 1) right click the system tray icon and select VCI. 2) Left click the system tray icon. The interface should become visible. 3) Click the "Connect" button. It shouldthen turn to "Stop". 4) Left click the system tray icon and the window will 'hide'. I cant get the program to hide the VCI window and become visible after a left click and be in the same state as it was before. The "Connect" button does not stay as "Stop". Any ideas? The clicked and interface subroutines must be the involved ones.
      I don't know how many times you've posted this code, or a variant, here or on the gtk2/perl maillist. First, if you want people to look at it, simplify it down to it's basics. When I tried your code, first I had to get 3 png images to test with, then I get an error about "no SFTP::Foreign, and finally it dosn't work as you claim. Your step(2) dosn't do anything on my machine, no interface appears. Finally your balloon pop ups just get in the way and are annoying.

      So please, reduce this to a minimal script, which uses pre-defined icons instead of the pngs, get rid of the annoying balloons, and the sftp stuff. Show us a script that simply concentrates on the problem you describe, i.e. popping up a window when clicking on a trayicon.

      I will be willing to bet, that in the process of simplifying this down to it's basics, you will find the glitch. But as it stands now, your script presents too many extraneous hurdles for us to casually spot your error.

      But just as a quick push in the right direction, you need to bind the interface sub to a left click.

      #events and timeouts $eventbox->signal_connect('button_release_event', \&click); # add a left click binding $eventbox->signal_connect('button_press_event', \&click); #handles tray clicks sub click { #left mouse button if ($_[1]->button == 1) { #Window show/hide controls if ( $current_controls != 0) { #&interface; if ( $visible == 0) { $visible = 1 } if ( $visible == 1) { $visible = 0 } } ################################ # call the interface window if a left click is done &interface; ############################## } #right mouse button elsif ($_[1]->button == 3) { &menu; } return 1; }

      I'm not really a human, but I play one on earth. Cogito ergo sum a bum
        Ok, here is a simplified version of the program. All it has is a right click menu and a left click interface. The procedure is still the same you have to select VCI from the menu first. The window shows but I cant get it to hide when the user left clicks the system tray. I tried to print the $visible variable and it does not seem to change from 0.
        #!/usr/bin/perl -w use strict; use warnings; use Glib qw/TRUE FALSE/; use Gtk2 '-init'; use Gtk2::TrayIcon; #global variables my $current_controls = 0; my $visible = 0; #icon goes in box, box goes in tray my $icon = Gtk2::Image->new_from_stock( 'gtk-open', 'menu'); my $eventbox = Gtk2::EventBox->new; $eventbox->add($icon); my $tray = Gtk2::TrayIcon->new('Test'); $tray->add($eventbox); #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 if ( $current_controls != 0) { if ( $visible == 0) { $visible = 1 } if ( $visible == 1) { $visible = 0 } &interface; } } #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->signal_connect(activate => sub { $current_controls = 1} +); $menu_VCI->set_image(Gtk2::Image->new_from_stock('gtk-refresh', 'm +enu')); $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 => sub { Gtk2->main_quit}); $menu_quit->set_image(Gtk2::Image->new_from_stock('gtk-quit', 'men +u')); $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); #button function $menu_vci_connect->signal_connect( 'button-press-event' => sub + { my $button_vci_label = $menu_vci_connect->get_label; if ( $button_v +ci_label eq 'Connect') { $menu_vci_ +connect->set_label( 'Stop'); } else { $menu_vci_ +connect->set_label( 'Connect'); } }); } #add the widgets to the window: widgets->table->eventbox->window $eventbox_interface->add( $table_interface); $interface->add( $eventbox_interface); $interface->show_all; # if ( $visible == 0) { # $interface->hide_all; # } # else { # $interface->show_all # } }