[KERNEL32][CONSRV]
[reactos.git] / reactos / win32ss / user / winsrv / consrv / condrv / coninput.c
index d013ea8..8a9329d 100644 (file)
@@ -11,7 +11,7 @@
 
 #include "consrv.h"
 #include "include/conio.h"
 
 #include "consrv.h"
 #include "include/conio.h"
-#include "include/conio2.h"
+#include "include/term.h"
 #include "handle.h"
 #include "lineinput.h"
 
 #include "handle.h"
 #include "lineinput.h"
 
@@ -60,8 +60,9 @@ ConioInputEventToAnsi(PCONSOLE Console, PINPUT_RECORD InputEvent)
 }
 
 NTSTATUS FASTCALL
 }
 
 NTSTATUS FASTCALL
-ConioProcessInputEvent(PCONSOLE Console,
-                       PINPUT_RECORD InputEvent)
+ConioAddInputEvent(PCONSOLE Console,
+                   PINPUT_RECORD InputEvent,
+                   BOOLEAN AppendToEnd)
 {
     ConsoleInput *ConInRec;
 
 {
     ConsoleInput *ConInRec;
 
@@ -97,7 +98,17 @@ ConioProcessInputEvent(PCONSOLE Console,
     if (ConInRec == NULL) return STATUS_INSUFFICIENT_RESOURCES;
 
     ConInRec->InputEvent = *InputEvent;
     if (ConInRec == NULL) return STATUS_INSUFFICIENT_RESOURCES;
 
     ConInRec->InputEvent = *InputEvent;
-    InsertTailList(&Console->InputBuffer.InputEvents, &ConInRec->ListEntry);
+
+    if (AppendToEnd)
+    {
+        /* Append the event to the end of the queue */
+        InsertTailList(&Console->InputBuffer.InputEvents, &ConInRec->ListEntry);
+    }
+    else
+    {
+        /* Append the event to the beginning of the queue */
+        InsertHeadList(&Console->InputBuffer.InputEvents, &ConInRec->ListEntry);
+    }
 
     SetEvent(Console->InputBuffer.ActiveEvent);
     CsrNotifyWait(&Console->InputBuffer.ReadWaitQueue,
 
     SetEvent(Console->InputBuffer.ActiveEvent);
     CsrNotifyWait(&Console->InputBuffer.ReadWaitQueue,
@@ -112,6 +123,13 @@ ConioProcessInputEvent(PCONSOLE Console,
     return STATUS_SUCCESS;
 }
 
     return STATUS_SUCCESS;
 }
 
+NTSTATUS FASTCALL
+ConioProcessInputEvent(PCONSOLE Console,
+                       PINPUT_RECORD InputEvent)
+{
+    return ConioAddInputEvent(Console, InputEvent, TRUE);
+}
+
 VOID FASTCALL
 PurgeInputBuffer(PCONSOLE Console)
 {
 VOID FASTCALL
 PurgeInputBuffer(PCONSOLE Console)
 {
@@ -128,6 +146,11 @@ PurgeInputBuffer(PCONSOLE Console)
     CloseHandle(Console->InputBuffer.ActiveEvent);
 }
 
     CloseHandle(Console->InputBuffer.ActiveEvent);
 }
 
+/*
+ * This function explicitely references Console->ActiveBuffer
+ * (and also makes use of keyboard functions...).
+ * It is possible that it will move into frontends...
+ */
 VOID NTAPI
 ConDrvProcessKey(IN PCONSOLE Console,
                  IN BOOLEAN Down,
 VOID NTAPI
 ConDrvProcessKey(IN PCONSOLE Console,
                  IN BOOLEAN Down,
@@ -353,6 +376,7 @@ ConDrvReadConsole(IN PCONSOLE Console,
 NTSTATUS NTAPI
 ConDrvGetConsoleInput(IN PCONSOLE Console,
                       IN PCONSOLE_INPUT_BUFFER InputBuffer,
 NTSTATUS NTAPI
 ConDrvGetConsoleInput(IN PCONSOLE Console,
                       IN PCONSOLE_INPUT_BUFFER InputBuffer,
+                      IN BOOLEAN KeepEvents,
                       IN BOOLEAN WaitForMoreEvents,
                       IN BOOLEAN Unicode,
                       OUT PINPUT_RECORD InputRecord,
                       IN BOOLEAN WaitForMoreEvents,
                       IN BOOLEAN Unicode,
                       OUT PINPUT_RECORD InputRecord,
@@ -402,7 +426,8 @@ ConDrvGetConsoleInput(IN PCONSOLE Console,
         ++i;
         CurrentInput = CurrentInput->Flink;
 
         ++i;
         CurrentInput = CurrentInput->Flink;
 
-        if (WaitForMoreEvents) // TRUE --> Read, we remove inputs from the buffer ; FALSE --> Peek, we keep inputs.
+        /* Remove the events from the queue if needed */
+        if (!KeepEvents)
         {
             RemoveEntryList(&Input->ListEntry);
             ConsoleFreeHeap(Input);
         {
             RemoveEntryList(&Input->ListEntry);
             ConsoleFreeHeap(Input);
@@ -424,6 +449,7 @@ NTSTATUS NTAPI
 ConDrvWriteConsoleInput(IN PCONSOLE Console,
                         IN PCONSOLE_INPUT_BUFFER InputBuffer,
                         IN BOOLEAN Unicode,
 ConDrvWriteConsoleInput(IN PCONSOLE Console,
                         IN PCONSOLE_INPUT_BUFFER InputBuffer,
                         IN BOOLEAN Unicode,
+                        IN BOOLEAN AppendToEnd,
                         IN PINPUT_RECORD InputRecord,
                         IN ULONG NumEventsToWrite,
                         OUT PULONG NumEventsWritten OPTIONAL)
                         IN PINPUT_RECORD InputRecord,
                         IN ULONG NumEventsToWrite,
                         OUT PULONG NumEventsWritten OPTIONAL)
@@ -452,7 +478,7 @@ ConDrvWriteConsoleInput(IN PCONSOLE Console,
                                               &AsciiChar);
         }
 
                                               &AsciiChar);
         }
 
-        Status = ConioProcessInputEvent(Console, InputRecord++);
+        Status = ConioAddInputEvent(Console, InputRecord++, AppendToEnd);
     }
 
     if (NumEventsWritten) *NumEventsWritten = i;
     }
 
     if (NumEventsWritten) *NumEventsWritten = i;