From a04e410a39563b84aecbf7d71b57ee63fea1fed7 Mon Sep 17 00:00:00 2001
From: Paulina Kalicka <71526180+paulinek13@users.noreply.github.com>
Date: Fri, 18 Jul 2025 00:09:52 +0200
Subject: [PATCH] feat: add option to enable zoom with `ctrl + scroll` (#19127)
This PR adds a new global setting `scrollToZoom` that allows users to
enable font zooming with scrolling. When disabled, **this setting
prevents accidental font size changes** that can occur when users scroll
while holding the Ctrl key.
Note: after disabling this setting, users may still change font size
using `Ctrl+` and `Ctrl-` keyboard shortcuts. Other Ctrl+Scroll
functionality (like transparency adjustments) remains unaffected.
## Validation Steps Performed
- Verified the setting can be toggled in the Settings UI (Interaction
tab)
- Confirmed that when disabled, holding Ctrl and scrolling no longer
changes font size
- Validated that the setting persists across terminal restarts
---
Note: I used the existing `FocusFollowMouse` setting as a reference for
implementing this.
Closes #11710
Closes #3793
Closes #11906
Closes #3990
---
doc/cascadia/profiles.schema.json | 5 +++++
src/cascadia/TerminalControl/ControlInteractivity.cpp | 2 +-
src/cascadia/TerminalControl/IControlSettings.idl | 1 +
src/cascadia/TerminalSettingsEditor/Interaction.xaml | 6 ++++++
src/cascadia/TerminalSettingsEditor/InteractionViewModel.h | 1 +
.../TerminalSettingsEditor/InteractionViewModel.idl | 1 +
.../TerminalSettingsEditor/Resources/en-US/Resources.resw | 4 ++++
src/cascadia/TerminalSettingsModel/GlobalAppSettings.idl | 1 +
src/cascadia/TerminalSettingsModel/MTSMSettings.h | 1 +
src/cascadia/TerminalSettingsModel/TerminalSettings.cpp | 1 +
src/cascadia/TerminalSettingsModel/TerminalSettings.h | 1 +
src/cascadia/inc/ControlProperties.h | 1 +
12 files changed, 24 insertions(+), 1 deletion(-)
diff --git a/doc/cascadia/profiles.schema.json b/doc/cascadia/profiles.schema.json
index a5011bb980..10f5a8b87f 100644
--- a/doc/cascadia/profiles.schema.json
+++ b/doc/cascadia/profiles.schema.json
@@ -2376,6 +2376,11 @@
"description": "When set to true, the terminal will focus the pane on mouse hover.",
"type": "boolean"
},
+ "experimental.scrollToZoom": {
+ "default": true,
+ "description": "When set to true, holding the Ctrl key while scrolling will increase or decrease the terminal font size.",
+ "type": "boolean"
+ },
"compatibility.allowHeadless": {
"default": false,
"description": "When set to true, Windows Terminal will run in the background. This allows globalSummon and quakeMode actions to work even when no windows are open.",
diff --git a/src/cascadia/TerminalControl/ControlInteractivity.cpp b/src/cascadia/TerminalControl/ControlInteractivity.cpp
index f289912145..ba740a4364 100644
--- a/src/cascadia/TerminalControl/ControlInteractivity.cpp
+++ b/src/cascadia/TerminalControl/ControlInteractivity.cpp
@@ -519,7 +519,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
{
_mouseTransparencyHandler(delta);
}
- else if (ctrlPressed)
+ else if (ctrlPressed && _core->Settings().ScrollToZoom())
{
_mouseZoomHandler(delta);
}
diff --git a/src/cascadia/TerminalControl/IControlSettings.idl b/src/cascadia/TerminalControl/IControlSettings.idl
index ad621fdff8..2bd4bfc854 100644
--- a/src/cascadia/TerminalControl/IControlSettings.idl
+++ b/src/cascadia/TerminalControl/IControlSettings.idl
@@ -60,6 +60,7 @@ namespace Microsoft.Terminal.Control
Boolean CopyOnSelect { get; };
Microsoft.Terminal.Control.CopyFormat CopyFormatting { get; };
Boolean FocusFollowMouse { get; };
+ Boolean ScrollToZoom { get; };
String Commandline { get; };
String StartingDirectory { get; };
diff --git a/src/cascadia/TerminalSettingsEditor/Interaction.xaml b/src/cascadia/TerminalSettingsEditor/Interaction.xaml
index 10d45c7899..eba8b8129e 100644
--- a/src/cascadia/TerminalSettingsEditor/Interaction.xaml
+++ b/src/cascadia/TerminalSettingsEditor/Interaction.xaml
@@ -83,6 +83,12 @@
Style="{StaticResource ToggleSwitchInExpanderStyle}" />
+
+
+
+
+
Automatically focus pane on mouse hover
Header for a control to toggle the "focus follow mouse" setting. When enabled, hovering over a pane puts it in focus.
+
+ Adjust terminal font size by scrolling while holding the Ctrl key
+ Header for a control to toggle font size changes with scrolling. When enabled, holding the Ctrl key while scrolling will increase or decrease the terminal font size.
+
Pane animations
Header for a control to toggle animations on panes. "Enabled" value enables the animations.
diff --git a/src/cascadia/TerminalSettingsModel/GlobalAppSettings.idl b/src/cascadia/TerminalSettingsModel/GlobalAppSettings.idl
index 9bf5267733..5a99e05bc3 100644
--- a/src/cascadia/TerminalSettingsModel/GlobalAppSettings.idl
+++ b/src/cascadia/TerminalSettingsModel/GlobalAppSettings.idl
@@ -90,6 +90,7 @@ namespace Microsoft.Terminal.Settings.Model
INHERITABLE_SETTING(Boolean, DisableAnimations);
INHERITABLE_SETTING(String, StartupActions);
INHERITABLE_SETTING(Boolean, FocusFollowMouse);
+ INHERITABLE_SETTING(Boolean, ScrollToZoom);
INHERITABLE_SETTING(WindowingMode, WindowingBehavior);
INHERITABLE_SETTING(Boolean, TrimBlockSelection);
INHERITABLE_SETTING(Boolean, DetectURLs);
diff --git a/src/cascadia/TerminalSettingsModel/MTSMSettings.h b/src/cascadia/TerminalSettingsModel/MTSMSettings.h
index 01bd5ce5c8..725cddbb68 100644
--- a/src/cascadia/TerminalSettingsModel/MTSMSettings.h
+++ b/src/cascadia/TerminalSettingsModel/MTSMSettings.h
@@ -24,6 +24,7 @@ Author(s):
X(hstring, WordDelimiters, "wordDelimiters", DEFAULT_WORD_DELIMITERS) \
X(bool, CopyOnSelect, "copyOnSelect", false) \
X(bool, FocusFollowMouse, "focusFollowMouse", false) \
+ X(bool, ScrollToZoom, "experimental.scrollToZoom", true) \
X(winrt::Microsoft::Terminal::Control::GraphicsAPI, GraphicsAPI, "rendering.graphicsAPI") \
X(bool, DisablePartialInvalidation, "rendering.disablePartialInvalidation", false) \
X(bool, SoftwareRendering, "rendering.software", false) \
diff --git a/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp b/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp
index 9d3540b145..5b34afbc5a 100644
--- a/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp
+++ b/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp
@@ -367,6 +367,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation
_CopyOnSelect = globalSettings.CopyOnSelect();
_CopyFormatting = globalSettings.CopyFormatting();
_FocusFollowMouse = globalSettings.FocusFollowMouse();
+ _ScrollToZoom = globalSettings.ScrollToZoom();
_GraphicsAPI = globalSettings.GraphicsAPI();
_DisablePartialInvalidation = globalSettings.DisablePartialInvalidation();
_SoftwareRendering = globalSettings.SoftwareRendering();
diff --git a/src/cascadia/TerminalSettingsModel/TerminalSettings.h b/src/cascadia/TerminalSettingsModel/TerminalSettings.h
index 9591ad3487..b9f4af3d30 100644
--- a/src/cascadia/TerminalSettingsModel/TerminalSettings.h
+++ b/src/cascadia/TerminalSettingsModel/TerminalSettings.h
@@ -94,6 +94,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation
INHERITABLE_SETTING(Model::TerminalSettings, bool, CopyOnSelect, false);
INHERITABLE_SETTING(Model::TerminalSettings, Microsoft::Terminal::Control::CopyFormat, CopyFormatting, 0);
INHERITABLE_SETTING(Model::TerminalSettings, bool, FocusFollowMouse, false);
+ INHERITABLE_SETTING(Model::TerminalSettings, bool, ScrollToZoom, true);
INHERITABLE_SETTING(Model::TerminalSettings, bool, AllowVtChecksumReport, false);
INHERITABLE_SETTING(Model::TerminalSettings, bool, TrimBlockSelection, true);
INHERITABLE_SETTING(Model::TerminalSettings, bool, DetectURLs, true);
diff --git a/src/cascadia/inc/ControlProperties.h b/src/cascadia/inc/ControlProperties.h
index 107773da06..ab6fa1fe01 100644
--- a/src/cascadia/inc/ControlProperties.h
+++ b/src/cascadia/inc/ControlProperties.h
@@ -42,6 +42,7 @@
X(winrt::hstring, WordDelimiters, DEFAULT_WORD_DELIMITERS) \
X(bool, CopyOnSelect, false) \
X(bool, FocusFollowMouse, false) \
+ X(bool, ScrollToZoom, true) \
X(winrt::Windows::Foundation::IReference, TabColor, nullptr) \
X(winrt::Windows::Foundation::IReference, StartingTabColor, nullptr) \
X(bool, TrimBlockSelection, true) \