static gboolean select_window_draw (GtkWidget *window, cairo_t *cr, gpointer unused) { GtkStyleContext *style; style = gtk_widget_get_style_context (window); if (gtk_widget_get_app_paintable (window)) { cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); cairo_set_source_rgba (cr, 0, 0, 0, 0); cairo_paint (cr); gtk_style_context_save (style); gtk_style_context_add_class (style, GTK_STYLE_CLASS_RUBBERBAND); gtk_render_background (style, cr, 0, 0, gtk_widget_get_allocated_width (window), gtk_widget_get_allocated_height (window)); gtk_render_frame (style, cr, 0, 0, gtk_widget_get_allocated_width (window), gtk_widget_get_allocated_height (window)); gtk_style_context_restore (style); } return TRUE; }
static gboolean panel_icon_grid_expose(GtkWidget *widget, GdkEventExpose *event) #endif { if (gtk_widget_is_drawable(widget)) { if (gtk_widget_get_has_window(widget) && !gtk_widget_get_app_paintable(widget)) #if GTK_CHECK_VERSION(3, 0, 0) gtk_render_background(gtk_widget_get_style_context(widget), cr, 0, 0, gtk_widget_get_allocated_width(widget), gtk_widget_get_allocated_height(widget)); #else gtk_paint_flat_box(gtk_widget_get_style(widget), gtk_widget_get_window(widget), gtk_widget_get_state(widget), GTK_SHADOW_NONE, &event->area, widget, "panelicongrid", 0, 0, -1, -1); #endif #if GTK_CHECK_VERSION(3, 0, 0) GTK_WIDGET_CLASS(panel_icon_grid_parent_class)->draw(widget, cr); #else GTK_WIDGET_CLASS(panel_icon_grid_parent_class)->expose_event(widget, event); #endif } return FALSE; }
static gboolean select_area_motion_notify (GtkWidget *window, GdkEventMotion *event, select_area_filter_data *data) { GdkRectangle draw_rect; if (!data->button_pressed) return TRUE; draw_rect.width = ABS (data->rect.x - event->x_root); draw_rect.height = ABS (data->rect.y - event->y_root); draw_rect.x = MIN (data->rect.x, event->x_root); draw_rect.y = MIN (data->rect.y, event->y_root); if (draw_rect.width <= 0 || draw_rect.height <= 0) { gtk_window_move (GTK_WINDOW (window), -100, -100); gtk_window_resize (GTK_WINDOW (window), 10, 10); return TRUE; } gtk_window_move (GTK_WINDOW (window), draw_rect.x, draw_rect.y); gtk_window_resize (GTK_WINDOW (window), draw_rect.width, draw_rect.height); /* We (ab)use app-paintable to indicate if we have an RGBA window */ if (!gtk_widget_get_app_paintable (window)) { GdkWindow *gdkwindow = gtk_widget_get_window (window); /* Shape the window to make only the outline visible */ if (draw_rect.width > 2 && draw_rect.height > 2) { cairo_region_t *region; cairo_rectangle_int_t region_rect = { 0, 0, draw_rect.width, draw_rect.height }; region = cairo_region_create_rectangle (®ion_rect); region_rect.x++; region_rect.y++; region_rect.width -= 2; region_rect.height -= 2; cairo_region_subtract_rectangle (region, ®ion_rect); gdk_window_shape_combine_region (gdkwindow, region, 0, 0); cairo_region_destroy (region); } else gdk_window_shape_combine_region (gdkwindow, NULL, 0, 0); } return TRUE; }
gboolean gimp_overlay_child_expose (GimpOverlayBox *box, GimpOverlayChild *child, GdkEventExpose *event) { GtkWidget *widget; g_return_val_if_fail (GIMP_IS_OVERLAY_BOX (box), FALSE); g_return_val_if_fail (child != NULL, FALSE); g_return_val_if_fail (event != NULL, FALSE); widget = GTK_WIDGET (box); if (event->window == gtk_widget_get_window (widget)) { GtkAllocation child_allocation; GdkRectangle bounds; gtk_widget_get_allocation (child->widget, &child_allocation); gimp_overlay_child_transform_bounds (child, &child_allocation, &bounds); if (gtk_widget_get_visible (child->widget) && gdk_rectangle_intersect (&event->area, &bounds, NULL)) { GdkPixmap *pixmap = gdk_offscreen_window_get_pixmap (child->window); cairo_t *cr = gdk_cairo_create (gtk_widget_get_window (widget)); gdk_cairo_region (cr, event->region); cairo_clip (cr); cairo_transform (cr, &child->matrix); gdk_cairo_set_source_pixmap (cr, pixmap, 0, 0); cairo_paint_with_alpha (cr, child->opacity); cairo_destroy (cr); } } else if (event->window == child->window) { if (! gtk_widget_get_app_paintable (child->widget)) gtk_paint_flat_box (gtk_widget_get_style (child->widget), event->window, GTK_STATE_NORMAL, GTK_SHADOW_NONE, &event->area, widget, NULL, 0, 0, -1, -1); gtk_container_propagate_expose (GTK_CONTAINER (widget), child->widget, event); return TRUE; } return FALSE; }
static void make_transparent (GtkWidget *widget, gpointer user_data) { #if GTK_CHECK_VERSION(2,19,3) if (GTK_WIDGET_NO_WINDOW (widget) || gtk_widget_get_app_paintable (widget)) #else if (GTK_WIDGET_NO_WINDOW (widget) || GTK_WIDGET_APP_PAINTABLE (widget)) #endif return; gtk_widget_set_app_paintable (widget, TRUE); gtk_widget_set_double_buffered (widget, FALSE); #if !GTK_CHECK_VERSION(2,91,0) gdk_window_set_back_pixmap (gtk_widget_get_window(widget), NULL, TRUE); g_signal_connect (widget, "expose_event", G_CALLBACK (transparent_expose_event), NULL); g_signal_connect_after (widget, "style_set", G_CALLBACK (make_transparent_again), NULL); #endif }