From 13d3511257d0f2cad7a2fdb81b7f9dff0e136016 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sat, 24 Dec 2005 01:21:27 +0000 Subject: [PATCH] send wxEVT_MENU_CLOSE from menubar deactivate handler, this ensures that the event is sent even when the menu is dismissed git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@36555 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/gtk/menu.cpp | 31 +++++++++++++++++++------------ src/gtk1/menu.cpp | 31 +++++++++++++++++++------------ 2 files changed, 38 insertions(+), 24 deletions(-) diff --git a/src/gtk/menu.cpp b/src/gtk/menu.cpp index 634cc5884f..89f152917f 100644 --- a/src/gtk/menu.cpp +++ b/src/gtk/menu.cpp @@ -126,11 +126,17 @@ static void gtk_menu_open_callback( GtkWidget *widget, wxMenu *menu ) DoCommonMenuCallbackCode(menu, event); } -static void gtk_menu_close_callback( GtkWidget *widget, wxMenu *menu ) +static void gtk_menu_close_callback( GtkWidget *widget, wxMenuBar *menubar ) { - wxMenuEvent event( wxEVT_MENU_CLOSE, -1, menu ); + if ( !menubar->GetMenuCount() ) + { + // if menubar is empty we can't call GetMenu(0) below + return; + } - DoCommonMenuCallbackCode(menu, event); + wxMenuEvent event( wxEVT_MENU_CLOSE, -1, NULL ); + + DoCommonMenuCallbackCode(menubar->GetMenu(0), event); } } @@ -177,6 +183,16 @@ void wxMenuBar::Init(size_t n, wxMenu *menus[], const wxString titles[], long st for (size_t i = 0; i < n; ++i ) Append(menus[i], titles[i]); + + // VZ: for some reason connecting to menus "deactivate" doesn't work (we + // don't get it when the menu is dismissed by clicking outside the + // toolbar) so we connect to the global one, even if it means that we + // can't pass the menu which was closed in wxMenuEvent object + gtk_signal_connect( GTK_OBJECT(GTK_MENU_SHELL(m_menubar)), + "deactivate", + GTK_SIGNAL_FUNC(gtk_menu_close_callback), + (gpointer)this ); + } wxMenuBar::wxMenuBar(size_t n, wxMenu *menus[], const wxString titles[], long style) @@ -337,15 +353,6 @@ bool wxMenuBar::GtkAppend(wxMenu *menu, const wxString& title, int pos) GTK_SIGNAL_FUNC(gtk_menu_open_callback), (gpointer)menu ); - // TODO: this is not enough as we don't get the notification if the menu is - // dismissed without any selection (e.g. by clicking outside it), but - // I couldn't find any GTK+ signal which would be triggered by this: - // neither selection-done, nor deactivate, nor cancel are - GtkMenuShell *menu_shell = &(GTK_MENU(menu->m_menu)->menu_shell); - gtk_signal_connect( GTK_OBJECT(menu_shell), "selection-done", - GTK_SIGNAL_FUNC(gtk_menu_close_callback), - (gpointer)menu ); - // m_invokingWindow is set after wxFrame::SetMenuBar(). This call enables // addings menu later on. if (m_invokingWindow) diff --git a/src/gtk1/menu.cpp b/src/gtk1/menu.cpp index 634cc5884f..89f152917f 100644 --- a/src/gtk1/menu.cpp +++ b/src/gtk1/menu.cpp @@ -126,11 +126,17 @@ static void gtk_menu_open_callback( GtkWidget *widget, wxMenu *menu ) DoCommonMenuCallbackCode(menu, event); } -static void gtk_menu_close_callback( GtkWidget *widget, wxMenu *menu ) +static void gtk_menu_close_callback( GtkWidget *widget, wxMenuBar *menubar ) { - wxMenuEvent event( wxEVT_MENU_CLOSE, -1, menu ); + if ( !menubar->GetMenuCount() ) + { + // if menubar is empty we can't call GetMenu(0) below + return; + } - DoCommonMenuCallbackCode(menu, event); + wxMenuEvent event( wxEVT_MENU_CLOSE, -1, NULL ); + + DoCommonMenuCallbackCode(menubar->GetMenu(0), event); } } @@ -177,6 +183,16 @@ void wxMenuBar::Init(size_t n, wxMenu *menus[], const wxString titles[], long st for (size_t i = 0; i < n; ++i ) Append(menus[i], titles[i]); + + // VZ: for some reason connecting to menus "deactivate" doesn't work (we + // don't get it when the menu is dismissed by clicking outside the + // toolbar) so we connect to the global one, even if it means that we + // can't pass the menu which was closed in wxMenuEvent object + gtk_signal_connect( GTK_OBJECT(GTK_MENU_SHELL(m_menubar)), + "deactivate", + GTK_SIGNAL_FUNC(gtk_menu_close_callback), + (gpointer)this ); + } wxMenuBar::wxMenuBar(size_t n, wxMenu *menus[], const wxString titles[], long style) @@ -337,15 +353,6 @@ bool wxMenuBar::GtkAppend(wxMenu *menu, const wxString& title, int pos) GTK_SIGNAL_FUNC(gtk_menu_open_callback), (gpointer)menu ); - // TODO: this is not enough as we don't get the notification if the menu is - // dismissed without any selection (e.g. by clicking outside it), but - // I couldn't find any GTK+ signal which would be triggered by this: - // neither selection-done, nor deactivate, nor cancel are - GtkMenuShell *menu_shell = &(GTK_MENU(menu->m_menu)->menu_shell); - gtk_signal_connect( GTK_OBJECT(menu_shell), "selection-done", - GTK_SIGNAL_FUNC(gtk_menu_close_callback), - (gpointer)menu ); - // m_invokingWindow is set after wxFrame::SetMenuBar(). This call enables // addings menu later on. if (m_invokingWindow) -- 2.45.2