#571 added touch kbd processing
This commit is contained in:
parent
4a0ef9390b
commit
56a6737131
|
@ -526,9 +526,11 @@ const StudioConfig* getConfig()
|
||||||
return &impl.config->data;
|
return &impl.config->data;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool isRunMode()
|
static bool isGamepadMode()
|
||||||
{
|
{
|
||||||
return impl.mode == TIC_RUN_MODE;
|
return impl.mode == TIC_RUN_MODE
|
||||||
|
|| impl.mode == TIC_SURF_MODE
|
||||||
|
|| impl.mode == TIC_MENU_MODE;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined (TIC80_PRO)
|
#if defined (TIC80_PRO)
|
||||||
|
@ -1878,7 +1880,7 @@ Studio* studioInit(s32 argc, char **argv, s32 samplerate, const char* folder, Sy
|
||||||
impl.studio.updateProject = updateStudioProject;
|
impl.studio.updateProject = updateStudioProject;
|
||||||
impl.studio.exit = exitStudio;
|
impl.studio.exit = exitStudio;
|
||||||
impl.studio.config = getConfig;
|
impl.studio.config = getConfig;
|
||||||
impl.studio.isRunMode = isRunMode;
|
impl.studio.isGamepadMode = isGamepadMode;
|
||||||
|
|
||||||
return &impl.studio;
|
return &impl.studio;
|
||||||
}
|
}
|
||||||
|
|
65
src/system.c
65
src/system.c
|
@ -437,6 +437,64 @@ static bool checkTouch(const SDL_Rect* rect, s32* x, s32* y)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void processTouchKeyboard()
|
||||||
|
{
|
||||||
|
enum{Cols=KBD_COLS, Rows=KBD_ROWS};
|
||||||
|
|
||||||
|
s32 w, h;
|
||||||
|
SDL_GetWindowSize(platform.window, &w, &h);
|
||||||
|
|
||||||
|
float scale = (float)w / (KBD_COLS*TIC_SPRITESIZE);
|
||||||
|
|
||||||
|
SDL_Rect kbd = {0, h - KBD_ROWS*TIC_SPRITESIZE*scale,
|
||||||
|
KBD_COLS*TIC_SPRITESIZE*scale, KBD_ROWS*TIC_SPRITESIZE*scale};
|
||||||
|
|
||||||
|
static const tic_key KbdLayout[] =
|
||||||
|
{
|
||||||
|
#include "kbdlayout.inl"
|
||||||
|
};
|
||||||
|
|
||||||
|
tic80_input* input = &platform.studio->tic->ram.input;
|
||||||
|
|
||||||
|
s32 devices = SDL_GetNumTouchDevices();
|
||||||
|
|
||||||
|
for (s32 i = 0; i < devices; i++)
|
||||||
|
{
|
||||||
|
SDL_TouchID id = SDL_GetTouchDevice(i);
|
||||||
|
s32 fingers = SDL_GetNumTouchFingers(id);
|
||||||
|
|
||||||
|
for (s32 f = 0; f < fingers; f++)
|
||||||
|
{
|
||||||
|
SDL_Finger* finger = SDL_GetTouchFinger(id, f);
|
||||||
|
|
||||||
|
if (finger && finger->pressure > 0.0f)
|
||||||
|
{
|
||||||
|
SDL_Point pt = {finger->x * w, finger->y * h};
|
||||||
|
|
||||||
|
if(SDL_PointInRect(&pt, &kbd))
|
||||||
|
{
|
||||||
|
pt.x -= kbd.x;
|
||||||
|
pt.y -= kbd.y;
|
||||||
|
|
||||||
|
pt.x /= scale;
|
||||||
|
pt.y /= scale;
|
||||||
|
|
||||||
|
for(s32 i = 0; i < COUNT_OF(input->keyboard.keys); i++)
|
||||||
|
{
|
||||||
|
tic_key* key = &input->keyboard.keys[i];
|
||||||
|
|
||||||
|
if(*key == tic_key_unknown)
|
||||||
|
{
|
||||||
|
*key = KbdLayout[pt.x / TIC_SPRITESIZE + pt.y / TIC_SPRITESIZE * Cols];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void processTouchGamepad()
|
static void processTouchGamepad()
|
||||||
{
|
{
|
||||||
platform.gamepad.touch.data = 0;
|
platform.gamepad.touch.data = 0;
|
||||||
|
@ -609,6 +667,7 @@ static void processGamepad()
|
||||||
{
|
{
|
||||||
#if !defined(__EMSCRIPTEN__) && !defined(__MACOSX__)
|
#if !defined(__EMSCRIPTEN__) && !defined(__MACOSX__)
|
||||||
processTouchGamepad();
|
processTouchGamepad();
|
||||||
|
processTouchKeyboard();
|
||||||
#endif
|
#endif
|
||||||
processJoysticks();
|
processJoysticks();
|
||||||
|
|
||||||
|
@ -748,10 +807,10 @@ static void renderKeyboard()
|
||||||
SDL_Rect rect;
|
SDL_Rect rect;
|
||||||
SDL_GetWindowSize(platform.window, &rect.w, &rect.h);
|
SDL_GetWindowSize(platform.window, &rect.w, &rect.h);
|
||||||
|
|
||||||
|
|
||||||
GPU_Rect src = {OFFSET_LEFT, OFFSET_TOP, KBD_COLS*TIC_SPRITESIZE, KBD_ROWS*TIC_SPRITESIZE};
|
GPU_Rect src = {OFFSET_LEFT, OFFSET_TOP, KBD_COLS*TIC_SPRITESIZE, KBD_ROWS*TIC_SPRITESIZE};
|
||||||
float scale = rect.w/src.w;
|
float scale = rect.w/src.w;
|
||||||
|
GPU_Rect dst = (GPU_Rect){0, rect.h - KBD_ROWS*TIC_SPRITESIZE*scale, scale, scale};
|
||||||
GPU_Rect dst = {0, rect.h - KBD_ROWS*TIC_SPRITESIZE*scale, scale, scale};
|
|
||||||
|
|
||||||
{
|
{
|
||||||
SDL_Rect rect;
|
SDL_Rect rect;
|
||||||
|
@ -1233,7 +1292,7 @@ static void gpuTick()
|
||||||
|
|
||||||
renderCursor();
|
renderCursor();
|
||||||
|
|
||||||
platform.studio->isRunMode()
|
platform.studio->isGamepadMode()
|
||||||
? renderGamepad()
|
? renderGamepad()
|
||||||
: renderKeyboard();
|
: renderKeyboard();
|
||||||
}
|
}
|
||||||
|
|
|
@ -92,7 +92,7 @@ typedef struct
|
||||||
const StudioConfig* (*config)();
|
const StudioConfig* (*config)();
|
||||||
|
|
||||||
// TODO: remove this method, system has to know nothing about current mode
|
// TODO: remove this method, system has to know nothing about current mode
|
||||||
bool (*isRunMode)();
|
bool (*isGamepadMode)();
|
||||||
} Studio;
|
} Studio;
|
||||||
|
|
||||||
TIC80_API Studio* studioInit(s32 argc, char **argv, s32 samplerate, const char* appFolder, System* system);
|
TIC80_API Studio* studioInit(s32 argc, char **argv, s32 samplerate, const char* appFolder, System* system);
|
||||||
|
|
Loading…
Reference in New Issue