ReactOS  0.4.14-dev-52-g6116262
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 978 of file text.c.

985 {
986  ULONG X, Y, Length; // , Written = 0;
987  PCHAR_INFO Ptr;
988 
989  if (Console == NULL || Buffer == NULL || WriteCoord == NULL)
990  {
992  }
993 
994  /* Validity check */
995  ASSERT(Console == Buffer->Header.Console);
996 
997  //
998  // FIXME: Make overflow checks on WriteCoord !!!!!!
999  //
1000 
1001  if (NumCodesWritten) *NumCodesWritten = 0;
1002 
1003  if (CodeType == CODE_ASCII)
1004  {
1005  /* Conversion from the ASCII char to the UNICODE char */
1006  CODE_ELEMENT tmp;
1008  Code = tmp;
1009  }
1010 
1011  X = WriteCoord->X;
1012  Y = (WriteCoord->Y + Buffer->VirtualY) % Buffer->ScreenBufferSize.Y;
1013  Length = NumCodesToWrite;
1014  // Ptr = ConioCoordToPointer(Buffer, X, Y); // Doesn't work
1015  // Ptr = &Buffer->Buffer[X + Y * Buffer->ScreenBufferSize.X]; // May work
1016 
1017  while (Length--)
1018  {
1019  // Ptr = ConioCoordToPointer(Buffer, X, Y); // Doesn't work either
1020  Ptr = &Buffer->Buffer[X + Y * Buffer->ScreenBufferSize.X];
1021 
1022  switch (CodeType)
1023  {
1024  case CODE_ASCII:
1025  case CODE_UNICODE:
1026  Ptr->Char.UnicodeChar = Code.UnicodeChar;
1027  break;
1028 
1029  case CODE_ATTRIBUTE:
1030  Ptr->Attributes = Code.Attribute;
1031  break;
1032  }
1033  // ++Ptr;
1034 
1035  // Written++;
1036  if (++X == Buffer->ScreenBufferSize.X)
1037  {
1038  X = 0;
1039 
1040  if (++Y == Buffer->ScreenBufferSize.Y)
1041  {
1042  Y = 0;
1043  }
1044  }
1045  }
1046 
1047  if ((PCONSOLE_SCREEN_BUFFER)Buffer == Console->ActiveBuffer)
1048  {
1050  ConioComputeUpdateRect(Buffer, &UpdateRect, WriteCoord, NumCodesToWrite);
1052  }
1053 
1054  if (NumCodesWritten) *NumCodesWritten = NumCodesToWrite; // Written;
1055  return STATUS_SUCCESS;
1056 }
#define Y(I)
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
WCHAR UnicodeChar
Definition: conmsg.h:525
_Must_inspect_result_ _In_ PFSRTL_PER_STREAM_CONTEXT Ptr
Definition: fsrtlfuncs.h:898
#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:160
#define ConsoleOutputAnsiToUnicodeChar(Console, dWChar, sChar)
Definition: text.c:29
while(1)
Definition: macro.lex.yy.c:740
X(int i_=0)
smooth NULL
Definition: ftsmooth.c:416
Definition: bufpool.h:45
#define Code
Definition: deflate.h:80
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:101
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
CConsole Console
unsigned int ULONG
Definition: retypes.h:1
static int UpdateRect(TreeListData *pData, unsigned uItem, unsigned uSub)
Definition: treelist.c:1529
return STATUS_SUCCESS
Definition: btrfs.c:2966
#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 467 of file text.c.

