diff --git a/gfx/common/win32_common.cpp b/gfx/common/win32_common.cpp index 6599af45ea..52c44f423d 100644 --- a/gfx/common/win32_common.cpp +++ b/gfx/common/win32_common.cpp @@ -446,6 +446,53 @@ bool win32_suppress_screensaver(void *data, bool enable) #endif } +void win32_set_style(MONITORINFOEX *current_mon, HMONITOR *hm_to_use, + unsigned *width, unsigned *height, bool fullscreen, bool windowed_full, + RECT *rect, RECT *mon_rect, DWORD *style) +{ +#ifndef _XBOX + settings_t *settings = config_get_ptr(); + + /* Windows only reports the refresh rates for modelines as + * an integer, so video.refresh_rate needs to be rounded. Also, account + * for black frame insertion using video.refresh_rate set to half + * of the display refresh rate, as well as higher vsync swap intervals. */ + float refresh_mod = settings->video.black_frame_insertion ? 2.0f : 1.0f; + unsigned refresh = roundf(settings->video.refresh_rate * refresh_mod * settings->video.swap_interval); + + if (fullscreen) + { + if (windowed_full) + { + *style = WS_EX_TOPMOST | WS_POPUP; + g_resize_width = *width = mon_rect->right - mon_rect->left; + g_resize_height = *height = mon_rect->bottom - mon_rect->top; + } + else + { + *style = WS_POPUP | WS_VISIBLE; + + if (!win32_monitor_set_fullscreen(*width, *height, + refresh, current_mon->szDevice)) + {} + + /* Display settings might have changed, get new coordinates. */ + GetMonitorInfo(*hm_to_use, (MONITORINFO*)¤t_mon); + *mon_rect = current_mon->rcMonitor; + } + } + else + { + *style = WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN; + rect->right = *width; + rect->bottom = *height; + AdjustWindowRect(rect, *style, FALSE); + g_resize_width = *width = rect->right - rect->left; + g_resize_height = *height = rect->bottom - rect->top; + } +#endif +} + void win32_set_window(unsigned *width, unsigned *height, bool fullscreen, bool windowed_full, void *rect_data) { diff --git a/gfx/common/win32_common.h b/gfx/common/win32_common.h index db68125022..091e11b339 100644 --- a/gfx/common/win32_common.h +++ b/gfx/common/win32_common.h @@ -98,6 +98,10 @@ void win32_check_window(bool *quit, void win32_set_window(unsigned *width, unsigned *height, bool fullscreen, bool windowed_full, void *rect_data); +void win32_set_style(MONITORINFOEX *current_mon, HMONITOR *hm_to_use, + unsigned *width, unsigned *height, bool fullscreen, bool windowed_full, + RECT *rect, RECT *mon_rect, DWORD *style); + void win32_window_reset(void); void win32_destroy_window(void); diff --git a/gfx/d3d/d3d.cpp b/gfx/d3d/d3d.cpp index 7cb36d9f21..07a9fa745c 100644 --- a/gfx/d3d/d3d.cpp +++ b/gfx/d3d/d3d.cpp @@ -997,46 +997,11 @@ static bool d3d_construct(d3d_video_t *d3d, #ifdef HAVE_WINDOW DWORD style; unsigned win_width, win_height; - RECT rect = {0}; - /* Windows only reports the refresh rates for modelines as - * an integer, so video.refresh_rate needs to be rounded. Also, account - * for black frame insertion using video.refresh_rate set to half - * of the display refresh rate, as well as higher vsync swap intervals. */ - float refresh_mod = settings->video.black_frame_insertion ? 2.0f : 1.0f; - unsigned refresh = roundf(settings->video.refresh_rate * refresh_mod * settings->video.swap_interval); + RECT rect = {0}; video_driver_get_size(&win_width, &win_height); - if (info->fullscreen) - { - if (windowed_full) - { - style = WS_EX_TOPMOST | WS_POPUP; - g_resize_width = win_width = mon_rect.right - mon_rect.left; - g_resize_height = win_height = mon_rect.bottom - mon_rect.top; - } - else - { - style = WS_POPUP | WS_VISIBLE; - - if (!win32_monitor_set_fullscreen(win_width, win_height, - refresh, current_mon.szDevice)) - {} - - /* Display settings might have changed, get new coordinates. */ - GetMonitorInfo(hm_to_use, (MONITORINFO*)¤t_mon); - mon_rect = current_mon.rcMonitor; - } - } - else - { - style = WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN; - rect.right = win_width; - rect.bottom = win_height; - AdjustWindowRect(&rect, style, FALSE); - g_resize_width = win_width = rect.right - rect.left; - g_resize_height = win_height = rect.bottom - rect.top; - } + win32_set_style(¤t_mon, &hm_to_use, &win_width, &win_height, info->fullscreen, windowed_full, &rect, &mon_rect, &style); win32_window_create(d3d, style, &mon_rect, win_width, win_height, info->fullscreen);