ReactOS  0.4.15-dev-492-ga1108f6
popup.c File Reference
#include "consrv.h"
#include "popup.h"
#include <debug.h>
Include dependency graph for popup.c:

Go to the source code of this file.

Macros

#define NDEBUG
 

Functions

NTSTATUS NTAPI ConDrvFillConsoleOutput (IN PCONSOLE Console, IN PTEXTMODE_SCREEN_BUFFER Buffer, IN CODE_TYPE CodeType, IN CODE_ELEMENT Code, IN ULONG NumCodesToWrite, IN PCOORD WriteCoord, OUT PULONG NumCodesWritten OPTIONAL)
 
NTSTATUS NTAPI ConDrvReadConsoleOutput (IN PCONSOLE Console, IN PTEXTMODE_SCREEN_BUFFER Buffer, IN BOOLEAN Unicode, OUT PCHAR_INFO CharInfo, IN OUT PSMALL_RECT ReadRegion)
 
NTSTATUS NTAPI ConDrvWriteConsoleOutput (IN PCONSOLE Console, IN PTEXTMODE_SCREEN_BUFFER Buffer, IN BOOLEAN Unicode, IN PCHAR_INFO CharInfo, IN OUT PSMALL_RECT WriteRegion)
 
static VOID DrawBox (PTEXTMODE_SCREEN_BUFFER Buffer, IN SHORT xLeft, IN SHORT yTop, IN SHORT Width, IN SHORT Height)
 
PPOPUP_WINDOW CreatePopupWindow (IN PCONSRV_CONSOLE Console, IN PCONSOLE_SCREEN_BUFFER ScreenBuffer, IN SHORT xLeft, IN SHORT yTop, IN SHORT Width, IN SHORT Height)
 
VOID DestroyPopupWindow (IN PPOPUP_WINDOW Popup)
 

Macro Definition Documentation

◆ NDEBUG

#define NDEBUG

Definition at line 20 of file popup.c.

Function Documentation

◆ ConDrvFillConsoleOutput()

NTSTATUS NTAPI ConDrvFillConsoleOutput ( IN PCONSOLE  Console,
IN PTEXTMODE_SCREEN_BUFFER  Buffer,
IN CODE_TYPE  CodeType,
IN CODE_ELEMENT  Code,
IN ULONG  NumCodesToWrite,
IN PCOORD  WriteCoord,
OUT PULONG NumCodesWritten  OPTIONAL 
)

Definition at line 1251 of file text.c.

