static void gfx_ctx_get_video_size(unsigned *width, unsigned *height) { if (!g_hwnd) { HMONITOR hm_to_use = NULL; MONITORINFOEX current_mon; monitor_info(¤t_mon, &hm_to_use); RECT mon_rect = current_mon.rcMonitor; *width = mon_rect.right - mon_rect.left; *height = mon_rect.bottom - mon_rect.top; } else { *width = g_resize_width; *height = g_resize_height; } }
static bool gfx_ctx_set_video_mode( unsigned width, unsigned height, bool fullscreen) { DWORD style; RECT rect = {0}; HMONITOR hm_to_use = NULL; MONITORINFOEX current_mon; monitor_info(¤t_mon, &hm_to_use); RECT mon_rect = current_mon.rcMonitor; g_resize_width = width; g_resize_height = height; bool windowed_full = g_settings.video.windowed_fullscreen; 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 (!set_fullscreen(width, height, current_mon.szDevice)) goto error; // display settings might have changed, get new coordinates GetMonitorInfo(hm_to_use, (MONITORINFO*)¤t_mon); mon_rect = current_mon.rcMonitor; g_restore_desktop = true; } } else { style = WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN; rect.right = width; rect.bottom = height; AdjustWindowRect(&rect, style, FALSE); width = rect.right - rect.left; height = rect.bottom - rect.top; } g_hwnd = CreateWindowEx(0, "RetroArch", "RetroArch", style, fullscreen ? mon_rect.left : g_pos_x, fullscreen ? mon_rect.top : g_pos_y, width, height, NULL, NULL, NULL, NULL); if (!g_hwnd) goto error; if (!fullscreen) { SetMenu(g_hwnd, LoadMenu(GetModuleHandle(NULL), MAKEINTRESOURCE(IDR_MENU))); RECT rcTemp = {0, 0, g_resize_height, 0x7FFF}; // 0x7FFF="Infinite" height SendMessage(g_hwnd, WM_NCCALCSIZE, FALSE, (LPARAM)&rcTemp); // recalculate margin, taking possible menu wrap into account g_resize_height += rcTemp.top + rect.top; // extend by new top margin and substract previous margin SetWindowPos(g_hwnd, NULL, 0, 0, g_resize_width, g_resize_height, SWP_NOMOVE); } if (!fullscreen || windowed_full) { ShowWindow(g_hwnd, SW_RESTORE); UpdateWindow(g_hwnd); SetForegroundWindow(g_hwnd); SetFocus(g_hwnd); } show_cursor(!fullscreen); // Wait until GL context is created (or failed to do so ...) MSG msg; while (!g_inited && !g_quit && GetMessage(&msg, g_hwnd, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } if (g_quit) goto error; p_swap_interval = (BOOL (APIENTRY *)(int))wglGetProcAddress("wglSwapIntervalEXT"); gfx_ctx_swap_interval(g_interval); driver.display_type = RARCH_DISPLAY_WIN32; driver.video_display = 0; driver.video_window = (uintptr_t)g_hwnd; return true; error: gfx_ctx_destroy(); return false; }
static bool gfx_ctx_wgl_set_video_mode(void *data, unsigned width, unsigned height, bool fullscreen) { DWORD style; RECT rect = {0}; HMONITOR hm_to_use = NULL; MONITORINFOEX current_mon; monitor_info(¤t_mon, &hm_to_use); RECT mon_rect = current_mon.rcMonitor; g_resize_width = width; g_resize_height = height; bool windowed_full = g_settings.video.windowed_fullscreen; 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 (!set_fullscreen(width, height, current_mon.szDevice)) goto error; // display settings might have changed, get new coordinates GetMonitorInfo(hm_to_use, (MONITORINFO*)¤t_mon); mon_rect = current_mon.rcMonitor; g_restore_desktop = true; } } else { style = WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN; rect.right = width; rect.bottom = height; AdjustWindowRect(&rect, style, FALSE); width = rect.right - rect.left; height = rect.bottom - rect.top; } g_hwnd = CreateWindowEx(0, "RetroArch", "RetroArch", style, fullscreen ? mon_rect.left : g_pos_x, fullscreen ? mon_rect.top : g_pos_y, width, height, NULL, NULL, NULL, NULL); if (!g_hwnd) goto error; if (!fullscreen || windowed_full) { ShowWindow(g_hwnd, SW_RESTORE); UpdateWindow(g_hwnd); SetForegroundWindow(g_hwnd); SetFocus(g_hwnd); } show_cursor(!fullscreen); // Wait until GL context is created (or failed to do so ...) MSG msg; while (!g_inited && !g_quit && GetMessage(&msg, g_hwnd, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } if (g_quit) goto error; p_swap_interval = (BOOL (APIENTRY *)(int))wglGetProcAddress("wglSwapIntervalEXT"); gfx_ctx_wgl_swap_interval(data, g_interval); driver.display_type = RARCH_DISPLAY_WIN32; driver.video_display = 0; driver.video_window = (uintptr_t)g_hwnd; return true; error: gfx_ctx_wgl_destroy(data); return false; }
static bool gfx_ctx_wgl_set_video_mode(void *data, unsigned width, unsigned height, bool fullscreen) { DWORD style; MSG msg; RECT mon_rect; MONITORINFOEX current_mon; float refresh_mod; unsigned refresh; bool windowed_full; RECT rect = {0}; HMONITOR hm_to_use = NULL; driver_t *driver = driver_get_ptr(); settings_t *settings = config_get_ptr(); monitor_info(¤t_mon, &hm_to_use); mon_rect = current_mon.rcMonitor; g_resize_width = width; g_resize_height = height; /* 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. */ refresh_mod = settings->video.black_frame_insertion ? 2.0f : 1.0f; refresh = round(settings->video.refresh_rate * refresh_mod); windowed_full = settings->video.windowed_fullscreen; 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 (!set_fullscreen(width, height, refresh, current_mon.szDevice)) goto error; /* Display settings might have changed, get new coordinates. */ GetMonitorInfo(hm_to_use, (MONITORINFO*)¤t_mon); mon_rect = current_mon.rcMonitor; g_restore_desktop = true; } } 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; } g_hwnd = CreateWindowEx(0, "RetroArch", "RetroArch", style, fullscreen ? mon_rect.left : g_pos_x, fullscreen ? mon_rect.top : g_pos_y, width, height, NULL, NULL, NULL, NULL); if (!g_hwnd) goto error; if (!fullscreen || windowed_full) { if (!fullscreen && settings->ui.menubar_enable) { RECT rc_temp = {0, 0, (LONG)height, 0x7FFF}; SetMenu(g_hwnd, LoadMenu(GetModuleHandle(NULL),MAKEINTRESOURCE(IDR_MENU))); SendMessage(g_hwnd, WM_NCCALCSIZE, FALSE, (LPARAM)&rc_temp); g_resize_height = height += rc_temp.top + rect.top; SetWindowPos(g_hwnd, NULL, 0, 0, width, height, SWP_NOMOVE); } ShowWindow(g_hwnd, SW_RESTORE); UpdateWindow(g_hwnd); SetForegroundWindow(g_hwnd); SetFocus(g_hwnd); } win32_show_cursor(!fullscreen); /* Wait until GL context is created (or failed to do so ...) */ while (!g_inited && !g_quit && GetMessage(&msg, g_hwnd, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } if (g_quit) goto error; p_swap_interval = (BOOL (APIENTRY *)(int))wglGetProcAddress("wglSwapIntervalEXT"); gfx_ctx_wgl_swap_interval(data, g_interval); driver->display_type = RARCH_DISPLAY_WIN32; driver->video_display = 0; driver->video_window = (uintptr_t)g_hwnd; return true; error: gfx_ctx_wgl_destroy(data); return false; }