]> granicus.if.org Git - vim/commitdiff
patch 8.0.1212: MS-Windows: tear-off menu does not work on 64 bit v8.0.1212
authorBram Moolenaar <Bram@vim.org>
Sun, 22 Oct 2017 14:43:20 +0000 (16:43 +0200)
committerBram Moolenaar <Bram@vim.org>
Sun, 22 Oct 2017 14:43:20 +0000 (16:43 +0200)
Problem:    MS-Windows: tear-off menu does not work on 64 bit. (shaggyaxe)
Solution:   Change how the menu handle is looked up. (Ken Takata, closes
            #1205)

src/gui_w32.c
src/version.c

index 64acc76527998a520b0a8af11a74a1b3d1acab58..4eaa2be384c164e56e031f3157c6953068e869bf 100644 (file)
@@ -7567,6 +7567,26 @@ nCopyAnsiToWideChar(
 
 
 #ifdef FEAT_TEAROFF
+/*
+ * Lookup menu handle from "menu_id".
+ */
+    static HMENU
+tearoff_lookup_menuhandle(
+    vimmenu_T *menu,
+    WORD menu_id)
+{
+    for ( ; menu != NULL; menu = menu->next)
+    {
+       if (menu->modes == 0)   /* this menu has just been deleted */
+           continue;
+       if (menu_is_separator(menu->dname))
+           continue;
+       if ((WORD)((long_u)(menu->submenu_id) | (DWORD)0x8000) == menu_id)
+           return menu->submenu_id;
+    }
+    return NULL;
+}
+
 /*
  * The callback function for all the modeless dialogs that make up the
  * "tearoff menus" Very simple - forward button presses (to fool Vim into
@@ -7580,7 +7600,10 @@ tearoff_callback(
     LPARAM lParam)
 {
     if (message == WM_INITDIALOG)
+    {
+       SetWindowLongPtr(hwnd, DWLP_USER, (LONG_PTR)lParam);
        return (TRUE);
+    }
 
     /* May show the mouse pointer again. */
     HandleMouseHide(message, lParam);
@@ -7594,8 +7617,11 @@ tearoff_callback(
 
            if (GetCursorPos(&mp) && GetWindowRect(hwnd, &rect))
            {
+               vimmenu_T *menu;
+
+               menu = (vimmenu_T*)GetWindowLongPtr(hwnd, DWLP_USER);
                (void)TrackPopupMenu(
-                        (HMENU)(long_u)(LOWORD(wParam) ^ 0x8000),
+                        tearoff_lookup_menuhandle(menu, LOWORD(wParam)),
                         TPM_LEFTALIGN | TPM_LEFTBUTTON,
                         (int)rect.right - 8,
                         (int)mp.y,
@@ -7707,6 +7733,7 @@ gui_mch_tearoff(
     WORD       dlgwidth;
     WORD       menuID;
     vimmenu_T  *pmenu;
+    vimmenu_T  *top_menu;
     vimmenu_T  *the_menu = menu;
     HWND       hwnd;
     HDC                hdc;
@@ -7885,6 +7912,7 @@ gui_mch_tearoff(
        menu = menu->children->next;
     else
        menu = menu->children;
+    top_menu = menu;
     for ( ; menu != NULL; menu = menu->next)
     {
        if (menu->modes == 0)   /* this menu has just been deleted */
@@ -7995,11 +8023,12 @@ gui_mch_tearoff(
 
 
     /* show modelessly */
-    the_menu->tearoff_handle = CreateDialogIndirect(
+    the_menu->tearoff_handle = CreateDialogIndirectParam(
            s_hinst,
            (LPDLGTEMPLATE)pdlgtemplate,
            s_hwnd,
-           (DLGPROC)tearoff_callback);
+           (DLGPROC)tearoff_callback,
+           (LPARAM)top_menu);
 
     LocalFree(LocalHandle(pdlgtemplate));
     SelectFont(hdc, oldFont);
index f913633c7ab4d3cfc9b29e329c912c8c9ab11cfa..2ac4de9f13f3c8a09b94c76e07976ece72049b6d 100644 (file)
@@ -761,6 +761,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1212,
 /**/
     1211,
 /**/