Skip to content

Commit c9d4c74

Browse files
Disable single character mode in the terminal when exiting flutter_tools (#146534)
1 parent aff5477 commit c9d4c74

File tree

4 files changed

+21
-2
lines changed

4 files changed

+21
-2
lines changed

packages/flutter_tools/lib/executable.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ Future<void> main(List<String> args) async {
136136
// So that we don't animate anything before calling applyFeatureFlags, default
137137
// the animations to disabled in real apps.
138138
defaultCliAnimationEnabled: false,
139+
shutdownHooks: globals.shutdownHooks,
139140
);
140141
// runner.run calls "terminal.applyFeatureFlags()"
141142
},

packages/flutter_tools/lib/src/base/terminal.dart

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import '../features.dart';
77
import 'io.dart' as io;
88
import 'logger.dart';
99
import 'platform.dart';
10+
import 'process.dart';
1011

1112
enum TerminalColor {
1213
red,
@@ -164,11 +165,14 @@ class AnsiTerminal implements Terminal {
164165
required Platform platform,
165166
DateTime? now, // Time used to determine preferredStyle. Defaults to 0001-01-01 00:00.
166167
bool defaultCliAnimationEnabled = true,
168+
ShutdownHooks? shutdownHooks,
167169
})
168170
: _stdio = stdio,
169171
_platform = platform,
170172
_now = now ?? DateTime(1),
171-
_isCliAnimationEnabled = defaultCliAnimationEnabled;
173+
_isCliAnimationEnabled = defaultCliAnimationEnabled {
174+
shutdownHooks?.addShutdownHook(() { singleCharMode = false; });
175+
}
172176

173177
final io.Stdio _stdio;
174178
final Platform _platform;
@@ -319,7 +323,7 @@ class AnsiTerminal implements Terminal {
319323
return false;
320324
}
321325
final io.Stdin stdin = _stdio.stdin as io.Stdin;
322-
return stdin.lineMode && stdin.echoMode;
326+
return !stdin.lineMode && !stdin.echoMode;
323327
}
324328
@override
325329
set singleCharMode(bool value) {

packages/flutter_tools/lib/src/globals.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,7 @@ final AnsiTerminal _defaultAnsiTerminal = AnsiTerminal(
243243
stdio: stdio,
244244
platform: platform,
245245
now: DateTime.now(),
246+
shutdownHooks: shutdownHooks,
246247
);
247248

248249
/// The global Stdio wrapper.

packages/flutter_tools/test/general.shard/base/terminal_test.dart

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import 'package:flutter_tools/src/base/io.dart';
66
import 'package:flutter_tools/src/base/logger.dart';
77
import 'package:flutter_tools/src/base/platform.dart';
8+
import 'package:flutter_tools/src/base/process.dart';
89
import 'package:flutter_tools/src/base/terminal.dart';
910
import 'package:test/fake.dart';
1011

@@ -264,6 +265,18 @@ void main() {
264265
);
265266
terminal.singleCharMode = true;
266267
});
268+
269+
testWithoutContext('singleCharMode is reset by shutdown hook', () {
270+
final ShutdownHooks shutdownHooks = ShutdownHooks();
271+
final FakeStdio stdio = FakeStdio();
272+
final AnsiTerminal terminal = AnsiTerminal(stdio: stdio, platform: const LocalPlatform(), shutdownHooks: shutdownHooks);
273+
stdio.stdinHasTerminal = true;
274+
stdio._stdin = FakeStdin();
275+
276+
terminal.singleCharMode = true;
277+
shutdownHooks.runShutdownHooks(BufferLogger.test());
278+
expect(terminal.singleCharMode, false);
279+
});
267280
}
268281

269282
late Stream<String> mockStdInStream;

0 commit comments

Comments
 (0)