[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Using TeminalScreen.class to move cursor
[Thread Prev] | [Thread Next]
- Subject: Re: Using TeminalScreen.class to move cursor
- From: Bruce Steers <bsteers4@xxxxxxxxx>
- Date: Sat, 6 Apr 2024 21:35:49 +0100
- To: user@xxxxxxxxxxxxxxxxxxxxxx
On Sat, 6 Apr 2024 at 20:11, Brian G <brian@xxxxxxxxxxxxxxxx> wrote:
> Why would you not just use the absolute position escape sequence after
> calculating the needed position from your text buffer?
>
> '\e[vpos;hposH'
>
> or move n pos left or right
>
> '\e[nspacesD' '\e24D' or '\e[nspacesC' '\e2C'
>
> Maybe I don't understand, But it seems correct to not be moving the cursor
> around bit by bit, but just put it where you want.
>
> Select Case iCode
> Case Key.Up
> sText = If(.AppCursorKey, "\eOA", subst("\e[&1A",len))
> Case Key.Down
> sText = If(.AppCursorKey, "\eOB", subst("\e[&1B",len))
> Case Key.Right
> sText = If(.AppCursorKey, "\eOC", subst("\e[&1C",len))
> Case Key.Left
> sText = If(.AppCursorKey, "\eOD", subst("\e[&1D",len))
> End Select
>
> 'sText = String(Len, sText)
>
That did not work :( it just printed D when i hit Ctrl+Left (the code was
correct '\e[15D' )
i think terminalview is handling it differently (i'm having to hack the
private api to make it work).
the commands seem to work if i use the recommended TerminalView.Print()
command but then i cannot move cursor right like before as it does not
update the cursor position so it thinks i'm still where i was before the
move.
The code I have that sends an amount of right or left escape sequences is
currently the only thing i've got working correctly.
Respects
BruceS
On 4/5/24 17:52, Bruce Steers wrote:
>
> Finally got something working...
> This CtrlMove function is called with Key.Code as argument if Ctrl key +
> Arrow key is hit.
> Left and right moves to previous/next white space
> Up and Down moves cursor up or down lines.
>
> The CtrlMove function is dirty and my code probably sucks but at least the
> MoveCursor function now works, the terminalview updates it's cursor
> position okay this way.
>
> Please feel free to suggest/implement a better method :)
>
>
> Public Sub MoveCursor(iCode As Integer, Optional Len As Integer = 1)
>
> Dim sText As String
>
> Select Case iCode
> Case Key.Up
> sText = String(TerminalView1.ScreenWidth, "\e[D")
> Case Key.Down
> sText = String(TerminalView1.ScreenWidth, "\e[C")
> Case Key.Right
> sText = "\e[C"
> Case Key.Left
> sText = "\e[D"
> End Select
>
> sText = String(Len, sText)
>
> Dim hProcess As Stream = TerminalView1.GetOutputStream()
> If TerminalView1._OutputTimer().Enabled Then
> TerminalView1._OutputTimer().Trigger
>
> Wait
>
> If hProcess Then
> Print #hProcess, sText;
> Endif
>
> TerminalView1.ResetStart()
>
> End
>
>
> Public Sub CtrlMove(KeyCode As Integer)
>
> If KeyCode = Key.Up Or If KeyCode = Key.Down Then
> MoveCursor(KeyCode)
> Return
> Endif
>
> Dim iDist As Integer
> Dim iFind As Integer
> Dim sLine As String = GetCommand() ' get current command line string
> Dim iAbove As Integer = TerminalView1.Count - 1 - TerminalView1.Line '
> how many lines above the EOL is the cursor
>
> ' get command line text position relevant to cursor pos
> Dim iPos As Integer = TerminalView1.Column - Me.PromtLen + ((sLine.Len \
> TerminalView1.ScreenWidth) * TerminalView1.ScreenWidth)
> iPos -= (iAbove * TerminalView1.ScreenWidth)
> iPos = Max(0, Min(sLine.Len, iPos))
>
> If KeyCode = Key.Left Then
> iFind = RInStr(sLine, " ", Max(1, iPos - 1))
> If iPos > 0 And If iFind > 0 Then
> iDist = iPos - iFind + 1
> Else
> iDist = iPos
> Endif
> Else
> iFind = InStr(sLine, " ", iPos + 2)
> If iFind > 0 Then
> iDist = iFind - iPos - 1
> Else
> iDist = Max(0, sLine.Len - iPos)
> Endif
> Endif
>
> MoveCursor(KeyCode, iDist)
>
> End
>
> Pretty odd that the terminalview cannot realize position change when just
> using TerminalView.Print() though.
> Also this way if the cursor is on Column 0 moving left will go up to the
> end of the previous line (just like pressing left key),
> when using TerminalView.Print() the left escape would only go left and not
> go up to previous line.
> Respects
> BruceS
>
>
> On Sat, 30 Mar 2024 at 23:26, Bruce Steers <bsteers4@xxxxxxxxx> wrote:
>
>>
>>
>> On Sat, 30 Mar 2024 at 09:31, Benoît Minisini <
>> benoit.minisini@xxxxxxxxxxxxxxxx> wrote:
>>
>>> Le 30/03/2024 à 02:40, Bruce Steers a écrit :
>>> > If i move the cursor by using TerminalScreen what am i missing to
>>> update
>>> > the view?
>>> >
>>> > For example this code...
>>> >
>>> > Public Sub btnMoveLeft_Click()
>>> >
>>> > TerminalView1._GetCurrentScreen().CursorLeft()
>>> >
>>> > End
>>> >
>>> > That moves the cursor left , if the cursor was initially at eol then
>>> if
>>> > i use the keyboard to go right the terminal thinks i am at eol still
>>> and
>>> > blinks and does not move.
>>> >
>>> > So either i need a way to move the cursor that updates the terminal
>>> > properly/correctly
>>> > or i need to update it manually after the position move.
>>> >
>>> > Can't figure out what i'm missing in how the terminalview works.
>>> >
>>> > (yes i know i'm tinkering with a hidden function of the internal API ,
>>> > but i couldn't find any other way, so how must I do it properly?)
>>> >
>>> > Cheers for any info/solutions
>>> > BruceS
>>> >
>>>
>>> You must use the 'TerminalView.Print()' method and send VT-100 escape
>>> codes if you want to move the cursor.
>>>
>>> Regards,
>>>
>>> --
>>> Benoît Minisini.
>>>
>>
>> That was the first method i tried. (i studied VT100 class InputTo to get
>> the escape chars I used)
>> But I get the same result. using TerminalView1.Print("\e[D")
>>
>> This is my code...
>> It is used to move the cursor and stop at a space if I'm holding Ctrl key
>> when hitting an arrow key.
>> the cursor goes left just fine but then i cannot move it right unless i
>> use Ctrl key again and Key.Right to run my code
>> If i press right key with no Ctrl then it flashes like i'm still at end
>> of line.
>>
>> I need to tell the terminalview of the position change (i just can't
>> figure out the workaround)
>> Or a better way to trigger a left/right move
>>
>> Respects
>> BruceS
>>
>> Public Sub TerminalView1_KeyPress()
>>
>> If Key.Control Then
>> If Key.Code = Key.Left Then
>> GotoSpace(True)
>> Else If Key.Code = Key.Right Then
>> GotoSpace
>> Endif
>> Endif
>>
>> End
>>
>> Public Sub IsWordChar(C As String) As Boolean
>>
>> If Len(C) = 1 Then
>> If IsLetter(C) Or If IsDigit(C) Then Return True
>> If InStr(":./_", C) Then Return True ' don't stop at these chars
>> Else
>> Return
>> Endif
>>
>> End
>>
>> Public Sub MoveCursor(iCode As Integer, Optional Len As Integer = 1)
>>
>> Dim sText As String
>>
>> With TerminalView1._GetCurrentScreen()
>>
>> Select Case iCode
>> Case Key.Up
>> sText = If(.AppCursorKey, "\eOA", "\e[A")
>> Case Key.Down
>> sText = If(.AppCursorKey, "\eOB", "\e[B")
>> Case Key.Right
>> sText = If(.AppCursorKey, "\eOC", "\e[C")
>> Case Key.Left
>> sText = If(.AppCursorKey, "\eOD", "\e[D")
>> End Select
>> End With
>>
>> sText = String(Len, sText)
>> If sText Then TerminalView1.Print(sText)
>>
>> End
>>
>> Public Sub GotoSpace(Optional GoLeft As Boolean)
>>
>> Dim iPrompt As Integer = FindPromptLine()
>> Dim sChar As String
>> Dim bWordChar As Boolean
>> Dim bStartIsWordChar As Boolean = IsWordChar(TerminalView1.CharAt())
>>
>> Do
>> If GoLeft Then
>> If TerminalView1.Line = iPrompt And If TerminalView1.Column =
>> Me.PromtLen Then Return
>> If TerminalView1.Column = 0 Then
>> MoveCursor(Key.Up)
>> MoveCursor(Key.Right, TerminalView1.ScreenWidth)
>> Endif
>> MoveCursor(Key.Left)
>> Else
>> If TerminalView1.Line = TerminalView1.Count - 1 And If
>> TerminalView1.Column = TerminalView1.GetLineLength() Then Return
>> If TerminalView1.Column = TerminalView1.ScreenWidth - 1 Then
>> MoveCursor(Key.Left, TerminalView1.ScreenWidth)
>> MoveCursor(Key.Down)
>> Endif
>> MoveCursor(Key.Right)
>> Endif
>>
>> sChar =
>> TerminalView1._GetCurrentScreen().Lines[TerminalView1.Line].Text[TerminalView1.Column]
>> bWordChar = IsWordChar(sChar)
>>
>> If Not bStartIsWordChar And If bWordChar Then
>> bStartIsWordChar = True
>> Continue
>> Else If bStartIsWordChar And If Not bWordChar Then
>> Break
>> Endif
>>
>> If TerminalView1.Line < iPrompt Then Break
>> If TerminalView1.Line = iPrompt And If TerminalView1.Column =
>> Me.PromtLen Then Break
>> If TerminalView1.Line >= TerminalView1.Count - 1 And If
>> TerminalView1.Column >= TerminalView1.GetLineLength() - 1 Then Break
>> Loop
>>
>> TerminalView1.Refresh
>>
>> End
>>
> --
> ~~~~ Brian
>
>
Re: Using TeminalScreen.class to move cursor | Bruce Steers <bsteers4@xxxxxxxxx> |
Re: Using TeminalScreen.class to move cursor | Bruce Steers <bsteers4@xxxxxxxxx> |
Re: Using TeminalScreen.class to move cursor | Brian G <brian@xxxxxxxxxxxxxxxx> |