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