Add method for frontends to query the backend's cursor location.

The Rockbox frontend allows games to be displayed in a "zoomed-in"
state targets with small displays. Currently we use a modal interface
-- a "viewing" mode in which the cursor keys are used to pan around
the rendered bitmap; and an "interaction" mode that actually sends
keys to the game.

This commit adds a midend_get_cursor_location() function to allow the
frontend to retrieve the backend's cursor location or other "region of
interest" -- such as the player location in Cube or Inertia.

With this information, the Rockbox frontend can now intelligently
follow the cursor around in the zoomed-in state, eliminating the need
for a modal interface.
This commit is contained in:
Franklin Wei
2020-07-06 22:06:30 -04:00
committed by Simon Tatham
parent 9aa7b7cdfb
commit 78bc9ea7f7
47 changed files with 740 additions and 0 deletions

View File

@ -2854,6 +2854,37 @@ static float game_flash_length(const game_state *oldstate, const game_state *new
return 0.0F;
}
static void game_get_cursor_location(const game_ui *ui,
const game_drawstate *ds,
const game_state *state,
const game_params *params,
int *x, int *y, int *w, int *h)
{
if(ui->cursor_active) {
int off = HALFSZ / 4;
int cx = COORD(ui->curx / 2) + off;
int cy = COORD(ui->cury / 2) + off;
int cw, ch;
cw = ch = TILE_SIZE - (2*off) + 1;
if(ui->curx % 2 == 0) {
/* left border */
cx -= off;
cw = 2 * off + 1;
}
if(ui->cury % 2 == 0) {
/* upper border */
cy -= off;
ch = 2 * off + 1;
}
*x = cx;
*y = cy;
*w = cw;
*h = ch;
}
}
static int game_status(const game_state *state)
{
return state->completed ? +1 : 0;
@ -2948,6 +2979,7 @@ const struct game thegame = {
game_redraw,
game_anim_length,
game_flash_length,
game_get_cursor_location,
game_status,
true, false, game_print_size, game_print,
false, /* wants_statusbar */