1258 {
1259  SHORT X, Y;
1260  SHORT XStart;
1261  ULONG nNumChars = 0;
1262  PCHAR_INFO Ptr;
1263  BOOLEAN bLead, bFullwidth;
1264 
1265  if (Console == NULL || Buffer == NULL || WriteCoord == NULL)
1266  {
1267  return STATUS_INVALID_PARAMETER;
1268  }
1269 
1270  /* Validity check */
1271  ASSERT(Console == Buffer->Header.Console);
1272 
1273  if (NumCodesWritten)
1274  *NumCodesWritten = 0;
1275 
1276  if (NumCodesToWrite == 0)
1277  return STATUS_SUCCESS; // Nothing to do!
1278 
1279  /* Do nothing if the writing starting point is outside of the screen buffer */
1280  if ( WriteCoord->X < 0 || WriteCoord->X >= Buffer->ScreenBufferSize.X ||
1281  WriteCoord->Y < 0 || WriteCoord->Y >= Buffer->ScreenBufferSize.Y )
1282  {
1283  return STATUS_SUCCESS;
1284  }
1285 
1286  NumCodesToWrite = min(NumCodesToWrite, (ULONG)Buffer->ScreenBufferSize.X * Buffer->ScreenBufferSize.Y);
1287 
1288  if (CodeType == CODE_ASCII)
1289  {
1290  /* Conversion from the ASCII char to the UNICODE char */
1291  CODE_ELEMENT tmp;
1293  Code = tmp;
1294  }
1295 
1296  XStart = WriteCoord->X;
1297 
1298  /* For Chinese, Japanese and Korean */
1299  X = XStart;
1300  Y = WriteCoord->Y;
1301  bLead = TRUE;
1302  bFullwidth = FALSE;
1303  if (Console->IsCJK)
1304  {
1305  bFullwidth = IS_FULL_WIDTH(Code.UnicodeChar);
1306  if (X > 0)
1307  {
1308  Ptr = ConioCoordToPointer(Buffer, X - 1, Y);
1309  if (Ptr->Attributes & COMMON_LVB_LEADING_BYTE)
1310  {
1311  Ptr->Char.UnicodeChar = L' ';
1312  Ptr->Attributes &= ~COMMON_LVB_SBCSDBCS;
1313  }
1314  }
1315  }
1316 
1317  for (Y = WriteCoord->Y; Y < Buffer->ScreenBufferSize.Y; ++Y)
1318  {
1319  Ptr = ConioCoordToPointer(Buffer, XStart, Y);
1320  for (X = XStart; X < Buffer->ScreenBufferSize.X; ++X)
1321  {
1322  if (nNumChars >= NumCodesToWrite)
1323  goto Quit;
1324 
1325  switch (CodeType)
1326  {
1327  case CODE_ASCII:
1328  case CODE_UNICODE:
1329  Ptr->Char.UnicodeChar = Code.UnicodeChar;
1330  Ptr->Attributes &= ~COMMON_LVB_SBCSDBCS;
1331  if (bFullwidth)
1332  {
1333  if (bLead)
1334  Ptr->Attributes |= COMMON_LVB_LEADING_BYTE;
1335  else
1336  Ptr->Attributes |= COMMON_LVB_TRAILING_BYTE;
1337  }
1338  bLead = !bLead;
1339  break;
1340 
1341  case CODE_ATTRIBUTE:
1342  Ptr->Attributes &= COMMON_LVB_SBCSDBCS;
1343  Ptr->Attributes |= (Code.Attribute & ~COMMON_LVB_SBCSDBCS);
1344  break;
1345  }
1346 
1347  ++Ptr;
1348 
1349  ++nNumChars;
1350  }
1351  /* Restart at the beginning of the next line */
1352  XStart = 0;
1353  }
1354 Quit:
1355 
1356  if ((nNumChars & 1) & bFullwidth)
1357  {
1358  if (X + Y * Buffer->ScreenBufferSize.X > 0)
1359  {
1360  Ptr = ConioCoordToPointer(Buffer, X - 1, Y);
1361  Ptr->Char.UnicodeChar = L' ';
1362  Ptr->Attributes &= ~COMMON_LVB_SBCSDBCS;
1363  }
1364  }
1365 
1366  if (NumCodesWritten)
1367  *NumCodesWritten = nNumChars;
1368 
1369  if ((PCONSOLE_SCREEN_BUFFER)Buffer == Console->ActiveBuffer)
1370  {
1372  ConioComputeUpdateRect(Buffer, &UpdateRect, WriteCoord, nNumChars);
1374  }
1375 
1376  return STATUS_SUCCESS;
1377 }
#define TRUE
Definition: types.h:120
#define Y(I)
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
PCHAR_INFO ConioCoordToPointer(PTEXTMODE_SCREEN_BUFFER Buff, ULONG X, ULONG Y)
Definition: text.c:143
WCHAR UnicodeChar
Definition: conmsg.h:525
_Must_inspect_result_ _In_ PFSRTL_PER_STREAM_CONTEXT Ptr
Definition: fsrtlfuncs.h:898
#define COMMON_LVB_SBCSDBCS
Definition: wincon.h:56
#define TermDrawRegion(Console, Region)
Definition: term.h:22
static VOID ConioComputeUpdateRect(IN PTEXTMODE_SCREEN_BUFFER Buff, IN OUT PSMALL_RECT UpdateRect, IN PCOORD Start, IN UINT Length)
Definition: text.c:165
#define ConsoleOutputAnsiToUnicodeChar(Console, dWChar, sChar)
Definition: text.c:31
short SHORT
Definition: pedump.c:59
unsigned char BOOLEAN
smooth NULL
Definition: ftsmooth.c:416
Definition: bufpool.h:45
#define Code
Definition: deflate.h:80
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
static const WCHAR L[]
Definition: oid.c:1250
#define min(a, b)
Definition: monoChain.cc:55
CConsole Console
#define COMMON_LVB_LEADING_BYTE
Definition: wincon.h:48
unsigned int ULONG
Definition: retypes.h:1
static int UpdateRect(TreeListData *pData, unsigned uItem, unsigned uSub)
Definition: treelist.c:1529
#define COMMON_LVB_TRAILING_BYTE
Definition: wincon.h:49
return STATUS_SUCCESS
Definition: btrfs.c:3014
#define IS_FULL_WIDTH(wch)
Definition: conio.h:333
#define X(b, s)

