コード例 #1
0
ファイル: Monitor.cpp プロジェクト: JSandrew4/FastGdk
VideoMode Monitor::GetCurrentVideoMode() {
#if defined(FastOSWindows)
    DEVMODE dm;
    memset(&dm, 0, sizeof(DEVMODE));
    dm.dmSize = sizeof(DEVMODE);
    EnumDisplaySettingsEx(mWin32DeviceName.GetWString().mData,
                          ENUM_CURRENT_SETTINGS, &dm, 0);
    return VideoMode(dm.dmPelsWidth, dm.dmPelsHeight,
                     dm.dmBitsPerPel, dm.dmDisplayFrequency);
#elif defined(FastOSLinux)
    XRRScreenResources *xrrScreenResources =
        (XRRScreenResources*)mDisplay->GetXRRScreenResources();
    ::Display *xdisplay = (::Display*)mDisplay->GetXDisplay();
    RRMode mode = ((XRRCrtcInfo*)mXRRCrtcInfo)->mode;
    // Find matching mode ID
    for (Int i = 0; i < xrrScreenResources->nmode; i++) {
        if (mode == xrrScreenResources->modes[i].id) {
            XRRModeInfo &xrrModeInfo = xrrScreenResources->modes[i];
            return VideoMode(xrrModeInfo.width, xrrModeInfo.height,
                             XDefaultDepth(xdisplay, mID), (Int)(xrrModeInfo.dotClock /
                                     (xrrModeInfo.hTotal * xrrModeInfo.vTotal)));
        }
    }
    return VideoMode();
#elif defined(FastOSMacOSX)
    VideoMode vm;
    QZGetCurrentVideoMode(mMacMonitorID, &vm);
    return vm;
#endif
}
コード例 #2
0
ファイル: GenericSLM.cpp プロジェクト: bwagjor/Thesis
HDC GenericSLM::CreateDeviceContext(string deviceName) {
	DEVMODE dm;
	ZeroMemory(&dm, sizeof(dm));
	dm.dmSize = sizeof(dm);
   EnumDisplaySettingsEx(deviceName.c_str(), ENUM_REGISTRY_SETTINGS, &dm, 0);
   return CreateDC(deviceName.c_str(), 0, 0, &dm);
}
コード例 #3
0
ファイル: Window.cpp プロジェクト: HirokiMiyaoka/Mikan
// ディスプレイの位置とサイズを返す
int Window::GetDisplayRect( long displaynum, int *x, int *y, int *width, int *height )
{
	DISPLAY_DEVICE disdev;
	DEVMODE devmode;

	if ( x )
	{
		*x = 0;
	}
	if ( y )
	{
		*y = 0;
	}
	if ( width )
	{
		*width = 0;
	}
	if ( height )
	{
		*height = 0;
	}

	memset( &disdev, 0, sizeof( DISPLAY_DEVICE ) );
	disdev.cb = sizeof( DISPLAY_DEVICE );
	if ( EnumDisplayDevices( NULL, displaynum, &disdev, 0 ) == 0 )
	{
		// 不正なディスプレイ番号
		return 1;
	}

	memset( &devmode, 0, sizeof( DEVMODE ) );
	devmode.dmSize = sizeof( DEVMODE );
	if ( EnumDisplaySettingsEx( disdev.DeviceName, /*ENUM_CURRENT_SETTINGS*/ENUM_REGISTRY_SETTINGS, &devmode, EDS_RAWMODE ) == 0 )
	{
		// 設定を取得できなかった
		return 2;
	}
	if ( x )
	{
		*x = devmode.dmPosition.x;
	}
	if ( y )
	{
		*y = devmode.dmPosition.y;
	}
	if ( width )
	{
		*width = devmode.dmPelsWidth;
	}
	if ( height )
	{
		*height = devmode.dmPelsHeight;
	}

	return 0;
}
コード例 #4
0
ファイル: win32_monitor.c プロジェクト: dtlindsey/glfw
void _glfwPlatformGetMonitorPos(_GLFWmonitor* monitor, int* xpos, int* ypos)
{
    DEVMODE settings;
    ZeroMemory(&settings, sizeof(DEVMODE));
    settings.dmSize = sizeof(DEVMODE);

    EnumDisplaySettingsEx(monitor->win32.name,
                          ENUM_CURRENT_SETTINGS,
                          &settings,
                          EDS_ROTATEDMODE);

    if (xpos)
        *xpos = settings.dmPosition.x;
    if (ypos)
        *ypos = settings.dmPosition.y;
}
コード例 #5
0
	std::vector<Rectf> ScreenInfoProvider_Win32::get_screen_geometries(int &primary_screen_index) const
	{
		HDC dc = GetDC(0);
		int ppi = GetDeviceCaps(dc, LOGPIXELSX);
		ReleaseDC(0, dc);

		std::vector<Rectf> monitor_positions;
		primary_screen_index = 0;
		int index = 0;
		while (true)
		{
			DISPLAY_DEVICE display_device;
			memset(&display_device, 0, sizeof(DISPLAY_DEVICE));
			display_device.cb = sizeof(DISPLAY_DEVICE);
			BOOL result = EnumDisplayDevices(0, index++, &display_device, 0);
			if (result == FALSE)
				break;

			if ((display_device.StateFlags & DISPLAY_DEVICE_MIRRORING_DRIVER) == 0 &&
				(display_device.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP))
			{
				std::wstring device_name = display_device.DeviceName;
				DEVMODE devmode;
				memset(&devmode, 0, sizeof(DEVMODE));
				devmode.dmSize = sizeof(DEVMODE);
				result = EnumDisplaySettingsEx(device_name.c_str(), ENUM_REGISTRY_SETTINGS, &devmode, 0);
				if (result)
				{
					if ((devmode.dmFields & DM_PELSWIDTH) && (devmode.dmFields & DM_PELSHEIGHT))
					{
						if (display_device.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE)
							primary_screen_index = monitor_positions.size();

						Rectf pos(
							devmode.dmPosition.x * 96.0f / ppi,
							devmode.dmPosition.y * 96.0f / ppi,
							(devmode.dmPosition.x + devmode.dmPelsWidth) * 96.0f / ppi,
							(devmode.dmPosition.y + devmode.dmPelsHeight) * 96.0f / ppi);
						monitor_positions.push_back(pos);
					}
				}
			}
		}

		return monitor_positions;
	}
