On Tuesday, 10 January 2017 at 02:37:31 UTC, LouisHK wrote:
So, it will stay inside the case KEY_EVENT: and will check the if KEY status is DOWN, otherwise will return null event.

So, the newest version of terminal.d already has a check for this... but you actually want to REQUEST key release events so kbhit doesn't clash with the system's release events.

Try this code on your version:

import arsd.terminal;
void main() {
        auto terminal = Terminal(ConsoleOutputType.linear);
auto input = RealTimeConsoleInput(&terminal, ConsoleInputFlags.allInputEventsWithRelease);
        while(true) {
                if(input.kbhit()) {
                        terminal.write(input.getch());
                } else terminal.write(".");
                terminal.flush();

                import core.thread;
                Thread.sleep(dur!"msecs"(50));
        }
}


It should give a steady series of dots unless you press a key. It should never stop giving dots (that means kbhit returned true when getch wouldn't actually return) and not print extra on release (though note that key repeat may give several down events as you hold it).


I might provide a helper function for that input thing eventually... but idk how yet, that RealTimeConsoleInput thing uses RAII to change terminal state so it cannot be copied - you always must pass by pointer, and I can't do that when returning from a function! Maybe I'll do a mixin to make the setup a bit simpler.

Reply via email to