]> git.saurik.com Git - wxWidgets.git/commitdiff
send wxEVT_MENU_CLOSE from menubar deactivate handler, this ensures that the event...
authorVadim Zeitlin <vadim@wxwidgets.org>
Sat, 24 Dec 2005 01:21:27 +0000 (01:21 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sat, 24 Dec 2005 01:21:27 +0000 (01:21 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@36555 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/gtk/menu.cpp
src/gtk1/menu.cpp

index 634cc5884fab61bdc3168b9cd7de073b90d1144a..89f152917f661b0d4da187833deb4d752becd880 100644 (file)
@@ -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)
index 634cc5884fab61bdc3168b9cd7de073b90d1144a..89f152917f661b0d4da187833deb4d752becd880 100644 (file)
@@ -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)