From f35571d293d7bc33d805b34c22cfcabe35b5d86d Mon Sep 17 00:00:00 2001 From: arwez Date: Sat, 18 Jun 2022 03:11:42 +0200 Subject: [PATCH 1/2] Introduced new command-line option for selecting and closing tabs via tab-label --- guake/dbusiface.py | 8 ++++++++ guake/guake_app.py | 11 +++++++++++ guake/main.py | 36 ++++++++++++++++++++++++++++++++++++ guake/notebook.py | 13 ++++++++++--- 4 files changed, 65 insertions(+), 3 deletions(-) diff --git a/guake/dbusiface.py b/guake/dbusiface.py index 2002e7e7c..38b2c1bc7 100755 --- a/guake/dbusiface.py +++ b/guake/dbusiface.py @@ -81,10 +81,18 @@ def add_tab(self, directory=""): def close_tab(self): self.guake.close_tab() + @dbus.service.method(DBUS_NAME, in_signature="s") + def close_tab_label(self, tab_label): + return self.guake.close_tab_by_label(tab_label) + @dbus.service.method(DBUS_NAME, in_signature="i") def select_tab(self, tab_index=0): return self.guake.get_notebook().set_current_page(int(tab_index)) + @dbus.service.method(DBUS_NAME, in_signature="s") + def select_tab_label(self, tab_label): + return self.guake.select_tab_by_label(tab_label) + @dbus.service.method(DBUS_NAME, out_signature="i") def get_selected_tab(self): return self.guake.get_notebook().get_current_page() diff --git a/guake/guake_app.py b/guake/guake_app.py index 6e86791c4..2e8fd87ea 100644 --- a/guake/guake_app.py +++ b/guake/guake_app.py @@ -1193,11 +1193,22 @@ def update_window_title(self, title): # -- tab related functions -- + def select_tab_by_label(self, tab_label): + notebook = self.get_notebook() + page_num = notebook.find_tab_index_by_label_text(tab_label) + if page_num >= notebook.get_n_pages() or page_num < 0: + return False + notebook.set_current_page(page_num) + return True + def close_tab(self, *args): """Closes the current tab.""" prompt_cfg = self.settings.general.get_int("prompt-on-close-tab") self.get_notebook().delete_page_current(prompt=prompt_cfg) + def close_tab_by_label(self, tab_label): + return self.get_notebook().delete_page_by_label(label=tab_label) + def rename_tab_uuid(self, term_uuid, new_text, user_set=True): """Rename an already added tab by its UUID""" term_uuid = uuid.UUID(term_uuid) diff --git a/guake/main.py b/guake/main.py index c28db222a..5a6bcfbdd 100644 --- a/guake/main.py +++ b/guake/main.py @@ -183,6 +183,15 @@ def main(): help=_("Select a tab (SELECT_TAB is the index of the tab)"), ) + parser.add_option( + "--select-tab-label", + dest="select_tablabel", + metavar="TITLE", + action="store", + default=False, + help=_("Select a tab (TITLE is the case-sensitive label of the tab)."), + ) + parser.add_option( "-g", "--selected-tab", @@ -343,6 +352,15 @@ def main(): help=_("Rename the current tab. Reset to default if TITLE is a " 'single dash "-".'), ) + parser.add_option( + "--close-tab-label", + dest="close_tablabel", + metavar="TITLE", + action="store", + default=False, + help=_("Close a tab (TITLE is the case-sensitive label of the tab)."), + ) + parser.add_option( "-q", "--quit", @@ -526,6 +544,15 @@ def main(): sys.stderr.write(f"invalid index: {selected}\n") only_show_hide = options.show + if options.select_tablabel: + tab_label = str(options.select_tablabel) + if not tab_label: + sys.stderr.write("no label was provided!\n") + else: + if not remote_object.select_tab_label(tab_label): + sys.stderr.write("Could not find tab with label \"" + tab_label + "\"\n") + only_show_hide = options.show + if options.selected_tab: selected = remote_object.get_selected_tab() sys.stdout.write(f"{selected}\n") @@ -536,6 +563,15 @@ def main(): sys.stdout.write(f"{selectedlabel}\n") only_show_hide = options.show + if options.close_tablabel: + tab_label = str(options.close_tablabel) + if not tab_label: + sys.stderr.write("no label was provided!\n") + else: + if not remote_object.close_tab_label(tab_label): + sys.stderr.write("Could not find tab with label \"" + tab_label + "\"\n") + only_show_hide = options.show + if options.uuid_index: selectedIndex = remote_object.get_index_from_uuid(options.uuid_index) sys.stdout.write(f"{selectedIndex}\n") diff --git a/guake/notebook.py b/guake/notebook.py index 627d0b808..aa7b80ca8 100644 --- a/guake/notebook.py +++ b/guake/notebook.py @@ -295,14 +295,14 @@ def delete_page(self, page_num, kill=True, prompt=0): log.debug("Deleting page index %s", page_num) if page_num >= self.get_n_pages() or page_num < 0: log.error("Can not delete page %s no such index", page_num) - return + return False # TODO NOTEBOOK it would be nice if none of the "ui" stuff # (PromptQuitDialog) would be in here procs = self.get_running_fg_processes_count_page(page_num) if prompt == 2 or (prompt == 1 and procs > 0): # TODO NOTEBOOK remove call to guake if not PromptQuitDialog(self.guake.window, procs, -1, None).close_tab(): - return + return False page = self.get_nth_page(page_num) for terminal in self.get_terminals_for_page(page_num): @@ -321,6 +321,7 @@ def delete_page(self, page_num, kill=True, prompt=0): # Check this by compare same page_num page with previous saved page instance, # and remove the page if it really didn't remove it. self.remove_page(page_num) + return True @save_tabs_when_changed def remove_page(self, page_num): @@ -335,7 +336,7 @@ def remove_page(self, page_num): self.emit("page-deleted") def delete_page_by_label(self, label, kill=True, prompt=0): - self.delete_page(self.find_tab_index_by_label(label), kill, prompt) + return self.delete_page(self.find_tab_index_by_label_text(label), kill, prompt) def delete_page_current(self, kill=True, prompt=0): self.delete_page(self.get_current_page(), kill, prompt) @@ -447,6 +448,12 @@ def find_tab_index_by_label(self, eventbox): return index return -1 + def find_tab_index_by_label_text(self, label): + for index, tab_eventbox in enumerate(self.iter_tabs()): + if label == tab_eventbox.label.get_text(): + return index + return -1 + def find_page_index_by_terminal(self, terminal): for index, page in enumerate(self.iter_pages()): for t in page.iter_terminals(): From 8c40b18ba4c0fc59e889d9e81ada8608345113d2 Mon Sep 17 00:00:00 2001 From: arwez Date: Sat, 18 Jun 2022 11:58:29 +0200 Subject: [PATCH 2/2] Added new slug file, #1835, sem-ver: feature --- .../notes/close_select_tab_by_label-d682c1ffde8708f7.yaml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 releasenotes/notes/close_select_tab_by_label-d682c1ffde8708f7.yaml diff --git a/releasenotes/notes/close_select_tab_by_label-d682c1ffde8708f7.yaml b/releasenotes/notes/close_select_tab_by_label-d682c1ffde8708f7.yaml new file mode 100644 index 000000000..49501d840 --- /dev/null +++ b/releasenotes/notes/close_select_tab_by_label-d682c1ffde8708f7.yaml @@ -0,0 +1,6 @@ +release_summary: > + Added commands for selecting/closing tabs via label + +features: + - | + - Close terminal by name #1835