add fullscreen toggle

For desktop users, this should be a nicer user experience
This commit is contained in:
itsmattkc committed 2025-12-28 19:28:33 -08:00
1 parent a73632aca6
commit 2388c419be
10 files changed
+62 -9

No files matched your search

+5
View File
@@ -77,6 +77,9 @@ void vpi_config_save()
sprintf(buf, "%i", vpi_config.swap_abxy);
xmlTextWriterWriteElement(writer, BAD_CAST "swapabxy", BAD_CAST buf);
sprintf(buf, "%i", vpi_config.fullscreen);
xmlTextWriterWriteElement(writer, BAD_CAST "fullscreen", BAD_CAST buf);
xmlTextWriterEndElement(writer); // vanilla
xmlTextWriterEndDocument(writer);
@@ -149,6 +152,8 @@ void vpi_config_init()
vpi_config.region = atoi((const char *) child->children->content);
} else if (!strcmp((const char *) child->name, "swapabxy")) {
vpi_config.swap_abxy = atoi((const char *) child->children->content);
} else if (!strcmp((const char *) child->name, "fullscreen")) {
vpi_config.fullscreen = atoi((const char *) child->children->content);
}
}
child = child->next;
+1
View File
@@ -20,6 +20,7 @@ typedef struct {
int connection_setup;
int region;
int swap_abxy;
int fullscreen;
} vpi_config_t;
extern vpi_config_t vpi_config;
+1
View File
@@ -53,6 +53,7 @@ static const char *lang_str[__VPI_LANG_T_COUNT] = {
"Enable Root Password Skip",
"Disable Root Password Skip",
"Swap AB/XY buttons",
"Full Screen",
};
const char *lang(vpi_lang_t id)
+1
View File
@@ -54,6 +54,7 @@ typedef enum {
VPI_LANG_ENABLE_PASSWORD_SKIP,
VPI_LANG_DISABLE_PASSWORD_SKIP,
VPI_LANG_SWAP_ABXY_BUTTONS,
VPI_LANG_FULLSCREEN,
__VPI_LANG_T_COUNT
} vpi_lang_t;
+15 -7
View File
@@ -22,14 +22,16 @@ void display_cli_help(const char **argv);
int SDL_main(int argc, const char **argv)
{
// Default to full screen unless "-w" is specified
int fs = 1;
int override_fs = -1;
for (int i = 1, consumed; i < argc; i += consumed) {
consumed = -1;
if (!strcmp(argv[i], "-w") || !strcmp(argv[i], "--window")) {
fs = 0;
override_fs = 0;
consumed = 1;
}
else if (!strcmp(argv[i], "-h") || !strcmp(argv[i], "--help")) {
} else if (!strcmp(argv[i], "-f") || !strcmp(argv[i], "--fullscreen")) {
override_fs = 1;
consumed = 1;
} else if (!strcmp(argv[i], "-h") || !strcmp(argv[i], "--help")) {
display_cli_help(argv);
return 0;
}
@@ -45,12 +47,17 @@ int SDL_main(int argc, const char **argv)
// Load config
vpi_config_init();
// Check if override fullscreen, if so set it in the config, but don't save
if (override_fs != -1) {
vpi_config.fullscreen = override_fs;
}
// Initialize UI system
vui_context_t *vui = vui_alloc(SCREEN_WIDTH, SCREEN_HEIGHT);
// Initialize SDL2
int ret = 1;
if (vui_init_sdl(vui, fs)) {
if (vui_init_sdl(vui, vpi_config.fullscreen)) {
vpilog("Failed to initialize VUI\n");
goto exit;
}
@@ -78,6 +85,7 @@ exit:
void display_cli_help(const char **argv) {
vpilog("Usage: %s [options]\n\n", argv[0]);
vpilog("Options:\n");
vpilog(" -w, --window Run Vanilla in a window\n");
vpilog(" -h, --help Show this help message\n");
vpilog(" -w, --window Run Vanilla in a window (overrides config)\n");
vpilog(" -f, --fullscreen Run Vanilla full screen (overrides config)\n");
vpilog(" -h, --help Show this help message\n");
}
+19 -2
View File
@@ -95,6 +95,14 @@ static void transition_to_uninstall_polkit_rule(vui_context_t *vui, int button,
}
#endif
static void toggle_fullscreen(vui_context_t *vui, int button, void *v)
{
vpi_config.fullscreen = !vpi_config.fullscreen;
vpi_config_save();
vui_set_fullscreen(vui, vpi_config.fullscreen);
vui_button_update_checked(vui, button, vpi_config.fullscreen);
}
void vpi_menu_settings(vui_context_t *vui, void *v)
{
vui_reset(vui);
@@ -104,12 +112,14 @@ void vpi_menu_settings(vui_context_t *vui, void *v)
int scrw, scrh;
vui_get_screen_size(vui, &scrw, &scrh);
const int PW_SKIP_SETTING = 3;
const int FS_SETTING = 3;
const int PW_SKIP_SETTING = 4;
static int SETTINGS_NAMES[] = {
VPI_LANG_CONNECTION,
VPI_LANG_GAMEPAD,
VPI_LANG_REGION,
VPI_LANG_FULLSCREEN,
-1,
};
@@ -118,9 +128,12 @@ void vpi_menu_settings(vui_context_t *vui, void *v)
transition_to_connection,
transition_to_gamepad,
transition_to_region,
toggle_fullscreen,
0,
};
int buttons[sizeof(SETTINGS_NAMES) / sizeof(int)];
#ifdef VANILLA_POLKIT_AVAILABLE
int pw_skip_str;
vui_button_callback_t pw_skip_action;
@@ -138,10 +151,14 @@ void vpi_menu_settings(vui_context_t *vui, void *v)
int btny = scrh/10;
for (int index = 0; index < sizeof(SETTINGS_NAMES)/sizeof(int); index++) {
if (SETTINGS_ACTION[index]) {
vui_button_create(vui, btnx, btny + BTN_SZ * index, btnw, BTN_SZ, lang(SETTINGS_NAMES[index]), 0, VUI_BUTTON_STYLE_BUTTON, fglayer, SETTINGS_ACTION[index], (void *) (intptr_t) fglayer);
buttons[index] = vui_button_create(vui, btnx, btny + BTN_SZ * index, btnw, BTN_SZ, lang(SETTINGS_NAMES[index]), 0, VUI_BUTTON_STYLE_BUTTON, fglayer, SETTINGS_ACTION[index], (void *) (intptr_t) fglayer);
}
}
// Make full screen button checkable
vui_button_update_checkable(vui, buttons[FS_SETTING], 1);
vui_button_update_checked(vui, buttons[FS_SETTING], vpi_config.fullscreen);
// Back button
vpi_menu_create_back_button(vui, fglayer, return_to_main, (void *) (intptr_t) fglayer);
+7
View File
@@ -28,6 +28,7 @@ vui_context_t *vui_alloc(int width, int height)
vui->mic_callback = 0;
vui->mic_enabled_handler = 0;
vui->audio_enabled_handler = 0;
vui->fullscreen_enabled_handler = 0;
vui->quit = 0;
vui_reset(vui);
return vui;
@@ -77,6 +78,12 @@ void vui_set_background(vui_context_t *ctx, const char *background_image)
vui_strncpy(ctx->background_image, background_image, sizeof(ctx->background_image));
}
void vui_set_fullscreen(vui_context_t *ctx, int enabled)
{
if (ctx->fullscreen_enabled_handler)
ctx->fullscreen_enabled_handler(ctx, enabled, ctx->fullscreen_enabled_handler_data);
}
int vui_button_create(vui_context_t *ctx, int x, int y, int w, int h, const char *text, const char *icon, vui_button_style_t style, int layer, vui_button_callback_t callback, void *callback_data)
{
if (ctx->button_count == MAX_BUTTON_COUNT) {
+2
View File
@@ -46,6 +46,7 @@ typedef void (*vui_callback_t)(vui_context_t *ctx, void *userdata);
typedef void (*vui_button_callback_t)(vui_context_t *ctx, int button, void *userdata);
typedef void (*vui_anim_step_callback_t)(vui_context_t *ctx, int64_t time, void *userdata);
typedef void (*vui_mic_callback_t)(void *userdata, const uint8_t *stream, size_t len);
typedef void (*vui_bool_callback_t)(vui_context_t *ctx, int enabled, void *userdata);
typedef enum {
VUI_DIR_LEFT,
@@ -78,6 +79,7 @@ void vui_audio_set_enabled(vui_context_t *ctx, int enabled);
void vui_get_screen_size(vui_context_t *ctx, int *width, int *height);
void vui_enable_background(vui_context_t *ctx, int enabled);
void vui_set_background(vui_context_t *ctx, const char *background_image);
void vui_set_fullscreen(vui_context_t *ctx, int enabled);
/**
* Layer-related functions
+2
View File
@@ -147,6 +147,8 @@ typedef struct vui_context_t {
void *mic_enabled_handler_data;
vui_audio_enabled_handler_t audio_enabled_handler;
void *audio_enabled_handler_data;
vui_bool_callback_t fullscreen_enabled_handler;
void *fullscreen_enabled_handler_data;
} vui_context_t;
#endif // VANILLA_PI_UI_PRIV_H
+9
View File
@@ -267,6 +267,13 @@ vui_power_state_t vui_sdl_power_state_handler(vui_context_t *ctx, int *percent)
return sdl_ctx->last_power_state;
}
void vui_sdl_fullscreen_enabled_handler(vui_context_t *ctx, int enabled, void *userdata)
{
vui_sdl_context_t *sdl_ctx = (vui_sdl_context_t *) ctx->platform_data;
SDL_SetWindowFullscreen(sdl_ctx->window, enabled ? SDL_WINDOW_FULLSCREEN : 0);
}
void vui_sdl_audio_set_enabled(vui_context_t *ctx, int enabled, void *userdata)
{
vui_sdl_context_t *sdl_ctx = (vui_sdl_context_t *) userdata;
@@ -648,6 +655,8 @@ int vui_init_sdl(vui_context_t *ctx, int fullscreen)
sdl_ctx->last_power_state_check = 0;
sdl_ctx->last_power_state = VUI_POWERSTATE_UNKNOWN;
ctx->fullscreen_enabled_handler = vui_sdl_fullscreen_enabled_handler;
if (TTF_Init()) {
vpilog("Failed to TTF_Init\n");
return -1;