short IZMachineIO.ReadKey(int time, TimedInputCallback callback, CharTranslator translator) { PerformSplit(targetSplit); if (unicode) { Glk.glk_request_char_event_uni(currentWin); } else { Glk.glk_request_char_event(currentWin); } Glk.glk_request_timer_events((uint)(time * 100)); event_t ev; bool done = false; short result = 0; do { Glk.glk_select(out ev); switch (ev.type) { case EvType.CharInput: if (ev.win == currentWin) { if (ev.val1 <= 255 || (unicode && ev.val1 <= 0x10000)) { result = translator((char)ev.val1); } else { result = GlkKeyToZSCII((KeyCode)ev.val1); } if (result != 0) { done = true; } else if (unicode) { Glk.glk_request_char_event_uni(currentWin); } else { Glk.glk_request_char_event(currentWin); } } break; case EvType.Timer: if (callback() == true) { Glk.glk_cancel_char_event(currentWin); done = true; } break; case EvType.Arrange: UpdateScreenSize(); break; case EvType.SoundNotify: SoundNotify(); break; } }while (!done); Glk.glk_request_timer_events(0); return(result); }