Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Trouble with hotkey Alt+symbols under TTY on panel (shell area) #2498

Open
Zeroes1 opened this issue Nov 11, 2024 · 26 comments
Open

Trouble with hotkey Alt+symbols under TTY on panel (shell area) #2498

Zeroes1 opened this issue Nov 11, 2024 · 26 comments

Comments

@Zeroes1
Copy link

Zeroes1 commented Nov 11, 2024

Проверен far2l_2.6.3 от 2024.11.09

При работе в TTY режиме (в GUI не проверял может и там проблема?) по SSH или без него в консоли терминала, в области Shell (панели FAR) есть проблемы с хоткеями на Alt+символы (в других областях проблем нет, с другими сочетаниями Ctrl+символы , Alt+Ctrl+символы - проблем нет )
проблема видимо была всегда.

дефолтных хоткеев на Alt+символы в панелях нет, поэтому непонятно проблема только с макросами или нет

поэтому проверяем только через макрос, например:
[KeyMacros/Shell/AltX]
DisableOutput=0x1
Sequence=F10

ситуация при SSH:

  1. Windows Terminal v1.23.3101.0
    не реагирует ни в английской раскладке, ни на русской

  2. Bitvise SSH Client v9.39
    реагирует на английском языке, на русском нет

  3. Putty original v0.81,
    реагирует на английском языке, на русском нет

  4. putty4far2l-0.78.5-dev.zip
    https://github.com/ivanshatsky/putty4far2l/releases/latest
    не реагирует ни в английской раскладке, ни на русской (странно что хуже чем в оригинальном, но там версия свежее немного)

  • @unxed делал патч к putty4far2l (в телеге пост) при английской начало реагировать, но при русской нет, патч не вошёл в релизы.

Замечу что в реализации FAR2M подобной проблемы нет (другая реализация обработки клавиш).
те FAR2M реагирует при любой раскладке, при любом клиенте SSH или без него.

@Zeroes1
Copy link
Author

Zeroes1 commented Nov 11, 2024

@unxed посмотрите может можно что то придумать...

@Zeroes1
Copy link
Author

Zeroes1 commented Nov 11, 2024

@shmuz может что то напишите к этому посту?

@Zeroes1 Zeroes1 changed the title Trouble with hotkey Alt+symbols under SSH on panel area Trouble with hotkey Alt+symbols under TTY on panel (shell area) Nov 11, 2024
@Zeroes1
Copy link
Author

Zeroes1 commented Nov 11, 2024

так проверил проблема не в SSH вообще

воспроизводится в GUI Linux режиме TTY|Xi или TTY|F

те проблема как минимум при TTY режиме, при SSH или без него.

@shmuz
Copy link
Contributor

shmuz commented Nov 11, 2024

@shmuz может что то напишите к этому посту?

На данный момент я не знаю, в чём причина разного поведения. Это надо конкретно смотреть.

@spnethw
Copy link
Contributor

spnethw commented Nov 15, 2024

Проблема воспроизводится в GUI и TTY | k / w / f.
А вот наличие-отсутствие X / Xi, похоже, никакого влияния не оказывает.

@spnethw
Copy link
Contributor

spnethw commented Nov 17, 2024

В GUI макросы на Alt+буквы отвалились после PR #2463 (точнее, после той его части, которая костыль для wxWidgets/wxWidgets#23421).
Похоже, проблему вызывает вот эта строчка:

&& (/*g_wayland ||*/ !event.AltDown() || !isLayoutDependentKey(event)) // workaround for wx issue #23421

А в TTY|k оно не работало ещё раньше. В far2m, кстати, работает.

@unxed

@unxed
Copy link
Contributor

unxed commented Nov 17, 2024

Пошаговую инструкцию по воспроизведению дайте плз

@spnethw
Copy link
Contributor

spnethw commented Nov 17, 2024

Я макросом проверяю.

[KeyMacros/Shell/AltX]
DisableOutput=0x1
NoSendKeysToPlugins=0x1
Sequence=F10

@unxed
Copy link
Contributor

unxed commented Nov 17, 2024

Раскладка клавиатуры влияет? И должна ли влиять (как на винде?)

@spnethw
Copy link
Contributor

spnethw commented Nov 17, 2024

Я чекал только со включённой английской раскладкой.

@unxed
Copy link
Contributor

unxed commented Nov 17, 2024

У меня срабатывает поиск по alt+x, это оно, да? а должно окно выхода показывать?

@unxed
Copy link
Contributor

unxed commented Nov 17, 2024

В GUI вот это помогает. Хм, а как на винде оно? Тоже юникодный символ в верхнем регистре приходит, если с альтом нажата кнопка? Потому что по-видимому фар ждёт именно этого.

