OSDN Git Service

better support for overwrapping wide chars
authorSHIRAKATA Kentaro <argrath@ub32.org>
Sat, 9 Oct 2021 20:26:37 +0000 (05:26 +0900)
committerSHIRAKATA Kentaro <argrath@ub32.org>
Sat, 9 Oct 2021 20:28:03 +0000 (05:28 +0900)
sys/winnt/nttty.c

index 3da2b6a..2818282 100644 (file)
@@ -224,6 +224,18 @@ keyboard_handler_t keyboard_handler;
 
 /* Console buffer flipping support */
 
+static void back_buffer_clear_cell(COORD pos)
+{
+    DWORD unused;
+    static WORD attr[1] = {CONSOLE_CLEAR_ATTRIBUTE};
+    static char buf[1] = {CONSOLE_CLEAR_CHARACTER};
+
+    WriteConsoleOutputAttribute(console.hConOut, attr,
+                                1, pos, &unused);
+    WriteConsoleOutputCharacterA(console.hConOut, buf,
+                                1, pos, &unused);
+}
+
 static void back_buffer_flip()
 {
     cell_t * back = console.back_buffer;
@@ -237,6 +249,14 @@ static void back_buffer_flip()
             if (back->iskanji == 1) {
                 cell_t * back2 = back + 1;
                 cell_t * front2 = front + 1;
+                if(back2->iskanji != 2){
+                    /* \8a®\91S\82È\83}\83\8b\83`\83o\83C\83g\95\8e\9a\82Å\82È\82¢\82Ì\82Å\8bó\94\92 */
+                    back_buffer_clear_cell(pos);
+                    *front = *back;
+                    back++;
+                    front++;
+                    continue;
+                }
                 /* pos.x == 0 \82Ì\8fð\8c\8f\82Í\95s\97v\82Ì\82Í\82¸\82¾\82ª #42072 \91Î\8dô\82Å\92Ç\89Á\81B */
                 if (back->attribute != front->attribute ||
                     back2->attribute != front2->attribute || pos.X == 0) {
@@ -262,6 +282,14 @@ static void back_buffer_flip()
                 front += 2;
                 continue;
             }
+            if (back->iskanji == 2) {
+                /* \8a®\91S\82È\83}\83\8b\83`\83o\83C\83g\95\8e\9a\82Å\82È\82¢\82Ì\82Å\8bó\94\92 */
+                back_buffer_clear_cell(pos);
+                *front = *back;
+                back++;
+                front++;
+                continue;
+            }
 #endif
             if (back->attribute != front->attribute) {
                 WriteConsoleOutputAttribute(console.hConOut, &back->attribute,