From 418efd5de88ee7c1b4cd93de61a30a1691ae7069 Mon Sep 17 00:00:00 2001 From: Phillip Susi Date: Fri, 7 Jul 2000 01:16:50 +0000 Subject: [PATCH] Implimented switch back to text mode after gditest svn path=/trunk/; revision=1245 --- reactos/subsys/csrss/api/conio.c | 39 ++++++++++++++++++++++++++++---- reactos/subsys/csrss/init.c | 15 ++++++++++-- 2 files changed, 48 insertions(+), 6 deletions(-) diff --git a/reactos/subsys/csrss/api/conio.c b/reactos/subsys/csrss/api/conio.c index e2b391484ea..46650eb59e6 100644 --- a/reactos/subsys/csrss/api/conio.c +++ b/reactos/subsys/csrss/api/conio.c @@ -1,4 +1,4 @@ -/* $Id: conio.c,v 1.8 2000/07/06 14:34:52 dwelch Exp $ +/* $Id: conio.c,v 1.9 2000/07/07 01:16:50 phreak Exp $ * * reactos/subsys/csrss/api/conio.c * @@ -15,6 +15,7 @@ #include "api.h" #include #include +#include /* GLOBALS *******************************************************************/ @@ -460,7 +461,7 @@ VOID CsrInitConsoleSupport(VOID) &ObjectAttributes, &Iosb, 0, - FILE_SYNCHRONOUS_IO_ALERT); + 0); if (!NT_SUCCESS(Status)) { DbgPrint("CSR: Failed to open keyboard. Expect problems.\n"); @@ -477,13 +478,23 @@ VOID CsrInitConsoleSupport(VOID) PhysicalConsoleSize = ScrInfo.dwSize; } -VOID Console_Api( DWORD Ignored ) +VOID Console_Api( DWORD RefreshEvent ) { /* keep reading events from the keyboard and stuffing them into the current console's input queue */ ConsoleInput *KeyEventRecord; IO_STATUS_BLOCK Iosb; NTSTATUS Status; + HANDLE Events[2]; // 0 = keyboard, 1 = refresh + + Events[0] = 0; + Status = NtCreateEvent( &Events[0], STANDARD_RIGHTS_ALL, NULL, FALSE, FALSE ); + if( !NT_SUCCESS( Status ) ) + { + DbgPrint( "CSR: NtCreateEvent failed: %x\n", Status ); + return; + } + Events[1] = (HANDLE)RefreshEvent; while( 1 ) { KeyEventRecord = RtlAllocateHeap(CsrssApiHeap, @@ -495,13 +506,33 @@ VOID Console_Api( DWORD Ignored ) continue; } KeyEventRecord->InputEvent.EventType = KEY_EVENT; - Status = NtReadFile( KeyboardDeviceHandle, NULL, NULL, NULL, &Iosb, &KeyEventRecord->InputEvent.Event.KeyEvent, sizeof( KEY_EVENT_RECORD ), NULL, 0 ); + Status = NtReadFile( KeyboardDeviceHandle, Events[0], NULL, NULL, &Iosb, &KeyEventRecord->InputEvent.Event.KeyEvent, sizeof( KEY_EVENT_RECORD ), NULL, 0 ); if( !NT_SUCCESS( Status ) ) { DbgPrint( "CSR: ReadFile on keyboard device failed\n" ); RtlFreeHeap( CsrssApiHeap, 0, KeyEventRecord ); continue; } + if( Status == STATUS_PENDING ) + { + while( 1 ) + { + Status = NtWaitForMultipleObjects( 2, Events, WaitAny, FALSE, NULL ); + if( Status == STATUS_WAIT_0 + 1 ) + { + RtlEnterCriticalSection( &ActiveConsoleLock ); + CsrDrawConsole( ActiveConsole ); + RtlLeaveCriticalSection( &ActiveConsoleLock ); + continue; + } + else if( Status != STATUS_WAIT_0 ) + { + DbgPrint( "CSR: NtWaitForMultipleObjects failed: %x, exiting\n", Status ); + return; + } + else break; + } + } // DbgPrint( "Char: %c\n", KeyEventRecord->InputEvent.Event.KeyEvent.uChar.AsciiChar ); if( KeyEventRecord->InputEvent.Event.KeyEvent.dwControlKeyState & ( RIGHT_ALT_PRESSED | LEFT_ALT_PRESSED )&& KeyEventRecord->InputEvent.Event.KeyEvent.uChar.AsciiChar == 'q' ) if( KeyEventRecord->InputEvent.Event.KeyEvent.bKeyDown == TRUE ) diff --git a/reactos/subsys/csrss/init.c b/reactos/subsys/csrss/init.c index 3976128aa2b..48eea3d849f 100644 --- a/reactos/subsys/csrss/init.c +++ b/reactos/subsys/csrss/init.c @@ -1,4 +1,4 @@ -/* $Id: init.c,v 1.9 2000/05/26 05:40:20 phreak Exp $ +/* $Id: init.c,v 1.10 2000/07/07 01:16:18 phreak Exp $ * * reactos/subsys/csrss/init.c * @@ -95,6 +95,9 @@ CsrServerInitialization ( NTSTATUS Status; OBJECT_ATTRIBUTES ObAttributes; UNICODE_STRING PortName; + OBJECT_ATTRIBUTES RefreshEventAttr; + UNICODE_STRING RefreshEventName; + HANDLE RefreshEventHandle; Status = CsrParseCommandLine (ArgumentCount, ArgumentArray); if (!NT_SUCCESS(Status)) @@ -150,7 +153,15 @@ CsrServerInitialization ( NtClose(ApiPortHandle); return FALSE; } - Status = RtlCreateUserThread( NtCurrentProcess(), NULL, FALSE, 0, NULL, NULL, (PTHREAD_START_ROUTINE)Console_Api, 0, NULL, NULL ); + RtlInitUnicodeString( &RefreshEventName, L"\\TextConsoleRefreshEvent" ); + InitializeObjectAttributes( &RefreshEventAttr, &RefreshEventName, NULL, NULL, NULL ); + Status = NtCreateEvent( &RefreshEventHandle, STANDARD_RIGHTS_ALL, &RefreshEventAttr, FALSE, FALSE ); + if( !NT_SUCCESS( Status ) ) + { + PrintString( "CSR: Unable to create refresh event!\n" ); + return FALSE; + } + Status = RtlCreateUserThread( NtCurrentProcess(), NULL, FALSE, 0, NULL, NULL, (PTHREAD_START_ROUTINE)Console_Api, (DWORD) RefreshEventHandle, NULL, NULL ); if( !NT_SUCCESS( Status ) ) { PrintString( "CSR: Unable to create console thread\n" );