From fc6f5bdbcf87f6b3dbf979e912357e17282fcfea Mon Sep 17 00:00:00 2001 From: AltF4 Date: Sat, 4 Jan 2014 22:00:47 -0700 Subject: [PATCH 1/4] Added Pause option, fixed bug with accumulating event triggers Pause option added. So you can easily toggle whether pings are going out without having to fully kill pinger. Fixed a bug where toggling the autostart option would cumulatively add new event handlers, eventually making the program unresponsive after several toggles. --- pinger.py | 53 ++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 36 insertions(+), 17 deletions(-) diff --git a/pinger.py b/pinger.py index f328834..322fa53 100755 --- a/pinger.py +++ b/pinger.py @@ -50,6 +50,8 @@ import sys # Vars startup_active_label = "✓ Start Automatically" startup_inactive_label = "Start Automatically" +pause_label = "Pause" +play_label = "Resume" home_path = os.path.expanduser("~") startup_path = home_path+'/.config/autostart/pinger.desktop' startup_dir = home_path+'/.config/autostart/' @@ -96,22 +98,24 @@ else: class Pinger: ping_log = [] + paused = False def ping(self, widget=None, data=None): - ping = subprocess.Popen( - ["ping", "-c", "1", host], - stdout = subprocess.PIPE, - stderr = subprocess.PIPE - ) - out, error = ping.communicate() - m = re.search('time=(.*) ms', out) - if error or m == None: - label = "PING FAIL" - self.log_ping(-1) - else: - label = m.group(1)+" ms" - self.log_ping(m.group(1)) - self.ind.set_label (label, "100.0 ms") + if not self.paused: + ping = subprocess.Popen( + ["ping", "-c", "1", host], + stdout = subprocess.PIPE, + stderr = subprocess.PIPE + ) + out, error = ping.communicate() + m = re.search('time=(.*) ms', out) + if error or m == None: + label = "PING FAIL" + self.log_ping(-1) + else: + label = m.group(1)+" ms" + self.log_ping(m.group(1)) + self.ind.set_label (label, "100.0 ms") #self.ping_menu_item.set_label(out) gobject.timeout_add_seconds(self.timeout, self.ping) @@ -150,14 +154,26 @@ class Pinger: def remove_autostart(self, widget, data=None): os.remove(startup_path) self.update_startup_menu() - + print "Removed" + + def toggle_pause(self, widget, data=None): + if self.paused: + self.paused = False + else: + self.paused = True + self.update_pause_menu() + def update_startup_menu(self): if os.path.exists(startup_path): self.startup_menu.set_label(startup_active_label) - self.startup_menu.connect("activate", self.remove_autostart, startup_active_label) else: self.startup_menu.set_label(startup_inactive_label) - self.startup_menu.connect("activate", self.create_autostart, startup_inactive_label) + + def update_pause_menu(self): + if self.paused: + self.pause_menu.set_label(play_label) + else: + self.pause_menu.set_label(pause_label) def update_log_menu(self): graph = "" @@ -192,6 +208,9 @@ class Pinger: # create a menu self.menu = Gtk.Menu() + # with pause option + self.pause_menu = self.create_menu_item(pause_label, self.toggle_pause) + self.update_pause_menu() # with autostart option self.startup_menu = self.create_menu_item(startup_inactive_label, self.create_autostart) self.update_startup_menu() From 2be6c388ad748652a925d21ec56dbd099d3d9af9 Mon Sep 17 00:00:00 2001 From: AltF4 Date: Sat, 4 Jan 2014 22:36:18 -0700 Subject: [PATCH 2/4] Fix autostart toggle bug, consolidated some functions Fixed toggling autostart which was broken last commit. Consolidated some functions which were only called from one place and honestly work more elegantly when merged together. --- pinger.py | 57 +++++++++++++++++++++++++------------------------------ 1 file changed, 26 insertions(+), 31 deletions(-) diff --git a/pinger.py b/pinger.py index 322fa53..dbe2182 100755 --- a/pinger.py +++ b/pinger.py @@ -99,6 +99,7 @@ else: class Pinger: ping_log = [] paused = False + autostart = False def ping(self, widget=None, data=None): if not self.paused: @@ -139,40 +140,30 @@ class Pinger: print "Quitting..." Gtk.main_quit() - def create_autostart(self, widget, data=None): - if not os.path.exists(startup_dir): - os.makedirs(startup_dir) - with open(startup_path,'w') as f: - f.write("[Desktop Entry]\r\n" - "Type=Application\r\n" - "Exec=python "+os.path.abspath( __file__ )+arguments+"\r\n" - "X-GNOME-Autostart-enabled=true\r\n" - "Name=Pinger\r\n" - "Comment=Pings the internet every few seconds") - self.update_startup_menu() - - def remove_autostart(self, widget, data=None): - os.remove(startup_path) - self.update_startup_menu() - print "Removed" + def toggle_autostart(self, widget, data=None): + if not self.autostart: + if not os.path.exists(startup_dir): + os.makedirs(startup_dir) + with open(startup_path,'w') as f: + f.write("[Desktop Entry]\r\n" + "Type=Application\r\n" + "Exec=python "+os.path.abspath( __file__ )+arguments+"\r\n" + "X-GNOME-Autostart-enabled=true\r\n" + "Name=Pinger\r\n" + "Comment=Pings the internet every few seconds") + self.autostart = True + self.startup_menu.set_label(startup_active_label) + else: + os.remove(startup_path) + self.autostart = False + self.startup_menu.set_label(startup_inactive_label) def toggle_pause(self, widget, data=None): if self.paused: self.paused = False - else: - self.paused = True - self.update_pause_menu() - - def update_startup_menu(self): - if os.path.exists(startup_path): - self.startup_menu.set_label(startup_active_label) - else: - self.startup_menu.set_label(startup_inactive_label) - - def update_pause_menu(self): - if self.paused: self.pause_menu.set_label(play_label) else: + self.paused = True self.pause_menu.set_label(pause_label) def update_log_menu(self): @@ -210,10 +201,14 @@ class Pinger: self.menu = Gtk.Menu() # with pause option self.pause_menu = self.create_menu_item(pause_label, self.toggle_pause) - self.update_pause_menu() # with autostart option - self.startup_menu = self.create_menu_item(startup_inactive_label, self.create_autostart) - self.update_startup_menu() + # first, check current autostart state by checking existance of .desktop file + try: + with open(startup_dir): + self.autostart = True + except IOError: + self.autostart = False + self.startup_menu = self.create_menu_item(startup_inactive_label, self.toggle_autostart) # and log display self.log_menu = self.create_menu_item("Ping Log", None) # and exit option From 9df9559c9c47dba19fcc484eb0fbc5b830689433 Mon Sep 17 00:00:00 2001 From: AltF4 Date: Sat, 4 Jan 2014 23:01:06 -0700 Subject: [PATCH 3/4] Made latency labels static size to prevent shifting Latencies displayed in the widget can be of different precisions, causing the widget to redraw when the precision changes. It's a little annoying. This makes latency precision static at 2 decimal places. --- pinger.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pinger.py b/pinger.py index dbe2182..36f3509 100755 --- a/pinger.py +++ b/pinger.py @@ -114,10 +114,10 @@ class Pinger: label = "PING FAIL" self.log_ping(-1) else: - label = m.group(1)+" ms" - self.log_ping(m.group(1)) - self.ind.set_label (label, "100.0 ms") - #self.ping_menu_item.set_label(out) + latency = "%.2f" % float(m.group(1)) + label = latency+" ms" + self.log_ping(latency) + self.ind.set_label(label, "100.0 ms") gobject.timeout_add_seconds(self.timeout, self.ping) def log_ping(self, value): From d29e77dc856f9d1d0dfa70642c20a114ce938520 Mon Sep 17 00:00:00 2001 From: AltF4 Date: Sat, 4 Jan 2014 23:48:22 -0700 Subject: [PATCH 4/4] Fix for mismatched Paused/Resume toggle labels They were set backwards. Fixed. --- pinger.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pinger.py b/pinger.py index 36f3509..6a7ffbd 100755 --- a/pinger.py +++ b/pinger.py @@ -161,10 +161,10 @@ class Pinger: def toggle_pause(self, widget, data=None): if self.paused: self.paused = False - self.pause_menu.set_label(play_label) + self.pause_menu.set_label(pause_label) else: self.paused = True - self.pause_menu.set_label(pause_label) + self.pause_menu.set_label(play_label) def update_log_menu(self): graph = ""