int CommonControl(vout_display_t *vd, int query, va_list args) { vout_display_sys_t *sys = vd->sys; switch (query) { case VOUT_DISPLAY_CHANGE_DISPLAY_SIZE: /* const vout_display_cfg_t *p_cfg, int is_forced */ case VOUT_DISPLAY_CHANGE_DISPLAY_FILLED: /* const vout_display_cfg_t *p_cfg */ case VOUT_DISPLAY_CHANGE_ZOOM: /* const vout_display_cfg_t *p_cfg */ case VOUT_DISPLAY_CHANGE_SOURCE_ASPECT: /* const video_format_t *p_source */ case VOUT_DISPLAY_CHANGE_SOURCE_CROP: { /* const video_format_t *p_source */ const vout_display_cfg_t *cfg; const video_format_t *source; bool is_forced = true; if (query == VOUT_DISPLAY_CHANGE_SOURCE_CROP || query == VOUT_DISPLAY_CHANGE_SOURCE_ASPECT) { cfg = vd->cfg; source = va_arg(args, const video_format_t *); } else { cfg = va_arg(args, const vout_display_cfg_t *); source = &vd->source; if (query == VOUT_DISPLAY_CHANGE_DISPLAY_SIZE) is_forced = va_arg(args, int); } if (query == VOUT_DISPLAY_CHANGE_DISPLAY_SIZE && is_forced) { /* Update dimensions */ if (sys->parent_window) { vout_window_SetSize(sys->parent_window, cfg->display.width, cfg->display.height); } else { RECT rect_window; rect_window.top = 0; rect_window.left = 0; rect_window.right = cfg->display.width; rect_window.bottom = cfg->display.height; AdjustWindowRect(&rect_window, EventThreadGetWindowStyle(sys->event), 0); SetWindowPos(sys->hwnd, 0, 0, 0, rect_window.right - rect_window.left, rect_window.bottom - rect_window.top, SWP_NOMOVE); } return VLC_EGENERIC; } UpdateRects(vd, cfg, source, is_forced); return VLC_SUCCESS; }
static int CommonControlSetFullscreen(vout_display_t *vd, bool is_fullscreen) { vout_display_sys_t *sys = vd->sys; #ifdef MODULE_NAME_IS_direct3d if (sys->use_desktop && is_fullscreen) return VLC_EGENERIC; #endif /* */ if (sys->parent_window) return vout_window_SetFullScreen(sys->parent_window, is_fullscreen); /* */ HWND hwnd = sys->hparent && sys->hfswnd ? sys->hfswnd : sys->hwnd; /* Save the current windows placement/placement to restore when fullscreen is over */ WINDOWPLACEMENT window_placement; window_placement.length = sizeof(WINDOWPLACEMENT); GetWindowPlacement(hwnd, &window_placement); if (is_fullscreen) { msg_Dbg(vd, "entering fullscreen mode"); /* Change window style, no borders and no title bar */ SetWindowLong(hwnd, GWL_STYLE, WS_CLIPCHILDREN | WS_VISIBLE); if (sys->hparent) { /* Retrieve current window position so fullscreen will happen *on the right screen */ HMONITOR hmon = MonitorFromWindow(sys->hparent, MONITOR_DEFAULTTONEAREST); MONITORINFO mi; mi.cbSize = sizeof(MONITORINFO); if (GetMonitorInfo(hmon, &mi)) SetWindowPos(hwnd, 0, mi.rcMonitor.left, mi.rcMonitor.top, mi.rcMonitor.right - mi.rcMonitor.left, mi.rcMonitor.bottom - mi.rcMonitor.top, SWP_NOZORDER|SWP_FRAMECHANGED); } else { /* Maximize non embedded window */ ShowWindow(hwnd, SW_SHOWMAXIMIZED); } if (sys->hparent) { /* Hide the previous window */ RECT rect; GetClientRect(hwnd, &rect); SetParent(sys->hwnd, hwnd); SetWindowPos(sys->hwnd, 0, 0, 0, rect.right, rect.bottom, SWP_NOZORDER|SWP_FRAMECHANGED); HWND topLevelParent = GetAncestor(sys->hparent, GA_ROOT); ShowWindow(topLevelParent, SW_HIDE); } SetForegroundWindow(hwnd); } else { msg_Dbg(vd, "leaving fullscreen mode"); /* Change window style, no borders and no title bar */ SetWindowLong(hwnd, GWL_STYLE, EventThreadGetWindowStyle(sys->event)); if (sys->hparent) { RECT rect; GetClientRect(sys->hparent, &rect); SetParent(sys->hwnd, sys->hparent); SetWindowPos(sys->hwnd, 0, 0, 0, rect.right, rect.bottom, SWP_NOZORDER|SWP_FRAMECHANGED); HWND topLevelParent = GetAncestor(sys->hparent, GA_ROOT); ShowWindow(topLevelParent, SW_SHOW); SetForegroundWindow(sys->hparent); ShowWindow(hwnd, SW_HIDE); } else { /* return to normal window for non embedded vout */ SetWindowPlacement(hwnd, &window_placement); ShowWindow(hwnd, SW_SHOWNORMAL); } } return VLC_SUCCESS; }
int CommonControl(vout_display_t *vd, int query, va_list args) { vout_display_sys_t *sys = vd->sys; switch (query) { case VOUT_DISPLAY_CHANGE_DISPLAY_SIZE: /* const vout_display_cfg_t *p_cfg */ { /* Update dimensions */ const vout_display_cfg_t *cfg = va_arg(args, const vout_display_cfg_t *); RECT rect_window = { .top = 0, .left = 0, .right = cfg->display.width, .bottom = cfg->display.height, }; AdjustWindowRect(&rect_window, EventThreadGetWindowStyle(sys->event), 0); SetWindowPos(sys->hwnd, 0, 0, 0, rect_window.right - rect_window.left, rect_window.bottom - rect_window.top, SWP_NOMOVE); UpdateRects(vd, cfg, NULL, false); return VLC_SUCCESS; } case VOUT_DISPLAY_CHANGE_DISPLAY_FILLED: /* const vout_display_cfg_t *p_cfg */ case VOUT_DISPLAY_CHANGE_ZOOM: /* const vout_display_cfg_t *p_cfg */ case VOUT_DISPLAY_CHANGE_SOURCE_ASPECT: /* const video_format_t *p_source */ case VOUT_DISPLAY_CHANGE_SOURCE_CROP: { /* const video_format_t *p_source */ const vout_display_cfg_t *cfg; if (query == VOUT_DISPLAY_CHANGE_SOURCE_CROP || query == VOUT_DISPLAY_CHANGE_SOURCE_ASPECT) { const video_format_t *source = va_arg(args, const video_format_t *); cfg = vd->cfg; UpdateRects(vd, cfg, source, true); } else { cfg = va_arg(args, const vout_display_cfg_t *); UpdateRects(vd, cfg, NULL, false); } return VLC_SUCCESS; } case VOUT_DISPLAY_CHANGE_WINDOW_STATE: { /* unsigned state */ const unsigned state = va_arg(args, unsigned); const bool is_on_top = (state & VOUT_WINDOW_STATE_ABOVE) != 0; #ifdef MODULE_NAME_IS_direct3d9 if (sys->use_desktop && is_on_top) return VLC_EGENERIC; #endif HMENU hMenu = GetSystemMenu(sys->hwnd, FALSE); if (is_on_top && !(GetWindowLong(sys->hwnd, GWL_EXSTYLE) & WS_EX_TOPMOST)) { CheckMenuItem(hMenu, IDM_TOGGLE_ON_TOP, MF_BYCOMMAND | MFS_CHECKED); SetWindowPos(sys->hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); } else if (!is_on_top && (GetWindowLong(sys->hwnd, GWL_EXSTYLE) & WS_EX_TOPMOST)) { CheckMenuItem(hMenu, IDM_TOGGLE_ON_TOP, MF_BYCOMMAND | MFS_UNCHECKED); SetWindowPos(sys->hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE); } sys->is_on_top = is_on_top; return VLC_SUCCESS; } case VOUT_DISPLAY_CHANGE_FULLSCREEN: { bool fs = va_arg(args, int); if (CommonControlSetFullscreen(vd, fs)) return VLC_EGENERIC; UpdateRects(vd, NULL, NULL, false); return VLC_SUCCESS; } case VOUT_DISPLAY_HIDE_MOUSE: EventThreadMouseHide(sys->event); return VLC_SUCCESS; case VOUT_DISPLAY_RESET_PICTURES: vlc_assert_unreachable(); default: return VLC_EGENERIC; } }