From a02c7f3e6882d7ff4aa2c8cde77a16e8328ee567 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 3 Jul 2023 05:13:47 +0200 Subject: [PATCH] new .ini setting #toggle_borderless --- inc/config.h | 1 + inc/dd.h | 1 + src/config.c | 13 ++++++++++- src/utils.c | 64 +++++++++++++++++++++++++++++++++++---------------- src/wndproc.c | 2 +- 5 files changed, 59 insertions(+), 22 deletions(-) diff --git a/inc/config.h b/inc/config.h index 71e8693..1b40a22 100644 --- a/inc/config.h +++ b/inc/config.h @@ -9,6 +9,7 @@ typedef struct CNCDDRAWCONFIG { RECT window_rect; int window_state; + int borderless_state; char ini_path[MAX_PATH]; char game_path[MAX_PATH]; char process_file_name[MAX_PATH]; diff --git a/inc/dd.h b/inc/dd.h index b164176..76a1922 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -142,6 +142,7 @@ typedef struct CNCDDRAW BOOL opengl_core; BOOL accurate_timers; BOOL resizable; + BOOL toggle_borderless; BOOL nonexclusive; int fixchilds; BOOL fixwndprochook; diff --git a/src/config.c b/src/config.c index 6327883..949ed60 100644 --- a/src/config.c +++ b/src/config.c @@ -15,7 +15,7 @@ static void cfg_init(); static void cfg_create_ini(); CNCDDRAWCONFIG g_config = - { .window_rect = {.left = -32000, .top = -32000, .right = 0, .bottom = 0 }, .window_state = -1 }; + { .window_rect = {.left = -32000, .top = -32000, .right = 0, .bottom = 0 }, .window_state = -1, .borderless_state = -1 }; void cfg_load() { @@ -35,6 +35,7 @@ void cfg_load() g_ddraw->vhack = cfg_get_bool("vhack", FALSE); g_ddraw->accurate_timers = cfg_get_bool("accuratetimers", FALSE); g_ddraw->resizable = cfg_get_bool("resizable", TRUE); + g_ddraw->toggle_borderless = cfg_get_bool("toggle_borderless", FALSE); g_ddraw->nonexclusive = cfg_get_bool("nonexclusive", FALSE); g_ddraw->fixchilds = cfg_get_int("fixchilds", FIX_CHILDS_DETECT_PAINT); g_ddraw->fixwndprochook = cfg_get_bool("fixwndprochook", FALSE); @@ -127,6 +128,8 @@ void cfg_load() g_ddraw->flip_limiter.tick_length = (DWORD)(flip_len + 0.5f); } + g_ddraw->fullscreen = cfg_get_bool("fullscreen", FALSE); + if (cfg_get_bool("singlecpu", TRUE)) { SetProcessAffinityMask(GetCurrentProcess(), 1); @@ -228,6 +231,11 @@ void cfg_save() { WritePrivateProfileString(section, "windowed", g_config.window_state ? "true" : "false", g_config.ini_path); } + + if (g_config.borderless_state != -1) + { + WritePrivateProfileString(section, "fullscreen", g_config.borderless_state ? "true" : "false", g_config.ini_path); + } } static void cfg_create_ini() @@ -308,6 +316,9 @@ static void cfg_create_ini() "; Where should screenshots be saved\n" "screenshotdir=.\\Screenshots\\\n" "\n" + "; Switch between windowed/borderless modes with alt+enter rather than windowed/fullscreen modes\n" + "toggle_borderless=false\n" + "\n" "\n" "\n" "; ### Compatibility settings ###\n" diff --git a/src/utils.c b/src/utils.c index 4aef256..30514a5 100644 --- a/src/utils.c +++ b/src/utils.c @@ -333,32 +333,56 @@ void util_toggle_fullscreen() if (g_ddraw->bnet_active) return; - if (g_ddraw->windowed) + if (g_ddraw->toggle_borderless) { - mouse_unlock(); - - g_config.window_state = g_ddraw->windowed = FALSE; - dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, SDM_LEAVE_WINDOWED); - util_update_bnet_pos(0, 0); - - mouse_lock(); - } - else - { - mouse_unlock(); - g_config.window_state = g_ddraw->windowed = TRUE; - - if (g_ddraw->renderer == d3d9_render_main) + if (!g_ddraw->fullscreen) { - d3d9_reset(g_ddraw->windowed); + mouse_unlock(); + + g_config.borderless_state = g_ddraw->fullscreen = TRUE; + dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, 0); + + mouse_lock(); } else { - ChangeDisplaySettings(NULL, g_ddraw->bnet_active ? CDS_FULLSCREEN : 0); - } + mouse_unlock(); - dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, SDM_LEAVE_FULLSCREEN); - //mouse_lock(); + g_config.borderless_state = g_ddraw->fullscreen = FALSE; + dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, 0); + + //mouse_lock(); + } + } + else + { + if (g_ddraw->windowed) + { + mouse_unlock(); + + g_config.window_state = g_ddraw->windowed = FALSE; + dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, SDM_LEAVE_WINDOWED); + util_update_bnet_pos(0, 0); + + mouse_lock(); + } + else + { + mouse_unlock(); + g_config.window_state = g_ddraw->windowed = TRUE; + + if (g_ddraw->renderer == d3d9_render_main) + { + d3d9_reset(g_ddraw->windowed); + } + else + { + ChangeDisplaySettings(NULL, g_ddraw->bnet_active ? CDS_FULLSCREEN : 0); + } + + dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, SDM_LEAVE_FULLSCREEN); + //mouse_lock(); + } } } diff --git a/src/wndproc.c b/src/wndproc.c index 4a30073..925dade 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -611,7 +611,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (g_ddraw->hotkeys.toggle_fullscreen && wParam == g_ddraw->hotkeys.toggle_fullscreen && - !g_ddraw->fullscreen && + (!g_ddraw->fullscreen || (g_ddraw->windowed && g_ddraw->toggle_borderless)) && context_code && !key_state) {