1 /* 2 * COPYRIGHT: See COPYING in the top level directory 3 * PROJECT: ReactOS Display Control Panel 4 * FILE: dll/cpl/desk/advmon.c 5 * PURPOSE: Advanced monitor/display settings 6 */ 7 8 #include "desk.h" 9 10 #define MAX_ADVANCED_PAGES 32 11 12 static BOOL CALLBACK 13 PropSheetAddPage(HPROPSHEETPAGE hpage, LPARAM lParam) 14 { 15 PROPSHEETHEADER *ppsh = (PROPSHEETHEADER *)lParam; 16 if (ppsh != NULL && ppsh->nPages < MAX_ADVANCED_PAGES) 17 { 18 ppsh->phpage[ppsh->nPages++] = hpage; 19 return TRUE; 20 } 21 22 return FALSE; 23 } 24 25 static BOOL 26 DisplayAdvancedSettingsInitPropSheetPage(PROPSHEETHEADER *ppsh, WORD idDlg, DLGPROC DlgProc, LPARAM lParam) 27 { 28 HPROPSHEETPAGE hPage; 29 PROPSHEETPAGE psp; 30 31 if (ppsh->nPages < MAX_ADVANCED_PAGES) 32 { 33 ZeroMemory(&psp, sizeof(psp)); 34 psp.dwSize = sizeof(psp); 35 psp.dwFlags = PSP_DEFAULT; 36 psp.hInstance = hApplet; 37 psp.pszTemplate = MAKEINTRESOURCE(idDlg); 38 psp.pfnDlgProc = DlgProc; 39 psp.lParam = lParam; 40 41 hPage = CreatePropertySheetPage(&psp); 42 if (hPage != NULL) 43 { 44 return PropSheetAddPage(hPage, (LPARAM)ppsh); 45 } 46 } 47 48 return FALSE; 49 } 50 51 static VOID 52 BuildAdvPropTitle(IDataObject *pdo, LPTSTR lpBuffer, DWORD dwBufferLen) 53 { 54 UINT uiMonitorName, uiDisplayName; 55 LPTSTR lpMonitorName, lpDisplayName; 56 TCHAR szFormatBuff[32]; 57 58 if (!LoadString(hApplet, IDS_ADVANCEDTITLEFMT, szFormatBuff, sizeof(szFormatBuff) / sizeof(szFormatBuff[0]))) 59 { 60 szFormatBuff[0] = _T('\0'); 61 } 62 63 uiMonitorName = RegisterClipboardFormat(DESK_EXT_MONITORNAME); 64 uiDisplayName = RegisterClipboardFormat(DESK_EXT_DISPLAYNAME); 65 66 lpMonitorName = QueryDeskCplString(pdo, uiMonitorName); 67 lpDisplayName = QueryDeskCplString(pdo, uiDisplayName); 68 69 _sntprintf(lpBuffer, dwBufferLen, szFormatBuff, lpMonitorName, lpDisplayName); 70 71 if (lpMonitorName != NULL) 72 LocalFree((HLOCAL)lpMonitorName); 73 if (lpDisplayName != NULL) 74 LocalFree((HLOCAL)lpDisplayName); 75 } 76 77 BOOL 78 DisplayAdvancedSettings(HWND hWndParent, PDISPLAY_DEVICE_ENTRY DisplayDevice) 79 { 80 TCHAR szCaption[128]; 81 HPROPSHEETPAGE hpsp[MAX_ADVANCED_PAGES]; 82 PROPSHEETHEADER psh; 83 HPSXA hpsxaDev, hpsxaDisp; 84 BOOL Ret; 85 IDataObject *pdo; 86 87 /* FIXME: Build the "%s and %s" caption string for the monitor and adapter name */ 88 szCaption[0] = _T('\0'); 89 90 ZeroMemory(&psh, sizeof(PROPSHEETHEADER)); 91 psh.dwSize = sizeof(PROPSHEETHEADER); 92 psh.dwFlags = PSH_PROPTITLE; 93 psh.hwndParent = hWndParent; 94 psh.hInstance = hApplet; 95 psh.pszCaption = szCaption; 96 psh.phpage = hpsp; 97 98 DisplayAdvancedSettingsInitPropSheetPage(&psh, IDD_ADVANCED_GENERAL, AdvGeneralPageProc, (LPARAM)DisplayDevice); 99 100 pdo = CreateDevSettings(DisplayDevice); 101 102 if (pdo != NULL) 103 BuildAdvPropTitle(pdo, szCaption, sizeof(szCaption) / sizeof(szCaption[0])); 104 105 hpsxaDev = SHCreatePropSheetExtArrayEx(HKEY_LOCAL_MACHINE, REGSTR_PATH_CONTROLSFOLDER TEXT("\\Device"), MAX_ADVANCED_PAGES - psh.nPages, pdo); 106 if (hpsxaDev != NULL) 107 SHAddFromPropSheetExtArray(hpsxaDev, PropSheetAddPage, (LPARAM)&psh); 108 109 hpsxaDisp = SHCreatePropSheetExtArrayEx(HKEY_LOCAL_MACHINE, REGSTR_PATH_CONTROLSFOLDER TEXT("\\Display"), MAX_ADVANCED_PAGES - psh.nPages, pdo); 110 if (hpsxaDisp != NULL) 111 SHAddFromPropSheetExtArray(hpsxaDisp, PropSheetAddPage, (LPARAM)&psh); 112 113 Ret = (LONG)(PropertySheet(&psh) != -1); 114 115 if (hpsxaDisp != NULL) 116 SHDestroyPropSheetExtArray(hpsxaDisp); 117 118 if (hpsxaDev != NULL) 119 SHDestroyPropSheetExtArray(hpsxaDev); 120 121 IDataObject_Release(pdo); 122 123 return Ret; 124 } 125