27
27
import java .io .PrintWriter ;
28
28
import java .io .Writer ;
29
29
import java .nio .charset .Charset ;
30
- import java .nio .charset .StandardCharsets ;
31
30
import java .util .HashMap ;
32
31
import java .util .Map ;
33
32
43
42
* the writer() becomes the primary output, while the output() is bridged
44
43
* to the writer() using a WriterOutputStream wrapper.
45
44
*/
46
- public abstract class AbstractWindowsTerminal extends AbstractTerminal {
45
+ public abstract class AbstractWindowsTerminal < Console > extends AbstractTerminal {
47
46
48
47
public static final String TYPE_WINDOWS = "windows" ;
49
48
public static final String TYPE_WINDOWS_256_COLOR = "windows-256color" ;
@@ -70,7 +69,10 @@ public abstract class AbstractWindowsTerminal extends AbstractTerminal {
70
69
protected final Map <Signal , Object > nativeHandlers = new HashMap <>();
71
70
protected final ShutdownHooks .Task closer ;
72
71
protected final Attributes attributes = new Attributes ();
73
- protected final int originalConsoleMode ;
72
+ protected final Console inConsole ;
73
+ protected final Console outConsole ;
74
+ protected final int originalInConsoleMode ;
75
+ protected final int originalOutConsoleMode ;
74
76
75
77
protected final Object lock = new Object ();
76
78
protected boolean paused = true ;
@@ -80,17 +82,21 @@ public abstract class AbstractWindowsTerminal extends AbstractTerminal {
80
82
protected boolean focusTracking = false ;
81
83
private volatile boolean closing ;
82
84
83
- public AbstractWindowsTerminal (Writer writer , String name , String type , Charset encoding , boolean nativeSignals , SignalHandler signalHandler ) throws IOException {
85
+ public AbstractWindowsTerminal (Writer writer , String name , String type , Charset encoding , boolean nativeSignals , SignalHandler signalHandler ,
86
+ Console inConsole , Console outConsole ) throws IOException {
84
87
super (name , type , encoding , signalHandler );
85
88
NonBlockingPumpReader reader = NonBlocking .nonBlockingPumpReader ();
86
89
this .slaveInputPipe = reader .getWriter ();
87
90
this .reader = reader ;
88
91
this .input = NonBlocking .nonBlockingStream (reader , encoding ());
89
92
this .writer = new PrintWriter (writer );
90
93
this .output = new WriterOutputStream (writer , encoding ());
94
+ this .inConsole = inConsole ;
95
+ this .outConsole = outConsole ;
91
96
parseInfoCmp ();
92
97
// Attributes
93
- originalConsoleMode = getConsoleMode ();
98
+ this .originalInConsoleMode = getConsoleMode (inConsole );
99
+ this .originalOutConsoleMode = getConsoleMode (outConsole );
94
100
attributes .setLocalFlag (Attributes .LocalFlag .ISIG , true );
95
101
attributes .setControlChar (Attributes .ControlChar .VINTR , ctrl ('C' ));
96
102
attributes .setControlChar (Attributes .ControlChar .VEOF , ctrl ('D' ));
@@ -147,7 +153,7 @@ public OutputStream output() {
147
153
}
148
154
149
155
public Attributes getAttributes () {
150
- int mode = getConsoleMode ();
156
+ int mode = getConsoleMode (inConsole );
151
157
if ((mode & ENABLE_ECHO_INPUT ) != 0 ) {
152
158
attributes .setLocalFlag (Attributes .LocalFlag .ECHO , true );
153
159
}
@@ -173,7 +179,7 @@ protected void updateConsoleMode() {
173
179
if (tracking != MouseTracking .Off ) {
174
180
mode |= ENABLE_MOUSE_INPUT ;
175
181
}
176
- setConsoleMode (mode );
182
+ setConsoleMode (inConsole , mode );
177
183
}
178
184
179
185
protected int ctrl (char key ) {
@@ -196,7 +202,8 @@ protected void doClose() throws IOException {
196
202
}
197
203
reader .close ();
198
204
writer .close ();
199
- setConsoleMode (originalConsoleMode );
205
+ setConsoleMode (inConsole , originalInConsoleMode );
206
+ setConsoleMode (outConsole , originalOutConsoleMode );
200
207
}
201
208
202
209
static final int SHIFT_FLAG = 0x01 ;
@@ -487,9 +494,9 @@ public boolean trackMouse(MouseTracking tracking) {
487
494
return true ;
488
495
}
489
496
490
- protected abstract int getConsoleMode ();
497
+ protected abstract int getConsoleMode (Console console );
491
498
492
- protected abstract void setConsoleMode (int mode );
499
+ protected abstract void setConsoleMode (Console console , int mode );
493
500
494
501
/**
495
502
* Read a single input event from the input buffer and process it.
0 commit comments