diff options
-rw-r--r-- | bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java | 1 | ||||
-rw-r--r-- | bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Menu.java | 10 |
2 files changed, 8 insertions, 3 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java index 1d3562c876..6cb0f531d8 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java @@ -872,6 +872,7 @@ int /*long*/ eventProc (int /*long*/ event, int /*long*/ data) { addGdkEvent (OS.gdk_event_copy (event)); return 0; } + popupTime = gdkEvent.time; Control control = null; int /*long*/ window = 0; switch (gdkEvent.type) { diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Menu.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Menu.java index f86c59a563..9285e4d741 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Menu.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Menu.java @@ -173,8 +173,13 @@ public void _setVisible (boolean visible) { if (visible) { sendEvent (SWT.Show); if (getItemCount () != 0) { - int /*long*/ address = 0; - if (hasLocation) address = display.menuPositionProc; + int /*long*/ address = hasLocation ? display.menuPositionProc: 0; + /* + * Bug in GTK. The timestamp passed into gtk_menu_popup is used + * to perform an X pointer grab. It cannot be zero, else the grab + * will fail. The fix is to use the timestamp of the last event + * processed. + */ OS.gtk_menu_popup (handle, 0, 0, address, 0, 0, display.popupTime); } else { sendEvent (SWT.Hide); @@ -861,7 +866,6 @@ public void setVisible (boolean visible) { checkWidget(); if ((style & (SWT.BAR | SWT.DROP_DOWN)) != 0) return; if (visible) { - display.popupTime = OS.gtk_get_current_event_time(); display.addPopup (this); } else { display.removePopup (this); |