summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java1
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Menu.java10
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);