FarManager: AutoComplete popup does not show under Windows 10's Terminal

I compiled Far Manager and see what’s different in Terminal. In EditControl::AutoCompleteProc console.GetNumberOfInputEvents sets EventsCount to 1 and skips the whole function because of it. If I just change the value to 0 after a break point, it continues normally and I can see the popup.

About this issue

  • Original URL
  • State: closed
  • Created 4 years ago
  • Comments: 17 (5 by maintainers)

Commits related to this issue

Most upvoted comments

Just found this gem in Terminal’s code:

    // Unfortunately, the UI doesn't give us both a character down and a
    // character up event, only a character received event. So fake sending both
    // to the terminal input translator. Unless it's in win32-input-mode, it'll
    // ignore the keyup.
    KeyEvent keyDown{ true, 1, vkey, scanCode, ch, states.Value() };
    KeyEvent keyUp{ false, 1, vkey, scanCode, ch, states.Value() };
    const auto handledDown = _terminalInput->HandleKey(&keyDown);
    const auto handledUp = _terminalInput->HandleKey(&keyUp);
    return handledDown || handledUp;

@DHowett , I think this might be the cause:

Please take this tool - readkey.zip - and do the following under both conhost and terminal:

  • Press any key, e.g. <kbd>Space</kbd>
  • Hold it for a while
  • Release it
  • Compare the output.

Conhost:

KEY_EVENT_RECORD: Down, Count=1, Vk=VK_SPACE [32/0x20], Scan=57, uChar=[U=' '(0x0020) A=' '(0x20)], Control=0x00000020 (casac - ecNs)
KEY_EVENT_RECORD: Down, Count=1, Vk=VK_SPACE [32/0x20], Scan=57, uChar=[U=' '(0x0020) A=' '(0x20)], Control=0x00000020 (casac - ecNs)
KEY_EVENT_RECORD: Down, Count=1, Vk=VK_SPACE [32/0x20], Scan=57, uChar=[U=' '(0x0020) A=' '(0x20)], Control=0x00000020 (casac - ecNs)
KEY_EVENT_RECORD: Down, Count=1, Vk=VK_SPACE [32/0x20], Scan=57, uChar=[U=' '(0x0020) A=' '(0x20)], Control=0x00000020 (casac - ecNs)
KEY_EVENT_RECORD: Down, Count=1, Vk=VK_SPACE [32/0x20], Scan=57, uChar=[U=' '(0x0020) A=' '(0x20)], Control=0x00000020 (casac - ecNs)
KEY_EVENT_RECORD: Down, Count=1, Vk=VK_SPACE [32/0x20], Scan=57, uChar=[U=' '(0x0020) A=' '(0x20)], Control=0x00000020 (casac - ecNs)
KEY_EVENT_RECORD: Down, Count=1, Vk=VK_SPACE [32/0x20], Scan=57, uChar=[U=' '(0x0020) A=' '(0x20)], Control=0x00000020 (casac - ecNs)
KEY_EVENT_RECORD: Up, Count=1, Vk=VK_SPACE [32/0x20], Scan=57, uChar=[U=' '(0x0020) A=' '(0x20)], Control=0x00000020 (casac - ecNs)

Terminal:

KEY_EVENT_RECORD: Down, Count=1, Vk=VK_SPACE [32/0x20], Scan=57, uChar=[U=' '(0x0020) A=' '(0x20)], Control=0x00000000 (casac - ecns)
KEY_EVENT_RECORD: Up, Count=1, Vk=VK_SPACE [32/0x20], Scan=57, uChar=[U=' '(0x0020) A=' '(0x20)], Control=0x00000000 (casac - ecns)
KEY_EVENT_RECORD: Down, Count=1, Vk=VK_SPACE [32/0x20], Scan=57, uChar=[U=' '(0x0020) A=' '(0x20)], Control=0x00000000 (casac - ecns)
KEY_EVENT_RECORD: Up, Count=1, Vk=VK_SPACE [32/0x20], Scan=57, uChar=[U=' '(0x0020) A=' '(0x20)], Control=0x00000000 (casac - ecns)
KEY_EVENT_RECORD: Down, Count=1, Vk=VK_SPACE [32/0x20], Scan=57, uChar=[U=' '(0x0020) A=' '(0x20)], Control=0x00000000 (casac - ecns)
KEY_EVENT_RECORD: Up, Count=1, Vk=VK_SPACE [32/0x20], Scan=57, uChar=[U=' '(0x0020) A=' '(0x20)], Control=0x00000000 (casac - ecns)
KEY_EVENT_RECORD: Down, Count=1, Vk=VK_SPACE [32/0x20], Scan=57, uChar=[U=' '(0x0020) A=' '(0x20)], Control=0x00000000 (casac - ecns)
KEY_EVENT_RECORD: Up, Count=1, Vk=VK_SPACE [32/0x20], Scan=57, uChar=[U=' '(0x0020) A=' '(0x20)], Control=0x00000000 (casac - ecns)
KEY_EVENT_RECORD: Down, Count=1, Vk=VK_SPACE [32/0x20], Scan=57, uChar=[U=' '(0x0020) A=' '(0x20)], Control=0x00000000 (casac - ecns)
KEY_EVENT_RECORD: Up, Count=1, Vk=VK_SPACE [32/0x20], Scan=57, uChar=[U=' '(0x0020) A=' '(0x20)], Control=0x00000000 (casac - ecns)
KEY_EVENT_RECORD: Down, Count=1, Vk=VK_SPACE [32/0x20], Scan=57, uChar=[U=' '(0x0020) A=' '(0x20)], Control=0x00000000 (casac - ecns)
KEY_EVENT_RECORD: Up, Count=1, Vk=VK_SPACE [32/0x20], Scan=57, uChar=[U=' '(0x0020) A=' '(0x20)], Control=0x00000000 (casac - ecns)
KEY_EVENT_RECORD: Down, Count=1, Vk=VK_SPACE [32/0x20], Scan=57, uChar=[U=' '(0x0020) A=' '(0x20)], Control=0x00000000 (casac - ecns)
KEY_EVENT_RECORD: Up, Count=1, Vk=VK_SPACE [32/0x20], Scan=57, uChar=[U=' '(0x0020) A=' '(0x20)], Control=0x00000000 (casac - ecns)

I.e. terminal reports paired false “Up” events even though the key stays down.

This quick workaround seems to work.

In EditControl::AutoCompleteProc, just after console.GetNumberOfInputEvents.

if(EventsCount == 1)
{
	INPUT_RECORD rec;
	if(console.PeekOneInput(rec) && rec.EventType == KEY_EVENT && !rec.Event.KeyEvent.bKeyDown)
		EventsCount = 0;
}