diff --git a/nwg_panel/config.py b/nwg_panel/config.py index d1240d99..14eca9f6 100644 --- a/nwg_panel/config.py +++ b/nwg_panel/config.py @@ -2598,7 +2598,9 @@ def edit_executor(self, item, name, new=False): "interval": 1, "angle": 0.0, "sigrt": signal.SIGRTMIN, - "use-sigrt": False + "use-sigrt": False, + "icon": "view-refresh-symbolic", + "continuous": False } for key in defaults: check_key(settings, key, defaults[key]) @@ -2660,6 +2662,9 @@ def edit_executor(self, item, name, new=False): self.executor_icon_placement = builder.get_object("icon-placement") self.executor_icon_placement.set_active_id(settings["icon-placement"]) + self.executor_icon = builder.get_object("icon") + self.executor_icon.set_text(settings["icon"]) + self.executor_icon_size = builder.get_object("icon-size") self.executor_icon_size.set_numeric(True) adj = Gtk.Adjustment(value=0, lower=8, upper=128, step_increment=1, page_increment=10, page_size=1) @@ -2689,6 +2694,10 @@ def edit_executor(self, item, name, new=False): self.executor_use_sigrt.set_label(voc["use-signal"]) self.executor_use_sigrt.set_active(settings["use-sigrt"]) + self.executor_continuous = builder.get_object("continuous") + self.executor_continuous.set_label(voc["continuous"]) + self.executor_continuous.set_active(settings["continuous"]) + self.executor_remove = builder.get_object("remove") self.executor_remove.set_label(voc["remove-executor"]) @@ -2736,6 +2745,7 @@ def update_executor(self): val = self.executor_icon_placement.get_active_id() if val: settings["icon-placement"] = val + settings["icon"] = self.executor_icon.get_text() settings["icon-size"] = int(self.executor_icon_size.get_value()) settings["interval"] = int(self.executor_interval.get_value()) @@ -2746,6 +2756,7 @@ def update_executor(self): settings["sigrt"] = int(self.executor_sigrt.get_value()) settings["use-sigrt"] = self.executor_use_sigrt.get_active() + settings["continuous"] = self.executor_continuous.get_active() self.panel[config_key] = settings else: diff --git a/nwg_panel/glade/config_executor.glade b/nwg_panel/glade/config_executor.glade index 0c16187c..b3818718 100644 --- a/nwg_panel/glade/config_executor.glade +++ b/nwg_panel/glade/config_executor.glade @@ -205,6 +205,20 @@ 2 + + + continuous + True + True + False + True + Updates the executor each time the script puts two lines of text (icon or empty line and text) + + + 2 + 2 + + True @@ -347,6 +361,29 @@ executor will create a new one. 11 + + + True + False + end + Icon: + + + 0 + 16 + + + + + True + True + 22 + + + 1 + 16 + + Save to database @@ -356,7 +393,7 @@ executor will create a new one. 1 - 16 + 17 @@ -369,7 +406,7 @@ executor will create a new one. 0 - 16 + 17 diff --git a/nwg_panel/langs/en_US.json b/nwg_panel/langs/en_US.json index e3ac33b3..eeb59d50 100644 --- a/nwg_panel/langs/en_US.json +++ b/nwg_panel/langs/en_US.json @@ -49,6 +49,7 @@ "command": "Command", "common": "Common", "common-panel-settings": "Common nwg-panel settings", + "continuous": "Continuous", "controls": "Controls", "controls-window-width-tooltip": "Controls window width in pixels; leave 0 for auto.", "cover-size": "Cover size", @@ -80,6 +81,7 @@ "gust": "gust", "header-icon-size": "Header icon size", "height": "Height", + "hide-empty": "Hide empty workspaces", "homogeneous": "Homogeneous", "homogeneous-tooltip": "Sets equal columns width be default if 'Modules center' not empty.", "horizontal-padding": "Horizontal padding", diff --git a/nwg_panel/modules/executor.py b/nwg_panel/modules/executor.py index c20066c9..4fa1b476 100644 --- a/nwg_panel/modules/executor.py +++ b/nwg_panel/modules/executor.py @@ -4,6 +4,8 @@ import threading import signal +from shlex import split + import gi from gi.repository import GLib @@ -26,9 +28,11 @@ def __init__(self, settings, icons_path, executor_name): self.image = Gtk.Image() self.label = Gtk.Label("") self.icon_path = None + self.process = None check_key(settings, "script", "") check_key(settings, "interval", 0) + check_key(settings, "icon", "view-refresh-symbolic") check_key(settings, "root-css-name", "root-executor") check_key(settings, "css-name", "") check_key(settings, "icon-placement", "left") @@ -42,6 +46,7 @@ def __init__(self, settings, icons_path, executor_name): check_key(settings, "angle", 0.0) check_key(settings, "sigrt", signal.SIGRTMIN) check_key(settings, "use-sigrt", False) + check_key(settings, "continuous", False) self.label.set_angle(settings["angle"]) @@ -52,7 +57,10 @@ def __init__(self, settings, icons_path, executor_name): if settings["angle"] != 0.0: self.box.set_orientation(Gtk.Orientation.VERTICAL) - update_image(self.image, "view-refresh-symbolic", self.settings["icon-size"], self.icons_path) + if self.settings["icon"] is None or len(self.settings["icon"]) == 0: + self.image.hide() + else: + update_image(self.image, self.settings["icon"], self.settings["icon-size"], self.icons_path) self.set_property("name", settings["root-css-name"]) @@ -83,6 +91,7 @@ def __init__(self, settings, icons_path, executor_name): def update_widget(self, output): if output: if len(output) == 1: + print("output1 {}".format(output)) if output[0].endswith(".svg") or output[0].endswith(".png"): new_path = output[0].strip() if new_path != self.icon_path: @@ -110,7 +119,10 @@ def update_widget(self, output): elif len(output) == 2: new_path = output[0].strip() - if "/" not in new_path and "." not in new_path: # name given instead of path + if new_path == "": + if self.image.get_visible(): + self.image.hide() + elif "/" not in new_path and "." not in new_path: # name given instead of path update_image(self.image, new_path, self.settings["icon-size"], self.icons_path) self.icon_path = new_path else: @@ -137,9 +149,32 @@ def update_widget(self, output): def get_output(self): if "script" in self.settings and self.settings["script"]: + script = split(self.settings["script"]) + continuous = self.settings["continuous"] try: - output = subprocess.check_output(self.settings["script"].split()).decode("utf-8").splitlines() - GLib.idle_add(self.update_widget, output) + if not continuous: + subprocess.check_output(script) + output = subprocess.check_output(split(self.settings["script"])).decode("utf-8").splitlines() + GLib.idle_add(self.update_widget, output) + return + + if self.process is not None and self.process.poll() is None: + # Last process has not yet finished + # Wait for it, possibly this is a continuous output + return + + self.process = subprocess.Popen(script, + stdout = subprocess.PIPE) + first_line = None + while True: + line = self.process.stdout.readline().decode('utf-8') + if line is None or len(line) == 0: break + + if first_line is None: + first_line = line + else: + GLib.idle_add(self.update_widget, [first_line, line]) + first_line = None except Exception as e: print(e)