]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk1/control.cpp
revert memory leak fix, it causes crash
[wxWidgets.git] / src / gtk1 / control.cpp
index 735fdd924f6df29d125d0cc3903bc34088eb0abb..e41fdb9cbe662f0564c2c0208fc3948fc04a8beb 100644 (file)
@@ -1,6 +1,6 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        control.cpp
-// Purpose:
+// Name:        src/gtk1/control.cpp
+// Purpose:     wxControl implementation for wxGTK
 // Author:      Robert Roebling
 // Id:          $Id$
 // Copyright:   (c) 1998 Robert Roebling, Julian Smart and Vadim Zeitlin
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
-#include "wx/defs.h"
-
 #if wxUSE_CONTROLS
 
 #include "wx/control.h"
+
+#ifndef WX_PRECOMP
+    #include "wx/log.h"
+    #include "wx/settings.h"
+#endif
+
 #include "wx/fontutil.h"
-#include "wx/settings.h"
-#include "wx/gtk/private.h"
+#include "wx/gtk1/private.h"
 
-//-----------------------------------------------------------------------------
-// wxControl
-//-----------------------------------------------------------------------------
+// ============================================================================
+// wxControl implementation
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// wxControl creation
+// ----------------------------------------------------------------------------
 
 IMPLEMENT_DYNAMIC_CLASS(wxControl, wxWindow)
 
 wxControl::wxControl()
 {
-    m_needParent = TRUE;
+    m_needParent = true;
 }
 
 bool wxControl::Create( wxWindow *parent,
@@ -76,7 +83,7 @@ void wxControl::PostCreation(const wxSize& size)
     gtk_widget_ensure_style(m_widget);
 
     ApplyWidgetStyle();
-    SetInitialBestSize(size);
+    SetInitialSize(size);
 }
 
 // ----------------------------------------------------------------------------
@@ -102,38 +109,23 @@ void wxControl::GTKSetLabelForLabel(GtkLabel *w, const wxString& label)
     // don't call the virtual function which might call this one back again
     wxControl::SetLabel(label);
 
-    const wxString labelGTK = GTKConvertMnemonics(label);
+    const wxString labelGTK = GTKRemoveMnemonics(label);
 
-#ifdef __WXGTK20__
-    gtk_label_set_text_with_mnemonic(w, wxGTK_CONV(labelGTK));
-#else
     gtk_label_set(w, wxGTK_CONV(labelGTK));
-#endif
 }
 
 void wxControl::GTKSetLabelForFrame(GtkFrame *w, const wxString& label)
 {
     wxControl::SetLabel(label);
 
-    // frames don't support mnemonics even under GTK+ 2
     const wxString labelGTK = GTKRemoveMnemonics(label);
 
     gtk_frame_set_label(w, labelGTK.empty() ? (char *)NULL
                                             : wxGTK_CONV(labelGTK));
 }
 
-// worker function implementing both GTKConvert/RemoveMnemonics()
-//
-// notice that under GTK+ 1 we only really need to support MNEMONICS_REMOVE as
-// it doesn't support mnemonics anyhow but this would make the code so ugly
-// that we do the same thing for GKT+ 1 and 2
-enum MnemonicsFlag
-{
-    MNEMONICS_REMOVE,
-    MNEMONICS_CONVERT
-};
-
-static wxString GTKProcessMnemonics(const wxString& label, MnemonicsFlag flag)
+/* static */
+wxString wxControl::GTKRemoveMnemonics(const wxString& label)
 {
     const size_t len = label.length();
     wxString labelGTK;
@@ -142,72 +134,31 @@ static wxString GTKProcessMnemonics(const wxString& label, MnemonicsFlag flag)
     {
         wxChar ch = label[i];
 
-        switch ( ch )
+        if ( ch == _T('&') )
         {
-            case wxT('&'):
-                if ( i == len - 1 )
-                {
-                    // "&" at the end of string is an error
-                    wxLogDebug(wxT("Invalid label \"%s\"."), label.c_str());
-                    break;
-                }
-
-                ch = label[++i]; // skip '&' itself
-                switch ( ch )
-                {
-                    case wxT('&'):
-                        // special case: "&&" is not a mnemonic at all but just
-                        // an escaped "&"
-                        labelGTK += wxT('&');
-                        break;
-
-                    case wxT('_'):
-                        if ( flag == MNEMONICS_CONVERT )
-                        {
-                            // '_' can't be a GTK mnemonic apparently so
-                            // replace it with something similar
-                            labelGTK += wxT("_-");
-                            break;
-                        }
-                        //else: fall through
-
-                    default:
-                        if ( flag == MNEMONICS_CONVERT )
-                            labelGTK += wxT('_');
-                        labelGTK += ch;
-                }
+            if ( i == len - 1 )
+            {
+                // "&" at the end of string is an error
+                wxLogDebug(wxT("Invalid label \"%s\"."), label.c_str());
                 break;
-
-            case wxT('_'):
-                if ( flag == MNEMONICS_CONVERT )
-                {
-                    // escape any existing underlines in the string so that
-                    // they don't become mnemonics accidentally
-                    labelGTK += wxT("__");
-                    break;
-                }
-                //else: fall through
-
-            default:
-                labelGTK += ch;
+            }
+
+            ch = label[++i]; // skip '&' itself
+            if ( ch == _T('&') )
+            {
+                // special case: "&&" is not a mnemonic at all but just an
+                // escaped "&"
+                labelGTK += wxT('&');
+                continue;
+            }
         }
+
+        labelGTK += ch;
     }
 
     return labelGTK;
 }
 
-/* static */
-wxString wxControl::GTKRemoveMnemonics(const wxString& label)
-{
-    return GTKProcessMnemonics(label, MNEMONICS_REMOVE);
-}
-
-/* static */
-wxString wxControl::GTKConvertMnemonics(const wxString& label)
-{
-    return GTKProcessMnemonics(label, MNEMONICS_CONVERT);
-}
-
 // ----------------------------------------------------------------------------
 // wxControl styles (a.k.a. attributes)
 // ----------------------------------------------------------------------------
@@ -256,33 +207,8 @@ wxControl::GetDefaultAttributesFromGTKWidget(GtkWidget* widget,
                               style->bg[state].blue  >> SHIFT);
 
     // get the style's font
-#ifdef __WXGTK20__
-    if ( !style->font_desc )
-        style = gtk_widget_get_default_style();
-    if ( style && style->font_desc )
-    {
-        wxNativeFontInfo info;
-        info.description = pango_font_description_copy(style->font_desc);
-        attr.font = wxFont(info);
-    }
-    else
-    {
-        GtkSettings *settings = gtk_settings_get_default();
-        gchar *font_name = NULL;
-        g_object_get ( settings,
-                       "gtk-font-name",
-                       &font_name,
-                       NULL);
-        if (!font_name)
-            attr.font = wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT );
-        else
-            attr.font = wxFont(wxString::FromAscii(font_name));
-        g_free (font_name);
-    }
-#else
     // TODO: isn't there a way to get a standard gtk 1.2 font?
     attr.font = wxFont( 12, wxSWISS, wxNORMAL, wxNORMAL );
-#endif
 
     return attr;
 }
@@ -338,4 +264,3 @@ wxControl::GetDefaultAttributesFromGTKWidget(wxGtkWidgetNewFromAdj_t widget_new,
 }
 
 #endif // wxUSE_CONTROLS
-