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

В режиме tty не работает gray + #1140

Closed
Katarn opened this issue Dec 6, 2021 · 13 comments
Closed

В режиме tty не работает gray + #1140

Katarn opened this issue Dec 6, 2021 · 13 comments

Comments

@Katarn
Copy link

Katarn commented Dec 6, 2021

Но работает в графическом режиме. Вместо открытия диалогового окна выбора файлов по маске, символ + вводится в командную строку.

Также не работают - и *.

Терминалы, в которых проверял - xterm, konsole.
Версия far2l - актуальная, собранная из git.

Возможно связано с
#1101
#1126

@dayfuaim
Copy link

dayfuaim commented Dec 7, 2021

Подтверждаю.
Не работают ни +, ни , ни *.

Ubuntu 21.10 (Wayland session).
far2l из ppa: http://ppa.launchpad.net/far2l-team/ppa/ubuntu

@elfmz
Copy link
Owner

elfmz commented Dec 7, 2021

В терминале они неотличимы, есть определенные идеи как это пофиксить, по сути эти идеи сводятся к юзанию X11 при его наличии. Идеи да, обсуждались вот тут - #1126

@Katarn
Copy link
Author

Katarn commented Dec 7, 2021

В терминале они неотличимы

Но при этом в Midnight Commander они работают - как в терминале под X, так и без него. Может там подсмотреть?

@elfmz
Copy link
Owner

elfmz commented Dec 7, 2021

В миднайте плюсик работает всегда на выделение независимо от того в нампаде ли он нажат или обычный плюсик. НО есть зависимость от наличия чегото в командлайне - если он не пустой, то плюсик печатается в командлайн. Опять же, вне зависимости какой конкретно это плюсик.

@unxed
Copy link
Contributor

unxed commented Dec 19, 2021

Вот готовое исправление — по крайней мере, для случаев, когда мы в терминалке, работающей под иксами. Заодно Ctrl[+Shift]+цифры чинит тоже.

diff --git a/WinPort/src/Backend/TTY/TTYBackend.cpp b/WinPort/src/Backend/TTY/TTYBackend.cpp
index 7d3402a8..5114432f 100644
--- a/WinPort/src/Backend/TTY/TTYBackend.cpp
+++ b/WinPort/src/Backend/TTY/TTYBackend.cpp
@@ -190,6 +190,21 @@ void TTYBackend::ReaderLoop()
 
 		int rs;
 
+        #define DIGIT_KEY                        0x4000 // digit key pressed
+        DWORD cks = OnQueryControlKeys();
+        bool ctrlFlag = false;
+    	if (_ttyx) {
+            if ((cks & RIGHT_CTRL_PRESSED) ||
+                (cks & LEFT_CTRL_PRESSED))
+            {
+                if (cks & DIGIT_KEY) {
+                    // Ctrl+digit in ttyx mode - no need to wait for escape sequence
+
+        			tty_in->OnIdleExpired();
+                }
+            }
+        }
+
 		if (!idle_expired && _esc_expiration > 0 && !_far2l_tty) {
 			struct timeval tv;
 			tv.tv_sec = _esc_expiration / 1000;
diff --git a/WinPort/src/Backend/TTY/TTYInput.cpp b/WinPort/src/Backend/TTY/TTYInput.cpp
index 2089a081..4e56b3e4 100644
--- a/WinPort/src/Backend/TTY/TTYInput.cpp
+++ b/WinPort/src/Backend/TTY/TTYInput.cpp
@@ -36,6 +36,8 @@ static WORD WChar2WinVKeyCode(WCHAR wc)
 		case L'*': return '8';
 		case L'(': return '9';
 		case L')': return '0';
+        case 30: return '6'; // For Ctrl+6
+        case 31: return '7'; // For Ctrl+7
 	}
 	fprintf(stderr, "%s: not translated %u '%lc'\n", __FUNCTION__, (unsigned int)wc, wc);
 	return VK_UNASSIGNED;
