forked from Mirrors/openclonk
Win32: Improve error reporting when changing resolution
parent
6a9ebd4717
commit
faf0006a6f
|
@ -542,6 +542,11 @@ IDS_ERR_CONFREAD=Einstellungen konnten nicht gelesen werden: %s
|
|||
IDS_ERR_CONFSAVE=Einstellungen konnten nicht gespeichert werden: %s
|
||||
IDS_ERR_DDRAW=Fehler bei Direct3d oder OpenGL.
|
||||
IDS_ERR_DELOLDTITLE=Fehler beim Löschen des alten Titels aus Datei "%s": %s
|
||||
IDS_ERR_DISP_CHANGE_BADFLAGS=Eine ungültige Kombination von Flags wurde an ChangeDisplaySettingsEx übergeben.
|
||||
IDS_ERR_DISP_CHANGE_BADMODE=Der Modus wird nicht unterstützt.
|
||||
IDS_ERR_DISP_CHANGE_BADPARAM=Ein ungültiger Parameter wurde an ChangeDisplaySettingsEx übergeben.
|
||||
IDS_ERR_DISP_CHANGE_FAILED=Der Grafiktreiber konnte den gewünschten Modus nicht anwenden.
|
||||
IDS_ERR_DISP_CHANGE_RESTART=Der Computer muss zum Anwenden des gewünschten Modus neu gestartet werden.
|
||||
IDS_ERR_ERRORADDINGNEWTITLEFORFIL=Fehler beim Setzen des Titels in Datei \"%s\": %s
|
||||
IDS_ERR_ERRORLOADINGROUNDRESULTS=Fehler beim Laden der Spielergebnisse.
|
||||
IDS_ERR_ERRORSAVINGROUNDRESULTS=Fehler beim Speichern der Spielergebnisse.
|
||||
|
|
|
@ -541,6 +541,11 @@ IDS_ERR_CONFREAD=Could not read configuration: %s
|
|||
IDS_ERR_CONFSAVE=Could not save configuration: %s
|
||||
IDS_ERR_DDRAW=Direct3d or OpenGL failure.
|
||||
IDS_ERR_DELOLDTITLE=Error deleting old title from file "%s": %s
|
||||
IDS_ERR_DISP_CHANGE_BADFLAGS=An invalid set of flags was passed to ChangeDisplaySettingsEx.
|
||||
IDS_ERR_DISP_CHANGE_BADMODE=The graphics mode is not supported.
|
||||
IDS_ERR_DISP_CHANGE_BADPARAM=An invalid parameter was passed to ChangeDisplaySettingsEx.
|
||||
IDS_ERR_DISP_CHANGE_FAILED=The graphics driver failed the specified graphics mode.
|
||||
IDS_ERR_DISP_CHANGE_RESTART=The computer must be restarted for the graphics mode to work.
|
||||
IDS_ERR_ERRORADDINGNEWTITLEFORFIL=Error adding new title for file \"%s\": %s
|
||||
IDS_ERR_ERRORLOADINGROUNDRESULTS=Error loading round results.
|
||||
IDS_ERR_ERRORSAVINGROUNDRESULTS=Error saving round results.
|
||||
|
|
|
@ -141,6 +141,8 @@ private:
|
|||
HINSTANCE hInstance;
|
||||
HANDLE hMainThread; // handle to main thread that initialized the app
|
||||
|
||||
void SetLastErrorFromOS();
|
||||
|
||||
public:
|
||||
void SetInstance(HINSTANCE hInst) { hInstance = hInst; }
|
||||
HINSTANCE GetInstance() const { return hInstance; }
|
||||
|
|
|
@ -757,6 +757,15 @@ bool C4AbstractApp::FlushMessages()
|
|||
return MessageProc.Execute(0);
|
||||
}
|
||||
|
||||
void C4AbstractApp::SetLastErrorFromOS()
|
||||
{
|
||||
LPWSTR buffer = 0;
|
||||
DWORD rv = FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM,
|
||||
0, ::GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), reinterpret_cast<LPWSTR>(&buffer), 0, 0);
|
||||
sLastError.Take(StdStrBuf(buffer));
|
||||
LocalFree(buffer);
|
||||
}
|
||||
|
||||
int GLMonitorInfoEnumCount;
|
||||
|
||||
static BOOL CALLBACK GLMonitorInfoEnumProc(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData)
|
||||
|
@ -779,7 +788,11 @@ bool C4AbstractApp::GetIndexedDisplayMode(int32_t iIndex, int32_t *piXRes, int32
|
|||
if (iMonitor)
|
||||
Mon.Format("\\\\.\\Display%d", iMonitor+1);
|
||||
// check if indexed mode exists
|
||||
if (!EnumDisplaySettingsW(Mon.GetWideChar(), iIndex, &dmode)) return false;
|
||||
if (!EnumDisplaySettingsW(Mon.GetWideChar(), iIndex, &dmode))
|
||||
{
|
||||
SetLastErrorFromOS();
|
||||
return false;
|
||||
}
|
||||
// mode exists; return it
|
||||
if (piXRes) *piXRes = dmode.dmPelsWidth;
|
||||
if (piYRes) *piYRes = dmode.dmPelsHeight;
|
||||
|
@ -832,7 +845,10 @@ bool C4AbstractApp::SetVideoMode(unsigned int iXRes, unsigned int iYRes, unsigne
|
|||
|
||||
// Get current display settings
|
||||
if (!EnumDisplaySettingsW(Mon.GetWideChar(), ENUM_CURRENT_SETTINGS, &dmode))
|
||||
{
|
||||
SetLastErrorFromOS();
|
||||
return false;
|
||||
}
|
||||
int orientation = dmode.dmDisplayOrientation;
|
||||
// enumerate modes
|
||||
int i=0;
|
||||
|
@ -858,10 +874,22 @@ bool C4AbstractApp::SetVideoMode(unsigned int iXRes, unsigned int iYRes, unsigne
|
|||
dspMode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
|
||||
if (iRefreshRate != 0)
|
||||
dspMode.dmFields |= DM_DISPLAYFREQUENCY;
|
||||
if (ChangeDisplaySettingsExW(iMonitor ? Mon.GetWideChar() : NULL, &dspMode, NULL, CDS_FULLSCREEN, NULL) != DISP_CHANGE_SUCCESSFUL)
|
||||
DWORD rv = ChangeDisplaySettingsExW(iMonitor ? Mon.GetWideChar() : NULL, &dspMode, NULL, CDS_FULLSCREEN, NULL);
|
||||
if (rv != DISP_CHANGE_SUCCESSFUL)
|
||||
{
|
||||
switch (rv)
|
||||
{
|
||||
return false;
|
||||
#define CDSE_ERROR(error) case error: sLastError = LoadResStr("IDS_ERR_" #error); break
|
||||
CDSE_ERROR(DISP_CHANGE_BADFLAGS);
|
||||
CDSE_ERROR(DISP_CHANGE_BADMODE);
|
||||
CDSE_ERROR(DISP_CHANGE_BADPARAM);
|
||||
CDSE_ERROR(DISP_CHANGE_RESTART);
|
||||
CDSE_ERROR(DISP_CHANGE_FAILED);
|
||||
#undef CDSE_ERROR
|
||||
default: sLastError = LoadResStr("IDS_ERR_FAILURE"); break;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
SetWindowLong(pWindow->hWindow, GWL_STYLE,
|
||||
GetWindowLong(pWindow->hWindow, GWL_STYLE) & ~ (WS_CAPTION|WS_THICKFRAME|WS_BORDER));
|
||||
|
|
Loading…
Reference in New Issue