Patch 8.1.0647
Problem:    MS-Windows: balloon_show() does not handle wide characters.
Solution:   Use CreateWindowExW(). (Yasuhiro Matsumoto, closes #3708)
Files:      src/gui_w32.c


*** ../vim-8.1.0646/src/gui_w32.c       2018-11-16 16:21:01.641310033 +0100
--- src/gui_w32.c       2018-12-27 22:36:34.745105652 +0100
***************
*** 4367,4380 ****
  
  typedef struct tagTOOLINFOA_NEW
  {
!       UINT cbSize;
!       UINT uFlags;
!       HWND hwnd;
!       UINT_PTR uId;
!       RECT rect;
!       HINSTANCE hinst;
!       LPSTR lpszText;
!       LPARAM lParam;
  } TOOLINFO_NEW;
  
  typedef struct tagNMTTDISPINFO_NEW
--- 4367,4380 ----
  
  typedef struct tagTOOLINFOA_NEW
  {
!     UINT       cbSize;
!     UINT       uFlags;
!     HWND       hwnd;
!     UINT_PTR   uId;
!     RECT       rect;
!     HINSTANCE  hinst;
!     LPSTR      lpszText;
!     LPARAM     lParam;
  } TOOLINFO_NEW;
  
  typedef struct tagNMTTDISPINFO_NEW
***************
*** 4387,4392 ****
--- 4387,4418 ----
      LPARAM     lParam;
  } NMTTDISPINFO_NEW;
  
+ #ifdef FEAT_MBYTE
+ typedef struct tagTOOLINFOW_NEW
+ {
+     UINT       cbSize;
+     UINT       uFlags;
+     HWND       hwnd;
+     UINT_PTR   uId;
+     RECT       rect;
+     HINSTANCE  hinst;
+     LPWSTR     lpszText;
+     LPARAM     lParam;
+     void       *lpReserved;
+ } TOOLINFOW_NEW;
+ 
+ typedef struct tagNMTTDISPINFOW_NEW
+ {
+     NMHDR      hdr;
+     LPWSTR     lpszText;
+     WCHAR      szText[80];
+     HINSTANCE  hinst;
+     UINT       uFlags;
+     LPARAM     lParam;
+ } NMTTDISPINFOW_NEW;
+ 
+ #endif
+ 
  typedef HRESULT (WINAPI* DLLGETVERSIONPROC)(DLLVERSIONINFO *);
  #ifndef TTM_SETMAXTIPWIDTH
  # define TTM_SETMAXTIPWIDTH   (WM_USER+24)
***************
*** 5502,5507 ****
--- 5528,5542 ----
            if (RegisterClassW(&wndclassw) == 0)
                return FAIL;
        }
+ 
+       s_textArea = CreateWindowExW(
+           0,
+           szTextAreaClassW, L"Vim text area",
+           WS_CHILD | WS_VISIBLE, 0, 0,
+           100,                                // Any value will do for now
+           100,                                // Any value will do for now
+           s_hwnd, NULL,
+           s_hinst, NULL);
      }
      else
  #endif
***************
*** 5520,5534 ****
  
        if (RegisterClass(&wndclass) == 0)
            return FAIL;
      }
-     s_textArea = CreateWindowEx(
-       0,
-       szTextAreaClass, "Vim text area",
-       WS_CHILD | WS_VISIBLE, 0, 0,
-       100,                            /* Any value will do for now */
-       100,                            /* Any value will do for now */
-       s_hwnd, NULL,
-       s_hinst, NULL);
  
      if (s_textArea == NULL)
        return FAIL;
--- 5555,5570 ----
  
        if (RegisterClass(&wndclass) == 0)
            return FAIL;
+ 
+       s_textArea = CreateWindowEx(
+           0,
+           szTextAreaClass, "Vim text area",
+           WS_CHILD | WS_VISIBLE, 0, 0,
+           100,                                // Any value will do for now
+           100,                                // Any value will do for now
+           s_hwnd, NULL,
+           s_hinst, NULL);
      }
  
      if (s_textArea == NULL)
        return FAIL;