Referenced by DrawBox().

◆ ConDrvReadConsoleOutput()

NTSTATUS NTAPI ConDrvReadConsoleOutput ( IN PCONSOLE  Console,
IN PTEXTMODE_SCREEN_BUFFER  Buffer,
IN BOOLEAN  Unicode,
OUT PCHAR_INFO  CharInfo,
IN OUT PSMALL_RECT  ReadRegion 
)

Definition at line 569 of file text.c.

574 {
575  SHORT X, Y;
577  PCHAR_INFO CurCharInfo;
578  SMALL_RECT CapturedReadRegion;
579  PCHAR_INFO Ptr;
580 
581  if (Console == NULL || Buffer == NULL || CharInfo == NULL || ReadRegion == NULL)
582  {
584  }
585 
586  /* Validity check */
587  ASSERT(Console == Buffer->Header.Console);
588 
589  CapturedReadRegion = *ReadRegion;
590 
591  /* Make sure ReadRegion is inside the screen buffer */
593  Buffer->ScreenBufferSize.Y - 1,
594  Buffer->ScreenBufferSize.X - 1);
595  if (!ConioGetIntersection(&CapturedReadRegion, &CapturedReadRegion, &ScreenBuffer))
596  {
597  /*
598  * It is okay to have a ReadRegion completely outside
599  * the screen buffer. No data is read then.
600  */
601  return STATUS_SUCCESS;
602  }
603 
604  CurCharInfo = CharInfo;
605 
606  for (Y = CapturedReadRegion.Top; Y <= CapturedReadRegion.Bottom; ++Y)
607  {
608  Ptr = ConioCoordToPointer(Buffer, CapturedReadRegion.Left, Y);
609  for (X = CapturedReadRegion.Left; X <= CapturedReadRegion.Right; ++X)
610  {
611  if (Unicode)
612  {
613  CurCharInfo->Char.UnicodeChar = Ptr->Char.UnicodeChar;
614  }
615  else
616  {
617  // ConsoleOutputUnicodeToAnsiChar(Console, &CurCharInfo->Char.AsciiChar, &Ptr->Char.UnicodeChar);
618  WideCharToMultiByte(Console->OutputCodePage, 0, &Ptr->Char.UnicodeChar, 1,
619  &CurCharInfo->Char.AsciiChar, 1, NULL, NULL);
620  }
621 #if (_WIN32_WINNT < _WIN32_WINNT_WIN8)
622  /* NOTE: Windows < 8 compatibility: DBCS flags are filtered out */
623  CurCharInfo->Attributes = (Ptr->Attributes & ~COMMON_LVB_SBCSDBCS);
624 #else
625  CurCharInfo->Attributes = Ptr->Attributes;
626 #endif
627  ++Ptr;
628  ++CurCharInfo;
629  }
630  }
631 
632  *ReadRegion = CapturedReadRegion;
633 
634  return STATUS_SUCCESS;
635 }
union _CHAR_INFO::@3197 Char
CHAR AsciiChar
Definition: wincon.h:185
#define WideCharToMultiByte
Definition: compat.h:101
#define Y(I)
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
PCHAR_INFO ConioCoordToPointer(PTEXTMODE_SCREEN_BUFFER Buff, ULONG X, ULONG Y)
Definition: text.c:143
WCHAR UnicodeChar
Definition: wincon.h:184
_Must_inspect_result_ _In_ PFSRTL_PER_STREAM_CONTEXT Ptr
Definition: fsrtlfuncs.h:898
#define COMMON_LVB_SBCSDBCS
Definition: wincon.h:56
short SHORT
Definition: pedump.c:59
smooth NULL
Definition: ftsmooth.c:416
Definition: bufpool.h:45
SHORT Left
Definition: blue.h:32
SHORT Bottom
Definition: blue.h:35
WORD Attributes
Definition: wincon.h:187
SHORT Top
Definition: blue.h:33
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
#define ConioInitRect(Rect, top, left, bottom, right)
Definition: rect.h:20
CConsole Console
HANDLE ScreenBuffer
Definition: notevil.c:37
static __inline BOOLEAN ConioGetIntersection(OUT PSMALL_RECT Intersection, IN PSMALL_RECT Rect1, IN PSMALL_RECT Rect2)
Definition: rect.h:38
SHORT Right
Definition: blue.h:34
return STATUS_SUCCESS
Definition: btrfs.c:3014
#define X(b, s)

