1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.jline;
20
21 import java.io.IOException;
22 import java.io.InputStream;
23 import java.io.OutputStream;
24 import java.io.PrintWriter;
25 import java.nio.charset.Charset;
26 import java.util.concurrent.Callable;
27 import java.util.concurrent.CompletableFuture;
28 import java.util.function.Consumer;
29 import java.util.function.IntConsumer;
30 import java.util.function.IntSupplier;
31
32 import org.jline.terminal.Attributes;
33 import org.jline.terminal.Cursor;
34 import org.jline.terminal.MouseEvent;
35 import org.jline.terminal.Size;
36 import org.jline.terminal.Terminal;
37 import org.jline.terminal.spi.SystemStream;
38 import org.jline.terminal.spi.TerminalExt;
39 import org.jline.terminal.spi.TerminalProvider;
40 import org.jline.utils.ColorPalette;
41 import org.jline.utils.InfoCmp;
42 import org.jline.utils.NonBlockingReader;
43
44 public class FastTerminal implements TerminalExt {
45
46 private final CompletableFuture<Terminal> terminal;
47
48 public FastTerminal(Callable<Terminal> builder, Consumer<Terminal> consumer) {
49 this.terminal = new CompletableFuture<>();
50 new Thread(
51 () -> {
52 try {
53 Terminal term = builder.call();
54 consumer.accept(term);
55 terminal.complete(term);
56 } catch (Exception e) {
57 terminal.completeExceptionally(e);
58 }
59 },
60 "fast-terminal-thread")
61 .start();
62 }
63
64 public TerminalExt getTerminal() {
65 try {
66 return (TerminalExt) terminal.get();
67 } catch (Exception e) {
68 throw new RuntimeException(e);
69 }
70 }
71
72 @Override
73 public String getName() {
74 return getTerminal().getName();
75 }
76
77 @Override
78 public SignalHandler handle(Signal signal, SignalHandler signalHandler) {
79 return getTerminal().handle(signal, signalHandler);
80 }
81
82 @Override
83 public void raise(Signal signal) {
84 getTerminal().raise(signal);
85 }
86
87 @Override
88 public NonBlockingReader reader() {
89 return getTerminal().reader();
90 }
91
92 @Override
93 public PrintWriter writer() {
94 return getTerminal().writer();
95 }
96
97 @Override
98 public Charset encoding() {
99 return getTerminal().encoding();
100 }
101
102 @Override
103 public InputStream input() {
104 return getTerminal().input();
105 }
106
107 @Override
108 public OutputStream output() {
109 return getTerminal().output();
110 }
111
112 @Override
113 public boolean canPauseResume() {
114 return getTerminal().canPauseResume();
115 }
116
117 @Override
118 public void pause() {
119 getTerminal().pause();
120 }
121
122 @Override
123 public void pause(boolean b) throws InterruptedException {
124 getTerminal().pause(b);
125 }
126
127 @Override
128 public void resume() {
129 getTerminal().resume();
130 }
131
132 @Override
133 public boolean paused() {
134 return getTerminal().paused();
135 }
136
137 @Override
138 public Attributes enterRawMode() {
139 return getTerminal().enterRawMode();
140 }
141
142 @Override
143 public boolean echo() {
144 return getTerminal().echo();
145 }
146
147 @Override
148 public boolean echo(boolean b) {
149 return getTerminal().echo(b);
150 }
151
152 @Override
153 public Attributes getAttributes() {
154 return getTerminal().getAttributes();
155 }
156
157 @Override
158 public void setAttributes(Attributes attributes) {
159 getTerminal().setAttributes(attributes);
160 }
161
162 @Override
163 public Size getSize() {
164 return getTerminal().getSize();
165 }
166
167 @Override
168 public void setSize(Size size) {
169 getTerminal().setSize(size);
170 }
171
172 @Override
173 public int getWidth() {
174 return getTerminal().getWidth();
175 }
176
177 @Override
178 public int getHeight() {
179 return getTerminal().getHeight();
180 }
181
182 @Override
183 public Size getBufferSize() {
184 return getTerminal().getBufferSize();
185 }
186
187 @Override
188 public void flush() {
189 getTerminal().flush();
190 }
191
192 @Override
193 public String getType() {
194 return getTerminal().getType();
195 }
196
197 @Override
198 public boolean puts(InfoCmp.Capability capability, Object... objects) {
199 return getTerminal().puts(capability, objects);
200 }
201
202 @Override
203 public boolean getBooleanCapability(InfoCmp.Capability capability) {
204 return getTerminal().getBooleanCapability(capability);
205 }
206
207 @Override
208 public Integer getNumericCapability(InfoCmp.Capability capability) {
209 return getTerminal().getNumericCapability(capability);
210 }
211
212 @Override
213 public String getStringCapability(InfoCmp.Capability capability) {
214 return getTerminal().getStringCapability(capability);
215 }
216
217 @Override
218 public Cursor getCursorPosition(IntConsumer intConsumer) {
219 return getTerminal().getCursorPosition(intConsumer);
220 }
221
222 @Override
223 public boolean hasMouseSupport() {
224 return getTerminal().hasMouseSupport();
225 }
226
227 @Override
228 public MouseTracking getCurrentMouseTracking() {
229 return getTerminal().getCurrentMouseTracking();
230 }
231
232 @Override
233 public boolean trackMouse(MouseTracking mouseTracking) {
234 return getTerminal().trackMouse(mouseTracking);
235 }
236
237 @Override
238 public MouseEvent readMouseEvent() {
239 return getTerminal().readMouseEvent();
240 }
241
242 @Override
243 public MouseEvent readMouseEvent(IntSupplier intSupplier) {
244 return getTerminal().readMouseEvent(intSupplier);
245 }
246
247 @Override
248 public MouseEvent readMouseEvent(String prefix) {
249 return getTerminal().readMouseEvent(prefix);
250 }
251
252 @Override
253 public MouseEvent readMouseEvent(IntSupplier reader, String prefix) {
254 return getTerminal().readMouseEvent(reader, prefix);
255 }
256
257 @Override
258 public boolean hasFocusSupport() {
259 return getTerminal().hasFocusSupport();
260 }
261
262 @Override
263 public boolean trackFocus(boolean b) {
264 return getTerminal().trackFocus(b);
265 }
266
267 @Override
268 public ColorPalette getPalette() {
269 return getTerminal().getPalette();
270 }
271
272 @Override
273 public void close() throws IOException {
274 getTerminal().close();
275 }
276
277 @Override
278 public TerminalProvider getProvider() {
279 return getTerminal().getProvider();
280 }
281
282 @Override
283 public SystemStream getSystemStream() {
284 return getTerminal().getSystemStream();
285 }
286
287 @Override
288 public String toString() {
289 return getTerminal().toString();
290 }
291 }