xref: /reactos/dll/cpl/desk/general.c (revision 34593d93)
1 /*
2  * COPYRIGHT:       See COPYING in the top level directory
3  * PROJECT:         ReactOS Display Control Panel
4  * FILE:            dll/cpl/desk/general.c
5  * PURPOSE:         Advanced General settings
6  */
7 
8 #include "desk.h"
9 
10 static VOID
11 InitFontSizeList(HWND hWnd)
12 {
13     HINF hInf;
14     HKEY hKey;
15     HWND hFontSize;
16     INFCONTEXT Context;
17     int i, ci = 0;
18     DWORD dwSize, dwValue, dwType;
19 
20     hFontSize = GetDlgItem(hWnd, IDC_FONTSIZE_COMBO);
21 
22     hInf = SetupOpenInfFile(_T("font.inf"), NULL,
23                             INF_STYLE_WIN4, NULL);
24 
25     if (hInf != INVALID_HANDLE_VALUE)
26     {
27         if (SetupFindFirstLine(hInf, _T("Font Sizes"), NULL, &Context))
28         {
29             if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SYSTEM\\CurrentControlSet\\Hardware Profiles\\Current\\Software\\Fonts"),
30                              0, KEY_READ, &hKey) == ERROR_SUCCESS)
31             {
32                 dwSize = MAX_PATH;
33                 dwType = REG_DWORD;
34 
35                 if (RegQueryValueEx(hKey, _T("LogPixels"), NULL, &dwType,
36                                     (LPBYTE)&dwValue, &dwSize) != ERROR_SUCCESS)
37                 {
38                     dwValue = 0;
39                 }
40 
41                 RegCloseKey(hKey);
42             }
43 
44             for (;;)
45             {
46                 TCHAR Buffer[LINE_LEN];
47                 TCHAR Desc[LINE_LEN];
48 
49                 if (SetupGetStringField(&Context, 0, Buffer, sizeof(Buffer) / sizeof(TCHAR), NULL) &&
50                     SetupGetIntField(&Context, 1, &ci))
51                 {
52                     _stprintf(Desc, _T("%s (%d DPI)"), Buffer, ci);
53                     i = SendMessage(hFontSize, CB_ADDSTRING, 0, (LPARAM)Desc);
54                     if (i != CB_ERR)
55                         SendMessage(hFontSize, CB_SETITEMDATA, (WPARAM)i, (LPARAM)ci);
56 
57                     if ((int)dwValue == ci)
58                     {
59                         SendMessage(hFontSize, CB_SETCURSEL, (WPARAM)i, 0);
60                         SetWindowText(GetDlgItem(hWnd, IDC_FONTSIZE_CUSTOM), Desc);
61                     }
62                     else
63                         SendMessage(hFontSize, CB_SETCURSEL, 0, 0);
64                 }
65 
66                 if (!SetupFindNextLine(&Context, &Context))
67                 {
68                     break;
69                 }
70             }
71         }
72     }
73 
74     SetupCloseInfFile(hInf);
75 }
76 
77 static VOID
78 InitRadioButtons(HWND hWnd)
79 {
80     HKEY hKey;
81 
82     if (RegOpenKeyEx(HKEY_CURRENT_USER,
83                      _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Controls Folder\\Display"),
84                      0, KEY_READ, &hKey) == ERROR_SUCCESS)
85     {
86         TCHAR szBuf[64];
87         DWORD dwSize = 64;
88 
89         if (RegQueryValueEx(hKey, _T("DynaSettingsChange"), 0, NULL,
90                             (LPBYTE)szBuf, &dwSize) == ERROR_SUCCESS)
91         {
92             switch (_ttoi(szBuf))
93             {
94                 case 0:
95                     SendDlgItemMessage(hWnd, IDC_RESTART_RB, BM_SETCHECK, 1, 1);
96                     break;
97                 case 1:
98                     SendDlgItemMessage(hWnd, IDC_WITHOUTREBOOT_RB, BM_SETCHECK, 1, 1);
99                     break;
100                 case 3:
101                     SendDlgItemMessage(hWnd, IDC_ASKME_RB, BM_SETCHECK, 1, 1);
102                     break;
103             }
104         }
105         else
106             SendDlgItemMessage(hWnd, IDC_WITHOUTREBOOT_RB, BM_SETCHECK, 1, 1);
107 
108         RegCloseKey(hKey);
109     }
110     else
111         SendDlgItemMessage(hWnd, IDC_WITHOUTREBOOT_RB, BM_SETCHECK, 1, 1);
112 }
113 
114 INT_PTR CALLBACK
115 AdvGeneralPageProc(HWND hwndDlg,
116                    UINT uMsg,
117                    WPARAM wParam,
118                    LPARAM lParam)
119 {
120     PDISPLAY_DEVICE_ENTRY DispDevice = NULL;
121     INT_PTR Ret = 0;
122 
123     if (uMsg != WM_INITDIALOG)
124         DispDevice = (PDISPLAY_DEVICE_ENTRY)GetWindowLongPtr(hwndDlg, DWLP_USER);
125 
126     switch (uMsg)
127     {
128         case WM_INITDIALOG:
129             DispDevice = (PDISPLAY_DEVICE_ENTRY)(((LPPROPSHEETPAGE)lParam)->lParam);
130             SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)DispDevice);
131 
132             InitFontSizeList(hwndDlg);
133             InitRadioButtons(hwndDlg);
134 
135             Ret = TRUE;
136             break;
137         case WM_COMMAND:
138             switch (LOWORD(wParam))
139             {
140                 case IDC_FONTSIZE_COMBO:
141                     if (HIWORD(wParam) == CBN_SELCHANGE)
142                     {
143                         PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
144                     }
145                     break;
146                 case IDC_RESTART_RB:
147                 case IDC_WITHOUTREBOOT_RB:
148                 case IDC_ASKME_RB:
149                     PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
150                 break;
151             }
152             break;
153     }
154 
155     return Ret;
156 }
157