]> granicus.if.org Git - vim/commitdiff
patch 8.0.0905: MS-Windows: broken multi-byte characters in the console v8.0.0905
authorBram Moolenaar <Bram@vim.org>
Fri, 11 Aug 2017 18:37:00 +0000 (20:37 +0200)
committerBram Moolenaar <Bram@vim.org>
Fri, 11 Aug 2017 18:37:00 +0000 (20:37 +0200)
Problem:    MS-Windows: broken multi-byte characters in the console.
Solution:   Restore all regions of the console buffer. (Ken Takata)

src/os_win32.c
src/version.c

index f98bd7e6ea3bafef8400a737184b960a4b7ab200..add83d34445cd404fef34a5a20b7e57a36e278f1 100644 (file)
@@ -2192,6 +2192,8 @@ typedef struct ConsoleBufferStruct
     CONSOLE_SCREEN_BUFFER_INFO Info;
     PCHAR_INFO                 Buffer;
     COORD                      BufferSize;
+    PSMALL_RECT                        Regions;
+    int                                NumRegions;
 } ConsoleBuffer;
 
 /*
@@ -2212,6 +2214,7 @@ SaveConsoleBuffer(
     COORD BufferCoord;
     SMALL_RECT ReadRegion;
     WORD Y, Y_incr;
+    int i, numregions;
 
     if (cb == NULL)
        return FALSE;
@@ -2254,7 +2257,22 @@ SaveConsoleBuffer(
     ReadRegion.Left = 0;
     ReadRegion.Right = cb->Info.dwSize.X - 1;
     Y_incr = 12000 / cb->Info.dwSize.X;
-    for (Y = 0; Y < cb->BufferSize.Y; Y += Y_incr)
+
+    numregions = (cb->Info.dwSize.Y + Y_incr - 1) / Y_incr;
+    if (cb->Regions == NULL || numregions != cb->NumRegions)
+    {
+       cb->NumRegions = numregions;
+       vim_free(cb->Regions);
+       cb->Regions = (PSMALL_RECT)alloc(cb->NumRegions * sizeof(SMALL_RECT));
+       if (cb->Regions == NULL)
+       {
+           vim_free(cb->Buffer);
+           cb->Buffer = NULL;
+           return FALSE;
+       }
+    }
+
+    for (i = 0, Y = 0; i < cb->NumRegions; i++, Y += Y_incr)
     {
        /*
         * Read into position (0, Y) in our buffer.
@@ -2268,7 +2286,7 @@ SaveConsoleBuffer(
         */
        ReadRegion.Top = Y;
        ReadRegion.Bottom = Y + Y_incr - 1;
-       if (!ReadConsoleOutput(g_hConOut,       /* output handle */
+       if (!ReadConsoleOutputW(g_hConOut,      /* output handle */
                cb->Buffer,                     /* our buffer */
                cb->BufferSize,                 /* dimensions of our buffer */
                BufferCoord,                    /* offset in our buffer */
@@ -2276,8 +2294,11 @@ SaveConsoleBuffer(
        {
            vim_free(cb->Buffer);
            cb->Buffer = NULL;
+           vim_free(cb->Regions);
+           cb->Regions = NULL;
            return FALSE;
        }
+       cb->Regions[i] = ReadRegion;
     }
 
     return TRUE;
@@ -2299,6 +2320,7 @@ RestoreConsoleBuffer(
 {
     COORD BufferCoord;
     SMALL_RECT WriteRegion;
+    int i;
 
     if (cb == NULL || !cb->IsValid)
        return FALSE;
@@ -2335,19 +2357,19 @@ RestoreConsoleBuffer(
      */
     if (cb->Buffer != NULL)
     {
-       BufferCoord.X = 0;
-       BufferCoord.Y = 0;
-       WriteRegion.Left = 0;
-       WriteRegion.Top = 0;
-       WriteRegion.Right = cb->Info.dwSize.X - 1;
-       WriteRegion.Bottom = cb->Info.dwSize.Y - 1;
-       if (!WriteConsoleOutput(g_hConOut,      /* output handle */
-               cb->Buffer,                     /* our buffer */
-               cb->BufferSize,                 /* dimensions of our buffer */
-               BufferCoord,                    /* offset in our buffer */
-               &WriteRegion))                  /* region to restore */
+       for (i = 0; i < cb->NumRegions; i++)
        {
-           return FALSE;
+           BufferCoord.X = cb->Regions[i].Left;
+           BufferCoord.Y = cb->Regions[i].Top;
+           WriteRegion = cb->Regions[i];
+           if (!WriteConsoleOutputW(g_hConOut, /* output handle */
+                       cb->Buffer,             /* our buffer */
+                       cb->BufferSize,         /* dimensions of our buffer */
+                       BufferCoord,            /* offset in our buffer */
+                       &WriteRegion))          /* region to restore */
+           {
+               return FALSE;
+           }
        }
     }
 
index f0e7062f751231acf97a89e7256956cbf0215f8a..80730682c9406de6b50f029f0a1d55d519e7ebb1 100644 (file)
@@ -769,6 +769,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    905,
 /**/
     904,
 /**/