From 1e357e284d132664682ce63306268aa3c9869b8a Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Sat, 22 Feb 2014 07:08:50 +0100 Subject: fix m bugs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- src/blueshift-tray.py | 91 +++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 74 insertions(+), 17 deletions(-) diff --git a/src/blueshift-tray.py b/src/blueshift-tray.py index e4be23e..c611fc8 100755 --- a/src/blueshift-tray.py +++ b/src/blueshift-tray.py @@ -18,6 +18,7 @@ # along with this program. If not, see . import sys +import time import signal import subprocess @@ -34,19 +35,51 @@ gettext.textdomain('blueshift') def process_quit(signum, frame): + ''' + Invoked when a child process exists + + @param signum:int The signal (SIGCHLD) + @param frame:=None Will probably be `None` + ''' global running process.wait() if running: running = False icon.set_visible(False) gtk.main_quit() + time.sleep(0.1) + sys.exit(0) -signal.signal(signal.SIGCHLD, process_quit) -process = subprocess.Popen(['blueshift'] + sys.argv[1:]) -running = True + +def term(count = 1, kill = False): + ''' + Terminate the blueshift if alive + + @param count:int Number of times to send SIGTERM + @param kill:bool Whether to also send SIGKILL and the exit + ''' + if process is not None: + process.send_signal(signal.SIGTERM) + if count > 1: + for i in range(count - 1): + if process.poll(): + time.sleep(0.1) + process.send_signal(signal.SIGTERM) + if kill: + time.sleep(0.1) + process.send_signal(signal.SIGKILL) + sys.exit(0) def create_menu(menu, image, title, function): + ''' + Create a menu item + + @param menu:gtk.Menu The menu to place the item inside + @param image:str? The icon on the menu item + @param title:str? The text on the menu item + @param function:(gtk.Widget, (=None))→void The function invoked when the item is pressed + ''' if image is None: menu_item = gtk.MenuItem(gettext.gettext(title)) else: @@ -57,12 +90,25 @@ def create_menu(menu, image, title, function): menu.append(menu_item) +def f_popup(widget, button, time, data = None): + ''' + Invoked to open a popup menu + ''' + menu.show_all() + menu.popup(None, None, gtk.status_icon_position_menu, button, time, icon) + + def f_toggle(widget, data = None): + global paused, last_time + now = time.time() + if now < last_time + 0.2: + return + last_time = now + if paused is None: + paused = False process.send_signal(signal.SIGUSR2) - if icon.get_icon_name() == 'blueshift-on': - icon.set_from_icon_name('blueshift-off') - else: - icon.set_from_icon_name('blueshift-on') + icon.set_from_icon_name('blueshift-on' if paused else 'blueshift-off') + paused = not paused def f_reload(widget, data = None): process.send_signal(signal.SIGUSR1) @@ -73,7 +119,12 @@ def f_quit(widget, data = None): running = False icon.set_visible(False) gtk.main_quit() - process.send_signal(signal.SIGTERM) + if paused is None: + term() + elif paused: + term(2, True) + else: + term(2, True) def f_panic_quit(widget, data = None): global running @@ -81,15 +132,15 @@ def f_panic_quit(widget, data = None): running = False icon.set_visible(False) gtk.main_quit() - process.send_signal(signal.SIGTERM) - import time - time.sleep(0.01) - process.send_signal(signal.SIGTERM) + term(2, True) -def f_popup(widget, button, time, data = None): - menu.show_all() - menu.popup(None, None, gtk.status_icon_position_menu, button, time, icon) +signal.signal(signal.SIGCHLD, process_quit) + +process = subprocess.Popen(['blueshift'] + sys.argv[1:]) +running = True +paused = None +last_time = time.time() - 1 try: @@ -113,11 +164,17 @@ try: except KeyboardInterrupt: running = False icon.set_visible(False) - process.send_signal(signal.SIGTERM) + term() + if paused is not None: + time.sleep(0.1) + term() finally: try: process.wait() except KeyboardInterrupt: - process.send_signal(signal.SIGTERM) + term() + +if process.poll(): + process.send_signal(signal.KILL) -- cgit v1.2.3-70-g09d2