You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
599 lines
17 KiB
599 lines
17 KiB
/******************************************************************************
|
|
|
|
Source File: deskadp.cpp
|
|
|
|
Main code for the advanced desktop adapter page
|
|
|
|
Copyright (c) 1997-1998 by Microsoft Corporation
|
|
|
|
Change History:
|
|
|
|
12-16-97 AndreVa - Created It
|
|
|
|
******************************************************************************/
|
|
|
|
|
|
#include "deskadp.h"
|
|
#define DECL_CRTFREE
|
|
#include <crtfree.h>
|
|
#include "shfusion.h"
|
|
|
|
//
|
|
// The function DevicePropertiesW() is implemented in DevMgr.dll; Since we don't have a devmgr.h, we
|
|
// explicitly declare it here.
|
|
//
|
|
typedef int (WINAPI *DEVPROPERTIESW)(
|
|
HWND hwndParent,
|
|
LPCTSTR MachineName,
|
|
LPCTSTR DeviceID,
|
|
BOOL ShowDeviceTree
|
|
);
|
|
|
|
// OLE-Registry magic number
|
|
// 42071712-76d4-11d1-8b24-00a0c9068ff3
|
|
//
|
|
GUID g_CLSID_CplExt = { 0x42071712, 0x76d4, 0x11d1,
|
|
{ 0x8b, 0x24, 0x00, 0xa0, 0xc9, 0x06, 0x8f, 0xf3 }
|
|
};
|
|
|
|
DESK_EXTENSION_INTERFACE DeskInterface;
|
|
|
|
static const DWORD sc_AdapterHelpIds[] =
|
|
{
|
|
ID_ADP_ADPINFGRP, IDH_DISPLAY_SETTINGS_ADVANCED_ADAPTER_ADAPTER_INFO,
|
|
ID_ADP_AI1, IDH_DISPLAY_SETTINGS_ADVANCED_ADAPTER_ADAPTER_INFO,
|
|
ID_ADP_AI2, IDH_DISPLAY_SETTINGS_ADVANCED_ADAPTER_ADAPTER_INFO,
|
|
ID_ADP_AI3, IDH_DISPLAY_SETTINGS_ADVANCED_ADAPTER_ADAPTER_INFO,
|
|
ID_ADP_AI4, IDH_DISPLAY_SETTINGS_ADVANCED_ADAPTER_ADAPTER_INFO,
|
|
ID_ADP_AI5, IDH_DISPLAY_SETTINGS_ADVANCED_ADAPTER_ADAPTER_INFO,
|
|
ID_ADP_CHIP, IDH_DISPLAY_SETTINGS_ADVANCED_ADAPTER_ADAPTER_INFO,
|
|
ID_ADP_DAC, IDH_DISPLAY_SETTINGS_ADVANCED_ADAPTER_ADAPTER_INFO,
|
|
ID_ADP_MEM, IDH_DISPLAY_SETTINGS_ADVANCED_ADAPTER_ADAPTER_INFO,
|
|
ID_ADP_ADP_STRING, IDH_DISPLAY_SETTINGS_ADVANCED_ADAPTER_ADAPTER_INFO,
|
|
ID_ADP_BIOS_INFO, IDH_DISPLAY_SETTINGS_ADVANCED_ADAPTER_ADAPTER_INFO,
|
|
|
|
ID_ADP_ADPGRP, IDH_DISPLAY_SETTINGS_ADVANCED_ADAPTER_ADAPTER_TYPE,
|
|
IDI_ADAPTER, IDH_DISPLAY_SETTINGS_ADVANCED_ADAPTER_ADAPTER_TYPE,
|
|
ID_ADP_ADAPTOR, IDH_DISPLAY_SETTINGS_ADVANCED_ADAPTER_ADAPTER_TYPE,
|
|
|
|
IDC_LIST_ALL, IDH_DISPLAY_SETTINGS_ADVANCED_ADAPTER_LIST_MODES,
|
|
IDC_PROPERTIES, IDH_DISPLAY_SETTINGS_ADVANCED_ADAPTER_PROPERTIES,
|
|
|
|
0, 0
|
|
};
|
|
|
|
static const DWORD sc_ListAllHelpIds[] =
|
|
{
|
|
ID_MODE_LIST, IDH_DISPLAY_SETTINGS_ADVANCED_ADAPTER_LISTMODE_DIALOGBOX,
|
|
ID_MODE_LISTGRP, IDH_DISPLAY_SETTINGS_ADVANCED_ADAPTER_LISTMODE_DIALOGBOX,
|
|
|
|
0, 0
|
|
};
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Messagebox wrapper
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
int
|
|
FmtMessageBox(
|
|
HWND hwnd,
|
|
UINT fuStyle,
|
|
DWORD dwTitleID,
|
|
DWORD dwTextID)
|
|
{
|
|
TCHAR Title[256];
|
|
TCHAR Text[1500];
|
|
|
|
LoadString(g_hInst, dwTextID, Text, ARRAYSIZE(Text));
|
|
LoadString(g_hInst, dwTitleID, Title, ARRAYSIZE(Title));
|
|
|
|
return (MessageBox(hwnd, Text, Title, fuStyle));
|
|
}
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Main dialog box Windows Proc
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
INT_PTR
|
|
CALLBACK
|
|
ListAllModesProc(
|
|
HWND hDlg,
|
|
UINT uMessage,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
{
|
|
LPDEVMODEW lpdm, lpdmCur;
|
|
HWND hList;
|
|
DWORD i;
|
|
LRESULT item;
|
|
|
|
switch (uMessage)
|
|
{
|
|
case WM_INITDIALOG:
|
|
|
|
//
|
|
// Save the lParam - we will store the new mode here
|
|
//
|
|
SetWindowLongPtr(hDlg, DWLP_USER, lParam);
|
|
lpdmCur = *((LPDEVMODEW *)lParam);
|
|
Assert (lpdmCur != NULL);
|
|
|
|
//
|
|
// Build the list of modes to display
|
|
//
|
|
i = 0;
|
|
hList = GetDlgItem(hDlg, ID_MODE_LIST);
|
|
while (lpdm = DeskInterface.lpfnEnumAllModes(DeskInterface.pContext, i))
|
|
{
|
|
TCHAR achFreData[50];
|
|
TCHAR achFre[50];
|
|
TCHAR achStr[80];
|
|
TCHAR achText[120];
|
|
DWORD idColor;
|
|
DWORD idFreq;
|
|
|
|
//
|
|
// convert bit count to number of colors and make it a string
|
|
//
|
|
|
|
switch (lpdm->dmBitsPerPel)
|
|
{
|
|
case 32: idColor = IDS_MODE_TRUECOLOR32; break;
|
|
case 24: idColor = IDS_MODE_TRUECOLOR24; break;
|
|
case 16: idColor = IDS_MODE_16BIT_COLOR; break;
|
|
case 15: idColor = IDS_MODE_15BIT_COLOR; break;
|
|
case 8: idColor = IDS_MODE_8BIT_COLOR; break;
|
|
case 4: idColor = IDS_MODE_4BIT_COLOR; break;
|
|
default:
|
|
FmtMessageBox(hDlg,
|
|
MB_OK | MB_ICONINFORMATION,
|
|
IDS_BAD_COLOR,
|
|
IDS_BAD_COLOR);
|
|
|
|
EndDialog(hDlg, -1);
|
|
break;
|
|
}
|
|
|
|
if (lpdm->dmDisplayFrequency == 0)
|
|
{
|
|
FmtMessageBox(hDlg,
|
|
MB_OK | MB_ICONINFORMATION,
|
|
IDS_BAD_REFRESH,
|
|
IDS_BAD_REFRESH);
|
|
|
|
EndDialog(hDlg, -1);
|
|
break;
|
|
}
|
|
else if (lpdm->dmDisplayFrequency == 1)
|
|
{
|
|
LoadString(g_hInst, IDS_MODE_REFRESH_DEF, achFre, ARRAYSIZE(achFre));
|
|
}
|
|
else
|
|
{
|
|
if (lpdm->dmDisplayFrequency <= 50)
|
|
idFreq = IDS_MODE_REFRESH_INT;
|
|
else
|
|
idFreq = IDS_MODE_REFRESH_HZ;
|
|
|
|
LoadString(g_hInst, idFreq, achFreData, ARRAYSIZE(achFreData));
|
|
StringCchPrintf(achFre, ARRAYSIZE(achFre), achFreData, lpdm->dmDisplayFrequency);
|
|
}
|
|
|
|
LoadString(g_hInst, idColor, achStr, ARRAYSIZE(achStr));
|
|
StringCchPrintf(achText, ARRAYSIZE(achText), achStr, lpdm->dmPelsWidth, lpdm->dmPelsHeight, achFre);
|
|
|
|
item = ListBox_AddString(hList, achText);
|
|
if (lpdm == lpdmCur)
|
|
ListBox_SetCurSel(hList, item);
|
|
ListBox_SetItemData(hList, item, lpdm);
|
|
|
|
i++;
|
|
}
|
|
|
|
//
|
|
// If no modes are available, put up a popup and exit.
|
|
//
|
|
|
|
if (i == 0)
|
|
{
|
|
EndDialog(hDlg, -1);
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
|
|
switch (LOWORD(wParam))
|
|
{
|
|
case ID_MODE_LIST:
|
|
|
|
if (HIWORD(wParam) != LBN_DBLCLK)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
//
|
|
// fall through, as DBLCLK means select.
|
|
//
|
|
|
|
case IDOK:
|
|
|
|
//
|
|
// Save the mode back
|
|
//
|
|
|
|
item = SendDlgItemMessage(hDlg, ID_MODE_LIST, LB_GETCURSEL, 0, 0);
|
|
|
|
if ((item != LB_ERR) &&
|
|
(lpdm = (LPDEVMODEW) SendDlgItemMessage(hDlg, ID_MODE_LIST, LB_GETITEMDATA, item, 0)))
|
|
{
|
|
*((LPDEVMODEW *)GetWindowLongPtr(hDlg, DWLP_USER)) = lpdm;
|
|
EndDialog(hDlg, TRUE);
|
|
break;
|
|
}
|
|
|
|
//
|
|
// fall through
|
|
//
|
|
|
|
case IDCANCEL:
|
|
|
|
EndDialog(hDlg, FALSE);
|
|
break;
|
|
|
|
default:
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
break;
|
|
|
|
case WM_HELP:
|
|
|
|
WinHelp((HWND)((LPHELPINFO)lParam)->hItemHandle,
|
|
TEXT("display.hlp"),
|
|
HELP_WM_HELP,
|
|
(DWORD_PTR)(LPTSTR)sc_ListAllHelpIds);
|
|
|
|
break;
|
|
|
|
case WM_CONTEXTMENU:
|
|
|
|
WinHelp((HWND)wParam,
|
|
TEXT("display.hlp"),
|
|
HELP_CONTEXTMENU,
|
|
(DWORD_PTR)(LPTSTR)sc_ListAllHelpIds);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
void Adaptor_OnApply(HWND hDlg)
|
|
{
|
|
HINSTANCE hInst;
|
|
LPDISPLAY_SAVE_SETTINGS lpfnDisplaySaveSettings = NULL;
|
|
long lRet = PSNRET_INVALID_NOCHANGEPAGE;
|
|
|
|
hInst = LoadLibrary(TEXT("desk.cpl"));
|
|
if (hInst)
|
|
{
|
|
lpfnDisplaySaveSettings = (LPDISPLAY_SAVE_SETTINGS)
|
|
GetProcAddress(hInst, "DisplaySaveSettings");
|
|
if (lpfnDisplaySaveSettings)
|
|
{
|
|
LONG lSave = lpfnDisplaySaveSettings(DeskInterface.pContext, hDlg);
|
|
if (lSave == DISP_CHANGE_SUCCESSFUL)
|
|
{
|
|
//
|
|
// Save the current mode - to restore it in case the user cancels the p. sheet
|
|
//
|
|
LPDEVMODEW lpdmOnCancel = DeskInterface.lpfnGetSelectedMode(DeskInterface.pContext);
|
|
SetWindowLongPtr(hDlg, DWLP_USER, (LONG_PTR)lpdmOnCancel);
|
|
lRet = PSNRET_NOERROR;
|
|
}
|
|
else if (lSave == DISP_CHANGE_RESTART)
|
|
{
|
|
//
|
|
// User wants to reboot system.
|
|
//
|
|
PropSheet_RestartWindows(GetParent(hDlg));
|
|
lRet = PSNRET_NOERROR;
|
|
}
|
|
}
|
|
|
|
FreeLibrary(hInst);
|
|
}
|
|
|
|
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, lRet);
|
|
}
|
|
|
|
void Adaptor_OnInitDialog(HWND hDlg)
|
|
{
|
|
Assert (DeskInterface.cbSize == 0);
|
|
|
|
//
|
|
// Get the CPL extension interfaces from IDataObject.
|
|
//
|
|
FORMATETC fmte = {(CLIPFORMAT)RegisterClipboardFormat(DESKCPLEXT_INTERFACE),
|
|
(DVTARGETDEVICE FAR *) NULL,
|
|
DVASPECT_CONTENT,
|
|
-1,
|
|
TYMED_HGLOBAL};
|
|
|
|
STGMEDIUM stgm;
|
|
|
|
HRESULT hres = g_lpdoTarget->GetData(&fmte, &stgm);
|
|
|
|
if (SUCCEEDED(hres) && stgm.hGlobal)
|
|
{
|
|
//
|
|
// The storage now contains Display device path (\\.\DisplayX) in UNICODE.
|
|
//
|
|
|
|
PDESK_EXTENSION_INTERFACE pInterface =
|
|
(PDESK_EXTENSION_INTERFACE) GlobalLock(stgm.hGlobal);
|
|
|
|
if (pInterface != NULL)
|
|
{
|
|
RtlCopyMemory(&DeskInterface,
|
|
pInterface,
|
|
min(pInterface->cbSize,
|
|
sizeof(DESK_EXTENSION_INTERFACE)));
|
|
|
|
GlobalUnlock(stgm.hGlobal);
|
|
|
|
SendDlgItemMessageW(hDlg, ID_ADP_CHIP, WM_SETTEXT, 0, (LPARAM)&(DeskInterface.Info.ChipType[0]));
|
|
SendDlgItemMessageW(hDlg, ID_ADP_DAC, WM_SETTEXT, 0, (LPARAM)&(DeskInterface.Info.DACType[0]));
|
|
SendDlgItemMessageW(hDlg, ID_ADP_MEM, WM_SETTEXT, 0, (LPARAM)&(DeskInterface.Info.MemSize[0]));
|
|
SendDlgItemMessageW(hDlg, ID_ADP_ADP_STRING, WM_SETTEXT, 0, (LPARAM)&(DeskInterface.Info.AdapString[0]));
|
|
SendDlgItemMessageW(hDlg, ID_ADP_BIOS_INFO, WM_SETTEXT, 0, (LPARAM)&(DeskInterface.Info.BiosString[0]));
|
|
|
|
//
|
|
// Save the initial selected mode - to restore it in case the user cancels the p. sheet
|
|
//
|
|
|
|
LPDEVMODEW lpdmOnCancel = DeskInterface.lpfnGetSelectedMode(DeskInterface.pContext);
|
|
SetWindowLongPtr(hDlg, DWLP_USER, (LONG_PTR)lpdmOnCancel);
|
|
}
|
|
|
|
ReleaseStgMedium(&stgm);
|
|
}
|
|
|
|
//
|
|
// Get device description from IDataObject.
|
|
//
|
|
|
|
LPWSTR pDeviceDescription;
|
|
|
|
FORMATETC fmte2 = {(CLIPFORMAT)RegisterClipboardFormat(DESKCPLEXT_DISPLAY_NAME),
|
|
(DVTARGETDEVICE FAR *) NULL,
|
|
DVASPECT_CONTENT,
|
|
-1,
|
|
TYMED_HGLOBAL};
|
|
|
|
hres = g_lpdoTarget->GetData(&fmte2, &stgm);
|
|
|
|
if (SUCCEEDED(hres) && stgm.hGlobal)
|
|
{
|
|
pDeviceDescription = (LPWSTR) GlobalLock(stgm.hGlobal);
|
|
|
|
SendDlgItemMessageW(hDlg, ID_ADP_ADAPTOR, WM_SETTEXT, 0, (LPARAM)pDeviceDescription);
|
|
|
|
GlobalUnlock(stgm.hGlobal);
|
|
|
|
ReleaseStgMedium(&stgm);
|
|
}
|
|
|
|
//
|
|
// Enable/disable the properties button
|
|
//
|
|
|
|
BOOL bEnable = FALSE;
|
|
LPWSTR pwDeviceID = NULL;
|
|
|
|
FORMATETC fmte3 = {(CLIPFORMAT)RegisterClipboardFormat(DESKCPLEXT_DISPLAY_ID),
|
|
(DVTARGETDEVICE FAR *)NULL,
|
|
DVASPECT_CONTENT,
|
|
-1,
|
|
TYMED_HGLOBAL};
|
|
|
|
hres = g_lpdoTarget->GetData(&fmte3, &stgm);
|
|
|
|
if (SUCCEEDED(hres) && stgm.hGlobal)
|
|
{
|
|
pwDeviceID = (LPWSTR)GlobalLock(stgm.hGlobal);
|
|
bEnable = ((pwDeviceID != NULL) && (*pwDeviceID != L'\0'));
|
|
GlobalUnlock(stgm.hGlobal);
|
|
ReleaseStgMedium(&stgm);
|
|
}
|
|
|
|
HWND hPropButton = GetDlgItem(hDlg, IDC_PROPERTIES);
|
|
if (hPropButton != NULL)
|
|
EnableWindow(hPropButton, bEnable);
|
|
}
|
|
|
|
void Adaptor_OnCancel(HWND hDlg)
|
|
{
|
|
//
|
|
// Restore initial mode
|
|
//
|
|
LPDEVMODEW lpdmOnCancel = (LPDEVMODEW) GetWindowLongPtr(hDlg, DWLP_USER);
|
|
DeskInterface.lpfnSetSelectedMode(DeskInterface.pContext, lpdmOnCancel);
|
|
}
|
|
|
|
void Adaptor_OnListAllModes(HWND hDlg)
|
|
{
|
|
LPDEVMODEW lpdmBefore, lpdmAfter;
|
|
|
|
lpdmAfter = lpdmBefore = DeskInterface.lpfnGetSelectedMode(DeskInterface.pContext);
|
|
if (DialogBoxParam(g_hInst,
|
|
MAKEINTRESOURCE(DLG_SET_MODE_LIST),
|
|
hDlg,
|
|
ListAllModesProc,
|
|
(LPARAM) &lpdmAfter) == 1 &&
|
|
lpdmAfter && (lpdmAfter != lpdmBefore))
|
|
{
|
|
|
|
//
|
|
// If the user selected a new setting, tell the property sheet
|
|
// we have outstanding changes. This will enable the Apply button.
|
|
//
|
|
PropSheet_Changed(GetParent(hDlg), hDlg);
|
|
DeskInterface.lpfnSetSelectedMode(DeskInterface.pContext, lpdmAfter);
|
|
}
|
|
}
|
|
|
|
void Adaptor_OnProperties(HWND hDlg)
|
|
{
|
|
// Invoke the device manager property sheets to show the properties of the
|
|
// given hardware.
|
|
|
|
LPWSTR pwDeviceID;
|
|
HRESULT hres;
|
|
STGMEDIUM stgm;
|
|
|
|
FORMATETC fmte2 = {(CLIPFORMAT)RegisterClipboardFormat(DESKCPLEXT_DISPLAY_ID),
|
|
(DVTARGETDEVICE FAR *) NULL,
|
|
DVASPECT_CONTENT,
|
|
-1,
|
|
TYMED_HGLOBAL};
|
|
|
|
hres = g_lpdoTarget->GetData(&fmte2, &stgm);
|
|
|
|
if (SUCCEEDED(hres) && stgm.hGlobal)
|
|
{
|
|
pwDeviceID = (LPWSTR) GlobalLock(stgm.hGlobal);
|
|
|
|
HINSTANCE hinstDevMgr = LoadLibrary(TEXT("DEVMGR.DLL"));
|
|
if (hinstDevMgr)
|
|
{
|
|
DEVPROPERTIESW pfnDevPropW =
|
|
(DEVPROPERTIESW)GetProcAddress(hinstDevMgr, "DevicePropertiesW");
|
|
if (pfnDevPropW)
|
|
{
|
|
//Display the property sheets for this device.
|
|
(*pfnDevPropW)(hDlg, NULL, pwDeviceID, FALSE);
|
|
}
|
|
|
|
FreeLibrary(hinstDevMgr);
|
|
}
|
|
|
|
GlobalUnlock(stgm.hGlobal);
|
|
ReleaseStgMedium(&stgm);
|
|
}
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
// PropertySheeDlgProc()
|
|
//
|
|
// The dialog procedure for the "Adapter" property sheet page.
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
INT_PTR
|
|
CALLBACK
|
|
PropertySheeDlgProc(
|
|
HWND hDlg,
|
|
UINT uMessage,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
{
|
|
switch (uMessage)
|
|
{
|
|
case WM_INITDIALOG:
|
|
|
|
RtlZeroMemory(&DeskInterface, sizeof(DeskInterface));
|
|
|
|
if (!g_lpdoTarget)
|
|
{
|
|
return FALSE;
|
|
}
|
|
else
|
|
{
|
|
Adaptor_OnInitDialog(hDlg);
|
|
}
|
|
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
|
|
if (DeskInterface.cbSize > 0)
|
|
{
|
|
switch( LOWORD(wParam) )
|
|
{
|
|
case IDC_LIST_ALL:
|
|
Adaptor_OnListAllModes(hDlg);
|
|
break;
|
|
|
|
case IDC_PROPERTIES:
|
|
Adaptor_OnProperties(hDlg);
|
|
break;
|
|
|
|
default:
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
break;
|
|
|
|
case WM_NOTIFY:
|
|
|
|
if (DeskInterface.cbSize > 0)
|
|
{
|
|
switch (((NMHDR FAR *)lParam)->code)
|
|
{
|
|
case PSN_APPLY:
|
|
Adaptor_OnApply(hDlg);
|
|
break;
|
|
|
|
case PSN_RESET:
|
|
Adaptor_OnCancel(hDlg);
|
|
break;
|
|
|
|
default:
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
break;
|
|
|
|
case WM_HELP:
|
|
|
|
WinHelp((HWND)((LPHELPINFO)lParam)->hItemHandle,
|
|
TEXT("display.hlp"),
|
|
HELP_WM_HELP,
|
|
(DWORD_PTR)(LPTSTR)sc_AdapterHelpIds);
|
|
|
|
break;
|
|
|
|
case WM_CONTEXTMENU:
|
|
|
|
WinHelp((HWND)wParam,
|
|
TEXT("display.hlp"),
|
|
HELP_CONTEXTMENU,
|
|
(DWORD_PTR)(LPTSTR)sc_AdapterHelpIds);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|