[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Using TeminalScreen.class to move cursor
[Thread Prev] | [Thread Next]
[Date Prev] | [Date Next]
- Subject: Re: Using TeminalScreen.class to move cursor
- From: Bruce Steers <bsteers4@xxxxxxxxx>
- Date: Sat, 30 Mar 2024 23:26:19 +0000
- To: user@xxxxxxxxxxxxxxxxxxxxxx
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
| Using TeminalScreen.class to move cursor | Bruce Steers <bsteers4@xxxxxxxxx> |
| Re: Using TeminalScreen.class to move cursor | Benoît Minisini <benoit.minisini@xxxxxxxxxxxxxxxx> |