diff options
author | Bram Moolenaar <Bram@vim.org> | 2017-10-22 16:43:20 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2017-10-22 16:43:20 +0200 |
commit | 66857f410426ca335f4771a58a32b2d14a7e52b9 (patch) | |
tree | 1faed00426248c703fdd4ba07abe726923fe55a9 | |
parent | ca05aa24af88836f8aa792360b3780589f294981 (diff) | |
download | vim-66857f410426ca335f4771a58a32b2d14a7e52b9.zip |
patch 8.0.1212: MS-Windows: tear-off menu does not work on 64 bit
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)
-rw-r--r-- | src/gui_w32.c | 35 | ||||
-rw-r--r-- | src/version.c | 2 |
2 files changed, 34 insertions, 3 deletions
diff --git a/src/gui_w32.c b/src/gui_w32.c index 64acc7652..4eaa2be38 100644 --- a/src/gui_w32.c +++ b/src/gui_w32.c @@ -7568,6 +7568,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 * thinking its menus have been clicked), and go away when closed. @@ -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); diff --git a/src/version.c b/src/version.c index f913633c7..2ac4de9f1 100644 --- a/src/version.c +++ b/src/version.c @@ -762,6 +762,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1212, +/**/ 1211, /**/ 1210, |