]> git.saurik.com Git - wxWidgets.git/commitdiff
Fix crash on exit with Lesstif (and possibly Motif 1.x).
authorMattia Barbon <mbarbon@cpan.org>
Sun, 19 Jun 2005 19:11:21 +0000 (19:11 +0000)
committerMattia Barbon <mbarbon@cpan.org>
Sun, 19 Jun 2005 19:11:21 +0000 (19:11 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@34704 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

12 files changed:
include/wx/motif/font.h
src/motif/button.cpp
src/motif/checkbox.cpp
src/motif/choice.cpp
src/motif/font.cpp
src/motif/listbox.cpp
src/motif/menu.cpp
src/motif/radiobox.cpp
src/motif/radiobut.cpp
src/motif/statbox.cpp
src/motif/stattext.cpp
src/motif/utils.cpp

index 9f84b11bda685c27b46d5e23ebe546c4ef597c81..f4d267e9860032aeb49bdeec01bb9fa957c1375b 100644 (file)
@@ -105,6 +105,8 @@ public:
     // returns either a XmFontList or XmRendition, depending
     // on Motif version
     WXFontType GetFontType(WXDisplay* display) const;
+    // like the function above but does a copy for XmFontList
+    WXFontType GetFontTypeC(WXDisplay* display) const;
     static WXString GetFontTag();
 protected:
     virtual void DoSetNativeFontInfo( const wxNativeFontInfo& info );
index 93189fd2a7199b67038e5475b7762e258bb78612..56494fcfeefb9531b37f306d01e61b023dbcd3d0 100644 (file)
@@ -76,7 +76,7 @@ bool wxButton::Create(wxWindow *parent, wxWindowID id, const wxString& lbl,
     m_mainWidget = (WXWidget) XtVaCreateManagedWidget ("button",
         xmPushButtonWidgetClass,
         parentWidget,
-        wxFont::GetFontTag(), m_font.GetFontType(XtDisplay(parentWidget)),
+        wxFont::GetFontTag(), m_font.GetFontTypeC(XtDisplay(parentWidget)),
         XmNlabelString, text(),
         XmNrecomputeSize, False,
         // See comment for wxButton::SetDefault
index c2a317b6456b13ada8b14cf1e1c0fad25ed31cca..a8dd3b3eff3c6654bb6e120fc50b32f7f4f9ab41 100644 (file)
@@ -73,7 +73,7 @@ bool wxCheckBox::Create(wxWindow *parent, wxWindowID id, const wxString& label,
 
     m_mainWidget = (WXWidget) XtVaCreateManagedWidget ("toggle",
         xmToggleButtonWidgetClass, parentWidget,
-        wxFont::GetFontTag(), m_font.GetFontType(XtDisplay(parentWidget)),
+        wxFont::GetFontTag(), m_font.GetFontTypeC(XtDisplay(parentWidget)),
         XmNlabelString, text(),
         XmNrecomputeSize, False,
         // XmNindicatorOn, XmINDICATOR_CHECK_BOX,
index bae8a4417178ab0339266aa75671e9bf7e48c0c5..24857bdf41992705e98d6673276e36cadc5fc2b4 100644 (file)
@@ -459,19 +459,22 @@ void wxChoice::ChangeFont(bool keepOriginalSize)
     // back again. TODO: a better way in Motif?
     if (m_font.Ok())
     {
+        Display* dpy = XtDisplay((Widget) m_mainWidget);
         int width, height, width1, height1;
         GetSize(& width, & height);
 
-        WXFontType fontType =
-            m_font.GetFontType(XtDisplay((Widget) m_mainWidget));
         WXString fontTag = wxFont::GetFontTag();
 
-        XtVaSetValues ((Widget) m_formWidget, fontTag, fontType, NULL);
-        XtVaSetValues ((Widget) m_buttonWidget, fontTag, fontType, NULL);
+        XtVaSetValues ((Widget) m_formWidget,
+                       fontTag, m_font.GetFontTypeC(dpy),
+                       NULL);
+        XtVaSetValues ((Widget) m_buttonWidget,
+                       fontTag, m_font.GetFontTypeC(dpy),
+                       NULL);
 
         for( size_t i = 0; i < m_noStrings; ++i )
             XtVaSetValues( (Widget)m_widgetArray[i],
-                           fontTag, fontType,
+                           fontTag, m_font.GetFontTypeC(dpy),
                            NULL );
 
         GetSize(& width1, & height1);
index b3187340d16727e344c0783c27c5acf9a66a7e71..e96103c1246418a090d9df56bc95e65d8a340269 100644 (file)
 
 IMPLEMENT_DYNAMIC_CLASS(wxFont, wxGDIObject)
 
+#if wxCHECK_MOTIF_VERSION( 2, 0 ) && !wxCHECK_LESSTIF()
+    #define wxUSE_RENDER_TABLE 1
+#else
+    #define wxUSE_RENDER_TABLE 0
+#endif
+
 // ----------------------------------------------------------------------------
 // private classes
 // ----------------------------------------------------------------------------
@@ -59,8 +65,9 @@ public:
     ~wxXFont();
 
     WXFontStructPtr     m_fontStruct;   // XFontStruct
+#if !wxUSE_RENDER_TABLE
     WXFontList          m_fontList;     // Motif XmFontList
-#if wxCHECK_MOTIF_VERSION( 2, 0 )
+#else // if wxUSE_RENDER_TABLE
     WXRenderTable       m_renderTable;  // Motif XmRenderTable
 #endif
     WXDisplay*          m_display;      // XDisplay
@@ -69,7 +76,7 @@ public:
 
 class wxFontRefData: public wxGDIRefData
 {
-friend class wxFont;
+    friend class wxFont;
 
 public:
     wxFontRefData(int size = wxDEFAULT,
@@ -127,8 +134,9 @@ protected:
 wxXFont::wxXFont()
 {
     m_fontStruct = (WXFontStructPtr) 0;
+#if !wxUSE_RENDER_TABLE
     m_fontList = (WXFontList) 0;
-#if wxCHECK_MOTIF_VERSION( 2, 0 )
+#else // if wxUSE_RENDER_TABLE
     m_renderTable = (WXRenderTable) 0;
 #endif
     m_display = (WXDisplay*) 0;
@@ -137,16 +145,20 @@ wxXFont::wxXFont()
 
 wxXFont::~wxXFont()
 {
-    XmFontList fontList = (XmFontList) m_fontList;
-    XmFontListFree (fontList);
-
-#if wxCHECK_MOTIF_VERSION( 2, 0 ) && !wxCHECK_LESSTIF()
-    XmRenderTable renderTable = (XmRenderTable) m_renderTable;
-    XmRenderTableFree (renderTable);
+#if !wxUSE_RENDER_TABLE
+    if (m_fontList)
+        XmFontListFree ((XmFontList) m_fontList);
+    m_fontList = NULL;
+#else // if wxUSE_RENDER_TABLE
+    if (m_renderTable)
+        XmRenderTableFree ((XmRenderTable) m_renderTable);
+    m_renderTable = NULL;
 #endif
 
     // TODO: why does freeing the font produce a segv???
     // Note that XFreeFont wasn't called in wxWin 1.68 either.
+    // MBN: probably some interaction with fonts being still
+    //      in use in some widgets...
     // XFontStruct* fontStruct = (XFontStruct*) m_fontStruct;
     //        XFreeFont((Display*) m_display, fontStruct);
 }
@@ -544,10 +556,10 @@ wxXFont* wxFont::GetInternalFont(double scale, WXDisplay* display) const
     f->m_fontStruct = (WXFontStructPtr)font;
     f->m_display = ( display ? display : wxGetDisplay() );
     f->m_scale = intScale;
+#if !wxUSE_RENDER_TABLE
     f->m_fontList = XmFontListCreate ((XFontStruct*) font, XmSTRING_DEFAULT_CHARSET);
     M_FONTDATA->m_fonts.Append(f);
-
-#if wxCHECK_MOTIF_VERSION( 2, 0 ) && !wxCHECK_LESSTIF()
+#else // if wxUSE_RENDER_TABLE
     XmRendition rendition;
     XmRenderTable renderTable;
     Arg args[5];
@@ -577,34 +589,52 @@ WXFontStructPtr wxFont::GetFontStruct(double scale, WXDisplay* display) const
 
 WXFontList wxFont::GetFontList(double scale, WXDisplay* display) const
 {
+#if !wxUSE_RENDER_TABLE
     wxXFont* f = GetInternalFont(scale, display);
 
     return (f ? f->m_fontList : (WXFontList) 0);
+#else
+    return NULL;
+#endif
 }
 
+ // declared in the header, can't use wxUSE_RENDER_TABLE
 #if wxCHECK_MOTIF_VERSION( 2, 0 )
 
 WXRenderTable wxFont::GetRenderTable(WXDisplay* display) const
 {
+#if wxUSE_RENDER_TABLE
     wxXFont* f = GetInternalFont(1.0, display);
 
     return (f ? f->m_renderTable : (WXFontList) 0);
+#else
+    return NULL;
+#endif
 }
 
 #endif
 
 WXFontType wxFont::GetFontType(WXDisplay* display) const
 {
-#if wxCHECK_MOTIF_VERSION( 2, 0 ) && !wxCHECK_LESSTIF()
+#if wxUSE_RENDER_TABLE
     return Ok() ? GetRenderTable(display) : NULL;
 #else
     return Ok() ? GetFontList(1.0, display) : NULL;
 #endif
 }
 
+WXFontType wxFont::GetFontTypeC(WXDisplay* display) const
+{
+#if wxUSE_RENDER_TABLE
+    return Ok() ? GetRenderTable(display) : NULL;
+#else
+    return Ok() ? XmFontListCopy( (XmFontList)GetFontList(1.0, display) ) : NULL;
+#endif
+}
+
 /*static*/ WXString wxFont::GetFontTag()
 {
-#if wxCHECK_MOTIF_VERSION( 2, 0 ) && !wxCHECK_LESSTIF()
+#if wxUSE_RENDER_TABLE
     return (WXString)XmNrenderTable;
 #else
     return (WXString)XmNfontList;
index 0e27fd8ef7d66d48f2ef09852ed4fd7ea8501cd5..4219682a390fdf21c8ea0c12dea91bdc2c2e207c 100644 (file)
@@ -95,13 +95,7 @@ bool wxListBox::Create(wxWindow *parent, wxWindowID id,
     m_backgroundColour = * wxWHITE;
 
     Widget parentWidget = (Widget) parent->GetClientWidget();
-
-    WXFontType fontType = (WXFontType)NULL;
-
-    if( m_font.Ok() )
-    {
-        fontType = m_font.GetFontType(XtDisplay(parentWidget));
-    }
+    Display* dpy = XtDisplay(parentWidget);
 
     Arg args[4];
     int count = 0;
@@ -111,9 +105,10 @@ bool wxListBox::Create(wxWindow *parent, wxWindowID id,
               ( m_windowStyle & wxLB_EXTENDED ) ? XmEXTENDED_SELECT :
                                                   XmBROWSE_SELECT );
     ++count;
-    if( fontType )
+    if( m_font.Ok() )
     {
-        XtSetArg( args[count], (String)wxFont::GetFontTag(), fontType );
+        XtSetArg( args[count],
+                  (String)wxFont::GetFontTag(), m_font.GetFontTypeC(dpy) );
         ++count;
     }
     if( m_windowStyle & wxLB_ALWAYS_SB )
index 123a04b0cbd0d903778e1bd83059499430d40599..a65a5df03bc618829754e4983a7b6474af4b54ec 100644 (file)
@@ -661,15 +661,15 @@ void wxMenu::ChangeFont(bool keepOriginalSize)
     if (!m_font.Ok() || !m_menuWidget)
         return;
 
-    WXFontType fontType = m_font.GetFontType(XtDisplay((Widget) m_menuWidget));
+    Display* dpy = XtDisplay((Widget) m_menuWidget);
 
     XtVaSetValues ((Widget) m_menuWidget,
-                   wxFont::GetFontTag(), fontType,
+                   wxFont::GetFontTag(), m_font.GetFontTypeC(dpy),
                    NULL);
     if (m_buttonWidget)
     {
         XtVaSetValues ((Widget) m_buttonWidget,
-                       wxFont::GetFontTag(), fontType,
+                       wxFont::GetFontTag(), m_font.GetFontTypeC(dpy),
                        NULL);
     }
 
@@ -681,7 +681,7 @@ void wxMenu::ChangeFont(bool keepOriginalSize)
         if (m_menuWidget && item->GetButtonWidget() && m_font.Ok())
         {
             XtVaSetValues ((Widget) item->GetButtonWidget(),
-                           wxFont::GetFontTag(), fontType,
+                           wxFont::GetFontTag(), m_font.GetFontTypeC(dpy),
                            NULL);
         }
         if (item->GetSubMenu())
index 55234658d24d5648627dfc9fbe3e5d7301070584..0788c3a6864fe1eef55b51fbce44436fbbb269d1 100644 (file)
@@ -73,43 +73,40 @@ bool wxRadioBox::Create(wxWindow *parent, wxWindowID id, const wxString& title,
         m_majorDim = majorDim ;
 
     Widget parentWidget = (Widget) parent->GetClientWidget();
+    Display* dpy = XtDisplay(parentWidget);
 
     m_mainWidget = XtVaCreateWidget ("radioboxframe",
-                                        xmFrameWidgetClass, parentWidget,
-                                        XmNresizeHeight, True,
-                                        XmNresizeWidth, True,
-                                        NULL);
+                                     xmFrameWidgetClass, parentWidget,
+                                     XmNresizeHeight, True,
+                                     XmNresizeWidth, True,
+                                     NULL);
 
     wxString label1(wxStripMenuCodes(title));
 
-    WXFontType fontType = m_font.GetFontType(XtDisplay(parentWidget));
-
     if (!label1.empty())
     {
         wxXmString text(label1);
         m_labelWidget = (WXWidget)
             XtVaCreateManagedWidget( label1.c_str(),
 #if wxUSE_GADGETS
-                                       style & wxCOLOURED ? xmLabelWidgetClass
-                                                          : xmLabelGadgetClass,
-                                       (Widget)m_mainWidget,
+                style & wxCOLOURED ? xmLabelWidgetClass
+                                   : xmLabelGadgetClass,
+                (Widget)m_mainWidget,
 #else
-                                       xmLabelWidgetClass,
-                                       (Widget)m_mainWidget,
+                xmLabelWidgetClass, (Widget)m_mainWidget,
 #endif
-                                       wxFont::GetFontTag(), fontType,
-                                       XmNlabelString, text(),
+                wxFont::GetFontTag(), m_font.GetFontTypeC(dpy),
+                XmNlabelString, text(),
 // XmNframeChildType is not in Motif 1.2, nor in Lesstif,
 // if it was compiled with 1.2 compatibility
 // TODO: check this still looks OK for Motif 1.2.
 #if (XmVersion > 1200)
-                                       XmNframeChildType, XmFRAME_TITLE_CHILD,
+                XmNframeChildType, XmFRAME_TITLE_CHILD,
 #else
-                                       XmNchildType, XmFRAME_TITLE_CHILD,
+                XmNchildType, XmFRAME_TITLE_CHILD,
 #endif
-                                       XmNchildVerticalAlignment,
-                                           XmALIGNMENT_CENTER,
-                                       NULL);
+                XmNchildVerticalAlignment, XmALIGNMENT_CENTER,
+                NULL);
     }
 
     Arg args[3];
@@ -132,14 +129,15 @@ bool wxRadioBox::Create(wxWindow *parent, wxWindowID id, const wxString& title,
     {
         wxString str(wxStripMenuCodes(choices[i]));
         m_radioButtonLabels.push_back(str);
-        Widget radioItem =  XtVaCreateManagedWidget (wxConstCast(str.c_str(), char),
+        Widget radioItem =  XtVaCreateManagedWidget (
+                                wxConstCast(str.c_str(), char),
 #if wxUSE_GADGETS
-                            xmToggleButtonGadgetClass, radioBoxWidget,
+                                xmToggleButtonGadgetClass, radioBoxWidget,
 #else
-                            xmToggleButtonWidgetClass, radioBoxWidget,
+                                xmToggleButtonWidgetClass, radioBoxWidget,
 #endif
-                            wxFont::GetFontTag(), fontType,
-                                                 NULL);
+                                wxFont::GetFontTag(), m_font.GetFontTypeC(dpy),
+                                NULL);
         m_radioButtons.push_back((WXWidget)radioItem);
         XtAddCallback (radioItem, XmNvalueChangedCallback,
                        (XtCallbackProc) wxRadioBoxCallback,
@@ -356,16 +354,13 @@ void wxRadioBox::ChangeFont(bool keepOriginalSize)
 {
     wxWindow::ChangeFont(keepOriginalSize);
 
-    WXFontType fontType =
-        m_font.GetFontType(XtDisplay((Widget) GetTopWidget()));
-
     int i;
     for (i = 0; i < m_noItems; i++)
     {
         WXWidget radioButton = m_radioButtons[i];
 
         XtVaSetValues ((Widget) radioButton,
-                       wxFont::GetFontTag(), fontType,
+                       wxFont::GetFontTag(), m_font.GetFontTypeC(XtDisplay((Widget) GetTopWidget())),
                        NULL);
     }
 }
index c66fcf832e73356ac638e29f01f36fbc563526ef..e45879d47380af086ab3301c6acc397d12bb960e 100644 (file)
@@ -56,20 +56,19 @@ bool wxRadioButton::Create(wxWindow *parent, wxWindowID id,
         return false;
 
     Widget parentWidget = (Widget) parent->GetClientWidget();
+    Display* dpy = XtDisplay(parentWidget);
 
     wxString label1(wxStripMenuCodes(label));
 
     wxXmString text( label1 );
 
-    WXFontType fontType = m_font.GetFontType(XtDisplay(parentWidget));
-
     Widget radioButtonWidget = XtVaCreateManagedWidget ("toggle",
 #if wxUSE_GADGETS
         xmToggleButtonGadgetClass, parentWidget,
 #else
         xmToggleButtonWidgetClass, parentWidget,
 #endif
-        wxFont::GetFontTag(), fontType,
+        wxFont::GetFontTag(), m_font.GetFontTypeC(dpy),
         XmNlabelString, text(),
         XmNfillOnSelect, True,
         XmNindicatorType, XmONE_OF_MANY, // diamond-shape
index fe2c52163cdb7f6617add66aeb9cb30de84b23c6..0b9ddc67ed801dfc462990ec3128ff2daf97cfad 100644 (file)
@@ -108,13 +108,13 @@ bool wxStaticBox::Create(wxWindow *parent, wxWindowID id,
     bool hasLabel = (!label.IsNull() && !label.IsEmpty()) ;
     if (hasLabel)
     {
-        WXFontType fontType = m_font.GetFontType( XtDisplay( parentWidget ) );
         wxString label1(wxStripMenuCodes(label));
         wxXmString text(label1);
+        Display* dpy = XtDisplay( parentWidget );
 
         m_labelWidget = (WXWidget) XtVaCreateManagedWidget ("staticboxlabel",
                 xmLabelWidgetClass, (Widget)m_mainWidget,
-                wxFont::GetFontTag(), fontType,                
+                wxFont::GetFontTag(), m_font.GetFontTypeC(dpy),
                 XmNlabelString, text(),
 #if wxCHECK_MOTIF_VERSION( 2, 0 )
                 XmNframeChildType, XmFRAME_TITLE_CHILD,
index 3f314856858bcad9592636cf0388059db5e477ef..532576d897d17e4ed82f5450820c2bc849a4dc43 100644 (file)
@@ -51,18 +51,17 @@ bool wxStaticText::Create(wxWindow *parent, wxWindowID id,
     Widget borderWidget =
         (Widget) wxCreateBorderWidget( (WXWidget)parentWidget, style );
     wxXmString text( wxStripMenuCodes( label ) );
-    WXFontType fontType = m_font.GetFontType(XtDisplay(parentWidget));
-
-    m_labelWidget = XtVaCreateManagedWidget (wxConstCast(name.c_str(), char),
-                                         xmLabelWidgetClass,
-                                         borderWidget ? borderWidget : parentWidget,
-                                         wxFont::GetFontTag(), fontType,
-                                         XmNlabelString, text(),
-                                         XmNalignment,
-                     ((style & wxALIGN_RIGHT) ? XmALIGNMENT_END :
-                     ((style & wxALIGN_CENTRE) ? XmALIGNMENT_CENTER :
-                     XmALIGNMENT_BEGINNING)),
-                                         NULL);
+
+    m_labelWidget =
+        XtVaCreateManagedWidget (wxConstCast(name.c_str(), char),
+            xmLabelWidgetClass,
+            borderWidget ? borderWidget : parentWidget,
+            wxFont::GetFontTag(), m_font.GetFontTypeC(XtDisplay(parentWidget)),
+            XmNlabelString, text(),
+            XmNalignment, ((style & wxALIGN_RIGHT)  ? XmALIGNMENT_END :
+                          ((style & wxALIGN_CENTRE) ? XmALIGNMENT_CENTER :
+                                                      XmALIGNMENT_BEGINNING)),
+            NULL);
 
     m_mainWidget = borderWidget ? borderWidget : m_labelWidget;
 
index d06990d497bb997723e5f2269277e6fee536ab80..691ae9e8f4b88c2aca3255eb97ba88c5b03ef7a6 100644 (file)
@@ -929,7 +929,7 @@ extern void wxDoChangeFont(WXWidget widget, wxFont& font)
 #if !wxCHECK_LESSTIF() || wxCHECK_LESSTIF_VERSION( 0, 93 )
     Widget w = (Widget)widget;
     XtVaSetValues( w,
-                   wxFont::GetFontTag(), font.GetFontType( XtDisplay(w) ),
+                   wxFont::GetFontTag(), font.GetFontTypeC( XtDisplay(w) ),
                    NULL );
 #endif