ReactOS 0.4.16-dev-981-g80eb313
tuimenu.c
Go to the documentation of this file.
1/*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: FreeLoader
4 * FILE: boot/freeldr/freeldr/ui/tuimenu.c
5 * PURPOSE: Text UI Menu Functions
6 * PROGRAMMERS: Alex Ionescu (alex@relsoft.net)
7 * Brian Palmer (brianp@sginet.com)
8 */
9
10/* INCLUDES ******************************************************************/
11
12#include <freeldr.h>
13
14/* FUNCTIONS *****************************************************************/
15
16static VOID
19
20static ULONG
23 _In_ UiMenuKeyPressFilterCallback KeyPressFilter);
24
25static VOID
28
31 IN PCSTR MenuHeader,
32 IN PCSTR MenuFooter OPTIONAL,
33 IN PCSTR MenuItemList[],
34 IN ULONG MenuItemCount,
35 IN ULONG DefaultMenuItem,
36 IN LONG MenuTimeOut,
37 OUT PULONG SelectedMenuItem,
38 IN BOOLEAN CanEscape,
41{
42 UI_MENU_INFO MenuInformation;
43 ULONG LastClockSecond;
44 ULONG CurrentClockSecond;
45 ULONG KeyPress;
46
47 /*
48 * Before taking any default action if there is no timeout,
49 * check whether the supplied key filter callback function
50 * may handle a specific user keypress. If it does, the
51 * timeout is cancelled.
52 */
53 if (!MenuTimeOut && KeyPressFilter && MachConsKbHit())
54 {
55 /* Get the key (get the extended key if needed) */
56 KeyPress = MachConsGetCh();
57 if (KeyPress == KEY_EXTENDED)
58 KeyPress = MachConsGetCh();
59
60 /*
61 * Call the supplied key filter callback function to see
62 * if it is going to handle this keypress.
63 */
64 if (KeyPressFilter(KeyPress, DefaultMenuItem, Context))
65 {
66 /* It processed the key character, cancel the timeout */
67 MenuTimeOut = -1;
68 }
69 }
70
71 /* Check if there is no timeout */
72 if (!MenuTimeOut)
73 {
74 /* Return the default selected item */
75 if (SelectedMenuItem) *SelectedMenuItem = DefaultMenuItem;
76 return TRUE;
77 }
78
79 /* Setup the MENU_INFO structure */
80 MenuInformation.MenuHeader = MenuHeader;
81 MenuInformation.MenuFooter = MenuFooter;
82 MenuInformation.MenuItemList = MenuItemList;
83 MenuInformation.MenuItemCount = MenuItemCount;
84 MenuInformation.MenuTimeRemaining = MenuTimeOut;
85 MenuInformation.SelectedMenuItem = DefaultMenuItem;
86 MenuInformation.Context = Context;
87
88 /* Calculate the size of the menu box */
89 TuiCalcMenuBoxSize(&MenuInformation);
90
91 /* Draw the menu */
92 UiVtbl.DrawMenu(&MenuInformation);
93
94 /* Get the current second of time */
95 LastClockSecond = ArcGetTime()->Second;
96
97 /* Process keys */
98 while (TRUE)
99 {
100 /* Process key presses */
101 KeyPress = TuiProcessMenuKeyboardEvent(&MenuInformation, KeyPressFilter);
102
103 /* Check for ENTER or ESC */
104 if (KeyPress == KEY_ENTER) break;
105 if (CanEscape && KeyPress == KEY_ESC) return FALSE;
106
107 /* Get the updated time, and check if more than a second has elapsed */
108 CurrentClockSecond = ArcGetTime()->Second;
109 if (CurrentClockSecond != LastClockSecond)
110 {
111 /* Update the time information */
112 LastClockSecond = CurrentClockSecond;
113
114 // FIXME: Theme-specific
115 /* Update the date & time */
117
118 /* If there is a countdown, update it */
119 if (MenuInformation.MenuTimeRemaining > 0)
120 {
121 MenuInformation.MenuTimeRemaining--;
122 TuiDrawMenuTimeout(&MenuInformation);
123 }
124 else if (MenuInformation.MenuTimeRemaining == 0)
125 {
126 /* A timeout occurred, exit this loop and return selection */
128 break;
129 }
131 }
132
133 MachHwIdle();
134 }
135
136 /* Return the selected item */
137 if (SelectedMenuItem) *SelectedMenuItem = MenuInformation.SelectedMenuItem;
138 return TRUE;
139}
140
141static VOID
144{
145 ULONG i;
146 ULONG Width = 0;
149
150 /* Height is the menu item count plus 2 (top border & bottom border) */
151 Height = MenuInfo->MenuItemCount + 2;
152
153 /* Loop every item */
154 for (i = 0; i < MenuInfo->MenuItemCount; ++i)
155 {
156 /* Get the string length and make it become the new width if necessary */
157 if (MenuInfo->MenuItemList[i])
158 {
159 Length = (ULONG)strlen(MenuInfo->MenuItemList[i]);
160 Width = max(Width, Length);
161 }
162 }
163
164 /* Allow room for left & right borders, plus 4 spaces on each side */
165 Width += 10;
166
167 /* Check if we're drawing a centered menu */
168 if (UiCenterMenu)
169 {
170 /* Calculate the centered menu box area, also ensuring that the top-left
171 * corner is always visible if the borders are partly off-screen */
172 MenuInfo->Left = (UiScreenWidth - min(Width, UiScreenWidth)) / 2;
174 {
175 /* Exclude the header and the status bar */
176 // MenuInfo->Top = (UiScreenHeight - TUI_TITLE_BOX_CHAR_HEIGHT - 1 - Height) / 2
177 // + TUI_TITLE_BOX_CHAR_HEIGHT;
179 }
180 else
181 {
183 }
184 }
185 else
186 {
187 /* Put the menu in the default left-corner position */
188 MenuInfo->Left = -1;
189 MenuInfo->Top = 4;
190 }
191
192 /* The other margins are the same */
193 MenuInfo->Right = MenuInfo->Left + Width - 1;
194 MenuInfo->Bottom = MenuInfo->Top + Height - 1;
195}
196
197VOID
200{
201 ULONG i;
202
203 // FIXME: Theme-specific
204 /* Draw the backdrop */
206
207 /* Draw the menu box */
209
210 /* Draw each line of the menu */
211 for (i = 0; i < MenuInfo->MenuItemCount; ++i)
212 {
214 }
215
216 // FIXME: Theme-specific
217 /* Update the status bar */
218 UiVtbl.DrawStatusText("Use \x18 and \x19 to select, then press ENTER.");
219
221}
222
223static VOID
226{
228 CHAR MenuLineText[80];
229
230 /* If there is a timeout, draw the time remaining */
231 if (MenuInfo->MenuTimeRemaining >= 0)
232 {
233 /* Find whether the time text string is escaped
234 * with %d for specific countdown insertion. */
236 while ((ptr = strchr(ptr, '%')) && (ptr[1] != 'd'))
237 {
238 /* Ignore any following character (including a following
239 * '%' that would be escaped), thus skip two characters.
240 * If this is the last character, ignore it and stop. */
241 if (*++ptr)
242 ++ptr;
243 }
244 ASSERT(!ptr || (ptr[0] == '%' && ptr[1] == 'd'));
245
246 if (ptr)
247 {
248 /* Copy the time text string up to the '%d' insertion point and
249 * skip it, add the remaining time and the rest of the string. */
250 RtlStringCbPrintfA(MenuLineText, sizeof(MenuLineText),
251 "%.*s%d%s",
253 MenuInfo->MenuTimeRemaining,
254 ptr + 2);
255 }
256 else
257 {
258 /* Copy the time text string, append a separating blank,
259 * and add the remaining time. */
260 RtlStringCbPrintfA(MenuLineText, sizeof(MenuLineText),
261 "%s %d",
263 MenuInfo->MenuTimeRemaining);
264 }
265
266 Length = (ULONG)strlen(MenuLineText);
267 }
268 else
269 {
270 /* Erase the timeout with blanks */
271 Length = 0;
272 }
273
283 if (UiCenterMenu)
284 {
285 /* In boxed menu mode, pad on the left with blanks and box border,
286 * otherwise, pad over all the box length until its right edge. */
287 TuiFillArea(0,
288 MenuInfo->Bottom,
290 ? MenuInfo->Left - 1 /* Left side of the box bottom */
291 : MenuInfo->Right, /* Left side + all box length */
292 MenuInfo->Bottom,
295
296 if (UiMenuBox)
297 {
298 /* Fill with box bottom border */
300 MenuInfo->Bottom,
301 MenuInfo->Right,
302 D_VERT,
303 D_HORZ,
305
306 /* In centered boxed menu mode, the timeout string
307 * does not go past the right border, in principle... */
308 }
309
310 if (Length > 0)
311 {
312 /* Display the timeout at the bottom-right part of the menu */
313 UiDrawText(MenuInfo->Right - Length - 1,
314 MenuInfo->Bottom,
315 MenuLineText,
317 }
318 }
319 else
320 {
321 if (Length > 0)
322 {
323 /* Display the timeout under the menu directly */
324 UiDrawText(0,
325 MenuInfo->Bottom + 4,
326 MenuLineText,
328 }
329
330 /* Pad on the right with blanks, to erase
331 * characters when the string length decreases. */
333 MenuInfo->Bottom + 4,
334 Length ? (Length + 1) : (UiScreenWidth - 1),
335 MenuInfo->Bottom + 4,
338 );
339 }
340}
341
342VOID
345{
346 // FIXME: Theme-specific
347 /* Draw the menu box if requested */
348 if (UiMenuBox)
349 {
350 UiDrawBox(MenuInfo->Left,
351 MenuInfo->Top,
352 MenuInfo->Right,
353 MenuInfo->Bottom,
354 D_VERT,
355 D_HORZ,
356 FALSE, // Filled
357 TRUE, // Shadow
359 }
360
361 /* Update the date & time */
364}
365
366VOID
369 _In_ ULONG MenuItemNumber)
370{
371 ULONG SpaceLeft;
372 ULONG SpaceRight;
373 UCHAR Attribute;
374 CHAR MenuLineText[80];
375
376 /* If this is a separator */
377 if (MenuInfo->MenuItemList[MenuItemNumber] == NULL)
378 {
379 // FIXME: Theme-specific
380 /* Draw its left box corner */
381 if (UiMenuBox)
382 {
383 UiDrawText(MenuInfo->Left,
384 MenuInfo->Top + 1 + MenuItemNumber,
385 "\xC7",
387 }
388
389 /* Make it a separator line and use menu colors */
390 RtlZeroMemory(MenuLineText, sizeof(MenuLineText));
391 RtlFillMemory(MenuLineText,
392 min(sizeof(MenuLineText), (MenuInfo->Right - MenuInfo->Left - 1)),
393 0xC4);
394
395 /* Draw the item */
396 UiDrawText(MenuInfo->Left + 1,
397 MenuInfo->Top + 1 + MenuItemNumber,
398 MenuLineText,
400
401 // FIXME: Theme-specific
402 /* Draw its right box corner */
403 if (UiMenuBox)
404 {
405 UiDrawText(MenuInfo->Right,
406 MenuInfo->Top + 1 + MenuItemNumber,
407 "\xB6",
409 }
410
411 /* We are done */
412 return;
413 }
414
415 /* This is not a separator */
416 ASSERT(MenuInfo->MenuItemList[MenuItemNumber]);
417
418 /* Check if using centered menu */
419 if (UiCenterMenu)
420 {
421 /*
422 * We will want the string centered so calculate
423 * how many spaces will be to the left and right.
424 */
425 ULONG SpaceTotal =
426 (MenuInfo->Right - MenuInfo->Left - 2) -
427 (ULONG)strlen(MenuInfo->MenuItemList[MenuItemNumber]);
428 SpaceLeft = (SpaceTotal / 2) + 1;
429 SpaceRight = (SpaceTotal - SpaceLeft) + 1;
430 }
431 else
432 {
433 /* Simply left-align it */
434 SpaceLeft = 4;
435 SpaceRight = 0;
436 }
437
438 /* Format the item text string */
439 RtlStringCbPrintfA(MenuLineText, sizeof(MenuLineText),
440 "%*s%s%*s",
441 SpaceLeft, "", // Left padding
442 MenuInfo->MenuItemList[MenuItemNumber],
443 SpaceRight, ""); // Right padding
444
445 if (MenuItemNumber == MenuInfo->SelectedMenuItem)
446 {
447 /* If this is the selected item, use the selected colors */
449 }
450 else
451 {
452 /* Normal item colors */
453 Attribute = ATTR(UiTextColor, UiMenuBgColor);
454 }
455
456 /* Draw the item */
457 UiDrawText(MenuInfo->Left + 1,
458 MenuInfo->Top + 1 + MenuItemNumber,
459 MenuLineText,
460 Attribute);
461}
462
463static ULONG
466 _In_ UiMenuKeyPressFilterCallback KeyPressFilter)
467{
468 ULONG KeyEvent = 0;
469 ULONG Selected, Count;
470
471 /* Check for a keypress */
472 if (!MachConsKbHit())
473 return 0; // None, bail out
474
475 /* Check if the timeout is not already complete */
476 if (MenuInfo->MenuTimeRemaining != -1)
477 {
478 /* Cancel it and remove it */
479 MenuInfo->MenuTimeRemaining = -1;
481 }
482
483 /* Get the key (get the extended key if needed) */
484 KeyEvent = MachConsGetCh();
485 if (KeyEvent == KEY_EXTENDED)
486 KeyEvent = MachConsGetCh();
487
488 /*
489 * Call the supplied key filter callback function to see
490 * if it is going to handle this keypress.
491 */
492 if (KeyPressFilter &&
493 KeyPressFilter(KeyEvent, MenuInfo->SelectedMenuItem, MenuInfo->Context))
494 {
495 /* It processed the key character, so redraw and exit */
497 return 0;
498 }
499
500 /* Process the key */
501 if ((KeyEvent == KEY_UP ) || (KeyEvent == KEY_DOWN) ||
502 (KeyEvent == KEY_HOME) || (KeyEvent == KEY_END ))
503 {
504 /* Get the current selected item and count */
505 Selected = MenuInfo->SelectedMenuItem;
506 Count = MenuInfo->MenuItemCount - 1;
507
508 /* Check the key and change the selected menu item */
509 if ((KeyEvent == KEY_UP) && (Selected > 0))
510 {
511 /* Deselect previous item and go up */
512 MenuInfo->SelectedMenuItem--;
513 TuiDrawMenuItem(MenuInfo, Selected);
514 Selected--;
515
516 /* Skip past any separators */
517 if ((Selected > 0) &&
518 (MenuInfo->MenuItemList[Selected] == NULL))
519 {
520 MenuInfo->SelectedMenuItem--;
521 }
522 }
523 else if ( ((KeyEvent == KEY_UP) && (Selected == 0)) ||
524 (KeyEvent == KEY_END) )
525 {
526 /* Go to the end */
527 MenuInfo->SelectedMenuItem = Count;
528 TuiDrawMenuItem(MenuInfo, Selected);
529 }
530 else if ((KeyEvent == KEY_DOWN) && (Selected < Count))
531 {
532 /* Deselect previous item and go down */
533 MenuInfo->SelectedMenuItem++;
534 TuiDrawMenuItem(MenuInfo, Selected);
535 Selected++;
536
537 /* Skip past any separators */
538 if ((Selected < Count) &&
539 (MenuInfo->MenuItemList[Selected] == NULL))
540 {
541 MenuInfo->SelectedMenuItem++;
542 }
543 }
544 else if ( ((KeyEvent == KEY_DOWN) && (Selected == Count)) ||
545 (KeyEvent == KEY_HOME) )
546 {
547 /* Go to the beginning */
548 MenuInfo->SelectedMenuItem = 0;
549 TuiDrawMenuItem(MenuInfo, Selected);
550 }
551
552 /* Select new item and update video buffer */
553 TuiDrawMenuItem(MenuInfo, MenuInfo->SelectedMenuItem);
555 }
556
557 /* Return the pressed key */
558 return KeyEvent;
559}
unsigned char BOOLEAN
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
char * strchr(const char *String, int ch)
Definition: utclib.c:501
TIMEINFO * ArcGetTime(VOID)
Definition: arcemul.c:27
#define MachHwIdle()
Definition: machine.h:130
#define MachConsKbHit()
Definition: machine.h:88
#define MachConsGetCh()
Definition: machine.h:90
VOID VideoCopyOffScreenBufferToVRAM(VOID)
Definition: video.c:38
ULONG UiScreenWidth
Definition: ui.c:54
VOID UiDrawText(_In_ ULONG X, _In_ ULONG Y, _In_ PCSTR Text, _In_ UCHAR Attr)
Definition: ui.c:254
#define D_HORZ
Definition: ui.h:353
BOOLEAN UiCenterMenu
Definition: ui.c:44
#define D_VERT
Definition: ui.h:355
UCHAR UiTextColor
Definition: ui.c:36
UCHAR UiMenuBgColor
Definition: ui.c:35
VOID UiDrawBackdrop(ULONG DrawHeight)
Definition: ui.c:233
#define ATTR(cFore, cBack)
Definition: ui.h:323
CHAR UiTimeText[260]
Definition: ui.c:48
BOOLEAN(* UiMenuKeyPressFilterCallback)(IN ULONG KeyPress, IN ULONG SelectedMenuItem, IN PVOID Context OPTIONAL)
Definition: ui.h:229
UCHAR UiBackdropFgColor
Definition: ui.c:27
UCHAR UiBackdropFillStyle
Definition: ui.c:29
UCHAR UiBackdropBgColor
Definition: ui.c:28
ULONG UiGetScreenHeight(VOID)
Definition: ui.c:655
ULONG UiScreenHeight
Definition: ui.c:55
BOOLEAN UiMenuBox
Definition: ui.c:43
UIVTBL UiVtbl
Definition: ui.c:64
VOID UiDrawBox(ULONG Left, ULONG Top, ULONG Right, ULONG Bottom, UCHAR VertStyle, UCHAR HorzStyle, BOOLEAN Fill, BOOLEAN Shadow, UCHAR Attr)
Definition: ui.c:248
UCHAR UiSelectedTextColor
Definition: ui.c:37
UCHAR UiSelectedTextBgColor
Definition: ui.c:38
UCHAR UiMenuFgColor
Definition: ui.c:34
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define RtlFillMemory(Dest, Length, Fill)
Definition: winternl.h:599
#define KEY_DOWN
Definition: keycodes.h:46
#define KEY_EXTENDED
Definition: keycodes.h:38
#define KEY_ESC
Definition: keycodes.h:49
#define KEY_END
Definition: keycodes.h:64
#define KEY_ENTER
Definition: keycodes.h:39
#define KEY_HOME
Definition: keycodes.h:44
#define KEY_UP
Definition: keycodes.h:45
#define ASSERT(a)
Definition: mode.c:44
static PVOID ptr
Definition: dispmode.c:27
#define min(a, b)
Definition: monoChain.cc:55
#define _In_
Definition: no_sal2.h:158
int Count
Definition: noreturn.cpp:7
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
NTSTRSAFEVAPI RtlStringCbPrintfA(_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, _In_ size_t cbDest, _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat,...)
Definition: ntstrsafe.h:1148
long LONG
Definition: pedump.c:60
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68
menu info structure
Definition: window.h:276
USHORT Second
Definition: fw.h:16
VOID(* DrawMenu)(PUI_MENU_INFO MenuInfo)
Definition: ui.h:303
VOID(* DrawStatusText)(PCSTR StatusText)
Definition: ui.h:264
PCSTR MenuHeader
Definition: ui.h:212
LONG MenuTimeRemaining
Definition: ui.h:217
ULONG SelectedMenuItem
Definition: ui.h:218
PCSTR MenuFooter
Definition: ui.h:213
ULONG MenuItemCount
Definition: ui.h:216
PCSTR * MenuItemList
Definition: ui.h:215
PVOID Context
Definition: ui.h:219
#define max(a, b)
Definition: svc.c:63
#define TUI_TITLE_BOX_CHAR_HEIGHT
Definition: tui.h:33
VOID TuiFillArea(ULONG Left, ULONG Top, ULONG Right, ULONG Bottom, CHAR FillChar, UCHAR Attr)
Definition: tui.c:329
VOID TuiDrawBoxBottomLine(_In_ ULONG Left, _In_ ULONG Bottom, _In_ ULONG Right, _In_ UCHAR VertStyle, _In_ UCHAR HorzStyle, _In_ UCHAR Attr)
Definition: tui.c:458
VOID TuiUpdateDateTime(VOID)
Definition: tui.c:547
VOID TuiDrawMenu(_In_ PUI_MENU_INFO MenuInfo)
Definition: tuimenu.c:198
static ULONG TuiProcessMenuKeyboardEvent(_In_ PUI_MENU_INFO MenuInfo, _In_ UiMenuKeyPressFilterCallback KeyPressFilter)
Definition: tuimenu.c:464
BOOLEAN TuiDisplayMenu(IN PCSTR MenuHeader, IN PCSTR MenuFooter OPTIONAL, IN PCSTR MenuItemList[], IN ULONG MenuItemCount, IN ULONG DefaultMenuItem, IN LONG MenuTimeOut, OUT PULONG SelectedMenuItem, IN BOOLEAN CanEscape, IN UiMenuKeyPressFilterCallback KeyPressFilter OPTIONAL, IN PVOID Context OPTIONAL)
Definition: tuimenu.c:30
VOID TuiDrawMenuItem(_In_ PUI_MENU_INFO MenuInfo, _In_ ULONG MenuItemNumber)
Definition: tuimenu.c:367
VOID TuiDrawMenuBox(_In_ PUI_MENU_INFO MenuInfo)
Definition: tuimenu.c:343
static VOID TuiCalcMenuBoxSize(_In_ PUI_MENU_INFO MenuInfo)
Definition: tuimenu.c:142
static VOID TuiDrawMenuTimeout(_In_ PUI_MENU_INFO MenuInfo)
Definition: tuimenu.c:224
uint32_t * PULONG
Definition: typedefs.h:59
const char * PCSTR
Definition: typedefs.h:52
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
#define IN
Definition: typedefs.h:39
uint32_t ULONG
Definition: typedefs.h:59
#define OUT
Definition: typedefs.h:40
char * PCHAR
Definition: typedefs.h:51
_In_ HFONT _Out_ PUINT _Out_ PUINT Width
Definition: font.h:89
_In_ HFONT _Out_ PUINT Height
Definition: font.h:88
unsigned char UCHAR
Definition: xmlstorage.h:181
char CHAR
Definition: xmlstorage.h:175