From 7360894949ff89740d023dc587be5aa31f5be693 Mon Sep 17 00:00:00 2001 From: Mattia Barbon Date: Sun, 19 Jun 2005 19:11:21 +0000 Subject: [PATCH] Fix crash on exit with Lesstif (and possibly Motif 1.x). git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@34704 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/motif/font.h | 2 ++ src/motif/button.cpp | 2 +- src/motif/checkbox.cpp | 2 +- src/motif/choice.cpp | 13 ++++++---- src/motif/font.cpp | 56 +++++++++++++++++++++++++++++++---------- src/motif/listbox.cpp | 13 +++------- src/motif/menu.cpp | 8 +++--- src/motif/radiobox.cpp | 49 ++++++++++++++++-------------------- src/motif/radiobut.cpp | 5 ++-- src/motif/statbox.cpp | 4 +-- src/motif/stattext.cpp | 23 ++++++++--------- src/motif/utils.cpp | 2 +- 12 files changed, 101 insertions(+), 78 deletions(-) diff --git a/include/wx/motif/font.h b/include/wx/motif/font.h index 9f84b11bda..f4d267e986 100644 --- a/include/wx/motif/font.h +++ b/include/wx/motif/font.h @@ -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 ); diff --git a/src/motif/button.cpp b/src/motif/button.cpp index 93189fd2a7..56494fcfee 100644 --- a/src/motif/button.cpp +++ b/src/motif/button.cpp @@ -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 diff --git a/src/motif/checkbox.cpp b/src/motif/checkbox.cpp index c2a317b645..a8dd3b3eff 100644 --- a/src/motif/checkbox.cpp +++ b/src/motif/checkbox.cpp @@ -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, diff --git a/src/motif/choice.cpp b/src/motif/choice.cpp index bae8a44171..24857bdf41 100644 --- a/src/motif/choice.cpp +++ b/src/motif/choice.cpp @@ -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); diff --git a/src/motif/font.cpp b/src/motif/font.cpp index b3187340d1..e96103c124 100644 --- a/src/motif/font.cpp +++ b/src/motif/font.cpp @@ -46,6 +46,12 @@ 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; diff --git a/src/motif/listbox.cpp b/src/motif/listbox.cpp index 0e27fd8ef7..4219682a39 100644 --- a/src/motif/listbox.cpp +++ b/src/motif/listbox.cpp @@ -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 ) diff --git a/src/motif/menu.cpp b/src/motif/menu.cpp index 123a04b0cb..a65a5df03b 100644 --- a/src/motif/menu.cpp +++ b/src/motif/menu.cpp @@ -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()) diff --git a/src/motif/radiobox.cpp b/src/motif/radiobox.cpp index 55234658d2..0788c3a686 100644 --- a/src/motif/radiobox.cpp +++ b/src/motif/radiobox.cpp @@ -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); } } diff --git a/src/motif/radiobut.cpp b/src/motif/radiobut.cpp index c66fcf832e..e45879d473 100644 --- a/src/motif/radiobut.cpp +++ b/src/motif/radiobut.cpp @@ -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 diff --git a/src/motif/statbox.cpp b/src/motif/statbox.cpp index fe2c52163c..0b9ddc67ed 100644 --- a/src/motif/statbox.cpp +++ b/src/motif/statbox.cpp @@ -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, diff --git a/src/motif/stattext.cpp b/src/motif/stattext.cpp index 3f31485685..532576d897 100644 --- a/src/motif/stattext.cpp +++ b/src/motif/stattext.cpp @@ -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; diff --git a/src/motif/utils.cpp b/src/motif/utils.cpp index d06990d497..691ae9e8f4 100644 --- a/src/motif/utils.cpp +++ b/src/motif/utils.cpp @@ -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 -- 2.47.2