static LONG X11DRV_desktop_SetCurrentMode(int mode) { DWORD dwBpp = screen_bpp; if (dwBpp != dd_modes[mode].bpp) { FIXME("Cannot change screen BPP from %d to %d\n", dwBpp, dd_modes[mode].bpp); /* Ignore the depth mismatch * * Some (older) applications require a specific bit depth, this will allow them * to run. X11drv performs a color depth conversion if needed. */ } TRACE("Resizing Wine desktop window to %dx%d\n", dd_modes[mode].width, dd_modes[mode].height); X11DRV_resize_desktop(dd_modes[mode].width, dd_modes[mode].height); return DISP_CHANGE_SUCCESSFUL; }
static LONG xrandr12_set_current_mode( int mode ) { Status status = RRSetConfigFailed; XRRScreenResources *resources; XRRCrtcInfo *crtc_info; mode = mode % xrandr_mode_count; if (!(resources = pXRRGetScreenResourcesCurrent( gdi_display, root_window ))) { ERR("Failed to get screen resources.\n"); return DISP_CHANGE_FAILED; } if (resources->ncrtc <= primary_crtc || !(crtc_info = pXRRGetCrtcInfo( gdi_display, resources, resources->crtcs[primary_crtc] ))) { pXRRFreeScreenResources( resources ); ERR("Failed to get CRTC info.\n"); return DISP_CHANGE_FAILED; } TRACE("CRTC %d: mode %#lx, %ux%u+%d+%d.\n", primary_crtc, crtc_info->mode, crtc_info->width, crtc_info->height, crtc_info->x, crtc_info->y); status = pXRRSetCrtcConfig( gdi_display, resources, resources->crtcs[primary_crtc], CurrentTime, crtc_info->x, crtc_info->y, xrandr12_modes[mode], crtc_info->rotation, crtc_info->outputs, crtc_info->noutput ); pXRRFreeCrtcInfo( crtc_info ); pXRRFreeScreenResources( resources ); if (status != RRSetConfigSuccess) { ERR("Resolution change not successful -- perhaps display has changed?\n"); return DISP_CHANGE_FAILED; } xrandr_current_mode = mode; X11DRV_resize_desktop( dd_modes[mode].width, dd_modes[mode].height ); return DISP_CHANGE_SUCCESSFUL; }
static LONG xrandr10_set_current_mode( int mode ) { SizeID size; Rotation rot; Window root; XRRScreenConfiguration *sc; Status stat; short rate; root = DefaultRootWindow( gdi_display ); sc = pXRRGetScreenInfo (gdi_display, root); pXRRConfigCurrentConfiguration (sc, &rot); mode = mode % xrandr_mode_count; TRACE("Changing Resolution to %dx%d @%d Hz\n", dd_modes[mode].width, dd_modes[mode].height, dd_modes[mode].refresh_rate); size = xrandr10_modes[mode]; rate = dd_modes[mode].refresh_rate; if (rate) stat = pXRRSetScreenConfigAndRate( gdi_display, sc, root, size, rot, rate, CurrentTime ); else stat = pXRRSetScreenConfig( gdi_display, sc, root, size, rot, CurrentTime ); pXRRFreeScreenConfigInfo(sc); if (stat == RRSetConfigSuccess) { xrandr_current_mode = mode; X11DRV_resize_desktop( dd_modes[mode].width, dd_modes[mode].height ); return DISP_CHANGE_SUCCESSFUL; } ERR("Resolution change not successful -- perhaps display has changed?\n"); return DISP_CHANGE_FAILED; }
static LONG X11DRV_XF86VM_SetCurrentMode(int mode) { DWORD dwBpp = screen_bpp; /* only set modes from the original color depth */ if (dwBpp != dd_modes[mode].dwBPP) { FIXME("Cannot change screen BPP from %d to %d\n", dwBpp, dd_modes[mode].dwBPP); } mode = mode % real_xf86vm_mode_count; wine_tsx11_lock(); TRACE("Resizing X display to %dx%d\n", real_xf86vm_modes[mode]->hdisplay, real_xf86vm_modes[mode]->vdisplay); XF86VidModeSwitchToMode(gdi_display, DefaultScreen(gdi_display), real_xf86vm_modes[mode]); #if 0 /* it is said that SetViewPort causes problems with some X servers */ XF86VidModeSetViewPort(gdi_display, DefaultScreen(gdi_display), 0, 0); #else XWarpPointer(gdi_display, None, DefaultRootWindow(gdi_display), 0, 0, 0, 0, 0, 0); #endif XSync(gdi_display, False); wine_tsx11_unlock(); X11DRV_resize_desktop( real_xf86vm_modes[mode]->hdisplay, real_xf86vm_modes[mode]->vdisplay ); return DISP_CHANGE_SUCCESSFUL; }
static LONG X11DRV_XRandR_SetCurrentMode(int mode) { SizeID size; Rotation rot; Window root; XRRScreenConfiguration *sc; Status stat = RRSetConfigSuccess; short rate; unsigned int i; int j; wine_tsx11_lock(); root = RootWindow (gdi_display, DefaultScreen(gdi_display)); sc = pXRRGetScreenInfo (gdi_display, root); size = pXRRConfigCurrentConfiguration (sc, &rot); mode = mode%real_xrandr_modes_count; TRACE("Changing Resolution to %dx%d @%d Hz\n", dd_modes[mode].dwWidth, dd_modes[mode].dwHeight, dd_modes[mode].wRefreshRate); for (i = 0; i < real_xrandr_sizes_count; i++) { if ( (dd_modes[mode].dwWidth == real_xrandr_sizes[i].width ) && (dd_modes[mode].dwHeight == real_xrandr_sizes[i].height) ) { size = i; if (real_xrandr_rates_count[i]) { for (j=0; j < real_xrandr_rates_count[i]; j++) { if (dd_modes[mode].wRefreshRate == real_xrandr_rates[i][j]) { rate = real_xrandr_rates[i][j]; TRACE("Resizing X display to %dx%d @%d Hz\n", dd_modes[mode].dwWidth, dd_modes[mode].dwHeight, rate); stat = pXRRSetScreenConfigAndRate (gdi_display, sc, root, size, rot, rate, CurrentTime); break; } } } else { TRACE("Resizing X display to %dx%d <default Hz>\n", dd_modes[mode].dwWidth, dd_modes[mode].dwHeight); stat = pXRRSetScreenConfig (gdi_display, sc, root, size, rot, CurrentTime); } break; } } pXRRFreeScreenConfigInfo(sc); wine_tsx11_unlock(); if (stat == RRSetConfigSuccess) { X11DRV_resize_desktop( dd_modes[mode].dwWidth, dd_modes[mode].dwHeight ); return DISP_CHANGE_SUCCESSFUL; } ERR("Resolution change not successful -- perhaps display has changed?\n"); return DISP_CHANGE_FAILED; }