\brief Get interactive input with arrow key support
| 97 | |
| 98 | /// \brief Get interactive input with arrow key support |
| 99 | std::string CLIWide::get_interactive_input() { |
| 100 | InputState state; |
| 101 | state.lines.push_back(""); // Start with one empty line |
| 102 | state.is_wrapped_line.push_back(false); // First line is not wrapped |
| 103 | state.utf8_buffer.clear(); // Initialize UTF-8 buffer |
| 104 | |
| 105 | bool receiving_unicode_char = false; |
| 106 | |
| 107 | while (true) { |
| 108 | print_prompt_and_line(state); |
| 109 | |
| 110 | while (true) { |
| 111 | // Use ReadConsoleInput for all input |
| 112 | INPUT_RECORD inputRecord; |
| 113 | if (!read_console_input(inputRecord)) continue; |
| 114 | |
| 115 | // Get key event record |
| 116 | KEY_EVENT_RECORD keyEvent; |
| 117 | if (inputRecord.EventType == KEY_EVENT) { |
| 118 | keyEvent = inputRecord.Event.KeyEvent; |
| 119 | } |
| 120 | else{ |
| 121 | continue; |
| 122 | } |
| 123 | |
| 124 | // Only handle key down events |
| 125 | if ((!keyEvent.bKeyDown) && (keyEvent.wVirtualKeyCode != 0x12)) continue; |
| 126 | |
| 127 | KeyAction action = KeyAction::CONTINUE; |
| 128 | |
| 129 | // Handle different key types |
| 130 | if (keyEvent.wVirtualKeyCode == VK_UP || keyEvent.wVirtualKeyCode == VK_DOWN || |
| 131 | keyEvent.wVirtualKeyCode == VK_LEFT || keyEvent.wVirtualKeyCode == VK_RIGHT) { |
| 132 | action = handle_arrow_keys(keyEvent, state); |
| 133 | } else if (keyEvent.wVirtualKeyCode == VK_HOME || keyEvent.wVirtualKeyCode == VK_END || |
| 134 | keyEvent.wVirtualKeyCode == VK_DELETE) { |
| 135 | action = handle_navigation_keys(keyEvent, state); |
| 136 | } else if (keyEvent.wVirtualKeyCode == VK_F1 || keyEvent.wVirtualKeyCode == VK_F2 || |
| 137 | keyEvent.wVirtualKeyCode == VK_F3 || keyEvent.wVirtualKeyCode == VK_F4 || |
| 138 | keyEvent.wVirtualKeyCode == VK_F5 || keyEvent.wVirtualKeyCode == VK_F6 || |
| 139 | keyEvent.wVirtualKeyCode == VK_F7 || keyEvent.wVirtualKeyCode == VK_F8 || |
| 140 | keyEvent.wVirtualKeyCode == VK_F9 || keyEvent.wVirtualKeyCode == VK_F10 || |
| 141 | keyEvent.wVirtualKeyCode == VK_F11 || keyEvent.wVirtualKeyCode == VK_F12) { |
| 142 | action = handle_extended_key(keyEvent, state); |
| 143 | } else { |
| 144 | action = handle_regular_key(keyEvent, state); |
| 145 | } |
| 146 | |
| 147 | switch (action) { |
| 148 | case KeyAction::CONTINUE: |
| 149 | continue; |
| 150 | case KeyAction::NEW_LINE: |
| 151 | print_prompt_and_line(state); |
| 152 | continue; |
| 153 | case KeyAction::BREAK_INNER_LOOP: |
| 154 | break; |
| 155 | case KeyAction::BREAK_OUTER_LOOP: |
| 156 | goto outer_loop_end; |