mirror of
https://gitlab.os-k.eu/os-k-team/kvisc.git
synced 2023-08-25 14:05:46 +02:00
85 lines
1.6 KiB
C
85 lines
1.6 KiB
C
|
// The OS/K Team licenses this file to you under the MIT license.
|
||
|
// See the LICENSE file in the project root for more information.
|
||
|
|
||
|
#include <pc/console.h>
|
||
|
|
||
|
#define KEYBUFSIZE 8192
|
||
|
|
||
|
typedef uint keycode_t;
|
||
|
|
||
|
keycode_t keybuf[KEYBUFSIZE] = { 0 };
|
||
|
keycode_t *keybuf_last = &keybuf[0];
|
||
|
keycode_t *keybuf_ptr = &keybuf[0];
|
||
|
|
||
|
void console_addkey(ctx_t *ctx, keycode_t key)
|
||
|
{
|
||
|
*keybuf_ptr++ = key;
|
||
|
|
||
|
if (keybuf_ptr == keybuf + KEYBUFSIZE)
|
||
|
keybuf_ptr = &keybuf[0];
|
||
|
}
|
||
|
|
||
|
keycode_t console_getkey(ctx_t *ctx)
|
||
|
{
|
||
|
keycode_t rc = *keybuf_last++;
|
||
|
|
||
|
if (keybuf_last == keybuf + KEYBUFSIZE)
|
||
|
keybuf_last = &keybuf[0];
|
||
|
|
||
|
return rc;
|
||
|
}
|
||
|
|
||
|
keycode_t console_scankeybuf(ctx_t *ctx)
|
||
|
{
|
||
|
if (keybuf_last != keybuf_ptr)
|
||
|
return console_getkey(ctx);
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
void console_handle_input(ctx_t *ctx, SDL_Keycode key)
|
||
|
{
|
||
|
keycode_t code = 0;
|
||
|
|
||
|
SDL_Keymod mod = SDL_GetModState();
|
||
|
|
||
|
if (key <= 'z' && key >= 'a')
|
||
|
{
|
||
|
if (mod & (KMOD_CTRL|KMOD_ALT))
|
||
|
{
|
||
|
if (key == 'c')
|
||
|
_except(ctx, E_BRK, "Ctrl+C received");
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (mod & KMOD_SHIFT)
|
||
|
key -= ('a' - 'A');
|
||
|
|
||
|
console_addkey(ctx, key);
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (key <= '0' && key >= '9')
|
||
|
console_addkey(ctx, key);
|
||
|
|
||
|
switch (key)
|
||
|
{
|
||
|
case SDLK_SPACE: code = ' '; break;
|
||
|
case SDLK_BACKSLASH: code = '\\'; break;
|
||
|
case SDLK_BACKSPACE: code = '\b'; break;
|
||
|
|
||
|
case SDLK_RETURN:
|
||
|
case SDLK_RETURN2:
|
||
|
code = '\n';
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
console_addkey(ctx, code);
|
||
|
}
|
||
|
|