X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;ds=sidebyside;f=Usermode%2FApplications%2Fgui_terminal_src%2Fdisplay.c;h=7c60c9fa90d27d58c748e86772a5949a94d7193b;hb=d054bf40d18fadaf90c28c8703d332efd3a55dad;hp=ab39f9ffa682f4759de8b927947e885aefc56686;hpb=4493cf58800c6c9b145f07551922fdbd030d408d;p=tpg%2Facess2.git diff --git a/Usermode/Applications/gui_terminal_src/display.c b/Usermode/Applications/gui_terminal_src/display.c index ab39f9ff..7c60c9fa 100644 --- a/Usermode/Applications/gui_terminal_src/display.c +++ b/Usermode/Applications/gui_terminal_src/display.c @@ -5,6 +5,7 @@ * display.c * - Abstract display manipulation methods */ +#define DEBUG 0 #include "include/display.h" #include // _SysDebug #include // exit @@ -16,6 +17,12 @@ #include #include +#if DEBUG +# define DEBUGS(v...) _SysDebug(v) +#else +# define DEBUGS(v...) do{}while(0) +#endif + #define UNIMPLIMENTED() do{_SysDebug("UNIMPLIMENTED %s", __func__); exit(-1);}while(0) static inline int MIN(int a, int b) { return (a < b ? a : b); } @@ -23,6 +30,7 @@ static inline int MAX(int a, int b) { return (a > b ? a : b); } // === EXTERN == extern tHWND gMainWindow; +extern int giPTYHandle; typedef struct sLine tLine; @@ -35,6 +43,8 @@ struct sLine { }; struct sTerminal { + void *TermState; + int ViewCols; int ViewRows; @@ -51,6 +61,9 @@ struct sTerminal { bool bUsingAltBuf; bool bHaveSwappedBuffers; + + int OtherBufRow; + int OtherBufCol; size_t ViewOffset; size_t TotalLines; @@ -87,6 +100,18 @@ tTerminal *Display_Init(int Cols, int Lines, int ExtraScrollbackLines) return term; } +void *Display_GetTermState(tTerminal *Term) { + return Term->TermState; +} +void Display_SetTermState(tTerminal *Term, void *State) { + Term->TermState = State; +} + +void Display_SendInput(tTerminal *Term, const char *String) +{ + _SysWrite(giPTYHandle, String, strlen(String)); +} + // Return the byte length of a single on-screen character size_t _GetCharLength(size_t AvailLength, const char *Text, uint32_t *BaseCodepoint) { @@ -126,6 +151,8 @@ size_t Display_int_PushCharacter(tTerminal *Term, size_t AvailLength, const char if( bOverwrite ) { //_SysDebug("GetCharLen(%i-%i, %p+%i, NULL)", lineptr->Len, Term->CursorByte, // lineptr->Data, Term->CursorByte); + if( Term->CursorByte ) + assert(lineptr->Data); size_t nextlen = _GetCharLength( lineptr->Len-Term->CursorByte, lineptr->Data+Term->CursorByte, @@ -181,7 +208,7 @@ size_t Display_int_PushCharacter(tTerminal *Term, size_t AvailLength, const char void Display_AddText(tTerminal *Term, size_t Length, const char *UTF8Text) { - _SysDebug("%i '%.*s'", Length, Length, UTF8Text); + DEBUGS("%i += %i '%.*s'", Term->CursorRow, Length, Length, UTF8Text); while( Length > 0 ) { if( Term->CursorCol == Term->ViewCols ) { @@ -282,7 +309,7 @@ void Display_ScrollDown(tTerminal *Term, int Count) assert(Count < max); assert(Count > -max); - _SysDebug("Scroll %p %i-%i down by %i", buffer, top, max, Count); + DEBUGS("Scroll %p %i-%i down by %i", buffer, top, max, Count); buffer += top; @@ -314,7 +341,8 @@ void Display_ScrollDown(tTerminal *Term, int Count) buffer[i].Size = 0; buffer[i].IsDirty = true; } - // TODO: Send scroll command to GUI + // Send scroll command to GUI + AxWin3_RichText_ScrollRange(gMainWindow, top, max, Count); Display_int_SetCursor(Term, Term->CursorRow, Term->CursorCol); } @@ -324,19 +352,18 @@ void Display_SetCursor(tTerminal *Term, int Row, int Col) assert(Row >= 0); assert(Col >= 0); - _SysDebug("Set cursor R%i,C%i", Row, Col); + DEBUGS("Set cursor R%i,C%i", Row, Col); if( !Term->bUsingAltBuf ) { _SysDebug("NOTE: Using \\e[%i;%iH outside of alternat buffer is undefined", Row, Col); } // NOTE: This may be interesting outside of AltBuffer - Term->CursorRow = Row; - Display_int_SetCursor(Term, Row, Col); } void Display_int_SetCursor(tTerminal *Term, int Row, int Col) { + Term->CursorRow = Row; tLine *line = Display_int_GetCurLine(Term); size_t ofs = 0; int i; @@ -408,6 +435,8 @@ void Display_ClearLine(tTerminal *Term, int Dir) // 0: All, 1: Forward, -1: Reve free(line->Data); line->Data = NULL; line->IsDirty = true; + Term->CursorCol = 0; + Term->CursorByte = 0; } else if( Dir == 1 ) { @@ -444,6 +473,11 @@ void Display_ClearLines(tTerminal *Term, int Dir) // 0: All, 1: Forward, -1: Rev } } +void Display_ResetAttributes(tTerminal *Term) +{ + Display_SetForeground(Term, 0xFFFFFF); + Display_SetBackground(Term, 0x000000); +} void Display_SetForeground(tTerminal *Term, uint32_t RGB) { char buf[7+1]; @@ -462,6 +496,7 @@ void Display_Flush(tTerminal *Term) { int viewOfs = (Term->bUsingAltBuf ? 0 : Term->ViewOffset); tLine *buffer = (Term->bUsingAltBuf ? Term->AltBuf : Term->PriBuf ); + AxWin3_RichText_SetLineCount(gMainWindow, (Term->bUsingAltBuf ? Term->ViewRows : Term->TotalLines)); for( int i = 0; i < Term->ViewRows; i ++ ) { int line = (viewOfs + i) % Term->TotalLines; @@ -469,10 +504,10 @@ void Display_Flush(tTerminal *Term) // Swapping buffers should cause a full resend if( !Term->bHaveSwappedBuffers && !lineptr->IsDirty ) continue; - _SysDebug("Line %i+%i %p '%.*s'", viewOfs, i, lineptr->Data, lineptr->Len, lineptr->Data); + DEBUGS("Line %i+%i %p '%.*s'", viewOfs, i, lineptr->Data, lineptr->Len, lineptr->Data); AxWin3_RichText_SendLine(gMainWindow, viewOfs + i, lineptr->Data ? lineptr->Data : "" ); - lineptr->IsDirty = 0; + lineptr->IsDirty = false; } AxWin3_RichText_SetCursorPos(gMainWindow, Term->CursorRow, Term->CursorCol); Term->bHaveSwappedBuffers = false; @@ -485,6 +520,11 @@ void Display_ShowAltBuffer(tTerminal *Term, bool AltBufEnabled) // Nothing to do, so do nothing return ; } + + int row = Term->OtherBufRow; + int col = Term->OtherBufCol; + Term->OtherBufRow = Term->CursorRow; + Term->OtherBufCol = Term->CursorCol; Term->bUsingAltBuf = AltBufEnabled; Term->bHaveSwappedBuffers = true; @@ -494,6 +534,17 @@ void Display_ShowAltBuffer(tTerminal *Term, bool AltBufEnabled) { Term->AltBuf = calloc( sizeof(Term->AltBuf[0]), Term->ViewRows ); } + AxWin3_RichText_SetLineCount(gMainWindow, Term->ViewRows); } + else + { + AxWin3_RichText_SetLineCount(gMainWindow, Term->TotalLines); + } + Display_int_SetCursor(Term, row, col); +} + +void Display_SetTitle(tTerminal *Term, const char *Title) +{ + _SysDebug("TODO: Set window title to '%s'", Title); }