diff --git a/WinPort/src/Backend/WX/wxMain.cpp b/WinPort/src/Backend/WX/wxMain.cpp
index e775bc21..3b731d59 100644
--- a/WinPort/src/Backend/WX/wxMain.cpp
+++ b/WinPort/src/Backend/WX/wxMain.cpp
@@ -1623,6 +1623,8 @@ void WinPortPanel::OnChar( wxKeyEvent& event )
 			ir.Event.KeyEvent.wVirtualScanCode = ir_tmp.Event.KeyEvent.wVirtualScanCode;
 			ir.Event.KeyEvent.dwControlKeyState = ir_tmp.Event.KeyEvent.dwControlKeyState;
 
+			ir.Event.KeyEvent.uChar.UnicodeChar = toupper(ir.Event.KeyEvent.uChar.UnicodeChar);
+
 			ir.Event.KeyEvent.dwControlKeyState |= LEFT_ALT_PRESSED;
 		}
 #endif

@unxed
Copy link
Contributor

unxed commented Nov 17, 2024

Для kitty аналогичное изменение будет выглядеть так:

diff --git a/WinPort/src/Backend/TTY/TTYInputSequenceParserExts.cpp b/WinPort/src/Backend/TTY/TTYInputSequenceParserExts.cpp
index 4938d50c..d17a955f 100644
--- a/WinPort/src/Backend/TTY/TTYInputSequenceParserExts.cpp
+++ b/WinPort/src/Backend/TTY/TTYInputSequenceParserExts.cpp
@@ -385,6 +385,24 @@ size_t TTYInputSequenceParser::TryParseAsKittyEscapeSequence(const char *s, size
 
 	ir.Event.KeyEvent.wRepeatCount = 0;
 
+	if ((ir.Event.KeyEvent.dwControlKeyState & LEFT_ALT_PRESSED) ||
+		(ir.Event.KeyEvent.dwControlKeyState & RIGHT_ALT_PRESSED)) {
+		switch (ir.Event.KeyEvent.wVirtualKeyCode) {
+			case VK_ESCAPE:
+			case VK_DELETE:
+			case VK_BACK:
+			case VK_TAB:
+			case VK_RETURN:
+			case VK_SPACE:
+				break;
+			default:
+				if (ir.Event.KeyEvent.uChar.UnicodeChar > 0) {
+					ir.Event.KeyEvent.uChar.UnicodeChar =
+						toupper(ir.Event.KeyEvent.uChar.UnicodeChar);
+				}
+		}
+	}
+
 	_ir_pending.emplace_back(ir);
 
 	if (!_using_extension) {

@spnethw
Copy link
Contributor

spnethw commented Nov 17, 2024

В GUI вот это помогает.

Да, стало срабатывать на Alt+X в английской раскладке. В русской быстрый поиск открывается.

@spnethw
Copy link
Contributor

spnethw commented Nov 17, 2024

Для kitty аналогичное изменение будет выглядеть так:

Аналогично. На Alt+X в английской раскладке теперь срабатывает (в русской — быстрый поиск).

@unxed
Copy link
Contributor

unxed commented Nov 17, 2024

Чтоб в русской работало надо кажется лезть в код самого фара, чтоб он смотрел в virtual key code, а не в unicode char. Это я не уверен что рискну сам. И ещё по-видимому надо чтоб @ivanshatsky внёс аналогичное изменение в putty4far2l, и в KiTTY PR с ним заслал.

@unxed
Copy link
Contributor

unxed commented Nov 17, 2024

У меня сегодня ретрит 🙂 чем мог помог

@spnethw
Copy link
Contributor

spnethw commented Nov 17, 2024

Чтоб в русской работало надо кажется лезть в код самого фара, чтоб он смотрел в virtual key code, а не в unicode char. Это я не уверен что рискну сам.

В far2m как-то ловится. 🤔
Видимо, там код отличается, не чекал...

@spnethw
Copy link
Contributor

spnethw commented Nov 17, 2024

У меня сегодня ретрит 🙂 чем мог помог

🐈 🐈 🐈

@unxed
Copy link
Contributor

unxed commented Nov 17, 2024

В far2m как-то ловится. 🤔

@shmuz ?

@shmuz
Copy link
Contributor

shmuz commented Nov 17, 2024

@unxed
Я ответил уже выше.

@unxed
Copy link
Contributor

unxed commented Dec 6, 2024

А мы эти фиксы в итоге закомитили? И если нет, то почему?

@unxed
Copy link
Contributor

unxed commented Dec 7, 2024

Хм, я тут сделал тестовую программку-мониторилку событий ввода винды, и там на alt+буква UnicodeChar приходит в нижнем регистре. Интересно, почему far хочет её в верхнем. Теперь вот даже не уверен что эти фиксы коммитить надо. Проблемка, кажется, где-то в другом месте.

@spnethw
Copy link
Contributor

spnethw commented Dec 7, 2024

9d4d3fe

?

@unxed
Copy link
Contributor

unxed commented Dec 7, 2024

А, вмержено, ок. Только оно не совпадает с поведением Винды, и при этом работает. Воу.

@Dazzar56 может у тебя есть идеи, почему так?

@unxed
Copy link
Contributor

unxed commented Dec 7, 2024

Поскольку неконсистентное с Виндой поведние это всё-таки подозрительно, закрывать, наверное, пока не надо. Впрочем, я поведение Винды по Wine определяю, может быть, это в нём не идеальная совместимость. Кто-нибудь может под виндой проверить?

#include <iostream>
#include <windows.h>
#include <iomanip> // Для форматирования вывода

#include <fcntl.h>
#include <io.h>

void DumpKeyEventRecord(const KEY_EVENT_RECORD &keyEvent) {
    std::cout << "KEY_EVENT_RECORD Dump:\n";
    std::cout << "  bKeyDown: " << (keyEvent.bKeyDown ? "TRUE" : "FALSE") << "\n";
    std::cout << "  wRepeatCount: " << keyEvent.wRepeatCount << "\n";
    std::cout << "  wVirtualKeyCode: " << keyEvent.wVirtualKeyCode << " (0x"
              << std::hex << keyEvent.wVirtualKeyCode << std::dec << ")\n";
    std::cout << "  wVirtualScanCode: " << keyEvent.wVirtualScanCode << " (0x"
              << std::hex << keyEvent.wVirtualScanCode << std::dec << ")\n";

    // Обработка символа
    if (keyEvent.uChar.UnicodeChar) {
        std::wcout << L"  uChar.UnicodeChar: '" << (std::iswcntrl(keyEvent.uChar.UnicodeChar) ? L' ' : keyEvent.uChar.UnicodeChar)
                   << L"' (Dec: " << (int)keyEvent.uChar.UnicodeChar
                   << L", Hex: 0x" << std::hex << (int)keyEvent.uChar.UnicodeChar
                   << std::dec << L")\n";
    } else {
        std::cout << "  uChar.UnicodeChar: N/A\n";
    }

    if (keyEvent.uChar.AsciiChar) {
        std::cout << "  uChar.AsciiChar: " << keyEvent.uChar.AsciiChar << "\n";
    }

    std::cout << "  dwControlKeyState: " << keyEvent.dwControlKeyState << " (0x"
              << std::hex << keyEvent.dwControlKeyState << std::dec << ")\n";

    // Разбор dwControlKeyState
    std::cout << "    Control Key States:\n";
    if (keyEvent.dwControlKeyState & CAPSLOCK_ON) std::cout << "      CAPSLOCK_ON\n";
    if (keyEvent.dwControlKeyState & NUMLOCK_ON) std::cout << "      NUMLOCK_ON\n";
    if (keyEvent.dwControlKeyState & SCROLLLOCK_ON) std::cout << "      SCROLLLOCK_ON\n";
    if (keyEvent.dwControlKeyState & SHIFT_PRESSED) std::cout << "      SHIFT_PRESSED\n";
    if (keyEvent.dwControlKeyState & LEFT_CTRL_PRESSED) std::cout << "      LEFT_CTRL_PRESSED\n";
    if (keyEvent.dwControlKeyState & RIGHT_CTRL_PRESSED) std::cout << "      RIGHT_CTRL_PRESSED\n";
    if (keyEvent.dwControlKeyState & LEFT_ALT_PRESSED) std::cout << "      LEFT_ALT_PRESSED\n";
    if (keyEvent.dwControlKeyState & RIGHT_ALT_PRESSED) std::cout << "      RIGHT_ALT_PRESSED\n";
    if (keyEvent.dwControlKeyState & ENHANCED_KEY) std::cout << "      ENHANCED_KEY\n";

    std::cout << "----------------------\n";
}

int main() {
    HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE);
    if (hInput == INVALID_HANDLE_VALUE) {
        std::cerr << "Failed to get input handle.\n";
        return 1;
    }

    // Настройка режима консоли для получения событий
    DWORD mode;
//    GetConsoleMode(hInput, &mode);
//    SetConsoleMode(hInput, mode & ~(ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT));

    std::cout << "Monitoring console keyboard events. Press 'Esc' to exit.\n";

    INPUT_RECORD inputRecord;
    DWORD eventsRead;

    while (true) {
        // Чтение событий консоли
        if (ReadConsoleInput(hInput, &inputRecord, 1, &eventsRead) && eventsRead > 0) {
            if (inputRecord.EventType == KEY_EVENT) {
                KEY_EVENT_RECORD keyEvent = inputRecord.Event.KeyEvent;

                // Вывод информации о событии
                DumpKeyEventRecord(keyEvent);

                // Завершение программы при нажатии Esc
                if (keyEvent.wVirtualKeyCode == VK_ESCAPE && keyEvent.bKeyDown) {
                    std::cout << "Exiting...\n";
                    break;
                }
            }
        }
    }

    return 0;
}

Я у себя в Mint 22 собираю и запускаю так:

x86_64-w64-mingw32-g++ -static -o keyboard_events.exe keyboard_events.cpp -luser32 -lkernel32
wineconsole keyboard_events.exe

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants