From 951b6edccd2d93e2f5831d502882fb828e76bb1c Mon Sep 17 00:00:00 2001 From: Jonas 'Sortie' Termansen Date: Fri, 17 May 2013 15:30:13 +0200 Subject: [PATCH] Improve kernel terminal line editing. --- sortix/linebuffer.cpp | 9 ++++- sortix/linebuffer.h | 3 +- sortix/logterminal.cpp | 84 +++++++++++++++++++++++++++++++++--------- 3 files changed, 76 insertions(+), 20 deletions(-) diff --git a/sortix/linebuffer.cpp b/sortix/linebuffer.cpp index 1999d7e2..9f78ecdd 100644 --- a/sortix/linebuffer.cpp +++ b/sortix/linebuffer.cpp @@ -1,6 +1,6 @@ /******************************************************************************* - Copyright(C) Jonas 'Sortie' Termansen 2012. + Copyright(C) Jonas 'Sortie' Termansen 2012, 2013. This file is part of Sortix. @@ -99,6 +99,13 @@ namespace Sortix return buffer[index]; } + uint32_t LineBuffer::WouldBackspace() const + { + if ( !CanBackspace() ) { return 0; } + size_t index = OffsetIndex(bufferoffset, bufferused-1, bufferlength); + return buffer[index]; + } + void LineBuffer::Commit() { buffercommitted = bufferfrozen = bufferused; diff --git a/sortix/linebuffer.h b/sortix/linebuffer.h index 303137ea..815ff5b1 100644 --- a/sortix/linebuffer.h +++ b/sortix/linebuffer.h @@ -1,6 +1,6 @@ /******************************************************************************* - Copyright(C) Jonas 'Sortie' Termansen 2012. + Copyright(C) Jonas 'Sortie' Termansen 2012, 2013. This file is part of Sortix. @@ -38,6 +38,7 @@ namespace Sortix uint32_t Pop(); uint32_t Peek() const; uint32_t Backspace(); + uint32_t WouldBackspace() const; void Commit(); void Freeze(); bool CanPop() const; diff --git a/sortix/logterminal.cpp b/sortix/logterminal.cpp index 6ff11baf..7a3df6c3 100644 --- a/sortix/logterminal.cpp +++ b/sortix/logterminal.cpp @@ -22,27 +22,31 @@ *******************************************************************************/ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include +#include #include #include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include "utf8.h" #include "logterminal.h" @@ -166,6 +170,50 @@ void LogTerminal::ProcessKeystroke(int kbkey) return; } + if ( termmode & TERMMODE_LINEBUFFER && control && kbkey == KBKEY_W ) + { + bool had_non_whitespace = false; + c_w_delete_more: + if ( !linebuffer.CanBackspace() ) { return; } + uint32_t delchar = linebuffer.WouldBackspace(); + bool waskbkey = KBKEY_DECODE(delchar); + bool wasuni = !waskbkey; + bool whitespace = + (wasuni && (delchar == ' ' || + delchar == '\t' || + delchar == '\n')) || + (waskbkey && (abs(KBKEY_DECODE(delchar)) == -KBKEY_SPACE || + abs(KBKEY_DECODE(delchar)) == -KBKEY_TAB || + abs(KBKEY_DECODE(delchar)) == -KBKEY_ENTER)); + if ( wasuni && whitespace && had_non_whitespace ) + return; + if ( wasuni && !whitespace ) + had_non_whitespace = true; + linebuffer.Backspace(); + if ( (!waskbkey || termmode & TERMMODE_KBKEY) && + (!wasuni || termmode & TERMMODE_UNICODE) && + termmode & TERMMODE_ECHO && + wasuni ) + Log::Print("\b"); + goto c_w_delete_more; + } + + if ( termmode & TERMMODE_LINEBUFFER && control && kbkey == KBKEY_U ) + { + while ( linebuffer.CanBackspace() ) + { + uint32_t delchar = linebuffer.Backspace(); + bool waskbkey = KBKEY_DECODE(delchar); + bool wasuni = !waskbkey; + if ( (!waskbkey || termmode & TERMMODE_KBKEY) && + (!wasuni || termmode & TERMMODE_UNICODE) && + termmode & TERMMODE_ECHO && + wasuni ) + Log::Print("\b"); + } + return; + } + uint32_t unikbkey = KBKEY_ENCODE(kbkey); QueueUnicode(unikbkey); uint32_t unicode = kblayout->Translate(kbkey);