changeset 2617:d17e3fb76bde

dw_menu_popup() should also set handle NULL and add safety checks if missing.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Fri, 23 Jul 2021 19:42:06 +0000
parents a256caa5034c
children 156ad91481eb
files mac/dw.m os2/dw.c win/dw.c
diffstat 3 files changed, 26 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/mac/dw.m	Fri Jul 23 19:26:01 2021 +0000
+++ b/mac/dw.m	Fri Jul 23 19:42:06 2021 +0000
@@ -9432,25 +9432,29 @@
  */
 void API dw_menu_popup(HMENUI *menu, HWND parent, int x, int y)
 {
-    NSMenu *thismenu = (NSMenu *)*menu;
-    id object = parent;
-    NSView *view = [object isKindOfClass:[NSWindow class]] ? [object contentView] : parent;
-    NSWindow *window = [view window];
-    NSEvent *event = [DWApp currentEvent];
-    if(!window)
-        window = [event window];
-    [thismenu autorelease];
-    NSPoint p = NSMakePoint(x, [[NSScreen mainScreen] frame].size.height - y);
-    NSEvent* fake = [NSEvent mouseEventWithType:DWEventTypeRightMouseDown
-                                       location:_dw_windowPointFromScreen(window, p)
-                                  modifierFlags:0
-                                      timestamp:[event timestamp]
-                                   windowNumber:[window windowNumber]
-                                        context:[NSGraphicsContext currentContext]
-                                    eventNumber:1
-                                     clickCount:1
-                                       pressure:0.0];
-    [NSMenu popUpContextMenu:thismenu withEvent:fake forView:view];
+    if(menu)
+    {
+        NSMenu *thismenu = (NSMenu *)*menu;
+        id object = parent;
+        NSView *view = [object isKindOfClass:[NSWindow class]] ? [object contentView] : parent;
+        NSWindow *window = [view window];
+        NSEvent *event = [DWApp currentEvent];
+        if(!window)
+            window = [event window];
+        [thismenu autorelease];
+        NSPoint p = NSMakePoint(x, [[NSScreen mainScreen] frame].size.height - y);
+        NSEvent* fake = [NSEvent mouseEventWithType:DWEventTypeRightMouseDown
+                                           location:_dw_windowPointFromScreen(window, p)
+                                      modifierFlags:0
+                                          timestamp:[event timestamp]
+                                       windowNumber:[window windowNumber]
+                                            context:[NSGraphicsContext currentContext]
+                                        eventNumber:1
+                                         clickCount:1
+                                           pressure:0.0];
+        [NSMenu popUpContextMenu:thismenu withEvent:fake forView:view];
+        *menu = NULL;
+    }
 }
 
 char _dw_removetilde(char *dest, const char *src)
--- a/os2/dw.c	Fri Jul 23 19:26:01 2021 +0000
+++ b/os2/dw.c	Fri Jul 23 19:42:06 2021 +0000
@@ -6294,8 +6294,9 @@
    if(menu)
    {
       popup = parent;
-      dw_window_set_data(*menu, "_dw_popup", (void *)1);
+      dw_window_set_data(*menu, "_dw_popup", DW_INT_TO_POINTER(1));
       WinPopupMenu(HWND_DESKTOP, parent, *menu, x, dw_screen_height() - y, 0, PU_KEYBOARD | PU_MOUSEBUTTON1 | PU_VCONSTRAIN | PU_HCONSTRAIN);
+      *menu = 0;
    }
 }
 
--- a/win/dw.c	Fri Jul 23 19:26:01 2021 +0000
+++ b/win/dw.c	Fri Jul 23 19:42:06 2021 +0000
@@ -6848,6 +6848,7 @@
       _dw_popup = parent;
       TrackPopupMenu(mymenu, 0, x, y, 0, parent, NULL);
       PostMessage(DW_HWND_OBJECT, WM_USER+5, (LPARAM)mymenu, 0);
+      *menu = NULL;
    }
 }