To: [email protected]
Subject: Patch 6.3a.010 (extra)
Fcc: outbox
From: Bram Moolenaar <[email protected]>
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8bit
------------

Patch 6.3a.010 (extra)
Problem:    Win32: Characters in the window title that do not appear in the
           active codepage are replaced by a question mark.
Solution:   Use DefWindowProcW() instead of DefWindowProc() when possible.
Files:      src/glbl_ime.cpp, src/globals.h, src/proto/gui_w16.pro,
           src/proto/gui_w32.pro, src/gui_w16.c, src/gui_w32.c, src/gui_w48.c


*** ../vim-6.3a.009/src/glbl_ime.cpp    Fri May  7 10:59:39 2004
--- src/glbl_ime.cpp    Tue May 11 22:29:41 2004
***************
*** 133,139 ****

     if (pIApp == NULL || pIApp->OnDefWindowProc(hWnd, Msg,
                                           wParam, lParam, &lResult) != S_OK)
!       lResult = DefWindowProc(hWnd, Msg, wParam, lParam);
     return lResult;
 }

--- 133,146 ----

     if (pIApp == NULL || pIApp->OnDefWindowProc(hWnd, Msg,
                                           wParam, lParam, &lResult) != S_OK)
!     {
! #if defined(WIN3264) && defined(FEAT_MBYTE)
!       if (wide_WindowProc)
!           lResult = DefWindowProcW(hwnd, Msg, wParam, lParam);
!       else
! #endif
!           lResult = DefWindowProc(hWnd, Msg, wParam, lParam);
!     }
     return lResult;
 }

*** ../vim-6.3a.009/src/globals.h       Fri May  7 10:59:37 2004
--- src/globals.h       Tue May 11 21:42:47 2004
***************
*** 675,680 ****
--- 675,684 ----
 # endif
 EXTERN int    has_mbyte INIT(= 0);            /* any multi-byte encoding */

+ #if defined(WIN3264) && defined(FEAT_MBYTE)
+ EXTERN int    wide_WindowProc INIT(= FALSE);  /* use wide WindowProc() */
+ #endif
+
 /*
  * To speed up BYTELEN() we fill a table with the byte lengths whenever
  * enc_utf8 or enc_dbcs changes.
*** ../vim-6.3a.009/src/proto/gui_w16.pro       Fri May  7 10:59:36 2004
--- src/proto/gui_w16.pro       Tue May 11 22:20:32 2004
***************
*** 2,7 ****
--- 2,8 ----
 void gui_mch_set_blinking __ARGS((long wait, long on, long off));
 void gui_mch_stop_blink __ARGS((void));
 void gui_mch_start_blink __ARGS((void));
+ LRESULT WINAPI vim_WindowProc __ARGS((HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam));
 void gui_mch_new_colors __ARGS((void));
 void gui_mch_def_colors __ARGS((void));
 int gui_mch_open __ARGS((void));
*** ../vim-6.3a.009/src/proto/gui_w32.pro       Fri May  7 10:59:36 2004
--- src/proto/gui_w32.pro       Tue May 11 22:20:27 2004
***************
*** 2,7 ****
--- 2,8 ----
 void gui_mch_set_blinking __ARGS((long wait, long on, long off));
 void gui_mch_stop_blink __ARGS((void));
 void gui_mch_start_blink __ARGS((void));
+ LRESULT WINAPI vim_WindowProc __ARGS((HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam));
 void gui_mch_new_colors __ARGS((void));
 void gui_mch_def_colors __ARGS((void));
 int gui_mch_open __ARGS((void));
*** ../vim-6.3a.009/src/gui_w16.c       Fri May  7 10:59:38 2004
--- src/gui_w16.c       Tue May 11 22:19:49 2004
***************
*** 37,42 ****
--- 37,46 ----
 # include <vimtbar.h>
 #endif

+ #ifdef PROTO
+ # define WINAPI
+ #endif
+
 #define HANDLE_WM_DROPFILES(hwnd, wParam, lParam, fn) \
     ((fn)((hwnd), (HDROP)(wParam)), 0L)

***************
*** 222,228 ****
           return HANDLE_WM_SYSCHAR((hwnd), (wParam), (lParam), (_OnSysChar));
 #ifdef FEAT_MENU
       else
!           return DefWindowProc(hwnd, uMsg, wParam, lParam);
 #endif

     case WM_SYSKEYUP:
--- 226,232 ----
           return HANDLE_WM_SYSCHAR((hwnd), (wParam), (lParam), (_OnSysChar));
 #ifdef FEAT_MENU
       else
!           return MyWindowProc(hwnd, uMsg, wParam, lParam);
 #endif

     case WM_SYSKEYUP:
***************
*** 230,236 ****
       /* Only when menu is active, ALT key is used for that. */
       if (gui.menu_is_active)
       {
!           return DefWindowProc(hwnd, uMsg, wParam, lParam);
       }
       else
 #endif
