static gboolean dragIconWindowDrawEventCallback(GtkWidget*, cairo_t* context, DragIcon* icon) { if (!gdk_cairo_get_clip_rectangle(context, 0)) return FALSE; icon->draw(context); return TRUE; }
static gboolean photos_image_view_draw (GtkWidget *widget, cairo_t *cr) { PhotosImageView *self = PHOTOS_IMAGE_VIEW (widget); GdkRectangle rect; if (self->node == NULL) goto out; if (!gdk_cairo_get_clip_rectangle (cr, &rect)) goto out; cairo_save (cr); g_signal_emit (self, signals[DRAW_BACKGROUND], 0, cr, &rect); cairo_restore(cr); cairo_save (cr); photos_image_view_draw_node (self, cr, &rect); cairo_restore (cr); cairo_save (cr); g_signal_emit (self, signals[DRAW_OVERLAY], 0, cr, &rect); cairo_restore(cr); out: return GDK_EVENT_PROPAGATE; }
static void get_surface_size (GtkIconHelper *self, cairo_surface_t *surface, int *width, int *height) { GdkRectangle clip; cairo_t *cr; cr = cairo_create (surface); if (gdk_cairo_get_clip_rectangle (cr, &clip)) { if (clip.x != 0 || clip.y != 0) { g_warning ("origin of surface is %d %d, not supported", clip.x, clip.y); } *width = clip.width; *height = clip.height; } else { g_warning ("infinite surface size not supported"); ensure_icon_size (self, width, height); } cairo_destroy (cr); }
static gboolean deepin_workspace_overview_draw (GtkWidget *widget, cairo_t *cr) { DeepinWorkspaceOverview *fixed = DEEPIN_WORKSPACE_OVERVIEW (widget); DeepinWorkspaceOverviewPrivate *priv = fixed->priv; GdkRectangle r; gdk_cairo_get_clip_rectangle(cr, &r); GtkAllocation req; gtk_widget_get_allocation(widget, &req); GtkStyleContext* context = gtk_widget_get_style_context(widget); cairo_save(cr); gtk_render_background(context, cr, 0, 0, req.width, req.height); for (int i = 0; i < priv->monitors->len; i++) { MonitorData* md = (MonitorData*)g_ptr_array_index(priv->monitors, i); cairo_set_source_surface(cr, md->desktop_surface, md->mon_rect.x, md->mon_rect.y); cairo_paint(cr); } cairo_restore(cr); GTK_WIDGET_CLASS(deepin_workspace_overview_parent_class)->draw(widget, cr); return TRUE; }
static gboolean gtkCanvasExposeEvent(GtkWidget *widget, GdkEventExpose *evt, Ihandle *ih) #endif { IFnff cb = (IFnff)IupGetCallback(ih,"ACTION"); if (cb && !(ih->data->inside_resize)) { if (!iupAttribGet(ih, "_IUPGTK_NO_BGCOLOR")) gtkCanvasSetBgColorAttrib(ih, iupAttribGetStr(ih, "BGCOLOR")); /* reset to update window attributes */ #if GTK_CHECK_VERSION(3, 0, 0) { GdkRectangle rect; gdk_cairo_get_clip_rectangle(cr, &rect); iupAttribSetStrf(ih, "CLIPRECT", "%d %d %d %d", rect.x, rect.y, rect.x+rect.width-1, rect.y+rect.height-1); iupAttribSetStr(ih, "CAIRO_CR", (char*)cr); } #else iupAttribSetStrf(ih, "CLIPRECT", "%d %d %d %d", evt->area.x, evt->area.y, evt->area.x+evt->area.width-1, evt->area.y+evt->area.height-1); #endif cb(ih,ih->data->posx,ih->data->posy); iupAttribSetStr(ih, "CLIPRECT", NULL); iupAttribSetStr(ih, "CAIRO_CR", NULL); } (void)widget; return FALSE; }
na_tray_child_expose_event (GtkWidget *widget, GdkEventExpose *event) #endif { NaTrayChild *child = NA_TRAY_CHILD (widget); GdkWindow *window = gtk_widget_get_window (widget); if (na_tray_child_has_alpha (child)) { /* Clear to transparent */ #if !GTK_CHECK_VERSION (3, 0, 0) cairo_t *cr = gdk_cairo_create (window); #endif cairo_set_source_rgba (cr, 0, 0, 0, 0); cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); #if GTK_CHECK_VERSION (3, 0, 0) cairo_paint (cr); #else gdk_cairo_region (cr, event->region); cairo_fill (cr); cairo_destroy (cr); #endif } else if (child->parent_relative_bg) { /* Clear to parent-relative pixmap */ #if GTK_CHECK_VERSION (3, 0, 0) GdkWindow *window; cairo_surface_t *target; GdkRectangle clip_rect; window = gtk_widget_get_window (widget); target = cairo_get_group_target (cr); gdk_cairo_get_clip_rectangle (cr, &clip_rect); /* Clear to parent-relative pixmap * We need to use direct X access here because GDK doesn't know about * the parent relative pixmap. */ cairo_surface_flush (target); XClearArea (GDK_WINDOW_XDISPLAY (window), GDK_WINDOW_XID (window), clip_rect.x, clip_rect.y, clip_rect.width, clip_rect.height, False); cairo_surface_mark_dirty_rectangle (target, clip_rect.x, clip_rect.y, clip_rect.width, clip_rect.height); #else gdk_window_clear_area (window, event->area.x, event->area.y, event->area.width, event->area.height); #endif } return FALSE; }
cairo_t * gsk_cairo_blur_start_drawing (cairo_t *cr, float radius, GskBlurFlags blur_flags) { cairo_rectangle_int_t clip_rect; cairo_surface_t *surface; cairo_t *blur_cr; gdouble clip_radius; gdouble x_scale, y_scale; gboolean blur_x = (blur_flags & GSK_BLUR_X) != 0; gboolean blur_y = (blur_flags & GSK_BLUR_Y) != 0; if (!needs_blur (radius)) return cr; gdk_cairo_get_clip_rectangle (cr, &clip_rect); clip_radius = gsk_cairo_blur_compute_pixels (radius); x_scale = y_scale = 1; cairo_surface_get_device_scale (cairo_get_target (cr), &x_scale, &y_scale); if (blur_flags & GSK_BLUR_REPEAT) { if (!blur_x) clip_rect.width = 1; if (!blur_y) clip_rect.height = 1; } /* Create a larger surface to center the blur. */ surface = cairo_surface_create_similar_image (cairo_get_target (cr), CAIRO_FORMAT_A8, x_scale * (clip_rect.width + (blur_x ? 2 * clip_radius : 0)), y_scale * (clip_rect.height + (blur_y ? 2 * clip_radius : 0))); cairo_surface_set_device_scale (surface, x_scale, y_scale); cairo_surface_set_device_offset (surface, x_scale * ((blur_x ? clip_radius : 0) - clip_rect.x), y_scale * ((blur_y ? clip_radius : 0) - clip_rect.y)); blur_cr = cairo_create (surface); cairo_set_user_data (blur_cr, &original_cr_key, cairo_reference (cr), (cairo_destroy_func_t) cairo_destroy); if (cairo_has_current_point (cr)) { double x, y; cairo_get_current_point (cr, &x, &y); cairo_move_to (blur_cr, x, y); } return blur_cr; }
app_resizer_paint_window (GtkWidget * widget, GdkEventExpose * event, AppShellData * app_data) #endif { /* printf("ENTER - app_resizer_paint_window\n"); printf("Area: %d, %d, %d, %d\n", event->area.x, event->area.y, event->area.width, event->area.height); printf("Allocation:%d, %d, %d, %d\n\n", widget->allocation.x, widget->allocation.y, widget->allocation.width, widget->allocation.height); */ #if GTK_CHECK_VERSION (3, 0, 0) GdkRectangle rect; gdk_cairo_get_clip_rectangle (cr, &rect); gdk_cairo_set_source_color (cr, gtk_widget_get_style (widget)->base); cairo_set_line_width(cr, 1); cairo_rectangle(cr, 0, 0, rect.width, rect.height); cairo_stroke_preserve(cr); cairo_fill(cr); #else gdk_draw_rectangle (GTK_LAYOUT (widget)->bin_window, widget->style->base_gc[GTK_STATE_NORMAL], TRUE, event->area.x, event->area.y, event->area.width, event->area.height); #endif if (app_data->selected_group) { GtkWidget *selected_widget = GTK_WIDGET (app_data->selected_group); #if GTK_CHECK_VERSION (3, 0, 0) GtkAllocation widget_allocation; GtkAllocation selected_widget_allocation; gtk_widget_get_allocation (widget, &widget_allocation); gtk_widget_get_allocation (selected_widget, &selected_widget_allocation); gdk_cairo_set_source_color (cr, gtk_widget_get_style (selected_widget)->light); cairo_set_line_width(cr, 1); cairo_rectangle(cr, selected_widget_allocation.x, selected_widget_allocation.y, widget_allocation.width, selected_widget_allocation.height); cairo_stroke_preserve(cr); cairo_fill(cr); #else gdk_draw_rectangle (selected_widget->window, /* drawing on child window and child coordinates */ selected_widget->style->light_gc[GTK_STATE_SELECTED], TRUE, selected_widget->allocation.x, selected_widget->allocation.y, widget->allocation.width, /* drawing with our coordinates here to draw all the way to the edge. */ selected_widget->allocation.height); #endif } return FALSE; }
gboolean get_surface_extents (cairo_surface_t *surface, GdkRectangle *out_extents) { cairo_t *cr; gboolean result; cr = cairo_create (surface); result = gdk_cairo_get_clip_rectangle (cr, out_extents); cairo_destroy (cr); return result; }
static gboolean draw(GtkWidget *widget, cairo_t *cr) { GeglGtkView *self = GEGL_GTK_VIEW(widget); ViewHelper *priv = GET_PRIVATE(self); GdkRectangle rect; if (!priv->node) return FALSE; gdk_cairo_get_clip_rectangle(cr, &rect); draw_implementation(self, cr, &rect); return FALSE; }
/* Returns %TRUE if @clip is set. @clip contains the area that should be drawn. */ static gboolean get_clip_rectangle (GtkSourceGutter *gutter, GtkSourceView *view, cairo_t *cr, GdkRectangle *clip) { GdkWindow *window = get_window (gutter); if (window == NULL || !gtk_cairo_should_draw_window (cr, window)) { return FALSE; } gtk_cairo_transform_to_window (cr, GTK_WIDGET (view), window); return gdk_cairo_get_clip_rectangle (cr, clip); }
static void get_surface_size (cairo_surface_t *surface, int *width, int *height) { GdkRectangle area; cairo_t *cr; cr = cairo_create (surface); if (!gdk_cairo_get_clip_rectangle (cr, &area)) { g_assert_not_reached (); } g_assert (area.x == 0 && area.y == 0); g_assert (area.width > 0 && area.height > 0); *width = area.width; *height = area.height; }
/* The plug window should completely occupy the area of the child, so we won't * get a draw event. But in case we do (the plug unmaps itself, say), this * draw handler draws with real or fake transparency. */ static gboolean na_tray_child_draw (GtkWidget *widget, cairo_t *cr) { NaTrayChild *child = NA_TRAY_CHILD (widget); if (na_tray_child_has_alpha (child)) { /* Clear to transparent */ cairo_set_source_rgba (cr, 0, 0, 0, 0); cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); cairo_paint (cr); } else if (child->parent_relative_bg) { GdkWindow *window; cairo_surface_t *target; GdkRectangle clip_rect; window = gtk_widget_get_window (widget); target = cairo_get_group_target (cr); gdk_cairo_get_clip_rectangle (cr, &clip_rect); /* Clear to parent-relative pixmap * We need to use direct X access here because GDK doesn't know about * the parent relative pixmap. */ cairo_surface_flush (target); XClearArea (GDK_WINDOW_XDISPLAY (window), GDK_WINDOW_XID (window), clip_rect.x, clip_rect.y, clip_rect.width, clip_rect.height, False); cairo_surface_mark_dirty_rectangle (target, clip_rect.x, clip_rect.y, clip_rect.width, clip_rect.height); } return FALSE; }
static gboolean color_swatch_draw_cb (GtkWidget *drawing_area, cairo_t *cr) { GtkStyleContext *style_context; GdkRGBA rgba; GdkRectangle rect; style_context = gtk_widget_get_style_context (drawing_area); if (!style_context) return FALSE; gtk_style_context_get_background_color (style_context, GTK_STATE_FLAG_NORMAL, &rgba); gdk_cairo_get_clip_rectangle (cr, &rect); gdk_cairo_set_source_rgba (cr, &rgba); gdk_cairo_rectangle (cr, &rect); cairo_fill (cr); return FALSE; }
void meta_draw_op_list_draw_with_style (const MetaDrawOpList *op_list, GtkStyleContext *context, cairo_t *cr, const MetaDrawInfo *info, MetaRectangleDouble rect) { int i; MetaPositionExprEnv env; fill_env (&env, info, rect); cairo_save (cr); for (i = 0; i < op_list->n_ops; i++) { MetaDrawOp *op = op_list->ops[i]; if (op->type == META_DRAW_CLIP) { cairo_restore (cr); cairo_rectangle (cr, meta_draw_spec_parse_x_position (op->data.clip.x, &env), meta_draw_spec_parse_y_position (op->data.clip.y, &env), meta_draw_spec_parse_size (op->data.clip.width, &env), meta_draw_spec_parse_size (op->data.clip.height, &env)); cairo_clip (cr); cairo_save (cr); } else if (gdk_cairo_get_clip_rectangle (cr, NULL)) { draw_op_draw_with_env (op, context, cr, info, &env); } } cairo_restore (cr); }
static gboolean layout_draw_handler (GtkWidget *widget, cairo_t *cr) { GtkLayout *layout = GTK_LAYOUT (widget); GdkWindow *bin_window = gtk_layout_get_bin_window (layout); GdkRectangle clip; gint i, j, x, y; gint imin, imax, jmin, jmax; if (!gtk_cairo_should_draw_window (cr, bin_window)) return FALSE; gdk_window_get_position (bin_window, &x, &y); cairo_translate (cr, x, y); gdk_cairo_get_clip_rectangle (cr, &clip); imin = (clip.x) / 10; imax = (clip.x + clip.width + 9) / 10; jmin = (clip.y) / 10; jmax = (clip.y + clip.height + 9) / 10; for (i = imin; i < imax; i++) for (j = jmin; j < jmax; j++) if ((i + j) % 2) cairo_rectangle (cr, 10 * i, 10 * j, 1 + i % 10, 1 + j % 10); cairo_fill (cr); return FALSE; }
static void gimp_display_shell_canvas_draw_image (GimpDisplayShell *shell, cairo_t *cr) { cairo_rectangle_list_t *clip_rectangles; cairo_rectangle_int_t image_rect; image_rect.x = - shell->offset_x; image_rect.y = - shell->offset_y; gimp_display_shell_scale_get_image_size (shell, &image_rect.width, &image_rect.height); /* first, clear the exposed part of the region that is outside the * image, which is the exposed region minus the image rectangle */ cairo_save (cr); if (shell->rotate_transform) cairo_transform (cr, shell->rotate_transform); cairo_rectangle (cr, image_rect.x, image_rect.y, image_rect.width, image_rect.height); cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); cairo_clip (cr); if (gdk_cairo_get_clip_rectangle (cr, NULL)) gimp_display_shell_draw_background (shell, cr); cairo_restore (cr); /* then, draw the exposed part of the region that is inside the * image */ cairo_save (cr); clip_rectangles = cairo_copy_clip_rectangle_list (cr); if (shell->rotate_transform) cairo_transform (cr, shell->rotate_transform); cairo_rectangle (cr, image_rect.x, image_rect.y, image_rect.width, image_rect.height); cairo_clip (cr); if (gdk_cairo_get_clip_rectangle (cr, NULL)) { gint i; cairo_save (cr); gimp_display_shell_draw_checkerboard (shell, cr); cairo_restore (cr); for (i = 0; i < clip_rectangles->num_rectangles; i++) { cairo_rectangle_t rect = clip_rectangles->rectangles[i]; gimp_display_shell_draw_image (shell, cr, floor (rect.x), floor (rect.y), ceil (rect.width), ceil (rect.height)); } } cairo_rectangle_list_destroy (clip_rectangles); cairo_restore (cr); /* finally, draw all the remaining image window stuff on top */ /* draw canvas items */ cairo_save (cr); if (shell->rotate_transform) cairo_transform (cr, shell->rotate_transform); gimp_canvas_item_draw (shell->canvas_item, cr); cairo_restore (cr); gimp_canvas_item_draw (shell->unrotated_item, cr); /* restart (and recalculate) the selection boundaries */ gimp_display_shell_selection_restart (shell); }
static gboolean on_view_draw (GtkSourceView *view, cairo_t *cr, GtkSourceGutter *gutter) { GdkWindow *window; GtkTextView *text_view; GArray *sizes; GdkRectangle clip; gint x, y; gint y1, y2; GArray *numbers; GArray *pixels; GArray *heights; GtkTextIter cur; gint cur_line; gint count; gint i; GList *item; GtkTextIter start; GtkTextIter end; GtkTextBuffer *buffer; GdkRectangle background_area; GdkRectangle cell_area; GtkTextIter selection_start; GtkTextIter selection_end; gboolean has_selection; gint idx; GtkStyleContext *style_context; GdkRGBA fg_color; window = gtk_source_gutter_get_window (gutter); if (window == NULL || !gtk_cairo_should_draw_window (cr, window)) { return FALSE; } gtk_cairo_transform_to_window (cr, GTK_WIDGET (view), window); text_view = GTK_TEXT_VIEW (view); if (!gdk_cairo_get_clip_rectangle (cr, &clip)) { return FALSE; } gutter->priv->is_drawing = TRUE; buffer = gtk_text_view_get_buffer (text_view); gdk_window_get_pointer (window, &x, &y, NULL); y1 = clip.y; y2 = y1 + clip.height; /* get the extents of the line printing */ gtk_text_view_window_to_buffer_coords (text_view, gutter->priv->window_type, 0, y1, NULL, &y1); gtk_text_view_window_to_buffer_coords (text_view, gutter->priv->window_type, 0, y2, NULL, &y2); numbers = g_array_new (FALSE, FALSE, sizeof (gint)); pixels = g_array_new (FALSE, FALSE, sizeof (gint)); heights = g_array_new (FALSE, FALSE, sizeof (gint)); sizes = g_array_new (FALSE, FALSE, sizeof (gint)); calculate_gutter_size (gutter, sizes); i = 0; x = 0; background_area.x = 0; background_area.height = get_lines (text_view, y1, y2, pixels, heights, numbers, &count, &start, &end); cell_area.x = gutter->priv->xpad; cell_area.height = background_area.height; gtk_text_view_buffer_to_window_coords (text_view, gutter->priv->window_type, 0, g_array_index (pixels, gint, 0), NULL, &background_area.y); cell_area.y = background_area.y; item = gutter->priv->renderers; idx = 0; style_context = gtk_widget_get_style_context (GTK_WIDGET (view)); gtk_style_context_get_color (style_context, gtk_widget_get_state (GTK_WIDGET (view)), &fg_color); gdk_cairo_set_source_rgba (cr, &fg_color); while (item) { Renderer *renderer = item->data; gint xpad; gint width; width = g_array_index (sizes, gint, idx++); if (gtk_source_gutter_renderer_get_visible (renderer->renderer)) { gtk_source_gutter_renderer_get_padding (renderer->renderer, &xpad, NULL); background_area.width = width; cell_area.width = width - 2 * xpad; cell_area.x = background_area.x + xpad; cairo_save (cr); gdk_cairo_rectangle (cr, &background_area); cairo_clip (cr); gtk_source_gutter_renderer_begin (renderer->renderer, cr, &background_area, &cell_area, &start, &end); cairo_restore (cr); background_area.x += background_area.width; } item = g_list_next (item); } gtk_text_buffer_get_iter_at_mark (buffer, &cur, gtk_text_buffer_get_insert (buffer)); cur_line = gtk_text_iter_get_line (&cur); gtk_text_buffer_get_selection_bounds (buffer, &selection_start, &selection_end); has_selection = !gtk_text_iter_equal (&selection_start, &selection_end); if (has_selection) { if (!gtk_text_iter_starts_line (&selection_start)) { gtk_text_iter_set_line_offset (&selection_start, 0); } if (!gtk_text_iter_ends_line (&selection_end)) { gtk_text_iter_forward_to_line_end (&selection_end); } } for (i = 0; i < count; ++i) { gint pos; gint line_to_paint; end = start; if (!gtk_text_iter_ends_line (&end)) { gtk_text_iter_forward_to_line_end (&end); } gtk_text_view_buffer_to_window_coords (text_view, gutter->priv->window_type, 0, g_array_index (pixels, gint, i), NULL, &pos); line_to_paint = g_array_index (numbers, gint, i); background_area.y = pos; background_area.height = g_array_index (heights, gint, i); background_area.x = 0; idx = 0; for (item = gutter->priv->renderers; item; item = g_list_next (item)) { Renderer *renderer; gint width; GtkSourceGutterRendererState state; gint xpad; gint ypad; renderer = item->data; width = g_array_index (sizes, gint, idx++); if (!gtk_source_gutter_renderer_get_visible (renderer->renderer)) { continue; } gtk_source_gutter_renderer_get_padding (renderer->renderer, &xpad, &ypad); background_area.width = width; cell_area.y = background_area.y + ypad; cell_area.height = background_area.height - 2 * ypad; cell_area.x = background_area.x + xpad; cell_area.width = background_area.width - 2 * xpad; state = GTK_SOURCE_GUTTER_RENDERER_STATE_NORMAL; if (line_to_paint == cur_line) { state |= GTK_SOURCE_GUTTER_RENDERER_STATE_CURSOR; } if (has_selection && gtk_text_iter_in_range (&start, &selection_start, &selection_end)) { state |= GTK_SOURCE_GUTTER_RENDERER_STATE_SELECTED; } if (renderer->prelit >= 0 && cell_area.y <= renderer->prelit && cell_area.y + cell_area.height >= renderer->prelit) { state |= GTK_SOURCE_GUTTER_RENDERER_STATE_PRELIT; } gtk_source_gutter_renderer_query_data (renderer->renderer, &start, &end, state); cairo_save (cr); gdk_cairo_rectangle (cr, &background_area); cairo_clip (cr); /* Call render with correct area */ gtk_source_gutter_renderer_draw (renderer->renderer, cr, &background_area, &cell_area, &start, &end, state); cairo_restore (cr); background_area.x += background_area.width; } gtk_text_iter_forward_line (&start); } for (item = gutter->priv->renderers; item; item = g_list_next (item)) { Renderer *renderer = item->data; if (gtk_source_gutter_renderer_get_visible (renderer->renderer)) { gtk_source_gutter_renderer_end (renderer->renderer); } } g_array_free (numbers, TRUE); g_array_free (pixels, TRUE); g_array_free (heights, TRUE); g_array_free (sizes, TRUE); gutter->priv->is_drawing = FALSE; return FALSE; }
inf_text_gtk_viewport_scrollbar_expose_event_cb(GtkWidget* scrollbar, GdkEventExpose* event, gpointer user_data) #endif { InfTextGtkViewport* viewport; InfTextGtkViewportPrivate* priv; InfTextGtkViewportUser* viewport_user; GdkRectangle* rectangle; GdkColor* color; double h,s,v; double r,g,b; GSList* item; double line_width; #if GTK_CHECK_VERSION(2, 91, 0) GdkRectangle clip_area; #else cairo_t* cr; #endif viewport = INF_TEXT_GTK_VIEWPORT(user_data); priv = INF_TEXT_GTK_VIEWPORT_PRIVATE(viewport); /* Can this happen? */ #if GTK_CHECK_VERSION(2, 91, 0) if(!gtk_cairo_should_draw_window(cr, gtk_widget_get_window(scrollbar))) #elif GTK_CHECK_VERSION(2,14,0) if(event->window != gtk_widget_get_window(scrollbar)) #else if(event->window != GTK_WIDGET(scrollbar)->window) #endif return FALSE; if(priv->show_user_markers) { color = >k_widget_get_style(scrollbar)->bg[GTK_STATE_NORMAL]; h = color->red / 65535.0; s = color->green / 65535.0; v = color->blue / 65535.0; rgb_to_hsv(&h, &s, &v); s = MIN(MAX(s, 0.5), 0.8); v = MAX(v, 0.5); #if GTK_CHECK_VERSION(2, 91, 0) gtk_cairo_transform_to_window( cr, GTK_WIDGET(scrollbar), gtk_widget_get_window(scrollbar) ); gdk_cairo_get_clip_rectangle(cr, &clip_area); #else cr = gdk_cairo_create(event->window); #endif line_width = cairo_get_line_width(cr); for(item = priv->users; item != NULL; item = item->next) { viewport_user = (InfTextGtkViewportUser*)item->data; rectangle = &viewport_user->rectangle; #if GTK_CHECK_VERSION(2, 91, 0) if(gdk_rectangle_intersect(&clip_area, rectangle, NULL)) #elif GTK_CHECK_VERSION(2,90,5) if(cairo_region_contains_rectangle(event->region, rectangle) != CAIRO_REGION_OVERLAP_OUT) #else if(gdk_region_rect_in(event->region, rectangle) != GDK_OVERLAP_RECTANGLE_OUT) #endif { h = inf_text_user_get_hue(viewport_user->user); cairo_rectangle( cr, rectangle->x + line_width/2, rectangle->y + line_width/2, rectangle->width - line_width, rectangle->height - line_width ); r = h; g = s; b = v/2.0; hsv_to_rgb(&r, &g, &b); cairo_set_source_rgba(cr, r, g, b, 0.6); cairo_stroke_preserve(cr); r = h; g = s; b = v; hsv_to_rgb(&r, &g, &b); cairo_set_source_rgba(cr, r, g, b, 0.6); cairo_fill(cr); } } #if ! GTK_CHECK_VERSION(2, 91, 0) cairo_destroy(cr); #endif } return FALSE; }
static void gimp_cell_renderer_toggle_render (GtkCellRenderer *cell, cairo_t *cr, GtkWidget *widget, const GdkRectangle *background_area, const GdkRectangle *cell_area, GtkCellRendererState flags) { GimpCellRendererToggle *toggle = GIMP_CELL_RENDERER_TOGGLE (cell); GdkRectangle toggle_rect; GdkRectangle draw_rect; GtkStyleContext *context = gtk_widget_get_style_context (widget); GdkRectangle clip_rect; GtkStateFlags state; gboolean active; gint xpad; gint ypad; if (! toggle->stock_id) { GTK_CELL_RENDERER_CLASS (parent_class)->render (cell, cr, widget, background_area, cell_area, flags); return; } 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; toggle_rect.y += cell_area->y + ypad; toggle_rect.width -= xpad * 2; toggle_rect.height -= ypad * 2; if (toggle_rect.width <= 0 || toggle_rect.height <= 0) return; active = gtk_cell_renderer_toggle_get_active (GTK_CELL_RENDERER_TOGGLE (cell)); if (!gtk_cell_renderer_get_sensitive (cell)) { state = GTK_STATE_FLAG_INSENSITIVE; } else if ((flags & GTK_CELL_RENDERER_SELECTED) == GTK_CELL_RENDERER_SELECTED) { if (gtk_widget_has_focus (widget)) state = GTK_STATE_FLAG_SELECTED; else state = GTK_STATE_FLAG_ACTIVE; } else { if (gtk_cell_renderer_toggle_get_activatable (GTK_CELL_RENDERER_TOGGLE (cell))) state = GTK_STATE_FLAG_NORMAL; else state = GTK_STATE_FLAG_INSENSITIVE; } 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_render_frame (context, //gtk_widget_get_style_context (widget), cr, toggle_rect.x, toggle_rect.y, toggle_rect.width, toggle_rect.height); gtk_style_context_restore (context); cairo_restore (cr); } if (active) { GdkPixbuf *insensitive = NULL; GdkPixbuf *pixbuf = toggle->pixbuf; GtkBorder border = { 1, 1, 1, 1 }; #if 0 /* FIXME: for some reason calling gtk_style_context_get_border * makes the icon only visible on hover, so use border = 1 * for now as a workaround */ gtk_style_context_get_border (context, state, &border); #endif toggle_rect.x += border.left; toggle_rect.y += border.top; toggle_rect.width -= (border.left + border.right); toggle_rect.height -= (border.top + border.bottom); if (state & GTK_STATE_FLAG_INSENSITIVE) { GtkIconSource *source; source = gtk_icon_source_new (); gtk_icon_source_set_pixbuf (source, pixbuf); /* The size here is arbitrary; since size isn't * wildcarded in the source, it isn't supposed to be * scaled by the engine function */ gtk_icon_source_set_size (source, GTK_ICON_SIZE_SMALL_TOOLBAR); gtk_icon_source_set_size_wildcarded (source, FALSE); gtk_style_context_save (context); gtk_style_context_set_state (context, GTK_STATE_FLAG_INSENSITIVE); insensitive = gtk_render_icon_pixbuf (context, source, (GtkIconSize)-1); gtk_style_context_restore (context); gtk_icon_source_free (source); pixbuf = insensitive; } if (gdk_rectangle_intersect (&draw_rect, &toggle_rect, &draw_rect)) { gdk_cairo_set_source_pixbuf (cr, pixbuf, toggle_rect.x, toggle_rect.y); gdk_cairo_rectangle (cr, &draw_rect); cairo_fill (cr); } if (insensitive) g_object_unref (insensitive); } }