Referenced by CreatePopupWindow().

◆ ConDrvWriteConsoleOutput()

NTSTATUS NTAPI ConDrvWriteConsoleOutput ( IN PCONSOLE  Console,
IN PTEXTMODE_SCREEN_BUFFER  Buffer,
IN BOOLEAN  Unicode,
IN PCHAR_INFO  CharInfo,
IN OUT PSMALL_RECT  WriteRegion 
)

Definition at line 638 of file text.c.

643 {
644  SHORT X, Y;
646  PCHAR_INFO CurCharInfo;
647  SMALL_RECT CapturedWriteRegion;
648  PCHAR_INFO Ptr;
649 
650  if (Console == NULL || Buffer == NULL || CharInfo == NULL || WriteRegion == NULL)
651  {
653  }
654 
655  /* Validity check */
656  ASSERT(Console == Buffer->Header.Console);
657 
658  CapturedWriteRegion = *WriteRegion;
659 
660  /* Make sure WriteRegion is inside the screen buffer */
662  Buffer->ScreenBufferSize.Y - 1,
663  Buffer->ScreenBufferSize.X - 1);
664  if (!ConioGetIntersection(&CapturedWriteRegion, &CapturedWriteRegion, &ScreenBuffer))
665  {
666  /*
667  * It is okay to have a WriteRegion completely outside
668  * the screen buffer. No data is written then.
669  */
670  return STATUS_SUCCESS;
671  }
672 
673  CurCharInfo = CharInfo;
674 
675  for (Y = CapturedWriteRegion.Top; Y <= CapturedWriteRegion.Bottom; ++Y)
676  {
677  Ptr = ConioCoordToPointer(Buffer, CapturedWriteRegion.Left, Y);
678  for (X = CapturedWriteRegion.Left; X <= CapturedWriteRegion.Right; ++X)
679  {
680  if (Unicode)
681  {
682  Ptr->Char.UnicodeChar = CurCharInfo->Char.UnicodeChar;
683  }
684  else
685  {
686  ConsoleOutputAnsiToUnicodeChar(Console, &Ptr->Char.UnicodeChar, &CurCharInfo->Char.AsciiChar);
687  }
688  // TODO: Sanitize DBCS attributes?
689  Ptr->Attributes = CurCharInfo->Attributes;
690  ++Ptr;
691  ++CurCharInfo;
692  }
693  }
694 
695  TermDrawRegion(Console, &CapturedWriteRegion);
696 
697  *WriteRegion = CapturedWriteRegion;
698 
699  return STATUS_SUCCESS;
700 }
union _CHAR_INFO::@3197 Char
CHAR AsciiChar
Definition: wincon.h:185
#define Y(I)
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
PCHAR_INFO ConioCoordToPointer(PTEXTMODE_SCREEN_BUFFER Buff, ULONG X, ULONG Y)
Definition: text.c:143
WCHAR UnicodeChar
Definition: wincon.h:184
_Must_inspect_result_ _In_ PFSRTL_PER_STREAM_CONTEXT Ptr
Definition: fsrtlfuncs.h:898
#define TermDrawRegion(Console, Region)
Definition: term.h:22
#define ConsoleOutputAnsiToUnicodeChar(Console, dWChar, sChar)
Definition: text.c:31
short SHORT
Definition: pedump.c:59
smooth NULL
Definition: ftsmooth.c:416
Definition: bufpool.h:45
SHORT Left
Definition: blue.h:32
SHORT Bottom
Definition: blue.h:35
WORD Attributes
Definition: wincon.h:187
SHORT Top
Definition: blue.h:33
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
#define ConioInitRect(Rect, top, left, bottom, right)
Definition: rect.h:20
CConsole Console
HANDLE ScreenBuffer
Definition: notevil.c:37
static __inline BOOLEAN ConioGetIntersection(OUT PSMALL_RECT Intersection, IN PSMALL_RECT Rect1, IN PSMALL_RECT Rect2)
Definition: rect.h:38
SHORT Right
Definition: blue.h:34
return STATUS_SUCCESS
Definition: btrfs.c:3014
#define X(b, s)