コード例 #6
0
ファイル: WinSystemEGL.cpp プロジェクト: Kr0nZ/boxee
// TODO: Fix me
void CWinSystemEGL::UpdateResolutions()
{
  CWinSystemBase::UpdateResolutions();
  
  // Add desktop resolution
#ifdef _WIN32
  DEVMODE dm;
  ZeroMemory(&dm, sizeof(dm));
  dm.dmSize = sizeof(dm);
  EnumDisplaySettingsEx(NULL, ENUM_CURRENT_SETTINGS, &dm, 0);

  UpdateDesktopResolution(g_settings.m_ResInfo[RES_DESKTOP], 0, dm.dmPelsWidth, dm.dmPelsHeight, 60);
#else
  UpdateDesktopResolution(g_settings.m_ResInfo[RES_DESKTOP], 0, 1920, 1080, 60);
#endif

}
コード例 #7
0
ファイル: Win32Monitor.cpp プロジェクト: quyse/inanity
const Monitor::MonitorModes& Win32Monitor::GetModes()
{
	if(!modesInitialized)
	{
		for(int i = 0; ; ++i)
		{
			DEVMODE modeInfo;
			modeInfo.dmSize = sizeof(modeInfo);
			modeInfo.dmDriverExtra = 0;
			if(!EnumDisplaySettingsEx(info.DeviceName, i, &modeInfo, 0))
				break;
			modes.push_back(NEW(Win32MonitorMode(modeInfo)));
		}

		modesInitialized = true;
	}

	return modes;
}
コード例 #8
0
std::pair<DISPLAY_DEVICE, DEVMODE> GetDisplaySettings(int monitor_index){
    DISPLAY_DEVICE dd;
    dd.cb = sizeof(dd);

    EnumDisplayDevices(nullptr, 2, &dd, monitor_index);

    DEVMODE dm;

    // initialize the DEVMODE structure
    ZeroMemory(&dm, sizeof(dm));
    dm.dmSize = sizeof(dm);

    int res = EnumDisplaySettingsEx(dd.DeviceName, ENUM_CURRENT_SETTINGS, &dm, EDS_RAWMODE);
    if (res == 0){
        puts("Failed to extract display settings.");
        return {};
    }

    return { dd, dm };
}
コード例 #9
0
ファイル: Win32Monitor.cpp プロジェクト: quyse/inanity
RECT Win32Monitor::GetRect() const
{
	try
	{
		// code below is not working for some reason
		// EnumDisplaySettingsEx always return false
#if 0
		DEVMODE modeInfo;
		modeInfo.dmSize = sizeof(modeInfo);
		modeInfo.dmDriverExtra = 0;
		std::cout << deviceName << "\n";
		if(!EnumDisplaySettingsEx(info.DeviceName, ENUM_CURRENT_SETTINGS, &modeInfo, 0))
			THROW("Can't get current mode");

		RECT rect;
		rect.left = (modeInfo.dmFields & DM_POSITION) ? modeInfo.dmPosition.x : 0;
		rect.top = (modeInfo.dmFields & DM_POSITION) ? modeInfo.dmPosition.y : 0;
		rect.right = rect.left + ((modeInfo.dmFields & DM_PELSWIDTH) ? modeInfo.dmPelsWidth : 0);
		rect.bottom = rect.top + ((modeInfo.dmFields & DM_PELSHEIGHT) ? modeInfo.dmPelsHeight : 0);
		return rect;

#else

		// temporary "fix"

		RECT rect;
		rect.left = 0;
		rect.top = 0;
		rect.right = GetSystemMetrics(SM_CXSCREEN);
		rect.bottom = GetSystemMetrics(SM_CYSCREEN);

		return rect;

#endif
	}
	catch(Exception* exception)
	{
		THROW_SECONDARY("Can't get Win32 monitor rect", exception);
	}
}
コード例 #10
0
ファイル: WinSystemWin32.cpp プロジェクト: bconte/xbmc
bool CWinSystemWin32::UpdateResolutionsInternal()
{

  DISPLAY_DEVICE ddAdapter;
  ZeroMemory(&ddAdapter, sizeof(ddAdapter));
  ddAdapter.cb = sizeof(ddAdapter);
  DWORD adapter = 0;

  while (EnumDisplayDevices(NULL, adapter, &ddAdapter, 0))
  {
    // Exclude displays that are not part of the windows desktop. Using them is too different: no windows,
    // direct access with GDI CreateDC() or DirectDraw for example. So it may be possible to play video, but GUI?
    if (!(ddAdapter.StateFlags & DISPLAY_DEVICE_MIRRORING_DRIVER) && (ddAdapter.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP))
    {
      DISPLAY_DEVICE ddMon;
      ZeroMemory(&ddMon, sizeof(ddMon));
      ddMon.cb = sizeof(ddMon);
      bool foundScreen = false;
      DWORD screen = 0;

      // Just look for the first active output, we're actually only interested in the information at the adapter level.
      while (EnumDisplayDevices(ddAdapter.DeviceName, screen, &ddMon, 0))
      {
        if (ddMon.StateFlags & (DISPLAY_DEVICE_ACTIVE | DISPLAY_DEVICE_ATTACHED))
        {
          foundScreen = true;
          break;
        }
        ZeroMemory(&ddMon, sizeof(ddMon));
        ddMon.cb = sizeof(ddMon);
        screen++;
      }
      // Remoting returns no screens. Handle with a dummy screen.
      if (!foundScreen && screen == 0)
      {
        lstrcpy(ddMon.DeviceString, _T("Dummy Monitor")); // safe: large static array
        foundScreen = true;
      }

      if (foundScreen)
      {
        CLog::Log(LOGNOTICE, "Found screen: %s on %s, adapter %d.", ddMon.DeviceString, ddAdapter.DeviceString, adapter);

        // get information about the display's current position and display mode
        // TODO: for Windows 7/Server 2008 and up, Microsoft recommends QueryDisplayConfig() instead, the API used by the control panel.
        DEVMODE dm;
        ZeroMemory(&dm, sizeof(dm));
        dm.dmSize = sizeof(dm);
        if (EnumDisplaySettingsEx(ddAdapter.DeviceName, ENUM_CURRENT_SETTINGS, &dm, 0) == FALSE)
          EnumDisplaySettingsEx(ddAdapter.DeviceName, ENUM_REGISTRY_SETTINGS, &dm, 0);

        // get the monitor handle and workspace
        HMONITOR hm = 0;
        POINT pt = { dm.dmPosition.x, dm.dmPosition.y };
        hm = MonitorFromPoint(pt, MONITOR_DEFAULTTONULL);

        MONITOR_DETAILS md;
        memset(&md, 0, sizeof(MONITOR_DETAILS));

        strcpy(md.MonitorName, ddMon.DeviceString);
        strcpy(md.CardName, ddAdapter.DeviceString);
        strcpy(md.DeviceName, ddAdapter.DeviceName);

        // width x height @ x,y - bpp - refresh rate
        // note that refresh rate information is not available on Win9x
        md.ScreenWidth = dm.dmPelsWidth;
        md.ScreenHeight = dm.dmPelsHeight;
        md.hMonitor = hm;
        md.RefreshRate = dm.dmDisplayFrequency;
        md.Bpp = dm.dmBitsPerPel;
        md.Interlaced = (dm.dmDisplayFlags & DM_INTERLACED) ? true : false;

        m_MonitorsInfo.push_back(md);

        // Careful, some adapters don't end up in the vector (mirroring, no active output, etc.)
        if (ddAdapter.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE)
          m_nPrimary = m_MonitorsInfo.size() -1;

      }
    }
    ZeroMemory(&ddAdapter, sizeof(ddAdapter));
    ddAdapter.cb = sizeof(ddAdapter);
    adapter++;
  }
  return 0;
}
コード例 #11
0
ファイル: settings.c プロジェクト: hoangduit/reactos
static PSETTINGS_ENTRY
GetPossibleSettings(IN LPCTSTR DeviceName, OUT DWORD* pSettingsCount, OUT PSETTINGS_ENTRY* CurrentSettings)
{
    DEVMODE devmode;
    DWORD NbSettings = 0;
    DWORD iMode = 0;
    DWORD dwFlags = 0;
    PSETTINGS_ENTRY Settings = NULL;
    HDC hDC;
    PSETTINGS_ENTRY Current;
    DWORD bpp, xres, yres, checkbpp;
    DWORD curDispFreq;

    /* Get current settings */
    *CurrentSettings = NULL;
    hDC = CreateIC(NULL, DeviceName, NULL, NULL);
    bpp = GetDeviceCaps(hDC, PLANES);
    bpp *= GetDeviceCaps(hDC, BITSPIXEL);
    xres = GetDeviceCaps(hDC, HORZRES);
    yres = GetDeviceCaps(hDC, VERTRES);
    DeleteDC(hDC);

    /* List all settings */
    devmode.dmSize = (WORD)sizeof(DEVMODE);
    devmode.dmDriverExtra = 0;

    if (!EnumDisplaySettingsEx(DeviceName, ENUM_CURRENT_SETTINGS, &devmode, dwFlags))
        return NULL;

    curDispFreq = devmode.dmDisplayFrequency;

    while (EnumDisplaySettingsEx(DeviceName, iMode, &devmode, dwFlags))
    {
        if ((devmode.dmBitsPerPel == 4 ||
             devmode.dmBitsPerPel == 8 ||
             devmode.dmBitsPerPel == 16 ||
             devmode.dmBitsPerPel == 24 ||
             devmode.dmBitsPerPel == 32) &&
             devmode.dmDisplayFrequency == curDispFreq)
        {
            checkbpp=1;
        }
        else
            checkbpp=0;

        if (devmode.dmPelsWidth < 640 ||
            devmode.dmPelsHeight < 480 || checkbpp == 0)
        {
            iMode++;
            continue;
        }

        Current = HeapAlloc(GetProcessHeap(), 0, sizeof(SETTINGS_ENTRY));
        if (Current != NULL)
        {
            /* Sort resolutions by increasing height, and BPP */
            PSETTINGS_ENTRY Previous = NULL;
            PSETTINGS_ENTRY Next = Settings;
            Current->dmPelsWidth = devmode.dmPelsWidth;
            Current->dmPelsHeight = devmode.dmPelsHeight;
            Current->dmBitsPerPel = devmode.dmBitsPerPel;
            Current->dmDisplayFrequency = devmode.dmDisplayFrequency;
            while (Next != NULL && (
                   Next->dmPelsWidth < Current->dmPelsWidth ||
                   (Next->dmPelsWidth == Current->dmPelsWidth && Next->dmPelsHeight < Current->dmPelsHeight) ||
                   (Next->dmPelsHeight == Current->dmPelsHeight &&
                    Next->dmPelsWidth == Current->dmPelsWidth &&
                    Next->dmBitsPerPel < Current->dmBitsPerPel )))
            {
                Previous = Next;
                Next = Next->Flink;
            }
            Current->Blink = Previous;
            Current->Flink = Next;
            if (Previous == NULL)
                Settings = Current;
            else
                Previous->Flink = Current;
            if (Next != NULL)
                Next->Blink = Current;
            if (devmode.dmPelsWidth == xres && devmode.dmPelsHeight == yres && devmode.dmBitsPerPel == bpp)
            {
                *CurrentSettings = Current;
            }
            NbSettings++;
        }
        iMode++;
    }

    *pSettingsCount = NbSettings;
    return Settings;
}
コード例 #12
0
int main(int argc, char *argv[]){
    // TODO: This is one horribly long main(), not good! But works for now.

    HDC hDC = NULL;
    DISPLAY_DEVICE displayDeviceToggled;
    DEVMODE defaultMode;
    DEVMODE currentMode;
    DEVMODE currentRegistryMode;
    long int monitor_number;
    long int forceState = -1;
    long int apply = 1;
    int i = 0;
    
    // Initialize DISPLAY_DEVICE
    FillMemory(&displayDeviceToggled, sizeof(DISPLAY_DEVICE), 0);
    displayDeviceToggled.cb = sizeof(DISPLAY_DEVICE);

    // Initialize DEVMODEs
    ZeroMemory(&defaultMode, sizeof(DEVMODE));
    defaultMode.dmSize = sizeof(DEVMODE);

    ZeroMemory(&currentMode, sizeof(DEVMODE));
    currentMode.dmSize = sizeof(DEVMODE);

    ZeroMemory(&currentRegistryMode, sizeof(DEVMODE));
    currentRegistryMode.dmSize = sizeof(DEVMODE);


    if (argc <= 1) {
        puts("Monitor toggler 0.3.2"
        "\r\n"
        "\r\nUsage: monitortoggler.exe <monitornumber> [<forceState>] [<apply>]"
        "\r\n"
        "\r\n  Capable of attaching and deattaching monitors from command line."
        "\r\n"
        "\r\n  Note: Resolution / display settings should be configured from Windows dialog."
        "\r\n        At least in Windows 7 the changes are saved to registry, and next time "
        "\r\n        you attach the same screen it retrieves same settings. Thus it seems"
        "\r\n        to be useless to define them while attaching."
        "\r\n"
        "\r\n  monitornumber:"
        "\r\n             Monitor number, this may, and usually differs from monitor numbers"
        "\r\n             in the screen resolution dialog. So you have to try several numbers"
        "\r\n             until you find the right one :)"
        "\r\n"
        "\r\n  forceState (optional):"
        "\r\n            -1 = Toggles. (Tries to get the current mode, and toggles.) (default)"
        "\r\n             1 = Attach"
        "\r\n             0 = Detach"
        "\r\n"
        "\r\n  apply (optional):"
        "\r\n             1 = Apply changes immediately (default)"
        "\r\n             0 = Do not apply changes"
        "\r\n                 You have to call second time to apply changes"
        "\r\n"
        "\r\n  Author:     Jari Pennanen (2010) <*****@*****.**>"
        "\r\n  License:    FreeBSD License, see COPYING"
        "\r\n  Repository: http://github.com/Ciantic/monitortoggler"
        "\r\n");
        return 0;
    }

    // Parse monitor number
    monitor_number = strtol(argv[1], NULL, 0);

    // Parse forceState parameter, if given
    if (argc >= 3) {
        forceState = strtol(argv[2], NULL, 0);

        if (forceState > 1 || forceState < -1) {
            fputs("  Error: <force> can only be -1, 0, or 1.", stderr);
            return 0;
        }
    }

    // Parse apply parameter, if given
    if (argc == 4) {
        apply = strtol(argv[3], NULL, 0);

        if (apply > 1 || apply < 0) {
            fputs("  Error: <apply> can only be 0, or 1.", stderr);
            return 0;
        }

    }

    // Empty line for fun
    puts("");

    // Get Display Device
    if (!EnumDisplayDevices(NULL, monitor_number-1, (DISPLAY_DEVICE*) &displayDeviceToggled, 0)) {
        fprintf(stderr, "  Error: Monitor number %d is not valid according to 'EnumDisplayDevices'.\r\n", monitor_number);
        return 0;
    }

    // If user wants to toggle, we must get the state is it on or off.
    if (forceState == -1) {
        printf("Retrieving state of '%s' using 'EnumDisplaySettingsEx'...\r\n", displayDeviceToggled.DeviceName);

        // Query the state
        if (!EnumDisplaySettingsEx((LPSTR) displayDeviceToggled.DeviceName, ENUM_CURRENT_SETTINGS, &currentMode, NULL)) {
            // It is turned off most likely at the moment.
            puts("  Monitor is currently detached.");

            // Attach
            forceState = 1;
        } else {
            puts("  Monitor is currently attached.");

            // Detach
            forceState = 0;
        }
        puts("  ^ If above statement is lie, you have to use <forceState>.");
        puts("Ok.\n");
    }

    printf("Trying to change settings of '%s' using ChangeDisplaySettingsEx...\r\n", displayDeviceToggled.DeviceName);

    // It's unwise to deal with Primary monitors
    if (displayDeviceToggled.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE) {
        puts("Sorry, this program does not allow to detach / reattach primary monitor.\r\n");
        return 0;
    }

    // Detach or attach?
    if (forceState == 0) {
        puts("  Saving settings of monitor...");
        
        if (!EnumDisplaySettingsEx((LPSTR) displayDeviceToggled.DeviceName, ENUM_REGISTRY_SETTINGS, &currentRegistryMode, NULL))
            return 0;
        
        puts("  Detaching monitor...");
        // Setting these, means "detaching" monitor Detaching code: http://support.microsoft.com/kb/306399
        defaultMode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_POSITION;
        defaultMode.dmPelsWidth = 0;
        defaultMode.dmPelsHeight = 0;
    } else {
        // Attaching code: http://support.microsoft.com/kb/308216
        puts("  Attaching monitor...");
        defaultMode.dmFields = DM_POSITION;
    }

    // Change the settings
    if (!ChangeSettingsExResult(ChangeDisplaySettingsEx((LPSTR)displayDeviceToggled.DeviceName, &defaultMode, NULL, CDS_NORESET|CDS_UPDATEREGISTRY, NULL)))
        return 0;
    
    puts("Ok.\n");
    
    // Second call applies the changes
    if (apply == 1) {
        puts("Trying to apply settings changes...");
        if (!ChangeSettingsExResult(ChangeDisplaySettingsEx (NULL, NULL, NULL, 0, NULL)))
            return 0;
        puts("Ok.\n");
    }

    return 0;
}
コード例 #13
0
static BOOL CALLBACK GLW_GetMonitorDisplayModes( HMONITOR mon, HDC dc, LPRECT rc, LPARAM userData )
{
	int i;
	DEVMODE mode;
	MONITORINFOEX info;
	int gl_level;

	REF_PARAM( rc );
	REF_PARAM( userData );

	info.cbSize = sizeof( info );
	GetMonitorInfo( mon, (LPMONITORINFO)&info );

	gl_level = 3;//GLW_GetDisplayLevel( dc );

	sql_bindtext( &com_db, 1, info.szDevice );
	sql_bindint( &com_db, 2, info.rcMonitor.left );
	sql_bindint( &com_db, 3, info.rcMonitor.top );
	sql_bindint( &com_db, 4, info.rcMonitor.right - info.rcMonitor.left );
	sql_bindint( &com_db, 5, info.rcMonitor.bottom - info.rcMonitor.top );
	sql_bindint( &com_db, 6, gl_level );
	sql_step( &com_db );

	mode.dmSize = sizeof( mode );
	mode.dmDriverExtra = 0;
	for( i = 0; EnumDisplaySettingsEx( info.szDevice, i, &mode, 0 ) != 0; i++ )
	{
		int id;

		if( mode.dmBitsPerPel < 16 )
			continue;

		if( mode.dmPelsWidth < 640 || mode.dmPelsHeight < 480 )
			continue;

		sql_prepare( &com_db, "UPDATE OR INSERT fsmodes SET id=#,w=?1,h=?2,dev_name=?3 SEARCH dev_name ?3 WHERE w=?1 AND h=?2" );
		sql_bindint( &com_db, 1, (int)mode.dmPelsWidth );
		sql_bindint( &com_db, 2, (int)mode.dmPelsHeight );
		sql_bindtext( &com_db, 3, info.szDevice );
		sql_step( &com_db );
		sql_done( &com_db );

		//get the id of what we just added

		sql_prepare( &com_db, "SELECT id FROM fsmodes SEARCH dev_name ?3 WHERE w=?1 AND h=?2" );
		sql_bindint( &com_db, 1, (int)mode.dmPelsWidth );
		sql_bindint( &com_db, 2, (int)mode.dmPelsHeight );
		sql_bindtext( &com_db, 3, info.szDevice );
		sql_step( &com_db );
		id = sql_columnasint( &com_db, 0 );
		sql_done( &com_db );

		//and insert the other info into the other table

		sql_prepare( &com_db, "UPDATE OR INSERT fsmodes_ext SET id=?1,hz=?2,bpp=?3 SEARCH id ?1 WHERE hz=?2 AND bpp=?3" );
		sql_bindint( &com_db, 1, id );
		sql_bindint( &com_db, 2, (int)mode.dmDisplayFrequency );
		sql_bindint( &com_db, 3, (int)mode.dmBitsPerPel );
		sql_step( &com_db );
		sql_done( &com_db );
	}

	return TRUE;
}
コード例 #14
0
/**
*******************************************************************************
* @fn initializeDX11
* @brief Initialize DX11 device and object
*
* @return NOERROR on success Positive if expected and E_FAIL on failure
******************************************************************************/
int DX11Engine::initializeDX11(void)
{
    int hrStatus = S_OK;
    // Get all adapters
    std::vector<IDXGIAdapter*> vAdapters;
    unsigned int numAdapters;
    IDXGIFactory* factory;
    CreateDXGIFactory(__uuidof(IDXGIFactory), (void**)&factory);
    IDXGIAdapter * pAdapter = 0;
    UINT i = 0;
    while(factory->EnumAdapters(i, &pAdapter) != DXGI_ERROR_NOT_FOUND) 
    { 
        vAdapters.push_back(pAdapter); 
        ++i; 
    }

    // Push NULL to vAdapters and assign zero to deviceId if adapter is not found
    if(i == 0)
    {
        vAdapters.push_back(NULL);
    }

    numAdapters = i;

    DISPLAY_DEVICE dispDevice;
    DWORD deviceNum;
    dispDevice.cb = sizeof(DISPLAY_DEVICE);

    int xCoordinate = 0;
    int yCoordinate = 0;

    for (deviceNum = 0; EnumDisplayDevices(NULL, deviceNum, &dispDevice, 0); deviceNum++) 
    {
        if (dispDevice.StateFlags & DISPLAY_DEVICE_MIRRORING_DRIVER) 
        {
                continue;
        }

        if(!(dispDevice.StateFlags & DISPLAY_DEVICE_ACTIVE))
        {
            continue;
        }

        DEVMODE deviceMode;

        // initialize the DEVMODE structure
        ZeroMemory(&deviceMode, sizeof(deviceMode));
        deviceMode.dmSize = sizeof(deviceMode);
        deviceMode.dmDriverExtra = 0;

        EnumDisplaySettingsEx(dispDevice.DeviceName, ENUM_CURRENT_SETTINGS, &deviceMode, EDS_ROTATEDMODE);

        xCoordinate = deviceMode.dmPosition.x;
        yCoordinate = deviceMode.dmPosition.y;

        // Register the window class
        RegisterClassEx(&wc);

        // Create the application's window
        wndHandle = CreateWindow(reinterpret_cast<LPCSTR>(WINDOW_CLASS_NAME), 
                              reinterpret_cast<LPCSTR>(CAPTION_NAME), 
                              WS_CAPTION | WS_POPUPWINDOW, 
                              false, 
                              yCoordinate, 
                              WINDOW_WIDTH, 
                              WINDOW_HEIGHT, 
                              NULL, 
                              NULL, 
                              wc.hInstance, 
                              NULL);
        
        D3D_FEATURE_LEVEL featureLevels[] =
        {
            D3D_FEATURE_LEVEL_11_0,
            D3D_FEATURE_LEVEL_10_1,
            D3D_FEATURE_LEVEL_10_0
        };
        unsigned int totalFeatureLevels = ARRAYSIZE(featureLevels);

        // Create a D3D Swap Chain and Device
        DXGI_SWAP_CHAIN_DESC swapChainDesc;
        ZeroMemory(&swapChainDesc, sizeof(swapChainDesc));
        swapChainDesc.BufferCount       = 1;
        swapChainDesc.BufferDesc.Width  = meshWidth;
        swapChainDesc.BufferDesc.Height = meshHeight;
        swapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
        swapChainDesc.BufferDesc.RefreshRate.Numerator   = 60;
        swapChainDesc.BufferDesc.RefreshRate.Denominator = 1;
        swapChainDesc.BufferUsage        = DXGI_USAGE_RENDER_TARGET_OUTPUT;
        swapChainDesc.OutputWindow       = wndHandle;
        swapChainDesc.Windowed           = true;
        swapChainDesc.SampleDesc.Count   = 1;
        swapChainDesc.SampleDesc.Quality = 0;
        
        unsigned int creationFlags = 0;

#ifdef _DEBUG
        creationFlags |= D3D11_CREATE_DEVICE_DEBUG;
#endif

        hrStatus =  D3D11CreateDeviceAndSwapChain(0,
                                                D3D_DRIVER_TYPE_HARDWARE, 
                                                NULL,
                                                creationFlags,
                                                featureLevels, 
                                                totalFeatureLevels,
                                                D3D11_SDK_VERSION, 
                                                &swapChainDesc,
                                                &pSwapChain,
                                                &pD3D11Device,
                                                &featureLevel, 
                                                &pD3DContext
                                               );

        if(hrStatus != S_OK)
        {
            std::cout << "\nERROR : Failed to create D3D device" << std::endl;
            return E_FAIL;
        }                
    }
        
    // Create a render target view
    ID3D11Texture2D *pBackBuffer;
    hrStatus = pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&pBackBuffer);
    if(FAILED(hrStatus))
    {
        std::cout << "GetBuffer failed." << std::endl;
        return E_FAIL;
    }

    hrStatus = pD3D11Device->CreateRenderTargetView(pBackBuffer, NULL, &pRenderTargetView);
    pBackBuffer->Release();
    if(FAILED(hrStatus))
    {
        std::cout << "CreateRenderTargetView() failed" << std::endl;
        return E_FAIL;
    }


    pD3DContext->OMSetRenderTargets(1, &pRenderTargetView, NULL);

    // Create the viewport
    D3D11_VIEWPORT vp;
    vp.Width = static_cast<float>(meshWidth);
    vp.Height = static_cast<float>(meshHeight);
    vp.MinDepth = 0.0f;
    vp.MaxDepth = 1.0f;
    vp.TopLeftX = 0;
    vp.TopLeftY = 0;
    pD3DContext->RSSetViewports(1, &vp);

	// Read vertex shader resource
	BasicReader Reader;
	auto vertexShaderByteCode = Reader.readBinaryFromFile("SimpleVertexShader.cso");

	hrStatus = pD3D11Device->CreateVertexShader(
		(void *)vertexShaderByteCode.data(),
	    (SIZE_T)vertexShaderByteCode.size(),
        nullptr,
        &pSolidColorVS
       );
    if(FAILED(hrStatus))
    {
        std::cout << "Create Vertex Shader failed" << std::endl;

        return E_FAIL;
    }
    
    //Create and set IAInputLayout
    D3D11_INPUT_ELEMENT_DESC vertexLayout[] = 
    {
        {
            "pos",
            0,
            DXGI_FORMAT_R32G32_FLOAT,
            0,
            0,
            D3D11_INPUT_PER_VERTEX_DATA,
            0
        }
    };

    hrStatus = pD3D11Device->CreateInputLayout(
        vertexLayout,
        sizeof(vertexLayout) / sizeof(D3D11_INPUT_ELEMENT_DESC),
		vertexShaderByteCode.data(), 
		vertexShaderByteCode.size(), 
        &pInputLayout 
       );
    if(FAILED(hrStatus))
    {
        std::cout << "Create Input Layout failed" << std::endl;
        return E_FAIL;
    }


    pD3DContext->IASetInputLayout(pInputLayout);

	// Read pixel shader resource
	auto pixelShaderBytecode = Reader.readBinaryFromFile("SimplePixelShader.cso");

	hrStatus = pD3D11Device->CreatePixelShader(
		pixelShaderBytecode.data(), 
		pixelShaderBytecode.size(), 
        NULL, 
        &pSolidColorPS
       );
    if(FAILED(hrStatus))
    {
        std::cout << "Create Pixel Shader failed" << std::endl;
        return E_FAIL;
    }
	        
    // Create Vertex buffer object
    D3D11_BUFFER_DESC bufDesc;
    bufDesc.ByteWidth        = nVerticesNum * sizeof(XMFLOAT2);
    bufDesc.CPUAccessFlags   = 0;
    bufDesc.Usage            = D3D11_USAGE_DEFAULT;
    bufDesc.MiscFlags        = D3D11_RESOURCE_MISC_SHARED;
    bufDesc.BindFlags        = D3D11_BIND_VERTEX_BUFFER;
    hrStatus = pD3D11Device->CreateBuffer(&bufDesc, NULL, &pVertexBuffer);
    if(FAILED(hrStatus))
    {
        std::cout << "CreateBuffer failed. (pVertexBuffer)" << std::endl;
        return E_FAIL;
    }
    
    // Set vertex bufer
    if(pVertexBuffer)
    {
        const UINT strides[] = {sizeof(XMFLOAT2)};
        const UINT offsets[] = {0};
        pD3DContext->IASetVertexBuffers(0, 1, &pVertexBuffer, strides, offsets);
    }

    // Set primitive topology
    pD3DContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_LINELIST);

    return NOERROR;
}
コード例 #15
0
ファイル: WinSystemEGL.cpp プロジェクト: Kr0nZ/boxee
bool CWinSystemEGL::CreateNewWindow(const CStdString& name, bool fullScreen, RESOLUTION_INFO& res, PHANDLE_EVENT_FUNC userFunction)
{
#if defined(EMPOWER) && defined(HAS_OPENKODE)
  KDboolean b;
  KDDisplayModeNV  mode;
  KDint desktopSize[2] = { res.iWidth, res.iHeight };
#endif
#ifdef _WIN32
  EGL_BASE_CLASS::CreateNewWindow(name, fullScreen, res, userFunction);
#endif

  m_nWidth = res.iWidth;
  m_nHeight = res.iHeight;
  m_bFullScreen = fullScreen;

  EGLBoolean eglStatus;
  EGLint     configCount;
  EGLConfig* configList = NULL;  

#if defined(EMPOWER) && defined(HAS_OPENKODE)
  //CLog::Log(LOGDEBUG, "NV: GetDisplay");
  m_kdDisplay = kdGetDisplayNV(KD_DEFAULT_DISPLAY_NV, KD_NULL);
  if (!m_kdDisplay)
  {
    CLog::Log(LOGERROR, "Could not obtain KDDisplayNV pointer");
    return false;
  }
  b = KD_FALSE;
  //CLog::Log(LOGDEBUG, "NV: SetDisplayProperty");
  kdSetDisplayPropertybvNV(m_kdDisplay, KD_DISPLAYPROPERTY_ENABLED_NV, &b);
  kdReleaseDisplayNV(m_kdDisplay);

  // MZL: enable HDMI display
  //CLog::Log(LOGDEBUG, "NV: SetDisplayPropertybyNV");
  kdSetDisplayPropertybvNV(m_kdDisplay, KD_DISPLAYPROPERTY_ENABLED_NV, &b);
  m_kdDisplay = kdGetDisplayNV("Tegra:HDMI0", KD_NULL);
  if (!m_kdDisplay)
  {
    CLog::Log(LOGERROR, "Could not obtain KDDisplayNV pointer");
    return false;
  }
  b = KD_TRUE;
  kdSetDisplayPropertybvNV(m_kdDisplay, KD_DISPLAYPROPERTY_ENABLED_NV, &b);
  kdSetDisplayPropertycvNV(m_kdDisplay, KD_DISPLAYPROPERTY_DESKTOP_NAME_NV, KD_DEFAULT_DESKTOP_NV);

  mode.width   = res.iWidth;
  mode.height  = res.iHeight;
  mode.refresh = 60;
  //CLog::Log(LOGDEBUG, "NV: SetDisplayPropertyNV");
  if (kdSetDisplayModeNV(m_kdDisplay, &mode, KD_DISPLAY_PROTOCOL_AUTOMATIC_NV))
  {
    CLog::Log(LOGERROR, "Could not set display mode\n");
    return false;
  }

  //CLog::Log(LOGDEBUG, "NV: GetDesktopNV");
  m_kdDesktop = kdGetDesktopNV(KD_DEFAULT_DESKTOP_NV, KD_NULL);
  if (!m_kdDesktop)
  {
    CLog::Log(LOGERROR, "Could not obtain KDDesktopNV pointer");
    return false;
  } 

  //CLog::Log(LOGDEBUG, "NV: SetDesktopivNV");
  if (kdSetDesktopPropertyivNV(m_kdDesktop, KD_DESKTOPPROPERTY_SIZE_NV, desktopSize))
  {
    CLog::Log(LOGERROR, "Could not set desktop size");
    return false;
  }
#endif

#ifdef HAS_X11
  m_x11Display = XOpenDisplay(NULL);
  if (!m_x11Display)
  {
    CLog::Log(LOGERROR, "Could not open X11");
    return false;
  }

  XSetErrorHandler(ApplicationErrorHandler) ;
#endif

  //CLog::Log(LOGDEBUG, "eglGetDisplay");
#if defined(HAS_OPENKODE) || defined(HAS_GDL)
  m_display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
#elif defined(_WIN32)
  m_display = eglGetDisplay(m_hDC);
#elif defined(HAS_X11)
  m_display = eglGetDisplay((EGLNativeDisplayType) m_x11Display);
#endif
  if (m_display == EGL_NO_DISPLAY) 
  {
    CLog::Log(LOGERROR, "EGL failed to obtain display");
    return false;
  }
   
  //CLog::Log(LOGDEBUG, "eglInitialize");
  if (!eglInitialize(m_display, 0, 0)) 
  {
    CLog::Log(LOGERROR, "EGL failed to initialize");
    return false;
  } 
  
  EGLint configAttrs[] = {
        EGL_RED_SIZE,        8,
        EGL_GREEN_SIZE,      8,
        EGL_BLUE_SIZE,       8,
        EGL_DEPTH_SIZE,     16,
        EGL_STENCIL_SIZE,    8,
        EGL_SAMPLE_BUFFERS,  0,
        EGL_SAMPLES,         0,
        EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
        EGL_NONE
  };

  // Find out how many configurations suit our needs  
  //CLog::Log(LOGDEBUG, "eglChooseConfig");
  eglStatus = eglChooseConfig(m_display, configAttrs, NULL, 0, &configCount);
  if (!eglStatus || !configCount) 
  {
    CLog::Log(LOGERROR, "EGL failed to return any matching configurations");
    return false;
  }
    
  // Allocate room for the list of matching configurations
  configList = (EGLConfig*)malloc(configCount * sizeof(EGLConfig));
  if (!configList) 
  {
    CLog::Log(LOGERROR, "kdMalloc failure obtaining configuration list");
    return false;
  }

  // Obtain the configuration list from EGL
  eglStatus = eglChooseConfig(m_display, configAttrs,
                                configList, configCount, &configCount);
  if (!eglStatus || !configCount) 
  {
    CLog::Log(LOGERROR, "EGL failed to populate configuration list");
    return false;
  }
  
  // Select an EGL configuration that matches the native window
  m_config = configList[0];

  EGLint* attribList = NULL;

#ifdef EMPOWER
  EGLint windowAttrs[3];
  int windowIndex = 0;
  windowAttrs[windowIndex++] = EGL_RENDER_BUFFER;
  windowAttrs[windowIndex++] = EGL_BACK_BUFFER;
  windowAttrs[windowIndex++] = EGL_NONE;
  attribList = windowAttrs;
#endif

#ifdef HAS_OPENKODE
  //CLog::Log(LOGDEBUG, "KD: kdCreateWindow");
  m_kdWindow = kdCreateWindow(m_display, m_config, KD_NULL);
  if (!m_kdWindow)
  {
    CLog::Log(LOGERROR, "Error creating native window");
    return false;
  }

  //CLog::Log(LOGDEBUG, "KD: kdRealizeWindow");
  if (kdRealizeWindow(m_kdWindow, &m_nativeWindow))
  {
    CLog::Log(LOGERROR, "Could not realize native window");
    return false;
  }

#elif defined HAS_X11
  int screen = DefaultScreen(m_x11Display);

  XSetWindowAttributes windowAttributes;
  windowAttributes.colormap     = DefaultColormap(m_x11Display, screen);
  windowAttributes.border_pixel = 0;
  windowAttributes.event_mask   = ExposureMask           |
                                  VisibilityChangeMask   |
                                  KeyPressMask           |
                                  KeyReleaseMask         |
                                  ButtonPressMask        |
                                  ButtonReleaseMask      |
                                  PointerMotionMask      |
                                  StructureNotifyMask    |
                                  SubstructureNotifyMask |
                                  FocusChangeMask;

  m_nativeWindow = (NativeWindowType) XCreateWindow( m_x11Display,
                              RootWindow(m_x11Display, screen),
                              0, 0,     // x/y position of top-left outside corner of the window
                              res.iWidth, res.iHeight, // Width and height of window
                              0,        // Border width
                              DefaultDepth(m_x11Display, screen),
                              InputOutput,
                              DefaultVisual(m_x11Display, screen),
                              CWBorderPixel | CWColormap | CWEventMask,
                              &windowAttributes );

  XSetStandardProperties(m_x11Display, (Window) m_nativeWindow, name, name, None, NULL, 0, NULL);

  Atom wmDeleteMessage = XInternAtom(m_x11Display, "WM_DELETE_WINDOW", False);
  XSetWMProtocols(m_x11Display, (Window) m_nativeWindow, &wmDeleteMessage, 1);

  if (fullScreen && !SetFullScreen(fullScreen, res, false))
  {
    return false;
  }

   XMapRaised(m_x11Display, (Window) m_nativeWindow);
#endif

#ifdef _WIN32
  m_nativeWindow = m_hWnd;
 
  DEVMODE dm;
  ZeroMemory(&dm, sizeof(dm));
  dm.dmSize = sizeof(dm);
  EnumDisplaySettingsEx(NULL, ENUM_CURRENT_SETTINGS, &dm, 0);

  m_nLeft = (dm.dmPelsWidth / 2) - (m_nWidth / 2);
  m_nTop = (dm.dmPelsHeight / 2) - (m_nHeight / 2);

  RECT rc;
  rc.left = m_nLeft;
  rc.top = m_nTop;
  rc.right = rc.left + m_nWidth;
  rc.bottom = rc.top + m_nHeight;
  AdjustWindowRect( &rc, WS_OVERLAPPEDWINDOW, false );
  SetWindowPos(m_hWnd, 0, rc.left, rc.top, 0, 0, SWP_NOSIZE);
#endif

#if defined(HAS_GDL)
  m_nativeWindow = (NativeWindowType)GDL_GRAPHICS_PLANE;
#endif

  m_surface = eglCreateWindowSurface(m_display, m_config, m_nativeWindow, attribList);
  if (!m_surface)
  { 
    CLog::Log(LOGERROR, "EGL couldn't create window");
    return false;
  }

#ifdef CANMORE
  eglStatus = eglBindAPI(EGL_OPENGL_ES_API);
  if (!eglStatus) 
  {
    CLog::Log(LOGERROR, "EGL failed to bind API");
    return false;
  }
#endif

  EGLint contextAttrs[] = 
  {
    EGL_CONTEXT_CLIENT_VERSION, 2,
    EGL_NONE
  };

  // Create an EGL context
  //CLog::Log(LOGDEBUG, "eglCreateContext");
  m_context = eglCreateContext(m_display, m_config, NULL, contextAttrs);
  if (!m_context) 
  {
    CLog::Log(LOGERROR, "EGL couldn't create context");
    return false;
  }

  // Make the context and surface current for rendering
  eglStatus = eglMakeCurrent(m_display, m_surface, m_surface, m_context);
  if (!eglStatus) 
  {
    CLog::Log(LOGERROR, "EGL couldn't make context/surface current");
    return false;
  }
 
  free(configList);

  eglSwapInterval(m_display, 0);

  m_bWindowCreated = true;

  CLog::Log(LOGINFO, "Window creation complete");
  return true;
}
コード例 #16
0
ファイル: ddraw_displaymode.c プロジェクト: reactos/reactos
HRESULT WINAPI
Main_DirectDraw_EnumDisplayModes(LPDDRAWI_DIRECTDRAW_INT This, DWORD dwFlags,
                                  LPDDSURFACEDESC pDDSD, LPVOID pContext, LPDDENUMMODESCALLBACK pCallback)
{
    HRESULT ret = DD_OK;
    INT iMode = 0;
    DEVMODE DevMode;

    DX_WINDBG_trace();

    ZeroMemory(&DevMode, sizeof(DEVMODE));

    _SEH2_TRY
    {

        if (pDDSD != NULL)
        {
            if (pDDSD->dwSize != sizeof(DDSURFACEDESC))
            {
                 ret = DDERR_INVALIDPARAMS;
            }
        }

        if (IsBadCodePtr((LPVOID)pCallback))
        {
            ret = DDERR_INVALIDPARAMS;
        }
        else if ( ret == DD_OK)
        {

            DevMode.dmSize = sizeof(DEVMODE);

            while (EnumDisplaySettingsEx(NULL, iMode, &DevMode, 0) == TRUE)
            {
                DDSURFACEDESC SurfaceDesc;

                ZeroMemory(&SurfaceDesc, sizeof(DDSURFACEDESC));

                iMode++;

                SurfaceDesc.dwSize = sizeof (DDSURFACEDESC);
                SurfaceDesc.dwFlags = DDSD_HEIGHT | DDSD_WIDTH | DDSD_REFRESHRATE | DDSD_WIDTH | DDSD_PIXELFORMAT;
                SurfaceDesc.dwHeight = DevMode.dmPelsHeight;
                SurfaceDesc.dwWidth = DevMode.dmPelsWidth;
                SurfaceDesc.lPitch = DevMode.dmPelsWidth * DevMode.dmBitsPerPel / 8;
                SurfaceDesc.dwRefreshRate = DevMode.dmDisplayFrequency;

                SurfaceDesc.ddpfPixelFormat.dwSize = sizeof (DDPIXELFORMAT);
                SurfaceDesc.ddpfPixelFormat.dwFlags = DDPF_RGB;
                // FIXME: get these
                /*
                    SurfaceDesc.ddpfPixelFormat.dwRBitMask =
                    SurfaceDesc.ddpfPixelFormat.dwGBitMask =
                    SurfaceDesc.ddpfPixelFormat.dwBBitMask =
                    SurfaceDesc.ddpfPixelFormat.dwRGBAlphaBitMask =
                */
                SurfaceDesc.ddpfPixelFormat.dwRGBBitCount = DevMode.dmBitsPerPel;

                // FIXME1: This->lpLcl->lpGbl->dwMonitorFrequency is not set !
                if(dwFlags & DDEDM_REFRESHRATES && SurfaceDesc.dwRefreshRate != This->lpLcl->lpGbl->dwMonitorFrequency)
                {
                    //continue;  // FIXME2: what is SurfaceDesc.dwRefreshRate supposed to be set to ?
                }

                // FIXME: Take case when DDEDM_STANDARDVGAMODES flag is not set in account

                if(pDDSD)
                {
                    if(pDDSD->dwFlags & DDSD_HEIGHT && pDDSD->dwHeight != SurfaceDesc.dwHeight)
                        continue;

                    else if(pDDSD->dwFlags & DDSD_WIDTH && pDDSD->dwWidth != SurfaceDesc.dwWidth)
                        continue;

                    else if(pDDSD->dwFlags & DDSD_PITCH && pDDSD->lPitch != SurfaceDesc.lPitch)
                        continue;

                    else if(pDDSD->dwFlags & DDSD_REFRESHRATE && pDDSD->dwRefreshRate != SurfaceDesc.dwRefreshRate)
                        continue;

                    else if(pDDSD->dwFlags & DDSD_PIXELFORMAT && pDDSD->ddpfPixelFormat.dwRGBBitCount != SurfaceDesc.ddpfPixelFormat.dwRGBBitCount)
                        continue;  // FIXME: test for the other members of ddpfPixelFormat as well
                }

                if((*pCallback)(&SurfaceDesc, pContext) == DDENUMRET_CANCEL)
                    break;
            }
        }

    }
    _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
    {
    }
    _SEH2_END;

    return ret;
}