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
+
+
+
+ 2
+ 2
+
+
+
+
+
+ 0
+ 16
+
+
+
+
+
+ 1
+ 16
+
+
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)