1 /*
2  * COPYRIGHT:       See COPYING in the top level directory
3  * PROJECT:         ReactOS Console Server DLL
4  * FILE:            win32ss/user/winsrv/consrv/include/conio.h
5  * PURPOSE:         Public Console I/O Interface
6  * PROGRAMMERS:     G� van Geldorp
7  *                  Jeffrey Morlan
8  *                  Hermes Belusca-Maito (hermes.belusca@sfr.fr)
9  */
10 
11 #pragma once
12 
13 #include "rect.h"
14 
15 // This is ALMOST a HACK!!!!!!!
16 // Helpers for code refactoring
17 #ifdef USE_NEW_CONSOLE_WAY
18 
19 #define _CONSRV_CONSOLE  _WINSRV_CONSOLE
20 #define  CONSRV_CONSOLE   WINSRV_CONSOLE
21 #define PCONSRV_CONSOLE  PWINSRV_CONSOLE
22 
23 #else
24 
25 #define _CONSRV_CONSOLE  _CONSOLE
26 #define  CONSRV_CONSOLE   CONSOLE
27 #define PCONSRV_CONSOLE  PCONSOLE
28 
29 #endif
30 
31 /* Default attributes */
32 #define DEFAULT_SCREEN_ATTRIB   (FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED)
33 #define DEFAULT_POPUP_ATTRIB    (FOREGROUND_BLUE | FOREGROUND_RED   | \
34                                  BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_INTENSITY)
35 
36 
37 /* Object type magic numbers */
38 typedef enum _CONSOLE_IO_OBJECT_TYPE
39 {
40     UNKNOWN         = 0x00, // --> Unknown object
41     TEXTMODE_BUFFER = 0x01, // --> Output-type object for text SBs
42     GRAPHICS_BUFFER = 0x02, // --> Output-type object for graphics SBs
43     SCREEN_BUFFER   = 0x03, // --> Any SB type
44     INPUT_BUFFER    = 0x04, // --> Input-type object
45     ANY_TYPE_BUFFER = 0x07, // --> Any IO object
46 } CONSOLE_IO_OBJECT_TYPE;
47 
48 typedef struct _CONSOLE_IO_OBJECT
49 {
50     CONSOLE_IO_OBJECT_TYPE Type;
51 
52     struct _CONSOLE* /* PCONSOLE */ Console;
53     LONG ReferenceCount;    /* Is incremented each time a console object gets referenced */
54 
55     LONG AccessRead, AccessWrite;
56     LONG ExclusiveRead, ExclusiveWrite;
57 } CONSOLE_IO_OBJECT, *PCONSOLE_IO_OBJECT;
58 
59 
60 /******************************************************************************\
61 |*                                                                            *|
62 |*     Abstract "class" for screen-buffers, be they text-mode or graphics     *|
63 |*                                                                            *|
64 \******************************************************************************/
65 
66 /*
67  * See conoutput.c for the implementation
68  */
69 
70 typedef struct _CONSOLE_SCREEN_BUFFER CONSOLE_SCREEN_BUFFER,
71                                     *PCONSOLE_SCREEN_BUFFER;
72 
73 typedef struct _CONSOLE_SCREEN_BUFFER_VTBL
74 {
75     CONSOLE_IO_OBJECT_TYPE (*GetType)(PCONSOLE_SCREEN_BUFFER This);
76 } CONSOLE_SCREEN_BUFFER_VTBL, *PCONSOLE_SCREEN_BUFFER_VTBL;
77 
78 #define GetType(This)   (This)->Vtbl->GetType(This)
79 
80 struct _CONSOLE_SCREEN_BUFFER
81 {
82     CONSOLE_IO_OBJECT Header;           /* Object header - MUST BE IN FIRST PLACE */
83     PCONSOLE_SCREEN_BUFFER_VTBL Vtbl;   /* Virtual table */
84 
85     LIST_ENTRY ListEntry;               /* Entry in console's list of buffers */
86 
87     COORD   ScreenBufferSize;           /* Size of this screen buffer. (Rows, Columns) for text-mode and (Width, Height) for graphics-mode */
88     COORD   ViewSize;                   /* Associated "view" (i.e. console) size */
89 
90     COORD   OldScreenBufferSize;        /* Old size of this screen buffer */
91     COORD   OldViewSize;                /* Old associated view size */
92 
93     COORD   ViewOrigin;                 /* Beginning offset for the actual display area */
94 
95 /***** Put that VV in TEXTMODE_SCREEN_BUFFER ?? *****/
96     COORD   CursorPosition;             /* Current cursor position */
97     BOOLEAN CursorBlinkOn;
98     BOOLEAN ForceCursorOff;
99 //  ULONG   CursorSize;
100     CONSOLE_CURSOR_INFO CursorInfo; // FIXME: Keep this member or not ??
101 /*********************************************/
102 
103     HPALETTE PaletteHandle;             /* Handle to the color palette associated to this buffer */
104     UINT     PaletteUsage;              /* The new use of the system palette. See SetSystemPaletteUse 'uUsage' parameter */
105 
106 //  USHORT   ScreenDefaultAttrib;       /* Default screen char attribute */
107 //  USHORT   PopupDefaultAttrib;        /* Default popup char attribute */
108     USHORT Mode;                        /* Output buffer modes */
109 };
110 
111 
112 
113 /******************************************************************************\
114 |*                                                                            *|
115 |*           Text-mode and graphics-mode screen-buffer "classes"              *|
116 |*                                                                            *|
117 \******************************************************************************/
118 
119 /*
120  * See text.c for the implementation
121  */
122 
123 /************************************************************************
124  * Screen buffer structure represents the win32 screen buffer object.   *
125  * Internally, the portion of the buffer being shown CAN loop past the  *
126  * bottom of the virtual buffer and wrap around to the top.  Win32 does *
127  * not do this.  I decided to do this because it eliminates the need to *
128  * do a massive memcpy() to scroll the contents of the buffer up to     *
129  * scroll the screen on output, instead I just shift down the position  *
130  * to be displayed, and let it wrap around to the top again.            *
131  * The VirtualY member keeps track of the top Y coord that win32        *
132  * clients THINK is currently being displayed, because they think that  *
133  * when the display reaches the bottom of the buffer and another line   *
134  * being printed causes another line to scroll down, that the buffer IS *
135  * memcpy()'s up, and the bottom of the buffer is still displayed, but  *
136  * internally, I just wrap back to the top of the buffer.               *
137  ************************************************************************/
138 
139 typedef struct _TEXTMODE_BUFFER_INFO
140 {
141     COORD   ScreenBufferSize;
142     COORD   ViewSize;
143     USHORT  ScreenAttrib;
144     USHORT  PopupAttrib;
145     ULONG   CursorSize;
146     BOOLEAN IsCursorVisible;
147 } TEXTMODE_BUFFER_INFO, *PTEXTMODE_BUFFER_INFO;
148 
149 typedef struct _TEXTMODE_SCREEN_BUFFER
150 {
151     CONSOLE_SCREEN_BUFFER;      /* Screen buffer base class - MUST BE IN FIRST PLACE */
152 
153     USHORT     VirtualY;        /* Top row of buffer being displayed, reported to callers */
154     PCHAR_INFO Buffer;          /* Pointer to UNICODE screen buffer (Buffer->Char.UnicodeChar only is valid, not Char.AsciiChar) */
155 
156     USHORT ScreenDefaultAttrib; /* Default screen char attribute */
157     USHORT PopupDefaultAttrib;  /* Default popup char attribute */
158 } TEXTMODE_SCREEN_BUFFER, *PTEXTMODE_SCREEN_BUFFER;
159 
160 
161 /*
162  * See graphics.c for the implementation
163  */
164 
165 typedef struct _GRAPHICS_BUFFER_INFO
166 {
167     CONSOLE_GRAPHICS_BUFFER_INFO Info;
168 } GRAPHICS_BUFFER_INFO, *PGRAPHICS_BUFFER_INFO;
169 
170 typedef struct _GRAPHICS_SCREEN_BUFFER
171 {
172     CONSOLE_SCREEN_BUFFER;          /* Screen buffer base class - MUST BE IN FIRST PLACE */
173 
174     ULONG   BitMapInfoLength;       /* Real size of the structure pointed by BitMapInfo */
175     LPBITMAPINFO BitMapInfo;        /* Information on the bitmap buffer */
176     ULONG   BitMapUsage;            /* See the uUsage parameter of GetDIBits */
177     HANDLE  hSection;               /* Handle to the memory shared section for the bitmap buffer */
178     PVOID   BitMap;                 /* Our bitmap buffer */
179 
180     PVOID   ClientBitMap;           /* A copy of the client view of our bitmap buffer */
181     HANDLE  Mutex;                  /* Our mutex, used to synchronize read / writes to the bitmap buffer */
182     HANDLE  ClientMutex;            /* A copy of the client handle to our mutex */
183     HANDLE  ClientProcess;          /* Handle to the client process who opened the buffer, to unmap the view */
184 } GRAPHICS_SCREEN_BUFFER, *PGRAPHICS_SCREEN_BUFFER;
185 
186 
187 
188 typedef struct _CONSOLE_INPUT_BUFFER
189 {
190     CONSOLE_IO_OBJECT Header;       /* Object header - MUST BE IN FIRST PLACE */
191 
192     ULONG       InputBufferSize;    /* Size of this input buffer (maximum number of events) -- UNUSED!! */
193     ULONG       NumberOfEvents;     /* Current number of events in the queue */
194     LIST_ENTRY  InputEvents;        /* Input events queue list head */
195     HANDLE      ActiveEvent;        /* Event set when an input event is added to the queue */
196 
197     USHORT      Mode;               /* Input buffer modes */
198 } CONSOLE_INPUT_BUFFER, *PCONSOLE_INPUT_BUFFER;
199 
200 
201 typedef struct _TERMINAL TERMINAL, *PTERMINAL;
202 
203 /*
204  * Structure used to hold console information
205  */
206 typedef struct _CONSOLE_INFO
207 {
208     ULONG   InputBufferSize;
209     COORD   ScreenBufferSize;
210     COORD   ConsoleSize;    /* The size of the console */
211 
212     ULONG   CursorSize;
213     BOOLEAN CursorBlinkOn;
214     BOOLEAN ForceCursorOff;
215 
216     USHORT  ScreenAttrib; // CHAR_INFO ScreenFillAttrib
217     USHORT  PopupAttrib;
218 
219     ULONG   CodePage;
220 
221 } CONSOLE_INFO, *PCONSOLE_INFO;
222 
223 typedef struct _TERMINAL_VTBL
224 {
225     /*
226      * Internal interface (functions called by the console server only)
227      */
228     NTSTATUS (NTAPI *InitTerminal)(IN OUT PTERMINAL This,
229                                    IN struct _CONSOLE* Console);
230     VOID (NTAPI *DeinitTerminal)(IN OUT PTERMINAL This);
231 
232 
233 
234 /************ Line discipline ***************/
235 
236     /* Interface used only for text-mode screen buffers */
237 
238     NTSTATUS (NTAPI *ReadStream)(IN OUT PTERMINAL This,
239                                  IN BOOLEAN Unicode,
240                                  /**PWCHAR Buffer,**/
241                                  OUT PVOID Buffer,
242                                  IN OUT PCONSOLE_READCONSOLE_CONTROL ReadControl,
243                                  IN PVOID Parameter OPTIONAL,
244                                  IN ULONG NumCharsToRead,
245                                  OUT PULONG NumCharsRead OPTIONAL);
246     NTSTATUS (NTAPI *WriteStream)(IN OUT PTERMINAL This,
247                                   PTEXTMODE_SCREEN_BUFFER Buff,
248                                   PWCHAR Buffer,
249                                   DWORD Length,
250                                   BOOL Attrib);
251 
252 /************ Line discipline ***************/
253 
254 
255 
256     /* Interface used for both text-mode and graphics screen buffers */
257     VOID (NTAPI *DrawRegion)(IN OUT PTERMINAL This,
258                              SMALL_RECT* Region);
259     BOOL (NTAPI *SetCursorInfo)(IN OUT PTERMINAL This,
260                                 PCONSOLE_SCREEN_BUFFER ScreenBuffer);
261     BOOL (NTAPI *SetScreenInfo)(IN OUT PTERMINAL This,
262                                 PCONSOLE_SCREEN_BUFFER ScreenBuffer,
263                                 SHORT OldCursorX,
264                                 SHORT OldCursorY);
265     VOID (NTAPI *ResizeTerminal)(IN OUT PTERMINAL This);
266     VOID (NTAPI *SetActiveScreenBuffer)(IN OUT PTERMINAL This);
267     VOID (NTAPI *ReleaseScreenBuffer)(IN OUT PTERMINAL This,
268                                       IN PCONSOLE_SCREEN_BUFFER ScreenBuffer);
269 
270     /*
271      * External interface (functions corresponding to the Console API)
272      */
273     VOID (NTAPI *GetLargestConsoleWindowSize)(IN OUT PTERMINAL This,
274                                               PCOORD pSize);
275     BOOL (NTAPI *SetPalette)(IN OUT PTERMINAL This,
276                              HPALETTE PaletteHandle,
277                              UINT PaletteUsage);
278     INT   (NTAPI *ShowMouseCursor)(IN OUT PTERMINAL This,
279                                    BOOL Show);
280 
281 #if 0 // Possible future terminal interface
282     BOOL (NTAPI *GetTerminalProperty)(IN OUT PTERMINAL This,
283                                       ULONG Flag,
284                                       PVOID Info,
285                                       ULONG Size);
286     BOOL (NTAPI *SetTerminalProperty)(IN OUT PTERMINAL This,
287                                       ULONG Flag,
288                                       PVOID Info /*,
289                                       ULONG Size */);
290 #endif
291 } TERMINAL_VTBL, *PTERMINAL_VTBL;
292 
293 struct _TERMINAL
294 {
295     PTERMINAL_VTBL Vtbl;        /* Virtual table */
296     struct _CONSOLE* Console;   /* Console to which the terminal is attached to */
297     PVOID Context;              /* Private context */
298 };
299 
300 /*
301  * WARNING: Change the state of the console ONLY when the console is locked !
302  */
303 typedef enum _CONSOLE_STATE
304 {
305     CONSOLE_INITIALIZING,   /* Console is initializing */
306     CONSOLE_RUNNING     ,   /* Console running */
307     CONSOLE_TERMINATING ,   /* Console about to be destroyed (but still not) */
308     CONSOLE_IN_DESTRUCTION  /* Console in destruction */
309 } CONSOLE_STATE, *PCONSOLE_STATE;
310 
311 // HACK!!
312 struct _CONSOLE;
313 /* HACK: */ typedef struct _CONSOLE *PCONSOLE;
314 #ifndef USE_NEW_CONSOLE_WAY
315 #include "conio_winsrv.h"
316 #endif
317 
318 typedef struct _CONSOLE
319 {
320 /******************************* Console Set-up *******************************/
321 
322 #ifndef USE_NEW_CONSOLE_WAY
323     WINSRV_CONSOLE; // HACK HACK!!
324 #endif
325 
326     LONG ReferenceCount;                    /* Is incremented each time a handle to something in the console (a screen-buffer or the input buffer of this console) gets referenced */
327     CRITICAL_SECTION Lock;
328 
329     ULONG ConsoleID;                        /* The ID of the console */
330     LIST_ENTRY ListEntry;                   /* Entry in the list of consoles */
331 
332     CONSOLE_STATE State;                    /* State of the console */
333     TERMINAL TermIFace;                     /* Terminal-specific interface */
334 
335     BOOLEAN ConsolePaused;                  /* If TRUE, the console is paused */
336 
337 /******************************** Input buffer ********************************/
338     CONSOLE_INPUT_BUFFER InputBuffer;       /* Input buffer of the console */
339     UINT InputCodePage;
340 
341 /******************************* Screen buffers *******************************/
342     LIST_ENTRY BufferList;                  /* List of all screen buffers for this console */
343     PCONSOLE_SCREEN_BUFFER ActiveBuffer;    /* Pointer to currently active screen buffer */
344     UINT OutputCodePage;
345 
346 /****************************** Other properties ******************************/
347     COORD   ConsoleSize;                    /* The current size of the console, for text-mode only */
348     BOOLEAN FixedSize;                      /* TRUE if the console is of fixed size */
349     BOOLEAN IsCJK;                          /* TRUE if Chinese, Japanese or Korean (CJK) */
350 } CONSOLE; // , *PCONSOLE;
351 
352 /* console.c */
353 VOID NTAPI
354 ConDrvPause(PCONSOLE Console);
355 VOID NTAPI
356 ConDrvUnpause(PCONSOLE Console);
357 
358 NTSTATUS
359 ConSrvConsoleCtrlEvent(IN ULONG CtrlEvent,
360                        IN PCONSOLE_PROCESS_DATA ProcessData);
361 
362 
363 #define GetConsoleInputBufferMode(Console)  \
364     (Console)->InputBuffer.Mode
365 
366 
367 /* conoutput.c */
368 PCHAR_INFO ConioCoordToPointer(PTEXTMODE_SCREEN_BUFFER Buff, ULONG X, ULONG Y);
369 NTSTATUS ConioResizeBuffer(PCONSOLE Console,
370                            PTEXTMODE_SCREEN_BUFFER ScreenBuffer,
371                            COORD Size);
372 
373 /* wcwidth.c */
374 int mk_wcwidth_cjk(wchar_t ucs);
375 
376 // NOTE: The check against 0x80 is to avoid calling the helper function
377 // for characters that we already know are not full-width.
378 #define IS_FULL_WIDTH(wch)  \
379     (((USHORT)(wch) >= 0x0080) && (mk_wcwidth_cjk(wch) == 2))
380 
381 /* EOF */
382