bool win32_set_video_mode(void *data, unsigned width, unsigned height, bool fullscreen) { #ifndef _XBOX DWORD style; MSG msg; RECT mon_rect; unsigned mon_id; MONITORINFOEX current_mon; bool windowed_full; RECT rect = {0}; HMONITOR hm_to_use = NULL; settings_t *settings = config_get_ptr(); win32_monitor_info(¤t_mon, &hm_to_use, &mon_id); mon_rect = current_mon.rcMonitor; g_resize_width = width; g_resize_height = height; windowed_full = settings->video.windowed_fullscreen; win32_set_style(¤t_mon, &hm_to_use, &width, &height, fullscreen, windowed_full, &rect, &mon_rect, &style); if (!win32_window_create(data, style, &mon_rect, width, height, fullscreen)) return false; win32_set_window(&width, &height, fullscreen, windowed_full, &rect); /* Wait until context is created (or failed to do so ...) */ while (!g_inited && !g_quit && GetMessage(&msg, main_window.hwnd, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } if (g_quit) return false; #endif return true; }
static bool d3d_construct(d3d_video_t *d3d, const video_info_t *info, const input_driver_t **input, void **input_data) { unsigned full_x, full_y; settings_t *settings = config_get_ptr(); d3d->should_resize = false; #if defined(HAVE_MENU) d3d->menu = new overlay_t(); if (!d3d->menu) return false; d3d->menu->tex_coords[0] = 0; d3d->menu->tex_coords[1] = 0; d3d->menu->tex_coords[2] = 1; d3d->menu->tex_coords[3] = 1; d3d->menu->vert_coords[0] = 0; d3d->menu->vert_coords[1] = 1; d3d->menu->vert_coords[2] = 1; d3d->menu->vert_coords[3] = -1; #endif memset(&d3d->windowClass, 0, sizeof(d3d->windowClass)); #ifdef HAVE_WINDOW d3d->windowClass.lpfnWndProc = WndProcD3D; win32_window_init(&d3d->windowClass, true, NULL); #endif #ifdef HAVE_MONITOR bool windowed_full; RECT mon_rect; MONITORINFOEX current_mon; HMONITOR hm_to_use; win32_monitor_info(¤t_mon, &hm_to_use, &d3d->cur_mon_id); mon_rect = current_mon.rcMonitor; g_resize_width = info->width; g_resize_height = info->height; windowed_full = settings->video.windowed_fullscreen; full_x = (windowed_full || info->width == 0) ? (mon_rect.right - mon_rect.left) : info->width; full_y = (windowed_full || info->height == 0) ? (mon_rect.bottom - mon_rect.top) : info->height; RARCH_LOG("[D3D]: Monitor size: %dx%d.\n", (int)(mon_rect.right - mon_rect.left), (int)(mon_rect.bottom - mon_rect.top)); #else gfx_ctx_get_video_size(&full_x, &full_y); #endif { unsigned new_width = info->fullscreen ? full_x : info->width; unsigned new_height = info->fullscreen ? full_y : info->height; video_driver_set_size(&new_width, &new_height); } #ifdef HAVE_WINDOW DWORD style; unsigned win_width, win_height; RECT rect = {0}; video_driver_get_size(&win_width, &win_height); 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); win32_set_window(&win_width, &win_height, info->fullscreen, windowed_full, &rect); #endif #ifdef HAVE_SHADERS /* This should only be done once here * to avoid set_shader() to be overridden * later. */ enum rarch_shader_type type = video_shader_parse_type(settings->video.shader_path, RARCH_SHADER_NONE); if (settings->video.shader_enable && type == RARCH_SHADER_CG) d3d->shader_path = settings->video.shader_path; if (!d3d_process_shader(d3d)) return false; #endif d3d->video_info = *info; if (!d3d_initialize(d3d, &d3d->video_info)) return false; gfx_ctx_input_driver(input, input_data); RARCH_LOG("[D3D]: Init complete.\n"); return true; }
bool win32_set_video_mode(void *data, unsigned width, unsigned height, bool fullscreen) { #ifndef _XBOX DWORD style; MSG msg; RECT mon_rect; unsigned mon_id; 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(); win32_monitor_info(¤t_mon, &hm_to_use, &mon_id); 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, as well as higher vsync swap intervals. */ refresh_mod = settings->video.black_frame_insertion ? 2.0f : 1.0f; refresh = roundf(settings->video.refresh_rate * refresh_mod * settings->video.swap_interval); 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 (!win32_monitor_set_fullscreen(width, height, refresh, current_mon.szDevice)) return false; /* 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; } if (!win32_window_create(NULL, style, &mon_rect, width, height, fullscreen)) return false; 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 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) return false; #endif return true; }