]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/dcclient.cpp
don't hang forever in Dispatch() if there is no event loop
[wxWidgets.git] / src / gtk / dcclient.cpp
index e07a871f767eaf01243b33e91f30c71eb8a3ade2..47c3ec21743280d65a921ed0d5d1e4c6342056ef 100644 (file)
@@ -7,10 +7,13 @@
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
 #pragma implementation "dcclient.h"
 #endif
 
 #pragma implementation "dcclient.h"
 #endif
 
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
 #ifdef __VMS
 #define XCopyPlane XCOPYPLANE
 #endif
 #ifdef __VMS
 #define XCopyPlane XCOPYPLANE
 #endif
@@ -695,20 +698,28 @@ void wxWindowDC::DoDrawLines( int n, wxPoint points[], wxCoord xoffset, wxCoord
     if (m_pen.GetStyle() == wxTRANSPARENT) return;
     if (n <= 0) return;
 
     if (m_pen.GetStyle() == wxTRANSPARENT) return;
     if (n <= 0) return;
 
-    CalcBoundingBox( points[0].x + xoffset, points[0].y + yoffset );
+    GdkPoint *gpts = new GdkPoint[n];
+    if (! gpts)
+    {
+        wxFAIL_MSG( wxT("Cannot allocate PolyLine") );
+        return;
+    }
 
 
-    for (int i = 0; i < n-1; i++)
+    for (int i = 0; i < n; i++) 
     {
         wxCoord x1 = XLOG2DEV(points[i].x + xoffset);
     {
         wxCoord x1 = XLOG2DEV(points[i].x + xoffset);
-        wxCoord x2 = XLOG2DEV(points[i+1].x + xoffset);
-        wxCoord y1 = YLOG2DEV(points[i].y + yoffset);     // oh, what a waste
-        wxCoord y2 = YLOG2DEV(points[i+1].y + yoffset);
+        wxCoord y1 = YLOG2DEV(points[i].y + yoffset);
 
 
-        if (m_window)
-            gdk_draw_line( m_window, m_penGC, x1, y1, x2, y2 );
+        CalcBoundingBox( x1 + xoffset, y1 + yoffset );
 
 
-        CalcBoundingBox( points[i+1].x + xoffset, points[i+1].y + yoffset );
+        gpts[i].x = x1;
+        gpts[i].y = y1;
     }
     }
+
+    if (m_window)
+        gdk_draw_lines( m_window, m_penGC, gpts, n);
+
+    delete[] gpts;
 }
 
 void wxWindowDC::DoDrawPolygon( int n, wxPoint points[], wxCoord xoffset, wxCoord yoffset, int WXUNUSED(fillStyle) )
 }
 
 void wxWindowDC::DoDrawPolygon( int n, wxPoint points[], wxCoord xoffset, wxCoord yoffset, int WXUNUSED(fillStyle) )
@@ -1443,6 +1454,8 @@ void wxWindowDC::DoDrawText( const wxString &text, wxCoord x, wxCoord y )
 #endif
     pango_layout_set_text( m_layout, (const char*) data, strlen( (const char*) data ));
 
 #endif
     pango_layout_set_text( m_layout, (const char*) data, strlen( (const char*) data ));
 
+    int w,h;
+    
     if (m_scaleY != 1.0)
     {
          // If there is a user or actually any scale applied to
     if (m_scaleY != 1.0)
     {
          // If there is a user or actually any scale applied to
@@ -1456,6 +1469,14 @@ void wxWindowDC::DoDrawText( const wxString &text, wxCoord x, wxCoord y )
          
          // actually apply scaled font
          pango_layout_set_font_description( m_layout, m_fontdesc );
          
          // actually apply scaled font
          pango_layout_set_font_description( m_layout, m_fontdesc );
+        
+         pango_layout_get_pixel_size( m_layout, &w, &h );
+         if ( m_backgroundMode == wxSOLID )
+         {
+            gdk_gc_set_foreground(m_textGC, m_textBackgroundColour.GetColor());
+            gdk_draw_rectangle(m_window, m_textGC, TRUE, x, y, w, h);
+            gdk_gc_set_foreground(m_textGC, m_textForegroundColour.GetColor());
+         }
          
          // Draw layout.
          gdk_draw_layout( m_window, m_textGC, x, y, m_layout );
          
          // Draw layout.
          gdk_draw_layout( m_window, m_textGC, x, y, m_layout );
@@ -1468,19 +1489,17 @@ void wxWindowDC::DoDrawText( const wxString &text, wxCoord x, wxCoord y )
     }
     else
     {
     }
     else
     {
-         // Draw layout.
-         gdk_draw_layout( m_window, m_textGC, x, y, m_layout );
+        pango_layout_get_pixel_size( m_layout, &w, &h );
+        if ( m_backgroundMode == wxSOLID )
+        {
+            gdk_gc_set_foreground(m_textGC, m_textBackgroundColour.GetColor());
+            gdk_draw_rectangle(m_window, m_textGC, TRUE, x, y, w, h);
+            gdk_gc_set_foreground(m_textGC, m_textForegroundColour.GetColor());
+        }
+        // Draw layout.
+        gdk_draw_layout( m_window, m_textGC, x, y, m_layout );
     }
     
     }
     
-#if 0
-    // Measure layout
-    int w,h;
-    pango_layout_get_pixel_size( m_layout, &w, &h );
-#else
-    int w = 10;
-    int h = 10;
-#endif
-
     wxCoord width = w;
     wxCoord height = h;
     
     wxCoord width = w;
     wxCoord height = h;