X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/43a11e2a507fe0300ac28c0667bfbecdcc51f432..3d3f3e3749fa5812c1937736b8745d696263a8b5:/src/gtk/menu.cpp diff --git a/src/gtk/menu.cpp b/src/gtk/menu.cpp index f0dad01dcf..f27623a980 100644 --- a/src/gtk/menu.cpp +++ b/src/gtk/menu.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: menu.cpp +// Name: src/gtk/menu.cpp // Purpose: // Author: Robert Roebling // Id: $Id$ @@ -11,10 +11,13 @@ #include "wx/wxprec.h" #include "wx/menu.h" -#include "wx/log.h" -#include "wx/intl.h" -#include "wx/app.h" -#include "wx/bitmap.h" + +#ifndef WX_PRECOMP + #include "wx/intl.h" + #include "wx/log.h" + #include "wx/app.h" + #include "wx/bitmap.h" +#endif #if wxUSE_ACCEL #include "wx/accel.h" @@ -25,21 +28,14 @@ #include // FIXME: is this right? somehow I don't think so (VZ) -#ifdef __WXGTK20__ - #include - - #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) -#else // GTK+ 1.x - #define ACCEL_OBJECT GtkObject - #define ACCEL_OBJECTS(a) (a)->attach_objects - #define ACCEL_OBJ_CAST(obj) GTK_OBJECT(obj) -#endif + +#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; @@ -48,9 +44,6 @@ static const int wxGTK_TITLE_ID = -3; // idle system //----------------------------------------------------------------------------- -extern void wxapp_install_idle_handler(); -extern bool g_isIdle; - #if wxUSE_ACCEL static wxString GetGtkHotKey( const wxMenuItem& item ); #endif @@ -150,7 +143,7 @@ IMPLEMENT_DYNAMIC_CLASS(wxMenuBar,wxWindow) void wxMenuBar::Init(size_t n, wxMenu *menus[], const wxString titles[], long style) { // the parent window is known after wxFrame::SetMenu() - m_needParent = FALSE; + m_needParent = false; m_style = style; m_invokingWindow = (wxWindow*) NULL; @@ -162,9 +155,6 @@ void wxMenuBar::Init(size_t n, wxMenu *menus[], const wxString titles[], long st } m_menubar = gtk_menu_bar_new(); -#ifndef __WXGTK20__ - m_accel = gtk_accel_group_new(); -#endif if (style & wxMB_DOCKABLE) { @@ -188,10 +178,8 @@ void wxMenuBar::Init(size_t n, wxMenu *menus[], const wxString titles[], long st // 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 ); + g_signal_connect (m_menubar, "deactivate", + G_CALLBACK (gtk_menu_close_callback), this); } @@ -222,11 +210,6 @@ static void wxMenubarUnsetInvokingWindow( wxMenu *menu, wxWindow *win ) while (top_frame->GetParent() && !(top_frame->IsTopLevel())) top_frame = top_frame->GetParent(); -#ifndef __WXGTK20__ - // support for native hot keys - gtk_accel_group_detach( menu->m_accel, ACCEL_OBJ_CAST(top_frame->m_widget) ); -#endif - wxMenuItemList::compatibility_iterator node = menu->GetMenuItems().GetFirst(); while (node) { @@ -267,13 +250,6 @@ void wxMenuBar::SetInvokingWindow( wxWindow *win ) while (top_frame->GetParent() && !(top_frame->IsTopLevel())) top_frame = top_frame->GetParent(); -#ifndef __WXGTK20__ - // support for native key accelerators indicated by underscroes - ACCEL_OBJECT *obj = ACCEL_OBJ_CAST(top_frame->m_widget); - if ( !g_slist_find( ACCEL_OBJECTS(m_accel), obj ) ) - gtk_accel_group_attach( m_accel, obj ); -#endif - wxMenuList::compatibility_iterator node = m_menus.GetFirst(); while (node) { @@ -290,11 +266,6 @@ void wxMenuBar::UnsetInvokingWindow( wxWindow *win ) while (top_frame->GetParent() && !(top_frame->IsTopLevel())) top_frame = top_frame->GetParent(); -#ifndef __WXGTK20__ - // support for native key accelerators indicated by underscroes - gtk_accel_group_detach( m_accel, ACCEL_OBJ_CAST(top_frame->m_widget) ); -#endif - wxMenuList::compatibility_iterator node = m_menus.GetFirst(); while (node) { @@ -307,7 +278,7 @@ void wxMenuBar::UnsetInvokingWindow( wxWindow *win ) bool wxMenuBar::Append( wxMenu *menu, const wxString &title ) { if ( !wxMenuBarBase::Append( menu, title ) ) - return FALSE; + return false; return GtkAppend(menu, title); } @@ -320,25 +291,7 @@ bool wxMenuBar::GtkAppend(wxMenu *menu, const wxString& title, int pos) menu->SetTitle( str ); // The "m_owner" is the "menu item" -#ifdef __WXGTK20__ menu->m_owner = gtk_menu_item_new_with_mnemonic( wxGTK_CONV( str ) ); -#else - menu->m_owner = gtk_menu_item_new_with_label( wxGTK_CONV( str ) ); - GtkLabel *label = GTK_LABEL( GTK_BIN(menu->m_owner)->child ); - // set new text - gtk_label_set_text( label, wxGTK_CONV( str ) ); - // reparse key accel - guint accel_key = gtk_label_parse_uline (GTK_LABEL(label), wxGTK_CONV( str ) ); - if (accel_key != GDK_VoidSymbol) - { - gtk_widget_add_accelerator (menu->m_owner, - "activate_item", - m_accel, //gtk_menu_ensure_uline_accel_group(GTK_MENU(m_menubar)), - accel_key, - GDK_MOD1_MASK, - GTK_ACCEL_LOCKED); - } -#endif gtk_widget_show( menu->m_owner ); @@ -349,9 +302,9 @@ bool wxMenuBar::GtkAppend(wxMenu *menu, const wxString& title, int pos) else gtk_menu_shell_insert( GTK_MENU_SHELL(m_menubar), menu->m_owner, pos ); - gtk_signal_connect( GTK_OBJECT(menu->m_owner), "activate", - GTK_SIGNAL_FUNC(gtk_menu_open_callback), - (gpointer)menu ); + g_signal_connect (menu->m_owner, "activate", + G_CALLBACK (gtk_menu_open_callback), + menu); // m_invokingWindow is set after wxFrame::SetMenuBar(). This call enables // addings menu later on. @@ -371,20 +324,20 @@ bool wxMenuBar::GtkAppend(wxMenu *menu, const wxString& title, int pos) frame->UpdateMenuBarSize(); } - return TRUE; + return true; } bool wxMenuBar::Insert(size_t pos, wxMenu *menu, const wxString& title) { if ( !wxMenuBarBase::Insert(pos, menu, title) ) - return FALSE; + return false; // TODO if ( !GtkAppend(menu, title, (int)pos) ) - return FALSE; + return false; - return TRUE; + return true; } wxMenu *wxMenuBar::Replace(size_t pos, wxMenu *menu, const wxString& title) @@ -551,17 +504,7 @@ void wxMenuBar::SetLabelTop( size_t pos, const wxString& label ) menu->SetTitle( str ); if (menu->m_owner) - { - GtkLabel *glabel = GTK_LABEL( GTK_BIN(menu->m_owner)->child ); - - /* set new text */ - gtk_label_set( glabel, wxGTK_CONV( str ) ); - - /* reparse key accel */ - (void)gtk_label_parse_uline (GTK_LABEL(glabel), wxGTK_CONV( str ) ); - gtk_accel_label_refetch( GTK_ACCEL_LABEL(glabel) ); - } - + gtk_label_set_text_with_mnemonic( GTK_LABEL( GTK_BIN(menu->m_owner)->child), wxGTK_CONV(str) ); } //----------------------------------------------------------------------------- @@ -769,7 +712,6 @@ wxString wxMenuItemBase::GetLabelFromText(const wxString& text) continue; } -#ifdef __WXGTK20__ if ( *pc == wxT('\\') ) { // GTK 2.0 escapes "xxx/xxx" to "xxx\/xxx" @@ -777,7 +719,6 @@ wxString wxMenuItemBase::GetLabelFromText(const wxString& text) label += *pc; continue; } -#endif if ( (*pc == wxT('&')) && (*(pc+1) != wxT('&')) ) { @@ -802,7 +743,7 @@ void wxMenuItem::SetText( const wxString& str ) oldLabel.Replace(wxT("_"), wxT("")); wxString label1 = wxStripMenuCodes(str); wxString oldhotkey = GetHotKey(); // Store the old hotkey in Ctrl-foo format - wxCharBuffer oldbuf = wxGTK_CONV( GetGtkHotKey(*this) ); // and as foo + wxCharBuffer oldbuf = wxGTK_CONV_SYS( GetGtkHotKey(*this) ); // and as foo DoSetText(str); @@ -818,16 +759,7 @@ void wxMenuItem::SetText( const wxString& str ) else label = GTK_LABEL( GTK_BIN(m_menuItem)->child ); -#ifdef __WXGTK20__ - gtk_label_set_text_with_mnemonic( GTK_LABEL(label), wxGTK_CONV(m_text) ); -#else - // set new text - gtk_label_set( label, wxGTK_CONV( m_text ) ); - - // reparse key accel - (void)gtk_label_parse_uline (GTK_LABEL(label), wxGTK_CONV(m_text) ); - gtk_accel_label_refetch( GTK_ACCEL_LABEL(label) ); -#endif + gtk_label_set_text_with_mnemonic( GTK_LABEL(label), wxGTK_CONV_SYS(m_text) ); } guint accel_key; @@ -841,7 +773,7 @@ void wxMenuItem::SetText( const wxString& str ) accel_mods ); } - wxCharBuffer buf = wxGTK_CONV( GetGtkHotKey(*this) ); + wxCharBuffer buf = wxGTK_CONV_SYS( GetGtkHotKey(*this) ); gtk_accelerator_parse( (const char*) buf, &accel_key, &accel_mods); if (accel_key != 0) { @@ -926,7 +858,7 @@ void wxMenuItem::Check( bool check ) { case wxITEM_CHECK: case wxITEM_RADIO: - gtk_check_menu_item_set_state( (GtkCheckMenuItem*)m_menuItem, (gint)check ); + gtk_check_menu_item_set_active( (GtkCheckMenuItem*)m_menuItem, (gint)check ); break; default: @@ -944,9 +876,9 @@ void wxMenuItem::Enable( bool enable ) bool wxMenuItem::IsChecked() const { - wxCHECK_MSG( m_menuItem, FALSE, wxT("invalid menu item") ); + wxCHECK_MSG( m_menuItem, false, wxT("invalid menu item") ); - wxCHECK_MSG( IsCheckable(), FALSE, + wxCHECK_MSG( IsCheckable(), false, wxT("can't get state of uncheckable item!") ); return ((GtkCheckMenuItem*)m_menuItem)->active != 0; @@ -975,7 +907,7 @@ void wxMenu::Init() { GtkWidget *tearoff = gtk_tearoff_menu_item_new(); - gtk_menu_append(GTK_MENU(m_menu), tearoff); + gtk_menu_shell_append(GTK_MENU_SHELL(m_menu), tearoff); } m_prevRadio = NULL; @@ -1008,26 +940,17 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem, int pos) GtkWidget *menuItem; wxString text; -#ifndef __WXGTK20__ - GtkLabel* label; -#endif if ( mitem->IsSeparator() ) { -#ifdef __WXGTK20__ menuItem = gtk_separator_menu_item_new(); -#else - // TODO - menuItem = gtk_menu_item_new(); -#endif } else if (mitem->GetBitmap().Ok()) { text = mitem->GetText(); const wxBitmap *bitmap = &mitem->GetBitmap(); -#ifdef __WXGTK20__ - menuItem = gtk_image_menu_item_new_with_mnemonic( wxGTK_CONV( text ) ); + menuItem = gtk_image_menu_item_new_with_mnemonic( wxGTK_CONV_SYS( text ) ); GtkWidget *image; if (bitmap->HasPixbuf()) @@ -1047,13 +970,6 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem, int pos) gtk_image_menu_item_set_image( GTK_IMAGE_MENU_ITEM(menuItem), image ); -#else - // TODO - wxUnusedVar(bitmap); - menuItem = gtk_menu_item_new_with_label( wxGTK_CONV( text ) ); - label = GTK_LABEL( GTK_BIN(menuItem)->child ); -#endif - m_prevRadio = NULL; } else // a normal item @@ -1065,14 +981,7 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem, int pos) { case wxITEM_CHECK: { -#ifdef __WXGTK20__ - menuItem = gtk_check_menu_item_new_with_mnemonic( wxGTK_CONV( text ) ); -#else - menuItem = gtk_check_menu_item_new_with_label( wxGTK_CONV( text ) ); - label = GTK_LABEL( GTK_BIN(menuItem)->child ); - // set new text - gtk_label_set_text( label, wxGTK_CONV( text ) ); -#endif + menuItem = gtk_check_menu_item_new_with_mnemonic( wxGTK_CONV_SYS( text ) ); m_prevRadio = NULL; break; } @@ -1083,25 +992,14 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem, int pos) if ( m_prevRadio == NULL ) { // start of a new radio group -#ifdef __WXGTK20__ - m_prevRadio = menuItem = gtk_radio_menu_item_new_with_mnemonic( group, wxGTK_CONV( text ) ); -#else - m_prevRadio = menuItem = gtk_radio_menu_item_new_with_label( group, wxGTK_CONV( text ) ); - label = GTK_LABEL( GTK_BIN(menuItem)->child ); - // set new text - gtk_label_set_text( label, wxGTK_CONV( text ) ); -#endif + m_prevRadio = menuItem = + gtk_radio_menu_item_new_with_mnemonic( group, wxGTK_CONV_SYS( text ) ); } else // continue the radio group { -#ifdef __WXGTK20__ group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (m_prevRadio)); - m_prevRadio = menuItem = gtk_radio_menu_item_new_with_mnemonic( group, wxGTK_CONV( text ) ); -#else - group = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (m_prevRadio)); - m_prevRadio = menuItem = gtk_radio_menu_item_new_with_label( group, wxGTK_CONV( text ) ); - label = GTK_LABEL( GTK_BIN(menuItem)->child ); -#endif + m_prevRadio = menuItem = + gtk_radio_menu_item_new_with_mnemonic( group, wxGTK_CONV_SYS( text ) ); } break; } @@ -1112,12 +1010,7 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem, int pos) case wxITEM_NORMAL: { -#ifdef __WXGTK20__ - menuItem = gtk_menu_item_new_with_mnemonic( wxGTK_CONV( text ) ); -#else - menuItem = gtk_menu_item_new_with_label( wxGTK_CONV( text ) ); - label = GTK_LABEL( GTK_BIN(menuItem)->child ); -#endif + menuItem = gtk_menu_item_new_with_mnemonic( wxGTK_CONV_SYS( text ) ); m_prevRadio = NULL; break; } @@ -1127,7 +1020,7 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem, int pos) guint accel_key; GdkModifierType accel_mods; - wxCharBuffer buf = wxGTK_CONV( GetGtkHotKey(*mitem) ); + wxCharBuffer buf = wxGTK_CONV_SYS( GetGtkHotKey(*mitem) ); // wxPrintf( wxT("item: %s hotkey %s\n"), mitem->GetText().c_str(), GetGtkHotKey(*mitem).c_str() ); gtk_accelerator_parse( (const char*) buf, &accel_key, &accel_mods); @@ -1152,13 +1045,10 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem, int pos) { wxASSERT_MSG( menuItem, wxT("invalid menuitem") ); - gtk_signal_connect( GTK_OBJECT(menuItem), "select", - GTK_SIGNAL_FUNC(gtk_menu_hilight_callback), - (gpointer)this ); - - gtk_signal_connect( GTK_OBJECT(menuItem), "deselect", - GTK_SIGNAL_FUNC(gtk_menu_nolight_callback), - (gpointer)this ); + g_signal_connect (menuItem, "select", + G_CALLBACK (gtk_menu_hilight_callback), this); + g_signal_connect (menuItem, "deselect", + G_CALLBACK (gtk_menu_nolight_callback), this); if ( mitem->IsSubMenu() && mitem->GetKind() != wxITEM_RADIO && mitem->GetKind() != wxITEM_CHECK ) { @@ -1174,23 +1064,10 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem, int pos) } else { - gtk_signal_connect( GTK_OBJECT(menuItem), "activate", - GTK_SIGNAL_FUNC(gtk_menu_clicked_callback), - (gpointer)this ); - } - -#ifndef __WXGTK20__ - guint accel_key = gtk_label_parse_uline (GTK_LABEL(label), wxGTK_CONV( text ) ); - if (accel_key != GDK_VoidSymbol) - { - gtk_widget_add_accelerator (menuItem, - "activate_item", - gtk_menu_ensure_uline_accel_group(GTK_MENU(m_menu)), - accel_key, - GDK_MOD1_MASK, - GTK_ACCEL_LOCKED); + g_signal_connect (menuItem, "activate", + G_CALLBACK (gtk_menu_clicked_callback), + this); } -#endif } mitem->SetMenuItem(menuItem); @@ -1201,7 +1078,7 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem, int pos) // gtk_widget_lock_accelerators(mitem->GetMenuItem()); } - return TRUE; + return true; } wxMenuItem* wxMenu::DoAppend(wxMenuItem *mitem) @@ -1317,12 +1194,10 @@ static wxString GetGtkHotKey( const wxMenuItem& item ) hotkey << wxT("Down" ); break; case WXK_PAGEUP: - case WXK_PRIOR: - hotkey << wxT("Prior" ); + hotkey << wxT("PgUp" ); break; case WXK_PAGEDOWN: - case WXK_NEXT: - hotkey << wxT("Next" ); + hotkey << wxT("PgDn" ); break; case WXK_LEFT: hotkey << wxT("Left" ); @@ -1439,11 +1314,11 @@ static wxString GetGtkHotKey( const wxMenuItem& item ) case WXK_NUMPAD_DOWN: hotkey << wxT("KP_Down" ); break; - case WXK_NUMPAD_PRIOR: case WXK_NUMPAD_PAGEUP: - hotkey << wxT("KP_Prior" ); + case WXK_NUMPAD_PAGEUP: + hotkey << wxT("KP_PgUp" ); break; - case WXK_NUMPAD_NEXT: case WXK_NUMPAD_PAGEDOWN: - hotkey << wxT("KP_Next" ); + case WXK_NUMPAD_PAGEDOWN: + hotkey << wxT("KP_PgDn" ); break; case WXK_NUMPAD_END: hotkey << wxT("KP_End" ); @@ -1529,13 +1404,13 @@ static wxString GetGtkHotKey( const wxMenuItem& item ) #if wxUSE_MENUS_NATIVE -extern "C" +extern "C" WXDLLIMPEXP_CORE void gtk_pop_hide_callback( GtkWidget *WXUNUSED(widget), bool* is_waiting ) { - *is_waiting = FALSE; + *is_waiting = false; } -static void SetInvokingWindow( wxMenu *menu, wxWindow* win ) +WXDLLIMPEXP_CORE void SetInvokingWindow( wxMenu *menu, wxWindow* win ) { menu->SetInvokingWindow( win ); @@ -1552,12 +1427,10 @@ static void SetInvokingWindow( wxMenu *menu, wxWindow* win ) } } -extern "C" +extern "C" WXDLLIMPEXP_CORE void wxPopupMenuPositionCallback( GtkMenu *menu, gint *x, gint *y, -#ifdef __WXGTK20__ gboolean * WXUNUSED(whatever), -#endif gpointer user_data ) { // ensure that the menu appears entirely on screen @@ -1590,10 +1463,9 @@ bool wxWindowGTK::DoPopupMenu( wxMenu *menu, int x, int y ) bool is_waiting = true; - gulong handler = gtk_signal_connect( GTK_OBJECT(menu->m_menu), - "hide", - GTK_SIGNAL_FUNC(gtk_pop_hide_callback), - (gpointer)&is_waiting ); + gulong handler = g_signal_connect (menu->m_menu, "hide", + G_CALLBACK (gtk_pop_hide_callback), + &is_waiting); wxPoint pos; gpointer userdata; @@ -1621,11 +1493,7 @@ bool wxWindowGTK::DoPopupMenu( wxMenu *menu, int x, int y ) posfunc, // function to position it userdata, // client data 0, // button used to activate it -#ifdef __WXGTK20__ gtk_get_current_event_time() -#else - gs_timeLastClick // the time of activation -#endif ); while (is_waiting) @@ -1633,7 +1501,7 @@ bool wxWindowGTK::DoPopupMenu( wxMenu *menu, int x, int y ) gtk_main_iteration(); } - gtk_signal_disconnect(GTK_OBJECT(menu->m_menu), handler); + g_signal_handler_disconnect (menu->m_menu, handler); wxMenuEvent eventClose(wxEVT_MENU_CLOSE, -1, menu); DoCommonMenuCallbackCode(menu, eventClose); @@ -1642,4 +1510,3 @@ bool wxWindowGTK::DoPopupMenu( wxMenu *menu, int x, int y ) } #endif // wxUSE_MENUS_NATIVE -