]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/menu.cpp
Minimum is now GTK+ 2.4
[wxWidgets.git] / src / gtk / menu.cpp
index 002d5f5668b3f7ba091c7bff6135cae4da6347d9..a48c4c3b0436e7cbab5a6a483c1425b9cd62309e 100644 (file)
 #include "wx/stockitem.h"
 #include "wx/gtk/private.h"
 
 #include "wx/stockitem.h"
 #include "wx/gtk/private.h"
 
-#ifdef __WXGTK20__
-#include <gdk/gdktypes.h>
-#endif
-
 // FIXME: is this right? somehow I don't think so (VZ)
 
 #define gtk_accel_group_attach(g, o) gtk_window_add_accel_group((o), (g))
 // FIXME: is this right? somehow I don't think so (VZ)
 
 #define gtk_accel_group_attach(g, o) gtk_window_add_accel_group((o), (g))
-//#define gtk_accel_group_detach(g, o) gtk_window_remove_accel_group((o), (g))
+#define gtk_accel_group_detach(g, o) gtk_window_remove_accel_group((o), (g))
 //#define gtk_menu_ensure_uline_accel_group(m) gtk_menu_get_accel_group(m)
 
 #define ACCEL_OBJECT        GtkWindow
 //#define gtk_menu_ensure_uline_accel_group(m) gtk_menu_get_accel_group(m)
 
 #define ACCEL_OBJECT        GtkWindow
@@ -143,14 +139,16 @@ static void DoCommonMenuCallbackCode(wxMenu *menu, wxMenuEvent& event)
 
 extern "C" {
 
 
 extern "C" {
 
-static void gtk_menu_open_callback( GtkWidget *widget, wxMenu *menu )
+static void
+gtk_menu_open_callback(GtkWidget * WXUNUSED(widget), wxMenu *menu)
 {
     wxMenuEvent event(wxEVT_MENU_OPEN, -1, menu);
 
     DoCommonMenuCallbackCode(menu, event);
 }
 
 {
     wxMenuEvent event(wxEVT_MENU_OPEN, -1, menu);
 
     DoCommonMenuCallbackCode(menu, event);
 }
 
-static void gtk_menu_close_callback( GtkWidget *widget, wxMenuBar *menubar )
+static void
+gtk_menu_close_callback(GtkWidget * WXUNUSED(widget), wxMenuBar *menubar)
 {
     if ( !menubar->GetMenuCount() )
     {
 {
     if ( !menubar->GetMenuCount() )
     {
@@ -239,6 +237,11 @@ static void wxMenubarUnsetInvokingWindow( wxMenu *menu, wxWindow *win )
     while (top_frame->GetParent() && !(top_frame->IsTopLevel()))
         top_frame = top_frame->GetParent();
 
     while (top_frame->GetParent() && !(top_frame->IsTopLevel()))
         top_frame = top_frame->GetParent();
 
+    // support for native hot keys
+    ACCEL_OBJECT *obj = ACCEL_OBJ_CAST(top_frame->m_widget);
+    if ( menu->m_accel && g_slist_find( ACCEL_OBJECTS(menu->m_accel), obj ) )
+        gtk_accel_group_detach( menu->m_accel, obj );
+
     wxMenuItemList::compatibility_iterator node = menu->GetMenuItems().GetFirst();
     while (node)
     {
     wxMenuItemList::compatibility_iterator node = menu->GetMenuItems().GetFirst();
     while (node)
     {
@@ -383,21 +386,8 @@ bool wxMenuBar::GtkAppend(wxMenu *menu, const wxString& title, int pos)
     // m_invokingWindow is set after wxFrame::SetMenuBar(). This call enables
     // addings menu later on.
     if (m_invokingWindow)
     // m_invokingWindow is set after wxFrame::SetMenuBar(). This call enables
     // addings menu later on.
     if (m_invokingWindow)
-    {
         wxMenubarSetInvokingWindow( menu, m_invokingWindow );
 
         wxMenubarSetInvokingWindow( menu, m_invokingWindow );
 
-            // OPTIMISE ME:  we should probably cache this, or pass it
-            //               directly, but for now this is a minimal
-            //               change to validate the new dynamic sizing.
-            //               see (and refactor :) similar code in Remove
-            //               below.
-
-        wxFrame *frame = wxDynamicCast( m_invokingWindow, wxFrame );
-
-        if( frame )
-            frame->UpdateMenuBarSize();
-    }
-
     return true;
 }
 
     return true;
 }
 
@@ -440,13 +430,7 @@ wxMenu *wxMenuBar::Remove(size_t pos)
     menu->m_owner = NULL;
 
     if (m_invokingWindow)
     menu->m_owner = NULL;
 
     if (m_invokingWindow)
-    {
-        // OPTIMISE ME:  see comment in GtkAppend
-        wxFrame *frame = wxDynamicCast( m_invokingWindow, wxFrame );
-
-        if( frame )
-            frame->UpdateMenuBarSize();
-    }
+        wxMenubarUnsetInvokingWindow( menu, m_invokingWindow );
 
     return menu;
 }
 
     return menu;
 }
@@ -627,7 +611,6 @@ static void gtk_menu_clicked_callback( GtkWidget *widget, wxMenu *menu )
         commandEvent.SetEventObject(frame);
         if (item->IsCheckable())
             commandEvent.SetInt(item->IsChecked());
         commandEvent.SetEventObject(frame);
         if (item->IsCheckable())
             commandEvent.SetInt(item->IsChecked());
-        commandEvent.SetEventObject(menu);
 
         frame->GetEventHandler()->ProcessEvent(commandEvent);
     }
 
         frame->GetEventHandler()->ProcessEvent(commandEvent);
     }
@@ -1049,8 +1032,6 @@ void wxMenu::Init()
 
 wxMenu::~wxMenu()
 {
 
 wxMenu::~wxMenu()
 {
-   WX_CLEAR_LIST(wxMenuItemList, m_items);
-
    if ( GTK_IS_WIDGET( m_menu ))
    {
        // see wxMenu::Init
    if ( GTK_IS_WIDGET( m_menu ))
    {
        // see wxMenu::Init
@@ -1062,6 +1043,13 @@ wxMenu::~wxMenu()
        if ( m_owner )
            gtk_widget_destroy( m_menu );
    }
        if ( m_owner )
            gtk_widget_destroy( m_menu );
    }
+
+   // This must come after we release GTK resources above. Otherwise, GTK will
+   // give warnings/errors when attempting to free accelerator resources from
+   // child items that just were destroyed (the m_menu widget can contain
+   // references to accelerators in child items. Problem detected when removing
+   // a menu from a wxMenuBar, and the removed menu had submenus with accelerators.)
+   WX_CLEAR_LIST(wxMenuItemList, m_items);
 }
 
 void wxMenu::SetLayoutDirection(const wxLayoutDirection dir)
 }
 
 void wxMenu::SetLayoutDirection(const wxLayoutDirection dir)