@@ -64,6 +66,13 @@ void TTYInput::PostCharEvent(wchar_t ch)
 		ir.Event.KeyEvent.wVirtualKeyCode = VK_UNASSIGNED;
 	}
 
+    #define KEYPAD_KEY                       0x8000 // the key is from numeric keypad
+    if (ir.Event.KeyEvent.dwControlKeyState & KEYPAD_KEY) {
+        if (ch == '+') { ir.Event.KeyEvent.wVirtualKeyCode = VK_ADD; }
+        if (ch == '-') { ir.Event.KeyEvent.wVirtualKeyCode = VK_SUBTRACT; }
+        if (ch == '*') { ir.Event.KeyEvent.wVirtualKeyCode = VK_MULTIPLY; }
+    }
+
 	ir.Event.KeyEvent.bKeyDown = TRUE;
 	g_winport_con_in->Enqueue(&ir, 1);
 	ir.Event.KeyEvent.bKeyDown = FALSE;
diff --git a/WinPort/src/Backend/TTY/TTYInputSequenceParser.cpp b/WinPort/src/Backend/TTY/TTYInputSequenceParser.cpp
index 4f63f0d2..78986bf8 100644
--- a/WinPort/src/Backend/TTY/TTYInputSequenceParser.cpp
+++ b/WinPort/src/Backend/TTY/TTYInputSequenceParser.cpp
@@ -365,6 +365,7 @@ size_t TTYInputSequenceParser::ParseIntoPending(const char *s, size_t l)
 
 	switch (*s) {
 		case 0x1b: {
+
 			if (l > 2 && s[1] == 0x1b) {
 				_extra_control_keys = LEFT_ALT_PRESSED;
 				size_t r = ParseEscapeSequence(s + 2, l - 2);
@@ -467,6 +468,7 @@ void TTYInputSequenceParser::AddPendingKeyEvent(const TTYInputKey &k)
 	{
 		ir.Event.KeyEvent.uChar.UnicodeChar = L' ';
 	}
+
 	ir.Event.KeyEvent.wVirtualKeyCode = k.vk;
 	ir.Event.KeyEvent.dwControlKeyState = k.control_keys | _extra_control_keys;
 	ir.Event.KeyEvent.wVirtualScanCode = WINPORT(MapVirtualKey)(k.vk,MAPVK_VK_TO_VSC);
@@ -475,10 +477,31 @@ void TTYInputSequenceParser::AddPendingKeyEvent(const TTYInputKey &k)
 	if (_handler)
 		ir.Event.KeyEvent.dwControlKeyState|= _handler->OnQueryControlKeys();
 
+    #define DIGIT_KEY                        0x4000 // digit key pressed
+
+	if (_handler) { // Ctrl[+Shift]+1..9 support in ttyx mode
+        if ((ir.Event.KeyEvent.dwControlKeyState & RIGHT_CTRL_PRESSED) ||
+            (ir.Event.KeyEvent.dwControlKeyState & LEFT_CTRL_PRESSED))
+        {
+            	if (k.vk == 0x20) { ir.Event.KeyEvent.wVirtualKeyCode = 0x32; }
+                if (ir.Event.KeyEvent.dwControlKeyState & DIGIT_KEY) {
+                	if (k.vk == 0x1b) { ir.Event.KeyEvent.wVirtualKeyCode = 0x33; }
+                	if (k.vk == 0xdc) { ir.Event.KeyEvent.wVirtualKeyCode = 0x34; }
+                	if (k.vk == 0xdd) { ir.Event.KeyEvent.wVirtualKeyCode = 0x35; }
+                }
+            	//if (k.vk == 0x30) { ir.Event.KeyEvent.wVirtualKeyCode = 0x36; }
+            	//if (k.vk == 0x31) { ir.Event.KeyEvent.wVirtualKeyCode = 0x37; }
+            	if (k.vk == 0x08) { ir.Event.KeyEvent.wVirtualKeyCode = 0x38; }
+            	//ir.Event.KeyEvent.wVirtualScanCode = WINPORT(MapVirtualKey)(ir.Event.KeyEvent.wVirtualKeyCode,
+                //    MAPVK_VK_TO_VSC);
+        }
+    }                    
+
 	ir.Event.KeyEvent.bKeyDown = TRUE;
 	_ir_pending.emplace_back(ir); // g_winport_con_in->Enqueue(&ir, 1);
 	ir.Event.KeyEvent.bKeyDown = FALSE;
 	_ir_pending.emplace_back(ir); // g_winport_con_in->Enqueue(&ir, 1);
+
 }
 
 void TTYInputSequenceParser::ParseMouse(char action, char col, char raw)
diff --git a/WinPort/src/Backend/TTY/TTYX/TTYX.cpp b/WinPort/src/Backend/TTY/TTYX/TTYX.cpp
index 1bb850a7..ae6e590c 100644
--- a/WinPort/src/Backend/TTY/TTYX/TTYX.cpp
+++ b/WinPort/src/Backend/TTY/TTYX/TTYX.cpp
@@ -201,7 +201,49 @@ public:
 		XQueryPointer (_display, _root_window, &root, &child,
 				&root_x, &root_y, &win_x, &win_y, &mods);
 
+        #define XK_KP_Multiply                   0xffaa
+        #define XK_KP_Add                        0xffab
+        #define XK_KP_Subtract                   0xffad
+
+        #define DIGIT_KEY                        0x4000 // digit key pressed
+        #define KEYPAD_KEY                       0x8000 // the key is from numeric keypad
+
+        char keys_return[32];
+        XQueryKeymap( _display, keys_return );
+
+        bool KP = false;
+        KeyCode kc2;
+
+        kc2 = XKeysymToKeycode( _display, XK_KP_Multiply );
+        KP = !!( keys_return[ kc2>>3 ] & ( 1<<(kc2&7) ) );
+
+        kc2 = XKeysymToKeycode( _display, XK_KP_Add );
+        KP = KP || !!( keys_return[ kc2>>3 ] & ( 1<<(kc2&7) ) );
+
+        kc2 = XKeysymToKeycode( _display, XK_KP_Subtract );
+        KP = KP || !!( keys_return[ kc2>>3 ] & ( 1<<(kc2&7) ) );
+
+        //fprintf(stderr, "KP key is %spressed\n", KP ? "" : "not ");
+
 		DWORD out = 0;
+
+        if (KP) { out|= KEYPAD_KEY; }
+
+        #define XK_Control_R                     0xffe4  /* Right control */
+        kc2 = XKeysymToKeycode( _display, XK_Control_R );
+        if (!!( keys_return[ kc2>>3 ] & ( 1<<(kc2&7) ) )) {
+            out|= RIGHT_CTRL_PRESSED;
+        }
+
+        KP = false;
+        int cnt;
+        for (cnt=30; cnt<40; cnt++) { // XK_0 .. XK_9
+            kc2 = XKeysymToKeycode( _display, cnt);
+            KP = KP || !!( keys_return[ kc2>>3 ] & ( 1<<(kc2&7) ) );
+        }
+
+        if (KP) { out|= DIGIT_KEY; }
+
 		if ((mods & ShiftMask) != 0)
 			out|= SHIFT_PRESSED;
 		if ((mods & LockMask) != 0)

@unxed
Copy link
Contributor

unxed commented Dec 19, 2021

добавил небольшой апдейт к патчику, позволяющий различать Ctrl+\ и Ctrl+4 etc

@unxed
Copy link
Contributor

unxed commented Dec 20, 2021

ещё немного допилил патчик - Ctrl+3 не всегда срабатывала

@unxed
Copy link
Contributor

unxed commented Dec 20, 2021

Четвертая версия патчика — в прошлой Ctrl+3 всё ещё срабатывали нестабильно, теперь зато полный порядок. И Ctrl+ESC перестал вести себя как Ctrl+3 заодно.

Вероятно, все подобные хаки по борьбе с терминалками (как --ee или вот этот хак для контрол-цифр например) надо делать отключаемыми и делать отдельный диалог в настройках, где прям галками можно было бы ставить, какие из них нужны, а какие нет.

@elfmz
Copy link
Owner

elfmz commented Dec 20, 2021

--nodetect выключает его
мне этот хак не оч нравится так как будет жестко глючить при сетевых задержках превышающий хоп до соседнего компьютера - время держания кнопки нажатой - думаю порядка сотни мсек.
И еще все эти клиент-серверные взаимодействия увеличивают время отклика на нажатие кнопки.
Так что имхо лучше уж весь инпут на базе хуков сделать...

@unxed
Copy link
Contributor

unxed commented Dec 20, 2021

Проверил на мобильном инете, причем с медленным сервером на Atom'е. И правда поглюкивало иногда. Переписал так, чтоб число «дёрганий» иксов стало не больше, чем в master'е. Стало вполне юзабельно. Там была пачка совершенно избыточных раундтрипов, ну прототип же :)

diff --git a/WinPort/src/Backend/TTY/TTYBackend.cpp b/WinPort/src/Backend/TTY/TTYBackend.cpp
index 7d3402a8..c853aa5a 100644
--- a/WinPort/src/Backend/TTY/TTYBackend.cpp
+++ b/WinPort/src/Backend/TTY/TTYBackend.cpp
@@ -190,6 +190,22 @@ void TTYBackend::ReaderLoop()
 
 		int rs;
 
+        #define DIGIT_KEY                        0x4000 // digit key pressed
+    	if (_ttyx && !tty_in->BufIsEmpty()) {
+
+            DWORD cks = OnQueryControlKeys();
+
+            if ((cks & RIGHT_CTRL_PRESSED) ||
+                (cks & LEFT_CTRL_PRESSED))
+            {
+                if (cks & DIGIT_KEY) {
+                    // Ctrl+digit in ttyx mode - no need to wait for escape sequence
+
+        			tty_in->OnIdleExpired();
+                }
+            }
+        }
+
 		if (!idle_expired && _esc_expiration > 0 && !_far2l_tty) {
 			struct timeval tv;
 			tv.tv_sec = _esc_expiration / 1000;
diff --git a/WinPort/src/Backend/TTY/TTYInput.cpp b/WinPort/src/Backend/TTY/TTYInput.cpp
index 2089a081..b0ceccde 100644
--- a/WinPort/src/Backend/TTY/TTYInput.cpp
+++ b/WinPort/src/Backend/TTY/TTYInput.cpp
@@ -36,6 +36,8 @@ static WORD WChar2WinVKeyCode(WCHAR wc)
 		case L'*': return '8';
 		case L'(': return '9';
 		case L')': return '0';
+        case 30: return '6'; // For Ctrl+6
+        case 31: return '7'; // For Ctrl+7
 	}
 	fprintf(stderr, "%s: not translated %u '%lc'\n", __FUNCTION__, (unsigned int)wc, wc);
 	return VK_UNASSIGNED;
@@ -64,6 +66,13 @@ void TTYInput::PostCharEvent(wchar_t ch)
 		ir.Event.KeyEvent.wVirtualKeyCode = VK_UNASSIGNED;
 	}
 
+    #define KEYPAD_KEY                       0x8000 // the key is from numeric keypad
+    if (ir.Event.KeyEvent.dwControlKeyState & KEYPAD_KEY) {
+        if (ch == '+') { ir.Event.KeyEvent.wVirtualKeyCode = VK_ADD; }
+        if (ch == '-') { ir.Event.KeyEvent.wVirtualKeyCode = VK_SUBTRACT; }
+        if (ch == '*') { ir.Event.KeyEvent.wVirtualKeyCode = VK_MULTIPLY; }
+    }
+
 	ir.Event.KeyEvent.bKeyDown = TRUE;
 	g_winport_con_in->Enqueue(&ir, 1);
 	ir.Event.KeyEvent.bKeyDown = FALSE;
@@ -137,3 +146,8 @@ void TTYInput::OnIdleExpired()
 		_handler->OnInputBroken();
 	}
 }
+
+bool TTYInput::BufIsEmpty()
+{
+	return _buf.empty();
+}
diff --git a/WinPort/src/Backend/TTY/TTYInput.h b/WinPort/src/Backend/TTY/TTYInput.h
index 4e9b1fe2..12b3134c 100644
--- a/WinPort/src/Backend/TTY/TTYInput.h
+++ b/WinPort/src/Backend/TTY/TTYInput.h
@@ -22,4 +22,5 @@ public:
 	TTYInput(ITTYInputSpecialSequenceHandler *handler);
 	void OnInput(const char *data, size_t len);
 	void OnIdleExpired();
