Mercurial > projects > dwt-linux
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); } /**