From f3822f968821c0648d280a9d3e28ee2986bdf767 Mon Sep 17 00:00:00 2001 From: Aaron Peromsik Date: Fri, 10 Jan 2014 09:55:50 -0500 Subject: [PATCH 1/2] fix issue 13 as in its comments --- msjnc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/msjnc b/msjnc index d3beb77..a17c1aa 100755 --- a/msjnc +++ b/msjnc @@ -696,7 +696,7 @@ sub _getpid { # This appears to be the most portable option. # Kind of gross that we may have to run ps(1) on every update, but... local $_ = `ps $arg -o pid= -o comm=`; - return m,^\s*(\d+)\s(?:.*/)?ncsvc$, ? $1 : 0; + return m,^\s*(\d+)\s(?:.*/)?ncsvc$,m ? $1 : 0; } sub update { From 76977949cff650944a734c08037da28cb646b7d3 Mon Sep 17 00:00:00 2001 From: Aaron Peromsik Date: Sun, 12 Jan 2014 16:04:51 -0500 Subject: [PATCH 2/2] A basic Unity indicator for msjnc. Starts with window hidden. Indicator Status command unhides it. WM close action on status window just hides it again, leaves indicator running. Indicator menu commands also allow Connect or Disconnect. Icon changes on connect/disconnect. For some reason this only works when --fg is used. Requires Gtk2::AppIndicator from the "libgtk2-appindicator-perl" package. --- msjnc | 62 ++++++++++++++++++++++++++++++++++++++++++----- nc-grey-disc.png | Bin 0 -> 490 bytes nc-grey.png | Bin 0 -> 327 bytes 3 files changed, 56 insertions(+), 6 deletions(-) create mode 100644 nc-grey-disc.png create mode 100644 nc-grey.png diff --git a/msjnc b/msjnc index a17c1aa..25780eb 100755 --- a/msjnc +++ b/msjnc @@ -51,12 +51,14 @@ use File::Temp qw(tempdir); use POSIX qw(_exit setsid strftime); use Net::Ping; use LWP::Simple; +use Cwd 'abs_path'; # Get graphics use Glib; -use Gtk2; +use Gtk2 -init; use Gtk2::SimpleMenu; use Gtk2::Pango; +use Gtk2::AppIndicator; # For debug use Data::Dumper; @@ -85,6 +87,7 @@ my $WIN; my $TRAY; my %OBJ; my $CONN; +my $INDIC; my $DESKTOP = '[Desktop Entry] Name=Network Connect @@ -1037,11 +1040,21 @@ sub window_update { $CONN->set_image($OBJ{disconnect}); $OBJ{disconnect}->show(); $CONN->set_sensitive(1); + if (defined $INDIC) { + $INDIC->set_icon_name_active($OBJ{indic_connect_icon}); + $OBJ{indic_connect_btn}->hide(); + $OBJ{indic_disconnect_btn}->show(); + } } else { $CONN->set_label('Connect'); $CONN->set_image($OBJ{connect}); $OBJ{connect}->show(); $CONN->set_sensitive(1); + if (defined $INDIC) { + $INDIC->set_icon_name_active($OBJ{indic_disconnect_icon}); + $OBJ{indic_disconnect_btn}->hide(); + $OBJ{indic_connect_btn}->show(); + } } } @@ -1653,6 +1666,42 @@ sub window_manage { return window_edit($pfn); } +sub indicator_create { + my $indic_disconnect_icon = abs_path $0; + my $indic_connect_icon = $indic_disconnect_icon; + $indic_disconnect_icon =~ s/\/msjnc$/\/nc-grey-disc.png/; + $indic_connect_icon =~ s/\/msjnc$/\/nc-grey.png/; + $OBJ{indic_disconnect_icon} = $indic_disconnect_icon; + $OBJ{indic_connect_icon} = $indic_connect_icon; + + $INDIC = Gtk2::AppIndicator->new("MSJNC",$indic_disconnect_icon,'communications'); + my $menu=Gtk2::Menu->new(); + my $status=Gtk2::MenuItem->new_with_mnemonic("_Status"); + $OBJ{indic_connect_btn} = Gtk2::MenuItem->new_with_mnemonic("_Connect"); + $OBJ{indic_disconnect_btn} = Gtk2::MenuItem->new_with_mnemonic("_Disconnect"); + my $quit=Gtk2::MenuItem->new_with_mnemonic("_Quit"); + $quit->signal_connect("activate",sub { window_delete() or Gtk2->main_quit(); } ); + $status->signal_connect("activate",sub { $WIN->show(); } ); + $OBJ{indic_connect_btn}->signal_connect("activate",sub { window_dis_connect(); }); + $OBJ{indic_disconnect_btn}->signal_connect("activate",sub { window_dis_connect(); }); + $menu->append($OBJ{indic_connect_btn}); + $menu->append($OBJ{indic_disconnect_btn}); + $menu->append($status); + $menu->append($quit); + $menu->show_all(); + $INDIC->set_menu($menu); + $INDIC->set_active(1); + $WIN->hide(); +} + +sub window_wm_close_event { + if (defined $INDIC) { + $WIN->hide(); + return 1; + } + return window_delete(); +} + sub window_create { my $window = Gtk2::Window->new('toplevel'); $window->set_border_width(10); @@ -1660,7 +1709,7 @@ sub window_create { $window->set_default_icon_from_file($JNCICON); # Handle WM delete events - $window->signal_connect(delete_event => \&window_delete); + $window->signal_connect(delete_event => \&window_wm_close_event); $window->signal_connect(destroy => sub { Gtk2->main_quit(); }); # Create a vbox to hold the window content @@ -1785,10 +1834,14 @@ sub window_create { $tray->set_tooltip("MS-JNC"); $tray->signal_connect('activate', \&tray_icon_event); $TRAY = $tray; - $window->show_all(); $WIN = $window; + if (! $tray->is_embedded) { + # system tray not supported; try Unity app indicator + indicator_create(); + } + return $window; } @@ -2121,9 +2174,6 @@ if ($OPTS{connect}) { die "The Juniper Network Connect VPN session did not start.\n"; } -# If we get here we're going to start a graphical session so init GTK -# Do this before forking, so DISPLAY errors are caught early. -Gtk2->init(); # If we want to run in the background, do that now if (! $OPTS{fg}) { diff --git a/nc-grey-disc.png b/nc-grey-disc.png new file mode 100644 index 0000000000000000000000000000000000000000..3ddc86e529f6daf203ea8505a79cd6ccb1883671 GIT binary patch literal 490 zcmVkdg00002VoOIv0RM-N z%)bBt010qNS#tmY3ljhU3ljkVnw%H_000McNliru-T@30HWz}nUg-b;0eeYAK~zY` z-IUKu0#OjhKT5Q9sKf4IE3k7EbcrrryLRzfhluE3*w>$+`%iT1D*Xph&@aLukU$cY zpon^sMWQ6U4sPz#T;0_};4BL>4D)?6^PL$OQDVU^q3N0E$O47*KG6XdI@||nf%KM% z-r;GWf$Q0h_h-Ta090_b04Fflcu;s)iH}O-{{#GKqEP;Di5{bs8O(wc(0K>i#15d* zjKGAp3(_FPRQ52nOOs>wv+I4EHBWuBt~G#t^{X0eu)rjXmpmZMrv?TUz-;BR#2)i- zzFp!@FCpEPk_4L)z!yfR%U}+YB-zpdt~4XTY+FAFXzeSKst%B)y9DcnCZwrg(g3dz zpvEH2LIU{U zBEn4+%5Uj9GeC_TMgKa+La&KTovEUd>O{$%A-D0Fcc6@xKqP>Cjw)~uH$wqf1xX!{ gSoN_!X=4EJ13!Is%@%_)&;S4c07*qoM6N<$g2NHfRsaA1 literal 0 HcmV?d00001 diff --git a/nc-grey.png b/nc-grey.png new file mode 100644 index 0000000000000000000000000000000000000000..6e64b682764b19a79a4bb334caf7d44ccd1af812 GIT binary patch literal 327 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UOiAAEE)4(M`_JqL@;D1TB8wRq zxP?KOkzv*x37{Z*iKnkC`#nY;5kZlIReQ~VLN`2J978;gzYRIb+iV~pqwM|X>lgmvWOG;Wqy8VBuVH@vjxJh|Y;ZB*{ zgPV>EAK+0ckE*=GJVRjG_q=_cLP@54f{L2U{hmf;KHeERck9Q`4BtX)c9iz@O%#fG zabwqCxlcJcTyp}73L4M#Fm6e5d9HG;gJG7e_`Q5vX59|$KdcWPgklD7O zgH3n?M`ZW++xI*yFGzk-JKZ|