ReactOS  0.4.14-dev-376-gaedba84
popup.c
Go to the documentation of this file.
1 /*
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)
7  *
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.
13  */
14 
15 /* INCLUDES *******************************************************************/
16 
17 #include "consrv.h"
18 #include "popup.h"
19 
20 #define NDEBUG
21 #include <debug.h>
22 
23 
24 /* PRIVATE FUNCTIONS **********************************************************/
25 
29  IN CODE_TYPE CodeType,
31  IN ULONG NumCodesToWrite,
32  IN PCOORD WriteCoord,
33  OUT PULONG NumCodesWritten OPTIONAL);
37  IN BOOLEAN Unicode,
38  OUT PCHAR_INFO CharInfo/*Buffer*/,
39  IN OUT PSMALL_RECT ReadRegion);
43  IN BOOLEAN Unicode,
44  IN PCHAR_INFO CharInfo/*Buffer*/,
45  IN OUT PSMALL_RECT WriteRegion);
46 
47 
48 static VOID
50  IN SHORT xLeft,
51  IN SHORT yTop,
52  IN SHORT Width,
53  IN SHORT Height)
54 {
55  COORD coPos;
56  DWORD Written;
58 
59  /* Set screen attributes */
60  coPos.X = xLeft;
61  for (coPos.Y = yTop; coPos.Y < yTop + Height; coPos.Y++)
62  {
63  Code.Attribute = Buffer->PopupDefaultAttrib;
64  ConDrvFillConsoleOutput(Buffer->Header.Console,
65  Buffer,
67  Code,
68  Width,
69  &coPos,
70  &Written);
71  }
72 
73  /* draw upper left corner */
74  coPos.X = xLeft;
75  coPos.Y = yTop;
76  Code.AsciiChar = 0xDA; // '+'
77  ConDrvFillConsoleOutput(Buffer->Header.Console,
78  Buffer,
79  CODE_ASCII,
80  Code,
81  1,
82  &coPos,
83  &Written);
84 
85  /* draw upper edge */
86  coPos.X = xLeft + 1;
87  coPos.Y = yTop;
88  Code.AsciiChar = 0xC4; // '-'
89  ConDrvFillConsoleOutput(Buffer->Header.Console,
90  Buffer,
91  CODE_ASCII,
92  Code,
93  Width - 2,
94  &coPos,
95  &Written);
96 
97  /* draw upper right corner */
98  coPos.X = xLeft + Width - 1;
99  coPos.Y = yTop;
100  Code.AsciiChar = 0xBF; // '+'
101  ConDrvFillConsoleOutput(Buffer->Header.Console,
102  Buffer,
103  CODE_ASCII,
104  Code,
105  1,
106  &coPos,
107  &Written);
108 
109  /* Draw right edge, inner space and left edge */
110  for (coPos.Y = yTop + 1; coPos.Y < yTop + Height - 1; coPos.Y++)
111  {
112  coPos.X = xLeft;
113  Code.AsciiChar = 0xB3; // '|'
114  ConDrvFillConsoleOutput(Buffer->Header.Console,
115  Buffer,
116  CODE_ASCII,
117  Code,
118  1,
119  &coPos,
120  &Written);
121 
122  coPos.X = xLeft + 1;
123  Code.AsciiChar = ' ';
124  ConDrvFillConsoleOutput(Buffer->Header.Console,
125  Buffer,
126  CODE_ASCII,
127  Code,
128  Width - 2,
129  &coPos,
130  &Written);
131 
132  coPos.X = xLeft + Width - 1;
133  Code.AsciiChar = 0xB3; // '|'
134  ConDrvFillConsoleOutput(Buffer->Header.Console,
135  Buffer,
136  CODE_ASCII,
137  Code,
138  1,
139  &coPos,
140  &Written);
141  }
142 
143  /* draw lower left corner */
144  coPos.X = xLeft;
145  coPos.Y = yTop + Height - 1;
146  Code.AsciiChar = 0xC0; // '+'
147  ConDrvFillConsoleOutput(Buffer->Header.Console,
148  Buffer,
149  CODE_ASCII,
150  Code,
151  1,
152  &coPos,
153  &Written);
154 
155  /* draw lower edge */
156  coPos.X = xLeft + 1;
157  coPos.Y = yTop + Height - 1;
158  Code.AsciiChar = 0xC4; // '-'
159  ConDrvFillConsoleOutput(Buffer->Header.Console,
160  Buffer,
161  CODE_ASCII,
162  Code,
163  Width - 2,
164  &coPos,
165  &Written);
166 
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,
172  Buffer,
173  CODE_ASCII,
174  Code,
175  1,
176  &coPos,
177  &Written);
178 }
179 
180 
181 /* PUBLIC FUNCTIONS ***********************************************************/
182 
187  IN SHORT xLeft,
188  IN SHORT yTop,
189  IN SHORT Width,
190  IN SHORT Height)
191 {
195 
196  ASSERT((PCONSOLE)Console == ScreenBuffer->Header.Console);
197 
199  return NULL;
200 
202 
203  /* Create the popup window */
205  if (Popup == NULL) return NULL;
206 
207  Popup->ScreenBuffer = Buffer;
208  Popup->Origin.X = xLeft;
209  Popup->Origin.Y = yTop;
210  Popup->Size.X = Width;
211  Popup->Size.Y = Height;
212 
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)
218  {
220  return NULL;
221  }
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,
227  Buffer,
228  TRUE,
229  Popup->OldContents,
230  &Region);
231 
232  /* Draw it */
233  DrawBox(Buffer,
234  xLeft, yTop,
235  Width, Height);
236 
237  /* Add it into the list of popups */
238  InsertTailList(&Console->PopupWindows, &Popup->ListEntry);
239 
240  return Popup;
241 }
242 
243 VOID
246 {
248 
249  if (Popup == NULL) return;
250 
251  /* Remove it from the list of popups */
252  RemoveEntryList(&Popup->ListEntry);
253 
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,
260  Popup->ScreenBuffer,
261  TRUE,
262  Popup->OldContents,
263  &Region);
264 
265  /* Free memory */
266  ConsoleFreeHeap(Popup->OldContents);
268 }
269 
270 /* EOF */
#define IN
Definition: typedefs.h:38
#define TRUE
Definition: types.h:120
LONG NTSTATUS
Definition: precomp.h:26
#define ConsoleAllocHeap(Flags, Size)
Definition: heap.h:14
#define TEXTMODE_BUFFER
Definition: pccons.c:21
#define InsertTailList(ListHead, Entry)
#define PCONSRV_CONSOLE
Definition: conio.h:27
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
Definition: rtlfuncs.h:105
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
Definition: IoEaTest.cpp:117
short SHORT
Definition: pedump.c:59
unsigned char BOOLEAN
smooth NULL
Definition: ftsmooth.c:416
Definition: bufpool.h:45
ULONG X
Definition: bl.h:1340
#define Code
Definition: deflate.h:80
unsigned long DWORD
Definition: ntddk_ex.h:95
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
INT GetType(BOOL bLocal, LPOSVERSIONINFOEX osvi, LPSERVER_INFO_102 pBuf102)
Definition: gettype.c:129
Definition: bl.h:1338
Definition: console.h:35
unsigned int * PULONG
Definition: retypes.h:1
#define HEAP_ZERO_MEMORY
Definition: compat.h:123
CConsole Console
#define ConsoleFreeHeap(HeapBase)
Definition: heap.h:15
HANDLE ScreenBuffer
Definition: notevil.c:37
#define OUT
Definition: typedefs.h:39
unsigned int ULONG
Definition: retypes.h:1
IN BOOLEAN OUT PSTR Buffer
Definition: progress.h:34
ULONG Y
Definition: bl.h:1341
struct _TEXTMODE_SCREEN_BUFFER * PTEXTMODE_SCREEN_BUFFER
enum _CODE_TYPE CODE_TYPE
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68