--- 234,240 ----
       /* Only when menu is active, ALT key is used for that. */
       if (gui.menu_is_active)
       {
!           return MyWindowProc(hwnd, uMsg, wParam, lParam);
       }
       else
 #endif
***************
*** 269,275 ****
           int x, y;
           int xPos = GET_X_LPARAM(lParam);

!           result = DefWindowProc(hwnd, uMsg, wParam, lParam);
           if (result == HTCLIENT)
           {
               gui_mch_get_winpos(&x, &y);
--- 273,279 ----
           int x, y;
           int xPos = GET_X_LPARAM(lParam);

!           result = MyWindowProc(hwnd, uMsg, wParam, lParam);
           if (result == HTCLIENT)
           {
               gui_mch_get_winpos(&x, &y);
***************
*** 291,297 ****
           _OnFindRepl();
       }
 #endif
!       return DefWindowProc(hwnd, uMsg, wParam, lParam);
     }

     return 1;
--- 295,301 ----
           _OnFindRepl();
       }
 #endif
!       return MyWindowProc(hwnd, uMsg, wParam, lParam);
     }

     return 1;
*** ../vim-6.3a.009/src/gui_w32.c       Fri May  7 10:59:40 2004
--- src/gui_w32.c       Tue May 11 22:20:08 2004
***************
*** 48,53 ****
--- 48,57 ----
 # include "xpm_w32.h"
 #endif

+ #ifdef PROTO
+ # define WINAPI
+ #endif
+
 #ifdef __MINGW32__
 /*
  * Add a lot of missing defines.
***************
*** 200,205 ****
--- 204,210 ----

 #define VIM_NAME      "vim"
 #define VIM_CLASS     "Vim"
+ #define VIM_CLASSW    L"Vim"

 /* Initial size for the dialog template.  For gui_mch_dialog() it's fixed,
  * thus there should be room for every dialog.  For tearoffs it's made bigger
***************
*** 545,551 ****
       netbeans_frame_moved(x, y);
     }
     /* Allow to send WM_SIZE and WM_MOVE */
!     FORWARD_WM_WINDOWPOSCHANGED(hwnd, lpwpos, DefWindowProc);
 }
 #endif

--- 550,556 ----
       netbeans_frame_moved(x, y);
     }
     /* Allow to send WM_SIZE and WM_MOVE */
!     FORWARD_WM_WINDOWPOSCHANGED(hwnd, lpwpos, MyWindowProc);
 }
 #endif

***************
*** 653,659 ****
           return HANDLE_WM_SYSCHAR((hwnd), (wParam), (lParam), (_OnSysChar));
 #ifdef FEAT_MENU
       else
!           return DefWindowProc(hwnd, uMsg, wParam, lParam);
 #endif

     case WM_SYSKEYUP:
--- 658,664 ----
           return HANDLE_WM_SYSCHAR((hwnd), (wParam), (lParam), (_OnSysChar));
 #ifdef FEAT_MENU
       else
!           return MyWindowProc(hwnd, uMsg, wParam, lParam);
 #endif

     case WM_SYSKEYUP:
***************
*** 662,668 ****
        * that.  But that caused problems when menu is disabled and using
        * Alt-Tab-Esc: get into a strange state where no mouse-moved events
        * are received, mouse pointer remains hidden. */
!       return DefWindowProc(hwnd, uMsg, wParam, lParam);
 #else
       return 0;
 #endif
--- 667,673 ----
        * that.  But that caused problems when menu is disabled and using
        * Alt-Tab-Esc: get into a strange state where no mouse-moved events
        * are received, mouse pointer remains hidden. */
!       return MyWindowProc(hwnd, uMsg, wParam, lParam);
 #else
       return 0;
 #endif
***************
*** 742,748 ****
           int         x, y;
           int         xPos = GET_X_LPARAM(lParam);

