2 * LICENSE: GPL - See COPYING in the top level directory
3 * PROJECT: ReactOS Console Server DLL
4 * FILE: win32ss/user/winsrv/consrv/popup.c
5 * PURPOSE: Console popup windows
6 * PROGRAMMERS: Hermes Belusca-Maito (hermes.belusca@sfr.fr)
8 * NOTE: Strongly inspired by the DrawBox function
9 * from base/setup/usetup/interface/usetup.c, written by:
10 * Eric Kohl (revision 3753)
11 * Hervé Poussineau (revision 24718)
12 * and *UiDisplayMenu from FreeLdr.
15 /* INCLUDES *******************************************************************/
24 /* PRIVATE FUNCTIONS **********************************************************/
27 ConDrvFillConsoleOutput(IN PCONSOLE Console
,
28 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
29 IN CODE_TYPE CodeType
,
31 IN ULONG NumCodesToWrite
,
33 OUT PULONG NumCodesWritten OPTIONAL
);
35 ConDrvReadConsoleOutput(IN PCONSOLE Console
,
36 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
38 OUT PCHAR_INFO CharInfo
/*Buffer*/,
39 IN OUT PSMALL_RECT ReadRegion
);
41 ConDrvWriteConsoleOutput(IN PCONSOLE Console
,
42 IN PTEXTMODE_SCREEN_BUFFER Buffer
,
44 IN PCHAR_INFO CharInfo
/*Buffer*/,
45 IN OUT PSMALL_RECT WriteRegion
);
49 DrawBox(PTEXTMODE_SCREEN_BUFFER Buffer
,
59 /* Set screen attributes */
61 for (coPos
.Y
= yTop
; coPos
.Y
< yTop
+ Height
; coPos
.Y
++)
63 Code
.Attribute
= Buffer
->PopupDefaultAttrib
;
64 ConDrvFillConsoleOutput(Buffer
->Header
.Console
,
73 /* draw upper left corner */
76 Code
.AsciiChar
= 0xDA; // '+'
77 ConDrvFillConsoleOutput(Buffer
->Header
.Console
,
88 Code
.AsciiChar
= 0xC4; // '-'
89 ConDrvFillConsoleOutput(Buffer
->Header
.Console
,
97 /* draw upper right corner */
98 coPos
.X
= xLeft
+ Width
- 1;
100 Code
.AsciiChar
= 0xBF; // '+'
101 ConDrvFillConsoleOutput(Buffer
->Header
.Console
,
109 /* Draw right edge, inner space and left edge */
110 for (coPos
.Y
= yTop
+ 1; coPos
.Y
< yTop
+ Height
- 1; coPos
.Y
++)
113 Code
.AsciiChar
= 0xB3; // '|'
114 ConDrvFillConsoleOutput(Buffer
->Header
.Console
,
123 Code
.AsciiChar
= ' ';
124 ConDrvFillConsoleOutput(Buffer
->Header
.Console
,
132 coPos
.X
= xLeft
+ Width
- 1;
133 Code
.AsciiChar
= 0xB3; // '|'
134 ConDrvFillConsoleOutput(Buffer
->Header
.Console
,
143 /* draw lower left corner */
145 coPos
.Y
= yTop
+ Height
- 1;
146 Code
.AsciiChar
= 0xC0; // '+'
147 ConDrvFillConsoleOutput(Buffer
->Header
.Console
,
155 /* draw lower edge */
157 coPos
.Y
= yTop
+ Height
- 1;
158 Code
.AsciiChar
= 0xC4; // '-'
159 ConDrvFillConsoleOutput(Buffer
->Header
.Console
,
167 /* draw lower right corner */
168 coPos
.X
= xLeft
+ Width
- 1;
169 coPos
.Y
= yTop
+ Height
- 1;
170 Code
.AsciiChar
= 0xD9; // '+'
171 ConDrvFillConsoleOutput(Buffer
->Header
.Console
,
181 /* PUBLIC FUNCTIONS ***********************************************************/
184 CreatePopupWindow(PCONSRV_CONSOLE Console
,
185 PTEXTMODE_SCREEN_BUFFER Buffer
,
194 ASSERT((PCONSOLE
)Console
== Buffer
->Header
.Console
);
196 /* Create the popup window */
197 Popup
= ConsoleAllocHeap(HEAP_ZERO_MEMORY
, sizeof(*Popup
));
198 if (Popup
== NULL
) return NULL
;
200 Popup
->ScreenBuffer
= Buffer
;
201 Popup
->Origin
.X
= xLeft
;
202 Popup
->Origin
.Y
= yTop
;
203 Popup
->Size
.X
= Width
;
204 Popup
->Size
.Y
= Height
;
206 /* Save old contents */
207 Popup
->OldContents
= ConsoleAllocHeap(HEAP_ZERO_MEMORY
,
208 Popup
->Size
.X
* Popup
->Size
.Y
*
209 sizeof(*Popup
->OldContents
));
210 if (Popup
->OldContents
== NULL
)
212 ConsoleFreeHeap(Popup
);
215 Region
.Left
= Popup
->Origin
.X
;
216 Region
.Top
= Popup
->Origin
.Y
;
217 Region
.Right
= Popup
->Origin
.X
+ Popup
->Size
.X
- 1;
218 Region
.Bottom
= Popup
->Origin
.Y
+ Popup
->Size
.Y
- 1;
219 ConDrvReadConsoleOutput(Buffer
->Header
.Console
,
230 /* Add it into the list of popups */
231 InsertTailList(&Console
->PopupWindows
, &Popup
->ListEntry
);
237 DestroyPopupWindow(PPOPUP_WINDOW Popup
)
241 if (Popup
== NULL
) return;
243 /* Remove it from the list of popups */
244 RemoveEntryList(&Popup
->ListEntry
);
246 /* Restore the old screen-buffer contents */
247 Region
.Left
= Popup
->Origin
.X
;
248 Region
.Top
= Popup
->Origin
.Y
;
249 Region
.Right
= Popup
->Origin
.X
+ Popup
->Size
.X
- 1;
250 Region
.Bottom
= Popup
->Origin
.Y
+ Popup
->Size
.Y
- 1;
251 ConDrvWriteConsoleOutput(Popup
->ScreenBuffer
->Header
.Console
,
258 ConsoleFreeHeap(Popup
->OldContents
);
259 ConsoleFreeHeap(Popup
);