From 6a065540dd8860120d09bd2d8e413891cd5d7a8a Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Thu, 12 Oct 2023 17:07:47 -0700 Subject: [PATCH] terminal: KAM (mode 2) This has an associated config `vt-kam-allowed` which defaults to "false" since this mode can cause the terminal to become mostly unusable. We include this mode for completions sake however. --- src/Surface.zig | 9 +++++++++ src/config/Config.zig | 8 ++++++++ src/terminal/modes.zig | 1 + website/app/vt/modes/kam/page.mdx | 28 ++++++++++++++++++++++++++++ website/components/VTMode.tsx | 18 ++++++++++++++++++ 5 files changed, 64 insertions(+) create mode 100644 website/app/vt/modes/kam/page.mdx create mode 100644 website/components/VTMode.tsx diff --git a/src/Surface.zig b/src/Surface.zig index c3fd1e9d4..575a7e822 100644 --- a/src/Surface.zig +++ b/src/Surface.zig @@ -145,6 +145,7 @@ const DerivedConfig = struct { mouse_shift_capture: configpkg.MouseShiftCapture, macos_non_native_fullscreen: configpkg.NonNativeFullscreen, macos_option_as_alt: configpkg.OptionAsAlt, + vt_kam_allowed: bool, window_padding_x: u32, window_padding_y: u32, @@ -166,6 +167,7 @@ const DerivedConfig = struct { .mouse_shift_capture = config.@"mouse-shift-capture", .macos_non_native_fullscreen = config.@"macos-non-native-fullscreen", .macos_option_as_alt = config.@"macos-option-as-alt", + .vt_kam_allowed = config.@"vt-kam-allowed", .window_padding_x = config.@"window-padding-x", .window_padding_y = config.@"window-padding-y", @@ -985,6 +987,13 @@ pub fn keyCallback( if (consumed and performed) return true; } + // If we allow KAM and KAM is enabled then we do nothing. + if (self.config.vt_kam_allowed) { + self.renderer_state.mutex.lock(); + defer self.renderer_state.mutex.unlock(); + if (self.io.terminal.modes.get(.disable_keyboard)) return true; + } + // If this input event has text, then we hide the mouse if configured. if (self.config.mouse_hide_while_typing and !self.mouse.hidden and diff --git a/src/config/Config.zig b/src/config/Config.zig index c21564f42..82733bfba 100644 --- a/src/config/Config.zig +++ b/src/config/Config.zig @@ -461,6 +461,14 @@ keybind: Keybinds = .{}, /// The default value is "16-bit". @"osc-color-report-format": OSCColorReportFormat = .@"16-bit", +/// If true, allows the "KAM" mode (ANSI mode 2) to be used within +/// the terminal. KAM disables keyboard input at the request of the +/// application. This is not a common feature and is not recommended +/// to be enabled. This will not be documented further because +/// if you know you need KAM, you know. If you don't know if you +/// need KAM, you don't need it. +@"vt-kam-allowed": bool = false, + /// If anything other than false, fullscreen mode on macOS will not use the /// native fullscreen, but make the window fullscreen without animations and /// using a new space. It's faster than the native fullscreen mode since it diff --git a/src/terminal/modes.zig b/src/terminal/modes.zig index 25a020e9d..8c49941ba 100644 --- a/src/terminal/modes.zig +++ b/src/terminal/modes.zig @@ -170,6 +170,7 @@ const ModeEntry = struct { /// valuable to redocument them all here. const entries: []const ModeEntry = &.{ // ANSI + .{ .name = "disable_keyboard", .value = 2, .ansi = true }, // KAM .{ .name = "insert", .value = 4, .ansi = true }, // DEC diff --git a/website/app/vt/modes/kam/page.mdx b/website/app/vt/modes/kam/page.mdx new file mode 100644 index 000000000..3efeca79c --- /dev/null +++ b/website/app/vt/modes/kam/page.mdx @@ -0,0 +1,28 @@ +import VTMode from "@/components/VTMode"; + +# Keyboard Action Mode (KAM) + + + +Disable all keyboard input. + +This mode is unset as part of both [full reset (RIS)](/vt/ris) +and [soft reset (DECSTR)](/vt/decstr). + +A poorly behaved terminal program can lock the terminal emulator +using this command. Terminal emulators should provide a mechanism +to reset this or outright disable it. + +## Validation + +### KAM V-1: Disable Keyboard Input + +```bash +printf "\033[1;1H" # move to top-left +printf "\033[0J" # clear screen +printf "Keyboard input is now disabled.\n" +printf "\033[2h" +sleep 5 +printf "\033[2l" +printf "Keyboard input is re-enabled.\n" +``` diff --git a/website/components/VTMode.tsx b/website/components/VTMode.tsx new file mode 100644 index 000000000..b6c690071 --- /dev/null +++ b/website/components/VTMode.tsx @@ -0,0 +1,18 @@ +export default function VTMode({ + value, + ansi = false, +}: { + value: number; + ansi: boolean; +}) { + return ( +
+
+
+ {ansi ? "?" : ""} + {value} +
+
+
+ ); +}