diff dwt/widgets/Display.d @ 48:8e9ea24111fd

Menu, MenuItem
author Frank Benoit <benoit@tionex.de>
date Fri, 11 Jan 2008 10:04:18 +0100
parents f646579f309c
children 8f049b136add
line wrap: on
line diff
--- a/dwt/widgets/Display.d	Fri Jan 11 08:34:26 2008 +0100
+++ b/dwt/widgets/Display.d	Fri Jan 11 10:04:18 2008 +0100
@@ -2644,10 +2644,28 @@
 	return result [0];
 }
 
-int /*long*/ menuPositionProcMeth (GtkWidget * menu, int /*long*/ x, int /*long*/ y, int /*long*/ push_in, int /*long*/ user_data) {
-	Widget widget = getWidget (menu);
+
+package void doMenuPositionProc( GtkMenu* window, bool hasLocation ){
+    /*
+    * 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 ensure that the timestamp of the last
+    * event processed is used.
+    */
+    OS.gtk_menu_popup (window, null, null,
+        hasLocation ? &menuPositionProcFunc : null,
+        cast(void*)this, 0, getLastEventTime() );
+}
+
+private static extern(C) void menuPositionProcFunc (GtkMenu* menu, int* x, int* y, int* push_in, void* user_data) {
+    auto display = cast(Display)user_data;
+    display.menuPositionProc( menu, x, y, push_in, null );
+}
+
+void menuPositionProc (GtkMenu* menu, int* x, int* y, int* push_in, void* user_data) {
+	Widget widget = getWidget (cast(GtkWidget*)menu);
 	if (widget is null) return 0;
-	return widget.menuPositionProc (menu, x, y, push_in, user_data);
+	widget.menuPositionProc (menu, x, y, push_in, user_data);
 }
 
 /**