Referenced by DestroyPopupWindow().

◆ CreatePopupWindow()

PPOPUP_WINDOW CreatePopupWindow ( IN PCONSRV_CONSOLE  Console,
IN PCONSOLE_SCREEN_BUFFER  ScreenBuffer,
IN SHORT  xLeft,
IN SHORT  yTop,
IN SHORT  Width,
IN SHORT  Height 
)

Definition at line 184 of file popup.c.

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 }
#define TRUE
Definition: types.h:120
#define ConsoleAllocHeap(Flags, Size)
Definition: heap.h:14
#define InsertTailList(ListHead, Entry)
smooth NULL
Definition: ftsmooth.c:416
Definition: bufpool.h:45
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
INT GetType(BOOL bLocal, LPOSVERSIONINFOEX osvi, LPSERVER_INFO_102 pBuf102)
Definition: gettype.c:129
Definition: console.h:35
#define HEAP_ZERO_MEMORY
Definition: compat.h:123
CConsole Console
#define ConsoleFreeHeap(HeapBase)
Definition: heap.h:15
HANDLE ScreenBuffer
Definition: notevil.c:37
IN BOOLEAN OUT PSTR Buffer
Definition: progress.h:34
struct _TEXTMODE_SCREEN_BUFFER * PTEXTMODE_SCREEN_BUFFER

Referenced by HistoryDisplayCurrentHistory().

◆ DestroyPopupWindow()

VOID DestroyPopupWindow ( IN PPOPUP_WINDOW  Popup)

Definition at line 244 of file popup.c.

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 }
#define TRUE
Definition: types.h:120
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
Definition: rtlfuncs.h:105
smooth NULL
Definition: ftsmooth.c:416
Definition: console.h:35
#define ConsoleFreeHeap(HeapBase)
Definition: heap.h:15

Referenced by LineInputKeyDown().

◆ DrawBox()

static VOID DrawBox ( PTEXTMODE_SCREEN_BUFFER  Buffer,
IN SHORT  xLeft,
IN SHORT  yTop,
IN SHORT  Width,
IN SHORT  Height 
)
static

Definition at line 49 of file popup.c.

54 {
55  COORD coPos;
56  DWORD Written;
58 
59  /* Set screen attributes */
60  coPos.X = xLeft;
61  Code.Attribute = Buffer->PopupDefaultAttrib;
62  for (coPos.Y = yTop; coPos.Y < yTop + Height; coPos.Y++)
63  {
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 }
Definition: bufpool.h:45
ULONG X
Definition: bl.h:1340
#define Code
Definition: deflate.h:80
unsigned long DWORD
Definition: ntddk_ex.h:95
Definition: bl.h:1338
ULONG Y
Definition: bl.h:1341

Referenced by CreatePopupWindow().