Patch 8.1.1081
Problem:    MS-Windows: cannot use fonts whose name cannot be represented in
            the current code page.
Solution:   Use wide font functions. (Ken Takata, closes #4000)
Files:      src/gui_w32.c, src/os_mswin.c, src/proto/gui_w32.pro,
            src/proto/os_mswin.pro


*** ../vim-8.1.1080/src/gui_w32.c       2019-03-28 22:43:12.103997449 +0100
--- src/gui_w32.c       2019-03-30 16:20:37.994106945 +0100
***************
*** 253,259 ****
  typedef int HBRUSH;
  typedef int HDROP;
  typedef int INT;
! typedef int LOGFONT[];
  typedef int LPARAM;
  typedef int LPCREATESTRUCT;
  typedef int LPCSTR;
--- 253,259 ----
  typedef int HBRUSH;
  typedef int HDROP;
  typedef int INT;
! typedef int LOGFONTW[];
  typedef int LPARAM;
  typedef int LPCREATESTRUCT;
  typedef int LPCSTR;
***************
*** 501,515 ****
  /*
   * For control IME.
   *
!  * These LOGFONT used for IME.
   */
  #if defined(FEAT_MBYTE_IME) || defined(GLOBAL_IME)
! /* holds LOGFONT for 'guifontwide' if available, otherwise 'guifont' */
! static LOGFONT norm_logfont;
  #endif
  #ifdef FEAT_MBYTE_IME
! /* holds LOGFONT for 'guifont' always. */
! static LOGFONT sub_logfont;
  #endif
  
  #ifdef FEAT_MBYTE_IME
--- 501,515 ----
  /*
   * For control IME.
   *
!  * These LOGFONTW used for IME.
   */
  #if defined(FEAT_MBYTE_IME) || defined(GLOBAL_IME)
! /* holds LOGFONTW for 'guifontwide' if available, otherwise 'guifont' */
! static LOGFONTW norm_logfont;
  #endif
  #ifdef FEAT_MBYTE_IME
! /* holds LOGFONTW for 'guifont' always. */
! static LOGFONTW sub_logfont;
  #endif
  
  #ifdef FEAT_MBYTE_IME
***************
*** 1520,1531 ****
  }
  
      static GuiFont
! get_font_handle(LOGFONT *lf)
  {
      HFONT   font = NULL;
  
      /* Load the font */
!     font = CreateFontIndirect(lf);
  
      if (font == NULL)
        return NOFONT;
--- 1520,1531 ----
  }
  
      static GuiFont
! get_font_handle(LOGFONTW *lf)
  {
      HFONT   font = NULL;
  
      /* Load the font */
!     font = CreateFontIndirectW(lf);
  
      if (font == NULL)
        return NOFONT;
***************
*** 1556,1562 ****
      char_u    *name,
      int               giveErrorIfMissing)
  {
!     LOGFONT   lf;
      GuiFont   font = NOFONT;
  
      if (get_logfont(&lf, name, NULL, giveErrorIfMissing) == OK)
--- 1556,1562 ----
      char_u    *name,
      int               giveErrorIfMissing)
  {
!     LOGFONTW  lf;
      GuiFont   font = NOFONT;
  
      if (get_logfont(&lf, name, NULL, giveErrorIfMissing) == OK)
***************
*** 3201,3223 ****
  }
  
      static char_u *
