diff --git a/src/modules/eterm/src/eterm/terminal/terminalemulator.cpp b/src/modules/eterm/src/eterm/terminal/terminalemulator.cpp index d5f0a183b..f07b83472 100644 --- a/src/modules/eterm/src/eterm/terminal/terminalemulator.cpp +++ b/src/modules/eterm/src/eterm/terminal/terminalemulator.cpp @@ -1228,15 +1228,19 @@ void TerminalEmulator::keyEvent( const KittyKeyEvent& event ) { } const Uint32 modifiers = keyboardSanitizeMod( event.modifiers ); - auto writeMapped = [this, modifiers]( const auto& entries ) { + const auto dpy = mDpy.lock(); + const bool appKeypad = dpy && dpy->getMode( MODE_APPKEYPAD ); + const bool numLock = dpy && dpy->getMode( MODE_NUMLOCK ); + const bool appCursor = dpy && dpy->getMode( MODE_APPCURSOR ); + auto writeMapped = [this, modifiers, appKeypad, numLock, appCursor]( const auto& entries ) { for ( const auto& entry : entries ) { if ( entry.mask != KEYMOD_CTRL_SHIFT_ALT_META && entry.mask != modifiers ) continue; - if ( IS_SET( MODE_APPKEYPAD ) ? entry.appkey < 0 : entry.appkey > 0 ) + if ( appKeypad ? entry.appkey < 0 : entry.appkey > 0 ) continue; - if ( IS_SET( MODE_NUMLOCK ) && entry.appkey == 2 ) + if ( numLock && entry.appkey == 2 ) continue; - if ( IS_SET( MODE_APPCURSOR ) ? entry.appcursor < 0 : entry.appcursor > 0 ) + if ( appCursor ? entry.appcursor < 0 : entry.appcursor > 0 ) continue; if ( !entry.string.empty() ) { ttywrite( entry.string.data(), entry.string.size(), 1 ); diff --git a/src/tests/unit_tests/eterm_tests.cpp b/src/tests/unit_tests/eterm_tests.cpp index 9a641c47f..e18d4622e 100644 --- a/src/tests/unit_tests/eterm_tests.cpp +++ b/src/tests/unit_tests/eterm_tests.cpp @@ -1103,6 +1103,22 @@ UTEST( eterm, kitty_modifier_key_does_not_scroll_to_bottom ) { EXPECT_EQ( 0, term->scrollPos() ); } +UTEST( eterm, application_cursor_keys_are_written_to_pty ) { + auto pty = std::make_unique(); + pty->mBuffer = "\033[?1h"; + pty->mLoopWrites = false; + MockPty* ptyPtr = pty.get(); + auto process = std::make_unique(); + auto display = std::make_shared(); + auto term = TerminalEmulator::create( std::move( pty ), std::move( process ), display, 100 ); + term->update(); + + term->keyEvent( { KEY_UP, SCANCODE_UP, 0, KEYMOD_NONE, KittyKeyEventType::Press } ); + term->keyEvent( { KEY_DOWN, SCANCODE_DOWN, 0, KEYMOD_NONE, KittyKeyEventType::Press } ); + + EXPECT_STDSTREQ( "\033OA\033OB", ptyPtr->mWrites ); +} + UTEST( eterm, kitty_keyboard_protocol_preserves_altgr_text ) { auto pty = std::make_unique(); pty->mBuffer = "\033[>15u";