void X11DRV_XRandR_Init(void) { Bool ok; int i, nmodes = 0; if (xrandr_major) return; /* already initialized? */ if (!usexrandr) return; /* disabled in config */ if (root_window != DefaultRootWindow( gdi_display )) return; if (!load_xrandr()) return; /* can't load the Xrandr library */ /* see if Xrandr is available */ wine_tsx11_lock(); ok = pXRRQueryExtension(gdi_display, &xrandr_event, &xrandr_error); if (ok) { X11DRV_expect_error(gdi_display, XRandRErrorHandler, NULL); ok = pXRRQueryVersion(gdi_display, &xrandr_major, &xrandr_minor); if (X11DRV_check_error()) ok = FALSE; } if (ok) { TRACE("Found XRandR - major: %d, minor: %d\n", xrandr_major, xrandr_minor); /* retrieve modes */ real_xrandr_sizes = pXRRSizes(gdi_display, DefaultScreen(gdi_display), &real_xrandr_sizes_count); ok = (real_xrandr_sizes_count>0); } if (ok) { TRACE("XRandR: found %u resolutions sizes\n", real_xrandr_sizes_count); real_xrandr_rates = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(short *) * real_xrandr_sizes_count); real_xrandr_rates_count = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(int) * real_xrandr_sizes_count); for (i=0; i < real_xrandr_sizes_count; i++) { real_xrandr_rates[i] = pXRRRates (gdi_display, DefaultScreen(gdi_display), i, &(real_xrandr_rates_count[i])); TRACE("- at %d: %dx%d (%d rates):", i, real_xrandr_sizes[i].width, real_xrandr_sizes[i].height, real_xrandr_rates_count[i]); if (real_xrandr_rates_count[i]) { int j; nmodes += real_xrandr_rates_count[i]; for (j = 0; j < real_xrandr_rates_count[i]; ++j) { if (j > 0) TRACE(","); TRACE(" %d", real_xrandr_rates[i][j]); } } else { nmodes++; TRACE(" <default>"); } TRACE(" Hz\n"); } } wine_tsx11_unlock(); if (!ok) return; real_xrandr_modes_count = nmodes; TRACE("XRandR modes: count=%d\n", nmodes); dd_modes = X11DRV_Settings_SetHandlers("XRandR", X11DRV_XRandR_GetCurrentMode, X11DRV_XRandR_SetCurrentMode, nmodes, 1); make_modes(); X11DRV_Settings_AddDepthModes(); dd_mode_count = X11DRV_Settings_GetModeCount(); TRACE("Available DD modes: count=%d\n", dd_mode_count); TRACE("Enabling XRandR\n"); }
static void xrandr10_init_modes(void) { XRRScreenSize *sizes; int sizes_count; int i, j, nmodes = 0; sizes = pXRRSizes( gdi_display, DefaultScreen(gdi_display), &sizes_count ); if (sizes_count <= 0) return; TRACE("XRandR: found %d sizes.\n", sizes_count); for (i = 0; i < sizes_count; ++i) { int rates_count; short *rates; rates = pXRRRates( gdi_display, DefaultScreen(gdi_display), i, &rates_count ); TRACE("- at %d: %dx%d (%d rates):", i, sizes[i].width, sizes[i].height, rates_count); if (rates_count) { nmodes += rates_count; for (j = 0; j < rates_count; ++j) { if (j > 0) TRACE(","); TRACE(" %d", rates[j]); } } else { ++nmodes; TRACE(" <default>"); } TRACE(" Hz\n"); } TRACE("XRandR modes: count=%d\n", nmodes); if (!(xrandr10_modes = HeapAlloc( GetProcessHeap(), 0, sizeof(*xrandr10_modes) * nmodes ))) { ERR("Failed to allocate xrandr mode info array.\n"); return; } dd_modes = X11DRV_Settings_SetHandlers( "XRandR 1.0", xrandr10_get_current_mode, xrandr10_set_current_mode, nmodes, 1 ); xrandr_mode_count = 0; for (i = 0; i < sizes_count; ++i) { int rates_count; short *rates; rates = pXRRRates( gdi_display, DefaultScreen(gdi_display), i, &rates_count ); if (rates_count) { for (j = 0; j < rates_count; ++j) { X11DRV_Settings_AddOneMode( sizes[i].width, sizes[i].height, 0, rates[j] ); xrandr10_modes[xrandr_mode_count++] = i; } } else { X11DRV_Settings_AddOneMode( sizes[i].width, sizes[i].height, 0, 0 ); xrandr10_modes[xrandr_mode_count++] = i; } } X11DRV_Settings_AddDepthModes(); nmodes = X11DRV_Settings_GetModeCount(); TRACE("Available DD modes: count=%d\n", nmodes); TRACE("Enabling XRandR\n"); }