diff --git a/gui/widgets/terminal_widget.py b/gui/widgets/terminal_widget.py index b6d381b..ed0a969 100644 --- a/gui/widgets/terminal_widget.py +++ b/gui/widgets/terminal_widget.py @@ -224,14 +224,8 @@ class TerminalWidget(tk.Frame): self._text.bind("", self._on_copy) self._text.bind("", self._on_ctrl_v) self._text.bind("<>", lambda e: "break") - # Russian keyboard layout: Cyrillic equivalents (Windows) - self._text.bind("", self._on_ctrl_c) # с - self._text.bind("", self._on_ctrl_v) # м (Ctrl+V → м) - self._text.bind("", self._on_ctrl_d) # в (Ctrl+D → в) - self._text.bind("", self._on_ctrl_l) # д (Ctrl+L → д) - self._text.bind("", self._on_ctrl_z) # я (Ctrl+Z → я) - self._text.bind("", self._on_copy) # С (Shift) - self._text.bind("", self._on_ctrl_v) # М (Shift) + # Handle Ctrl+key by keycode — works with ANY keyboard layout + self._text.bind("", self._on_ctrl_key) # ── Mouse bindings ── self._text.bind("", self._on_mouse_press) @@ -703,6 +697,27 @@ class TerminalWidget(tk.Frame): return "break" + # ── Ctrl+Key by keycode — works with any keyboard layout ── + _CTRL_KEYCODE_MAP = { + 67: '_on_ctrl_c', # C + 86: '_on_ctrl_v', # V + 68: '_on_ctrl_d', # D + 76: '_on_ctrl_l', # L + 90: '_on_ctrl_z', # Z + } + + def _on_ctrl_key(self, event): + """Route Ctrl+key by physical keycode (layout-independent).""" + handler_name = self._CTRL_KEYCODE_MAP.get(event.keycode) + if handler_name: + # Check if Shift is also held + if event.state & 0x1 and event.keycode == 67: + return self._on_copy(event) + if event.state & 0x1 and event.keycode == 86: + return self._on_ctrl_v(event) + return getattr(self, handler_name)(event) + return None # let other bindings handle it + # ── Ctrl+C: copy or SIGINT (double-press within 1.5s) ── def _on_ctrl_c(self, event): if event.state & 0x1: # Shift held → Ctrl+Shift+C → copy diff --git a/releases/ServerManager-v1.8.7-win-x64.exe b/releases/ServerManager-v1.8.7-win-x64.exe index 22bd2cc..ddff4be 100644 Binary files a/releases/ServerManager-v1.8.7-win-x64.exe and b/releases/ServerManager-v1.8.7-win-x64.exe differ