]> git.saurik.com Git - wxWidgets.git/commitdiff
Rework wxMotif font/color inheritance so it works
authorMattia Barbon <mbarbon@cpan.org>
Sat, 7 Apr 2007 21:18:33 +0000 (21:18 +0000)
committerMattia Barbon <mbarbon@cpan.org>
Sat, 7 Apr 2007 21:18:33 +0000 (21:18 +0000)
like in the other ports.  Avoid setting foreground/background
color for windows and let the toolkit use the natural color.
As an intermediate step font is still explicitly set.

  Handle the cases where m_foregroundColour, m_backgroundColour ir m_font
are not initialized.

  Set default (overridable) X resources to emulate the old look.

  Unify wxMOTIF_NEW_FONT_HANDLING with wxMOTIF_USE_RENDER_TABLE.

  Minor unrelated (sizing) fixes to wxCheckListBox, wxStaticText, wxTextCtrl.

  Tagged with MOTIF_BEFORE_COLOUR_FONT_INHERITANCE before the changes.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@45312 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

40 files changed:
include/wx/motif/font.h
include/wx/motif/private.h
include/wx/motif/stattext.h
include/wx/motif/window.h
src/generic/notebook.cpp
src/generic/tabg.cpp
src/motif/app.cpp
src/motif/bmpbuttn.cpp
src/motif/button.cpp
src/motif/checkbox.cpp
src/motif/checklst.cpp
src/motif/choice.cpp
src/motif/combobox.cpp
src/motif/combobox_native.cpp
src/motif/control.cpp
src/motif/dcclient.cpp
src/motif/dialog.cpp
src/motif/evtloop.cpp
src/motif/filedlg.cpp
src/motif/font.cpp
src/motif/frame.cpp
src/motif/gauge.cpp
src/motif/listbox.cpp
src/motif/mdi.cpp
src/motif/menu.cpp
src/motif/msgdlg.cpp
src/motif/popupwin.cpp
src/motif/radiobox.cpp
src/motif/radiobut.cpp
src/motif/scrolbar.cpp
src/motif/slider.cpp
src/motif/spinbutt.cpp
src/motif/statbmp.cpp
src/motif/statbox.cpp
src/motif/stattext.cpp
src/motif/textctrl.cpp
src/motif/toolbar.cpp
src/motif/toplevel.cpp
src/motif/utils.cpp
src/motif/window.cpp

index 4fb5e08a3d72b7d4fa57206c3e2a757d1b7499e2..69f0a5cea80abe04302cf212b74c8099a28f236b 100644 (file)
 #define _WX_FONT_H_
 
 #if __WXMOTIF20__ && !__WXLESSTIF__
-    #define wxMOTIF_NEW_FONT_HANDLING 1
     #define wxMOTIF_USE_RENDER_TABLE 1
 #else
-    #define wxMOTIF_NEW_FONT_HANDLING 0
     #define wxMOTIF_USE_RENDER_TABLE 0
 #endif
+#define wxMOTIF_NEW_FONT_HANDLING wxMOTIF_USE_RENDER_TABLE
 
 class wxXFont;
 
@@ -93,18 +92,15 @@ public:
         WXDisplay* display = NULL) const;
 
     // These two are helper functions for convenient access of the above.
-#if wxMOTIF_NEW_FONT_HANDLING
-    WXFontSet GetFontSet(double scale, WXDisplay* display = NULL) const;
-#else // if !wxMOTIF_NEW_FONT_HANDLING
-    WXFontStructPtr GetFontStruct(double scale = 1.0,
-        WXDisplay* display = NULL) const;
-#endif // wxMOTIF_NEW_FONT_HANDLING
 #if wxMOTIF_USE_RENDER_TABLE
+    WXFontSet GetFontSet(double scale, WXDisplay* display = NULL) const;
     WXRenderTable GetRenderTable(WXDisplay* display) const;
 #else // if !wxMOTIF_USE_RENDER_TABLE
+    WXFontStructPtr GetFontStruct(double scale = 1.0,
+        WXDisplay* display = NULL) const;
     WXFontList GetFontList(double scale = 1.0,
         WXDisplay* display = NULL) const;
-#endif // wxMOTIF_USE_RENDER_TABLE
+#endif // !wxMOTIF_USE_RENDER_TABLE
     // returns either a XmFontList or XmRenderTable, depending
     // on Motif version
     WXFontType GetFontType(WXDisplay* display) const;
index c19974fbe4f28eff27ab1a3cbbc922640e99a959..8bee9f9bf743bcb3341f98880f1985e5f9d9843a 100644 (file)
@@ -106,6 +106,9 @@ extern void wxGetTextExtent(WXDisplay* display, const wxFont& font,
                             double scale,
                             const wxString& string, int* width, int* height,
                             int* ascent, int* descent);
+extern void wxGetTextExtent(const wxWindow* window, const wxString& str,
+                            int* width, int* height,
+                            int* ascent, int* descent);
 
 #define wxNO_COLORS   0x00
 #define wxBACK_COLORS 0x01
index 6b53e185d42266346e5e7508aa63898b9fb155d2..d330e78ca39aeb460a8bc186f4527178f2d51448 100644 (file)
@@ -55,6 +55,7 @@ public:
     virtual void DoSetLabel(const wxString& str);
     virtual wxString DoGetLabel() const;
 
+    virtual wxSize DoGetBestSize() const;
 protected:
     WXWidget              m_labelWidget;
 };
index 819fe17f3e70fa1d374b7bb8bbe07f3204c5c62a..7a8e21899fe5f3e74b735a1e7ab1f682c5da2dc8 100644 (file)
@@ -147,6 +147,12 @@ public:
     // Process idle (send update events)
     void OnInternalIdle();
 
+    // post-creation activities
+    void PostCreation();
+
+    // pre-creation activities
+    void PreCreation();
+
 protected:
     // Responds to colour changes: passes event on to children.
     void OnSysColourChanged(wxSysColourChangedEvent& event);
index a77f340b2ecd97d4f6ac69288c3956cae4201e7e..fd5c9f05ea3d8a5c6dc02c9b656a1a9b7b11c1cf 100644 (file)
@@ -158,8 +158,6 @@ bool wxNotebook::Create(wxWindow *parent,
     if (!wxControl::Create(parent, id, pos, size, style|wxNO_BORDER, wxDefaultValidator, name))
         return false;
 
-    SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE));
-
     SetTabView(new wxNotebookTabView(this));
 
     return true;
index cec7c1d37a0ca280d81fa65622b5d131a06406ec..cf1722b52c76328ff6f0caa2905a92841be07272 100644 (file)
@@ -85,7 +85,8 @@ void wxTabControl::OnDraw(wxDC& dc, bool lastInRow)
   // Draw grey background
   if (m_view->GetTabStyle() & wxTAB_STYLE_COLOUR_INTERIOR)
   {
-    dc.SetBrush(*m_view->GetBackgroundBrush());
+    if(m_view->GetBackgroundBrush())
+      dc.SetBrush(*m_view->GetBackgroundBrush());
 
     // Add 1 because the pen is transparent. Under Motif, may be different.
 #ifdef __WXMOTIF__
@@ -523,11 +524,11 @@ wxTabView::wxTabView(long style)
   m_tabViewRect.x = 300;
   m_highlightColour = *wxWHITE;
   m_shadowColour = wxColour(128, 128, 128);
-  m_backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE);
+  // m_backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE);
   m_textColour = *wxBLACK;
   m_highlightPen = wxWHITE_PEN;
   m_shadowPen = wxGREY_PEN;
-  SetBackgroundColour(m_backgroundColour);
+  // SetBackgroundColour(m_backgroundColour);
   m_tabFont = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
   m_tabSelectedFont = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
   m_window = (wxWindow *) NULL;
