From f051a3afd9d05e5e7783b7273236828e14abbff0 Mon Sep 17 00:00:00 2001 From: "Andrei \"Akari\" Alexeyev" Date: Wed, 1 Mar 2017 02:25:52 +0200 Subject: [PATCH] Disable resizable window by default, added an option to enable it back Not everyone needs a freely resizable window and it causes problems on some systems. --- src/config.h | 1 + src/menu/options.c | 25 ++++++++++++++++----- src/menu/options.h | 1 + src/video.c | 56 ++++++++++++++++++++++++++++++---------------- src/video.h | 6 +++-- 5 files changed, 63 insertions(+), 26 deletions(-) diff --git a/src/config.h b/src/config.h index 390a3673..d6272cb3 100644 --- a/src/config.h +++ b/src/config.h @@ -68,6 +68,7 @@ CONFIGDEF_INT (FULLSCREEN, "fullscreen", 0) \ CONFIGDEF_INT (VID_WIDTH, "vid_width", RESX) \ CONFIGDEF_INT (VID_HEIGHT, "vid_height", RESY) \ + CONFIGDEF_INT (VID_RESIZABLE, "vid_resizable", 0) \ CONFIGDEF_INT (VSYNC, "vsync", 2) \ CONFIGDEF_INT (NO_SHADER, "disable_shader", 0) \ CONFIGDEF_INT (NO_AUDIO, "disable_audio", 0) \ diff --git a/src/menu/options.c b/src/menu/options.c index 2a081789..2a44258c 100644 --- a/src/menu/options.c +++ b/src/menu/options.c @@ -244,6 +244,10 @@ bool bind_bgmvol_dependence(void) { return !config_get_int(CONFIG_NO_MUSIC); } +bool bind_resizable_dependence(void) { + return !config_get_int(CONFIG_FULLSCREEN); +} + int bind_saverpy_get(void *b) { int v = config_get_int(((OptionBinding*)b)->configentry); @@ -273,7 +277,10 @@ void destroy_options_menu(MenuData *m) { if(bind->selected != -1) { VideoMode *m = video.modes + bind->selected; - video_setmode(m->width, m->height, config_get_int(CONFIG_FULLSCREEN)); + video_setmode(m->width, m->height, + config_get_int(CONFIG_FULLSCREEN), + config_get_int(CONFIG_VID_RESIZABLE) + ); config_set_int(CONFIG_VID_WIDTH, video.intended.width); config_set_int(CONFIG_VID_HEIGHT, video.intended.height); @@ -320,6 +327,11 @@ void options_sub_video(MenuData *parent, void *arg) { b = bind_option(CONFIG_FULLSCREEN, bind_common_onoffget, bind_common_onoffset) ); bind_onoff(b); + add_menu_entry(m, "Resizable window", do_nothing, + b = bind_option(CONFIG_VID_RESIZABLE, bind_common_onoffget, bind_common_onoffset) + ); bind_onoff(b); + bind_setdependence(b, bind_resizable_dependence); + add_menu_entry(m, "Vertical synchronization", do_nothing, b = bind_option(CONFIG_VSYNC, bind_common_intget, bind_common_intset) ); bind_addvalue(b, "on"); @@ -344,6 +356,7 @@ void options_sub_video(MenuData *parent, void *arg) { b = bind_option(CONFIG_NO_STAGEBG_FPSLIMIT, bind_common_intget, bind_common_intset) ); bind_setvaluerange(b, 20, 60); bind_setdependence(b, bind_stagebg_fpslimit_dependence); + b->pad++; add_menu_separator(m); add_menu_entry(m, "Back", menu_commonaction_close, NULL); @@ -468,10 +481,12 @@ void options_sub_gamepad(MenuData *parent, void *arg) { add_menu_entry(m, "X axis sensitivity", do_nothing, b = bind_scale(CONFIG_GAMEPAD_AXIS_LR_SENS, -2, 2, 0.05) ); bind_setdependence(b, gamepad_sens_depencence); + b->pad++; add_menu_entry(m, "Y axis sensitivity", do_nothing, b = bind_scale(CONFIG_GAMEPAD_AXIS_UD_SENS, -2, 2, 0.05) - ); bind_setdependence(b, gamepad_sens_depencence); + ); bind_setdependence(b, gamepad_sens_depencence); + b->pad++; add_menu_entry(m, "Dead zone", do_nothing, b = bind_scale(CONFIG_GAMEPAD_AXIS_DEADZONE, 0, 1, 0.01) @@ -590,6 +605,7 @@ void create_options_menu(MenuData *m) { add_menu_entry(m, "Volume", do_nothing, b = bind_scale(CONFIG_SFX_VOLUME, 0, 1, 0.1) ); bind_setdependence(b, bind_sfxvol_dependence); + b->pad++; add_menu_separator(m); @@ -601,6 +617,7 @@ void create_options_menu(MenuData *m) { add_menu_entry(m, "Volume", do_nothing, b = bind_scale(CONFIG_BGM_VOLUME, 0, 1, 0.1) ); bind_setdependence(b, bind_bgmvol_dependence); + b->pad++; add_menu_separator(m); add_menu_entry(m, "Video options…", options_sub_video, NULL); @@ -654,9 +671,7 @@ void draw_options_menu(MenuData *menu) { glColor4f(0.9 + ia * 0.1, 0.6 + ia * 0.4, 0.2 + ia * 0.8, (0.7 + 0.3 * a) * alpha); } - draw_text(AL_Left, - ((bind && bind->dependence)? 20 : 0) // hack hack hack - + 20 - e->drawdata, 20*i, e->name, _fonts.standard); + draw_text(AL_Left, (1 + (bind ? bind->pad : 0)) * 20 - e->drawdata, 20*i, e->name, _fonts.standard); if(bind) { int j, origin = SCREEN_W - 220; diff --git a/src/menu/options.h b/src/menu/options.h index 4e887cbd..55554e62 100644 --- a/src/menu/options.h +++ b/src/menu/options.h @@ -46,6 +46,7 @@ typedef struct OptionBinding { int configentry; BindingType type; bool blockinput; + int pad; } OptionBinding; void draw_options_menu_bg(MenuData*); diff --git a/src/video.c b/src/video.c index 2f02f503..fbdaaf23 100644 --- a/src/video.c +++ b/src/video.c @@ -97,20 +97,12 @@ static void video_init_gl(void) { glClear(GL_COLOR_BUFFER_BIT); } -static void _video_setmode(int w, int h, int fs, int fallback) { - Uint32 flags = SDL_WINDOW_OPENGL; - +static void _video_setmode(int w, int h, uint32_t flags, bool fallback) { if(!libgl_loaded) { load_gl_library(); libgl_loaded = true; } - if(fs) { - flags |= SDL_WINDOW_FULLSCREEN; - } else { - flags |= SDL_WINDOW_RESIZABLE; - } - if(!fallback) { video.intended.width = w; video.intended.height = h; @@ -151,23 +143,39 @@ static void _video_setmode(int w, int h, int fs, int fallback) { return; } - warnx("video_setmode(): setting %dx%d (%s) failed, falling back to %dx%d (windowed)", w, h, fs ? "fullscreen" : "windowed", RESX, RESY); - _video_setmode(RESX, RESY, false, true); + warnx("video_setmode(): setting %dx%d (%s) failed, falling back to %dx%d (windowed)", w, h, + (flags & SDL_WINDOW_FULLSCREEN) ? "fullscreen" : "windowed", RESX, RESY); + _video_setmode(RESX, RESY, flags & ~SDL_WINDOW_FULLSCREEN, true); } -void video_setmode(int w, int h, int fs) { - if(w == video.current.width && h == video.current.height && fs == video_isfullscreen()) - return; +void video_setmode(int w, int h, bool fs, bool resizable) { + if( w == video.current.width && + h == video.current.height && + fs == video_isfullscreen() && + resizable == video_isresizable() + ) return; - _video_setmode(w, h, fs, false); + uint32_t flags = SDL_WINDOW_OPENGL; + + if(fs) { + flags |= SDL_WINDOW_FULLSCREEN; + } else if(flags & SDL_WINDOW_RESIZABLE) { + flags |= SDL_WINDOW_RESIZABLE; + } + + _video_setmode(w, h, flags, false); } -int video_isfullscreen(void) { - return !!(SDL_GetWindowFlags(video.window) & (SDL_WINDOW_FULLSCREEN | SDL_WINDOW_FULLSCREEN_DESKTOP)); +bool video_isresizable(void) { + return SDL_GetWindowFlags(video.window) & SDL_WINDOW_RESIZABLE; +} + +bool video_isfullscreen(void) { + return SDL_GetWindowFlags(video.window) & (SDL_WINDOW_FULLSCREEN | SDL_WINDOW_FULLSCREEN_DESKTOP); } void video_set_fullscreen(bool fullscreen) { - video_setmode(video.intended.width, video.intended.height, fullscreen); + video_setmode(video.intended.width, video.intended.height, fullscreen, video_isresizable()); } void video_toggle_fullscreen(void) { @@ -189,6 +197,10 @@ static void video_cfg_vsync_callback(ConfigIndex idx, ConfigValue v) { video_update_vsync(); } +static void video_cfg_resizable_callback(ConfigIndex idx, ConfigValue v) { + SDL_SetWindowResizable(video.window, config_set_int(idx, v.i)); +} + void video_init(void) { int i, s; bool fullscreen_available = false; @@ -223,10 +235,16 @@ void video_init(void) { // sort it, mainly for the options menu qsort(video.modes, video.mcount, sizeof(VideoMode), video_compare_modes); - video_setmode(config_get_int(CONFIG_VID_WIDTH), config_get_int(CONFIG_VID_HEIGHT), config_get_int(CONFIG_FULLSCREEN)); + video_setmode( + config_get_int(CONFIG_VID_WIDTH), + config_get_int(CONFIG_VID_HEIGHT), + config_get_int(CONFIG_FULLSCREEN), + config_get_int(CONFIG_VID_RESIZABLE) + ); config_set_callback(CONFIG_FULLSCREEN, video_cfg_fullscreen_callback); config_set_callback(CONFIG_VSYNC, video_cfg_vsync_callback); + config_set_callback(CONFIG_VID_RESIZABLE, video_cfg_resizable_callback); } void video_shutdown(void) { diff --git a/src/video.h b/src/video.h index 4f5f9837..1142b7ba 100644 --- a/src/video.h +++ b/src/video.h @@ -12,6 +12,7 @@ #define WINDOW_TITLE "TaiseiProject" #define VIEWPORT_ASPECT_RATIO (4.0f/3.0f) +#include #include typedef struct VideoMode { @@ -33,9 +34,10 @@ Video video; void video_init(void); void video_shutdown(void); -void video_setmode(int w, int h, int fs); +void video_setmode(int w, int h, bool fs, bool resizable); void video_set_viewport(void); -int video_isfullscreen(void); +bool video_isfullscreen(void); +bool video_isresizable(void); void video_set_fullscreen(bool); void video_toggle_fullscreen(void); void video_resize(int w, int h);