wxMotif: wxWindow/Client/PaintDC starting to work.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@769 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Julian Smart
1998-09-23 13:56:00 +00:00
parent 16c1f7f345
commit e97f20a0f2
9 changed files with 109 additions and 30 deletions

View File

@@ -11,6 +11,9 @@ Updated: 21/9/98
libxpm exists and use that? What about PNGs? Can we use gdk libxpm exists and use that? What about PNGs? Can we use gdk
as per wxGTK? Probably not. as per wxGTK? Probably not.
- Work out why XFreeFont in font.cpp produces a segv. This is
currently commented out, which presumably causes a memory leak.
- wxRegion - wxRegion
- Bitmap versions of widgets (wxBitmapButton etc.) - Bitmap versions of widgets (wxBitmapButton etc.)

View File

@@ -901,6 +901,7 @@ typedef void* WXPixmap;
typedef void* WXFontStructPtr; typedef void* WXFontStructPtr;
typedef void* WXGC; typedef void* WXGC;
typedef void* WXRegion; typedef void* WXRegion;
typedef void* WXFont;
#endif #endif
#endif #endif

View File

@@ -118,6 +118,7 @@ protected:
int m_currentStyle ; int m_currentStyle ;
int m_currentFill ; int m_currentFill ;
int m_autoSetting ; // See comment in dcclient.cpp int m_autoSetting ; // See comment in dcclient.cpp
WXFont m_oldFont;
}; };
class WXDLLEXPORT wxPaintDC: public wxWindowDC class WXDLLEXPORT wxPaintDC: public wxWindowDC

View File

@@ -62,9 +62,9 @@ wxStatusBar::wxStatusBar(void)
wxStatusBar::~wxStatusBar(void) wxStatusBar::~wxStatusBar(void)
{ {
#ifdef __WXMSW__ // #ifdef __WXMSW__
SetFont(wxNullFont); SetFont(wxNullFont);
#endif // #endif
if ( m_statusWidths ) if ( m_statusWidths )
delete[] m_statusWidths; delete[] m_statusWidths;
@@ -178,6 +178,8 @@ void wxStatusBar::OnPaint(wxPaintEvent& WXUNUSED(event) )
for ( i = 0; i < m_nFields; i ++ ) for ( i = 0; i < m_nFields; i ++ )
DrawField(dc, i); DrawField(dc, i);
dc.SetFont(wxNullFont);
} }
void wxStatusBar::DrawFieldText(wxDC& dc, int i) void wxStatusBar::DrawFieldText(wxDC& dc, int i)

View File

@@ -73,6 +73,7 @@ wxColour::wxColour (const wxString& col)
m_red = the_colour->Red (); m_red = the_colour->Red ();
m_green = the_colour->Green (); m_green = the_colour->Green ();
m_blue = the_colour->Blue (); m_blue = the_colour->Blue ();
m_pixel = the_colour->m_pixel;
m_isInit = TRUE; m_isInit = TRUE;
} }
else else
@@ -82,9 +83,6 @@ wxColour::wxColour (const wxString& col)
m_blue = 0; m_blue = 0;
m_isInit = FALSE; m_isInit = FALSE;
} }
/* TODO
m_pixel = PALETTERGB (m_red, m_green, m_blue);
*/
} }
wxColour::~wxColour () wxColour::~wxColour ()
@@ -99,6 +97,7 @@ wxColour& wxColour::operator = (const wxString& col)
m_red = the_colour->Red (); m_red = the_colour->Red ();
m_green = the_colour->Green (); m_green = the_colour->Green ();
m_blue = the_colour->Blue (); m_blue = the_colour->Blue ();
m_pixel = the_colour->m_pixel;
m_isInit = TRUE; m_isInit = TRUE;
} }
else else
@@ -108,9 +107,7 @@ wxColour& wxColour::operator = (const wxString& col)
m_blue = 0; m_blue = 0;
m_isInit = FALSE; m_isInit = FALSE;
} }
/* TODO
m_pixel = PALETTERGB (m_red, m_green, m_blue);
*/
return (*this); return (*this);
} }
@@ -120,9 +117,7 @@ void wxColour::Set (unsigned char r, unsigned char g, unsigned char b)
m_green = g; m_green = g;
m_blue = b; m_blue = b;
m_isInit = TRUE; m_isInit = TRUE;
/* TODO m_pixel = -1;
m_pixel = PALETTERGB (m_red, m_green, m_blue);
*/
} }
// Allocate a colour, or nearest colour, using the given display. // Allocate a colour, or nearest colour, using the given display.

View File

