Skip to content

Commit

Permalink
patch 8.0.1212: MS-Windows: tear-off menu does not work on 64 bit
Browse files Browse the repository at this point in the history
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)
  • Loading branch information
brammool committed Oct 22, 2017
1 parent ca05aa2 commit 66857f4
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 3 deletions.
35 changes: 32 additions & 3 deletions src/gui_w32.c
Expand Up @@ -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
Expand All @@ -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);
Expand All @@ -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,
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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 */
Expand Down Expand Up @@ -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);
Expand Down
2 changes: 2 additions & 0 deletions src/version.c
Expand Up @@ -761,6 +761,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
1212,
/**/
1211,
/**/
Expand Down

0 comments on commit 66857f4

Please sign in to comment.