]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/dcclient.cpp
Improved selection mode handling in wxGrid::SelectBlock
[wxWidgets.git] / src / gtk / dcclient.cpp
index 1dbaf55b39bcf3d0fe50e7709f878a9d90378b23..666498fa50b2b69a44f45ba0ec353cbf1bccefec 100644 (file)
@@ -165,9 +165,9 @@ static GdkGC* wxGetPoolGC( GdkWindow *window, wxPoolGCType type )
             return wxGCPool[i].m_gc;
         }
     }
-    
+
     wxFAIL_MSG( wxT("No GC available") );
-    
+
     return (GdkGC*) NULL;
 }
 
@@ -181,7 +181,7 @@ static void wxFreePoolGC( GdkGC *gc )
             return;
         }
     }
-    
+
     wxFAIL_MSG( wxT("Wrong GC") );
 }
 
@@ -264,9 +264,9 @@ wxWindowDC::~wxWindowDC()
 void wxWindowDC::SetUpDC()
 {
     m_ok = TRUE;
-    
+
     wxASSERT_MSG( !m_penGC, wxT("GCs already created") );
-    
+
     if (m_isMemDC && (((wxMemoryDC*)this)->m_selected.GetDepth() == 1))
     {
         m_penGC = wxGetPoolGC( m_window, wxPEN_MONO );
@@ -300,27 +300,27 @@ void wxWindowDC::SetUpDC()
     m_pen.GetColour().CalcPixel( m_cmap );
     gdk_gc_set_foreground( m_penGC, m_pen.GetColour().GetColor() );
     gdk_gc_set_background( m_penGC, bg_col );
-    
+
     gdk_gc_set_line_attributes( m_penGC, 0, GDK_LINE_SOLID, GDK_CAP_NOT_LAST, GDK_JOIN_ROUND );
-    
+
     /* m_brushGC */
     m_brush.GetColour().CalcPixel( m_cmap );
     gdk_gc_set_foreground( m_brushGC, m_brush.GetColour().GetColor() );
     gdk_gc_set_background( m_brushGC, bg_col );
-    
+
     gdk_gc_set_fill( m_brushGC, GDK_SOLID );
-    
+
     /* m_bgGC */
     gdk_gc_set_background( m_bgGC, bg_col );
     gdk_gc_set_foreground( m_bgGC, bg_col );
 
     gdk_gc_set_fill( m_bgGC, GDK_SOLID );
-  
+
     /* ROPs */
     gdk_gc_set_function( m_textGC, GDK_COPY );
     gdk_gc_set_function( m_brushGC, GDK_COPY );
     gdk_gc_set_function( m_penGC, GDK_COPY );
-    
+
     /* clipping */
     gdk_gc_set_clip_rectangle( m_penGC, (GdkRectangle *) NULL );
     gdk_gc_set_clip_rectangle( m_brushGC, (GdkRectangle *) NULL );
@@ -530,16 +530,16 @@ void wxWindowDC::DoDrawPolygon( int n, wxPoint points[], wxCoord xoffset, wxCoor
         {
             if ((m_brush.GetStyle() == wxSTIPPLE_MASK_OPAQUE) && (m_brush.GetStipple()->GetMask()))
             {
-                gdk_gc_set_ts_origin( m_textGC, 
-                                      m_deviceOriginX % m_brush.GetStipple()->GetWidth(), 
+                gdk_gc_set_ts_origin( m_textGC,
+                                      m_deviceOriginX % m_brush.GetStipple()->GetWidth(),
                                       m_deviceOriginY % m_brush.GetStipple()->GetHeight() );
                 gdk_draw_polygon( m_window, m_textGC, TRUE, gdkpoints, n );
                 gdk_gc_set_ts_origin( m_textGC, 0, 0 );
             } else
             if (m_brush.GetStyle() == wxSTIPPLE)
             {
-                gdk_gc_set_ts_origin( m_brushGC, 
-                                      m_deviceOriginX % m_brush.GetStipple()->GetWidth(), 
+                gdk_gc_set_ts_origin( m_brushGC,
+                                      m_deviceOriginX % m_brush.GetStipple()->GetWidth(),
                                       m_deviceOriginY % m_brush.GetStipple()->GetHeight() );
                 gdk_draw_polygon( m_window, m_brushGC, TRUE, gdkpoints, n );
                 gdk_gc_set_ts_origin( m_brushGC, 0, 0 );
@@ -588,16 +588,16 @@ void wxWindowDC::DoDrawRectangle( wxCoord x, wxCoord y, wxCoord width, wxCoord h
         {
             if ((m_brush.GetStyle() == wxSTIPPLE_MASK_OPAQUE) && (m_brush.GetStipple()->GetMask()))
             {
-                gdk_gc_set_ts_origin( m_textGC, 
-                                      m_deviceOriginX % m_brush.GetStipple()->GetWidth(), 
+                gdk_gc_set_ts_origin( m_textGC,
+                                      m_deviceOriginX % m_brush.GetStipple()->GetWidth(),
                                       m_deviceOriginY % m_brush.GetStipple()->GetHeight() );
                 gdk_draw_rectangle( m_window, m_textGC, TRUE, xx, yy, ww, hh );
                 gdk_gc_set_ts_origin( m_textGC, 0, 0 );
             }
             else if (m_brush.GetStyle() == wxSTIPPLE)
             {
-                gdk_gc_set_ts_origin( m_brushGC, 
-                                      m_deviceOriginX % m_brush.GetStipple()->GetWidth(), 
+                gdk_gc_set_ts_origin( m_brushGC,
+                                      m_deviceOriginX % m_brush.GetStipple()->GetWidth(),
                                       m_deviceOriginY % m_brush.GetStipple()->GetHeight() );
                 gdk_draw_rectangle( m_window, m_brushGC, TRUE, xx, yy, ww, hh );
                 gdk_gc_set_ts_origin( m_brushGC, 0, 0 );
@@ -664,8 +664,8 @@ void wxWindowDC::DoDrawRoundedRectangle( wxCoord x, wxCoord y, wxCoord width, wx
         {
             if ((m_brush.GetStyle() == wxSTIPPLE_MASK_OPAQUE) && (m_brush.GetStipple()->GetMask()))
             {
-                gdk_gc_set_ts_origin( m_textGC, 
-                                      m_deviceOriginX % m_brush.GetStipple()->GetWidth(), 
+                gdk_gc_set_ts_origin( m_textGC,
+                                      m_deviceOriginX % m_brush.GetStipple()->GetWidth(),
                                       m_deviceOriginY % m_brush.GetStipple()->GetHeight() );
                 gdk_draw_rectangle( m_window, m_textGC, TRUE, xx+rr, yy, ww-dd+1, hh );
                 gdk_draw_rectangle( m_window, m_textGC, TRUE, xx, yy+rr, ww, hh-dd+1 );
@@ -677,8 +677,8 @@ void wxWindowDC::DoDrawRoundedRectangle( wxCoord x, wxCoord y, wxCoord width, wx
             }
             else if (m_brush.GetStyle() == wxSTIPPLE)
             {
-                gdk_gc_set_ts_origin( m_brushGC, 
-                                      m_deviceOriginX % m_brush.GetStipple()->GetWidth(), 
+                gdk_gc_set_ts_origin( m_brushGC,
+                                      m_deviceOriginX % m_brush.GetStipple()->GetWidth(),
                                       m_deviceOriginY % m_brush.GetStipple()->GetHeight() );
                 gdk_draw_rectangle( m_window, m_brushGC, TRUE, xx+rr, yy, ww-dd+1, hh );
                 gdk_draw_rectangle( m_window, m_brushGC, TRUE, xx, yy+rr, ww, hh-dd+1 );
@@ -736,16 +736,16 @@ void wxWindowDC::DoDrawEllipse( wxCoord x, wxCoord y, wxCoord width, wxCoord hei
         {
             if ((m_brush.GetStyle() == wxSTIPPLE_MASK_OPAQUE) && (m_brush.GetStipple()->GetMask()))
             {
-                gdk_gc_set_ts_origin( m_textGC, 
-                                      m_deviceOriginX % m_brush.GetStipple()->GetWidth(), 
+                gdk_gc_set_ts_origin( m_textGC,
+                                      m_deviceOriginX % m_brush.GetStipple()->GetWidth(),
                                       m_deviceOriginY % m_brush.GetStipple()->GetHeight() );
                 gdk_draw_arc( m_window, m_textGC, TRUE, xx, yy, ww, hh, 0, 360*64 );
                 gdk_gc_set_ts_origin( m_textGC, 0, 0 );
             }
             else if (m_brush.GetStyle() == wxSTIPPLE)
             {
-                gdk_gc_set_ts_origin( m_brushGC, 
-                                      m_deviceOriginX % m_brush.GetStipple()->GetWidth(), 
+                gdk_gc_set_ts_origin( m_brushGC,
+                                      m_deviceOriginX % m_brush.GetStipple()->GetWidth(),
                                       m_deviceOriginY % m_brush.GetStipple()->GetHeight() );
                 gdk_draw_arc( m_window, m_brushGC, TRUE, xx, yy, ww, hh, 0, 360*64 );
                 gdk_gc_set_ts_origin( m_brushGC, 0, 0 );
@@ -803,7 +803,7 @@ void wxWindowDC::DoDrawBitmap( const wxBitmap &bitmap,
         if (tmp.IsEmpty())
             return;
     }
-    
+
     /* scale bitmap if required */
     wxBitmap use_bitmap;
     if ((w != ww) || (h != hh))
@@ -846,7 +846,7 @@ void wxWindowDC::DoDrawBitmap( const wxBitmap &bitmap,
                 gdk_draw_rectangle( new_mask, gc, TRUE, 0, 0, ww, hh );
                 gdk_gc_unref( gc );
             }
-        
+
             if (is_mono)
             {
                 if (new_mask)
@@ -977,7 +977,7 @@ bool wxWindowDC::DoBlit( wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord he
 
     int old_logical_func = m_logicalFunction;
     SetLogicalFunction( logical_func );
-    
+
     if (use_bitmap_method)
     {
         /* scale/translate bitmap size */
@@ -1031,7 +1031,7 @@ bool wxWindowDC::DoBlit( wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord he
                 gdk_draw_rectangle( new_mask, gc, TRUE, 0, 0, bm_ww, bm_hh );
                 gdk_gc_unref( gc );
             }
-        
+
             if (is_mono)
             {
                 if (new_mask)
@@ -1054,7 +1054,7 @@ bool wxWindowDC::DoBlit( wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord he
 
         /* Draw XPixmap or XBitmap, depending on what the wxBitmap contains. For
            drawing a mono-bitmap (XBitmap) we use the current text GC */
-    
+
         if (is_mono)
             gdk_draw_bitmap( m_window, m_textGC, use_bitmap.GetBitmap(), xsrc, ysrc, xx, yy, ww, hh );
         else
@@ -1097,14 +1097,14 @@ bool wxWindowDC::DoBlit( wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord he
                for a different implementation of the same problem. */
 
             wxBitmap bitmap( width, height );
-            
+
             /* copy including child window contents */
             gdk_gc_set_subwindow( m_penGC, GDK_INCLUDE_INFERIORS );
             gdk_window_copy_area( bitmap.GetPixmap(), m_penGC, 0, 0,
                                   srcDC->GetWindow(),
                                   xsrc, ysrc, width, height );
             gdk_gc_set_subwindow( m_penGC, GDK_CLIP_BY_CHILDREN );
-                
+
             /* scale image */
             wxImage image( bitmap );
             image = image.Scale( ww, hh );
@@ -1381,15 +1381,15 @@ void wxWindowDC::SetPen( const wxPen &pen )
         width = (int)w;
     }
 
-    static const char dotted[] = {1, 1};
-    static const char short_dashed[] = {2, 2};
-    static const char wxCoord_dashed[] = {2, 4};
-    static const char dotted_dashed[] = {3, 3, 1, 3};
+    static const wxGTKDash dotted[] = {1, 1};
+    static const wxGTKDash short_dashed[] = {2, 2};
+    static const wxGTKDash wxCoord_dashed[] = {2, 4};
+    static const wxGTKDash dotted_dashed[] = {3, 3, 1, 3};
 
     // We express dash pattern in pen width unit, so we are
     // independent of zoom factor and so on...
     int req_nb_dash;
-    const char *req_dash;
+    const wxGTKDash *req_dash;
 
     GdkLineStyle lineStyle = GDK_LINE_SOLID;
     switch (m_pen.GetStyle())
@@ -1398,7 +1398,7 @@ void wxWindowDC::SetPen( const wxPen &pen )
         {
             lineStyle = GDK_LINE_ON_OFF_DASH;
             req_nb_dash = m_pen.GetDashCount();
-            req_dash = m_pen.GetDash();
+            req_dash = (wxGTKDash*)m_pen.GetDash();
             break;
         }
         case wxDOT:
@@ -1438,28 +1438,27 @@ void wxWindowDC::SetPen( const wxPen &pen )
         default:
         {
             lineStyle = GDK_LINE_SOLID;
-            req_dash = (wxDash*)NULL;
+            req_dash = (wxGTKDash*)NULL;
             req_nb_dash = 0;
             break;
         }
     }
 
-#if (GTK_MINOR_VERSION > 0)
+#if (GTK_MINOR_VERSION > 0) || (GTK_MAJOR_VERSION > 1)
     if (req_dash && req_nb_dash)
     {
-        char *real_req_dash = new char[req_nb_dash];
+        wxGTKDash *real_req_dash = new wxGTKDash[req_nb_dash];
         if (real_req_dash)
         {
             for (int i = 0; i < req_nb_dash; i++)
                 real_req_dash[i] = req_dash[i] * width;
-            gdk_gc_set_dashes( m_penGC, 0, (gint8*) real_req_dash,
-                             req_nb_dash );
+            gdk_gc_set_dashes( m_penGC, 0, real_req_dash, req_nb_dash );
             delete[] real_req_dash;
         }
         else
         {
             // No Memory. We use non-scaled dash pattern...
-            gdk_gc_set_dashes( m_penGC, 0, (gint8*)req_dash, req_nb_dash );
+            gdk_gc_set_dashes( m_penGC, 0, (wxGTKDash*)req_dash, req_nb_dash );
         }
     }
 #endif
@@ -1706,13 +1705,13 @@ void wxWindowDC::DoSetClippingRegion( wxCoord x, wxCoord y, wxCoord width, wxCoo
     rect.y = YLOG2DEV(y);
     rect.width = XLOG2DEVREL(width);
     rect.height = YLOG2DEVREL(height);
-    
+
     if (!m_currentClippingRegion.IsNull())
         m_currentClippingRegion.Intersect( rect );
     else
         m_currentClippingRegion.Union( rect );
-        
-#if USE_PAINT_REGION    
+
+#if USE_PAINT_REGION
     if (!m_paintClippingRegion.IsNull())
         m_currentClippingRegion.Intersect( m_paintClippingRegion );
 #endif
@@ -1738,13 +1737,13 @@ void wxWindowDC::DoSetClippingRegionAsRegion( const wxRegion &region  )
     }
 
     if (!m_window) return;
-    
+
     if (!m_currentClippingRegion.IsNull())
         m_currentClippingRegion.Intersect( region );
     else
         m_currentClippingRegion.Union( region );
-    
-#if USE_PAINT_REGION    
+
+#if USE_PAINT_REGION
     if (!m_paintClippingRegion.IsNull())
         m_currentClippingRegion.Intersect( m_paintClippingRegion );
 #endif
@@ -1766,8 +1765,8 @@ void wxWindowDC::DestroyClippingRegion()
     wxDC::DestroyClippingRegion();
 
     m_currentClippingRegion.Clear();
-    
-#if USE_PAINT_REGION    
+
+#if USE_PAINT_REGION
     if (!m_paintClippingRegion.IsEmpty())
         m_currentClippingRegion.Union( m_paintClippingRegion );
 #endif
@@ -2019,14 +2018,21 @@ wxPaintDC::wxPaintDC()
 wxPaintDC::wxPaintDC( wxWindow *win )
   : wxWindowDC( win )
 {
-#if USE_PAINT_REGION    
-    m_paintClippingRegion = win->GetUpdateRegion();
-    m_currentClippingRegion.Union( m_paintClippingRegion );
+#if USE_PAINT_REGION
+    if (!win->m_clipPaintRegion)
+        return;
         
-    gdk_gc_set_clip_region( m_penGC, m_paintClippingRegion.GetRegion() );
-    gdk_gc_set_clip_region( m_brushGC, m_paintClippingRegion.GetRegion() );
-    gdk_gc_set_clip_region( m_textGC, m_paintClippingRegion.GetRegion() );
-    gdk_gc_set_clip_region( m_bgGC, m_paintClippingRegion.GetRegion() );
+    m_paintClippingRegion = win->GetUpdateRegion();
+    GdkRegion *region = m_paintClippingRegion.GetRegion();
+    if ( region )
+    {
+        m_currentClippingRegion.Union( m_paintClippingRegion );
+
+        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
 }