diff --git a/gui/widgets/terminal_widget.py b/gui/widgets/terminal_widget.py index 18cdf8c..9e23dc1 100644 --- a/gui/widgets/terminal_widget.py +++ b/gui/widgets/terminal_widget.py @@ -712,6 +712,7 @@ class TerminalWidget(tk.Frame): return "break" # ── Ctrl+Key by keycode — works with any keyboard layout ── + # Physical keycodes for Ctrl+key (layout-independent, works with Russian etc.) _CTRL_KEYCODE_MAP = { 67: '_on_ctrl_c', # C 86: '_on_ctrl_v', # V @@ -720,6 +721,32 @@ class TerminalWidget(tk.Frame): 90: '_on_ctrl_z', # Z } + # Physical keycodes → Ctrl byte: handles keys NOT in _CTRL_KEYCODE_MAP + # so that Ctrl+S, Ctrl+Q, Ctrl+A etc. work with any keyboard layout + _CTRL_KEYCODE_BYTE = { + 65: b"\x01", # A + 66: b"\x02", # B + 69: b"\x05", # E + 70: b"\x06", # F + 71: b"\x07", # G + 72: b"\x08", # H + 73: b"\x09", # I + 74: b"\x0a", # J + 75: b"\x0b", # K + 77: b"\x0d", # M + 78: b"\x0e", # N + 79: b"\x0f", # O + 80: b"\x10", # P + 81: b"\x11", # Q (XON) + 82: b"\x12", # R + 83: b"\x13", # S (XOFF / save in nano) + 84: b"\x14", # T + 85: b"\x15", # U + 87: b"\x17", # W + 88: b"\x18", # X + 89: b"\x19", # Y + } + def _on_ctrl_key(self, event): """Route Ctrl+key by physical keycode (layout-independent).""" if not self._keyboard_enabled: @@ -732,6 +759,12 @@ class TerminalWidget(tk.Frame): if event.state & 0x1 and event.keycode == 86: return self._on_ctrl_v(event) return getattr(self, handler_name)(event) + # Fallback: send Ctrl+byte for keys not handled above (e.g. Ctrl+S, Ctrl+Q) + # This ensures shortcuts work with any keyboard layout (Russian, etc.) + ctrl_byte = self._CTRL_KEYCODE_BYTE.get(event.keycode) + if ctrl_byte: + self._send(ctrl_byte) + return "break" return None # let other bindings handle it # ── Ctrl+C: copy or SIGINT (double-press within 1.5s) ── diff --git a/releases/ServerManager-v1.8.92-win-x64.exe b/releases/ServerManager-v1.8.92-win-x64.exe new file mode 100644 index 0000000..f6910a5 Binary files /dev/null and b/releases/ServerManager-v1.8.92-win-x64.exe differ diff --git a/version.py b/version.py index 697b555..c671410 100755 --- a/version.py +++ b/version.py @@ -1,6 +1,6 @@ """Version info for ServerManager.""" -__version__ = "1.8.91" +__version__ = "1.8.92" __app_name__ = "ServerManager" __author__ = "aibot777" __description__ = "Desktop GUI for managing remote servers"