From ca8a835874a36a106be8695bb328675f8a652561 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Tue, 24 Aug 2010 17:04:18 +0200 Subject: [PATCH] API: Remove gtk_widget_get_snapshot() It will be replaced with gtk_widget_draw(). --- docs/reference/gtk/gtk3-sections.txt | 1 - gtk/gtk.symbols | 1 - gtk/gtkoffscreenwindow.c | 12 +- gtk/gtkwidget.c | 226 --------------------------- gtk/gtkwidget.h | 2 - 5 files changed, 4 insertions(+), 238 deletions(-) diff --git a/docs/reference/gtk/gtk3-sections.txt b/docs/reference/gtk/gtk3-sections.txt index 7028b7b182..c9e13f5d90 100644 --- a/docs/reference/gtk/gtk3-sections.txt +++ b/docs/reference/gtk/gtk3-sections.txt @@ -4899,7 +4899,6 @@ gtk_widget_set_tooltip_window gtk_widget_get_has_tooltip gtk_widget_set_has_tooltip gtk_widget_trigger_tooltip_query -gtk_widget_get_snapshot gtk_widget_get_window gtk_widget_get_allocation gtk_widget_set_allocation diff --git a/gtk/gtk.symbols b/gtk/gtk.symbols index ebe36be086..f11e3fd035 100644 --- a/gtk/gtk.symbols +++ b/gtk/gtk.symbols @@ -4245,7 +4245,6 @@ gtk_widget_get_screen gtk_widget_get_sensitive gtk_widget_get_settings gtk_widget_get_size_request -gtk_widget_get_snapshot gtk_widget_get_state gtk_widget_get_style gtk_widget_get_tooltip_markup diff --git a/gtk/gtkoffscreenwindow.c b/gtk/gtkoffscreenwindow.c index 84aab743bb..a2ea06c709 100644 --- a/gtk/gtkoffscreenwindow.c +++ b/gtk/gtkoffscreenwindow.c @@ -31,11 +31,9 @@ * * GtkOffscreenWindow is strictly intended to be used for obtaining * snapshots of widgets that are not part of a normal widget hierarchy. - * It differs from gtk_widget_get_snapshot() in that the widget you - * want to get a snapshot of need not be displayed on the user's screen - * as a part of a widget hierarchy. However, since GtkOffscreenWindow - * is a toplevel widget you cannot obtain snapshots of a full window - * with it since you cannot pack a toplevel widget in another toplevel. + * Since #GtkOffscreenWindow is a toplevel widget you cannot obtain + * snapshots of a full window with it since you cannot pack a toplevel + * widget in another toplevel. * * The idea is to take a widget and manually set the state of it, * add it to a GtkOffscreenWindow and then retrieve the snapshot @@ -259,9 +257,7 @@ gtk_offscreen_window_init (GtkOffscreenWindow *window) * gtk_offscreen_window_new: * * Creates a toplevel container widget that is used to retrieve - * snapshots of widgets without showing them on the screen. For - * widgets that are on the screen and part of a normal widget - * hierarchy, gtk_widget_get_snapshot() can be used instead. + * snapshots of widgets without showing them on the screen. * * Return value: A pointer to a #GtkWidget * diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index 1e870a5abb..883a2d057b 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -10143,232 +10143,6 @@ gtk_widget_reset_shapes (GtkWidget *widget) gtk_reset_shapes_recurse (widget, priv->window); } -static void -expose_window (GdkWindow *window) -{ - GdkEvent event; - GList *l, *children; - gpointer user_data; - gboolean is_double_buffered; - - gdk_window_get_user_data (window, &user_data); - - if (user_data) - is_double_buffered = gtk_widget_get_double_buffered (GTK_WIDGET (user_data)); - else - is_double_buffered = FALSE; - - event.expose.type = GDK_EXPOSE; - event.expose.window = g_object_ref (window); - event.expose.send_event = FALSE; - event.expose.count = 0; - event.expose.area.x = 0; - event.expose.area.y = 0; - gdk_drawable_get_size (GDK_DRAWABLE (window), - &event.expose.area.width, - &event.expose.area.height); - event.expose.region = cairo_region_create_rectangle (&event.expose.area); - - /* If this is not double buffered, force a double buffer so that - redirection works. */ - if (!is_double_buffered) - gdk_window_begin_paint_region (window, event.expose.region); - - gtk_main_do_event (&event); - - if (!is_double_buffered) - gdk_window_end_paint (window); - - children = gdk_window_peek_children (window); - for (l = children; l != NULL; l = l->next) - { - GdkWindow *child = l->data; - - /* Don't expose input-only windows */ - if (gdk_drawable_get_depth (GDK_DRAWABLE (child)) != 0) - expose_window (l->data); - } - - g_object_unref (window); -} - -/** - * gtk_widget_get_snapshot: - * @widget: a #GtkWidget - * @clip_rect: (allow-none): a #GdkRectangle or %NULL - * - * Create a #GdkPixmap of the contents of the widget and its children. - * - * Works even if the widget is obscured. The depth and visual of the - * resulting pixmap is dependent on the widget being snapshot and likely - * differs from those of a target widget displaying the pixmap. - * The function gdk_pixbuf_get_from_drawable() can be used to convert - * the pixmap to a visual independant representation. - * - * The snapshot area used by this function is the @widget's allocation plus - * any extra space occupied by additional windows belonging to this widget - * (such as the arrows of a spin button). - * Thus, the resulting snapshot pixmap is possibly larger than the allocation. - * - * If @clip_rect is non-%NULL, the resulting pixmap is shrunken to - * match the specified clip_rect. The (x,y) coordinates of @clip_rect are - * interpreted widget relative. If width or height of @clip_rect are 0 or - * negative, the width or height of the resulting pixmap will be shrunken - * by the respective amount. - * For instance a @clip_rect { +5, +5, -10, -10 } will - * chop off 5 pixels at each side of the snapshot pixmap. - * If non-%NULL, @clip_rect will contain the exact widget-relative snapshot - * coordinates upon return. A @clip_rect of { -1, -1, 0, 0 } - * can be used to preserve the auto-grown snapshot area and use @clip_rect - * as a pure output parameter. - * - * The returned pixmap can be %NULL, if the resulting @clip_area was empty. - * - * Return value: #GdkPixmap snapshot of the widget - * - * Since: 2.14 - **/ -GdkPixmap* -gtk_widget_get_snapshot (GtkWidget *widget, - GdkRectangle *clip_rect) -{ - GtkWidgetPrivate *priv; - int x, y, width, height; - GdkWindow *parent_window = NULL; - GdkPixmap *pixmap; - GList *windows = NULL, *list; - - priv = widget->priv; - - g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL); - if (!gtk_widget_get_visible (widget)) - return NULL; - - /* the widget (and parent_window) must be realized to be drawable */ - if (priv->parent && !gtk_widget_get_realized (priv->parent)) - gtk_widget_realize (priv->parent); - if (!gtk_widget_get_realized (widget)) - gtk_widget_realize (widget); - - /* determine snapshot rectangle */ - x = priv->allocation.x; - y = priv->allocation.y; - width = priv->allocation.width; - height = priv->allocation.height; - - if (priv->parent && gtk_widget_get_has_window (widget)) - { - /* grow snapshot rectangle to cover all widget windows */ - parent_window = gtk_widget_get_parent_window (widget); - for (list = gdk_window_peek_children (parent_window); list; list = list->next) - { - GdkWindow *subwin = list->data; - gpointer windata; - int wx, wy, ww, wh; - gdk_window_get_user_data (subwin, &windata); - if (windata != widget) - continue; - windows = g_list_prepend (windows, subwin); - gdk_window_get_position (subwin, &wx, &wy); - gdk_drawable_get_size (subwin, &ww, &wh); - /* grow snapshot rectangle by extra widget sub window */ - if (wx < x) - { - width += x - wx; - x = wx; - } - if (wy < y) - { - height += y - wy; - y = wy; - } - if (x + width < wx + ww) - width += wx + ww - (x + width); - if (y + height < wy + wh) - height += wy + wh - (y + height); - } - } - else if (!priv->parent) - x = y = 0; /* toplevel */ - - /* at this point, (x,y,width,height) is the parent_window relative - * snapshot area covering all of widget's windows. - */ - - /* shrink snapshot size by clip_rectangle */ - if (clip_rect) - { - GdkRectangle snap = { x, y, width, height }, clip = *clip_rect; - clip.x = clip.x < 0 ? x : clip.x; - clip.y = clip.y < 0 ? y : clip.y; - clip.width = clip.width <= 0 ? MAX (0, width + clip.width) : clip.width; - clip.height = clip.height <= 0 ? MAX (0, height + clip.height) : clip.height; - if (priv->parent) - { - /* offset clip_rect, so it's parent_window relative */ - if (clip_rect->x >= 0) - clip.x += priv->allocation.x; - if (clip_rect->y >= 0) - clip.y += priv->allocation.y; - } - if (!gdk_rectangle_intersect (&snap, &clip, &snap)) - { - g_list_free (windows); - clip_rect->width = clip_rect->height = 0; - return NULL; /* empty snapshot area */ - } - x = snap.x; - y = snap.y; - width = snap.width; - height = snap.height; - } - - /* render snapshot */ - pixmap = gdk_pixmap_new (priv->window, width, height, gdk_drawable_get_depth (priv->window)); - for (list = windows; list; list = list->next) /* !NO_WINDOW widgets */ - { - GdkWindow *subwin = list->data; - int wx, wy; - if (gdk_drawable_get_depth (GDK_DRAWABLE (subwin)) == 0) - continue; /* Input only window */ - gdk_window_get_position (subwin, &wx, &wy); - gdk_window_redirect_to_drawable (subwin, pixmap, MAX (0, x - wx), MAX (0, y - wy), - MAX (0, wx - x), MAX (0, wy - y), width, height); - - expose_window (subwin); - } - if (!windows) /* NO_WINDOW || toplevel => parent_window == NULL || parent_window == priv->window */ - { - gdk_window_redirect_to_drawable (priv->window, pixmap, x, y, 0, 0, width, height); - expose_window (priv->window); - } - for (list = windows; list; list = list->next) - gdk_window_remove_redirection (list->data); - if (!windows) /* NO_WINDOW || toplevel */ - gdk_window_remove_redirection (priv->window); - g_list_free (windows); - - /* return pixmap and snapshot rectangle coordinates */ - if (clip_rect) - { - clip_rect->x = x; - clip_rect->y = y; - clip_rect->width = width; - clip_rect->height = height; - if (priv->parent) - { - /* offset clip_rect from parent_window so it's widget relative */ - clip_rect->x -= priv->allocation.x; - clip_rect->y -= priv->allocation.y; - } - if (0) - g_printerr ("gtk_widget_get_snapshot: %s (%d,%d, %dx%d)\n", - G_OBJECT_TYPE_NAME (widget), - clip_rect->x, clip_rect->y, clip_rect->width, clip_rect->height); - } - return pixmap; -} - /* style properties */ diff --git a/gtk/gtkwidget.h b/gtk/gtkwidget.h index 22fdf38ca3..21f9455b81 100644 --- a/gtk/gtkwidget.h +++ b/gtk/gtkwidget.h @@ -741,8 +741,6 @@ GdkWindow * gtk_widget_get_root_window (GtkWidget *widget); GtkSettings* gtk_widget_get_settings (GtkWidget *widget); GtkClipboard *gtk_widget_get_clipboard (GtkWidget *widget, GdkAtom selection); -GdkPixmap * gtk_widget_get_snapshot (GtkWidget *widget, - GdkRectangle *clip_rect); /* Multidevice support */ gboolean gtk_widget_get_support_multidevice (GtkWidget *widget);