]> www.fi.muni.cz Git - evince.git/blobdiff - cut-n-paste/gimpcellrenderertoggle/gimpcellrenderertoggle.c
[gimpcellrenderertoggle] Paint a shadow when the mouse is over the cell renderer
[evince.git] / cut-n-paste / gimpcellrenderertoggle / gimpcellrenderertoggle.c
index e9a25f151dd6e176f411f8650347b5319e6c64f8..e6a505f17f10272c4f2eeb1c833275a1c0034b81 100644 (file)
@@ -60,11 +60,10 @@ static void gimp_cell_renderer_toggle_get_size     (GtkCellRenderer *cell,
                                                     gint            *width,
                                                     gint            *height);
 static void gimp_cell_renderer_toggle_render       (GtkCellRenderer *cell,
-                                                    GdkWindow       *window,
+                                                    cairo_t         *cr,
                                                     GtkWidget       *widget,
-                                                    GdkRectangle    *background_area,
-                                                    GdkRectangle    *cell_area,
-                                                    GdkRectangle    *expose_area,
+                                                    const GdkRectangle  *background_area,
+                                                    const GdkRectangle  *cell_area,
                                                     GtkCellRendererState flags);
 static gboolean gimp_cell_renderer_toggle_activate (GtkCellRenderer *cell,
                                                     GdkEvent        *event,
@@ -276,17 +275,17 @@ gimp_cell_renderer_toggle_get_size (GtkCellRenderer *cell,
 
 static void
 gimp_cell_renderer_toggle_render (GtkCellRenderer      *cell,
-                                  GdkWindow            *window,
+                                  cairo_t              *cr,
                                   GtkWidget            *widget,
-                                  GdkRectangle         *background_area,
-                                  GdkRectangle         *cell_area,
-                                  GdkRectangle         *expose_area,
+                                  const GdkRectangle   *background_area,
+                                  const GdkRectangle   *cell_area,
                                   GtkCellRendererState  flags)
 {
   GimpCellRendererToggle *toggle = GIMP_CELL_RENDERER_TOGGLE (cell);
   GtkStyle               *style  = gtk_widget_get_style (widget);
   GdkRectangle            toggle_rect;
   GdkRectangle            draw_rect;
+  GdkRectangle            clip_rect;
   GtkStateType            state;
   gboolean                active;
   gint                    xpad;
@@ -294,18 +293,20 @@ gimp_cell_renderer_toggle_render (GtkCellRenderer      *cell,
 
   if (! toggle->stock_id)
     {
-      GTK_CELL_RENDERER_CLASS (parent_class)->render (cell, window, widget,
+      GTK_CELL_RENDERER_CLASS (parent_class)->render (cell,
+                                                      cr,
+                                                      widget,
                                                       background_area,
-                                                      cell_area, expose_area,
+                                                      cell_area,
                                                       flags);
       return;
     }
 
-  gimp_cell_renderer_toggle_get_size (cell, widget, cell_area,
-                                      &toggle_rect.x,
-                                      &toggle_rect.y,
-                                      &toggle_rect.width,
-                                      &toggle_rect.height);
+  gtk_cell_renderer_get_size (cell, widget, cell_area,
+                              &toggle_rect.x,
+                              &toggle_rect.y,
+                              &toggle_rect.width,
+                              &toggle_rect.height);
 
   gtk_cell_renderer_get_padding (cell, &xpad, &ypad);
   toggle_rect.x      += cell_area->x + xpad;
@@ -338,16 +339,22 @@ gimp_cell_renderer_toggle_render (GtkCellRenderer      *cell,
         state = GTK_STATE_INSENSITIVE;
     }
 
-  if (gdk_rectangle_intersect (expose_area, cell_area, &draw_rect) &&
-      (flags & GTK_CELL_RENDERER_PRELIT))
-    gtk_paint_shadow (style,
-                      window,
-                      state,
-                      active ? GTK_SHADOW_IN : GTK_SHADOW_OUT,
-                      &draw_rect,
-                      widget, NULL,
-                      toggle_rect.x,     toggle_rect.y,
-                      toggle_rect.width, toggle_rect.height);
+  if ((flags & GTK_CELL_RENDERER_PRELIT) &&
+      gdk_cairo_get_clip_rectangle(cr, &clip_rect) &&
+      gdk_rectangle_intersect (&clip_rect, cell_area, &draw_rect))
+    {
+      cairo_save (cr);
+      gdk_cairo_rectangle (cr, &draw_rect);
+      cairo_clip (cr);
+      gtk_paint_shadow (style,
+                        cr,
+                        state,
+                        active ? GTK_SHADOW_IN : GTK_SHADOW_OUT,
+                        widget, NULL,
+                        toggle_rect.x,     toggle_rect.y,
+                        toggle_rect.width, toggle_rect.height);
+      cairo_restore (cr);
+    }
 
   if (active)
     {
@@ -388,17 +395,11 @@ gimp_cell_renderer_toggle_render (GtkCellRenderer      *cell,
 
       if (gdk_rectangle_intersect (&draw_rect, &toggle_rect, &draw_rect))
         {
-         cairo_t *cr;
-         
-         cr = gdk_cairo_create (window);
-
          gdk_cairo_set_source_pixbuf (cr, pixbuf, toggle_rect.x, toggle_rect.y);
          gdk_cairo_rectangle (cr, &draw_rect);
          cairo_fill (cr);
-         
-         cairo_destroy (cr);
        }
-             
+
       if (insensitive)
         g_object_unref (insensitive);
     }