]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk1/menu.cpp
better fix for infinite loop in HandleOnNavigationKey() when wxUSE_STL==1 and start_n...
[wxWidgets.git] / src / gtk1 / menu.cpp
index f0dad01dcfe8962984494eb891bfd0f599f10c9d..43de6948daa11bf4bb01517ec154bf9ef3387481 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        menu.cpp
+// Name:        src/gtk1/menu.cpp
 // Purpose:
 // Author:      Robert Roebling
 // Id:          $Id$
     #include "wx/accel.h"
 #endif // wxUSE_ACCEL
 
-#include "wx/gtk/private.h"
+#include "wx/gtk1/private.h"
 
 #include <gdk/gdkkeysyms.h>
 
-// FIXME: is this right? somehow I don't think so (VZ)
-#ifdef __WXGTK20__
-    #include <glib-object.h>
-
-    #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 ACCEL_OBJECT        GtkObject
+#define ACCEL_OBJECTS(a)    (a)->attach_objects
+#define ACCEL_OBJ_CAST(obj) GTK_OBJECT(obj)
 
 // we use normal item but with a special id for the menu title
 static const int wxGTK_TITLE_ID = -3;
 
+// defined in window.cpp
+extern guint32 wxGtkTimeLastClick;
+
 //-----------------------------------------------------------------------------
 // idle system
 //-----------------------------------------------------------------------------
@@ -150,7 +140,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 +152,7 @@ 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)
     {
@@ -222,10 +210,8 @@ 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,12 +253,10 @@ 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,10 +274,8 @@ 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 +289,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,9 +302,6 @@ 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
@@ -338,7 +317,6 @@ bool wxMenuBar::GtkAppend(wxMenu *menu, const wxString& title, int pos)
                                     GDK_MOD1_MASK,
                                     GTK_ACCEL_LOCKED);
     }
-#endif
 
     gtk_widget_show( menu->m_owner );
 
@@ -371,20 +349,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)
@@ -769,16 +747,6 @@ wxString wxMenuItemBase::GetLabelFromText(const wxString& text)
             continue;
         }
 
-#ifdef __WXGTK20__
-        if ( *pc == wxT('\\')  )
-        {
-            // GTK 2.0 escapes "xxx/xxx" to "xxx\/xxx"
-            pc++;
-            label += *pc;
-            continue;
-        }
-#endif
-
         if ( (*pc == wxT('&')) && (*(pc+1) != wxT('&')) )
         {
             // wxMSW escapes "&"
@@ -799,7 +767,7 @@ void wxMenuItem::SetText( const wxString& str )
     // Some optimization to avoid flicker
     wxString oldLabel = m_text;
     oldLabel = wxStripMenuCodes(oldLabel);
-    oldLabel.Replace(wxT("_"), wxT(""));
+    oldLabel.Replace(wxT("_"), wxEmptyString);
     wxString label1 = wxStripMenuCodes(str);
     wxString oldhotkey = GetHotKey();    // Store the old hotkey in Ctrl-foo format
     wxCharBuffer oldbuf = wxGTK_CONV( GetGtkHotKey(*this) );  // and as <control>foo
@@ -818,16 +786,12 @@ 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
     }
 
     guint accel_key;
@@ -883,7 +847,7 @@ void wxMenuItem::DoSetText( const wxString& str )
         ++pc;
     }
 
-    m_hotKey = wxT("");
+    m_hotKey = wxEmptyString;
 
     if(*pc == wxT('\t'))
     {
@@ -944,9 +908,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;
@@ -1008,51 +972,22 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem, int pos)
     GtkWidget *menuItem;
 
     wxString text;
-#ifndef __WXGTK20__
-    GtkLabel* label;
-#endif
+    GtkLabel* label = NULL;
 
     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 ) );
-
-        GtkWidget *image;
-        if (bitmap->HasPixbuf())
-        {
-            image = gtk_image_new_from_pixbuf(bitmap->GetPixbuf());
-        }
-        else
-        {
-            GdkPixmap *gdk_pixmap = bitmap->GetPixmap();
-            GdkBitmap *gdk_bitmap = bitmap->GetMask() ?
-                                        bitmap->GetMask()->GetBitmap() :
-                                        (GdkBitmap*) NULL;
-            image = gtk_image_new_from_pixmap( gdk_pixmap, gdk_bitmap );
-        }
-
-        gtk_widget_show(image);
-
-        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;
     }
@@ -1065,14 +1000,10 @@ 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
                 m_prevRadio = NULL;
                 break;
             }
@@ -1083,25 +1014,16 @@ 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
                 }
                 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
                 }
                 break;
             }
@@ -1112,12 +1034,8 @@ 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
                 m_prevRadio = NULL;
                 break;
             }
@@ -1179,7 +1097,6 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem, int pos)
                                 (gpointer)this );
         }
 
-#ifndef __WXGTK20__
         guint accel_key = gtk_label_parse_uline (GTK_LABEL(label), wxGTK_CONV( text ) );
         if (accel_key != GDK_VoidSymbol)
         {
@@ -1190,7 +1107,6 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem, int pos)
                                         GDK_MOD1_MASK,
                                         GTK_ACCEL_LOCKED);
         }
-#endif
     }
 
     mitem->SetMenuItem(menuItem);
@@ -1201,7 +1117,7 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem, int pos)
         // gtk_widget_lock_accelerators(mitem->GetMenuItem());
     }
 
-    return TRUE;
+    return true;
 }
 
 wxMenuItem* wxMenu::DoAppend(wxMenuItem *mitem)
@@ -1529,13 +1445,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;
 }
 
-static void SetInvokingWindow( wxMenu *menu, wxWindow* win )
+WXDLLIMPEXP_CORE void SetInvokingWindow( wxMenu *menu, wxWindow* win )
 {
     menu->SetInvokingWindow( win );
 
@@ -1552,12 +1468,9 @@ 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
@@ -1621,11 +1534,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
+                  wxGtkTimeLastClick            // the time of activation
                 );
 
     while (is_waiting)
@@ -1642,4 +1551,3 @@ bool wxWindowGTK::DoPopupMenu( wxMenu *menu, int x, int y )
 }
 
 #endif // wxUSE_MENUS_NATIVE
-