Skip to content

Commit 0004f23

Browse files
committed
[Gtk4] Fix crash in Menu._setVisible
The branch when location can't be set was not ported to gtk 4 and still calls into gtk 3.x functions that are now gone.
1 parent db2adff commit 0004f23

1 file changed

Lines changed: 22 additions & 22 deletions

File tree

  • bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets

bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Menu.java

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -356,30 +356,30 @@ void _setVisible (boolean visible) {
356356
gdk_event_free (eventPtr);
357357
}
358358
} else {
359-
/*
360-
* GTK Feature: gtk_menu_popup is deprecated as of GTK3.22 and the new method gtk_menu_popup_at_pointer
361-
* requires an event to hook on to. This requires the popup & events related to the menu be handled
362-
* immediately and not as a post event in display, requiring the current event.
363-
*/
364-
eventPtr = GTK3.gtk_get_current_event();
365-
if (eventPtr == 0) {
366-
eventPtr = GDK.gdk_event_new(GTK.GTK4 ? GDK.GDK4_BUTTON_PRESS : GDK.GDK_BUTTON_PRESS);
367-
GdkEventButton event = new GdkEventButton ();
368-
event.type = GTK.GTK4 ? GDK.GDK4_BUTTON_PRESS : GDK.GDK_BUTTON_PRESS;
369-
// Only assign a window on X11, as on Wayland the window is that of the mouse pointer
370-
if (OS.isX11()) {
371-
event.window = OS.g_object_ref(GTK3.gtk_widget_get_window (getShell().handle));
372-
}
373-
event.device = GDK.gdk_get_pointer(GDK.gdk_display_get_default ());
374-
event.time = display.getLastEventTime ();
375-
GTK3.memmove (eventPtr, event, GdkEventButton.sizeof);
376-
}
377-
adjustParentWindowWayland(eventPtr);
378-
verifyMenuPosition(getItemCount());
379-
GTK3.gtk_menu_popup_at_pointer(handle, eventPtr);
380359
if (GTK.GTK4) {
381-
GDK.gdk_event_unref(eventPtr);
360+
GTK.gtk_popover_popup(handle);
382361
} else {
362+
/*
363+
* GTK Feature: gtk_menu_popup is deprecated as of GTK3.22 and the new method gtk_menu_popup_at_pointer
364+
* requires an event to hook on to. This requires the popup & events related to the menu be handled
365+
* immediately and not as a post event in display, requiring the current event.
366+
*/
367+
eventPtr = GTK3.gtk_get_current_event();
368+
if (eventPtr == 0) {
369+
eventPtr = GDK.gdk_event_new(GTK.GTK4 ? GDK.GDK4_BUTTON_PRESS : GDK.GDK_BUTTON_PRESS);
370+
GdkEventButton event = new GdkEventButton ();
371+
event.type = GTK.GTK4 ? GDK.GDK4_BUTTON_PRESS : GDK.GDK_BUTTON_PRESS;
372+
// Only assign a window on X11, as on Wayland the window is that of the mouse pointer
373+
if (OS.isX11()) {
374+
event.window = OS.g_object_ref(GTK3.gtk_widget_get_window (getShell().handle));
375+
}
376+
event.device = GDK.gdk_get_pointer(GDK.gdk_display_get_default ());
377+
event.time = display.getLastEventTime ();
378+
GTK3.memmove (eventPtr, event, GdkEventButton.sizeof);
379+
}
380+
adjustParentWindowWayland(eventPtr);
381+
verifyMenuPosition(getItemCount());
382+
GTK3.gtk_menu_popup_at_pointer(handle, eventPtr);
383383
GDK.gdk_event_free(eventPtr);
384384
}
385385
}

0 commit comments

Comments
 (0)