From: Vadim Zeitlin Date: Sat, 24 Dec 2005 00:44:57 +0000 (+0000) Subject: send wxEVT_MENU_CLOSE at least sometimes X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/cdf003d46547475ab3fe3d770467458b124c6868 send wxEVT_MENU_CLOSE at least sometimes git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@36554 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/src/gtk/menu.cpp b/src/gtk/menu.cpp index 490f2cd86e..634cc5884f 100644 --- a/src/gtk/menu.cpp +++ b/src/gtk/menu.cpp @@ -101,12 +101,11 @@ static wxString wxReplaceUnderscore( const wxString& title ) // activate message from GTK //----------------------------------------------------------------------------- -extern "C" { -static void gtk_menu_open_callback( GtkWidget *widget, wxMenu *menu ) +static void DoCommonMenuCallbackCode(wxMenu *menu, wxMenuEvent& event) { - if (g_isIdle) wxapp_install_idle_handler(); + if (g_isIdle) + wxapp_install_idle_handler(); - wxMenuEvent event( wxEVT_MENU_OPEN, -1, menu ); event.SetEventObject( menu ); wxEvtHandler* handler = menu->GetEventHandler(); @@ -114,8 +113,26 @@ static void gtk_menu_open_callback( GtkWidget *widget, wxMenu *menu ) return; wxWindow *win = menu->GetInvokingWindow(); - if (win) win->GetEventHandler()->ProcessEvent( event ); + if (win) + win->GetEventHandler()->ProcessEvent( event ); +} + +extern "C" { + +static void gtk_menu_open_callback( GtkWidget *widget, wxMenu *menu ) +{ + wxMenuEvent event(wxEVT_MENU_OPEN, -1, menu); + + DoCommonMenuCallbackCode(menu, event); } + +static void gtk_menu_close_callback( GtkWidget *widget, wxMenu *menu ) +{ + wxMenuEvent event( wxEVT_MENU_CLOSE, -1, menu ); + + DoCommonMenuCallbackCode(menu, event); +} + } //----------------------------------------------------------------------------- @@ -320,6 +337,15 @@ 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 490f2cd86e..634cc5884f 100644 --- a/src/gtk1/menu.cpp +++ b/src/gtk1/menu.cpp @@ -101,12 +101,11 @@ static wxString wxReplaceUnderscore( const wxString& title ) // activate message from GTK //----------------------------------------------------------------------------- -extern "C" { -static void gtk_menu_open_callback( GtkWidget *widget, wxMenu *menu ) +static void DoCommonMenuCallbackCode(wxMenu *menu, wxMenuEvent& event) { - if (g_isIdle) wxapp_install_idle_handler(); + if (g_isIdle) + wxapp_install_idle_handler(); - wxMenuEvent event( wxEVT_MENU_OPEN, -1, menu ); event.SetEventObject( menu ); wxEvtHandler* handler = menu->GetEventHandler(); @@ -114,8 +113,26 @@ static void gtk_menu_open_callback( GtkWidget *widget, wxMenu *menu ) return; wxWindow *win = menu->GetInvokingWindow(); - if (win) win->GetEventHandler()->ProcessEvent( event ); + if (win) + win->GetEventHandler()->ProcessEvent( event ); +} + +extern "C" { + +static void gtk_menu_open_callback( GtkWidget *widget, wxMenu *menu ) +{ + wxMenuEvent event(wxEVT_MENU_OPEN, -1, menu); + + DoCommonMenuCallbackCode(menu, event); } + +static void gtk_menu_close_callback( GtkWidget *widget, wxMenu *menu ) +{ + wxMenuEvent event( wxEVT_MENU_CLOSE, -1, menu ); + + DoCommonMenuCallbackCode(menu, event); +} + } //----------------------------------------------------------------------------- @@ -320,6 +337,15 @@ 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)