mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2024-10-18 19:22:41 +00:00
Merge pull request #165 from HeavenVolkoff/save_win_dimensions
Implement save/restore of window dimensions/position Thanks for the contribution, @HeavenVolkoff!
This commit is contained in:
commit
cd2e6c0774
5 changed files with 91 additions and 48 deletions
|
@ -27,6 +27,7 @@
|
|||
#define TEXT_OPT_NEAREST _("Nearest")
|
||||
#define TEXT_OPT_LINEAR _("Linear")
|
||||
#define TEXT_OPT_MVOLUME _("Master Volume")
|
||||
#define TEXT_RESET_WINDOW _("Reset Window")
|
||||
|
||||
#define TEXT_OPT_UNBOUND _("NONE")
|
||||
#define TEXT_OPT_PRESSKEY _("...")
|
||||
|
|
|
@ -72,6 +72,7 @@ static const u8 optsVideoStr[][32] = {
|
|||
{ TEXT_OPT_TEXFILTER },
|
||||
{ TEXT_OPT_NEAREST },
|
||||
{ TEXT_OPT_LINEAR },
|
||||
{ TEXT_RESET_WINDOW }
|
||||
};
|
||||
|
||||
static const u8 optsAudioStr[][32] = {
|
||||
|
@ -177,6 +178,10 @@ static void optmenu_act_exit(UNUSED struct Option *self, s32 arg) {
|
|||
if (!arg) game_exit(); // only exit on A press and not directions
|
||||
}
|
||||
|
||||
static void optvide_reset_window(UNUSED struct Option *self, s32 arg) {
|
||||
if (!arg) configWindow.reset = true;; // Restrict reset to A press and not directions
|
||||
}
|
||||
|
||||
/* submenu option lists */
|
||||
|
||||
#ifdef BETTERCAMERA
|
||||
|
@ -211,8 +216,9 @@ static struct Option optsControls[] = {
|
|||
};
|
||||
|
||||
static struct Option optsVideo[] = {
|
||||
DEF_OPT_TOGGLE( optsVideoStr[0], &configFullscreen ),
|
||||
DEF_OPT_TOGGLE( optsVideoStr[0], &configWindow.fullscreen ),
|
||||
DEF_OPT_CHOICE( optsVideoStr[1], &configFiltering, filterChoices ),
|
||||
DEF_OPT_BUTTON( optsVideoStr[4], optvide_reset_window ),
|
||||
};
|
||||
|
||||
static struct Option optsAudio[] = {
|
||||
|
|
|
@ -5,8 +5,10 @@
|
|||
#include <string.h>
|
||||
#include <assert.h>
|
||||
#include <ctype.h>
|
||||
#include <SDL2/SDL.h>
|
||||
|
||||
#include "configfile.h"
|
||||
#include "gfx/gfx_screen_config.h"
|
||||
#include "controller/controller_api.h"
|
||||
|
||||
#define ARRAY_LEN(arr) (sizeof(arr) / sizeof(arr[0]))
|
||||
|
@ -33,7 +35,16 @@ struct ConfigOption {
|
|||
*/
|
||||
|
||||
// Video/audio stuff
|
||||
bool configFullscreen = false;
|
||||
ConfigWindow configWindow = {
|
||||
.x = SDL_WINDOWPOS_CENTERED,
|
||||
.y = SDL_WINDOWPOS_CENTERED,
|
||||
.w = DESIRED_SCREEN_WIDTH,
|
||||
.h = DESIRED_SCREEN_HEIGHT,
|
||||
.reset = false,
|
||||
.vsync = false,
|
||||
.fullscreen = false,
|
||||
.exiting_fullscreen = false,
|
||||
};
|
||||
unsigned int configFiltering = 1; // 0=force nearest, 1=linear, (TODO) 2=three-point
|
||||
unsigned int configMasterVolume = MAX_VOLUME; // 0 - MAX_VOLUME
|
||||
|
||||
|
@ -68,7 +79,11 @@ bool configCameraMouse = false;
|
|||
unsigned int configSkipIntro = 0;
|
||||
|
||||
static const struct ConfigOption options[] = {
|
||||
{.name = "fullscreen", .type = CONFIG_TYPE_BOOL, .boolValue = &configFullscreen},
|
||||
{.name = "fullscreen", .type = CONFIG_TYPE_BOOL, .boolValue = &configWindow.fullscreen},
|
||||
{.name = "window_x", .type = CONFIG_TYPE_UINT, .uintValue = &configWindow.x},
|
||||
{.name = "window_y", .type = CONFIG_TYPE_UINT, .uintValue = &configWindow.y},
|
||||
{.name = "window_w", .type = CONFIG_TYPE_UINT, .uintValue = &configWindow.w},
|
||||
{.name = "window_h", .type = CONFIG_TYPE_UINT, .uintValue = &configWindow.h},
|
||||
{.name = "texture_filtering", .type = CONFIG_TYPE_UINT, .uintValue = &configFiltering},
|
||||
{.name = "master_volume", .type = CONFIG_TYPE_UINT, .uintValue = &configMasterVolume},
|
||||
{.name = "key_a", .type = CONFIG_TYPE_BIND, .uintValue = configKeyA},
|
||||
|
|
|
@ -7,7 +7,15 @@
|
|||
#define MAX_VOLUME 127
|
||||
#define VOLUME_SHIFT 7
|
||||
|
||||
extern bool configFullscreen;
|
||||
typedef struct {
|
||||
unsigned int x, y, w, h;
|
||||
bool reset;
|
||||
bool vsync;
|
||||
bool fullscreen;
|
||||
bool exiting_fullscreen;
|
||||
} ConfigWindow;
|
||||
|
||||
extern ConfigWindow configWindow;
|
||||
extern unsigned int configFiltering;
|
||||
extern unsigned int configMasterVolume;
|
||||
extern unsigned int configKeyA[];
|
||||
|
|
|
@ -22,6 +22,8 @@
|
|||
|
||||
#endif // End of OS-Specific GL defines
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include "gfx_window_manager_api.h"
|
||||
#include "gfx_screen_config.h"
|
||||
#include "../pc_main.h"
|
||||
|
@ -41,10 +43,6 @@ static SDL_Window *wnd;
|
|||
static SDL_GLContext ctx = NULL;
|
||||
static int inverted_scancode_table[512];
|
||||
|
||||
static bool window_fullscreen;
|
||||
static bool window_vsync;
|
||||
static int window_width, window_height;
|
||||
|
||||
const SDL_Scancode windows_scancode_table[] =
|
||||
{
|
||||
/* 0 1 2 3 4 5 6 7 */
|
||||
|
@ -96,22 +94,40 @@ const SDL_Scancode scancode_rmapping_nonextended[][2] = {
|
|||
{SDL_SCANCODE_KP_MULTIPLY, SDL_SCANCODE_PRINTSCREEN}
|
||||
};
|
||||
|
||||
static void gfx_sdl_set_fullscreen(bool fullscreen) {
|
||||
if (fullscreen == window_fullscreen) return;
|
||||
#define IS_FULLSCREEN (SDL_GetWindowFlags(wnd) & SDL_WINDOW_FULLSCREEN_DESKTOP)
|
||||
|
||||
if (fullscreen) {
|
||||
static void gfx_sdl_set_fullscreen() {
|
||||
if (configWindow.fullscreen == IS_FULLSCREEN)
|
||||
return;
|
||||
if (configWindow.fullscreen) {
|
||||
SDL_SetWindowFullscreen(wnd, SDL_WINDOW_FULLSCREEN_DESKTOP);
|
||||
SDL_ShowCursor(SDL_DISABLE);
|
||||
} else {
|
||||
SDL_SetWindowFullscreen(wnd, 0);
|
||||
SDL_ShowCursor(SDL_ENABLE);
|
||||
// reset back to small window just in case
|
||||
window_width = DESIRED_SCREEN_WIDTH;
|
||||
window_height = DESIRED_SCREEN_HEIGHT;
|
||||
SDL_SetWindowSize(wnd, window_width, window_height);
|
||||
configWindow.exiting_fullscreen = true;
|
||||
}
|
||||
}
|
||||
|
||||
window_fullscreen = fullscreen;
|
||||
static void gfx_sdl_reset_dimension_and_pos() {
|
||||
if (configWindow.exiting_fullscreen)
|
||||
configWindow.exiting_fullscreen = false;
|
||||
else if (configWindow.reset) {
|
||||
configWindow.x = SDL_WINDOWPOS_CENTERED;
|
||||
configWindow.y = SDL_WINDOWPOS_CENTERED;
|
||||
configWindow.w = DESIRED_SCREEN_WIDTH;
|
||||
configWindow.h = DESIRED_SCREEN_HEIGHT;
|
||||
configWindow.reset = false;
|
||||
|
||||
if (IS_FULLSCREEN) {
|
||||
configWindow.fullscreen = false;
|
||||
return;
|
||||
}
|
||||
} else
|
||||
return;
|
||||
|
||||
SDL_SetWindowSize(wnd, configWindow.w, configWindow.h);
|
||||
SDL_SetWindowPosition(wnd, configWindow.x, configWindow.y);
|
||||
}
|
||||
|
||||
static bool test_vsync(void) {
|
||||
|
@ -148,7 +164,7 @@ static void gfx_sdl_init(void) {
|
|||
//SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 4);
|
||||
|
||||
if (gCLIOpts.FullScreen)
|
||||
configFullscreen = true;
|
||||
configWindow.fullscreen = true;
|
||||
|
||||
const char* window_title =
|
||||
#ifndef USE_GLES
|
||||
|
@ -157,28 +173,18 @@ static void gfx_sdl_init(void) {
|
|||
"Super Mario 64 PC port (OpenGL_ES2)";
|
||||
#endif
|
||||
|
||||
Uint32 window_flags = SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE;
|
||||
|
||||
window_fullscreen = configFullscreen;
|
||||
|
||||
if (configFullscreen) {
|
||||
window_flags |= SDL_WINDOW_FULLSCREEN_DESKTOP;
|
||||
SDL_ShowCursor(SDL_DISABLE);
|
||||
} else {
|
||||
SDL_ShowCursor(SDL_ENABLE);
|
||||
}
|
||||
|
||||
wnd = SDL_CreateWindow(window_title, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
|
||||
DESIRED_SCREEN_WIDTH, DESIRED_SCREEN_HEIGHT, window_flags);
|
||||
|
||||
wnd = SDL_CreateWindow(
|
||||
window_title,
|
||||
configWindow.x, configWindow.y, configWindow.w, configWindow.h,
|
||||
SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE
|
||||
);
|
||||
ctx = SDL_GL_CreateContext(wnd);
|
||||
SDL_GL_SetSwapInterval(2);
|
||||
|
||||
// in case FULLSCREEN_DESKTOP set our size to god knows what
|
||||
SDL_GetWindowSize(wnd, &window_width, &window_height);
|
||||
gfx_sdl_set_fullscreen();
|
||||
|
||||
window_vsync = test_vsync();
|
||||
if (!window_vsync)
|
||||
configWindow.vsync = test_vsync();
|
||||
if (!configWindow.vsync)
|
||||
printf("Warning: VSync is not enabled or not working. Falling back to timer for synchronization\n");
|
||||
|
||||
for (size_t i = 0; i < sizeof(windows_scancode_table) / sizeof(SDL_Scancode); i++) {
|
||||
|
@ -201,8 +207,7 @@ static void gfx_sdl_main_loop(void (*run_one_game_iter)(void)) {
|
|||
}
|
||||
|
||||
static void gfx_sdl_get_dimensions(uint32_t *width, uint32_t *height) {
|
||||
*width = window_width;
|
||||
*height = window_height;
|
||||
SDL_GetWindowSize(wnd, width, height);
|
||||
}
|
||||
|
||||
static int translate_scancode(int scancode) {
|
||||
|
@ -219,9 +224,9 @@ static void gfx_sdl_onkeydown(int scancode) {
|
|||
const Uint8 *state = SDL_GetKeyboardState(NULL);
|
||||
|
||||
if (state[SDL_SCANCODE_LALT] && state[SDL_SCANCODE_RETURN])
|
||||
configFullscreen = !configFullscreen;
|
||||
else if (state[SDL_SCANCODE_ESCAPE] && configFullscreen)
|
||||
configFullscreen = false;
|
||||
configWindow.fullscreen = !configWindow.fullscreen;
|
||||
else if (state[SDL_SCANCODE_ESCAPE] && configWindow.fullscreen)
|
||||
configWindow.fullscreen = false;
|
||||
}
|
||||
|
||||
static void gfx_sdl_onkeyup(int scancode) {
|
||||
|
@ -241,10 +246,18 @@ static void gfx_sdl_handle_events(void) {
|
|||
gfx_sdl_onkeyup(event.key.keysym.scancode);
|
||||
break;
|
||||
#endif
|
||||
case SDL_WINDOWEVENT:
|
||||
if (event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED) {
|
||||
window_width = event.window.data1;
|
||||
window_height = event.window.data2;
|
||||
case SDL_WINDOWEVENT: // TODO: Check if this makes sense to be included in the Web build
|
||||
if (!(IS_FULLSCREEN || configWindow.exiting_fullscreen)) {
|
||||
switch (event.window.event) {
|
||||
case SDL_WINDOWEVENT_MOVED:
|
||||
configWindow.x = event.window.data1;
|
||||
configWindow.y = event.window.data2;
|
||||
break;
|
||||
case SDL_WINDOWEVENT_SIZE_CHANGED:
|
||||
configWindow.w = event.window.data1;
|
||||
configWindow.h = event.window.data2;
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case SDL_QUIT:
|
||||
|
@ -252,9 +265,9 @@ static void gfx_sdl_handle_events(void) {
|
|||
break;
|
||||
}
|
||||
}
|
||||
// just check if the fullscreen value has changed and toggle fullscreen if it has
|
||||
if (configFullscreen != window_fullscreen)
|
||||
gfx_sdl_set_fullscreen(configFullscreen);
|
||||
|
||||
gfx_sdl_reset_dimension_and_pos();
|
||||
gfx_sdl_set_fullscreen();
|
||||
}
|
||||
|
||||
static bool gfx_sdl_start_frame(void) {
|
||||
|
@ -274,7 +287,7 @@ static void sync_framerate_with_timer(void) {
|
|||
}
|
||||
|
||||
static void gfx_sdl_swap_buffers_begin(void) {
|
||||
if (!window_vsync)
|
||||
if (!configWindow.vsync)
|
||||
sync_framerate_with_timer();
|
||||
SDL_GL_SwapWindow(wnd);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue