Skip to content

Commit b6c9fb4

Browse files
committed
Update
1 parent 3fd943b commit b6c9fb4

3 files changed

Lines changed: 3 additions & 96 deletions

File tree

app/src/main/java/com/omarea/krscript/executor/SimpleShellWatcher.java

Lines changed: 2 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -26,69 +26,10 @@ private void readStream(InputStream inputStream, final ShellHandlerBase shellHan
2626
InputStreamReader isr = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
2727
StringBuilder buffer = new StringBuilder();
2828
int ch;
29-
// Trạng thái nhận diện escape sequence đang đọc dở, để có thể flush ngay khi 1 escape
30-
// sequence (vd ESC[2J của lệnh `clear`) vừa đọc xong, thay vì phải đợi tới '\n'/'\r'
31-
// tiếp theo mới gửi đi. Rất nhiều escape sequence (clear màn hình, di chuyển con trỏ...)
32-
// KHÔNG kèm theo newline, nên nếu chỉ flush theo '\n'/'\r' như trước đây, dữ liệu clear
33-
// sẽ bị kẹt lại trong buffer của thread đọc này và không bao giờ tới được UI cho tới khi
34-
// có dòng output tiếp theo (hoặc tiến trình kết thúc) -> lệnh `clear` trông như "không xoá"
35-
// hoặc xoá bị trễ/xoá nhầm nội dung không liên quan.
36-
// 0 = bình thường, 1 = vừa gặp ESC (chờ ký tự kế tiếp để biết loại), 2 = trong chuỗi CSI
37-
// (ESC[...), chờ finalByte, 3 = trong chuỗi OSC (ESC]...), chờ BEL hoặc ESC\, 4 = trong
38-
// OSC vừa gặp ESC, chờ '\' để xác nhận kết thúc (ST).
39-
int escState = 0;
4029
while ((ch = isr.read()) != -1) {
4130
char c = (char) ch;
4231
buffer.append(c);
43-
boolean flush = false;
44-
45-
switch (escState) {
46-
case 0:
47-
if (c == '\u001B') {
48-
escState = 1;
49-
} else if (c == '\n' || c == '\r') {
50-
flush = true;
51-
}
52-
break;
53-
case 1:
54-
if (c == '[') {
55-
escState = 2; // CSI
56-
} else if (c == ']') {
57-
escState = 3; // OSC
58-
} else {
59-
// Escape đơn (vd ESC( ESC) ESC= ESC>...) coi như đã hoàn chỉnh ngay sau
60-
// ký tự này -> flush luôn để không bị kẹt buffer.
61-
escState = 0;
62-
flush = true;
63-
}
64-
break;
65-
case 2:
66-
// CSI kết thúc bằng 1 finalByte trong khoảng '@'..'~' (ECMA-48), vd 'J' (xoá
67-
// màn hình), 'm' (màu SGR), 'H' (di chuyển con trỏ)...
68-
if (c >= '@' && c <= '~') {
69-
escState = 0;
70-
flush = true;
71-
}
72-
break;
73-
case 3:
74-
if (c == '\u0007') {
75-
escState = 0;
76-
flush = true;
77-
} else if (c == '\u001B') {
78-
escState = 4;
79-
}
80-
break;
81-
case 4:
82-
if (c == '\\') {
83-
escState = 0;
84-
flush = true;
85-
} else {
86-
escState = 3;
87-
}
88-
break;
89-
}
90-
91-
if (flush) {
32+
if (c == '\n' || c == '\r') {
9233
String segment = buffer.toString();
9334
shellHandlerBase.sendMessage(
9435
shellHandlerBase.obtainMessage(what, shellTranslation.resolveRow(segment))
@@ -149,4 +90,4 @@ public void setHandler(Context context, Process process, final ShellHandlerBase
14990
readerError.start();
15091
waitExit.start();
15192
}
152-
}
93+
}

app/src/main/java/com/omarea/krscript/ui/DialogLogFragment.kt

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -670,16 +670,6 @@ class DialogLogFragment : DialogFragment() {
670670
private fun updateLogWithColor(text: String, forcedColor: Int?) {
671671
var parsedLog: CharSequence = AnsiColorParser.parse(text)
672672

673-
if (AnsiColorParser.consumePendingClear()) {
674-
synchronized(logBuffer) {
675-
logBuffer.clear()
676-
lineCount = 0
677-
lineStart = 0
678-
pendingOverwrite = false
679-
markInvalidFrom(0)
680-
}
681-
}
682-
683673
if (forcedColor != null && !text.contains("\u001B[")) {
684674
parsedLog = SpannableStringBuilder(parsedLog).apply {
685675
setSpan(

app/src/main/java/com/tool/tree/AnsiColorParser.kt

Lines changed: 1 addition & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,6 @@ object AnsiColorParser {
4444
private var isReverse = false
4545
private var isDim = false
4646

47-
// Cờ báo hiệu đã gặp mã CSI xoá toàn bộ màn hình (ESC[2J / ESC[3J) trong lần parse() gần
48-
// nhất, để nơi gọi (DialogLogFragment) biết cần xoá sạch log buffer + UI, mô phỏng đúng
49-
// hành vi lệnh `clear` trong terminal thật (trước đây các mã này bị bỏ qua hoàn toàn).
50-
private var clearScreenRequested = false
51-
5247
private val ANSI_16_COLORS = intArrayOf(
5348
Color.BLACK,
5449
Color.RED,
@@ -112,15 +107,8 @@ object AnsiColorParser {
112107
val finalByte = m.group(3)
113108
if (finalByte == "m") {
114109
parseAnsiParameters(params)
115-
} else if (finalByte == "J") {
116-
// Erase in Display: 2 = xoá toàn màn hình, 3 = xoá toàn màn hình + scrollback
117-
// (phần mở rộng của xterm, ncurses hiện đại thường phát cả 2 mã này khi
118-
// chạy lệnh `clear`). 0/1 chỉ xoá một phần màn hình nên không coi là "clear".
119-
if (params == "2" || params == "3") {
120-
clearScreenRequested = true
121-
}
122110
}
123-
// Các CSI khác (cursor move, hide cursor...) -> bỏ qua, không render
111+
// Các CSI khác (cursor move, clear line, hide cursor...) -> bỏ qua, không render
124112
i = m.end()
125113
} else {
126114
i++ // escape hỏng/không đầy đủ, bỏ qua 1 ký tự để tránh vòng lặp vô hạn
@@ -437,17 +425,5 @@ object AnsiColorParser {
437425

438426
fun reset() {
439427
resetToDefault()
440-
clearScreenRequested = false
441-
}
442-
443-
/**
444-
* Kiểm tra xem lần gọi parse() gần nhất có gặp mã xoá toàn màn hình (lệnh `clear`) hay
445-
* không, đồng thời "tiêu thụ" (reset) cờ này để lần gọi sau không bị báo lại. Nơi gọi
446-
* (DialogLogFragment) cần gọi hàm này ngay sau parse() để biết có cần xoá log buffer + UI.
447-
*/
448-
fun consumePendingClear(): Boolean {
449-
val result = clearScreenRequested
450-
clearScreenRequested = false
451-
return result
452428
}
453429
}

0 commit comments

Comments
 (0)