From 5b3a9b4a0bba87b18a487ca2245c214976871ec4 Mon Sep 17 00:00:00 2001 From: Jeremy Wootten Date: Mon, 6 Jan 2025 20:18:55 +0000 Subject: [PATCH 1/3] Show badge text when `0` pressed, remove when release ` --- src/MainWindow.vala | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/MainWindow.vala b/src/MainWindow.vala index ec598f01e4..186b4db6c5 100644 --- a/src/MainWindow.vala +++ b/src/MainWindow.vala @@ -232,6 +232,7 @@ namespace Terminal { propagation_phase = TARGET }; key_controller.key_pressed.connect (key_pressed); + key_controller.key_released.connect (key_released); key_controller.focus_in.connect (() => { if (focus_timeout == 0) { focus_timeout = Timeout.add (20, () => { @@ -437,6 +438,19 @@ namespace Terminal { bind_property ("current-terminal", menu_popover, "terminal"); } + private void key_released (uint keyval, uint keycode, Gdk.ModifierType modifiers) { + if (keyval == Gdk.Key.Alt_L) { + //Remove tab numbers if present + for (int i = 0; i < notebook.n_pages; i++) { + var tab = notebook.tab_view.get_nth_page (i); + var badge = "(%d) ".printf (i + 1); + if (tab.title.has_prefix (badge)) { + tab.title = tab.title.slice (badge.length, tab.title.length); + } + } + } + } + private bool key_pressed (uint keyval, uint keycode, Gdk.ModifierType modifiers) { switch (keyval) { case Gdk.Key.Escape: @@ -457,6 +471,23 @@ namespace Terminal { } break; + case Gdk.Key.@0: //Show tab numbers + case Gdk.Key.KP_0: + if (MOD1_MASK in modifiers) { + //TODO Show number as badge? Need way of converting number to suitable icon + // that can be used as TabPage.indicator_icon. + // For now use text + for (int i = 0; i < notebook.n_pages; i++) { + var tab = notebook.tab_view.get_nth_page (i); + var badge = "(%d) ".printf (i + 1); + if (!tab.title.has_prefix (badge)) { + tab.title = badge + tab.title; + } + } + } + + return Gdk.EVENT_STOP; + case Gdk.Key.@1: //alt+[1-8] case Gdk.Key.@2: case Gdk.Key.@3: From 2052d368612daa45ee0a51a51e0a6399e7959d9c Mon Sep 17 00:00:00 2001 From: Jeremy Wootten Date: Mon, 6 Jan 2025 20:19:27 +0000 Subject: [PATCH 2/3] Always swallow `+number` --- src/MainWindow.vala | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/MainWindow.vala b/src/MainWindow.vala index 186b4db6c5..def0205f76 100644 --- a/src/MainWindow.vala +++ b/src/MainWindow.vala @@ -500,11 +500,10 @@ namespace Terminal { && Application.settings.get_boolean ("alt-changes-tab") && notebook.n_pages > 1) { var tab_index = keyval - 49; - if (tab_index > notebook.n_pages - 1) { - return false; + if (tab_index <= notebook.n_pages - 1) { + notebook.selected_page = notebook.tab_view.get_nth_page ((int) tab_index); } - notebook.selected_page = notebook.tab_view.get_nth_page ((int) tab_index); return true; } break; From 6c6e683d34ee612bb24771e5fc3692400be7cb7a Mon Sep 17 00:00:00 2001 From: Jeremy Wootten Date: Sat, 19 Apr 2025 15:41:22 +0100 Subject: [PATCH 3/3] Implement long press on Alt to show tab nums --- src/MainWindow.vala | 87 ++++++++++++++++++++++++++++++++++----------- 1 file changed, 66 insertions(+), 21 deletions(-) diff --git a/src/MainWindow.vala b/src/MainWindow.vala index 95f5567f6d..67cf0a6c18 100644 --- a/src/MainWindow.vala +++ b/src/MainWindow.vala @@ -230,6 +230,9 @@ namespace Terminal { }); } }); + key_controller.focus_out.connect (() => { + cancel_tab_numbers (); + }); update_font (); Application.settings_sys.changed["monospace-font-name"].connect (update_font); @@ -432,19 +435,11 @@ namespace Terminal { } private void key_released (uint keyval, uint keycode, Gdk.ModifierType modifiers) { - if (keyval == Gdk.Key.Alt_L) { - //Remove tab numbers if present - for (int i = 0; i < notebook.n_pages; i++) { - var tab = notebook.tab_view.get_nth_page (i); - var badge = "(%d) ".printf (i + 1); - if (tab.title.has_prefix (badge)) { - tab.title = tab.title.slice (badge.length, tab.title.length); - } - } - } + cancel_tab_numbers (); } private bool key_pressed (uint keyval, uint keycode, Gdk.ModifierType modifiers) { + cancel_tab_numbers (); switch (keyval) { case Gdk.Key.Escape: if (search_toolbar.search_entry.has_focus) { @@ -462,24 +457,17 @@ namespace Terminal { } return true; } + break; case Gdk.Key.@0: //Show tab numbers case Gdk.Key.KP_0: if (MOD1_MASK in modifiers) { - //TODO Show number as badge? Need way of converting number to suitable icon - // that can be used as TabPage.indicator_icon. - // For now use text - for (int i = 0; i < notebook.n_pages; i++) { - var tab = notebook.tab_view.get_nth_page (i); - var badge = "(%d) ".printf (i + 1); - if (!tab.title.has_prefix (badge)) { - tab.title = badge + tab.title; - } - } + show_tab_numbers (); + return Gdk.EVENT_STOP; } - return Gdk.EVENT_STOP; + break; case Gdk.Key.@1: //alt+[1-8] case Gdk.Key.@2: @@ -499,6 +487,7 @@ namespace Terminal { return true; } + break; case Gdk.Key.@9: @@ -508,15 +497,71 @@ namespace Terminal { notebook.selected_page = notebook.tab_view.get_nth_page (notebook.n_pages - 1); return true; } + break; default: + if (keyval == Gdk.Key.Alt_L) { + schedule_tab_numbers (); + } + break; } return false; } + private uint tab_number_timeout = 0; + private bool tab_numbers_showing = false; + private void schedule_tab_numbers () { + if (tab_numbers_showing || tab_number_timeout > 0) { + return; + } + + tab_number_timeout = Timeout.add ( + Gtk.Settings.get_default ().gtk_long_press_time, + () => { + tab_number_timeout = 0; + show_tab_numbers (); + return Source.REMOVE; + } + ); + } + + + private void show_tab_numbers () { + tab_numbers_showing = true; + //TODO Show number as badge? Need way of converting number to suitable icon + // that can be used as TabPage.indicator_icon. + // For now use text + for (int i = 0; i < notebook.n_pages; i++) { + var tab = notebook.tab_view.get_nth_page (i); + var badge = "(%d) ".printf (i + 1); + if (!tab.title.has_prefix (badge)) { + tab.title = badge + tab.title; + } + } + } + + private void cancel_tab_numbers () { + if (tab_number_timeout > 0) { + Source.remove (tab_number_timeout); + tab_number_timeout = 0; + } + + if (tab_numbers_showing) { + for (int i = 0; i < notebook.n_pages; i++) { + var tab = notebook.tab_view.get_nth_page (i); + var badge = "(%d) ".printf (i + 1); + if (tab.title.has_prefix (badge)) { + tab.title = tab.title.slice (badge.length, tab.title.length); + } + } + + tab_numbers_showing = false; + } + } + private void restore_saved_state () { var rect = Gdk.Rectangle (); Terminal.Application.saved_state.get ("window-size", "(ii)", out rect.width, out rect.height);