From 2d658d768bbe61997f1af4f7267c360d701bea5c Mon Sep 17 00:00:00 2001 From: paul Date: Mon, 14 Mar 2011 02:54:06 +0000 Subject: [PATCH] gtk2: make TPopupMenu.Popup synchronous git-svn-id: trunk@29831 - --- lcl/interfaces/gtk2/gtk2wsmenus.pp | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/lcl/interfaces/gtk2/gtk2wsmenus.pp b/lcl/interfaces/gtk2/gtk2wsmenus.pp index 3329dc935d..6d8af7f73e 100644 --- a/lcl/interfaces/gtk2/gtk2wsmenus.pp +++ b/lcl/interfaces/gtk2/gtk2wsmenus.pp @@ -82,6 +82,9 @@ implementation {$I gtk2defines.inc} +var + MenuWidget: PGtkWidget = nil; + function Gtk2MenuItemButtonPress(widget: PGtkWidget; event: PGdkEventButton; user_data: gpointer): gboolean; cdecl; var @@ -613,6 +616,8 @@ end; procedure gtkWSPopupMenuDeactivate(widget: PGtkWidget; data: gPointer); cdecl; begin + if widget = MenuWidget then + MenuWidget := nil; if data <> nil then g_idle_add(@gtkWSPopupDelayedClose, Pointer(PWidgetInfo(data)^.LCLObject)); end; @@ -645,7 +650,6 @@ class procedure TGtk2WSPopupMenu.Popup(const APopupMenu: TPopupMenu; const X, var APoint: TPoint; AProc: Pointer; - MenuWidget: PGtkWidget; WidgetInfo: PWidgetInfo; begin ReleaseMouseCapture; @@ -659,9 +663,22 @@ begin WidgetInfo^.DataOwner := False; // MenuWidget can be either GtkMenu or GtkMenuItem submenu if GTK_IS_MENU_ITEM(MenuWidget) then - MenuWidget := gtk_menu_item_get_submenu(PGtkMenuItem(MenuWidget)); + MenuWidget := gtk_menu_item_get_submenu(PGtkMenuItem(MenuWidget)); gtk_menu_popup(PGtkMenu(MenuWidget), nil, nil, TGtkMenuPositionFunc(AProc), WidgetInfo, 0, gtk_get_current_event_time()); + repeat + try + WidgetSet.AppProcessMessages; // process all events + except + if Application.CaptureExceptions then + Application.HandleException(APopupMenu) + else + raise; + end; + if Application.Terminated or not Assigned(MenuWidget) then + break; + Application.Idle(true); + until False; end; end.