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
,
58 /* Set screen attributes */
60 for (coPos
.Y
= yTop
; coPos
.Y
< yTop
+ Height
; coPos
.Y
++)
62 ConDrvFillConsoleOutput(Buffer
->Header
.Console
,
65 (CODE_ELEMENT
)(WORD
)Buffer
->PopupDefaultAttrib
,
71 /* draw upper left corner */
74 ConDrvFillConsoleOutput(Buffer
->Header
.Console
,
77 (CODE_ELEMENT
)(CHAR
)0xDA, // '+',
85 ConDrvFillConsoleOutput(Buffer
->Header
.Console
,
88 (CODE_ELEMENT
)(CHAR
)0xC4, // '-',
93 /* draw upper right corner */
94 coPos
.X
= xLeft
+ Width
- 1;
96 ConDrvFillConsoleOutput(Buffer
->Header
.Console
,
99 (CODE_ELEMENT
)(CHAR
)0xBF, // '+',
104 /* Draw right edge, inner space and left edge */
105 for (coPos
.Y
= yTop
+ 1; coPos
.Y
< yTop
+ Height
- 1; coPos
.Y
++)
108 ConDrvFillConsoleOutput(Buffer
->Header
.Console
,
111 (CODE_ELEMENT
)(CHAR
)0xB3, // '|',
117 ConDrvFillConsoleOutput(Buffer
->Header
.Console
,
120 (CODE_ELEMENT
)(CHAR
)' ',
125 coPos
.X
= xLeft
+ Width
- 1;
126 ConDrvFillConsoleOutput(Buffer
->Header
.Console
,
129 (CODE_ELEMENT
)(CHAR
)0xB3, // '|',
135 /* draw lower left corner */
137 coPos
.Y
= yTop
+ Height
- 1;
138 ConDrvFillConsoleOutput(Buffer
->Header
.Console
,
141 (CODE_ELEMENT
)(CHAR
)0xC0, // '+',
146 /* draw lower edge */
148 coPos
.Y
= yTop
+ Height
- 1;
149 ConDrvFillConsoleOutput(Buffer
->Header
.Console
,
152 (CODE_ELEMENT
)(CHAR
)0xC4, // '-',
157 /* draw lower right corner */
158 coPos
.X
= xLeft
+ Width
- 1;
159 coPos
.Y
= yTop
+ Height
- 1;
160 ConDrvFillConsoleOutput(Buffer
->Header
.Console
,
163 (CODE_ELEMENT
)(CHAR
)0xD9, // '+',
170 /* PUBLIC FUNCTIONS ***********************************************************/
173 CreatePopupWindow(PCONSRV_CONSOLE Console
,
174 PTEXTMODE_SCREEN_BUFFER Buffer
,
183 ASSERT((PCONSOLE
)Console
== Buffer
->Header
.Console
);
185 /* Create the popup window */
186 Popup
= ConsoleAllocHeap(HEAP_ZERO_MEMORY
, sizeof(*Popup
));
187 if (Popup
== NULL
) return NULL
;
189 Popup
->ScreenBuffer
= Buffer
;
190 Popup
->Origin
.X
= xLeft
;
191 Popup
->Origin
.Y
= yTop
;
192 Popup
->Size
.X
= Width
;
193 Popup
->Size
.Y
= Height
;
195 /* Save old contents */
196 Popup
->OldContents
= ConsoleAllocHeap(HEAP_ZERO_MEMORY
,
197 Popup
->Size
.X
* Popup
->Size
.Y
*
198 sizeof(*Popup
->OldContents
));
199 if (Popup
->OldContents
== NULL
)
201 ConsoleFreeHeap(Popup
);
204 Region
.Left
= Popup
->Origin
.X
;
205 Region
.Top
= Popup
->Origin
.Y
;
206 Region
.Right
= Popup
->Origin
.X
+ Popup
->Size
.X
- 1;
207 Region
.Bottom
= Popup
->Origin
.Y
+ Popup
->Size
.Y
- 1;
208 ConDrvReadConsoleOutput(Buffer
->Header
.Console
,
219 /* Add it into the list of popups */
220 InsertTailList(&Console
->PopupWindows
, &Popup
->ListEntry
);
226 DestroyPopupWindow(PPOPUP_WINDOW Popup
)
230 if (Popup
== NULL
) return;
232 /* Remove it from the list of popups */
233 RemoveEntryList(&Popup
->ListEntry
);
235 /* Restore the old screen-buffer contents */
236 Region
.Left
= Popup
->Origin
.X
;
237 Region
.Top
= Popup
->Origin
.Y
;
238 Region
.Right
= Popup
->Origin
.X
+ Popup
->Size
.X
- 1;
239 Region
.Bottom
= Popup
->Origin
.Y
+ Popup
->Size
.Y
- 1;
240 ConDrvWriteConsoleOutput(Popup
->ScreenBuffer
->Header
.Console
,
247 ConsoleFreeHeap(Popup
->OldContents
);
248 ConsoleFreeHeap(Popup
);