From a5e90a4e7a00ccaa314127c339c9cd7696a2bcd7 Mon Sep 17 00:00:00 2001 From: Jeremy Wootten Date: Mon, 23 Feb 2026 16:25:34 +0000 Subject: [PATCH 1/7] Direct zoom action to focused widget --- src/MainWindow.vala | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/MainWindow.vala b/src/MainWindow.vala index 1e09bc0665..bda68fd24c 100644 --- a/src/MainWindow.vala +++ b/src/MainWindow.vala @@ -874,20 +874,29 @@ namespace Scratch { } public void set_default_zoom () { - terminal.set_default_font_size (); - Scratch.settings.set_string ("font", get_current_font () + " " + get_default_font_size ().to_string ()); + if (terminal.terminal.has_focus) { + terminal.set_default_font_size (); + } else { + Scratch.settings.set_string ("font", get_current_font () + " " + get_default_font_size ().to_string ()); + } } // Ctrl + scroll public void action_zoom_in () { - terminal.increment_size (); - zooming (Gdk.ScrollDirection.UP); + if (terminal.terminal.has_focus) { + terminal.increment_size (); + } else { + zooming (Gdk.ScrollDirection.UP); + } } // Ctrl + scroll public void action_zoom_out () { - terminal.decrement_size (); - zooming (Gdk.ScrollDirection.DOWN); + if (terminal.terminal.has_focus) { + terminal.decrement_size (); + } else { + zooming (Gdk.ScrollDirection.DOWN); + } } private void zooming (Gdk.ScrollDirection direction) { From 2e706fa521c906926e3c1dd6bf8033d7e76135af Mon Sep 17 00:00:00 2001 From: Jeremy Wootten Date: Mon, 23 Feb 2026 17:34:17 +0000 Subject: [PATCH 2/7] Terminal handles scroll-zooming; window passes zoom action to focus widget --- src/Widgets/Terminal.vala | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/src/Widgets/Terminal.vala b/src/Widgets/Terminal.vala index 9f758ee0be..9927dea43d 100644 --- a/src/Widgets/Terminal.vala +++ b/src/Widgets/Terminal.vala @@ -10,8 +10,9 @@ public class Code.Terminal : Gtk.Box { public const string ACTION_COPY = "action-copy"; public const string ACTION_PASTE = "action-paste"; - private const double MAX_SCALE = 5.0; - private const double MIN_SCALE = 0.2; + private const double SCROLL_THRESHOLD = 1.0; + private const double MAX_SCALE = 2.0; + private const double MIN_SCALE = 0.5; private const string LEGACY_SETTINGS_SCHEMA = "org.pantheon.terminal.settings"; private const string SETTINGS_SCHEMA = "io.elementary.terminal.settings"; private const string GNOME_DESKTOP_INTERFACE_SCHEMA = "org.gnome.desktop.interface"; @@ -37,10 +38,13 @@ public class Code.Terminal : Gtk.Box { private GLib.Pid child_pid; private Gtk.Clipboard current_clipboard; + private double total_delta_y = 0; + construct { terminal = new Vte.Terminal () { hexpand = true, vexpand = true, + scroll_unit_is_pixels = true, scrollback_lines = -1, cursor_blink_mode = SYSTEM // There is no Terminal setting so follow Gnome }; @@ -167,6 +171,25 @@ public class Code.Terminal : Gtk.Box { copy_action.set_enabled (terminal.get_has_selection ()); }); + // Zoom font size independent of the source view + terminal.scroll_event.connect ((event) => { + var mods = event.state & Gdk.ModifierType.MODIFIER_MASK; + if ((mods & Gdk.ModifierType.CONTROL_MASK) > 0) { + total_delta_y += event.delta_y; + if (total_delta_y > SCROLL_THRESHOLD) { + total_delta_y = 0; + increment_size (); + } else if (total_delta_y < -SCROLL_THRESHOLD) { + total_delta_y = 0; + decrement_size (); + } + + return false; + } + + return true; + }); + spawn_shell (Scratch.saved_state.get_string ("last-opened-path")); var scrolled_window = new Gtk.ScrolledWindow (null, terminal.get_vadjustment ()); From e512ea01749287e24996d95c88eda518c21f7864 Mon Sep 17 00:00:00 2001 From: Jeremy Wootten Date: Mon, 9 Mar 2026 18:19:28 +0000 Subject: [PATCH 3/7] Terminal: Use correct returns in scroll handler --- src/Widgets/Terminal.vala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Widgets/Terminal.vala b/src/Widgets/Terminal.vala index 9927dea43d..01f863b6dc 100644 --- a/src/Widgets/Terminal.vala +++ b/src/Widgets/Terminal.vala @@ -184,10 +184,10 @@ public class Code.Terminal : Gtk.Box { decrement_size (); } - return false; + return Gdk.EVENT_STOP; } - return true; + return Gdk.EVENT_PROPAGATE; }); spawn_shell (Scratch.saved_state.get_string ("last-opened-path")); From e7d0b87b5ca7a0620506f25d05224a19d0ddafe7 Mon Sep 17 00:00:00 2001 From: Jeremy Wootten Date: Sat, 16 May 2026 18:31:16 +0100 Subject: [PATCH 4/7] Invert scroll action --- src/Widgets/Terminal.vala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Widgets/Terminal.vala b/src/Widgets/Terminal.vala index 7b3bdac66f..e1939a742f 100644 --- a/src/Widgets/Terminal.vala +++ b/src/Widgets/Terminal.vala @@ -177,10 +177,10 @@ public class Code.Terminal : Gtk.Box { total_delta_y += event.delta_y; if (total_delta_y > SCROLL_THRESHOLD) { total_delta_y = 0; - increment_size (); + decrement_size (); } else if (total_delta_y < -SCROLL_THRESHOLD) { total_delta_y = 0; - decrement_size (); + increment_size (); } return Gdk.EVENT_STOP; From 14dfe0f9947de0f6bf4e3a397aca5b669a724142 Mon Sep 17 00:00:00 2001 From: Jeremy Wootten Date: Sat, 16 May 2026 18:56:43 +0100 Subject: [PATCH 5/7] Persist the terminal font scaling --- data/io.elementary.code.gschema.xml | 6 ++++++ src/Widgets/Terminal.vala | 1 + 2 files changed, 7 insertions(+) diff --git a/data/io.elementary.code.gschema.xml b/data/io.elementary.code.gschema.xml index 0cfce65a00..b132a14a18 100644 --- a/data/io.elementary.code.gschema.xml +++ b/data/io.elementary.code.gschema.xml @@ -152,6 +152,12 @@ Preferred Font Set the preferred font. + + + 1.0 + Terminal pane font scale + The system terminal font is scaled by this factor in the terminal pane + 'elementary-light' Preferred Style Scheme diff --git a/src/Widgets/Terminal.vala b/src/Widgets/Terminal.vala index e1939a742f..28cd1a1b35 100644 --- a/src/Widgets/Terminal.vala +++ b/src/Widgets/Terminal.vala @@ -99,6 +99,7 @@ public class Code.Terminal : Gtk.Box { // "org.gnome.desktop.interface.color-scheme" } + Scratch.settings.bind ("terminal-fontscale", terminal, "font-scale", DEFAULT); // Always monitor changes in systen font as that is what Terminal usually follows // The terminal font key is by default "" and can only be changed by editing the settings externally application.notify["system-monospace-font"].connect (() => { From 5d2883312dd785c79f9fbc231b60e4c41272eab8 Mon Sep 17 00:00:00 2001 From: Jeremy Wootten Date: Fri, 3 Jul 2026 12:25:37 +0100 Subject: [PATCH 6/7] Use scroll controller --- src/Widgets/Terminal.vala | 53 +++++++++++++++++++++++---------------- 1 file changed, 31 insertions(+), 22 deletions(-) diff --git a/src/Widgets/Terminal.vala b/src/Widgets/Terminal.vala index 28cd1a1b35..f4fa1030ee 100644 --- a/src/Widgets/Terminal.vala +++ b/src/Widgets/Terminal.vala @@ -27,6 +27,7 @@ public class Code.Terminal : Gtk.Box { public Vte.Terminal terminal { get; construct; } private Gtk.EventControllerKey key_controller; + private Gtk.EventControllerScroll scroll_controller; private Settings? terminal_settings = null; private Settings? gnome_interface_settings = null; @@ -49,6 +50,9 @@ public class Code.Terminal : Gtk.Box { cursor_blink_mode = SYSTEM // There is no Terminal setting so follow Gnome }; + var scrolled_window = new Gtk.ScrolledWindow (null, terminal.get_vadjustment ()); + scrolled_window.add (terminal); + // Set font, allow-bold, audible-bell, background, foreground, and palette of pantheon-terminal var schema_source = SettingsSchemaSource.get_default (); var terminal_schema = schema_source.lookup (SETTINGS_SCHEMA, true); @@ -145,6 +149,33 @@ public class Code.Terminal : Gtk.Box { }; key_controller.key_pressed.connect (key_pressed); + scroll_controller = new Gtk.EventControllerScroll (this, VERTICAL) { + propagation_phase = CAPTURE + }; + scroll_controller.scroll.connect ((dx, dy) => { + Gdk.ModifierType state; + Gtk.get_current_event_state (out state); + var mods = state & Gdk.ModifierType.MODIFIER_MASK; + if ((mods & Gdk.ModifierType.CONTROL_MASK) > 0) { + total_delta_y += dy; + if (total_delta_y > SCROLL_THRESHOLD) { + total_delta_y = 0; + decrement_size (); + } else if (total_delta_y < -SCROLL_THRESHOLD) { + total_delta_y = 0; + increment_size (); + } + } else { + // The event is not automatically propagated for some reason event + // even though the handler does not return a boolean. So scroll window + // explicitly. Should not be necessary in Gtk4? + scrolled_window.scroll_child ( + dy > 0 ? Gtk.ScrollType.STEP_FORWARD : Gtk.ScrollType.STEP_BACKWARD, + false + ); + } + }); + // Cannot use event controller in Gtk3 because of https://gitlab.gnome.org/GNOME/gtk/-/issues/7225 terminal.enter_notify_event.connect (() => { if (!terminal.has_focus) { @@ -171,30 +202,8 @@ public class Code.Terminal : Gtk.Box { copy_action.set_enabled (terminal.get_has_selection ()); }); - // Zoom font size independent of the source view - terminal.scroll_event.connect ((event) => { - var mods = event.state & Gdk.ModifierType.MODIFIER_MASK; - if ((mods & Gdk.ModifierType.CONTROL_MASK) > 0) { - total_delta_y += event.delta_y; - if (total_delta_y > SCROLL_THRESHOLD) { - total_delta_y = 0; - decrement_size (); - } else if (total_delta_y < -SCROLL_THRESHOLD) { - total_delta_y = 0; - increment_size (); - } - - return Gdk.EVENT_STOP; - } - - return Gdk.EVENT_PROPAGATE; - }); - spawn_shell (Scratch.saved_state.get_string ("last-opened-path")); - var scrolled_window = new Gtk.ScrolledWindow (null, terminal.get_vadjustment ()); - scrolled_window.add (terminal); - add (scrolled_window); show_all (); } From 5f6e38fbc91b4c6ca3a7096f0358e12cd6162c46 Mon Sep 17 00:00:00 2001 From: Jeremy Wootten Date: Fri, 3 Jul 2026 13:32:14 +0100 Subject: [PATCH 7/7] Use propagate_event --- src/Widgets/Terminal.vala | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/Widgets/Terminal.vala b/src/Widgets/Terminal.vala index f4fa1030ee..9dbc87349d 100644 --- a/src/Widgets/Terminal.vala +++ b/src/Widgets/Terminal.vala @@ -166,13 +166,7 @@ public class Code.Terminal : Gtk.Box { increment_size (); } } else { - // The event is not automatically propagated for some reason event - // even though the handler does not return a boolean. So scroll window - // explicitly. Should not be necessary in Gtk4? - scrolled_window.scroll_child ( - dy > 0 ? Gtk.ScrollType.STEP_FORWARD : Gtk.ScrollType.STEP_BACKWARD, - false - ); + Gtk.propagate_event (scrolled_window, Gtk.get_current_event ()); } });