From b02ffc75462aaa0978d11fc28227348794317443 Mon Sep 17 00:00:00 2001 From: Marcus Meissner Date: Sun, 11 Oct 1998 10:49:46 +0000 Subject: [PATCH] Added bad hacks so WriteConsoleOutput works on vt100 and PeekMessage does at least a bit of keyboard input. --- win32/console.c | 86 +++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 79 insertions(+), 7 deletions(-) diff --git a/win32/console.c b/win32/console.c index 88fd4127179..593cbe57887 100644 --- a/win32/console.c +++ b/win32/console.c @@ -9,8 +9,10 @@ #include #include #include +#include #include #include +#include #include #include #include @@ -597,8 +599,39 @@ BOOL32 WINAPI WriteConsoleOutput32A( HANDLE32 hConsoleOutput, COORD dwBufferCoord, LPSMALL_RECT lpWriteRegion) { - FIXME(console, "(...):stub\n"); - return FALSE; + int i,j,off=0,lastattr=-1; + char buffer[200]; + DWORD res; + static int colormap[8] = { + 0,4,2,6, + 1,5,3,7, + }; + + TRACE(console,"wr: top = %d, bottom=%d, left=%d,right=%d\n", + lpWriteRegion->Top, + lpWriteRegion->Bottom, + lpWriteRegion->Left, + lpWriteRegion->Right + ); + + for (i=lpWriteRegion->Top;i<=lpWriteRegion->Bottom;i++) { + sprintf(buffer,"%c[%d;%dH",27,i,lpWriteRegion->Left); + WriteFile(hConsoleOutput,buffer,strlen(buffer),&res,NULL); + if (lastattr != lpBuffer[off].Attributes) { + lastattr = lpBuffer[off].Attributes; + sprintf(buffer,"%c[0;3%d;4%d",27,colormap[lastattr&7],colormap[(lastattr&0x70)>>4]); + if (lastattr & FOREGROUND_INTENSITY) + strcat(buffer,";1"); + /* BACKGROUND_INTENSITY */ + strcat(buffer,"m"); + WriteFile(hConsoleOutput,buffer,strlen(buffer),&res,NULL); + } + for (j=lpWriteRegion->Left;j<=lpWriteRegion->Right;j++) + WriteFile(hConsoleOutput,&(lpBuffer[off++].Char.AsciiChar),1,&res,NULL); + } + sprintf(buffer,"%c[0m",27); + WriteFile(hConsoleOutput,buffer,strlen(buffer),&res,NULL); + return TRUE; } /*********************************************************************** @@ -832,11 +865,50 @@ BOOL32 WINAPI PeekConsoleInput32A(HANDLE32 hConsoleInput, DWORD cInRecords, LPDWORD lpcRead) { - pirBuffer = NULL; - cInRecords = 0; - *lpcRead = 0; - FIXME(console,"(%d,%p,%ld,%p): stub\n",hConsoleInput, pirBuffer, - cInRecords, lpcRead); + fd_set infds; + int i,fd = FILE_GetUnixHandle(hConsoleInput); + struct timeval tv; + char inchar; + DWORD res; + static int keystate[256]; + LPINPUT_RECORD ir = pirBuffer; + + TRACE(console,"(%d,%p,%ld,%p): stub\n",hConsoleInput, pirBuffer, cInRecords, lpcRead); + + memset(&tv,0,sizeof(tv)); + FD_ZERO(&infds); + FD_SET(fd,&infds); + select(fd+1,&infds,NULL,NULL,&tv); + + if (FD_ISSET(fd,&infds)) { + ReadFile(hConsoleInput,&inchar,1,&res,NULL); + for (i=0;i<256;i++) { + if (keystate[i] && i!=inchar) { + ir->EventType = 1; + ir->Event.KeyEvent.bKeyDown = 0; + ir->Event.KeyEvent.wRepeatCount = 0; + ir->Event.KeyEvent.wVirtualKeyCode = 0; + ir->Event.KeyEvent.wVirtualScanCode = 0; + ir->Event.KeyEvent.uChar.AsciiChar = i; + ir->Event.KeyEvent.dwControlKeyState = 0; + ir++; + keystate[i]=0; + } + } + + ir->EventType = 1; /* Key_event */ + ir->Event.KeyEvent.bKeyDown = 1; + ir->Event.KeyEvent.wRepeatCount = 0; + ir->Event.KeyEvent.wVirtualKeyCode = 0; + ir->Event.KeyEvent.wVirtualScanCode = 0; + ir->Event.KeyEvent.uChar.AsciiChar = inchar; + ir->Event.KeyEvent.dwControlKeyState = 0; + keystate[inchar]=1; + ir++; + *lpcRead = ir-pirBuffer; + } else { + *lpcRead = 0; + } return TRUE; }