Don't crash when no working display adapter is present

svn path=/trunk/; revision=22206
This commit is contained in:
Hervé Poussineau 2006-06-04 14:09:29 +00:00
parent cc12e88784
commit c373b8ba66

View file

@ -1,12 +1,11 @@
/* $Id$
*
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS Display Control Panel
* FILE: lib/cpl/desk/settings.c
* PURPOSE: Settings property page
*
*
* PROGRAMMERS: Trevor McCort (lycan359@gmail.com)
* Hervé Poussineau (poussine@freesurf.fr)
* Hervé Poussineau (hpoussin@reactos.org)
*/
#include "desk.h"
@ -54,14 +53,13 @@ UpdateDisplay(IN HWND hwndDlg)
TCHAR Buffer[64];
TCHAR Pixel[64];
DWORD index;
LoadString(hApplet, IDS_PIXEL, Pixel, sizeof(Pixel) / sizeof(TCHAR));
_stprintf(Buffer, Pixel, CurrentDisplayDevice->CurrentSettings->dmPelsWidth, CurrentDisplayDevice->CurrentSettings->dmPelsHeight, Pixel);
SendDlgItemMessage(hwndDlg, IDC_SETTINGS_RESOLUTION_TEXT, WM_SETTEXT, 0, (LPARAM)Buffer);
for (index = 0; index < CurrentDisplayDevice->ResolutionsCount; index++)
{
{
if (CurrentDisplayDevice->Resolutions[index].dmPelsWidth == CurrentDisplayDevice->CurrentSettings->dmPelsWidth &&
CurrentDisplayDevice->Resolutions[index].dmPelsHeight == CurrentDisplayDevice->CurrentSettings->dmPelsHeight)
@ -70,7 +68,7 @@ UpdateDisplay(IN HWND hwndDlg)
break;
}
}
if (LoadString(hApplet, (2900 + CurrentDisplayDevice->CurrentSettings->dmBitsPerPel), Buffer, sizeof(Buffer) / sizeof(TCHAR)))
if (LoadString(hApplet, (2900 + CurrentDisplayDevice->CurrentSettings->dmBitsPerPel), Buffer, sizeof(Buffer) / sizeof(TCHAR)))
SendDlgItemMessage(hwndDlg, IDC_SETTINGS_BPP, CB_SELECTSTRING, -1, (LPARAM)Buffer);
}
@ -85,7 +83,7 @@ GetPossibleSettings(IN LPTSTR DeviceName, OUT DWORD* pSettingsCount, OUT PSETTIN
HDC hDC;
PSETTINGS_ENTRY Current;
DWORD bpp, xres, yres, checkbpp;
/* Get current settings */
*CurrentSettings = NULL;
hDC = CreateIC(NULL, DeviceName, NULL, NULL);
@ -94,23 +92,22 @@ GetPossibleSettings(IN LPTSTR DeviceName, OUT DWORD* pSettingsCount, OUT PSETTIN
xres = GetDeviceCaps(hDC, HORZRES);
yres = GetDeviceCaps(hDC, VERTRES);
DeleteDC(hDC);
/* List all settings */
devmode.dmSize = (WORD)sizeof(DEVMODE);
devmode.dmDriverExtra = 0;
while (EnumDisplaySettingsEx(DeviceName, iMode, &devmode, dwFlags))
{
if (devmode.dmBitsPerPel==8 || devmode.dmBitsPerPel==16 || devmode.dmBitsPerPel==24 || devmode.dmBitsPerPel==32) checkbpp=1;
else checkbpp=0;
if (devmode.dmPelsWidth < 640 ||
devmode.dmPelsHeight < 480 || checkbpp == 0)
{
iMode++;
continue;
iMode++;
continue;
}
Current = HeapAlloc(GetProcessHeap(), 0, sizeof(SETTINGS_ENTRY));
if (Current != NULL)
{
@ -123,7 +120,7 @@ GetPossibleSettings(IN LPTSTR DeviceName, OUT DWORD* pSettingsCount, OUT PSETTIN
while (Next != NULL && (
Next->dmPelsHeight < Current->dmPelsHeight ||
(Next->dmPelsHeight == Current->dmPelsHeight && Next->dmBitsPerPel < Current->dmBitsPerPel) ||
(Next->dmPelsHeight == Current->dmPelsHeight &&
(Next->dmPelsHeight == Current->dmPelsHeight &&
Next->dmBitsPerPel == Current->dmBitsPerPel &&
Next->dmPelsWidth < Current->dmPelsWidth)))
{
@ -146,12 +143,12 @@ GetPossibleSettings(IN LPTSTR DeviceName, OUT DWORD* pSettingsCount, OUT PSETTIN
}
iMode++;
}
*pSettingsCount = NbSettings;
return Settings;
}
static VOID
static BOOL
AddDisplayDevice(IN LPTSTR Description, IN LPTSTR DeviceName)
{
PDISPLAY_DEVICE_ENTRY newEntry = NULL;
@ -162,17 +159,18 @@ AddDisplayDevice(IN LPTSTR Description, IN LPTSTR DeviceName)
PSETTINGS_ENTRY Current;
DWORD ResolutionsCount = 1;
DWORD i;
newEntry = HeapAlloc(GetProcessHeap(), 0, sizeof(DISPLAY_DEVICE_ENTRY));
memset(newEntry, 0, sizeof(DISPLAY_DEVICE_ENTRY));
if (!newEntry) goto ByeBye;
newEntry->Settings = GetPossibleSettings(DeviceName, &newEntry->SettingsCount, &newEntry->CurrentSettings);
if (!newEntry->Settings) goto ByeBye;
newEntry->InitialSettings.dmPelsWidth = newEntry->CurrentSettings->dmPelsWidth;
newEntry->InitialSettings.dmPelsHeight = newEntry->CurrentSettings->dmPelsHeight;
newEntry->InitialSettings.dmBitsPerPel = newEntry->CurrentSettings->dmBitsPerPel;
/* Count different resolutions */
for (Current = newEntry->Settings; Current != NULL; Current = Current->Flink)
if (Current->Flink != NULL &&
@ -190,23 +188,23 @@ AddDisplayDevice(IN LPTSTR Description, IN LPTSTR DeviceName)
newEntry->Resolutions[i].dmPelsHeight = Current->dmPelsHeight;
i++;
}
descriptionSize = (_tcslen(Description) + 1) * sizeof(TCHAR);
description = HeapAlloc(GetProcessHeap(), 0, descriptionSize);
if (!description) goto ByeBye;
nameSize = (_tcslen(DeviceName) + 1) * sizeof(TCHAR);
name = HeapAlloc(GetProcessHeap(), 0, nameSize);
if (!name) goto ByeBye;
memcpy(description, Description, descriptionSize);
memcpy(name, DeviceName, nameSize);
newEntry->DeviceDescription = description;
newEntry->DeviceName = name;
newEntry->Flink = DisplayDeviceList;
DisplayDeviceList = newEntry;
return;
return TRUE;
ByeBye:
if (newEntry != NULL)
{
@ -228,6 +226,7 @@ ByeBye:
HeapFree(GetProcessHeap(), 0, description);
if (name != NULL)
HeapFree(GetProcessHeap(), 0, name);
return FALSE;
}
static VOID
@ -235,9 +234,9 @@ OnDisplayDeviceChanged(IN HWND hwndDlg, IN PDISPLAY_DEVICE_ENTRY pDeviceEntry)
{
PSETTINGS_ENTRY Current;
DWORD index;
CurrentDisplayDevice = pDeviceEntry; /* Update global variable */
/* Fill color depths combo box */
SendDlgItemMessage(hwndDlg, IDC_SETTINGS_BPP, CB_RESETCONTENT, 0, 0);
for (Current = pDeviceEntry->Settings; Current != NULL; Current = Current->Flink)
@ -253,11 +252,11 @@ OnDisplayDeviceChanged(IN HWND hwndDlg, IN PDISPLAY_DEVICE_ENTRY pDeviceEntry)
}
}
}
/* Fill resolutions slider */
SendDlgItemMessage(hwndDlg, IDC_SETTINGS_RESOLUTION, TBM_CLEARTICS, TRUE, 0);
SendDlgItemMessage(hwndDlg, IDC_SETTINGS_RESOLUTION, TBM_SETRANGE, TRUE, MAKELONG(0, pDeviceEntry->ResolutionsCount - 1));
UpdateDisplay(hwndDlg);
}
@ -267,16 +266,16 @@ OnInitDialog(IN HWND hwndDlg)
DWORD Result = 0;
DWORD iDevNum = 0;
DISPLAY_DEVICE displayDevice;
BITMAP bitmap;
BITMAP bitmap;
/* Get video cards list */
displayDevice.cb = (DWORD)sizeof(DISPLAY_DEVICE);
while (EnumDisplayDevices(NULL, iDevNum, &displayDevice, 0))
{
if ((displayDevice.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP) != 0)
{
AddDisplayDevice(displayDevice.DeviceString, displayDevice.DeviceName);
Result++;
if (AddDisplayDevice(displayDevice.DeviceString, displayDevice.DeviceName))
Result++;
}
iDevNum++;
}
@ -300,14 +299,14 @@ OnInitDialog(IN HWND hwndDlg)
/* FIXME: choose selected adapter being the primary one */
}
hBitmap = LoadImage(hApplet, MAKEINTRESOURCE(IDC_MONITOR), IMAGE_BITMAP, 0, 0, LR_LOADTRANSPARENT);
if (hBitmap != NULL)
{
GetObject(hBitmap, sizeof(BITMAP), &bitmap);
hBitmap = LoadImage(hApplet, MAKEINTRESOURCE(IDC_MONITOR), IMAGE_BITMAP, 0, 0, LR_LOADTRANSPARENT);
if (hBitmap != NULL)
{
GetObject(hBitmap, sizeof(BITMAP), &bitmap);
cxSource = bitmap.bmWidth;
cySource = bitmap.bmHeight;
}
cxSource = bitmap.bmWidth;
cySource = bitmap.bmHeight;
}
}
static VOID
@ -321,11 +320,11 @@ OnBPPChanged(IN HWND hwndDlg)
DWORD dmNewBitsPerPel;
DWORD index;
TCHAR Buffer[64];
SendDlgItemMessage(hwndDlg, IDC_SETTINGS_BPP, WM_GETTEXT, (WPARAM)(sizeof(Buffer) / sizeof(TCHAR)), (LPARAM)Buffer);
index = SendDlgItemMessage(hwndDlg, IDC_SETTINGS_BPP, CB_FINDSTRINGEXACT, (WPARAM)-1, (LPARAM)Buffer);
dmNewBitsPerPel = SendDlgItemMessage(hwndDlg, IDC_SETTINGS_BPP, CB_GETITEMDATA, index, 0);
/* find if new parameters are valid */
Current = CurrentDisplayDevice->CurrentSettings;
if (dmNewBitsPerPel == Current->dmBitsPerPel)
@ -333,9 +332,9 @@ OnBPPChanged(IN HWND hwndDlg)
/* no change */
return;
}
PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
if (dmNewBitsPerPel < Current->dmBitsPerPel)
{
Current = Current->Blink;
@ -368,7 +367,7 @@ OnBPPChanged(IN HWND hwndDlg)
Current = Current->Flink;
}
}
/* search smaller resolution compatible with current color depth */
Current = CurrentDisplayDevice->CurrentSettings->Blink;
while (Current != NULL)
@ -381,7 +380,7 @@ OnBPPChanged(IN HWND hwndDlg)
}
Current = Current->Blink;
}
/* search bigger resolution compatible with current color depth */
Current = CurrentDisplayDevice->CurrentSettings->Flink;
while (Current != NULL)
@ -394,7 +393,7 @@ OnBPPChanged(IN HWND hwndDlg)
}
Current = Current->Flink;
}
/* we shouldn't go there */
}
@ -408,7 +407,7 @@ OnResolutionChanged(IN HWND hwndDlg, IN DWORD NewPosition)
PSETTINGS_ENTRY Current;
DWORD dmNewPelsHeight = CurrentDisplayDevice->Resolutions[NewPosition].dmPelsHeight;
DWORD dmNewPelsWidth = CurrentDisplayDevice->Resolutions[NewPosition].dmPelsWidth;
/* find if new parameters are valid */
Current = CurrentDisplayDevice->CurrentSettings;
if (dmNewPelsHeight == Current->dmPelsHeight && dmNewPelsWidth == Current->dmPelsWidth)
@ -416,9 +415,9 @@ OnResolutionChanged(IN HWND hwndDlg, IN DWORD NewPosition)
/* no change */
return;
}
PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
if (dmNewPelsHeight < Current->dmPelsHeight)
{
Current = Current->Blink;
@ -451,7 +450,7 @@ OnResolutionChanged(IN HWND hwndDlg, IN DWORD NewPosition)
Current = Current->Flink;
}
}
/* search bigger color depth compatible with current resolution */
Current = CurrentDisplayDevice->CurrentSettings->Flink;
while (Current != NULL)
@ -464,7 +463,7 @@ OnResolutionChanged(IN HWND hwndDlg, IN DWORD NewPosition)
}
Current = Current->Flink;
}
/* search smaller color depth compatible with current resolution */
Current = CurrentDisplayDevice->CurrentSettings->Blink;
while (Current != NULL)
@ -477,7 +476,7 @@ OnResolutionChanged(IN HWND hwndDlg, IN DWORD NewPosition)
}
Current = Current->Blink;
}
/* we shouldn't go there */
}
@ -500,7 +499,7 @@ SettingsPageProc(IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lPar
{
DWORD controlId = LOWORD(wParam);
DWORD command = HIWORD(wParam);
if (controlId == IDC_SETTINGS_ADVANCED && command == BN_CLICKED)
OnAdvancedButton();
else if (controlId == IDC_SETTINGS_BPP && command == CBN_SELCHANGE)
@ -572,22 +571,23 @@ SettingsPageProc(IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lPar
break;
}
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc, hdcMem;
hdc = BeginPaint(hwndDlg, &ps);
hdcMem = CreateCompatibleDC(hdc);
SelectObject(hdcMem, hBitmap);
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc, hdcMem;
TransparentBlt(hdc, 98, 0, cxSource, cySource, hdcMem, 0, 0, cxSource, cySource, 0xFF80FF);
hdc = BeginPaint(hwndDlg, &ps);
DeleteDC(hdcMem);
EndPaint(hwndDlg, &ps);
hdcMem = CreateCompatibleDC(hdc);
SelectObject(hdcMem, hBitmap);
} break;
TransparentBlt(hdc, 98, 0, cxSource, cySource, hdcMem, 0, 0, cxSource, cySource, 0xFF80FF);
DeleteDC(hdcMem);
EndPaint(hwndDlg, &ps);
break;
}
case WM_DESTROY:
{
@ -606,7 +606,7 @@ SettingsPageProc(IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lPar
Current = Next;
}
DeleteObject(hBitmap);
DeleteObject(hBitmap);
}
}
return FALSE;