mirror of https://github.com/mgba-emu/mgba.git
75 lines
2.1 KiB
C
75 lines
2.1 KiB
C
/* Copyright (c) 2013-2015 Jeffrey Pfau
|
|
*
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
#include <mgba-util/gui.h>
|
|
|
|
#define KEY_DELAY 45
|
|
#define KEY_REPEAT 5
|
|
|
|
void GUIInit(struct GUIParams* params) {
|
|
memset(params->inputHistory, 0, sizeof(params->inputHistory));
|
|
strncpy(params->currentPath, params->basePath, PATH_MAX);
|
|
}
|
|
|
|
void GUIPollInput(struct GUIParams* params, uint32_t* newInputOut, uint32_t* heldInput) {
|
|
uint32_t input = params->pollInput(¶ms->keyMap);
|
|
uint32_t newInput = 0;
|
|
int i;
|
|
for (i = 0; i < GUI_INPUT_MAX; ++i) {
|
|
if (input & (1 << i)) {
|
|
++params->inputHistory[i];
|
|
} else {
|
|
params->inputHistory[i] = -1;
|
|
}
|
|
if (!params->inputHistory[i] || (params->inputHistory[i] >= KEY_DELAY && !(params->inputHistory[i] % KEY_REPEAT))) {
|
|
newInput |= (1 << i);
|
|
}
|
|
}
|
|
if (newInputOut) {
|
|
*newInputOut = newInput;
|
|
}
|
|
if (heldInput) {
|
|
*heldInput = input;
|
|
}
|
|
}
|
|
|
|
enum GUICursorState GUIPollCursor(struct GUIParams* params, unsigned* x, unsigned* y) {
|
|
if (!params->pollCursor) {
|
|
return GUI_CURSOR_NOT_PRESENT;
|
|
}
|
|
enum GUICursorState state = params->pollCursor(x, y);
|
|
if (params->cursorState == GUI_CURSOR_DOWN) {
|
|
int dragX = *x - params->cx;
|
|
int dragY = *y - params->cy;
|
|
if (dragX * dragX + dragY * dragY > 25) {
|
|
params->cursorState = GUI_CURSOR_DRAGGING;
|
|
return GUI_CURSOR_DRAGGING;
|
|
}
|
|
if (state == GUI_CURSOR_UP || state == GUI_CURSOR_NOT_PRESENT) {
|
|
params->cursorState = GUI_CURSOR_UP;
|
|
return GUI_CURSOR_CLICKED;
|
|
}
|
|
} else {
|
|
params->cx = *x;
|
|
params->cy = *y;
|
|
}
|
|
if (params->cursorState == GUI_CURSOR_DRAGGING) {
|
|
if (state == GUI_CURSOR_UP || state == GUI_CURSOR_NOT_PRESENT) {
|
|
params->cursorState = GUI_CURSOR_UP;
|
|
return GUI_CURSOR_UP;
|
|
}
|
|
return GUI_CURSOR_DRAGGING;
|
|
}
|
|
params->cursorState = state;
|
|
return params->cursorState;
|
|
}
|
|
|
|
void GUIInvalidateKeys(struct GUIParams* params) {
|
|
int i;
|
|
for (i = 0; i < GUI_INPUT_MAX; ++i) {
|
|
params->inputHistory[i] = 0;
|
|
}
|
|
}
|