472 {
473  SHORT X, Y;
475  PCHAR_INFO CurCharInfo;
476  SMALL_RECT CapturedReadRegion;
477  PCHAR_INFO Ptr;
478 
479  if (Console == NULL || Buffer == NULL || CharInfo == NULL || ReadRegion == NULL)
480  {
482  }
483 
484  /* Validity check */
485  ASSERT(Console == Buffer->Header.Console);
486 
487  CapturedReadRegion = *ReadRegion;
488 
489  /* Make sure ReadRegion is inside the screen buffer */
491  Buffer->ScreenBufferSize.Y - 1,
492  Buffer->ScreenBufferSize.X - 1);
493  if (!ConioGetIntersection(&CapturedReadRegion, &ScreenBuffer, &CapturedReadRegion))
494  {
495  /*
496  * It is okay to have a ReadRegion completely outside
497  * the screen buffer. No data is read then.
498  */
499  return STATUS_SUCCESS;
500  }
501 
502  CurCharInfo = CharInfo;
503 
504  for (Y = CapturedReadRegion.Top; Y <= CapturedReadRegion.Bottom; ++Y)
505  {
506  Ptr = ConioCoordToPointer(Buffer, CapturedReadRegion.Left, Y);
507  for (X = CapturedReadRegion.Left; X <= CapturedReadRegion.Right; ++X)
508  {
509  if (Unicode)
510  {
511  CurCharInfo->Char.UnicodeChar = Ptr->Char.UnicodeChar;
512  }
513  else
514  {
515  // ConsoleOutputUnicodeToAnsiChar(Console, &CurCharInfo->Char.AsciiChar, &Ptr->Char.UnicodeChar);
516  WideCharToMultiByte(Console->OutputCodePage, 0, &Ptr->Char.UnicodeChar, 1,
517  &CurCharInfo->Char.AsciiChar, 1, NULL, NULL);
518  }
519  CurCharInfo->Attributes = Ptr->Attributes;
520  ++Ptr;
521  ++CurCharInfo;
522  }
523  }
524 
525  *ReadRegion = CapturedReadRegion;
526 
527  return STATUS_SUCCESS;
528 }
CHAR AsciiChar
Definition: wincon.h:170
#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:140
WCHAR UnicodeChar
Definition: wincon.h:169
_Must_inspect_result_ _In_ PFSRTL_PER_STREAM_CONTEXT Ptr
Definition: fsrtlfuncs.h:898
short SHORT
Definition: pedump.c:59
smooth NULL
Definition: ftsmooth.c:416
Definition: bufpool.h:45
SHORT Left
Definition: blue.h:25
union _CHAR_INFO::@3152 Char
SHORT Bottom
Definition: blue.h:28
WORD Attributes
Definition: wincon.h:172
SHORT Top
Definition: blue.h:26
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: text.c:150
SHORT Right
Definition: blue.h:27
return STATUS_SUCCESS
Definition: btrfs.c:2966
#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 531 of file text.c.

536 {
537  SHORT X, Y;
539  PCHAR_INFO CurCharInfo;
540  SMALL_RECT CapturedWriteRegion;
541  PCHAR_INFO Ptr;
542 
543  if (Console == NULL || Buffer == NULL || CharInfo == NULL || WriteRegion == NULL)
544  {
546  }
547 
548  /* Validity check */
549  ASSERT(Console == Buffer->Header.Console);
550 
551  CapturedWriteRegion = *WriteRegion;
552 
553  /* Make sure WriteRegion is inside the screen buffer */
555  Buffer->ScreenBufferSize.Y - 1,
556  Buffer->ScreenBufferSize.X - 1);
557  if (!ConioGetIntersection(&CapturedWriteRegion, &ScreenBuffer, &CapturedWriteRegion))
558  {
559  /*
560  * It is okay to have a WriteRegion completely outside
561  * the screen buffer. No data is written then.
562  */
563  return STATUS_SUCCESS;
564  }
565 
566  CurCharInfo = CharInfo;
567 
568  for (Y = CapturedWriteRegion.Top; Y <= CapturedWriteRegion.Bottom; ++Y)
569  {
570  Ptr = ConioCoordToPointer(Buffer, CapturedWriteRegion.Left, Y);
571  for (X = CapturedWriteRegion.Left; X <= CapturedWriteRegion.Right; ++X)
572  {
573  if (Unicode)
574  {
575  Ptr->Char.UnicodeChar = CurCharInfo->Char.UnicodeChar;
576  }
577  else
578  {
579  ConsoleOutputAnsiToUnicodeChar(Console, &Ptr->Char.UnicodeChar, &CurCharInfo->Char.AsciiChar);
580  }
581  Ptr->Attributes = CurCharInfo->Attributes;
582  ++Ptr;
583  ++CurCharInfo;
584  }
585  }
586 
587  TermDrawRegion(Console, &CapturedWriteRegion);
588 
589  *WriteRegion = CapturedWriteRegion;
590 
591  return STATUS_SUCCESS;
592 }
CHAR AsciiChar
Definition: wincon.h:170
#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:140
WCHAR UnicodeChar
Definition: wincon.h:169
_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:29
short SHORT
Definition: pedump.c:59
smooth NULL
Definition: ftsmooth.c:416
Definition: bufpool.h:45
SHORT Left
Definition: blue.h:25
union _CHAR_INFO::@3152 Char
SHORT Bottom
Definition: blue.h:28
WORD Attributes
Definition: wincon.h:172
SHORT Top
Definition: blue.h:26
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: text.c:150
SHORT Right
Definition: blue.h:27
return STATUS_SUCCESS
Definition: btrfs.c:2966
#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 TEXTMODE_BUFFER
Definition: pccons.c:21
#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  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 }
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().