static gboolean gimp_palette_view_expose (GtkWidget *widget, GdkEventExpose *eevent) { GimpPaletteView *pal_view = GIMP_PALETTE_VIEW (widget); GimpView *view = GIMP_VIEW (widget); if (! gtk_widget_is_drawable (widget)) return FALSE; GTK_WIDGET_CLASS (parent_class)->expose_event (widget, eevent); if (view->renderer->viewable && pal_view->selected) { GimpViewRendererPalette *renderer; GtkStyle *style = gtk_widget_get_style (widget); GtkAllocation allocation; cairo_t *cr; gint row, col; renderer = GIMP_VIEW_RENDERER_PALETTE (view->renderer); gtk_widget_get_allocation (widget, &allocation); row = pal_view->selected->position / renderer->columns; col = pal_view->selected->position % renderer->columns; cr = gdk_cairo_create (gtk_widget_get_window (widget)); gdk_cairo_region (cr, eevent->region); cairo_clip (cr); cairo_translate (cr, allocation.x, allocation.y); cairo_rectangle (cr, col * renderer->cell_width + 0.5, row * renderer->cell_height + 0.5, renderer->cell_width, renderer->cell_height); cairo_set_line_width (cr, 1.0); gdk_cairo_set_source_color (cr, &style->fg[GTK_STATE_SELECTED]); cairo_stroke_preserve (cr); if (gimp_cairo_set_focus_line_pattern (cr, widget)) { gdk_cairo_set_source_color (cr, &style->fg[GTK_STATE_NORMAL]); cairo_stroke (cr); } cairo_destroy (cr); } return FALSE; }
static void gimp_cell_renderer_color_render (GtkCellRenderer *cell, GdkWindow *window, GtkWidget *widget, GdkRectangle *background_area, GdkRectangle *cell_area, GdkRectangle *expose_area, GtkCellRendererState flags) { GimpCellRendererColor *color = GIMP_CELL_RENDERER_COLOR (cell); GdkRectangle rect; gimp_cell_renderer_color_get_size (cell, widget, cell_area, &rect.x, &rect.y, &rect.width, &rect.height); rect.x += cell_area->x + cell->xpad; rect.y += cell_area->y + cell->ypad; rect.width -= 2 * cell->xpad; rect.height -= 2 * cell->ypad; if (rect.width > 2 && rect.height > 2) { cairo_t *cr = gdk_cairo_create (window); GtkStyle *style = gtk_widget_get_style (widget); GtkStateType state; cairo_rectangle (cr, rect.x + 1, rect.y + 1, rect.width - 2, rect.height - 2); gimp_cairo_set_source_rgb (cr, &color->color); cairo_fill (cr); if (! color->opaque && color->color.a < 1.0) { cairo_pattern_t *pattern; cairo_move_to (cr, rect.x + 1, rect.y + rect.height - 1); cairo_line_to (cr, rect.x + rect.width - 1, rect.y + rect.height - 1); cairo_line_to (cr, rect.x + rect.width - 1, rect.y + 1); cairo_close_path (cr); pattern = gimp_cairo_checkerboard_create (cr, GIMP_CHECK_SIZE_SM, NULL, NULL); cairo_set_source (cr, pattern); cairo_pattern_destroy (pattern); cairo_fill_preserve (cr); gimp_cairo_set_source_rgba (cr, &color->color); cairo_fill (cr); } /* draw border */ cairo_rectangle (cr, rect.x + 0.5, rect.y + 0.5, rect.width - 1, rect.height - 1); if (! cell->sensitive || GTK_WIDGET_STATE (widget) == GTK_STATE_INSENSITIVE) { state = GTK_STATE_INSENSITIVE; } else { state = (flags & GTK_CELL_RENDERER_SELECTED ? GTK_STATE_SELECTED : GTK_STATE_NORMAL); } cairo_set_line_width (cr, 1); gdk_cairo_set_source_color (cr, &style->fg[state]); cairo_stroke_preserve (cr); if (state == GTK_STATE_SELECTED && gimp_cairo_set_focus_line_pattern (cr, widget)) { gdk_cairo_set_source_color (cr, &style->fg[GTK_STATE_NORMAL]); cairo_stroke (cr); } cairo_destroy (cr); } }