! logfont2name(LOGFONT lf)
  {
      char      *p;
      char      *res;
      char      *charset_name;
      char      *quality_name;
!     char      *font_name = lf.lfFaceName;
  
      charset_name = charset_id2name((int)lf.lfCharSet);
-     /* Convert a font name from the current codepage to 'encoding'.
-      * TODO: Use Wide APIs (including LOGFONTW) instead of ANSI APIs. */
-     if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-     {
-       int     len;
-       acp_to_enc((char_u *)lf.lfFaceName, (int)strlen(lf.lfFaceName),
-                                               (char_u **)&font_name, &len);
-     }
      quality_name = quality_id2name((int)lf.lfQuality);
  
      res = (char *)alloc((unsigned)(strlen(font_name) + 20
--- 3201,3218 ----
  }
  
      static char_u *
! logfont2name(LOGFONTW lf)
  {
      char      *p;
      char      *res;
      char      *charset_name;
      char      *quality_name;
!     char      *font_name;
  
+     font_name = (char *)utf16_to_enc(lf.lfFaceName, NULL);
+     if (font_name == NULL)
+       return NULL;
      charset_name = charset_id2name((int)lf.lfCharSet);
      quality_name = quality_id2name((int)lf.lfQuality);
  
      res = (char *)alloc((unsigned)(strlen(font_name) + 20
***************
*** 3254,3278 ****
        }
      }
  
!     if (font_name != lf.lfFaceName)
!       vim_free(font_name);
      return (char_u *)res;
  }
  
  
  #ifdef FEAT_MBYTE_IME
  /*
!  * Set correct LOGFONT to IME.  Use 'guifontwide' if available, otherwise use
   * 'guifont'
   */
      static void
  update_im_font(void)
  {
!     LOGFONT   lf_wide;
  
      if (p_guifontwide != NULL && *p_guifontwide != NUL
            && gui.wide_font != NOFONT
!           && GetObject((HFONT)gui.wide_font, sizeof(lf_wide), &lf_wide))
        norm_logfont = lf_wide;
      else
        norm_logfont = sub_logfont;
--- 3249,3272 ----
        }
      }
  
!     vim_free(font_name);
      return (char_u *)res;
  }
  
  
  #ifdef FEAT_MBYTE_IME
  /*
!  * Set correct LOGFONTW to IME.  Use 'guifontwide' if available, otherwise use
   * 'guifont'
   */
      static void
  update_im_font(void)
  {
!     LOGFONTW  lf_wide;
  
      if (p_guifontwide != NULL && *p_guifontwide != NUL
            && gui.wide_font != NOFONT
!           && GetObjectW((HFONT)gui.wide_font, sizeof(lf_wide), &lf_wide))
        norm_logfont = lf_wide;
      else
        norm_logfont = sub_logfont;
***************
*** 3286,3292 ****
      void
  gui_mch_wide_font_changed(void)
  {
!     LOGFONT lf;
  
  #ifdef FEAT_MBYTE_IME
      update_im_font();
--- 3280,3286 ----
      void
  gui_mch_wide_font_changed(void)
  {
!     LOGFONTW lf;
  
  #ifdef FEAT_MBYTE_IME
      update_im_font();
***************
*** 3300,3306 ****
      gui.wide_boldital_font = NOFONT;
  
      if (gui.wide_font
!       && GetObject((HFONT)gui.wide_font, sizeof(lf), &lf))
      {
        if (!lf.lfItalic)
        {
--- 3294,3300 ----
      gui.wide_boldital_font = NOFONT;
  
      if (gui.wide_font
!       && GetObjectW((HFONT)gui.wide_font, sizeof(lf), &lf))
      {
        if (!lf.lfItalic)
        {
***************
*** 3328,3334 ****
      int
  gui_mch_init_font(char_u *font_name, int fontset UNUSED)
  {
!     LOGFONT   lf;
      GuiFont   font = NOFONT;
      char_u    *p;
  
--- 3322,3328 ----
      int
  gui_mch_init_font(char_u *font_name, int fontset UNUSED)
  {
!     LOGFONTW  lf;
      GuiFont   font = NOFONT;
      char_u    *p;
  
***************
*** 4225,4232 ****
  static BOOL (WINAPI *pImmReleaseContext)(HWND, HIMC);
  static BOOL (WINAPI *pImmGetOpenStatus)(HIMC);
  static BOOL (WINAPI *pImmSetOpenStatus)(HIMC, BOOL);
! static BOOL (WINAPI *pImmGetCompositionFont)(HIMC, LPLOGFONTA);
! static BOOL (WINAPI *pImmSetCompositionFont)(HIMC, LPLOGFONTA);
  static BOOL (WINAPI *pImmSetCompositionWindow)(HIMC, LPCOMPOSITIONFORM);
  static BOOL (WINAPI *pImmGetConversionStatus)(HIMC, LPDWORD, LPDWORD);
  static BOOL (WINAPI *pImmSetConversionStatus)(HIMC, DWORD, DWORD);
--- 4219,4226 ----
  static BOOL (WINAPI *pImmReleaseContext)(HWND, HIMC);
  static BOOL (WINAPI *pImmGetOpenStatus)(HIMC);
  static BOOL (WINAPI *pImmSetOpenStatus)(HIMC, BOOL);
! static BOOL (WINAPI *pImmGetCompositionFontW)(HIMC, LPLOGFONTW);
! static BOOL (WINAPI *pImmSetCompositionFontW)(HIMC, LPLOGFONTW);
  static BOOL (WINAPI *pImmSetCompositionWindow)(HIMC, LPCOMPOSITIONFORM);
  static BOOL (WINAPI *pImmGetConversionStatus)(HIMC, LPDWORD, LPDWORD);
  static BOOL (WINAPI *pImmSetConversionStatus)(HIMC, DWORD, DWORD);
***************
*** 4239,4246 ****
  # define pImmReleaseContext     ImmReleaseContext
  # define pImmGetOpenStatus      ImmGetOpenStatus
  # define pImmSetOpenStatus      ImmSetOpenStatus
! # define pImmGetCompositionFont   ImmGetCompositionFontA
! # define pImmSetCompositionFont   ImmSetCompositionFontA
  # define pImmSetCompositionWindow ImmSetCompositionWindow
  # define pImmGetConversionStatus  ImmGetConversionStatus
  # define pImmSetConversionStatus  ImmSetConversionStatus
--- 4233,4240 ----
  # define pImmReleaseContext     ImmReleaseContext
  # define pImmGetOpenStatus      ImmGetOpenStatus
  # define pImmSetOpenStatus      ImmSetOpenStatus
! # define pImmGetCompositionFontW  ImmGetCompositionFontW
! # define pImmSetCompositionFontW  ImmSetCompositionFontW
  # define pImmSetCompositionWindow ImmSetCompositionWindow
  # define pImmGetConversionStatus  ImmGetConversionStatus
  # define pImmSetConversionStatus  ImmSetConversionStatus
***************
*** 4379,4392 ****
   * Return OK or FAIL.
   */
      static int
! gui_w32_get_menu_font(LOGFONT *lf)
  {
!     NONCLIENTMETRICS nm;
  
!     nm.cbSize = sizeof(NONCLIENTMETRICS);
!     if (!SystemParametersInfo(
            SPI_GETNONCLIENTMETRICS,
!           sizeof(NONCLIENTMETRICS),
            &nm,
            0))
        return FAIL;
--- 4373,4386 ----
   * Return OK or FAIL.
   */
      static int
! gui_w32_get_menu_font(LOGFONTW *lf)
  {
!     NONCLIENTMETRICSW nm;
  
!     nm.cbSize = sizeof(NONCLIENTMETRICSW);
!     if (!SystemParametersInfoW(
            SPI_GETNONCLIENTMETRICS,
!           sizeof(NONCLIENTMETRICSW),
            &nm,
            0))
        return FAIL;
***************
*** 4403,4409 ****
      static void
  set_tabline_font(void)
  {
!     LOGFONT   lfSysmenu;
      HFONT     font;
      HWND      hwnd;
      HDC               hdc;
--- 4397,4403 ----
      static void
  set_tabline_font(void)
  {
!     LOGFONTW  lfSysmenu;
      HFONT     font;
      HWND      hwnd;
      HDC               hdc;
***************
*** 4413,4419 ****
      if (gui_w32_get_menu_font(&lfSysmenu) != OK)
        return;
  
!     font = CreateFontIndirect(&lfSysmenu);
  
      SendMessage(s_tabhwnd, WM_SETFONT, (WPARAM)font, TRUE);
  
--- 4407,4413 ----
      if (gui_w32_get_menu_font(&lfSysmenu) != OK)
        return;
  
!     font = CreateFontIndirectW(&lfSysmenu);
  
      SendMessage(s_tabhwnd, WM_SETFONT, (WPARAM)font, TRUE);
  
***************
*** 5562,5568 ****
        case IMN_SETOPENSTATUS:
            if (pImmGetOpenStatus(hImc))
            {
!               pImmSetCompositionFont(hImc, &norm_logfont);
                im_set_position(gui.row, gui.col);
  
                /* Disable langmap */
--- 5556,5562 ----
        case IMN_SETOPENSTATUS:
            if (pImmGetOpenStatus(hImc))
            {
!               pImmSetCompositionFontW(hImc, &norm_logfont);
                im_set_position(gui.row, gui.col);
  
                /* Disable langmap */
***************
*** 5703,5715 ****
   * set font to IM.
   */
      void
! im_set_font(LOGFONT *lf)
  {
      HIMC hImc;
  
      if (pImmGetContext && (hImc = pImmGetContext(s_hwnd)) != (HIMC)0)
      {
!       pImmSetCompositionFont(hImc, lf);
        pImmReleaseContext(s_hwnd, hImc);
      }
  }
--- 5697,5709 ----
   * set font to IM.
   */
      void
! im_set_font(LOGFONTW *lf)
  {
      HIMC hImc;
  
      if (pImmGetContext && (hImc = pImmGetContext(s_hwnd)) != (HIMC)0)
      {
!       pImmSetCompositionFontW(hImc, lf);
        pImmReleaseContext(s_hwnd, hImc);
      }
  }
***************
*** 6829,6835 ****
      int               dlgPaddingX;
      int               dlgPaddingY;
  #ifdef USE_SYSMENU_FONT
!     LOGFONT   lfSysmenu;
      int               use_lfSysmenu = FALSE;
  #endif
      garray_T  ga;
--- 6823,6829 ----
      int               dlgPaddingX;
      int               dlgPaddingY;
  #ifdef USE_SYSMENU_FONT
!     LOGFONTW  lfSysmenu;
      int               use_lfSysmenu = FALSE;
  #endif
      garray_T  ga;
***************
*** 6894,6900 ****
  #ifdef USE_SYSMENU_FONT
      if (gui_w32_get_menu_font(&lfSysmenu) == OK)
      {
!       font = CreateFontIndirect(&lfSysmenu);
        use_lfSysmenu = TRUE;
      }
      else
--- 6888,6894 ----
  #ifdef USE_SYSMENU_FONT
      if (gui_w32_get_menu_font(&lfSysmenu) == OK)
      {
!       font = CreateFontIndirectW(&lfSysmenu);
        use_lfSysmenu = TRUE;
      }
      else
***************
*** 7123,7129 ****
            /* point size */
            *p++ = -MulDiv(lfSysmenu.lfHeight, 72,
                    GetDeviceCaps(hdc, LOGPIXELSY));
!           nchar = nCopyAnsiToWideChar(p, lfSysmenu.lfFaceName, FALSE);
        }
        else
  #endif
--- 7117,7124 ----
            /* point size */
            *p++ = -MulDiv(lfSysmenu.lfHeight, 72,
                    GetDeviceCaps(hdc, LOGPIXELSY));
!           wcscpy(p, lfSysmenu.lfFaceName);
!           nchar = (int)wcslen(lfSysmenu.lfFaceName) + 1;
        }
        else
  #endif
***************
*** 7488,7501 ****
      DWORD         dlgFontSize;
      SIZE          size;
  #ifdef USE_SYSMENU_FONT
!     LOGFONT       lfSysmenu;
  #endif
  
      s_usenewlook = FALSE;
  
  #ifdef USE_SYSMENU_FONT
      if (gui_w32_get_menu_font(&lfSysmenu) == OK)
!       hfontTools = CreateFontIndirect(&lfSysmenu);
      else
  #endif
        hfontTools = CreateFont(-DLG_FONT_POINT_SIZE, 0, 0, 0, 0, 0, 0, 0,
--- 7483,7496 ----
      DWORD         dlgFontSize;
      SIZE          size;
  #ifdef USE_SYSMENU_FONT
!     LOGFONTW      lfSysmenu;
  #endif
  
      s_usenewlook = FALSE;
  
  #ifdef USE_SYSMENU_FONT
      if (gui_w32_get_menu_font(&lfSysmenu) == OK)
!       hfontTools = CreateFontIndirectW(&lfSysmenu);
      else
  #endif
        hfontTools = CreateFont(-DLG_FONT_POINT_SIZE, 0, 0, 0, 0, 0, 0, 0,
***************
*** 7563,7569 ****
      int               x;
      int               y;
  #ifdef USE_SYSMENU_FONT
!     LOGFONT   lfSysmenu;
      int               use_lfSysmenu = FALSE;
  #endif
  
--- 7558,7564 ----
      int               x;
      int               y;
  #ifdef USE_SYSMENU_FONT
!     LOGFONTW  lfSysmenu;
      int               use_lfSysmenu = FALSE;
  #endif
  
***************
*** 7599,7605 ****
  #ifdef USE_SYSMENU_FONT
      if (gui_w32_get_menu_font(&lfSysmenu) == OK)
      {
!       font = CreateFontIndirect(&lfSysmenu);
        use_lfSysmenu = TRUE;
      }
      else
--- 7594,7600 ----
  #ifdef USE_SYSMENU_FONT
      if (gui_w32_get_menu_font(&lfSysmenu) == OK)
      {
!       font = CreateFontIndirectW(&lfSysmenu);
        use_lfSysmenu = TRUE;
      }
      else
***************
*** 7708,7714 ****
            /* point size */
            *p++ = -MulDiv(lfSysmenu.lfHeight, 72,
                    GetDeviceCaps(hdc, LOGPIXELSY));
!           nchar = nCopyAnsiToWideChar(p, lfSysmenu.lfFaceName, FALSE);
        }
        else
  #endif
--- 7703,7710 ----
            /* point size */
            *p++ = -MulDiv(lfSysmenu.lfHeight, 72,
                    GetDeviceCaps(hdc, LOGPIXELSY));
!           wcscpy(p, lfSysmenu.lfFaceName);
!           nchar = (int)wcslen(lfSysmenu.lfFaceName) + 1;
        }
        else
  #endif
***************
*** 8136,8145 ****
            = (void *)GetProcAddress(hLibImm, "ImmGetOpenStatus");
      pImmSetOpenStatus
            = (void *)GetProcAddress(hLibImm, "ImmSetOpenStatus");
!     pImmGetCompositionFont
!           = (void *)GetProcAddress(hLibImm, "ImmGetCompositionFontA");
!     pImmSetCompositionFont
!           = (void *)GetProcAddress(hLibImm, "ImmSetCompositionFontA");
      pImmSetCompositionWindow
            = (void *)GetProcAddress(hLibImm, "ImmSetCompositionWindow");
      pImmGetConversionStatus
--- 8132,8141 ----
            = (void *)GetProcAddress(hLibImm, "ImmGetOpenStatus");
      pImmSetOpenStatus
            = (void *)GetProcAddress(hLibImm, "ImmSetOpenStatus");
!     pImmGetCompositionFontW
!           = (void *)GetProcAddress(hLibImm, "ImmGetCompositionFontW");
!     pImmSetCompositionFontW
!           = (void *)GetProcAddress(hLibImm, "ImmSetCompositionFontW");
      pImmSetCompositionWindow
            = (void *)GetProcAddress(hLibImm, "ImmSetCompositionWindow");
      pImmGetConversionStatus
***************
*** 8154,8161 ****
            || pImmReleaseContext == NULL
            || pImmGetOpenStatus == NULL
            || pImmSetOpenStatus == NULL
!           || pImmGetCompositionFont == NULL
!           || pImmSetCompositionFont == NULL
            || pImmSetCompositionWindow == NULL
            || pImmGetConversionStatus == NULL
            || pImmSetConversionStatus == NULL)
--- 8150,8157 ----
            || pImmReleaseContext == NULL
            || pImmGetOpenStatus == NULL
            || pImmSetOpenStatus == NULL
!           || pImmGetCompositionFontW == NULL
!           || pImmSetCompositionFontW == NULL
            || pImmSetCompositionWindow == NULL
            || pImmGetConversionStatus == NULL
            || pImmSetConversionStatus == NULL)
*** ../vim-8.1.1080/src/os_mswin.c      2019-02-17 17:44:36.215875493 +0100
--- src/os_mswin.c      2019-03-30 16:20:37.994106945 +0100
***************
*** 85,91 ****
  typedef int CONSOLE_CURSOR_INFO;
  typedef int COORD;
  typedef int DWORD;
! typedef int ENUMLOGFONT;
  typedef int HANDLE;
  typedef int HDC;
  typedef int HFONT;
--- 85,91 ----
  typedef int CONSOLE_CURSOR_INFO;
  typedef int COORD;
  typedef int DWORD;
! typedef int ENUMLOGFONTW;
  typedef int HANDLE;
  typedef int HDC;
  typedef int HFONT;
***************
*** 93,99 ****
  typedef int HWND;
  typedef int INPUT_RECORD;
  typedef int KEY_EVENT_RECORD;
! typedef int LOGFONT;
  typedef int LPARAM;
  typedef int LPBOOL;
  typedef int LPCSTR;
--- 93,99 ----
  typedef int HWND;
  typedef int INPUT_RECORD;
  typedef int KEY_EVENT_RECORD;
! typedef int LOGFONTW;
  typedef int LPARAM;
  typedef int LPBOOL;
  typedef int LPCSTR;
***************
*** 103,109 ****
  typedef int LPWSTR;
  typedef int LRESULT;
  typedef int MOUSE_EVENT_RECORD;
! typedef int NEWTEXTMETRIC;
  typedef int PACL;
  typedef int PRINTDLG;
  typedef int PSECURITY_DESCRIPTOR;
--- 103,109 ----
  typedef int LPWSTR;
  typedef int LRESULT;
  typedef int MOUSE_EVENT_RECORD;
! typedef int NEWTEXTMETRICW;
  typedef int PACL;
  typedef int PRINTDLG;
  typedef int PSECURITY_DESCRIPTOR;
***************
*** 1420,1426 ****
      static int                stored_nCopies = 1;
      static int                stored_nFlags = 0;
  
!     LOGFONT           fLogFont;
      int                       pifItalic;
      int                       pifBold;
      int                       pifUnderline;
--- 1420,1426 ----
      static int                stored_nCopies = 1;
      static int                stored_nFlags = 0;
  
!     LOGFONTW          fLogFont;
      int                       pifItalic;
      int                       pifBold;
      int                       pifUnderline;
***************
*** 1577,1583 ****
                fLogFont.lfItalic = pifItalic;
                fLogFont.lfUnderline = pifUnderline;
                prt_font_handles[pifBold][pifItalic][pifUnderline]
!                                             = CreateFontIndirect(&fLogFont);
            }
  
      SetBkMode(prt_dlg.hDC, OPAQUE);
--- 1577,1583 ----
                fLogFont.lfItalic = pifItalic;
                fLogFont.lfUnderline = pifUnderline;
                prt_font_handles[pifBold][pifItalic][pifUnderline]
!                                             = CreateFontIndirectW(&fLogFont);
            }
  
      SetBkMode(prt_dlg.hDC, OPAQUE);
***************
*** 2915,2926 ****
      return qp->name;
  }
  
! static const LOGFONT s_lfDefault =
  {
      -12, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET,
      OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
      PROOF_QUALITY, FIXED_PITCH | FF_DONTCARE,
!     "Fixedsys"        /* see _ReadVimIni */
  };
  
  /* Initialise the "current height" to -12 (same as s_lfDefault) just
--- 2915,2926 ----
      return qp->name;
  }
  
! static const LOGFONTW s_lfDefault =
  {
      -12, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET,
      OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
      PROOF_QUALITY, FIXED_PITCH | FF_DONTCARE,
!     L"Fixedsys"       /* see _ReadVimIni */
  };
  
  /* Initialise the "current height" to -12 (same as s_lfDefault) just
***************
*** 2937,2943 ****
   * calculation is for a vertical (height) size or a horizontal (width) one.
   */
      static int
! points_to_pixels(char_u *str, char_u **end, int vertical, long_i pprinter_dc)
  {
      int               pixels;
      int               points = 0;
--- 2937,2943 ----
   * calculation is for a vertical (height) size or a horizontal (width) one.
   */
      static int
! points_to_pixels(WCHAR *str, WCHAR **end, int vertical, long_i pprinter_dc)
  {
      int               pixels;
      int               points = 0;
***************
*** 2948,2954 ****
  
      while (*str != NUL)
      {
!       if (*str == '.' && divisor == 0)
        {
            /* Start keeping a divisor, for later */
            divisor = 1;
--- 2948,2954 ----
  
      while (*str != NUL)
      {
!       if (*str == L'.' && divisor == 0)
        {
            /* Start keeping a divisor, for later */
            divisor = 1;
***************
*** 2959,2965 ****
                break;
  
            points *= 10;
!           points += *str - '0';
            divisor *= 10;
        }
        ++str;
--- 2959,2965 ----
                break;
  
            points *= 10;
!           points += *str - L'0';
            divisor *= 10;
        }
        ++str;
***************
*** 2989,3003 ****
  
      static int CALLBACK
  font_enumproc(
!     ENUMLOGFONT           *elf,
!     NEWTEXTMETRIC   *ntm UNUSED,
!     int                   type UNUSED,
      LPARAM        lparam)
  {
      /* Return value:
       *          0 = terminate now (monospace & ANSI)
       *          1 = continue, still no luck...
!      *          2 = continue, but we have an acceptable LOGFONT
       *              (monospace, not ANSI)
       * We use these values, as EnumFontFamilies returns 1 if the
       * callback function is never called. So, we check the return as
--- 2989,3003 ----
  
      static int CALLBACK
  font_enumproc(
!     ENUMLOGFONTW    *elf,
!     NEWTEXTMETRICW  *ntm UNUSED,
!     DWORD         type UNUSED,
      LPARAM        lparam)
  {
      /* Return value:
       *          0 = terminate now (monospace & ANSI)
       *          1 = continue, still no luck...
!      *          2 = continue, but we have an acceptable LOGFONTW
       *              (monospace, not ANSI)
       * We use these values, as EnumFontFamilies returns 1 if the
       * callback function is never called. So, we check the return as
***************
*** 3005,3011 ****
       * It's not pretty, but it works!
       */
  
!     LOGFONT *lf = (LOGFONT *)(lparam);
  
  #ifndef FEAT_PROPORTIONAL_FONTS
      /* Ignore non-monospace fonts without further ado */
--- 3005,3011 ----
       * It's not pretty, but it works!
       */
  
!     LOGFONTW *lf = (LOGFONTW *)(lparam);
  
  #ifndef FEAT_PROPORTIONAL_FONTS
      /* Ignore non-monospace fonts without further ado */
***************
*** 3013,3019 ****
        return 1;
  #endif
  
!     /* Remember this LOGFONT as a "possible" */
      *lf = elf->elfLogFont;
  
      /* Terminate the scan as soon as we find an ANSI font */
--- 3013,3019 ----
        return 1;
  #endif
  
!     /* Remember this LOGFONTW as a "possible" */
      *lf = elf->elfLogFont;
  
      /* Terminate the scan as soon as we find an ANSI font */
***************
*** 3027,3041 ****
  }
  
      static int
! init_logfont(LOGFONT *lf)
  {
      int               n;
      HWND      hwnd = GetDesktopWindow();
      HDC               hdc = GetWindowDC(hwnd);
  
!     n = EnumFontFamilies(hdc,
!                        (LPCSTR)lf->lfFaceName,
!                        (FONTENUMPROC)font_enumproc,
                         (LPARAM)lf);
  
      ReleaseDC(hwnd, hdc);
--- 3027,3041 ----
  }
  
      static int
! init_logfont(LOGFONTW *lf)
  {
      int               n;
      HWND      hwnd = GetDesktopWindow();
      HDC               hdc = GetWindowDC(hwnd);
  
!     n = EnumFontFamiliesW(hdc,
!                        lf->lfFaceName,
!                        (FONTENUMPROCW)font_enumproc,
                         (LPARAM)lf);
  
      ReleaseDC(hwnd, hdc);
***************
*** 3044,3050 ****
      if (n == 1)
        return FAIL;
  
!     /* Tidy up the rest of the LOGFONT structure. We set to a basic
       * font - get_logfont() sets bold, italic, etc based on the user's
       * input.
       */
--- 3044,3050 ----
      if (n == 1)
        return FAIL;
  
!     /* Tidy up the rest of the LOGFONTW structure. We set to a basic
       * font - get_logfont() sets bold, italic, etc based on the user's
       * input.
       */
***************
*** 3060,3098 ****
  }
  
  /*
   * Get font info from "name" into logfont "lf".
   * Return OK for a valid name, FAIL otherwise.
   */
      int
  get_logfont(
!     LOGFONT   *lf,
      char_u    *name,
      HDC               printer_dc,
      int               verbose)
  {
!     char_u    *p;
      int               i;
      int               ret = FAIL;
!     static LOGFONT *lastlf = NULL;
!     char_u    *acpname = NULL;
  
      *lf = s_lfDefault;
      if (name == NULL)
        return OK;
  
!     /* Convert 'name' from 'encoding' to the current codepage, because
!      * lf->lfFaceName uses the current codepage.
!      * TODO: Use Wide APIs instead of ANSI APIs. */
!     if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
!     {
!       int     len;
!       enc_to_acp(name, (int)STRLEN(name), &acpname, &len);
!       name = acpname;
!     }
!     if (STRCMP(name, "*") == 0)
      {
  #if defined(FEAT_GUI_MSWIN)
!       CHOOSEFONT      cf;
        /* if name is "*", bring up std font dialog: */
        vim_memset(&cf, 0, sizeof(cf));
        cf.lStructSize = sizeof(cf);
--- 3060,3110 ----
  }
  
  /*
+  * Compare a UTF-16 string and an ASCII string literally.
+  * Only works all the code points are inside ASCII range.
+  */
+     static int
+ utf16ascncmp(const WCHAR *w, const char *p, size_t n)
+ {
+     size_t i;
+ 
+     for (i = 0; i < n; i++)
+     {
+       if (w[i] == 0 || w[i] != p[i])
+           return w[i] - p[i];
+     }
+     return 0;
+ }
+ 
+ /*
   * Get font info from "name" into logfont "lf".
   * Return OK for a valid name, FAIL otherwise.
   */
      int
  get_logfont(
!     LOGFONTW  *lf,
      char_u    *name,
      HDC               printer_dc,
      int               verbose)
  {
!     WCHAR     *p;
      int               i;
      int               ret = FAIL;
!     static LOGFONTW *lastlf = NULL;
!     WCHAR     *wname;
  
      *lf = s_lfDefault;
      if (name == NULL)
        return OK;
  
!     wname = enc_to_utf16(name, NULL);
!     if (wname == NULL)
!       return FAIL;
! 
!     if (wcscmp(wname, L"*") == 0)
      {
  #if defined(FEAT_GUI_MSWIN)
!       CHOOSEFONTW     cf;
        /* if name is "*", bring up std font dialog: */
        vim_memset(&cf, 0, sizeof(cf));
        cf.lStructSize = sizeof(cf);
***************
*** 3102,3108 ****
            *lf = *lastlf;
        cf.lpLogFont = lf;
        cf.nFontType = 0 ; //REGULAR_FONTTYPE;
!       if (ChooseFont(&cf))
            ret = OK;
  #endif
        goto theend;
--- 3114,3120 ----
            *lf = *lastlf;
        cf.lpLogFont = lf;
        cf.nFontType = 0 ; //REGULAR_FONTTYPE;
!       if (ChooseFontW(&cf))
            ret = OK;
  #endif
        goto theend;
***************
*** 3111,3124 ****
      /*
       * Split name up, it could be <name>:h<height>:w<width> etc.
       */
!     for (p = name; *p && *p != ':'; p++)
      {
!       if (p - name + 1 >= LF_FACESIZE)
            goto theend;                        /* Name too long */
!       lf->lfFaceName[p - name] = *p;
      }
!     if (p != name)
!       lf->lfFaceName[p - name] = NUL;
  
      /* First set defaults */
      lf->lfHeight = -12;
--- 3123,3136 ----
      /*
       * Split name up, it could be <name>:h<height>:w<width> etc.
       */
!     for (p = wname; *p && *p != L':'; p++)
      {
!       if (p - wname + 1 >= LF_FACESIZE)
            goto theend;                        /* Name too long */
!       lf->lfFaceName[p - wname] = *p;
      }
!     if (p != wname)
!       lf->lfFaceName[p - wname] = NUL;
  
      /* First set defaults */
      lf->lfHeight = -12;
***************
*** 3136,3153 ****
        int     did_replace = FALSE;
  
        for (i = 0; lf->lfFaceName[i]; ++i)
!           if (IsDBCSLeadByte(lf->lfFaceName[i]))
!               ++i;
!           else if (lf->lfFaceName[i] == '_')
            {
!               lf->lfFaceName[i] = ' ';
                did_replace = TRUE;
            }
        if (!did_replace || init_logfont(lf) == FAIL)
            goto theend;
      }
  
!     while (*p == ':')
        p++;
  
      /* Set the values found after ':' */
--- 3148,3163 ----
        int     did_replace = FALSE;
  
        for (i = 0; lf->lfFaceName[i]; ++i)
!           if (lf->lfFaceName[i] == L'_')
            {
!               lf->lfFaceName[i] = L' ';
                did_replace = TRUE;
            }
        if (!did_replace || init_logfont(lf) == FAIL)
            goto theend;
      }
  
!     while (*p == L':')
        p++;
  
      /* Set the values found after ':' */
***************
*** 3155,3184 ****
      {
        switch (*p++)
        {
!           case 'h':
                lf->lfHeight = - points_to_pixels(p, &p, TRUE, 
(long_i)printer_dc);
                break;
!           case 'w':
                lf->lfWidth = points_to_pixels(p, &p, FALSE, 
(long_i)printer_dc);
                break;
!           case 'b':
                lf->lfWeight = FW_BOLD;
                break;
!           case 'i':
                lf->lfItalic = TRUE;
                break;
!           case 'u':
                lf->lfUnderline = TRUE;
                break;
!           case 's':
                lf->lfStrikeOut = TRUE;
                break;
!           case 'c':
                {
                    struct charset_pair *cp;
  
                    for (cp = charset_pairs; cp->name != NULL; ++cp)
!                       if (STRNCMP(p, cp->name, strlen(cp->name)) == 0)
                        {
                            lf->lfCharSet = cp->charset;
                            p += strlen(cp->name);
--- 3165,3194 ----
      {
        switch (*p++)
        {
!           case L'h':
                lf->lfHeight = - points_to_pixels(p, &p, TRUE, 
(long_i)printer_dc);
                break;
!           case L'w':
                lf->lfWidth = points_to_pixels(p, &p, FALSE, 
(long_i)printer_dc);
                break;
!           case L'b':
                lf->lfWeight = FW_BOLD;
                break;
!           case L'i':
                lf->lfItalic = TRUE;
                break;
!           case L'u':
                lf->lfUnderline = TRUE;
                break;
!           case L's':
                lf->lfStrikeOut = TRUE;
                break;
!           case L'c':
                {
                    struct charset_pair *cp;
  
                    for (cp = charset_pairs; cp->name != NULL; ++cp)
!                       if (utf16ascncmp(p, cp->name, strlen(cp->name)) == 0)
                        {
                            lf->lfCharSet = cp->charset;
                            p += strlen(cp->name);
***************
*** 3186,3202 ****
                        }
                    if (cp->name == NULL && verbose)
                    {
!                       semsg(_("E244: Illegal charset name \"%s\" in font name 
\"%s\""), p, name);
                        break;
                    }
                    break;
                }
!           case 'q':
                {
                    struct quality_pair *qp;
  
                    for (qp = quality_pairs; qp->name != NULL; ++qp)
!                       if (STRNCMP(p, qp->name, strlen(qp->name)) == 0)
                        {
                            lf->lfQuality = qp->quality;
                            p += strlen(qp->name);
--- 3196,3214 ----
                        }
                    if (cp->name == NULL && verbose)
                    {
!                       char_u *s = utf16_to_enc(p, NULL);
!                       semsg(_("E244: Illegal charset name \"%s\" in font name 
\"%s\""), s, name);
!                       vim_free(s);
                        break;
                    }
                    break;
                }
!           case L'q':
                {
                    struct quality_pair *qp;
  
                    for (qp = quality_pairs; qp->name != NULL; ++qp)
!                       if (utf16ascncmp(p, qp->name, strlen(qp->name)) == 0)
                        {
                            lf->lfQuality = qp->quality;
                            p += strlen(qp->name);
***************
*** 3204,3210 ****
                        }
                    if (qp->name == NULL && verbose)
                    {
!                       semsg(_("E244: Illegal quality name \"%s\" in font name 
\"%s\""), p, name);
                        break;
                    }
                    break;
--- 3216,3224 ----
                        }
                    if (qp->name == NULL && verbose)
                    {
!                       char_u *s = utf16_to_enc(p, NULL);
!                       semsg(_("E244: Illegal quality name \"%s\" in font name 
\"%s\""), s, name);
!                       vim_free(s);
                        break;
                    }
                    break;
***************
*** 3214,3220 ****
                    semsg(_("E245: Illegal char '%c' in font name \"%s\""), 
p[-1], name);
                goto theend;
        }
!       while (*p == ':')
            p++;
      }
      ret = OK;
--- 3228,3234 ----
                    semsg(_("E245: Illegal char '%c' in font name \"%s\""), 
p[-1], name);
                goto theend;
        }
!       while (*p == L':')
            p++;
      }
      ret = OK;
***************
*** 3224,3234 ****
      if (ret == OK && printer_dc == NULL)
      {
        vim_free(lastlf);
!       lastlf = (LOGFONT *)alloc(sizeof(LOGFONT));
        if (lastlf != NULL)
!           mch_memmove(lastlf, lf, sizeof(LOGFONT));
      }
!     vim_free(acpname);
  
      return ret;
  }
--- 3238,3248 ----
      if (ret == OK && printer_dc == NULL)
      {
        vim_free(lastlf);
!       lastlf = (LOGFONTW *)alloc(sizeof(LOGFONTW));
        if (lastlf != NULL)
!           mch_memmove(lastlf, lf, sizeof(LOGFONTW));
      }
!     vim_free(wname);
  
      return ret;
  }
*** ../vim-8.1.1080/src/proto/gui_w32.pro       2019-02-01 20:42:18.718884011 
+0100
--- src/proto/gui_w32.pro       2019-03-30 16:20:37.994106945 +0100
***************
*** 70,76 ****
  void gui_mch_set_fg_color(guicolor_T color);
  void gui_mch_set_bg_color(guicolor_T color);
  void gui_mch_set_sp_color(guicolor_T color);
! void im_set_font(LOGFONT *lf);
  void im_set_position(int row, int col);
  void im_set_active(int active);
  int im_get_status(void);
--- 70,76 ----
  void gui_mch_set_fg_color(guicolor_T color);
  void gui_mch_set_bg_color(guicolor_T color);
  void gui_mch_set_sp_color(guicolor_T color);
! void im_set_font(LOGFONTW *lf);
  void im_set_position(int row, int col);
  void im_set_active(int active);
  int im_get_status(void);
*** ../vim-8.1.1080/src/proto/os_mswin.pro      2019-02-10 23:18:49.038187525 
+0100
--- src/proto/os_mswin.pro      2019-03-30 16:20:37.994106945 +0100
***************
*** 49,54 ****
  void serverProcessPendingMessages(void);
  char *charset_id2name(int id);
  char *quality_id2name(DWORD id);
! int get_logfont(LOGFONT *lf, char_u *name, HDC printer_dc, int verbose);
  void channel_init_winsock(void);
  /* vim: set ft=c : */
--- 49,54 ----
  void serverProcessPendingMessages(void);
  char *charset_id2name(int id);
  char *quality_id2name(DWORD id);
! int get_logfont(LOGFONTW *lf, char_u *name, HDC printer_dc, int verbose);
  void channel_init_winsock(void);
  /* vim: set ft=c : */
*** ../vim-8.1.1080/src/version.c       2019-03-30 15:59:48.086175476 +0100
--- src/version.c       2019-03-30 16:22:38.549119396 +0100
***************
*** 777,778 ****
--- 777,780 ----
  {   /* Add new patch number below this line */
+ /**/
+     1081,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
161. You get up before the sun rises to check your e-mail, and you
     find yourself in the very same chair long after the sun has set.

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui