2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Win32k subsystem
4 * PURPOSE: Window classes
5 * FILE: subsystems/win32/win32k/ntuser/metric.c
6 * PROGRAMER: Casper S. Hornstrup (chorns@users.sourceforge.net)
7 * Timo Kreuzer (timo.kreuzer@reactos.org)
11 DBG_DEFAULT_CHANNEL(UserSysparams
);
13 static BOOL Setup
= FALSE
;
15 /* FUNCTIONS *****************************************************************/
21 INT
*piSysMet
= gpsi
->aiSysMet
;
24 /* Note: used for the SM_CLEANBOOT metric */
29 piSysMet
[SM_CLEANBOOT
] = 0; // Fallback value of 0 (normal mode)
30 if(NT_SUCCESS(RegOpenKey(L
"\\REGISTRY\\MACHINE\\SYSTEM\\CurrentControlSet\\Control\\SafeBoot\\Option", &hKey
)))
32 if(RegReadDWORD(hKey
, L
"OptionValue", &dwValue
)) piSysMet
[SM_CLEANBOOT
] = (INT
)dwValue
;
36 /* FIXME: HACK, due to missing PDEV on first init */
44 Width
= gppdevPrimary
->gdiinfo
.ulHorzRes
;
45 Height
= gppdevPrimary
->gdiinfo
.ulVertRes
;
49 piSysMet
[SM_CXSCREEN
] = Width
;
50 piSysMet
[SM_CYSCREEN
] = Height
;
51 piSysMet
[SM_XVIRTUALSCREEN
] = 0;
52 piSysMet
[SM_YVIRTUALSCREEN
] = 0;
53 piSysMet
[SM_CXVIRTUALSCREEN
] = Width
;
54 piSysMet
[SM_CYVIRTUALSCREEN
] = Height
;
57 piSysMet
[SM_CYCAPTION
] = gspv
.ncm
.iCaptionHeight
+ 1; // 19
58 piSysMet
[SM_CYSMCAPTION
] = gspv
.ncm
.iSmCaptionHeight
+ 1; // 15;
59 piSysMet
[SM_CXSIZE
] = gspv
.ncm
.iCaptionHeight
; // 18;
60 piSysMet
[SM_CYSIZE
] = gspv
.ncm
.iCaptionHeight
; // 18;
61 piSysMet
[SM_CXSMSIZE
] = gspv
.ncm
.iSmCaptionWidth
; // 12; XP: piSysMet(SM_CYSMCAPTION) - 1
62 piSysMet
[SM_CYSMSIZE
] = gspv
.ncm
.iSmCaptionHeight
; // 14;
63 piSysMet
[SM_CXBORDER
] = 1; // Seems to be hardcoded
64 piSysMet
[SM_CYBORDER
] = 1; // Seems to be hardcoded
65 piSysMet
[SM_CXFOCUSBORDER
] = 1;
66 piSysMet
[SM_CYFOCUSBORDER
] = 1;
67 piSysMet
[SM_CXDLGFRAME
] = 3;
68 piSysMet
[SM_CYDLGFRAME
] = 3;
69 piSysMet
[SM_CXEDGE
] = 2;
70 piSysMet
[SM_CYEDGE
] = 2;
71 piSysMet
[SM_CXFRAME
] = piSysMet
[SM_CXDLGFRAME
] + gspv
.ncm
.iBorderWidth
; // 4
72 piSysMet
[SM_CYFRAME
] = piSysMet
[SM_CYDLGFRAME
] + gspv
.ncm
.iBorderWidth
; // 4
73 #if (_WIN32_WINNT >= 0x0600)
74 piSysMet
[SM_CXPADDEDBORDER
] = 0;
78 TRACE("ncm.iCaptionWidth=%d,GetSystemMetrics(SM_CYSIZE)=%d,GetSystemMetrics(SM_CXFRAME)=%d,avcwCaption=%d \n",
79 gspv
.ncm
.iCaptionWidth
, piSysMet
[SM_CYSIZE
],piSysMet
[SM_CXFRAME
], gspv
.tmCaptionFont
.tmAveCharWidth
);
81 piSysMet
[SM_CXMIN
] = 3 * max(gspv
.ncm
.iCaptionWidth
, 8) // 112
82 + piSysMet
[SM_CYSIZE
] + 4
83 + 4 * gspv
.tmCaptionFont
.tmAveCharWidth
84 + 2 * piSysMet
[SM_CXFRAME
];
85 piSysMet
[SM_CYMIN
] = piSysMet
[SM_CYCAPTION
] + 2 * piSysMet
[SM_CYFRAME
]; // 27
86 piSysMet
[SM_CXMAXIMIZED
] = piSysMet
[SM_CXSCREEN
] + 2 * piSysMet
[SM_CXFRAME
];
87 piSysMet
[SM_CYMAXIMIZED
] = piSysMet
[SM_CYSCREEN
] - 20;
88 piSysMet
[SM_CXFULLSCREEN
] = piSysMet
[SM_CXSCREEN
];
89 piSysMet
[SM_CYFULLSCREEN
] = piSysMet
[SM_CYMAXIMIZED
] - piSysMet
[SM_CYMIN
];
90 piSysMet
[SM_CYKANJIWINDOW
] = 0;
91 piSysMet
[SM_CXMINIMIZED
] = gspv
.mm
.iWidth
+ 6;
92 piSysMet
[SM_CYMINIMIZED
] = piSysMet
[SM_CYCAPTION
] + 5;
93 piSysMet
[SM_CXMINSPACING
] = piSysMet
[SM_CXMINIMIZED
] + gspv
.mm
.iHorzGap
;
94 piSysMet
[SM_CYMINSPACING
] = piSysMet
[SM_CYMINIMIZED
] + gspv
.mm
.iVertGap
;
95 piSysMet
[SM_CXMAXTRACK
] = piSysMet
[SM_CXVIRTUALSCREEN
] + 4
96 + 2 * piSysMet
[SM_CXFRAME
];
97 piSysMet
[SM_CYMAXTRACK
] = piSysMet
[SM_CYVIRTUALSCREEN
] + 4
98 + 2 * piSysMet
[SM_CYFRAME
];
101 piSysMet
[SM_CXVSCROLL
] = gspv
.ncm
.iScrollWidth
; // 16;
102 piSysMet
[SM_CYVTHUMB
] = gspv
.ncm
.iScrollHeight
; // 16;
103 piSysMet
[SM_CYHSCROLL
] = gspv
.ncm
.iScrollWidth
; // 16;
104 piSysMet
[SM_CXHTHUMB
] = gspv
.ncm
.iScrollHeight
; // 16;
105 piSysMet
[SM_CYVSCROLL
] = gspv
.ncm
.iScrollHeight
; // 16
106 piSysMet
[SM_CXHSCROLL
] = gspv
.ncm
.iScrollHeight
; // 16;
107 piSysMet
[SM_CXICON
] = 32;
108 piSysMet
[SM_CYICON
] = 32;
109 piSysMet
[SM_CXSMICON
] = 16;
110 piSysMet
[SM_CYSMICON
] = 16;
111 piSysMet
[SM_CXICONSPACING
] = gspv
.im
.iHorzSpacing
; // 64;
112 piSysMet
[SM_CYICONSPACING
] = gspv
.im
.iVertSpacing
; // 64;
113 piSysMet
[SM_CXCURSOR
] = 32;
114 piSysMet
[SM_CYCURSOR
] = 32;
115 piSysMet
[SM_CXMINTRACK
] = piSysMet
[SM_CXMIN
]; // 117
116 piSysMet
[SM_CYMINTRACK
] = piSysMet
[SM_CYMIN
]; // 27
117 piSysMet
[SM_CXDRAG
] = 4;
118 piSysMet
[SM_CYDRAG
] = 4;
119 piSysMet
[SM_ARRANGE
] = gspv
.mm
.iArrange
; // 8;
122 piSysMet
[SM_CYMENU
] = gspv
.ncm
.iMenuHeight
+ 1; // 19;
123 piSysMet
[SM_MENUDROPALIGNMENT
] = gspv
.bMenuDropAlign
;
124 piSysMet
[SM_CXMENUCHECK
] = ((1 + gspv
.tmMenuFont
.tmHeight
+
125 gspv
.tmMenuFont
.tmExternalLeading
) & ~1) - 1; // 13;
126 piSysMet
[SM_CYMENUCHECK
] = piSysMet
[SM_CXMENUCHECK
];
127 piSysMet
[SM_CXMENUSIZE
] = gspv
.ncm
.iMenuWidth
; // 18;
128 piSysMet
[SM_CYMENUSIZE
] = gspv
.ncm
.iMenuHeight
; // 18;
131 piSysMet
[SM_MOUSEPRESENT
] = 1;
132 piSysMet
[SM_MOUSEWHEELPRESENT
] = 1;
133 piSysMet
[SM_CMOUSEBUTTONS
] = 2;
134 piSysMet
[SM_SWAPBUTTON
] = gspv
.bMouseBtnSwap
? 1 : 0;
135 piSysMet
[SM_CXDOUBLECLK
] = gspv
.iDblClickWidth
;
136 piSysMet
[SM_CYDOUBLECLK
] = gspv
.iDblClickHeight
;
137 #if (_WIN32_WINNT >= 0x0600)
138 piSysMet
[SM_MOUSEHORIZONTALWHEELPRESENT
] = 0;
142 piSysMet
[SM_TABLETPC
] = 0;
143 piSysMet
[SM_MEDIACENTER
] = 0;
144 piSysMet
[SM_STARTER
] = 0;
145 piSysMet
[SM_SERVERR2
] = 0;
146 piSysMet
[SM_PENWINDOWS
] = 0;
149 piSysMet
[SM_DEBUG
] = 0;
150 piSysMet
[SM_NETWORK
] = 3;
151 piSysMet
[SM_SLOWMACHINE
] = 0;
152 piSysMet
[SM_SECURE
] = 0;
153 piSysMet
[SM_DBCSENABLED
] = 0;
154 piSysMet
[SM_SHOWSOUNDS
] = gspv
.bShowSounds
;
155 piSysMet
[SM_MIDEASTENABLED
] = 0;
156 piSysMet
[SM_CMONITORS
] = 1;
157 piSysMet
[SM_SAMEDISPLAYFORMAT
] = 1;
158 piSysMet
[SM_IMMENABLED
] = 0;
161 piSysMet
[SM_RESERVED1
] = 0;
162 piSysMet
[SM_RESERVED2
] = 0;
163 piSysMet
[SM_RESERVED3
] = 0;
164 piSysMet
[SM_RESERVED4
] = 0;
168 #if (_WIN32_WINNT >= 0x0600)
172 gpsi
->dwSRVIFlags
|= SRVINFO_METRICS
;
180 UserGetSystemMetrics(ULONG Index
)
184 TRACE("UserGetSystemMetrics(%lu)\n", Index
);
186 /* Get metrics from array */
187 if (Index
< SM_CMETRICS
)
189 return gpsi
->aiSysMet
[Index
];
192 /* Handle special values */
195 case SM_REMOTESESSION
:
198 case SM_SHUTTINGDOWN
:
201 case SM_REMOTECONTROL
:
205 ERR("UserGetSystemMetrics() called with invalid index %lu\n", Index
);