!           result = DefWindowProc(hwnd, uMsg, wParam, lParam);
           if (result == HTCLIENT)
           {
               gui_mch_get_winpos(&x, &y);
--- 747,753 ----
           int         x, y;
           int         xPos = GET_X_LPARAM(lParam);

!           result = MyWindowProc(hwnd, uMsg, wParam, lParam);
           if (result == HTCLIENT)
           {
               gui_mch_get_winpos(&x, &y);
***************
*** 761,771 ****
 #ifdef FEAT_MBYTE_IME
     case WM_IME_NOTIFY:
       if (!_OnImeNotify(hwnd, (DWORD)wParam, (DWORD)lParam))
!           return DefWindowProc(hwnd, uMsg, wParam, lParam);
       break;
     case WM_IME_COMPOSITION:
       if (!_OnImeComposition(hwnd, wParam, lParam))
!           return DefWindowProc(hwnd, uMsg, wParam, lParam);
       break;
 #endif

--- 766,776 ----
 #ifdef FEAT_MBYTE_IME
     case WM_IME_NOTIFY:
       if (!_OnImeNotify(hwnd, (DWORD)wParam, (DWORD)lParam))
!           return MyWindowProc(hwnd, uMsg, wParam, lParam);
       break;
     case WM_IME_COMPOSITION:
       if (!_OnImeComposition(hwnd, wParam, lParam))
!           return MyWindowProc(hwnd, uMsg, wParam, lParam);
       break;
 #endif

***************
*** 782,788 ****
           _OnFindRepl();
       }
 #endif
!       return DefWindowProc(hwnd, uMsg, wParam, lParam);
     }

     return 1;
--- 787,793 ----
           _OnFindRepl();
       }
 #endif
!       return MyWindowProc(hwnd, uMsg, wParam, lParam);
     }

     return 1;
***************
*** 964,969 ****
--- 969,978 ----
     const char szVimWndClass[] = VIM_CLASS;
     const char szTextAreaClass[] = "VimTextArea";
     WNDCLASS wndclass;
+ #ifdef FEAT_MBYTE
+     const WCHAR szVimWndClassW[] = VIM_CLASSW;
+     WNDCLASSW wndclassw;
+ #endif
 #ifdef GLOBAL_IME
     ATOM      atom;
 #endif
***************
*** 991,996 ****
--- 1000,1039 ----
     gui.border_width = 0;

     s_brush = CreateSolidBrush(GetSysColor(COLOR_BTNFACE));
+
+ #ifdef FEAT_MBYTE
+     /* First try using the wide version, so that we can use any title.
+      * Otherwise only characters in the active codepage will work. */
+     if (GetClassInfoW(s_hinst, szVimWndClassW, &wndclassw) == 0)
+     {
+       wndclassw.style = 0;
+       wndclassw.lpfnWndProc = _WndProc;
+       wndclassw.cbClsExtra = 0;
+       wndclassw.cbWndExtra = 0;
+       wndclassw.hInstance = s_hinst;
+       wndclassw.hIcon = LoadIcon(wndclassw.hInstance, "IDR_VIM");
+       wndclassw.hCursor = LoadCursor(NULL, IDC_ARROW);
+       wndclassw.hbrBackground = s_brush;
+       wndclassw.lpszMenuName = NULL;
+       wndclassw.lpszClassName = szVimWndClassW;
+
+       if ((
+ #ifdef GLOBAL_IME
+                   atom =
+ #endif
+                   RegisterClassW(&wndclassw)) == 0)
+       {
+           if (GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
+               return FAIL;
+
+           /* Must be Windows 98, fall back to non-wide function. */
+       }
+       else
+           wide_WindowProc = TRUE;
+     }
+
+     if (!wide_WindowProc)
+ #endif

     if (GetClassInfo(s_hinst, szVimWndClass, &wndclass) == 0)
     {
*** ../vim-6.3a.009/src/gui_w48.c       Fri May  7 10:59:38 2004
--- src/gui_w48.c       Tue May 11 22:20:25 2004
***************
*** 82,88 ****
 # define CONST
 # define FAR
 # define NEAR
- # define WINAPI
 # define _cdecl
 typedef int BOOL;
 typedef int BYTE;
--- 82,87 ----
***************
*** 186,200 ****
  */
 static int allow_scrollbar = FALSE;

-
 #ifdef GLOBAL_IME
- # undef DefWindowProc
- # define DefWindowProc(a, b, c, d) global_ime_DefWindowProc(a, b, c, d)
 # define MyTranslateMessage(x) global_ime_TranslateMessage(x)
 #else
 # define MyTranslateMessage(x) TranslateMessage(x)
 #endif

 extern int current_font_height;           /* this is in os_mswin.c */

 static struct
--- 185,204 ----
  */
 static int allow_scrollbar = FALSE;

 #ifdef GLOBAL_IME
 # define MyTranslateMessage(x) global_ime_TranslateMessage(x)
 #else
 # define MyTranslateMessage(x) TranslateMessage(x)
 #endif

+ #if (defined(WIN3264) && defined(FEAT_MBYTE)) || defined(GLOBAL_IME)
+   /* use of WindowProc depends on wide_WindowProc */
+ # define MyWindowProc vim_WindowProc
+ #else
+   /* use ordinary WindowProc */
+ # define MyWindowProc DefWindowProc
+ #endif
+
 extern int current_font_height;           /* this is in os_mswin.c */

 static struct
***************
*** 951,960 ****
 #endif

     default:
!       return DefWindowProc(hwnd, uMsg, wParam, lParam);
     }
 }

 /*
  * Called when the foreground or background color has been changed.
  */
