X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f97c985452b20a8c2f0bbfb1d0275298bf09fb45..184b5d99a5382cd7a19888c85aff11f8a21af2f6:/src/motif/dcclient.cpp diff --git a/src/motif/dcclient.cpp b/src/motif/dcclient.cpp index ebe87a10d5..fe58804734 100644 --- a/src/motif/dcclient.cpp +++ b/src/motif/dcclient.cpp @@ -146,7 +146,7 @@ wxWindowDC::wxWindowDC( wxWindow *window ) wxWindowDC::~wxWindowDC(void) { - if ((m_oldFont != (WXFont) 0) && ((long) m_oldFont != -1)) + if (m_gc && (m_oldFont != (WXFont) 0) && ((long) m_oldFont != -1)) { XSetFont ((Display*) m_display, (GC) m_gc, (Font) m_oldFont); @@ -1855,7 +1855,9 @@ void wxWindowDC::SetBackground( const wxBrush &brush ) int pixel = m_backgroundBrush.GetColour().AllocColour(m_display); - XSetWindowBackground ((Display*) m_display, (Pixmap) m_pixmap, pixel); + // XSetWindowBackground doesn't work for non-Window pixmaps + if (!this->IsKindOf(CLASSINFO(wxMemoryDC))) + XSetWindowBackground ((Display*) m_display, (Pixmap) m_pixmap, pixel); // Necessary for ::DrawIcon, which use fg/bg pixel or the GC. // And Blit,... (Any fct that use XCopyPlane, in fact.) @@ -1990,17 +1992,17 @@ void wxWindowDC:: SetDCClipping () // clipping imposed on a window by a repaint. // We'll combine it with the user region. But for now, // just use the currently-defined user clipping region. - if (m_userRegion || (m_window && m_window->GetPaintRegion()) ) + if (m_userRegion || (m_window && m_window->GetUpdateRegion().Ok()) ) m_currentRegion = (WXRegion) XCreateRegion (); else m_currentRegion = (WXRegion) NULL; - if ((m_window && m_window->GetPaintRegion()) && m_userRegion) - XIntersectRegion ((Region) m_window->GetPaintRegion(), (Region) m_userRegion, (Region) m_currentRegion); + if ((m_window && m_window->GetUpdateRegion().Ok()) && m_userRegion) + XIntersectRegion ((Region) m_window->GetUpdateRegion().GetXRegion(), (Region) m_userRegion, (Region) m_currentRegion); else if (m_userRegion) XIntersectRegion ((Region) m_userRegion, (Region) m_userRegion, (Region) m_currentRegion); - else if (m_window && m_window->GetPaintRegion()) - XIntersectRegion ((Region) m_window->GetPaintRegion(), (Region) m_window->GetPaintRegion(), + else if (m_window && m_window->GetUpdateRegion().Ok()) + XIntersectRegion ((Region) m_window->GetUpdateRegion().GetXRegion(), (Region) m_window->GetUpdateRegion().GetXRegion(), (Region) m_currentRegion); if (m_currentRegion) @@ -2174,7 +2176,7 @@ static void wx_spline_draw_point_array(wxDC *dc) } } -void wxWindowDC::DrawOpenSpline( wxList *points ) +void wxWindowDC::DrawSpline( wxList *points ) { wxPoint *p; double cx1, cy1, cx2, cy2, cx3, cy3, cx4, cy4; @@ -2223,3 +2225,56 @@ void wxWindowDC::DrawOpenSpline( wxList *points ) wx_spline_draw_point_array( this ); }; + +/* + * wxPaintDC + */ + +wxPaintDC::wxPaintDC(wxWindow* win): wxWindowDC(win) +{ + wxRegion* region = NULL; + + // Combine all the update rects into a region + if (win->m_updateRects.Number() > 0) + { + int i = 0; + for (i = 0; i < win->m_updateRects.Number(); i++) + { + wxRect* rect = (wxRect*) win->m_updateRects.Nth(i)->Data(); + /* + cout << "wxPaintDC. wxRect: " << rect->x << ", " << rect->y << ", "; + cout << rect->width << ", " << rect->height << "\n\n"; + */ + + if (!region) + region = new wxRegion(*rect); + else + // TODO: is this correct? In SetDCClipping above, + // XIntersectRegion is used to combine paint and user + // regions. XIntersectRegion appears to work in that case... + region->Union(*rect); + } + } + else + { + int cw, ch; + win->GetClientSize(&cw, &ch); + region = new wxRegion(wxRect(0, 0, cw, ch)); + } + + win->m_updateRegion = *region; + + // Set the clipping region. Any user-defined region will be combined with this + // one in SetDCClipping. + XSetRegion ((Display*) m_display, (GC) m_gc, (Region) region->GetXRegion()); + + delete region; +} + +wxPaintDC::~wxPaintDC() +{ + XSetClipMask ((Display*) m_display, (GC) m_gc, None); + if (m_window) + m_window->m_updateRegion.Clear(); +} +