To: vim_dev@googlegroups.com Subject: Patch 8.0.1212 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.0.1212 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) Files: src/gui_w32.c *** ../vim-8.0.1211/src/gui_w32.c 2017-10-22 15:36:09.914319084 +0200 --- src/gui_w32.c 2017-10-22 16:43:06.838655066 +0200 *************** *** 7568,7573 **** --- 7568,7593 ---- #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 * thinking its menus have been clicked), and go away when closed. *************** *** 7580,7586 **** --- 7600,7609 ---- 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,7601 **** if (GetCursorPos(&mp) && GetWindowRect(hwnd, &rect)) { (void)TrackPopupMenu( ! (HMENU)(long_u)(LOWORD(wParam) ^ 0x8000), TPM_LEFTALIGN | TPM_LEFTBUTTON, (int)rect.right - 8, (int)mp.y, --- 7617,7627 ---- if (GetCursorPos(&mp) && GetWindowRect(hwnd, &rect)) { + vimmenu_T *menu; + + menu = (vimmenu_T*)GetWindowLongPtr(hwnd, DWLP_USER); (void)TrackPopupMenu( ! tearoff_lookup_menuhandle(menu, LOWORD(wParam)), TPM_LEFTALIGN | TPM_LEFTBUTTON, (int)rect.right - 8, (int)mp.y, *************** *** 7707,7712 **** --- 7733,7739 ---- WORD dlgwidth; WORD menuID; vimmenu_T *pmenu; + vimmenu_T *top_menu; vimmenu_T *the_menu = menu; HWND hwnd; HDC hdc; *************** *** 7885,7890 **** --- 7912,7918 ---- 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,8005 **** /* show modelessly */ ! the_menu->tearoff_handle = CreateDialogIndirect( s_hinst, (LPDLGTEMPLATE)pdlgtemplate, s_hwnd, ! (DLGPROC)tearoff_callback); LocalFree(LocalHandle(pdlgtemplate)); SelectFont(hdc, oldFont); --- 8023,8034 ---- /* show modelessly */ ! the_menu->tearoff_handle = CreateDialogIndirectParam( s_hinst, (LPDLGTEMPLATE)pdlgtemplate, s_hwnd, ! (DLGPROC)tearoff_callback, ! (LPARAM)top_menu); LocalFree(LocalHandle(pdlgtemplate)); SelectFont(hdc, oldFont); *** ../vim-8.0.1211/src/version.c 2017-10-22 15:36:09.914319084 +0200 --- src/version.c 2017-10-22 16:41:29.175331125 +0200 *************** *** 763,764 **** --- 763,766 ---- { /* Add new patch number below this line */ + /**/ + 1212, /**/ -- ARTHUR: Be quiet! DENNIS: Well you can't expect to wield supreme executive power just 'cause some watery tart threw a sword at you! ARTHUR: Shut up! DENNIS: I mean, if I went around sayin' I was an empereror just because some moistened bint had lobbed a scimitar at me they'd put me away! The Quest for the Holy Grail (Monty Python) /// Bram Moolenaar -- Bram@Moolenaar.net -- 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 ///