Ignore:
Timestamp:
Dec 30, 2012, 12:02:33 AM (8 years ago)
Author:
dmik
Message:

kernel32: Properly handle backspace and tab characters in console input/output mode.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kernel32/conbuffervio.cpp

    r21916 r22052  
    112112  register UCHAR ucChar;
    113113          APIRET rc;
    114           ULONG Row;
     114          USHORT Row;
    115115          USHORT Column;
    116116          int    numchar;
     
    179179                    pConsoleGlobals->Options.ulSpeakerDuration);
    180180          break;
    181 #if 0
     181
    182182        case 8: /* Backspace */
    183           // not correct if deleting expanded tab character
    184             rc = VioGetCurPos(&Row, &Column, 0);
    185             if(!rc) {
    186 
    187             }
     183        {
     184          BOOL go = FALSE;
    188185          if (pConsoleBuffer->coordCursorPosition.X > 0)
     186          {
    189187            pConsoleBuffer->coordCursorPosition.X--;
    190 
    191           //@@@PH overwrite old character
    192           *(pConsoleBuffer->ppszLine[pConsoleBuffer->coordCursorPosition.Y] +
    193             pConsoleBuffer->coordCursorPosition.X * 2) = 0x20;
     188            go = TRUE;
     189          }
     190          else if (pConsoleBuffer->coordCursorPosition.Y > 0)
     191          {
     192            pConsoleBuffer->coordCursorPosition.Y--;
     193            pConsoleBuffer->coordCursorPosition.X = pConsoleBuffer->coordBufferSize.X - 1;
     194            go = TRUE;
     195          }
     196          if (go)
     197          {
     198            *(pConsoleBuffer->ppszLine[pConsoleBuffer->coordCursorPosition.Y] +
     199              pConsoleBuffer->coordCursorPosition.X * 2) = 0x20;
     200            VioWrtCharStr((PCH)" ", 1, pConsoleBuffer->coordCursorPosition.Y, pConsoleBuffer->coordCursorPosition.X, 0);
     201            VioSetCurPos(pConsoleBuffer->coordCursorPosition.Y, pConsoleBuffer->coordCursorPosition.X, 0);
     202          }
    194203          break;
     204        }
    195205
    196206        case 9: /* Tab */
    197         {
    198             rc = VioWrite
    199207          pConsoleBuffer->coordCursorPosition.X =
    200208            (pConsoleBuffer->coordCursorPosition.X
     
    206214              pConsoleBuffer->coordBufferSize.X)
    207215          {
    208             pConsoleBuffer->coordCursorPosition.X = 0;
     216            pConsoleBuffer->coordCursorPosition.X %= pConsoleBuffer->coordBufferSize.X;
    209217            pConsoleBuffer->coordCursorPosition.Y++;
    210218
     
    214222              if (pConsoleBuffer->dwConsoleMode & ENABLE_WRAP_AT_EOL_OUTPUT)
    215223              {
    216                 iConsoleBufferScrollUp(pConsoleBuffer,   /* scroll one line up */
    217                                        1);
    218                 pConsoleBuffer->coordCursorPosition.Y--;
     224                VioScrollUp(0, 0, pConsoleBuffer->coordWindowSize.Y-1, pConsoleBuffer->coordWindowSize.X-1,
     225                            1, &filler[0], 0);
     226                pConsoleBuffer->coordCursorPosition.Y = pConsoleBuffer->coordWindowSize.Y-1;
    219227              }
    220228            }
    221229          }
    222             break;
    223 #endif
     230          VioSetCurPos(pConsoleBuffer->coordCursorPosition.Y, pConsoleBuffer->coordCursorPosition.X, 0);
     231          break;
     232
    224233        case 13: /* CARRIAGE RETURN */
    225234            dprintf(("CR"));
Note: See TracChangeset for help on using the changeset viewer.