--- 955,984 ----
 #endif

     default:
!       return MyWindowProc(hwnd, uMsg, wParam, lParam);
     }
 }

+ #if (defined(WIN3264) && defined(FEAT_MBYTE)) \
+       || defined(GLOBAL_IME) \
+       || defined(PROTO)
+ # ifdef PROTO
+ typedef int WINAPI;
+ # endif
+
+     LRESULT WINAPI
+ vim_WindowProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
+ {
+ # ifdef GLOBAL_IME
+     return global_ime_DefWindowProc(hwnd, message, wParam, lParam);
+ # else
+     if (wide_WindowProc)
+       return DefWindowProcW(hwnd, message, wParam, lParam);
+     return DefWindowProc(hwnd, message, wParam, lParam);
+ #endif
+ }
+ #endif
+
 /*
  * Called when the foreground or background color has been changed.
  */
***************
*** 2245,2251 ****
     HWND hwndOldFocus)
 {
     gui_focus_change(TRUE);
!     (void)DefWindowProc(hwnd, WM_SETFOCUS, (WPARAM)hwndOldFocus, 0);
 }

     static void
--- 2269,2275 ----
     HWND hwndOldFocus)
 {
     gui_focus_change(TRUE);
!     (void)MyWindowProc(hwnd, WM_SETFOCUS, (WPARAM)hwndOldFocus, 0);
 }

     static void
***************
*** 2254,2260 ****
     HWND hwndNewFocus)
 {
     gui_focus_change(FALSE);
!     (void)DefWindowProc(hwnd, WM_KILLFOCUS, (WPARAM)hwndNewFocus, 0);
 }

 /*
--- 2278,2284 ----
     HWND hwndNewFocus)
 {
     gui_focus_change(FALSE);
!     (void)MyWindowProc(hwnd, WM_KILLFOCUS, (WPARAM)hwndNewFocus, 0);
 }

 /*
***************
*** 2277,2283 ****
 {
     /* we call gui_focus_change() in _OnSetFocus() */
     /* gui_focus_change((int)fActivate); */
!     return DefWindowProc(hwnd, WM_ACTIVATEAPP, fActivate, (DWORD)dwThreadId);
 }

 #if defined(FEAT_WINDOWS) || defined(PROTO)
--- 2301,2307 ----
 {
     /* we call gui_focus_change() in _OnSetFocus() */
     /* gui_focus_change((int)fActivate); */
!     return MyWindowProc(hwnd, WM_ACTIVATEAPP, fActivate, (DWORD)dwThreadId);
 }

 #if defined(FEAT_WINDOWS) || defined(PROTO)
*** ../vim-6.3a.009/src/version.c       Tue May 11 19:47:24 2004
--- src/version.c       Tue May 11 22:27:14 2004
***************
*** 643,644 ****
--- 643,646 ----
 {   /* Add new patch number below this line */
+ /**/
+     10,
 /**/

--
Vi is clearly superior to emacs, since "vi" has only two characters
(and two keystrokes), while "emacs" has five.  (Randy C. Ford)

/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        Sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\              Project leader for A-A-P -- http://www.A-A-P.org        ///
\\\  Buy at Amazon and help AIDS victims -- http://ICCF.nl/click1.html ///