+    bool BufIsEmpty();
 };
diff --git a/WinPort/src/Backend/TTY/TTYInputSequenceParser.cpp b/WinPort/src/Backend/TTY/TTYInputSequenceParser.cpp
index 4f63f0d2..198e50db 100644
--- a/WinPort/src/Backend/TTY/TTYInputSequenceParser.cpp
+++ b/WinPort/src/Backend/TTY/TTYInputSequenceParser.cpp
@@ -365,6 +365,7 @@ size_t TTYInputSequenceParser::ParseIntoPending(const char *s, size_t l)
 
 	switch (*s) {
 		case 0x1b: {
+
 			if (l > 2 && s[1] == 0x1b) {
 				_extra_control_keys = LEFT_ALT_PRESSED;
 				size_t r = ParseEscapeSequence(s + 2, l - 2);
@@ -467,6 +468,7 @@ void TTYInputSequenceParser::AddPendingKeyEvent(const TTYInputKey &k)
 	{
 		ir.Event.KeyEvent.uChar.UnicodeChar = L' ';
 	}
+
 	ir.Event.KeyEvent.wVirtualKeyCode = k.vk;
 	ir.Event.KeyEvent.dwControlKeyState = k.control_keys | _extra_control_keys;
 	ir.Event.KeyEvent.wVirtualScanCode = WINPORT(MapVirtualKey)(k.vk,MAPVK_VK_TO_VSC);
@@ -475,10 +477,32 @@ void TTYInputSequenceParser::AddPendingKeyEvent(const TTYInputKey &k)
 	if (_handler)
 		ir.Event.KeyEvent.dwControlKeyState|= _handler->OnQueryControlKeys();
 
+    #define DIGIT_KEY                        0x4000 // digit key pressed
+
+	if (_handler) { // Ctrl[+Shift]+1..9 support in ttyx mode
+        if ((ir.Event.KeyEvent.dwControlKeyState & RIGHT_CTRL_PRESSED) ||
+            (ir.Event.KeyEvent.dwControlKeyState & LEFT_CTRL_PRESSED))
+        {
+                if (ir.Event.KeyEvent.dwControlKeyState & DIGIT_KEY) {
+                	if (k.vk == 0x20) { ir.Event.KeyEvent.wVirtualKeyCode = 0x32; }
+
+                	if (k.vk == 0x1b) { ir.Event.KeyEvent.wVirtualKeyCode = 0x33; }
+                	if (k.vk == 0xdc) { ir.Event.KeyEvent.wVirtualKeyCode = 0x34; }
+                	if (k.vk == 0xdd) { ir.Event.KeyEvent.wVirtualKeyCode = 0x35; }
+
+                	if (k.vk == 0x08) { ir.Event.KeyEvent.wVirtualKeyCode = 0x38; }
+                }
+
+            	//if (k.vk == 0x30) { ir.Event.KeyEvent.wVirtualKeyCode = 0x36; }
+            	//if (k.vk == 0x31) { ir.Event.KeyEvent.wVirtualKeyCode = 0x37; }
+        }
+    }                    
+
 	ir.Event.KeyEvent.bKeyDown = TRUE;
 	_ir_pending.emplace_back(ir); // g_winport_con_in->Enqueue(&ir, 1);
 	ir.Event.KeyEvent.bKeyDown = FALSE;
 	_ir_pending.emplace_back(ir); // g_winport_con_in->Enqueue(&ir, 1);
+
 }
 
 void TTYInputSequenceParser::ParseMouse(char action, char col, char raw)
diff --git a/WinPort/src/Backend/TTY/TTYX/TTYX.cpp b/WinPort/src/Backend/TTY/TTYX/TTYX.cpp
index 1bb850a7..b349c1b2 100644
--- a/WinPort/src/Backend/TTY/TTYX/TTYX.cpp
+++ b/WinPort/src/Backend/TTY/TTYX/TTYX.cpp
@@ -191,6 +191,13 @@ public:
 		XCloseDisplay(_display);
 	}
 
+    KeyCode XKsToKcWrapper(Display *d, WORD ks) {
+        if (!KeyCodeCache[ks]) {
+            KeyCodeCache[ks] = XKeysymToKeycode(d, ks);
+        }
+        return KeyCodeCache[ks];
+    }
+
 	DWORD GetModifiers()
 	{
 		Window root, child;
@@ -198,20 +205,97 @@ public:
 		int win_x, win_y;
 		unsigned int mods = 0;
 
-		XQueryPointer (_display, _root_window, &root, &child,
-				&root_x, &root_y, &win_x, &win_y, &mods);
+		//XQueryPointer (_display, _root_window, &root, &child,
+		//		&root_x, &root_y, &win_x, &win_y, &mods);
+
+        #define XK_KP_Multiply                   0xffaa
+        #define XK_KP_Add                        0xffab
+        #define XK_KP_Subtract                   0xffad
+
+        #define DIGIT_KEY                        0x4000 // digit key pressed
+        #define KEYPAD_KEY                       0x8000 // the key is from numeric keypad
+
+        char keys_return[32];
+        XQueryKeymap( _display, keys_return );
+
+        bool KP = false;
+        KeyCode kc2;
+
+        kc2 = XKsToKcWrapper( _display, XK_KP_Multiply );
+        KP = !!( keys_return[ kc2>>3 ] & ( 1<<(kc2&7) ) );
+
+        kc2 = XKsToKcWrapper( _display, XK_KP_Add );
+        KP = KP || !!( keys_return[ kc2>>3 ] & ( 1<<(kc2&7) ) );
+
+        kc2 = XKsToKcWrapper( _display, XK_KP_Subtract );
+        KP = KP || !!( keys_return[ kc2>>3 ] & ( 1<<(kc2&7) ) );
+
+        //fprintf(stderr, "KP key is %spressed\n", KP ? "" : "not ");
 
 		DWORD out = 0;
-		if ((mods & ShiftMask) != 0)
-			out|= SHIFT_PRESSED;
+
+        if (KP) { out|= KEYPAD_KEY; }
+
+        KP = false;
+        int cnt;
+        for (cnt=0x30; cnt<0x40; cnt++) { // XK_0 .. XK_9 // 
+            kc2 = XKsToKcWrapper( _display, cnt);
+            KP = KP || !!( keys_return[ kc2>>3 ] & ( 1<<(kc2&7) ) );
+        }
+
+        if (KP) { out|= DIGIT_KEY; }
+
+        #define XK_Control_L                     0xffe3  /* Right control */
+        kc2 = XKsToKcWrapper( _display, XK_Control_L );
+        if (!!( keys_return[ kc2>>3 ] & ( 1<<(kc2&7) ) )) {
+            out|= LEFT_CTRL_PRESSED;
+        }
+
+        #define XK_Control_R                     0xffe4  /* Right control */
+        kc2 = XKsToKcWrapper( _display, XK_Control_R );
+        if (!!( keys_return[ kc2>>3 ] & ( 1<<(kc2&7) ) )) {
+            out|= RIGHT_CTRL_PRESSED;
+        }
+
+        #define XK_Alt_L                         0xffe9  /* Left alt */
+        kc2 = XKsToKcWrapper( _display, XK_Alt_L );
+        if (!!( keys_return[ kc2>>3 ] & ( 1<<(kc2&7) ) )) {
+            out|= LEFT_ALT_PRESSED;
+        }
+
+        #define XK_Alt_R                         0xffea  /* Right alt */
+        kc2 = XKsToKcWrapper( _display, XK_Alt_R );
+        if (!!( keys_return[ kc2>>3 ] & ( 1<<(kc2&7) ) )) {
+            out|= RIGHT_ALT_PRESSED;
+        }
+
+        #define XK_Shift_L                       0xffe1  /* Left shift */
+        kc2 = XKsToKcWrapper( _display, XK_Shift_L );
+        if (!!( keys_return[ kc2>>3 ] & ( 1<<(kc2&7) ) )) {
+            out|= SHIFT_PRESSED;
+        }
+
+        #define XK_Shift_R                       0xffe2  /* Right shift */
+        kc2 = XKsToKcWrapper( _display, XK_Shift_R );
+        if (!!( keys_return[ kc2>>3 ] & ( 1<<(kc2&7) ) )) {
+            out|= SHIFT_PRESSED;
+        }
+
+
+        /*
+        // тут так не прокатит, но я так и не понял, где это используется
 		if ((mods & LockMask) != 0)
 			out|= NUMLOCK_ON;
-		if ((mods & ControlMask) != 0)
-			out|= LEFT_CTRL_PRESSED;
-		if ((mods & Mod1Mask) != 0)
-			out|= LEFT_ALT_PRESSED;
-		if ((mods & Mod5Mask) != 0)
-			out|= RIGHT_ALT_PRESSED;
+        */
+
+		//if ((mods & ShiftMask) != 0)
+		//	out|= SHIFT_PRESSED;
+		//if ((mods & ControlMask) != 0)
+		//	out|= LEFT_CTRL_PRESSED;
+		//if ((mods & Mod1Mask) != 0)
+		//	out|= LEFT_ALT_PRESSED;
+		//if ((mods & Mod5Mask) != 0)
+		//	out|= RIGHT_ALT_PRESSED;
 		return out;
 	}
 
diff --git a/WinPort/src/Backend/TTY/TTYX/TTYX.h b/WinPort/src/Backend/TTY/TTYX/TTYX.h
index 5b05ef7d..fa4fe807 100644
--- a/WinPort/src/Backend/TTY/TTYX/TTYX.h
+++ b/WinPort/src/Backend/TTY/TTYX/TTYX.h
@@ -2,6 +2,8 @@
 #include <string>
 #include "PipeIPC.h"
 
+#include <X11/Xlib.h>
+
 enum IPCCommand
 {
 	IPC_INIT = 0xFACE0001, // increment if protocol changed
@@ -13,3 +15,5 @@ enum IPCCommand
 };
 
 typedef PipeIPCEndpoint<IPCCommand> IPCEndpoint;
+
+KeyCode KeyCodeCache[65536] = {0};

@unxed
Copy link
Contributor

unxed commented Dec 21, 2021

На таком инете, на котором даже эта версия начнёт глючить, комфортная удаленная работа с far2l будет затруднительна в любом случае. А весь инпут на базе хуков было бы круто, да. Мне такое пока слооожно :)

А вообще кому будут мешать задержки, тот может ходить на удаленные компы изнутри локального ttyx far2l и клава будет работать через экстеншны, вот :) Будет тот же far2l в той же любимой терминалке. Можно даже в принципе сделать настройку «отключать этот хак, если DISPLAY не :0», т.е. три варианта: хак включен, хак выключен, хак включен только для локальной машины (по умолчанию, и тут же хелп про экстеншны).

@elfmz elfmz closed this as completed in 98cc172 Dec 26, 2021
@Katarn
Copy link
Author

Katarn commented Jan 6, 2022

Спасибо, работает!

@unxed
Copy link
Contributor

unxed commented Jan 7, 2022

В миднайте плюсик работает всегда на выделение независимо от того в нампаде ли он нажат или обычный плюсик. НО есть зависимость от наличия чегото в командлайне - если он не пустой, то плюсик печатается в командлайн. Опять же, вне зависимости какой конкретно это плюсик.

А почему бы нам, кстати, не делать так же, если бэкенд — «голый» tty без Xi?

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