#include "wx/gtk/private.h"
#include "wx/gtk/private/mnemonics.h"
-// 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_menu_ensure_uline_accel_group(m) gtk_menu_get_accel_group(m)
-
-#define ACCEL_OBJECT GtkWindow
-#define ACCEL_OBJECTS(a) (a)->acceleratables
-#define ACCEL_OBJ_CAST(obj) ((GtkWindow*) obj)
-
// we use normal item but with a special id for the menu title
static const int wxGTK_TITLE_ID = -3;
-extern "C" static void gtk_menu_clicked_callback(GtkWidget *widget, wxMenu *menu);
-
-//-----------------------------------------------------------------------------
-// idle system
-//-----------------------------------------------------------------------------
+// forward declare it as it's used by wxMenuBar too when using Hildon
+extern "C"
+{
+ static void gtk_menu_clicked_callback(GtkWidget *widget, wxMenu *menu);
+}
#if wxUSE_ACCEL
+static bool wxGetStockGtkAccelerator(const char *id, GdkModifierType *mod, guint *key);
static wxString GetGtkHotKey( const wxMenuItem& item );
#endif
event.SetEventObject( menu );
wxEvtHandler* handler = menu->GetEventHandler();
- if (handler && handler->ProcessEvent(event))
+ if (handler && handler->SafelyProcessEvent(event))
return;
wxWindow *win = menu->GetInvokingWindow();
if (win)
- win->GetEventHandler()->ProcessEvent( event );
+ win->HandleWindowEvent( event );
}
extern "C" {
void wxMenuBar::Init(size_t n, wxMenu *menus[], const wxString titles[], long style)
{
- m_style = style;
m_invokingWindow = NULL;
#if wxUSE_LIBHILDON
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 );
+ if (menu->m_accel && g_slist_find(menu->m_accel->acceleratables, top_frame->m_widget))
+ gtk_window_remove_accel_group(GTK_WINDOW(top_frame->m_widget), menu->m_accel);
wxMenuItemList::compatibility_iterator node = menu->GetMenuItems().GetFirst();
while (node)
top_frame = top_frame->GetParent();
// support for native hot keys
- ACCEL_OBJECT *obj = ACCEL_OBJ_CAST(top_frame->m_widget);
- if ( !g_slist_find( ACCEL_OBJECTS(menu->m_accel), obj ) )
- gtk_accel_group_attach( menu->m_accel, obj );
+ if (menu->m_accel && !g_slist_find(menu->m_accel->acceleratables, top_frame->m_widget))
+ gtk_window_add_accel_group(GTK_WINDOW(top_frame->m_widget), menu->m_accel);
wxMenuItemList::compatibility_iterator node = menu->GetMenuItems().GetFirst();
while (node)
if ( !menu )
return (wxMenu*) NULL;
- gtk_menu_item_remove_submenu( GTK_MENU_ITEM(menu->m_owner) );
+ gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu->m_owner), NULL);
gtk_container_remove(GTK_CONTAINER(m_menubar), menu->m_owner);
gtk_widget_destroy( menu->m_owner );
if (item->IsCheckable())
commandEvent.SetInt(item->IsChecked());
- frame->GetEventHandler()->ProcessEvent(commandEvent);
+ frame->HandleWindowEvent(commandEvent);
}
else
{
event.SetEventObject( menu );
wxEvtHandler* handler = menu->GetEventHandler();
- if (handler && handler->ProcessEvent(event))
+ if (handler && handler->SafelyProcessEvent(event))
return;
wxWindow *win = menu->GetInvokingWindow();
- if (win) win->GetEventHandler()->ProcessEvent( event );
+ if (win) win->HandleWindowEvent( event );
}
}
event.SetEventObject( menu );
wxEvtHandler* handler = menu->GetEventHandler();
- if (handler && handler->ProcessEvent(event))
+ if (handler && handler->SafelyProcessEvent(event))
return;
wxWindow *win = menu->GetInvokingWindow();
if (win)
- win->GetEventHandler()->ProcessEvent( event );
+ win->HandleWindowEvent( event );
}
}
accel_key,
accel_mods );
}
-#endif // wxUSE_FILECTRL
+#endif // wxUSE_ACCEL
}
// NOTE: this function is different from the similar functions GTKProcessMnemonics()
m_menu = gtk_menu_new();
// NB: keep reference to the menu so that it is not destroyed behind
// our back by GTK+ e.g. when it is removed from menubar:
- gtk_widget_ref(m_menu);
+ g_object_ref(m_menu);
+ gtk_object_sink(GTK_OBJECT(m_menu));
m_owner = (GtkWidget*) NULL;
if ( GTK_IS_WIDGET( m_menu ))
{
// see wxMenu::Init
- gtk_widget_unref( m_menu );
+ g_object_unref(m_menu);
g_object_unref( m_accel );
// if the menu is inserted in another menu at this time, there was
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)
if ( mitem->IsSeparator() )
{
menuItem = gtk_separator_menu_item_new();
+ m_prevRadio = NULL;
}
else if ( mitem->GetBitmap().Ok() ||
(mitem->GetKind() == wxITEM_NORMAL && isstock) )
accel_mods,
GTK_ACCEL_VISIBLE);
}
-#endif // wxUSE_FILECTRL
+#endif // wxUSE_ACCEL
if (pos == -1)
gtk_menu_shell_append(GTK_MENU_SHELL(m_menu), menuItem);
wxMenuItem *wxMenu::DoRemove(wxMenuItem *item)
{
if ( !wxMenuBase::DoRemove(item) )
- return (wxMenuItem *)NULL;
+ return NULL;
+
+ GtkWidget * const mitem = item->GetMenuItem();
+ if ( m_prevRadio == mitem )
+ {
+ // deleting an item starts a new radio group (has to as we shouldn't
+ // keep a deleted pointer anyhow)
+ m_prevRadio = NULL;
+ }
// TODO: this code doesn't delete the item factory item and this seems
// impossible as of GTK 1.2.6.
- gtk_widget_destroy( item->GetMenuItem() );
+ gtk_widget_destroy( mitem );
return item;
}
return NULL;
}
+#if wxUSE_ACCEL
+static
bool wxGetStockGtkAccelerator(const char *id, GdkModifierType *mod, guint *key)
{
if (!id)
return false;
}
+#endif // wxUSE_ACCEL
#endif // wxUSE_MENUS