1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124 | -------------------------------------------------------------------------------
-- Copyright 2021, The Trendy Terminal Developers (see AUTHORS file)
-- Licensed under the Apache License, Version 2.0 (the "License");
-- you may not use this file except in compliance with the License.
-- You may obtain a copy of the License at
-- http://www.apache.org/licenses/LICENSE-2.0
-- Unless required by applicable law or agreed to in writing, software
-- distributed under the License is distributed on an "AS IS" BASIS,
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-- See the License for the specific language governing permissions and
-- limitations under the License.
-------------------------------------------------------------------------------
with Ada.Strings.Fixed;
with Ada.Text_IO;
with Trendy_Terminal.Maps;
with Trendy_Terminal.Platform;
package body Trendy_Terminal.VT100 is
use Trendy_Terminal.Maps;
procedure Cursor_Left is
begin
Platform.Put (CSI & "1D");
end Cursor_Left;
procedure Cursor_Right is
begin
Platform.Put (CSI & "1C");
end Cursor_Right;
procedure Cursor_Down is
begin
Platform.Put (CSI & "B");
end Cursor_Down;
procedure Cursor_Up is
begin
Platform.Put (CSI & "A");
end Cursor_Up;
procedure Hide_Cursor is
begin
Platform.Put (CSI & "?25l");
end Hide_Cursor;
procedure Show_Cursor is
begin
Platform.Put (CSI & "?25h");
end Show_Cursor;
procedure Scroll_Down is
begin
Platform.Put (CSI & "T");
end Scroll_Down;
procedure Scroll_Up is
begin
Platform.Put (CSI & "S");
end Scroll_Up;
procedure Cursor_Next_Line is
begin
Platform.Put (CSI & "E");
end Cursor_Next_Line;
procedure Erase is
begin
Platform.Put (CSI & 'X');
end Erase;
procedure Beginning_Of_Line is
begin
Platform.Put (CSI & "1G");
end Beginning_Of_Line;
procedure Clear_Line is
begin
Platform.Put (CSI & 'K');
end Clear_Line;
procedure Report_Cursor_Position is
begin
Platform.Put (CSI & "6n");
end Report_Cursor_Position;
procedure Set_Cursor_Position (C : Cursor_Position) is
use Ada.Strings;
use Ada.Strings.Fixed;
begin
Platform.Put (CSI & Trim (C.Row'Image, Left) & ";" & Trim (C.Col'Image, Left) & "H");
end Set_Cursor_Position;
function Get_Cursor_Position return VT100.Cursor_Position is
begin
loop
VT100.Report_Cursor_Position;
declare
Result : constant String := Platform.Get_Input;
Semicolon_Index : constant Natural := Ada.Strings.Fixed.Index(Result, ";", 1);
Row : Integer := 1;
Col : Integer := 1;
begin
-- The cursor position is reported as
-- ESC [ ROW ; COL R
-- May throw on bad parse.
Row := Integer'Value(Result(3 .. Semicolon_Index - 1));
Col := Integer'Value(Result(Semicolon_Index + 1 .. Result'Length - 1));
return VT100.Cursor_Position'(Row => Row, Col => Col);
exception
-- Bad parse due to existing input on the line.
when Constraint_Error =>
null;
end;
end loop;
end Get_Cursor_Position;
end Trendy_Terminal.VT100;
|