]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/dcclient.cpp
fix missing mouse-up events (eg when track control was called, which is consuming...
[wxWidgets.git] / src / gtk / dcclient.cpp
index 98805554a8422a0de594af359b02c51e269d9b61..94df22e7d94810ac07f410c2d677b4b07c3dd9f3 100644 (file)
@@ -773,6 +773,7 @@ void wxWindowDC::DoDrawPolygon( int n, wxPoint points[], wxCoord xoffset, wxCoor
 
         if (m_pen.GetStyle() != wxTRANSPARENT)
         {
+/*
             for (i = 0 ; i < n ; i++)
             {
                 gdk_draw_line( m_window, m_penGC,
@@ -781,6 +782,9 @@ void wxWindowDC::DoDrawPolygon( int n, wxPoint points[], wxCoord xoffset, wxCoor
                                gdkpoints[(i+1)%n].x,
                                gdkpoints[(i+1)%n].y);
             }
+*/
+            gdk_draw_polygon( m_window, m_penGC, FALSE, gdkpoints, n );
+            
         }
     }
 
@@ -1686,29 +1690,42 @@ void wxWindowDC::DoGetTextExtent(const wxString &string,
     // Set layout's text
 #if wxUSE_UNICODE
     const wxCharBuffer data = wxConvUTF8.cWC2MB( string );
-    pango_layout_set_text( m_layout, (const char*) data, strlen( (const char*) data ));
+    const char *dataUTF8 = (const char *)data;
 #else
     const wxWCharBuffer wdata = wxConvLocal.cMB2WC( string );
+    if ( !wdata )
+        return;
     const wxCharBuffer data = wxConvUTF8.cWC2MB( wdata );
-    pango_layout_set_text( m_layout, (const char*) data, strlen( (const char*) data ));
+    const char *dataUTF8 = (const char *)data;
 #endif
+
+    if ( !dataUTF8 )
+    {
+        // hardly ideal, but what else can we do if conversion failed?
+        return;
+    }
+
+    pango_layout_set_text( m_layout, dataUTF8, strlen(dataUTF8) );
  
     int w,h;
     pango_layout_get_pixel_size( m_layout, &w, &h );
     
-    if (width) (*width) = (wxCoord) w; 
-    if (height) (*height) = (wxCoord) h;
+    if (width)
+        *width = (wxCoord) w; 
+    if (height)
+        *height = (wxCoord) h;
     if (descent)
     {
         // Do something about metrics here. TODO.
-        (*descent) = 0;
+        *descent = 0;
     }
-    if (externalLeading) (*externalLeading) = 0;  // ??
+    if (externalLeading)
+        *externalLeading = 0;  // ??
     
     // Reset old font description
     if (theFont)
         pango_layout_set_font_description( m_layout, m_fontdesc );
-#else
+#else // GTK+ 1.x
     wxFont fontToUse = m_font;
     if (theFont) fontToUse = *theFont;
     
@@ -1717,7 +1734,7 @@ void wxWindowDC::DoGetTextExtent(const wxString &string,
     if (height) (*height) = wxCoord((font->ascent + font->descent) / m_scaleY);
     if (descent) (*descent) = wxCoord(font->descent / m_scaleY);
     if (externalLeading) (*externalLeading) = 0;  // ??
-#endif
+#endif // GTK+ 2/1
 }
 
 wxCoord wxWindowDC::GetCharWidth() const
@@ -2327,6 +2344,25 @@ int wxWindowDC::GetDepth() const
 
 IMPLEMENT_DYNAMIC_CLASS(wxPaintDC, wxClientDC)
 
+// Limit the paint region to the window size. Sometimes
+// the paint region is too big, and this risks X11 errors
+static void wxLimitRegionToSize(wxRegion& region, const wxSize& sz)
+{
+    wxRect originalRect = region.GetBox();
+    wxRect rect(originalRect);
+    if (rect.width + rect.x > sz.x)
+        rect.width = sz.x - rect.x;
+    if (rect.height + rect.y > sz.y)
+        rect.height = sz.y - rect.y;
+    if (rect != originalRect)
+    {
+        region = wxRegion(rect);
+        wxLogTrace(wxT("painting"), wxT("Limiting region from %d, %d, %d, %d to %d, %d, %d, %d\n"),
+                   originalRect.x, originalRect.y, originalRect.width, originalRect.height,
+                   rect.x, rect.y, rect.width, rect.height);
+    }
+}
+
 wxPaintDC::wxPaintDC( wxWindow *win )
          : wxClientDC( win )
 {
@@ -2334,21 +2370,23 @@ wxPaintDC::wxPaintDC( wxWindow *win )
     if (!win->m_clipPaintRegion)
         return;
 
+    wxSize sz = win->GetSize();
     m_paintClippingRegion = win->GetUpdateRegion();
+    wxLimitRegionToSize(m_paintClippingRegion, sz);
+    
     GdkRegion *region = m_paintClippingRegion.GetRegion();
     if ( region )
     {
-        m_paintClippingRegion = win->GetUpdateRegion();
-        GdkRegion *region = m_paintClippingRegion.GetRegion();
-        if ( region )
-        {
-            m_currentClippingRegion.Union( m_paintClippingRegion );
+        m_currentClippingRegion.Union( m_paintClippingRegion );
+        wxLimitRegionToSize(m_currentClippingRegion, sz);
 
-            gdk_gc_set_clip_region( m_penGC, region );
-            gdk_gc_set_clip_region( m_brushGC, region );
-            gdk_gc_set_clip_region( m_textGC, region );
-            gdk_gc_set_clip_region( m_bgGC, region );
-        }
+        if (sz.x <= 0 || sz.y <= 0)
+            return ;
+
+        gdk_gc_set_clip_region( m_penGC, region );
+        gdk_gc_set_clip_region( m_brushGC, region );
+        gdk_gc_set_clip_region( m_textGC, region );
+        gdk_gc_set_clip_region( m_bgGC, region );
     }
 #endif // USE_PAINT_REGION
 }