1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Win32k subsystem
4 * PURPOSE: Window classes
5 * FILE: win32ss/user/ntuser/metric.c
6 * PROGRAMER: Casper S. Hornstrup (chorns@users.sourceforge.net)
7 * Timo Kreuzer (timo.kreuzer@reactos.org)
8 */
9
10 #include <win32k.h>
11 DBG_DEFAULT_CHANNEL(UserSysparams);
12
13 static BOOL Setup = FALSE;
14
15 /* FUNCTIONS *****************************************************************/
16
UserIsDBCSEnabled(VOID)17 BOOL FASTCALL UserIsDBCSEnabled(VOID)
18 {
19 return NLS_MB_CODE_PAGE_TAG;
20 }
21
UserIsIMMEnabled(VOID)22 BOOL FASTCALL UserIsIMMEnabled(VOID)
23 {
24 if (NLS_MB_CODE_PAGE_TAG)
25 return TRUE;
26
27 /* "LoadIMM" means Cicero despite its name */
28 return !!RegGetSectionDWORD(L"IMM", L"LoadIMM", FALSE);
29 }
30
UserIsCiceroEnabled(VOID)31 BOOL FASTCALL UserIsCiceroEnabled(VOID)
32 {
33 #if 1
34 return FALSE; /* FIXME: Cicero is not supported yet */
35 #else
36 if (RegGetSectionDWORD(L"IMM", L"DontLoadCTFIME", FALSE))
37 return FALSE;
38
39 return UserIsIMMEnabled();
40 #endif
41 }
42
43 BOOL
44 NTAPI
InitMetrics(VOID)45 InitMetrics(VOID)
46 {
47 INT *piSysMet = gpsi->aiSysMet;
48 ULONG Width, Height;
49
50 /* Note: used for the SM_CLEANBOOT metric */
51 DWORD dwValue = 0;
52 HKEY hKey = 0;
53
54 /* Clean boot */
55 piSysMet[SM_CLEANBOOT] = 0; // Fallback value of 0 (normal mode)
56 if(NT_SUCCESS(RegOpenKey(L"\\REGISTRY\\MACHINE\\SYSTEM\\CurrentControlSet\\Control\\SafeBoot\\Option", &hKey)))
57 {
58 if(RegReadDWORD(hKey, L"OptionValue", &dwValue)) piSysMet[SM_CLEANBOOT] = (INT)dwValue;
59 ZwClose(hKey);
60 }
61
62 /* FIXME: HACK, due to missing MDEV on first init */
63 if (!gpmdev)
64 {
65 Width = 640;
66 Height = 480;
67 }
68 else
69 {
70 Width = gpmdev->ppdevGlobal->gdiinfo.ulHorzRes;
71 Height = gpmdev->ppdevGlobal->gdiinfo.ulVertRes;
72 }
73
74 /* Screen sizes */
75 piSysMet[SM_CXSCREEN] = Width;
76 piSysMet[SM_CYSCREEN] = Height;
77 piSysMet[SM_XVIRTUALSCREEN] = 0;
78 piSysMet[SM_YVIRTUALSCREEN] = 0;
79 piSysMet[SM_CXVIRTUALSCREEN] = Width;
80 piSysMet[SM_CYVIRTUALSCREEN] = Height;
81
82 /* NC area sizes */
83 piSysMet[SM_CYCAPTION] = gspv.ncm.iCaptionHeight + 1; // 19
84 piSysMet[SM_CYSMCAPTION] = gspv.ncm.iSmCaptionHeight + 1; // 15;
85 piSysMet[SM_CXSIZE] = gspv.ncm.iCaptionHeight; // 18;
86 piSysMet[SM_CYSIZE] = gspv.ncm.iCaptionHeight; // 18;
87 piSysMet[SM_CXSMSIZE] = gspv.ncm.iSmCaptionWidth; // 12; XP: piSysMet(SM_CYSMCAPTION) - 1
88 piSysMet[SM_CYSMSIZE] = gspv.ncm.iSmCaptionHeight; // 14;
89 piSysMet[SM_CXBORDER] = 1; // Seems to be hardcoded
90 piSysMet[SM_CYBORDER] = 1; // Seems to be hardcoded
91 piSysMet[SM_CXFOCUSBORDER] = 1;
92 piSysMet[SM_CYFOCUSBORDER] = 1;
93 piSysMet[SM_CXDLGFRAME] = 3;
94 piSysMet[SM_CYDLGFRAME] = 3;
95 piSysMet[SM_CXEDGE] = 2;
96 piSysMet[SM_CYEDGE] = 2;
97 piSysMet[SM_CXFRAME] = piSysMet[SM_CXDLGFRAME] + gspv.ncm.iBorderWidth; // 4
98 piSysMet[SM_CYFRAME] = piSysMet[SM_CYDLGFRAME] + gspv.ncm.iBorderWidth; // 4
99 #if (_WIN32_WINNT >= 0x0600)
100 piSysMet[SM_CXPADDEDBORDER] = 0;
101 #endif
102
103 /* Window sizes */
104 TRACE("ncm.iCaptionWidth=%d,GetSystemMetrics(SM_CYSIZE)=%d,GetSystemMetrics(SM_CXFRAME)=%d,avcwCaption=%d \n",
105 gspv.ncm.iCaptionWidth, piSysMet[SM_CYSIZE],piSysMet[SM_CXFRAME], gspv.tmCaptionFont.tmAveCharWidth);
106
107 piSysMet[SM_CXMIN] = 3 * max(gspv.ncm.iCaptionWidth, 8) // 112
108 + piSysMet[SM_CYSIZE] + 4
109 + 4 * gspv.tmCaptionFont.tmAveCharWidth
110 + 2 * piSysMet[SM_CXFRAME];
111 piSysMet[SM_CYMIN] = piSysMet[SM_CYCAPTION] + 2 * piSysMet[SM_CYFRAME]; // 27
112 piSysMet[SM_CXMAXIMIZED] = piSysMet[SM_CXSCREEN] + 2 * piSysMet[SM_CXFRAME];
113 piSysMet[SM_CYMAXIMIZED] = piSysMet[SM_CYSCREEN] - 20;
114 piSysMet[SM_CXFULLSCREEN] = piSysMet[SM_CXSCREEN];
115 piSysMet[SM_CYFULLSCREEN] = piSysMet[SM_CYMAXIMIZED] - piSysMet[SM_CYMIN];
116 piSysMet[SM_CYKANJIWINDOW] = 0;
117 piSysMet[SM_CXMINIMIZED] = gspv.mm.iWidth + 6;
118 piSysMet[SM_CYMINIMIZED] = piSysMet[SM_CYCAPTION] + 5;
119 piSysMet[SM_CXMINSPACING] = piSysMet[SM_CXMINIMIZED] + gspv.mm.iHorzGap;
120 piSysMet[SM_CYMINSPACING] = piSysMet[SM_CYMINIMIZED] + gspv.mm.iVertGap;
121 piSysMet[SM_CXMAXTRACK] = piSysMet[SM_CXVIRTUALSCREEN] + 4
122 + 2 * piSysMet[SM_CXFRAME];
123 piSysMet[SM_CYMAXTRACK] = piSysMet[SM_CYVIRTUALSCREEN] + 4
124 + 2 * piSysMet[SM_CYFRAME];
125
126 /* Icon */
127 piSysMet[SM_CXVSCROLL] = gspv.ncm.iScrollWidth; // 16;
128 piSysMet[SM_CYVTHUMB] = gspv.ncm.iScrollHeight; // 16;
129 piSysMet[SM_CYHSCROLL] = gspv.ncm.iScrollWidth; // 16;
130 piSysMet[SM_CXHTHUMB] = gspv.ncm.iScrollHeight; // 16;
131 piSysMet[SM_CYVSCROLL] = gspv.ncm.iScrollHeight; // 16
132 piSysMet[SM_CXHSCROLL] = gspv.ncm.iScrollHeight; // 16;
133 piSysMet[SM_CXICON] = 32;
134 piSysMet[SM_CYICON] = 32;
135 piSysMet[SM_CXSMICON] = 16;
136 piSysMet[SM_CYSMICON] = 16;
137 piSysMet[SM_CXICONSPACING] = gspv.im.iHorzSpacing; // 64;
138 piSysMet[SM_CYICONSPACING] = gspv.im.iVertSpacing; // 64;
139 piSysMet[SM_CXCURSOR] = 32;
140 piSysMet[SM_CYCURSOR] = 32;
141 piSysMet[SM_CXMINTRACK] = piSysMet[SM_CXMIN]; // 117
142 piSysMet[SM_CYMINTRACK] = piSysMet[SM_CYMIN]; // 27
143 piSysMet[SM_CXDRAG] = 4;
144 piSysMet[SM_CYDRAG] = 4;
145 piSysMet[SM_ARRANGE] = gspv.mm.iArrange; // 8;
146
147 /* Menu */
148 piSysMet[SM_CYMENU] = gspv.ncm.iMenuHeight + 1; // 19;
149 piSysMet[SM_MENUDROPALIGNMENT] = gspv.bMenuDropAlign;
150 piSysMet[SM_CXMENUCHECK] = ((1 + gspv.tmMenuFont.tmHeight +
151 gspv.tmMenuFont.tmExternalLeading) & ~1) - 1; // 13;
152 piSysMet[SM_CYMENUCHECK] = piSysMet[SM_CXMENUCHECK];
153 piSysMet[SM_CXMENUSIZE] = gspv.ncm.iMenuWidth; // 18;
154 piSysMet[SM_CYMENUSIZE] = gspv.ncm.iMenuHeight; // 18;
155
156 /* Mouse */
157 piSysMet[SM_MOUSEPRESENT] = 1;
158 piSysMet[SM_MOUSEWHEELPRESENT] = 1;
159 piSysMet[SM_CMOUSEBUTTONS] = 2;
160 piSysMet[SM_SWAPBUTTON] = gspv.bMouseBtnSwap ? 1 : 0;
161 piSysMet[SM_CXDOUBLECLK] = gspv.iDblClickWidth;
162 piSysMet[SM_CYDOUBLECLK] = gspv.iDblClickHeight;
163 #if (_WIN32_WINNT >= 0x0600)
164 piSysMet[SM_MOUSEHORIZONTALWHEELPRESENT] = 0;
165 #endif
166
167 /* Version info */
168 piSysMet[SM_TABLETPC] = 0;
169 piSysMet[SM_MEDIACENTER] = 0;
170 piSysMet[SM_STARTER] = 0;
171 piSysMet[SM_SERVERR2] = 0;
172 piSysMet[SM_PENWINDOWS] = 0;
173
174 /* Other */
175 piSysMet[SM_DEBUG] = 0;
176 piSysMet[SM_NETWORK] = 3;
177 piSysMet[SM_SLOWMACHINE] = 0;
178 piSysMet[SM_SECURE] = 0;
179 piSysMet[SM_DBCSENABLED] = NLS_MB_CODE_PAGE_TAG;
180 piSysMet[SM_SHOWSOUNDS] = gspv.bShowSounds;
181 piSysMet[SM_MIDEASTENABLED] = 0;
182 piSysMet[SM_CMONITORS] = 1;
183 piSysMet[SM_SAMEDISPLAYFORMAT] = 1;
184 piSysMet[SM_IMMENABLED] = NLS_MB_CODE_PAGE_TAG;
185
186 /* Reserved */
187 piSysMet[SM_RESERVED1] = 0;
188 piSysMet[SM_RESERVED2] = 0;
189 piSysMet[SM_RESERVED3] = 0;
190 piSysMet[SM_RESERVED4] = 0;
191 piSysMet[64] = 0;
192 piSysMet[65] = 0;
193 piSysMet[66] = 0;
194 #if (_WIN32_WINNT >= 0x0600)
195 piSysMet[90] = 0;
196 #endif
197
198 if (UserIsDBCSEnabled())
199 gpsi->dwSRVIFlags |= SRVINFO_DBCSENABLED; /* DBCS Support */
200
201 if (UserIsIMMEnabled())
202 gpsi->dwSRVIFlags |= SRVINFO_IMM32; /* IME Support */
203
204 if (UserIsCiceroEnabled())
205 gpsi->dwSRVIFlags |= SRVINFO_CICERO_ENABLED; /* Cicero support */
206
207 Setup = TRUE;
208
209 return TRUE;
210 }
211
212 LONG
213 NTAPI
UserGetSystemMetrics(ULONG Index)214 UserGetSystemMetrics(ULONG Index)
215 {
216 ASSERT(gpsi);
217 ASSERT(Setup);
218 TRACE("UserGetSystemMetrics(%lu)\n", Index);
219
220 if (Index == SM_DBCSENABLED)
221 return !!(gpsi->dwSRVIFlags & SRVINFO_DBCSENABLED);
222
223 if (Index == SM_IMMENABLED)
224 return !!(gpsi->dwSRVIFlags & SRVINFO_IMM32);
225
226 /* Get metrics from array */
227 if (Index < SM_CMETRICS)
228 {
229 return gpsi->aiSysMet[Index];
230 }
231
232 /* Handle special values */
233 switch (Index)
234 {
235 case SM_REMOTESESSION:
236 return 0; // FIXME
237
238 case SM_SHUTTINGDOWN:
239 return 0; // FIXME
240
241 case SM_REMOTECONTROL:
242 return 0; // FIXME
243 }
244
245 ERR("UserGetSystemMetrics() called with invalid index %lu\n", Index);
246 return 0;
247 }
248
249 /* EOF */
250