@@ -797,7 +798,8 @@ void wxTabView::Draw(wxDC& dc)
     if (GetTabStyle() & wxTAB_STYLE_COLOUR_INTERIOR)
     {
         dc.SetPen(*wxTRANSPARENT_PEN);
-        dc.SetBrush(*GetBackgroundBrush());
+        if(GetBackgroundBrush())
+            dc.SetBrush(*GetBackgroundBrush());
 
         // Add 1 because the pen is transparent. Under Motif, may be different.
         dc.DrawRectangle(
index eacfa20a292fc9a3df39c76b041bc8b278d8b76c..e36d19b6e6f2873f01de6bb3e70a2e6c0be642a8 100644 (file)
@@ -99,15 +99,15 @@ static int wxXErrorHandler(Display *dpy, XErrorEvent *xevent)
 
 bool wxApp::Initialize(int& argcOrig, wxChar **argvOrig)
 {
+#if wxUSE_INTL
+    wxFont::SetDefaultEncoding(wxLocale::GetSystemEncoding());
+#endif
+
     if ( !wxAppBase::Initialize(argcOrig, argvOrig) )
         return false;
 
     wxWidgetHashTable = new wxHashTable(wxKEY_INTEGER);
 
-#if wxUSE_INTL
-    wxFont::SetDefaultEncoding(wxLocale::GetSystemEncoding());
-#endif
-
     return true;
 }
 
@@ -197,10 +197,17 @@ static char *fallbackResources[] = {
     wxMOTIF_STR("*sgiMode: True"),
     wxMOTIF_STR("*useSchemes: all"),
 #else // !__SGI__
-    wxMOTIF_STR("*menuBar.marginHeight: 0"),
-    wxMOTIF_STR("*menuBar.shadowThickness: 1"),
-    wxMOTIF_STR("*background: #c0c0c0"),
-    wxMOTIF_STR("*foreground: black"),
+#if !wxMOTIF_USE_RENDER_TABLE
+    wxMOTIF_STR("*.fontList: -*-helvetica-medium-r-normal-*-*-120-*-*-*-*-*-*"),
+#else
+    wxMOTIF_STR("*wxDefaultRendition.fontName: -*-helvetica-medium-r-normal-*-*-120-*-*-*-*-*-*"),
+    wxMOTIF_STR("*wxDefaultRendition.fontType: FONT_IS_FONTSET"),
+    wxMOTIF_STR("*.renderTable: wxDefaultRendition"),
+#endif
+    wxMOTIF_STR("*listBox.background: white"),
+    wxMOTIF_STR("*text.background: white"),
+    wxMOTIF_STR("*comboBox.Text.background: white"),
+    wxMOTIF_STR("*comboBox.List.background: white"),
 #endif // __SGI__/!__SGI__
     NULL
 };
index 7a2c68e90e7b5518042bfc3a8efdb05fc41dce69..5e94188ba4b5ce900e57de42b680b846515bce80 100644 (file)
@@ -51,6 +51,7 @@ bool wxBitmapButton::Create(wxWindow *parent, wxWindowID id,
 {
     if( !CreateControl( parent, id, pos, size, style, validator, name ) )
         return false;
+    PreCreation();
 
     m_bmpNormal = m_bmpNormalOriginal = bitmap;
     m_bmpSelected = m_bmpSelectedOriginal = bitmap;
@@ -81,12 +82,6 @@ bool wxBitmapButton::Create(wxWindow *parent, wxWindowID id,
 
     m_mainWidget = (WXWidget) buttonWidget;
 
-    ChangeFont(false);
-
-    ChangeBackgroundColour ();
-
-    DoSetBitmap();
-
     XtAddCallback (buttonWidget,
                    XmNactivateCallback, (XtCallbackProc) wxButtonCallback,
                    (XtPointer) this);
@@ -95,6 +90,9 @@ bool wxBitmapButton::Create(wxWindow *parent, wxWindowID id,
     if( size.x != -1 ) best.x = size.x;
     if( size.y != -1 ) best.y = size.y;
 
+    PostCreation();
+    DoSetBitmap();
+
     AttachWidget (parent, m_mainWidget, (WXWidget) NULL,
                   pos.x, pos.y, best.x, best.y);
 
index 77ce5c024229cbd2b219e9c8c1f45c5b10ad15fc..5befa4d2f19a3369980396c0eb50431de8e272f5 100644 (file)
@@ -57,6 +57,7 @@ bool wxButton::Create(wxWindow *parent, wxWindowID id, const wxString& lbl,
 
     if( !CreateControl( parent, id, pos, size, style, validator, name ) )
         return false;
+    PreCreation();
 
     wxXmString text( GetLabelText(label) );
 
@@ -89,11 +90,10 @@ bool wxButton::Create(wxWindow *parent, wxWindowID id, const wxString& lbl,
     if( size.x != -1 ) best.x = size.x;
     if( size.y != -1 ) best.y = size.y;
 
+    PostCreation();
     AttachWidget (parent, m_mainWidget, (WXWidget) NULL,
                   pos.x, pos.y, best.x, best.y);
 
-    ChangeBackgroundColour();
-
     return true;
 }
 
index 84dfd520a83abf871a7c0383eb10c98c8d28d6c1..566e52abd7ef4f87b2ae19dcc9e176b7eea1f017 100644 (file)
@@ -44,7 +44,6 @@
     #define wxHAS_3STATE 0
 #endif
 
-
 #include "wx/motif/private.h"
 
 void wxCheckBoxCallback (Widget w, XtPointer clientData,
@@ -62,6 +61,7 @@ bool wxCheckBox::Create(wxWindow *parent, wxWindowID id, const wxString& label,
     if( !wxControl::CreateControl( parent, id, pos, size, style, validator,
                                    name ) )
         return false;
+    PreCreation();
 
     wxXmString text( GetLabelText(label) );
 
@@ -85,10 +85,10 @@ bool wxCheckBox::Create(wxWindow *parent, wxWindowID id, const wxString& label,
 
     XmToggleButtonSetState ((Widget) m_mainWidget, False, True);
 
+    PostCreation();
     AttachWidget( parent, m_mainWidget, (WXWidget)NULL,
                   pos.x, pos.y, size.x, size.y );
 
-    ChangeBackgroundColour();
     return true;
 }
 
@@ -144,6 +144,9 @@ void wxCheckBoxCallback (Widget WXUNUSED(w), XtPointer clientData,
 
 void wxCheckBox::ChangeBackgroundColour()
 {
+    if (!m_backgroundColour.Ok())
+        return;
+
     wxComputeColours (XtDisplay((Widget) m_mainWidget), & m_backgroundColour,
         (wxColour*) NULL);
 
index ea21e7e19263a2ee00dfb436ace47dbce04876a4..0205216a2b007529c53d71fbc2d68b24143bc323 100644 (file)
@@ -134,7 +134,7 @@ void wxCheckListBox::Check(unsigned int uiIndex, bool bCheck)
 
 void wxCheckListBox::DoToggleItem( int n, int x )
 {
-    if( x < 23 )
+    if( x > 0 && x < 23 )
     {
         wxString label = wxListBox::GetString(n);
         label[1u] = (!::IsChecked(label)) ? checkChar : uncheckChar;
index 585c467600427ab9b8ebef615139340c1ef19e9c..6c7edaa11773972e698dd15ba541d0dde33f6a2a 100644 (file)
@@ -71,6 +71,7 @@ bool wxChoice::Create(wxWindow *parent, wxWindowID id,
 {
     if ( !CreateControl(parent, id, pos, size, style, validator, name) )
         return false;
+    PreCreation();
 
     Widget parentWidget = (Widget) parent->GetClientWidget();
 
@@ -138,9 +139,7 @@ bool wxChoice::Create(wxWindow *parent, wxWindowID id,
 
     XtVaSetValues((Widget) m_formWidget, XmNresizePolicy, XmRESIZE_NONE, NULL);
 
-    ChangeFont(false);
-    ChangeBackgroundColour();
-
+    PostCreation();
     AttachWidget (parent, m_buttonWidget, m_formWidget,
                   pos.x, pos.y, bestSize.x, bestSize.y);
 
@@ -450,7 +449,7 @@ void wxChoice::ChangeFont(bool keepOriginalSize)
     // Note that this causes the widget to be resized back
     // to its original size! We therefore have to set the size
     // back again. TODO: a better way in Motif?
-    if (m_font.Ok())
+    if (m_mainWidget && m_font.Ok())
     {
         Display* dpy = XtDisplay((Widget) m_mainWidget);
         int width, height, width1, height1;
index de2b16e9b11252cd95407462bb3cc93b8764da7e..201a8aa4adaea0d4ebc44060715408cff651037f 100644 (file)
@@ -51,6 +51,7 @@ bool wxComboBox::Create(wxWindow *parent, wxWindowID id,
 {
     if( !CreateControl( parent, id, pos, size, style, validator, name ) )
         return false;
+    PreCreation();
 
     m_noStrings = n;
 
@@ -80,17 +81,14 @@ bool wxComboBox::Create(wxWindow *parent, wxWindowID id,
 
     SetValue(value);
 
-    ChangeFont(false);
-
     XtAddCallback (buttonWidget, XmNselectionCallback, (XtCallbackProc) wxComboBoxCallback,
         (XtPointer) this);
     XtAddCallback (buttonWidget, XmNvalueChangedCallback, (XtCallbackProc) wxComboBoxCallback,
         (XtPointer) this);
 
+    PostCreation();
     AttachWidget (parent, m_mainWidget, (WXWidget) NULL, pos.x, pos.y, size.x, size.y);
 
-    ChangeBackgroundColour();
-
     return true;
 }
 
index 3138681bd6824c86b34666a8d976743cb2c4ed42..242a507bd99ebceccdf6ace7e155bac996a7df84 100644 (file)
@@ -80,6 +80,7 @@ bool wxComboBox::Create(wxWindow *parent, wxWindowID id,
 {
     if( !CreateControl( parent, id, pos, size, style, validator, name ) )
         return false;
+    PreCreation();
 
     Widget parentWidget = (Widget) parent->GetClientWidget();
 
@@ -106,8 +107,6 @@ bool wxComboBox::Create(wxWindow *parent, wxWindowID id,
 
     SetValue(value);
 
-    ChangeFont(false);
-
     XtAddCallback (buttonWidget, XmNselectionCallback,
                    (XtCallbackProc) wxComboBoxCallback,
                    (XtPointer) this);
@@ -119,11 +118,10 @@ bool wxComboBox::Create(wxWindow *parent, wxWindowID id,
     if( size.x != wxDefaultCoord ) best.x = size.x;
     if( size.y != wxDefaultCoord ) best.y = size.y;
 
+    PostCreation();
     AttachWidget (parent, m_mainWidget, (WXWidget) NULL,
                   pos.x, pos.y, best.x, best.y);
 
-    ChangeBackgroundColour();
-
     return true;
 }
 
@@ -407,7 +405,7 @@ void  wxComboBoxCallback (Widget WXUNUSED(w), XtPointer clientData,
 
 void wxComboBox::ChangeFont(bool keepOriginalSize)
 {
-    if( m_font.Ok() )
+    if( m_font.Ok() && m_mainWidget != NULL )
     {
         wxDoChangeFont( GetXmText(this), m_font );
         wxDoChangeFont( GetXmList(this), m_font );
index 4026913541173fafbe2439ee4d5103e2c4527fff..3d6cdf909c23b09509f3e5433918b363cb093933 100644 (file)
@@ -37,9 +37,6 @@ END_EVENT_TABLE()
 // Item members
 wxControl::wxControl()
 {
-    m_backgroundColour = *wxWHITE;
-    m_foregroundColour = *wxBLACK;
-
     m_inSetValue = false;
 }
 
@@ -72,10 +69,6 @@ bool wxControl::CreateControl(wxWindow *parent,
                                        validator, name ) )
         return false;
 
-    m_backgroundColour = parent->GetBackgroundColour();
-    m_foregroundColour = parent->GetForegroundColour();
-    m_font = parent->GetFont();
-
     return true;
 }
 
index 1a3ec55e8d7a8eb266ad6b0f45fbdf965d18f46a..56ad7af018602f9c6b21205b7055d8caf1d3be56 100644 (file)
@@ -179,8 +179,16 @@ wxWindowDC::wxWindowDC( wxWindow *window )
     gcvalues.graphics_exposures = False;
     gcvalues.subwindow_mode = IncludeInferiors;
     gcvalues.line_width = 1;
+#if !wxMOTIF_NEW_FONT_HANDLING
+    WXFontStructPtr pFontStruct = m_font.GetFontStruct(m_userScaleY*m_logicalScaleY, m_display);
+    gcvalues.font = ((XFontStruct*)pFontStruct)->fid;
+#endif
     m_gc = (WXGC) XCreateGC (display, RootWindow (display, DefaultScreen (display)),
-        GCForeground | GCBackground | GCGraphicsExposures | GCLineWidth | GCSubwindowMode,
+        GCForeground | GCBackground | GCGraphicsExposures | GCLineWidth | GCSubwindowMode
+#if !wxMOTIF_NEW_FONT_HANDLING
+        | GCFont
+#endif
+                             ,
         &gcvalues);
 
     if (m_window->GetBackingPixmap())
@@ -1685,7 +1693,7 @@ void wxWindowDC::SetPen( const wxPen &pen )
         if (m_window && m_window->GetBackingPixmap())
             XSetStipple ((Display*) m_display,(GC) m_gcBacking, myStipple);
     }
-    else if (m_currentStipple.Ok()
+    else if (m_currentStyle == wxSTIPPLE && m_currentStipple.Ok()
         && ((!m_currentStipple.IsSameAs(oldStipple)) || !GET_OPTIMIZATION))
     {
         XSetStipple ((Display*) m_display, (GC) m_gc, (Pixmap) m_currentStipple.GetDrawable());
index 9eceb4358152aac6adf2c6a1379970c3654666cb..b34a7ae8013a91378ac956e024b4b95eb944d9e7 100644 (file)
@@ -75,7 +75,6 @@ wxDialog::wxDialog()
 {
     m_modalShowing = false;
     m_eventLoop = NULL;
-    m_backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE);
 }
 
 bool wxDialog::Create(wxWindow *parent, wxWindowID id,
@@ -94,16 +93,10 @@ bool wxDialog::Create(wxWindow *parent, wxWindowID id,
     m_modalShowing = false;
     m_eventLoop = NULL;
 
-    m_backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE);
-    m_foregroundColour = *wxBLACK;
-
     Widget dialogShell = (Widget) m_mainWidget;
 
     SetTitle( title );
 
-    m_font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
-    ChangeFont(false);
-
     // Can't remember what this was about... but I think it's necessary.
 #if wxUSE_INVISIBLE_RESIZE
     if (pos.x > -1)
@@ -135,7 +128,7 @@ bool wxDialog::Create(wxWindow *parent, wxWindowID id,
     XtAddEventHandler(dialogShell,ExposureMask,False,
         wxUniversalRepaintProc, (XtPointer) this);
 
-    ChangeBackgroundColour();
+    PostCreation();
 
     return true;
 }
index 84999bb11eb8f636f9f1974a4c40cf0cf4bce07c..9ed21e2ada25f42608dd81fc9644b7e2a18e79fa 100644 (file)
 // headers
 // ----------------------------------------------------------------------------
 
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
 #ifdef __VMS
 #define XtParent XTPARENT
 #define XtDisplay XTDISPLAY
 #endif
 
-// For compilers that support precompilation, includes "wx.h".
-#include "wx/wxprec.h"
-
 #ifndef WX_PRECOMP
     #include "wx/event.h"
     #include "wx/app.h"
index 1684607914fb0414fb9e75da8380b19b5831a638..6ab59b0205aa015ee436aad35e1b761862f45fa1 100644 (file)
@@ -172,12 +172,15 @@ int wxFileDialog::ShowModal()
     Arg args[10];
     int ac = 0;
 
-    wxComputeColours (dpy, & m_backgroundColour, (wxColour*) NULL);
+    if (m_backgroundColour.Ok())
+    {
+        wxComputeColours (dpy, & m_backgroundColour, (wxColour*) NULL);
 
-    XtSetArg(args[ac], XmNbackground, g_itemColors[wxBACK_INDEX].pixel); ac++;
-    XtSetArg(args[ac], XmNtopShadowColor, g_itemColors[wxTOPS_INDEX].pixel); ac++;
-    XtSetArg(args[ac], XmNbottomShadowColor, g_itemColors[wxBOTS_INDEX].pixel); ac++;
-    XtSetArg(args[ac], XmNforeground, g_itemColors[wxFORE_INDEX].pixel); ac++;
+        XtSetArg(args[ac], XmNbackground, g_itemColors[wxBACK_INDEX].pixel); ac++;
+        XtSetArg(args[ac], XmNtopShadowColor, g_itemColors[wxTOPS_INDEX].pixel); ac++;
+        XtSetArg(args[ac], XmNbottomShadowColor, g_itemColors[wxBOTS_INDEX].pixel); ac++;
+        XtSetArg(args[ac], XmNforeground, g_itemColors[wxFORE_INDEX].pixel); ac++;
+    }
 
     wxFont font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
 
index db64aa47daca9ee547fe22cd7442dd08ebd58843..42e6e1e70f10ac2343a33644725dc919b3c214c7 100644 (file)
@@ -59,7 +59,7 @@ public:
 #if !wxMOTIF_NEW_FONT_HANDLING
     WXFontStructPtr     m_fontStruct;   // XFontStruct
 #endif
-#if !wxMOTIF_USE_RENDER_TABLE && !wxMOTIF_NEW_FONT_HANDLING
+#if !wxMOTIF_USE_RENDER_TABLE
     WXFontList          m_fontList;     // Motif XmFontList
 #else // if wxUSE_RENDER_TABLE
     WXRenderTable       m_renderTable;  // Motif XmRenderTable
@@ -131,7 +131,7 @@ wxXFont::wxXFont()
 #if !wxMOTIF_NEW_FONT_HANDLING
     m_fontStruct = (WXFontStructPtr) 0;
 #endif
-#if !wxMOTIF_USE_RENDER_TABLE && !wxMOTIF_NEW_FONT_HANDLING
+#if !wxMOTIF_USE_RENDER_TABLE
     m_fontList = (WXFontList) 0;
 #else // if wxMOTIF_USE_RENDER_TABLE
     m_renderTable = (WXRenderTable) 0;
@@ -635,7 +635,7 @@ WXFontType wxFont::GetFontTypeC(WXDisplay* display) const
 #endif
 }
 
-#if wxMOTIF_NEW_FONT_HANDLING
+#if wxMOTIF_USE_RENDER_TABLE
 
 WXFontSet wxFont::GetFontSet(double scale, WXDisplay* display) const
 {
@@ -667,7 +667,7 @@ void wxGetTextExtent(WXDisplay* display, const wxFont& font, double scale,
     if( descent ) *descent = logical.height + logical.y;
 }
 
-#else // if !wxMOTIF_NEW_FONT_HANDLING
+#else // if !wxMOTIF_USE_RENDER_TABLE
 
 void wxGetTextExtent(WXDisplay* display, const wxFont& font,
                      double scale, const wxString& str,
@@ -692,4 +692,4 @@ void wxGetTextExtent(WXDisplay* display, const wxFont& font,
         *ascent = ascent2;
 }
 
-#endif // !wxMOTIF_NEW_FONT_HANDLING
+#endif // !wxMOTIF_USE_RENDER_TABLE
index 8de4757af2a4cc44a5a2e8c9e932e9d571e7c0a8..6870ed2bc2b527a88b50d453bc78594839dc7cae 100644 (file)
@@ -130,11 +130,6 @@ bool wxFrame::Create(wxWindow *parent,
                                    name ) )
         return false;
 
-    m_backgroundColour =
-        wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE);
-    m_foregroundColour = *wxBLACK;
-    m_font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
-
     int x = pos.x, y = pos.y;
     int width = size.x, height = size.y;
 
@@ -180,10 +175,7 @@ bool wxFrame::Create(wxWindow *parent,
     if (height > -1)
         XtVaSetValues((Widget) m_frameShell, XmNheight, height, NULL);
 
-    ChangeFont(false);
-
-    ChangeBackgroundColour();
-
+    PostCreation();
     PreResize();
 
     wxSize newSize(width, height);
@@ -398,6 +390,12 @@ void wxFrame::DoSetClientSize(int width, int height)
 
 void wxFrame::DoGetSize(int *width, int *height) const
 {
+    if (!m_frameShell)
+    {
+        *width = -1; *height = -1;
+        return;
+    }
+
     Dimension xx, yy;
     XtVaGetValues((Widget) m_frameShell, XmNwidth, &xx, XmNheight, &yy, NULL);
     *width = xx; *height = yy;
index c809994fbce97ab2ef5feb6534afa2666d8ab593..4ccdf87265d359bc8bccf2375a231e8e9411fdbb 100644 (file)
@@ -109,6 +109,7 @@ bool wxGauge::Create(wxWindow *parent, wxWindowID id,
 {
     if( !CreateControl( parent, id, pos, size, style, validator, name ) )
         return false;
+    PreCreation();
 
     Widget parentWidget = (Widget) parent->GetClientWidget();
 
@@ -147,13 +148,10 @@ bool wxGauge::Create(wxWindow *parent, wxWindowID id,
     if( size.x != wxDefaultCoord ) best.x = size.x;
     if( size.y != wxDefaultCoord ) best.y = size.y;
 
-    ChangeFont(false);
-
+    PostCreation();
     AttachWidget (parent, m_mainWidget, (WXWidget) NULL, x, y,
                   best.x, best.y);
 
-    ChangeBackgroundColour();
-
     return true;
 }
 
index 817b9b1c99dd8300c0332f0d038eada17dfc3957..74b891b29388a5a5e0281636848da8cfe610c5ae 100644 (file)
@@ -52,21 +52,23 @@ static void wxListBoxCallback(Widget w,
 class wxSizeKeeper
 {
     int m_x, m_y;
-    wxWindow* m_w;
+    int m_w, m_h;
+    wxWindow* m_wnd;
 public:
     wxSizeKeeper( wxWindow* w )
-        : m_w( w )
+        : m_wnd( w )
     {
-        m_w->GetSize( &m_x, &m_y );
+        m_wnd->GetSize( &m_w, &m_h );
+        m_wnd->GetPosition( &m_x, &m_y );
     }
 
     void Restore()
     {
         int x, y;
 
-        m_w->GetSize( &x, &y );
+        m_wnd->GetSize( &x, &y );
         if( x != m_x || y != m_y )
-            m_w->SetSize( -1, -1, m_x, m_y );
+            m_wnd->SetSize( m_x, m_y, m_w, m_h );
     }
 };
 
@@ -91,9 +93,9 @@ bool wxListBox::Create(wxWindow *parent, wxWindowID id,
     if( !wxControl::CreateControl( parent, id, pos, size, style,
                                    validator, name ) )
         return false;
+    PreCreation();
 
     m_noItems = (unsigned int)n;
-    m_backgroundColour = * wxWHITE;
 
     Widget parentWidget = (Widget) parent->GetClientWidget();
     Display* dpy = XtDisplay(parentWidget);
@@ -149,11 +151,10 @@ bool wxListBox::Create(wxWindow *parent, wxWindowID id,
                    (XtCallbackProc) wxListBoxCallback,
                    (XtPointer) this);
 
+    PostCreation();
     AttachWidget (parent, m_mainWidget, (WXWidget) NULL,
                   pos.x, pos.y, best.x, best.y);
 
-    ChangeBackgroundColour();
-
     return true;
 }
 
index 1373b0b925ae39868ad3ddd39e6307ee5c17eeba..fe31aa958af6db743b777f8eff4bb26d9bed5a67 100644 (file)
@@ -338,10 +338,6 @@ bool wxMDIChildFrame::Create(wxMDIParentFrame *parent,
     SetName(name);
     SetWindowStyleFlag(style);
 
-    m_backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE);
-    m_foregroundColour = *wxBLACK;
-    m_font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
-
     if ( id > -1 )
         m_windowId = id;
     else
@@ -354,6 +350,7 @@ bool wxMDIChildFrame::Create(wxMDIParentFrame *parent,
     clientWindow->AddChild(this);
 
     SetMDIParentFrame(parent);
+    PreCreation();
 
     int width = size.x;
     int height = size.y;
@@ -393,10 +390,9 @@ bool wxMDIChildFrame::Create(wxMDIParentFrame *parent,
     XtAddEventHandler((Widget) m_mainWidget, ExposureMask,False,
         wxUniversalRepaintProc, (XtPointer) this);
 
+    PostCreation();
     AttachWidget (parent, m_mainWidget, (WXWidget) NULL, pos.x, pos.y, size.x, size.y);
 
-    ChangeBackgroundColour();
-
     XtManageChild((Widget) m_mainWidget);
 
     SetTitle(title);
@@ -640,14 +636,9 @@ bool wxMDIClientWindow::CreateClient(wxMDIParentFrame *parent, long style)
 {
     SetWindowStyleFlag(style);
 
-    //    m_windowParent = parent;
-    //    m_backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE);
-
     bool success = wxNotebook::Create(parent, wxID_NOTEBOOK_CLIENT_AREA, wxPoint(0, 0), wxSize(100, 100), 0);
     if (success)
     {
-        wxFont font(10, wxSWISS, wxNORMAL, wxNORMAL);
-        SetFont(font);
         return true;
     }
     else
index abbe28a36533d0a86ed3ff9184e1a5808c9b83a3..00637cc3b87e0f43b673eda95710444da19227c6 100644 (file)
@@ -82,10 +82,6 @@ void wxMenu::Init()
         Append(-3, m_title) ;
         AppendSeparator() ;
     }
-
-    m_backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_MENU);
-    m_foregroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_MENUTEXT);
-    m_font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
 }
 
 // The wxWindow destructor will take care of deleting the submenus.
@@ -190,9 +186,6 @@ void wxMenuBar::Init()
     m_eventHandler = this;
     m_menuBarFrame = NULL;
     m_mainWidget = (WXWidget) NULL;
-    m_backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_MENU);
-    m_foregroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_MENUTEXT);
-    m_font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
 }
 
 wxMenuBar::wxMenuBar(size_t n, wxMenu *menus[], const wxArrayString& titles, long WXUNUSED(style))
@@ -349,6 +342,10 @@ wxMenuItem *wxMenuBar::FindItem(int id, wxMenu ** itemMenu) const
 // Create menubar
 bool wxMenuBar::CreateMenuBar(wxFrame* parent)
 {
+    m_parent = parent; // bleach... override it!
+    PreCreation();
+    m_parent = NULL;
+
     if (m_mainWidget)
     {
         XtVaSetValues((Widget) parent->GetMainWidget(), XmNmenuBar, (Widget) m_mainWidget, NULL);
@@ -388,9 +385,7 @@ bool wxMenuBar::CreateMenuBar(wxFrame* parent)
         }
     }
 
-    SetBackgroundColour(m_backgroundColour);
-    SetForegroundColour(m_foregroundColour);
-    SetFont(m_font);
+    PostCreation();
 
     XtVaSetValues((Widget) parent->GetMainWidget(), XmNmenuBar, (Widget) m_mainWidget, NULL);
     XtRealizeWidget ((Widget) menuBarW);
@@ -474,13 +469,24 @@ WXWidget wxMenu::CreateMenu (wxMenuBar * menuBar,
 {
     Widget menu = (Widget) 0;
     Widget buttonWidget = (Widget) 0;
+    Display* dpy = XtDisplay((Widget)parent);
     Arg args[5];
     XtSetArg (args[0], XmNnumColumns, m_numColumns);
     XtSetArg (args[1], XmNpacking, (m_numColumns > 1) ? XmPACK_COLUMN : XmPACK_TIGHT);
 
+    if ( !m_font.Ok() )
+    {
+        if ( menuBar )
+            m_font = menuBar->GetFont();
+        else if ( GetInvokingWindow() )
+            m_font = GetInvokingWindow()->GetFont();
+    }
+
+    XtSetArg (args[2], (String)wxFont::GetFontTag(), m_font.GetFontTypeC(dpy) );
+
     if (!pullDown)
     {
-        menu = XmCreatePopupMenu ((Widget) parent, wxMOTIF_STR("popup"), args, 2);
+        menu = XmCreatePopupMenu ((Widget) parent, wxMOTIF_STR("popup"), args, 3);
 #if 0
         XtAddCallback(menu,
             XmNunmapCallback,
@@ -491,7 +497,7 @@ WXWidget wxMenu::CreateMenu (wxMenuBar * menuBar,
     else
     {
         char mnem = wxFindMnemonic (title);
-        menu = XmCreatePulldownMenu ((Widget) parent, wxMOTIF_STR("pulldown"), args, 2);
+        menu = XmCreatePulldownMenu ((Widget) parent, wxMOTIF_STR("pulldown"), args, 3);
 
         wxString title2(wxStripMenuCodes(title));
         wxXmString label_str(title2);
@@ -503,6 +509,8 @@ WXWidget wxMenu::CreateMenu (wxMenuBar * menuBar,
 #endif
             XmNlabelString, label_str(),
             XmNsubMenuId, menu,
+            (String)wxFont::GetFontTag(), m_font.GetFontTypeC(dpy),
+            XmNpositionIndex, index,
             NULL);
 
         if (mnem != 0)
@@ -523,9 +531,7 @@ WXWidget wxMenu::CreateMenu (wxMenuBar * menuBar,
         item->CreateItem(menu, menuBar, topMenu, i);
     }
 
-    SetBackgroundColour(m_backgroundColour);
-    SetForegroundColour(m_foregroundColour);
-    SetFont(m_font);
+    ChangeFont();
 
     return buttonWidget;
 }
@@ -600,6 +606,8 @@ WXWidget wxMenu::FindMenuItem (int id, wxMenuItem ** it) const
 void wxMenu::SetBackgroundColour(const wxColour& col)
 {
     m_backgroundColour = col;
+    if (!col.Ok())
+        return;
     if (m_menuWidget)
         wxDoChangeBackgroundColour(m_menuWidget, (wxColour&) col);
     if (m_buttonWidget)
@@ -623,6 +631,8 @@ void wxMenu::SetBackgroundColour(const wxColour& col)
 void wxMenu::SetForegroundColour(const wxColour& col)
 {
     m_foregroundColour = col;
+    if (!col.Ok())
+        return;
     if (m_menuWidget)
         wxDoChangeForegroundColour(m_menuWidget, (wxColour&) col);
     if (m_buttonWidget)
@@ -689,7 +699,10 @@ void wxMenu::SetFont(const wxFont& font)
 
 bool wxMenuBar::SetBackgroundColour(const wxColour& col)
 {
-    m_backgroundColour = col;
+    if (!wxWindowBase::SetBackgroundColour(col))
+        return false;
+    if (!col.Ok())
+        return false;
     if (m_mainWidget)
         wxDoChangeBackgroundColour(m_mainWidget, (wxColour&) col);
 
@@ -702,7 +715,10 @@ bool wxMenuBar::SetBackgroundColour(const wxColour& col)
 
 bool wxMenuBar::SetForegroundColour(const wxColour& col)
 {
-    m_foregroundColour = col;
+    if (!wxWindowBase::SetForegroundColour(col))
+        return false;
+    if (!col.Ok())
+        return false;
     if (m_mainWidget)
         wxDoChangeForegroundColour(m_mainWidget, (wxColour&) col);
 
index fe8e598e308a115f6ed1835b7d9d84105dac1582..f103cfc0d15bc3e7c95a285485082575bd3087b8 100644 (file)
@@ -167,12 +167,15 @@ int wxMessageDialog::ShowModal()
 
     Display* dpy = XtDisplay(wParent);
 
-    wxComputeColours (dpy, & m_backgroundColour, (wxColour*) NULL);
+    if (m_backgroundColour.Ok())
+    {
+        wxComputeColours (dpy, & m_backgroundColour, (wxColour*) NULL);
 
-    XtSetArg(args[ac], XmNbackground, g_itemColors[wxBACK_INDEX].pixel); ac++;
-    XtSetArg(args[ac], XmNtopShadowColor, g_itemColors[wxTOPS_INDEX].pixel); ac++;
-    XtSetArg(args[ac], XmNbottomShadowColor, g_itemColors[wxBOTS_INDEX].pixel); ac++;
-    XtSetArg(args[ac], XmNforeground, g_itemColors[wxFORE_INDEX].pixel); ac++;
+        XtSetArg(args[ac], XmNbackground, g_itemColors[wxBACK_INDEX].pixel); ac++;
+        XtSetArg(args[ac], XmNtopShadowColor, g_itemColors[wxTOPS_INDEX].pixel); ac++;
+        XtSetArg(args[ac], XmNbottomShadowColor, g_itemColors[wxBOTS_INDEX].pixel); ac++;
+        XtSetArg(args[ac], XmNforeground, g_itemColors[wxFORE_INDEX].pixel); ac++;
+    }
 
     wxFont font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
 
index 30aab7ea17b2dd5e4d91533a8dd6382252139687..ffa6837734a941c9a244e1b6f082912fb0b473da 100644 (file)
@@ -44,11 +44,19 @@ bool wxPopupWindow::Create( wxWindow *parent, int flags )
 
     m_mainWidget = (WXWidget)popup;
 
-    SetSize( 100, 100 ); // for child creation to work
+    wxAddWindowToTable( (Widget) m_mainWidget, this );
+
+    DoSetSizeIntr( -1, -1, 100, 100, 0, true );
 
     XtSetMappedWhenManaged( popup, False );
     XtRealizeWidget( popup );
-
+    XtManageChild ( popup );
+/*
+    XtTranslations ptr;
+    XtOverrideTranslations (popup,
+        ptr = XtParseTranslationTable ("<Configure>: resize()"));
+    XtFree ((char *) ptr);
+*/
     return true;
 }
 
@@ -59,7 +67,7 @@ bool wxPopupWindow::Show( bool show )
 
     if( show )
     {
-        XtPopup( (Widget)GetMainWidget(), XtGrabNone );
+        XtPopup( (Widget)GetMainWidget(), XtGrabNonexclusive );
     }
     else
     {
index fa0f0dbfca0793253d5333d5829194ae2e463eb2..e6a71ba4fbe646e340a45d48736d6b1c817c693d 100644 (file)
@@ -51,6 +51,7 @@ void wxRadioBox::Init()
     m_selectedButton = -1;
     m_noItems = 0;
     m_noRowsOrCols = 0;
+    m_labelWidget = (WXWidget) 0;
 }
 
 bool wxRadioBox::Create(wxWindow *parent, wxWindowID id, const wxString& title,
@@ -61,6 +62,7 @@ bool wxRadioBox::Create(wxWindow *parent, wxWindowID id, const wxString& title,
 {
     if( !CreateControl( parent, id, pos, size, style, val, name ) )
         return false;
+    PreCreation();
 
     m_noItems = (unsigned int)n;
     m_noRowsOrCols = majorDim;
@@ -137,18 +139,15 @@ bool wxRadioBox::Create(wxWindow *parent, wxWindowID id, const wxString& title,
                        (XtPointer) this);
     }
 
-    ChangeFont(false);
-
     SetSelection (0);
 
     XtRealizeWidget((Widget)m_mainWidget);
     XtManageChild (radioBoxWidget);
     XtManageChild ((Widget)m_mainWidget);
 
+    PostCreation();
     AttachWidget (parent, m_mainWidget, NULL, pos.x, pos.y, size.x, size.y);
 
-    ChangeBackgroundColour();
-
     return true;
 }
 
index 00ec024178593a80fc0c7d93e4bfc54fd799f098..4ac378762e70128b379287e333063aadf6ff271f 100644 (file)
@@ -51,6 +51,7 @@ bool wxRadioButton::Create(wxWindow *parent, wxWindowID id,
 {
     if( !CreateControl( parent, id, pos, size, style, validator, name ) )
         return false;
+    PreCreation();
 
     Widget parentWidget = (Widget) parent->GetClientWidget();
     Display* dpy = XtDisplay(parentWidget);
@@ -80,11 +81,10 @@ bool wxRadioButton::Create(wxWindow *parent, wxWindowID id,
 
     XtManageChild (radioButtonWidget);
 
+    PostCreation();
     AttachWidget (parent, m_mainWidget, (WXWidget) NULL,
                   pos.x, pos.y, size.x, size.y);
 
-    ChangeBackgroundColour();
-
     //copied from mac/radiobut.cpp (from here till "return true;")
     m_cycle = this ;
 
index 6cbdf29c23e300da9c6e4353ab4ca48a424a44a3..9c35d48ea3cbb704a5227b7301412ee7acc08266 100644 (file)
@@ -40,6 +40,7 @@ bool wxScrollBar::Create(wxWindow *parent, wxWindowID id,
 {
     if( !CreateControl( parent, id, pos, size, style, validator, name ) )
         return false;
+    PreCreation();
 
     wxSize newSize =
         ( style & wxHORIZONTAL ) ? wxSize( 140, 16 ) : wxSize( 16, 140 );
@@ -53,9 +54,9 @@ bool wxScrollBar::Create(wxWindow *parent, wxWindowID id,
                            (wxOrientation)(style & (wxHORIZONTAL|wxVERTICAL)),
                            (void (*)())wxScrollBarCallback );
 
+    PostCreation();
     AttachWidget (parent, m_mainWidget, (WXWidget) NULL,
                   pos.x, pos.y, newSize.x, newSize.y);
-    ChangeBackgroundColour();
 
     return true;
 }
index 8e529313354163106a244be3e3c9b253fbc35c50..6b012f29641bf23e0c2523d4160e42a19fb631e8 100644 (file)
@@ -64,6 +64,7 @@ bool wxSlider::Create(wxWindow *parent, wxWindowID id,
 
     if( !CreateControl( parent, id, pos, size, style, validator, name ) )
         return false;
+    PreCreation();
 
     m_lineSize = 1;
     m_windowStyle = style;
@@ -93,11 +94,9 @@ bool wxSlider::Create(wxWindow *parent, wxWindowID id,
     XtAddCallback (sliderWidget, XmNvalueChangedCallback, (XtCallbackProc) wxSliderCallback, (XtPointer) this);
     XtAddCallback (sliderWidget, XmNdragCallback, (XtCallbackProc) wxSliderCallback, (XtPointer) this);
 
-    ChangeFont(false);
+    PostCreation();
     AttachWidget (parent, m_mainWidget, (WXWidget) NULL, pos.x, pos.y, size.x, size.y);
 
-    ChangeBackgroundColour();
-
     return true;
 }
 
index a84d1f38dd822bec74eaf937e49659b1cae619d3..abee5b0bb60db18527b15078ad6d32d256f73595 100644 (file)
@@ -210,6 +210,7 @@ bool wxArrowButton::Create( wxSpinButton* parent,
     }
 
     parent->AddChild( this );
+    PreCreation();
 
     Widget parentWidget = (Widget) parent->GetClientWidget();
     m_mainWidget = (WXWidget) XtVaCreateManagedWidget( "XmArrowButton",
@@ -230,11 +231,10 @@ bool wxArrowButton::Create( wxSpinButton* parent,
                    XmNactivateCallback, (XtCallbackProc) StopTimerCallback,
                    (XtPointer) this );
 
+    PostCreation();
     AttachWidget( parent, m_mainWidget, (WXWidget) NULL,
                   pos.x, pos.y, size.x, size.y );
 
-    SetForegroundColour( parent->GetBackgroundColour() );
-
     return true;
 }
 
index 13dd72ae8898280941776e6e2746efec3bc62fb0..89a74c3792d27dfcc38404b36048635dffad6f55 100644 (file)
@@ -42,6 +42,7 @@ bool wxStaticBitmap::Create(wxWindow *parent, wxWindowID id,
     if( !CreateControl( parent, id, pos, size, style, wxDefaultValidator,
                         name ) )
         return false;
+    PreCreation();
 
     m_messageBitmap = bitmap;
     m_messageBitmapOriginal = bitmap;
@@ -57,18 +58,15 @@ bool wxStaticBitmap::Create(wxWindow *parent, wxWindowID id,
                     XmNalignment, XmALIGNMENT_BEGINNING,
                     NULL);
 
-    ChangeBackgroundColour ();
-
-    DoSetBitmap();
-
-    ChangeFont(false);
-
     wxSize actualSize(size);
     // work around the cases where the bitmap is a wxNull(Icon/Bitmap)
     if (actualSize.x == -1)
         actualSize.x = bitmap.Ok() ? bitmap.GetWidth() : 1;
     if (actualSize.y == -1)
         actualSize.y = bitmap.Ok() ? bitmap.GetHeight() : 1;
+
+    PostCreation();
+    DoSetBitmap();
     AttachWidget (parent, m_mainWidget, (WXWidget) NULL,
                   pos.x, pos.y, actualSize.x, actualSize.y);
 
index ae4838acdc222b3d17d34f59614cccc93c578b20..22deeec8c93a5a3ce92e28faffa68dd29c662ac5 100644 (file)
@@ -93,6 +93,8 @@ bool wxStaticBox::Create(wxWindow *parent, wxWindowID id,
     if( !CreateControl( parent, id, pos, size, style,
                         wxDefaultValidator, name ) )
         return false;
+    m_labelWidget = (WXWidget) 0;
+    PreCreation();
 
     Widget parentWidget = (Widget) parent->GetClientWidget();
 
@@ -119,9 +121,9 @@ bool wxStaticBox::Create(wxWindow *parent, wxWindowID id,
 #endif
                 NULL);
     }
-
+    
+    PostCreation();
     AttachWidget (parent, m_mainWidget, NULL, pos.x, pos.y, size.x, size.y);
-    ChangeBackgroundColour();
 
     return true;
 }
index fce5aaf4f0f34d4ead3a667ff02d3cad051abe7f..f233a510803ee7a9de3471474344374685a45d1f 100644 (file)
@@ -42,6 +42,8 @@ bool wxStaticText::Create(wxWindow *parent, wxWindowID id,
     if( !CreateControl( parent, id, pos, size, style,
                         wxDefaultValidator, name ) )
         return false;
+    m_labelWidget = (WXWidget) 0;
+    PreCreation();
 
     Widget parentWidget = (Widget) parent->GetClientWidget();
 
@@ -61,12 +63,15 @@ bool wxStaticText::Create(wxWindow *parent, wxWindowID id,
 
     m_mainWidget = borderWidget ? borderWidget : m_labelWidget;
 
-    AttachWidget (parent, m_mainWidget, (WXWidget) NULL,
-                  pos.x, pos.y, size.x, size.y);
+    SetLabel(label);
 
-    ChangeBackgroundColour ();
+    wxSize best = GetBestSize();
+    if( size.x != -1 ) best.x = size.x;
+    if( size.y != -1 ) best.y = size.y;
 
-    SetLabel(label);
+    PostCreation();
+    AttachWidget (parent, m_mainWidget, (WXWidget) NULL,
+                  pos.x, pos.y, best.x, best.y);
 
     return true;
 }
@@ -108,4 +113,12 @@ void wxStaticText::DoSetLabel(const wxString& str)
           dynamic ellipsizing of the label
 */
 
+wxSize wxStaticText::DoGetBestSize() const
+{
+    int w, h;
+    GetTextExtent(GetLabelText(), &w, &h, NULL, NULL, NULL);
+
+    return wxSize(w, h);
+}
+
 #endif // wxUSE_STATTEXT
index 20d462eabe75c2da2b3f5f08e2590818545d3ac6..1fd22c3af5afccd7afb71eceea0e486d897c4d24 100644 (file)
@@ -110,13 +110,12 @@ bool wxTextCtrl::Create(wxWindow *parent,
 {
     if( !CreateControl( parent, id, pos, size, style, validator, name ) )
         return false;
+    PreCreation();
 
     m_tempCallbackStruct = (void*) NULL;
     m_modified = false;
     m_processedDefault = false;
 
-    m_backgroundColour = *wxWHITE;
-
     Widget parentWidget = (Widget) parent->GetClientWidget();
 
     Bool wantHorizScroll = (m_windowStyle & wxHSCROLL) != 0 ? True : False;
@@ -135,8 +134,9 @@ bool wxTextCtrl::Create(wxWindow *parent,
         Arg args[8];
         int count = 0;
         XtSetArg (args[count], XmNscrollHorizontal, wantHorizScroll); ++count;
-        XtSetArg (args[count], (String) wxFont::GetFontTag(),
-                  m_font.GetFontType( XtDisplay(parentWidget) ) ); ++count;
+        if( m_font.IsOk() )
+            XtSetArg (args[count], (String) wxFont::GetFontTag(),
+                      m_font.GetFontType( XtDisplay(parentWidget) ) ); ++count;
         XtSetArg (args[count], XmNwordWrap, wantWordWrap); ++count;
         XtSetArg (args[count], XmNvalue, value.mb_str()); ++count;
         XtSetArg (args[count], XmNeditable,
@@ -194,11 +194,10 @@ bool wxTextCtrl::Create(wxWindow *parent,
 
     XtAddCallback((Widget) m_mainWidget, XmNlosingFocusCallback, (XtCallbackProc)wxTextWindowLoseFocusProc, (XtPointer)this);
 
+    PostCreation();
     AttachWidget (parent, m_mainWidget, (WXWidget) NULL,
                   pos.x, pos.y, size.x, size.y);
 
-    ChangeBackgroundColour();
-
     return true;
 }
 
@@ -667,8 +666,8 @@ wxSize wxDoGetSingleTextCtrlBestSize( Widget textWidget,
     int x, y;
     window->GetTextExtent( value, &x, &y );
 
-    if( x < 100 )
-        x = 100;
+    if( x < 90 )
+        x = 90;
 
     return wxSize( x + 2 * xmargin + 2 * highlight + 2 * shadow,
                    // MBN: +2 necessary: Lesstif bug or mine?
@@ -680,10 +679,16 @@ wxSize wxTextCtrl::DoGetBestSize() const
     if( IsSingleLine() )
     {
         wxSize best = wxControl::DoGetBestSize();
-
-        if( best.x < 110 ) best.x = 110;
+#if wxCHECK_MOTIF_VERSION( 2, 3 )
+        // OpenMotif 2.3 gives way too big X sizes
+        wxSize other_best = wxDoGetSingleTextCtrlBestSize
+                                ( (Widget) GetTopWidget(), this );
+        return wxSize( other_best.x, best.y );
+#else
+        if( best.x < 90 ) best.x = 90;
 
         return best;
+#endif
     }
     else
         return wxWindow::DoGetBestSize();
index 98619468b59f3925a6377d1d5692e054a04398b1..cbb8223d823b3bc92b968cee09ec1862d40ebe53 100644 (file)
@@ -204,11 +204,10 @@ bool wxToolBar::Create(wxWindow *parent,
     if( !wxControl::CreateControl( parent, id, pos, size, style,
                                    wxDefaultValidator, name ) )
         return false;
+    PreCreation();
 
     FixupStyle();
 
-    m_backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE);
-
     Widget parentWidget = (Widget) parent->GetClientWidget();
 
     Widget toolbar = XtVaCreateManagedWidget("toolbar",
@@ -232,8 +231,6 @@ bool wxToolBar::Create(wxWindow *parent,
 
     m_mainWidget = (WXWidget) toolbar;
 
-    ChangeFont(false);
-
     wxPoint rPos = pos;
     wxSize  rSize = size;
 
@@ -242,11 +239,10 @@ bool wxToolBar::Create(wxWindow *parent,
     if( rSize.x == -1 && GetParent() )
         rSize.x = GetParent()->GetSize().x;
 
+    PostCreation();
     AttachWidget (parent, m_mainWidget, (WXWidget) NULL,
                   rPos.x, rPos.y, rSize.x, rSize.y);
 
-    ChangeBackgroundColour();
-
     return true;
 }
 
index 5ce626267a154272eb6d91a5e12e5fd20a786a48..aaa53556dab1b635d529f029d4786b77ee5f34aa 100644 (file)
@@ -21,6 +21,8 @@
 #include "wx/wxprec.h"
 
 #include "wx/toplevel.h"
+#include "wx/settings.h"
+#include "wx/app.h"
 
 #ifndef WX_PRECOMP
     #include "wx/app.h"
@@ -112,6 +114,9 @@ bool wxTopLevelWindowMotif::Create( wxWindow *parent, wxWindowID id,
     wxTopLevelWindows.Append(this);
 
     m_windowId = ( id > -1 ) ? id : NewControlId();
+    // MBN: More backward compatible, but uglier
+    m_font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
+    m_inheritFont = true;
 
     bool retval = XmDoCreateTLW( parent, id, title, pos, size, style, name );
 
index 1f5d60838ad53510fad0e8d20c54913632548287..d60e87705e54bf77b57265bb45f5f8a1b6182f66 100644 (file)
@@ -524,6 +524,9 @@ XmString wxFindAcceleratorText (const char *s)
 // Change a widget's foreground and background colours.
 void wxDoChangeForegroundColour(WXWidget widget, wxColour& foregroundColour)
 {
+    if (!foregroundColour.Ok())
+        return;
+
     // When should we specify the foreground, if it's calculated
     // by wxComputeColours?
     // Solution: say we start with the default (computed) foreground colour.
@@ -540,6 +543,9 @@ void wxDoChangeForegroundColour(WXWidget widget, wxColour& foregroundColour)
 
 void wxDoChangeBackgroundColour(WXWidget widget, const wxColour& backgroundColour, bool changeArmColour)
 {
+    if (!backgroundColour.Ok())
+        return;
+
     wxComputeColours (XtDisplay((Widget) widget), & backgroundColour,
         (wxColour*) NULL);
 
index a99a8bb706d626f519aa6d448a0a2ab045ff800e..9a7d7eb156fbbbc678ca173af4212022b7683012 100644 (file)
@@ -235,9 +235,7 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id,
     CreateBase(parent, id, pos, size, style, wxDefaultValidator, name);
 
     parent->AddChild(this);
-
-    m_backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE);
-    m_foregroundColour = *wxBLACK;
+    PreCreation();
 
     //// TODO: we should probably optimize by only creating a
     //// a drawing area if we have one or more scrollbars (wxVSCROLL/wxHSCROLL).
@@ -330,21 +328,16 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id,
                        (XtPointer) this
                      );
 
-    // Scrolled widget needs to have its colour changed or we get a little blue
-    // square where the scrollbars abutt
-    wxColour backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE);
-    wxDoChangeBackgroundColour(m_scrolledWindow, backgroundColour, true);
-    wxDoChangeBackgroundColour(m_drawingArea, backgroundColour, true);
-
     XmScrolledWindowSetAreas(
                              (Widget)m_scrolledWindow,
                              (Widget) 0, (Widget) 0,
                              (Widget) m_drawingArea);
 
+    PostCreation();
+
     // Without this, the cursor may not be restored properly (e.g. in splitter
     // sample).
     SetCursor(*wxSTANDARD_CURSOR);
-    SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT));
     DoSetSizeIntr(pos.x, pos.y, size.x,size.y, wxSIZE_AUTO, true);
     return true;
 }
@@ -1173,12 +1166,13 @@ void wxWindow::DoGetSize(int *x, int *y) const
                                 m_drawingArea ) );
     Dimension xx, yy;
 
-    XtVaGetValues( widget,
-                   XmNwidth, &xx,
-                   XmNheight, &yy,
-                   NULL );
-    if(x) *x = xx;
-    if(y) *y = yy;
+    if (widget)
+        XtVaGetValues( widget,
+                       XmNwidth, &xx,
+                       XmNheight, &yy,
+                       NULL );
+    if(x) *x = widget ? xx : -1; 
+    if(y) *y = widget ? yy : -1;
 }
 
 void wxWindow::DoGetPosition(int *x, int *y) const
@@ -1261,6 +1255,11 @@ void wxWindow::DoSetSizeIntr(int x, int y, int width, int height,
         GetPosition(& oldX, & oldY);
     }
 
+    if (x == -1)
+        x = oldX;
+    if (x == -1)
+        x = oldY;
+
     if ( !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE) )
     {
         if ( width == -1 )
@@ -1457,24 +1456,26 @@ void wxWindow::DoMoveWindow(int x, int y, int width, int height)
 
 int wxWindow::GetCharHeight() const
 {
-    wxCHECK_MSG( m_font.Ok(), 0, "valid window font needed" );
-
     int height;
 
-    wxGetTextExtent (GetXDisplay(), m_font, 1.0,
-                     "x", NULL, &height, NULL, NULL);
+    if (m_font.Ok())
+        wxGetTextExtent (GetXDisplay(), m_font, 1.0,
+                         "x", NULL, &height, NULL, NULL);
+    else
+        wxGetTextExtent (this, "x", NULL, &height, NULL, NULL);
 
     return height;
 }
 
 int wxWindow::GetCharWidth() const
 {
-    wxCHECK_MSG( m_font.Ok(), 0, "valid window font needed" );
-
     int width;
 
-    wxGetTextExtent (GetXDisplay(), m_font, 1.0,
-                     "x", &width, NULL, NULL, NULL);
+    if (m_font.Ok())
+        wxGetTextExtent (GetXDisplay(), m_font, 1.0,
+                         "x", &width, NULL, NULL, NULL);
+    else
+        wxGetTextExtent (this, "x", &width, NULL, NULL, NULL);
 
     return width;
 }
@@ -1486,12 +1487,13 @@ void wxWindow::GetTextExtent(const wxString& string,
 {
     const wxFont *fontToUse = theFont ? theFont : &m_font;
 
-    wxCHECK_RET( fontToUse->Ok(), "valid window font needed" );
-
     if (externalLeading)
         *externalLeading = 0;
-    wxGetTextExtent (GetXDisplay(), *fontToUse, 1.0,
-                     string, x, y, NULL, descent);
+    if (fontToUse->Ok())
+        wxGetTextExtent (GetXDisplay(), *fontToUse, 1.0,
+                         string, x, y, NULL, descent);
+    else
+        wxGetTextExtent (this, string, x, y, NULL, descent);
 }
 
 // ----------------------------------------------------------------------------
@@ -1505,9 +1507,12 @@ void wxWindow::AddUpdateRect(int x, int y, int w, int h)
 
 void wxWindow::Refresh(bool eraseBack, const wxRect *rect)
 {
+    Widget widget = (Widget) GetMainWidget();
+    if (!widget)
+        return;
     m_needsRefresh = true;
-    Display *display = XtDisplay((Widget) GetMainWidget());
-    Window thisWindow = XtWindow((Widget) GetMainWidget());
+    Display *display = XtDisplay(widget);
+    Window thisWindow = XtWindow(widget);
 
     XExposeEvent dummyEvent;
     int width, height;
@@ -2494,7 +2499,7 @@ void wxWindow::ChangeFont(bool keepOriginalSize)
         int width, height, width1, height1;
         GetSize(& width, & height);
 
-        wxDoChangeFont( GetLabelWidget(), m_font );
+        wxDoChangeFont( w, m_font );
 
         GetSize(& width1, & height1);
         if (keepOriginalSize && (width != width1 || height != height1))
@@ -2504,6 +2509,20 @@ void wxWindow::ChangeFont(bool keepOriginalSize)
     }
 }
 
+// Post-creation
+void wxWindow::PostCreation()
+{
+    ChangeFont();
+    ChangeForegroundColour();
+    ChangeBackgroundColour();
+}
+
+// Pre-creation
+void wxWindow::PreCreation()
+{
+    InheritAttributes();
+}
+
 // ----------------------------------------------------------------------------
 // global functions
 // ----------------------------------------------------------------------------
@@ -2578,6 +2597,104 @@ wxMouseState wxGetMouseState()
 }
 
 
+#if wxMOTIF_NEW_FONT_HANDLING
+
+#include <Xm/XmP.h>
+
+void wxGetTextExtent(const wxWindow* window, const wxString& str,
+                     int* width, int* height, int* ascent, int* descent)
+{
+    Arg args[2];
+    int count = 0;
+    XmRendition rendition = NULL;
+    XmRenderTable table = NULL;
+    Widget w = (Widget) window->GetLabelWidget();
+
+    XtVaGetValues( w, XmNrenderTable, &table, NULL );
+    if (table == NULL)
+        table = XmeGetDefaultRenderTable(w, XmTEXT_RENDER_TABLE);
+
+    rendition = XmRenderTableGetRendition( table, "" );
+    XtSetArg( args[count], XmNfont, 0 ); ++count;
+    XtSetArg( args[count], XmNfontType, 0 ); ++count;
+    XmRenditionRetrieve( rendition, args, count );
+
+    if (args[1].value == XmFONT_IS_FONTSET)
+    {
+        XRectangle ink, logical;
+        WXFontSet fset = (WXFontSet) args[0].value;
+    
+        XmbTextExtents( (XFontSet)fset, str.c_str(), str.length(),
+                        &ink, &logical);
+
+        if( width ) *width = logical.width;
+        if( height ) *height = logical.height;
+        if( ascent ) *ascent = -logical.y;    
+        if( descent ) *descent = logical.height + logical.y;    
+    }
+    else
+    {
+        int direction, ascent2, descent2;
+        XCharStruct overall;
+        XFontStruct* fontStruct;
+
+        XmeRenderTableGetDefaultFont( table, &fontStruct );
+        XTextExtents(fontStruct, (const char*)str.c_str(), str.length(),
+                     &direction, &ascent2, &descent2, &overall);
+
+        if ( width ) *width = overall.width;
+        if ( height ) *height = ascent2 + descent2;
+        if ( descent ) *descent = descent2;
+        if ( ascent ) *ascent = ascent2;
+    }
+}
+
+#else // if !wxMOTIF_NEW_FONT_HANDLING
+
+void wxGetTextExtent(const wxWindow* window, const wxString& str,
+                     int* width, int* height, int* ascent, int* descent)
+{
+    XmFontList list = NULL;
+    XmFontContext cxt;
+    XmFontType type;
+    Widget w = (Widget) window->GetLabelWidget();
+
+    XtVaGetValues( w, XmNfontList, &list, NULL );
+    XmFontListInitFontContext( &cxt, list );
+
+    XmFontListEntry entry = XmFontListNextEntry( cxt );
+    XmFontListFreeFontContext( cxt );
+    XtPointer thing = XmFontListEntryGetFont( entry, &type );
+
+    if (type == XmFONT_IS_FONTSET)
+    {
+        XRectangle ink, logical;
+    
+        XmbTextExtents( (XFontSet)thing, str.c_str(), str.length(),
+                        &ink, &logical);
+
+        if( width ) *width = logical.width;
+        if( height ) *height = logical.height;
+        if( ascent ) *ascent = -logical.y;    
+        if( descent ) *descent = logical.height + logical.y;    
+    }
+    else
+    {
+        int direction, ascent2, descent2;
+        XCharStruct overall;
+
+        XTextExtents( (XFontStruct*)thing, (char*)(const char*)str.c_str(), str.length(),
+                     &direction, &ascent2, &descent2, &overall);
+
+        if ( width ) *width = overall.width;
+        if ( height ) *height = ascent2 + descent2;
+        if ( descent ) *descent = descent2;
+        if ( ascent ) *ascent = ascent2;
+    }
+}
+
+#endif // !wxMOTIF_NEW_FONT_HANDLING
+
 // ----------------------------------------------------------------------------
 // wxNoOptimize: switch off size optimization
 // ----------------------------------------------------------------------------