diff --git a/comp/src/gb.form.terminal/.src/TerminalView/CTerminalLine.class b/comp/src/gb.form.terminal/.src/TerminalView/CTerminalLine.class index a5e562b12..e41ded519 100644 --- a/comp/src/gb.form.terminal/.src/TerminalView/CTerminalLine.class +++ b/comp/src/gb.form.terminal/.src/TerminalView/CTerminalLine.class @@ -18,7 +18,7 @@ Public Sub GetAttr(hAttr As TerminalAttr, X As Integer) hAttr.Bright = iAttr And &H200 hAttr.Dim = iAttr And &H400 hAttr.Reverse = iAttr And &H800 - hAttr.Underline = iAttr And &H1000 + hAttr.Underscore = iAttr And &H1000 hAttr.Blink = iAttr And &H2000 End @@ -32,7 +32,7 @@ Public Sub SetAttr(hAttr As TerminalAttr, X As Integer, Optional L As Integer = If hAttr.Bright Then iAttr += &H200 If hAttr.Dim Then iAttr += &H400 If hAttr.Reverse Then iAttr += &H800 - If hAttr.Underline Then iAttr += &H1000 + If hAttr.Underscore Then iAttr += &H1000 If hAttr.Blink Then iAttr += &H2000 If iAttr = 0 And X + L >= Attr.Count Then diff --git a/comp/src/gb.form.terminal/.src/TerminalView/FTestTerminalView.class b/comp/src/gb.form.terminal/.src/TerminalView/FTestTerminalView.class index e41166a50..17a53e7d5 100644 --- a/comp/src/gb.form.terminal/.src/TerminalView/FTestTerminalView.class +++ b/comp/src/gb.form.terminal/.src/TerminalView/FTestTerminalView.class @@ -2,7 +2,8 @@ Public Sub TextBox1_Activate() - TerminalView1.Exec(Split(TextBox1.Text, " ", Chr$(34))) + Try TerminalView1.Exec(Split(TextBox1.Text, " ", Chr$(34))) + If Error Then Debug Error.Text End diff --git a/comp/src/gb.form.terminal/.src/TerminalView/TerminalAttr.class b/comp/src/gb.form.terminal/.src/TerminalView/TerminalAttr.class index 6eea7e4f7..3177338b1 100644 --- a/comp/src/gb.form.terminal/.src/TerminalView/TerminalAttr.class +++ b/comp/src/gb.form.terminal/.src/TerminalView/TerminalAttr.class @@ -7,7 +7,7 @@ Public Background As Integer = -1 Public Bold As Boolean Public Bright As Boolean Public Dim As Boolean -Public Underline As Boolean +Public Underscore As Boolean Public Reverse As Boolean Public Blink As Boolean @@ -18,7 +18,7 @@ Public Sub Reset() Bold = False Bright = False {Dim} = False - Underline = False + Underscore = False Reverse = False Blink = False diff --git a/comp/src/gb.form.terminal/.src/TerminalView/TerminalFilter_VT100.class b/comp/src/gb.form.terminal/.src/TerminalView/TerminalFilter_VT100.class index 59770b38d..ba5944b76 100644 --- a/comp/src/gb.form.terminal/.src/TerminalView/TerminalFilter_VT100.class +++ b/comp/src/gb.form.terminal/.src/TerminalView/TerminalFilter_VT100.class @@ -6,11 +6,14 @@ Private $sLeft As String Private $X As Integer Private $Y As Integer +Private Enum MODE_NORMAL, MODE_TITLE + Public Sub OutputTo(hView As TerminalView, sData As String) Dim iPos As Integer Dim iPos2 As Integer Dim iCode As Integer + Dim iMode As Integer If $sLeft Then sData = $sLeft & sData @@ -18,6 +21,18 @@ Public Sub OutputTo(hView As TerminalView, sData As String) Inc iPos + If iMode = MODE_TITLE Then + iPos2 = InStr(sData, Chr$(7), iPos) + If iPos2 = 0 Then + $sLeft = Mid$(sData, iPos) + Return + Endif + Debug Mid$(sData, iPos, iPos2 - iPos) + iMode = MODE_NORMAL + iPos = iPos2 + Continue + Endif + iPos2 = InStr(sData, Chr$(27), iPos) If iPos2 = 0 Then hView.Print(Mid$(sData, iPos)) @@ -46,7 +61,7 @@ Public Sub OutputTo(hView As TerminalView, sData As String) Loop - Escape(hView, Mid$(sData, iPos2 + 1, iPos - iPos2)) + iMode = Escape(hView, sData, iPos2 + 1, iPos - iPos2) Loop @@ -54,11 +69,17 @@ End ' Escape sequence without the initial 27 character. -Private Sub Escape(hView As TerminalView, sStr As String) +Private Sub Escape(hView As TerminalView, sData As String, iPos As Integer, iLen As Integer) As Integer Dim Y As Integer Dim X As Integer Dim aArg As String[] + Dim sArg As String + Dim iArg As Integer + Dim sStr As String + Dim iMode As Integer + + sStr = Mid$(sData, iPos, iLen) Select Case Left(sStr) @@ -71,6 +92,10 @@ Private Sub Escape(hView As TerminalView, sStr As String) hView.CursorGoto($X, $Y) + Case "]" + + iMode = MODE_TITLE + Case "[" Select Case Right(sStr) @@ -89,6 +114,46 @@ Private Sub Escape(hView As TerminalView, sStr As String) hView.EraseEndOfLine + Case "m" ' Set attribute + + GoSub GET_ARGS + For Each sArg In aArg + + Try iArg = CInt(sArg) + If Error Then Continue + + Select Case iArg + + Case 0 + hView.Attr.Reset() + Case 1 + hView.Attr.Bright = True + Case 2 + hView.Attr.Dim = True + Case 4 + hView.Attr.Underline = True + Case 7 + hView.Attr.Reverse = True + Case 21 + hView.Attr.Bright = False + Case 22 + hView.Attr.Dim = False + Case 24 + hView.Attr.Underline = False + Case 27 + hView.Attr.Reverse = False + Case 30 To 37 + hView.Attr.Background = iArg - 30 + Case 39 + hView.Attr.Background = -1 + Case 40 To 47 + hView.Attr.Foreground = iArg - 30 + Case 49 + hView.Attr.Foreground = -1 + + End Select + Next + Case "s" ' Save cursor $X = hView.Column @@ -102,7 +167,7 @@ Private Sub Escape(hView As TerminalView, sStr As String) End Select - Return + Return iMode GET_ARGS: diff --git a/comp/src/gb.form.terminal/.src/TerminalView/TerminalView.class b/comp/src/gb.form.terminal/.src/TerminalView/TerminalView.class index ce5578e14..c76c6683c 100644 --- a/comp/src/gb.form.terminal/.src/TerminalView/TerminalView.class +++ b/comp/src/gb.form.terminal/.src/TerminalView/TerminalView.class @@ -248,7 +248,7 @@ DRAW_TEXT: Paint.DrawText(sText, X + 1, Y + $iAscent) If hAttr.Bold Then Paint.DrawText(sText, X + 2, Y + $iAscent) Endif - If hAttr.Underline Then Paint.FillRect(X, Y + $LH - 1, iLen * $CW, 1, Paint.Background) + If hAttr.Underscore Then Paint.FillRect(X, Y + $LH - 1, iLen * $CW, 1, Paint.Background) X += iLen * $CW P = I Return @@ -391,6 +391,7 @@ Public Sub Print(sText As String) If iLen >= Len(sText) Then Break iCode = Asc(sText, iLen + 1) Select Case iCode + Case 7 Case 8 If $X Then Dec $X @@ -475,10 +476,17 @@ Private Function Attr_Read() As TerminalAttr End -Public Sub EnsureVisible() +Private Sub EnsureVisibleAt(X As Integer, Y As Integer) - GetLine($Y) - $hView.EnsureVisible($X * $CW, $Y * $LH, $CW, $LH) + GetLine(Y) + $hView.EnsureVisible(X * $CW, Y * $LH, $CW, $LH) + +End + + +Public Sub EnsureVisible() + + EnsureVisibleAt($X, $Y) End @@ -495,7 +503,7 @@ Private Sub Foreground_Write(Value As Integer) End -Private Sub GotoMouse() +Private Sub GotoMouse(bStart As Boolean) Dim X As Integer Dim Y As Integer @@ -503,20 +511,26 @@ Private Sub GotoMouse() X = (Mouse.ScreenX - $hView.ScreenX) \ $CW Y = (Mouse.ScreenY - $hView.ScreenY + $hView.ScrollY) \ $LH - Goto(Max(0, Min($W - 1, X)), Max(0, Min(Max($aLine.Max, $hView.ClientH \ $LH - 1), Y))) - EnsureVisible + X = Max(0, Min($W - 1, X)) + Y = Max(0, Min(Max($aLine.Max, $hView.ClientH \ $LH - 1), Y)) + + If bStart Then + $X1 = X + $Y1 = Y + Endif + $X2 = X + $Y2 = Y + + Refresh + + EnsureVisibleAt(X, Y) End Public Sub View_MouseDown() $bMouseDown = True - GotoMouse - $X1 = $X - $Y1 = $Y - $X2 = $X - $Y2 = $Y - + GotoMouse(True) $hMouseTimer = New Timer(50) As "MouseTimer" End @@ -524,9 +538,7 @@ End Public Sub View_MouseMove() If $bMouseDown Then - GotoMouse - $X2 = $X - $Y2 = $Y + GotoMouse(False) Endif End @@ -605,10 +617,7 @@ End Public Sub MouseTimer_Timer() - GotoMouse - $X2 = $X - $Y2 = $Y - EnsureVisible + GotoMouse(False) End @@ -766,7 +775,7 @@ Public Sub Exec(aCommand As String[]) As Process If $hProcess Then Return - $hProcess = Exec aCommand For Input Output As "Process" + $hProcess = Exec aCommand With ["TERM=xterm"] For Input Output As "Process" End @@ -774,7 +783,7 @@ Public Sub Shell(sCommand As String) As Process If $hProcess Then Return - $hProcess = Shell sCommand For Input Output As "Process" + $hProcess = Shell sCommand With ["TERM=xterm"] For Input Output As "Process" End