***************
*** 6218,6226 ****
      static void
  draw_line(
      int               x1,
!     int               y1,
!     int               x2,
!     int               y2,
      COLORREF  color)
  {
  #if defined(FEAT_DIRECTX)
--- 6254,6262 ----
      static void
  draw_line(
      int               x1,
!     int               y1,
!     int               x2,
!     int               y2,
      COLORREF  color)
  {
  #if defined(FEAT_DIRECTX)
***************
*** 6241,6247 ****
      static void
  set_pixel(
      int               x,
!     int               y,
      COLORREF  color)
  {
  #if defined(FEAT_DIRECTX)
--- 6277,6283 ----
      static void
  set_pixel(
      int               x,
!     int               y,
      COLORREF  color)
  {
  #if defined(FEAT_DIRECTX)
***************
*** 6255,6261 ****
      static void
  fill_rect(
      const RECT        *rcp,
!     HBRUSH            hbr,
      COLORREF  color)
  {
  #if defined(FEAT_DIRECTX)
--- 6291,6297 ----
      static void
  fill_rect(
      const RECT        *rcp,
!     HBRUSH    hbr,
      COLORREF  color)
  {
  #if defined(FEAT_DIRECTX)
***************
*** 8745,8756 ****
--- 8781,8875 ----
      return multiline_tip;
  }
  
+ #ifdef FEAT_MBYTE
+     static void
+ make_tooltipw(BalloonEval *beval, char *text, POINT pt)
+ {
+     TOOLINFOW *pti;
+     int               ToolInfoSize;
+     WCHAR     *tofree = NULL;
+ 
+     if (multiline_balloon_available() == TRUE)
+       ToolInfoSize = sizeof(TOOLINFOW_NEW);
+     else
+       ToolInfoSize = sizeof(TOOLINFOW);
+ 
+     pti = (TOOLINFOW *)alloc(ToolInfoSize);
+     if (pti == NULL)
+       return;
+ 
+     beval->balloon = CreateWindowExW(WS_EX_TOPMOST, TOOLTIPS_CLASSW,
+           NULL, WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP,
+           CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
+           beval->target, NULL, s_hinst, NULL);
+ 
+     SetWindowPos(beval->balloon, HWND_TOPMOST, 0, 0, 0, 0,
+           SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
+ 
+     pti->cbSize = ToolInfoSize;
+     pti->uFlags = TTF_SUBCLASS;
+     pti->hwnd = beval->target;
+     pti->hinst = 0; // Don't use string resources
+     pti->uId = ID_BEVAL_TOOLTIP;
+ 
+     if (multiline_balloon_available() == TRUE)
+     {
+       RECT rect;
+       TOOLINFOW_NEW *ptin = (TOOLINFOW_NEW *)pti;
+       pti->lpszText = LPSTR_TEXTCALLBACKW;
+       tofree = enc_to_utf16((char_u*)text, NULL);
+       ptin->lParam = (LPARAM)tofree;
+       // switch multiline tooltips on
+       if (GetClientRect(s_textArea, &rect))
+           SendMessageW(beval->balloon, TTM_SETMAXTIPWIDTH, 0,
+                   (LPARAM)rect.right);
+     }
+     else
+     {
+       // do this old way
+       tofree = enc_to_utf16((char_u*)text, NULL);
+       pti->lpszText = tofree;
+     }
+ 
+     // Limit ballooneval bounding rect to CursorPos neighbourhood.
+     pti->rect.left = pt.x - 3;
+     pti->rect.top = pt.y - 3;
+     pti->rect.right = pt.x + 3;
+     pti->rect.bottom = pt.y + 3;
+ 
+     SendMessageW(beval->balloon, TTM_ADDTOOLW, 0, (LPARAM)pti);
+     // Make tooltip appear sooner.
+     SendMessageW(beval->balloon, TTM_SETDELAYTIME, TTDT_INITIAL, 10);
+     // I've performed some tests and it seems the longest possible life time
+     // of tooltip is 30 seconds.
+     SendMessageW(beval->balloon, TTM_SETDELAYTIME, TTDT_AUTOPOP, 30000);
+     /*
+      * HACK: force tooltip to appear, because it'll not appear until
+      * first mouse move. D*mn M$
+      * Amazingly moving (2, 2) and then (-1, -1) the mouse doesn't move.
+      */
+     mouse_event(MOUSEEVENTF_MOVE, 2, 2, 0, 0);
+     mouse_event(MOUSEEVENTF_MOVE, (DWORD)-1, (DWORD)-1, 0, 0);
+     vim_free(pti);
+     if (tofree != NULL)
+       vim_free(tofree);
+ }
+ #endif
+ 
      static void
  make_tooltip(BalloonEval *beval, char *text, POINT pt)
  {
      TOOLINFO  *pti;
      int               ToolInfoSize;
  
+ #ifdef FEAT_MBYTE
+     if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+     {
+       make_tooltipw(beval, text, pt);
+       return;
+     }
+ #endif
+ 
      if (multiline_balloon_available() == TRUE)
        ToolInfoSize = sizeof(TOOLINFO_NEW);
      else
***************
*** 8961,8966 ****
--- 9080,9095 ----
                info->uFlags |= TTF_DI_SETITEM;
            }
            break;
+ #ifdef FEAT_MBYTE
+       case TTN_GETDISPINFOW:
+           {
+               // if we get here then we have new common controls
+               NMTTDISPINFOW_NEW *info = (NMTTDISPINFOW_NEW *)pnmh;
+               info->lpszText = (LPWSTR)info->lParam;
+               info->uFlags |= TTF_DI_SETITEM;
+           }
+           break;
+ #endif
        }
      }
  }
*** ../vim-8.1.0646/src/version.c       2018-12-27 22:10:57.797337989 +0100
--- src/version.c       2018-12-27 22:42:39.585979851 +0100
***************
*** 801,802 ****
--- 801,804 ----
  {   /* Add new patch number below this line */
+ /**/
+     647,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
60. As your car crashes through the guardrail on a mountain road, your first
    instinct is to search for the "back" button.

 /// 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