X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b1633d20d6f06a0b5a77d5208c0beddf19324f33..24bcaec36746abeeb9e2023d03e3ab4289006fc3:/src/x11/dcclient.cpp diff --git a/src/x11/dcclient.cpp b/src/x11/dcclient.cpp index 1fd7a30914..23629d5500 100644 --- a/src/x11/dcclient.cpp +++ b/src/x11/dcclient.cpp @@ -1361,17 +1361,32 @@ void wxWindowDC::DoDrawText( const wxString &text, wxCoord x, wxCoord y ) x = XLOG2DEV(x); y = YLOG2DEV(y); -#if 0 - wxCoord width = gdk_string_width( font, text.mbc_str() ); - wxCoord height = font->ascent + font->descent; - - if ( m_backgroundMode == wxSOLID ) + // First draw a rectangle representing the text background, if a text + // background is specified + if (m_textBackgroundColour.Ok () && (m_backgroundMode != wxTRANSPARENT)) { - gdk_gc_set_foreground( m_textGC, m_textBackgroundColour.GetColor() ); - gdk_draw_rectangle( m_window, m_textGC, TRUE, x, y, width, height ); - gdk_gc_set_foreground( m_textGC, m_textForegroundColour.GetColor() ); + // Since X draws from the baseline of the text, must add the text height + int cx = 0; + int cy = 0; + int ascent = 0; + int slen; + int direction, descent; + + slen = strlen(text); + XCharStruct overall_return; + + (void)XTextExtents(xfont, (char*) text.c_str(), slen, &direction, + &ascent, &descent, &overall_return); + + cx = overall_return.width; + cy = ascent + descent; + m_textBackgroundColour.CalcPixel(m_cmap); + XSetForeground ((Display*) m_display, (GC) m_textGC, m_textBackgroundColour.GetPixel()); + XFillRectangle( (Display*) m_display, (Window) m_window, + (GC) m_textGC, x, y, cx, cy ); + XSetForeground ((Display*) m_display, (GC) m_textGC, m_textForegroundColour.GetPixel()); + } -#endif XSetFont( (Display*) m_display, (GC) m_textGC, xfont->fid ); #if !wxUSE_NANOX @@ -2015,53 +2030,24 @@ int wxWindowDC::GetDepth() const return -1; } -// ---------------------------------------------------------------------------- -// wxPaintDC -// ---------------------------------------------------------------------------- - -IMPLEMENT_DYNAMIC_CLASS(wxPaintDC, wxClientDC) - -wxPaintDC::wxPaintDC(wxWindow* win) - : wxClientDC(win) -{ -#if USE_PAINT_REGION - if (!win->GetClipPaintRegion()) - return; - - m_paintClippingRegion = win->GetUpdateRegion(); - Region region = (Region) m_paintClippingRegion.GetX11Region(); - if (region) - { - m_paintClippingRegion = win->GetUpdateRegion(); - Region region2 = (Region) m_paintClippingRegion.GetX11Region(); - if (region2) - { - m_currentClippingRegion.Union( m_paintClippingRegion ); - - XSetRegion( (Display*) m_display, (GC) m_penGC, region2 ); - XSetRegion( (Display*) m_display, (GC) m_brushGC, region2 ); - XSetRegion( (Display*) m_display, (GC) m_textGC, region2 ); - XSetRegion( (Display*) m_display, (GC) m_bgGC, region2 ); - } - } -#endif // USE_PAINT_REGION -} - //----------------------------------------------------------------------------- // wxClientDC //----------------------------------------------------------------------------- IMPLEMENT_DYNAMIC_CLASS(wxClientDC, wxWindowDC) -wxClientDC::wxClientDC( wxWindow *win ) - : wxWindowDC( win ) +wxClientDC::wxClientDC( wxWindow *window ) + : wxWindowDC( window ) { - wxCHECK_RET( win, _T("NULL window in wxClientDC::wxClientDC") ); + wxCHECK_RET( window, _T("NULL window in wxClientDC::wxClientDC") ); + + m_window = (WXWindow*) window->GetClientWindow(); -#ifdef __WXUNIVERSAL__ - wxPoint ptOrigin = win->GetClientAreaOrigin(); +#if wxUSE_TWO_WINDOWS +#else + wxPoint ptOrigin = window->GetClientAreaOrigin(); SetDeviceOrigin(ptOrigin.x, ptOrigin.y); - wxSize size = win->GetClientSize(); + wxSize size = window->GetClientSize(); SetClippingRegion(wxPoint(0, 0), size); #endif // __WXUNIVERSAL__ } @@ -2073,6 +2059,33 @@ void wxClientDC::DoGetSize(int *width, int *height) const m_owner->GetClientSize( width, height ); } +// ---------------------------------------------------------------------------- +// wxPaintDC +// ---------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxPaintDC, wxClientDC) + +wxPaintDC::wxPaintDC(wxWindow* window) + : wxClientDC(window) +{ +#if USE_PAINT_REGION + if (!window->GetClipPaintRegion()) + return; + + m_paintClippingRegion = window->GetUpdateRegion(); + Region region = (Region) m_paintClippingRegion.GetX11Region(); + if (region) + { + m_currentClippingRegion.Union( m_paintClippingRegion ); + + XSetRegion( (Display*) m_display, (GC) m_penGC, region ); + XSetRegion( (Display*) m_display, (GC) m_brushGC, region ); + XSetRegion( (Display*) m_display, (GC) m_textGC, region ); + XSetRegion( (Display*) m_display, (GC) m_bgGC, region ); + } +#endif // USE_PAINT_REGION +} + // ---------------------------------------------------------------------------- // wxDCModule // ----------------------------------------------------------------------------