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 ***********************************************************/
185 IN PCONSRV_CONSOLE Console
,
186 IN PCONSOLE_SCREEN_BUFFER ScreenBuffer
,
192 PTEXTMODE_SCREEN_BUFFER Buffer
;
196 ASSERT((PCONSOLE
)Console
== ScreenBuffer
->Header
.Console
);
198 if (GetType(ScreenBuffer
) != TEXTMODE_BUFFER
)
201 Buffer
= (PTEXTMODE_SCREEN_BUFFER
)ScreenBuffer
;
203 /* Create the popup window */
204 Popup
= ConsoleAllocHeap(HEAP_ZERO_MEMORY
, sizeof(*Popup
));
205 if (Popup
== NULL
) return NULL
;
207 Popup
->ScreenBuffer
= Buffer
;
208 Popup
->Origin
.X
= xLeft
;
209 Popup
->Origin
.Y
= yTop
;
210 Popup
->Size
.X
= Width
;
211 Popup
->Size
.Y
= Height
;
213 /* Save old contents */
214 Popup
->OldContents
= ConsoleAllocHeap(HEAP_ZERO_MEMORY
,
215 Popup
->Size
.X
* Popup
->Size
.Y
*
216 sizeof(*Popup
->OldContents
));
217 if (Popup
->OldContents
== NULL
)
219 ConsoleFreeHeap(Popup
);
222 Region
.Left
= Popup
->Origin
.X
;
223 Region
.Top
= Popup
->Origin
.Y
;
224 Region
.Right
= Popup
->Origin
.X
+ Popup
->Size
.X
- 1;
225 Region
.Bottom
= Popup
->Origin
.Y
+ Popup
->Size
.Y
- 1;
226 ConDrvReadConsoleOutput(Buffer
->Header
.Console
,
237 /* Add it into the list of popups */
238 InsertTailList(&Console
->PopupWindows
, &Popup
->ListEntry
);
245 IN PPOPUP_WINDOW Popup
)
249 if (Popup
== NULL
) return;
251 /* Remove it from the list of popups */
252 RemoveEntryList(&Popup
->ListEntry
);
254 /* Restore the old screen-buffer contents */
255 Region
.Left
= Popup
->Origin
.X
;
256 Region
.Top
= Popup
->Origin
.Y
;
257 Region
.Right
= Popup
->Origin
.X
+ Popup
->Size
.X
- 1;
258 Region
.Bottom
= Popup
->Origin
.Y
+ Popup
->Size
.Y
- 1;
259 ConDrvWriteConsoleOutput(Popup
->ScreenBuffer
->Header
.Console
,
266 ConsoleFreeHeap(Popup
->OldContents
);
267 ConsoleFreeHeap(Popup
);