From 2a61f75e54b474effec950739698ecdc1f2d571e Mon Sep 17 00:00:00 2001 From: Mildred Ki'Lya Date: Thu, 2 Mar 2023 18:37:50 +0100 Subject: [PATCH 1/4] Update install script to install to custom location --- install.sh | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/install.sh b/install.sh index 3c467a81..6ae905bd 100755 --- a/install.sh +++ b/install.sh @@ -1,8 +1,29 @@ #!/usr/bin/env bash -python3 setup.py install --optimize=1 -cp nwg-panel.svg /usr/share/pixmaps/ -cp nwg-shell.svg /usr/share/pixmaps/ -cp nwg-processes.svg /usr/share/pixmaps/ -cp nwg-panel-config.desktop /usr/share/applications/ -cp nwg-processes.desktop /usr/share/applications/ +prefix= +opts=() + +while true; do + case "$1" in + --prefix=*) + opts+=("$1") + eval "prefix=${1##--prefix=}" + shift + ;; + *) + break + ;; + esac +done + +opts+=("$@") + +: ${prefix:="/usr"} + +python3 setup.py install --optimize=1 "${opts[@]}" +mkdir -p $prefix/share/pixmaps/ $prefix/share/applications/ +cp nwg-panel.svg $prefix/share/pixmaps/ +cp nwg-shell.svg $prefix/share/pixmaps/ +cp nwg-processes.svg $prefix/share/pixmaps/ +cp nwg-panel-config.desktop $prefix/share/applications/ +cp nwg-processes.desktop $prefix/share/applications/ From b5327663159e93a2883cc67160e0c8798398e047 Mon Sep 17 00:00:00 2001 From: Mildred Ki'Lya Date: Thu, 2 Mar 2023 18:37:57 +0100 Subject: [PATCH 2/4] Fix executor --- nwg_panel/modules/executor.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nwg_panel/modules/executor.py b/nwg_panel/modules/executor.py index e81f97fd..c20066c9 100644 --- a/nwg_panel/modules/executor.py +++ b/nwg_panel/modules/executor.py @@ -175,8 +175,8 @@ def on_button_press(self, widget, event): def on_scroll(self, widget, event): if event.direction == Gdk.ScrollDirection.UP and self.settings["on-scroll-up"]: self.launch(self.settings["on-scroll-up"]) - elif event.direction == Gdk.ScrollDirection.DOWN and self.settings["on-scroll-up"]: - self.launch(self.settings["on-scroll-up"]) + elif event.direction == Gdk.ScrollDirection.DOWN and self.settings["on-scroll-down"]: + self.launch(self.settings["on-scroll-down"]) else: print("No command assigned") From fefa0a37610b509e5e05ae625db5de390250a718 Mon Sep 17 00:00:00 2001 From: Mildred Ki'Lya Date: Thu, 2 Mar 2023 18:38:09 +0100 Subject: [PATCH 3/4] Add scroll events to workspace --- nwg_panel/modules/sway_workspaces.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/nwg_panel/modules/sway_workspaces.py b/nwg_panel/modules/sway_workspaces.py index 3a2fe1da..a2962429 100644 --- a/nwg_panel/modules/sway_workspaces.py +++ b/nwg_panel/modules/sway_workspaces.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 -from gi.repository import Gtk, GdkPixbuf +from gi.repository import Gtk, GdkPixbuf, Gdk import nwg_panel.common from nwg_panel.tools import check_key, get_icon_name, update_image, load_autotiling @@ -57,6 +57,8 @@ def build_box(self): eb.connect("enter_notify_event", self.on_enter_notify_event) eb.connect("leave_notify_event", self.on_leave_notify_event) eb.connect("button-release-event", self.on_click, num) + eb.add_events(Gdk.EventMask.SCROLL_MASK) + eb.connect('scroll-event', self.on_scroll) self.pack_start(eb, False, False, 0) box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=0) @@ -244,6 +246,12 @@ def find_details(self): def on_click(self, event_box, event_button, num): nwg_panel.common.i3.command("workspace number {}".format(num)) + def on_scroll(self, event_box, event): + if event.direction == Gdk.ScrollDirection.UP: + nwg_panel.common.i3.command("workspace prev") + elif event.direction == Gdk.ScrollDirection.DOWN: + nwg_panel.common.i3.command("workspace next") + def on_enter_notify_event(self, widget, event): widget.set_state_flags(Gtk.StateFlags.DROP_ACTIVE, clear=False) widget.set_state_flags(Gtk.StateFlags.SELECTED, clear=False) From 01811b84fb4872d3560b8faa08ea337f322fe402 Mon Sep 17 00:00:00 2001 From: Mildred Ki'Lya Date: Fri, 3 Mar 2023 00:41:13 +0100 Subject: [PATCH 4/4] Implement dynamic workspace numbers based on actual workspaces - if numbers is empty, take it from the existing workspaces - add a "hide-empty" configuration to hide empty workspaces --- nwg_panel/modules/sway_workspaces.py | 118 +++++++++++++++++---------- 1 file changed, 75 insertions(+), 43 deletions(-) diff --git a/nwg_panel/modules/sway_workspaces.py b/nwg_panel/modules/sway_workspaces.py index a2962429..42aa594f 100644 --- a/nwg_panel/modules/sway_workspaces.py +++ b/nwg_panel/modules/sway_workspaces.py @@ -11,6 +11,7 @@ def __init__(self, settings, i3, icons_path): Gtk.Box.__init__(self, orientation=Gtk.Orientation.HORIZONTAL, spacing=0) self.settings = settings self.i3 = i3 + self.num_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=0) self.ws_num2box = {} self.ws_num2lbl = {} self.name_label = Gtk.Label() @@ -23,7 +24,7 @@ def __init__(self, settings, i3, icons_path): self.build_box() def build_box(self): - check_key(self.settings, "numbers", [1, 2, 3, 4, 5, 6, 7, 8]) + check_key(self.settings, "numbers", []) check_key(self.settings, "custom-labels", []) check_key(self.settings, "focused-labels", []) check_key(self.settings, "show-icon", True) @@ -32,6 +33,7 @@ def build_box(self): check_key(self.settings, "name-length", 40) check_key(self.settings, "mark-autotiling", True) check_key(self.settings, "mark-content", True) + check_key(self.settings, "hide-empty", False) check_key(self.settings, "show-layout", True) check_key(self.settings, "angle", 0.0) if self.settings["angle"] != 0.0: @@ -40,7 +42,7 @@ def build_box(self): # prevent from #142 ws_num = -1 if self.i3.get_tree().find_focused(): - ws_num, win_name, win_id, non_empty, win_layout = self.find_details() + ws_num, win_name, win_id, non_empty, win_layout, numbers = self.find_details() if len(self.settings["custom-labels"]) == 1 or len(self.settings["custom-labels"]) == len(self.settings["numbers"]): self.settings["custom-labels"] *= len(self.settings["numbers"]) @@ -52,20 +54,9 @@ def build_box(self): else: self.settings["focused-labels"] = [] - for idx, num in enumerate(self.settings["numbers"]): - eb = Gtk.EventBox() - eb.connect("enter_notify_event", self.on_enter_notify_event) - eb.connect("leave_notify_event", self.on_leave_notify_event) - eb.connect("button-release-event", self.on_click, num) - eb.add_events(Gdk.EventMask.SCROLL_MASK) - eb.connect('scroll-event', self.on_scroll) - self.pack_start(eb, False, False, 0) - - box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=0) - if self.settings["angle"] != 0.0: - box.set_orientation(Gtk.Orientation.VERTICAL) - eb.add(box) + self.pack_start(self.num_box, False, False, 0) + for idx, num in enumerate(self.settings["numbers"]): if num == str(ws_num) and self.settings["focused-labels"]: label = self.settings["focused-labels"][idx] elif self.settings["custom-labels"]: @@ -73,23 +64,8 @@ def build_box(self): else: label = str(num) - if self.settings["mark-autotiling"]: - try: - at = int(num) in self.autotiling - except: - at = False - autotiling = "a" if at in self.autotiling else "" - lbl = Gtk.Label("{}{}".format(autotiling, label)) - else: - lbl = Gtk.Label("{}".format(label)) - if self.settings["angle"] != 0.0: - lbl.set_angle(self.settings["angle"]) - self.name_label.set_angle(self.settings["angle"]) - - self.ws_num2box[num] = eb - self.ws_num2lbl[num] = lbl - - box.pack_start(lbl, False, False, 6) + eb, lbl = self.build_number(num, label) + self.num_box.pack_start(eb, False, False, 0) if num == str(ws_num): eb.set_property("name", "task-box-focused") @@ -105,27 +81,82 @@ def build_box(self): if self.settings["show-layout"]: self.pack_start(self.layout_icon, False, False, 6) + def build_number(self, num, label): + eb = Gtk.EventBox() + eb.connect("enter_notify_event", self.on_enter_notify_event) + eb.connect("leave_notify_event", self.on_leave_notify_event) + eb.connect("button-release-event", self.on_click, num) + eb.add_events(Gdk.EventMask.SCROLL_MASK) + eb.connect('scroll-event', self.on_scroll) + + box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=0) + if self.settings["angle"] != 0.0: + box.set_orientation(Gtk.Orientation.VERTICAL) + eb.add(box) + + if self.settings["mark-autotiling"]: + try: + at = int(num) in self.autotiling + except: + at = False + autotiling = "a" if at in self.autotiling else "" + lbl = Gtk.Label("{}{}".format(autotiling, label)) + else: + lbl = Gtk.Label("{}".format(label)) + if self.settings["angle"] != 0.0: + lbl.set_angle(self.settings["angle"]) + self.name_label.set_angle(self.settings["angle"]) + + self.ws_num2box[num] = eb + self.ws_num2lbl[num] = lbl + + box.pack_start(lbl, False, False, 6) + + return eb, lbl + def refresh(self): if self.i3.get_tree().find_focused(): - ws_num, win_name, win_id, non_empty, win_layout = self.find_details() + ws_num, win_name, win_id, non_empty, win_layout, numbers = self.find_details() + + if len(self.settings["numbers"]) > 0: + numbers = self.settings["numbers"] if ws_num > 0: - for idx, num in enumerate(self.settings["numbers"]): - if num == str(ws_num) and self.settings["focused-labels"]: + for num in self.ws_num2lbl: + self.ws_num2lbl[num].hide() + + for _idx, num in enumerate(numbers): + idx = None + if num in self.settings["numbers"]: + idx = self.settings["numbers"].index(num) + try: + int_num = int(num) + except: + int_num = 0 + + if idx is None: + text = str(num) + elif num == str(ws_num) and self.settings["focused-labels"]: text = self.settings["focused-labels"][idx] elif self.settings["custom-labels"]: text = self.settings["custom-labels"][idx] else: text = str(num) - + + if num not in self.ws_num2lbl: + eb, lbl = self.build_number(num, text) + self.num_box.pack_start(eb, False, False, 0) + eb.show_all() + lbl = self.ws_num2lbl[num] + if not self.settings["hide-empty"] or int_num in non_empty or num == str(ws_num): + lbl.show() + else: + lbl.hide() + # mark non-empty WS with a dot if self.settings["mark-content"]: - try: - int_num = int(num) - except: - int_num = 0 if int_num in non_empty: if not text.endswith("."): text += "." @@ -197,11 +228,12 @@ def find_details(self): win_name = "" win_id = "" # app_id if available, else window_class layout = None + numbers = [] for ws in workspaces: + numbers.append(str(ws.num)) if ws.focused: ws_num = ws.num - break non_empty = [] if self.settings["show-name"] or self.settings["show-icon"]: @@ -217,7 +249,7 @@ def find_details(self): for item in tree.descendants(): if item.type == "workspace": # find non-empty workspaces - if self.settings["mark-content"]: + if self.settings["mark-content"] or self.settings["hide-empty"]: tasks_num = 0 for d in item.descendants(): if d.type == "con" and d.name: @@ -241,7 +273,7 @@ def find_details(self): if not layout: layout = f.parent.layout - return ws_num, win_name, win_id, non_empty, layout + return ws_num, win_name, win_id, non_empty, layout, numbers def on_click(self, event_box, event_button, num): nwg_panel.common.i3.command("workspace number {}".format(num))