@@ -89,6 +89,7 @@ wxWindowDC::wxWindowDC(void)
m_userRegion = (WXRegion) 0; m_userRegion = (WXRegion) 0;
m_pixmap = (WXPixmap) 0; m_pixmap = (WXPixmap) 0;
m_autoSetting = 0; m_autoSetting = 0;
m_oldFont = (WXFont) 0;
}; };
wxWindowDC::wxWindowDC( wxWindow *window ) wxWindowDC::wxWindowDC( wxWindow *window )
@@ -136,10 +137,23 @@ wxWindowDC::wxWindowDC( wxWindow *window )
} }
m_backgroundPixel = (int) gcvalues.background; m_backgroundPixel = (int) gcvalues.background;
// Get the current Font so we can set it back later
XGCValues valReturn;
XGetGCValues((Display*) m_display, (GC) m_gc, GCFont, &valReturn);
m_oldFont = (WXFont) valReturn.font;
}; };
wxWindowDC::~wxWindowDC(void) wxWindowDC::~wxWindowDC(void)
{ {
if ((m_oldFont != (WXFont) 0) && ((long) m_oldFont != -1))
{
XSetFont ((Display*) m_display, (GC) m_gc, (Font) m_oldFont);
if (m_window && m_window->GetBackingPixmap())
XSetFont ((Display*) m_display,(GC) m_gcBacking, (Font) m_oldFont);
}
if (m_gc) if (m_gc)
XFreeGC ((Display*) m_display, (GC) m_gc); XFreeGC ((Display*) m_display, (GC) m_gc);
m_gc = (WXGC) 0; m_gc = (WXGC) 0;
@@ -1323,7 +1337,16 @@ void wxWindowDC::SetFont( const wxFont &font )
m_font = font; m_font = font;
if (!m_font.Ok()) if (!m_font.Ok())
{
if ((m_oldFont != (WXFont) 0) && ((long) m_oldFont != -1))
{
XSetFont ((Display*) m_display, (GC) m_gc, (Font) m_oldFont);
if (m_window && m_window->GetBackingPixmap())
XSetFont ((Display*) m_display,(GC) m_gcBacking, (Font) m_oldFont);
}
return; return;
}
WXFontStructPtr pFontStruct = m_font.FindOrCreateFontStruct(m_userScaleY*m_logicalScaleY); WXFontStructPtr pFontStruct = m_font.FindOrCreateFontStruct(m_userScaleY*m_logicalScaleY);
@@ -1339,7 +1362,7 @@ void wxWindowDC::SetPen( const wxPen &pen )
if (!Ok()) return; if (!Ok()) return;
m_pen = pen; m_pen = pen;
if (m_pen.Ok()) if (!m_pen.Ok())
return; return;
wxBitmap oldStipple = m_currentStipple; wxBitmap oldStipple = m_currentStipple;

View File

@@ -56,7 +56,10 @@ wxFontRefData::~wxFontRefData()
while (node) while (node)
{ {
XFontStruct* fontStruct = (XFontStruct*) node->Data(); XFontStruct* fontStruct = (XFontStruct*) node->Data();
XFreeFont((Display*) wxGetDisplay, fontStruct); // TODO: why does freeing the font produce a segv???
// Commenting it out will result in memory leaks, and
// maybe X resource problems, who knows...
// XFreeFont((Display*) wxGetDisplay, fontStruct);
node = node->Next(); node = node->Next();
} }
m_fontsByScale.Clear(); m_fontsByScale.Clear();
@@ -290,6 +293,7 @@ WXFontStructPtr wxFont::FindOrCreateFontStruct(double scale)
if (!font) if (!font)
font = LoadQueryFont(120, wxDEFAULT, wxNORMAL, wxNORMAL, font = LoadQueryFont(120, wxDEFAULT, wxNORMAL, wxNORMAL,
M_FONTDATA->m_underlined); M_FONTDATA->m_underlined);
wxASSERT_MSG( (font != (XFontStruct*) NULL), "Could not allocate even a default font -- something is wrong." );
} }
if (font) if (font)
{ {

View File

@@ -18,37 +18,83 @@
#endif #endif
#include "wx/settings.h" #include "wx/settings.h"
#include "wx/gdicmn.h"
wxColour wxSystemSettings::GetSystemColour(int index) wxColour wxSystemSettings::GetSystemColour(int index)
{ {
// TODO switch (index)
return wxColour(); {
case wxSYS_COLOUR_SCROLLBAR:
// case wxSYS_COLOUR_DESKTOP: // Same as wxSYS_COLOUR_BACKGROUND
case wxSYS_COLOUR_BACKGROUND:
case wxSYS_COLOUR_ACTIVECAPTION:
case wxSYS_COLOUR_INACTIVECAPTION:
case wxSYS_COLOUR_MENU:
case wxSYS_COLOUR_WINDOW:
case wxSYS_COLOUR_WINDOWFRAME:
case wxSYS_COLOUR_ACTIVEBORDER:
case wxSYS_COLOUR_INACTIVEBORDER:
case wxSYS_COLOUR_BTNFACE:
// case wxSYS_COLOUR_3DFACE: // Same as wxSYS_COLOUR_BTNFACE
case wxSYS_COLOUR_GRAYTEXT:
{
return wxColour("LIGHT GREY");
}
case wxSYS_COLOUR_BTNSHADOW:
// case wxSYS_COLOUR_3DSHADOW: // Same as wxSYS_COLOUR_BTNSHADOW
{
return wxColour("GREY");
}
case wxSYS_COLOUR_3DDKSHADOW:
{
return *wxBLACK;
}
case wxSYS_COLOUR_HIGHLIGHT:
case wxSYS_COLOUR_BTNHIGHLIGHT:
// case wxSYS_COLOUR_3DHIGHLIGHT: // Same as wxSYS_COLOUR_BTNHIGHLIGHT
{
return *wxWHITE;
}
case wxSYS_COLOUR_3DLIGHT:
{
return wxColour("LIGHT GREY");
}
case wxSYS_COLOUR_MENUTEXT:
case wxSYS_COLOUR_WINDOWTEXT:
case wxSYS_COLOUR_CAPTIONTEXT:
case wxSYS_COLOUR_INACTIVECAPTIONTEXT:
case wxSYS_COLOUR_INFOTEXT:
{
return *wxBLACK;
}
case wxSYS_COLOUR_HIGHLIGHTTEXT:
{
return *wxWHITE;
}
case wxSYS_COLOUR_INFOBK:
case wxSYS_COLOUR_APPWORKSPACE:
{
return *wxWHITE;
}
}
return *wxWHITE;
} }
wxFont wxSystemSettings::GetSystemFont(int index) wxFont wxSystemSettings::GetSystemFont(int index)
{ {
// TODO
switch (index) switch (index)
{ {
case wxSYS_DEVICE_DEFAULT_FONT:
{
break;
}
case wxSYS_DEFAULT_PALETTE:
{
break;
}
case wxSYS_SYSTEM_FIXED_FONT: case wxSYS_SYSTEM_FIXED_FONT:
{ {
return wxFont(12, wxMODERN, wxNORMAL, wxNORMAL, FALSE);
break; break;
} }
case wxSYS_DEVICE_DEFAULT_FONT:
case wxSYS_SYSTEM_FONT: case wxSYS_SYSTEM_FONT:
{
break;
}
default:
case wxSYS_DEFAULT_GUI_FONT: case wxSYS_DEFAULT_GUI_FONT:
default:
{ {
return wxFont(12, wxSWISS, wxNORMAL, wxNORMAL, FALSE);
break; break;
} }
} }

View File

@@ -419,7 +419,9 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id,
XtAddEventHandler ((Widget) m_drawingArea, PointerMotionHintMask | EnterWindowMask | LeaveWindowMask | FocusChangeMask, XtAddEventHandler ((Widget) m_drawingArea, PointerMotionHintMask | EnterWindowMask | LeaveWindowMask | FocusChangeMask,
False, (XtEventHandler) wxCanvasEnterLeave, (XtPointer) this); False, (XtEventHandler) wxCanvasEnterLeave, (XtPointer) this);
return TRUE; SetSize(pos.x, pos.y, size.x, size.y);
return TRUE;
} }
void wxWindow::SetFocus() void wxWindow::SetFocus()
@@ -759,6 +761,8 @@ void wxWindow::Refresh(bool eraseBack, const wxRectangle *rect)
if (eraseBack) if (eraseBack)
{ {
wxClientDC dc(this); wxClientDC dc(this);
wxBrush backgroundBrush(GetBackgroundColour(), wxSOLID);
dc.SetBackground(backgroundBrush);
dc.Clear(); dc.Clear();
} }
@@ -1553,7 +1557,7 @@ void wxWindow::OnDefaultAction(wxControl *initiatingItem)
void wxWindow::Clear() void wxWindow::Clear()
{ {
wxClientDC dc(this); wxClientDC dc(this);
wxBrush brush(GetBackgroundColour(), wxSOLID); wxBrush brush(GetBackgroundColour(), wxSOLID);
dc.SetBackground(brush); dc.SetBackground(brush);
dc.Clear(); dc.Clear();