diff options
author | Havoc Pennington <hp@redhat.com> | 2001-01-09 17:45:34 +0000 |
---|---|---|
committer | Havoc Pennington <hp@src.gnome.org> | 2001-01-09 17:45:34 +0000 |
commit | 637c61da761f10836994c47c70a80735889506d7 (patch) | |
tree | dd579c88a10faa6387f8274c285f6c4bf1bbb54e /gtk/gtkcellrendererpixbuf.c | |
parent | 0056107b5d34fe44572587238173eeb182a6d513 (diff) | |
download | gtk+-637c61da761f10836994c47c70a80735889506d7.tar.gz |
handle case where there are no rows in the model
2001-01-09 Havoc Pennington <hp@redhat.com>
* gtk/gtktreeview.c (gtk_tree_view_check_dirty): handle case where
there are no rows in the model
* gtk/gtkliststore.c (gtk_list_store_iter_children): if parent is
NULL, then return the start of the list
* gtk/gtktreeview.c (gtk_tree_view_setup_model): don't build tree
if we can't get any rows from an empty model
* gtk/gtktreeviewcolumn.h (struct _GtkTreeViewColumn): remove
extraneous * after function pointer typedef usage
* Makefile.am: don't specify full path to cp and rm
* gtk/gtkcellrenderertextpixbuf.c
(gtk_cell_renderer_text_pixbuf_get_size): check width/height !=
NULL before dereferencing, fixes a segfault that happened from
time to time
* gtk/gtkcellrendererpixbuf.c (gtk_cell_renderer_pixbuf_render):
use gdk_pixbuf_render_to_drawable_alpha() to get alpha channel,
and reindent the function
(gtk_cell_renderer_pixbuf_get_size): indentation
* gtk/gtkdialog.c (gtk_dialog_run): destroy main loop only after
we quit it
(gtk_dialog_add_buttons_valist): add g_return_if_fail
(gtk_dialog_set_default_response): New function, to set default
button
(gtk_dialog_set_response_sensitive): New function, to set
sensitivity of buttons
* gtk/gtkcellrendererpixbuf.c
(gtk_cell_renderer_pixbuf_get_property): allow getting a NULL pixbuf
(gtk_cell_renderer_pixbuf_set_property): allow setting a NULL pixbuf
* gtk/gtktreedatalist.c (_gtk_tree_data_list_node_to_value):
handle any G_TYPE_OBJECT subclass, not just the base class, and
also boxed types.
(_gtk_tree_data_list_value_to_node): ditto
* gtk/gtkrbtree.c: Run _gtk_rbtree_test at strategic points if
--gtk-debug=tree
* gtk/gtkmain.c: add GTK_DEBUG_TREE
* gtk/gtkdebug.h: add GTK_DEBUG_TREE
Diffstat (limited to 'gtk/gtkcellrendererpixbuf.c')
-rw-r--r-- | gtk/gtkcellrendererpixbuf.c | 119 |
1 files changed, 56 insertions, 63 deletions
diff --git a/gtk/gtkcellrendererpixbuf.c b/gtk/gtkcellrendererpixbuf.c index fa21e59e8c..61a5572370 100644 --- a/gtk/gtkcellrendererpixbuf.c +++ b/gtk/gtkcellrendererpixbuf.c @@ -117,7 +117,8 @@ gtk_cell_renderer_pixbuf_get_property (GObject *object, switch (param_id) { case PROP_PIXBUF: - g_value_set_object (value, G_OBJECT (cellpixbuf->pixbuf)); + g_value_set_object (value, + cellpixbuf->pixbuf ? G_OBJECT (cellpixbuf->pixbuf) : NULL); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); @@ -139,8 +140,9 @@ gtk_cell_renderer_pixbuf_set_property (GObject *object, switch (param_id) { case PROP_PIXBUF: - pixbuf = GDK_PIXBUF (g_value_get_object (value)); - g_object_ref (G_OBJECT (pixbuf)); + pixbuf = (GdkPixbuf*) g_value_get_object (value); + if (pixbuf) + g_object_ref (G_OBJECT (pixbuf)); if (cellpixbuf->pixbuf) g_object_unref (G_OBJECT (cellpixbuf->pixbuf)); cellpixbuf->pixbuf = pixbuf; @@ -154,7 +156,7 @@ gtk_cell_renderer_pixbuf_set_property (GObject *object, GtkCellRenderer * gtk_cell_renderer_pixbuf_new (void) { - return GTK_CELL_RENDERER (gtk_type_new (gtk_cell_renderer_pixbuf_get_type ())); + return GTK_CELL_RENDERER (gtk_type_new (gtk_cell_renderer_pixbuf_get_type ())); } static void @@ -163,15 +165,15 @@ gtk_cell_renderer_pixbuf_get_size (GtkCellRenderer *cell, gint *width, gint *height) { - GtkCellRendererPixbuf *cellpixbuf = (GtkCellRendererPixbuf *) cell; - - if (width) - *width = (gint) GTK_CELL_RENDERER (cellpixbuf)->xpad * 2 + - (cellpixbuf->pixbuf ? gdk_pixbuf_get_width (cellpixbuf->pixbuf) : 0); - - if (height) - *height = (gint) GTK_CELL_RENDERER (cellpixbuf)->ypad * 2 + - (cellpixbuf->pixbuf ? gdk_pixbuf_get_height (cellpixbuf->pixbuf) : 0); + GtkCellRendererPixbuf *cellpixbuf = (GtkCellRendererPixbuf *) cell; + + if (width) + *width = (gint) GTK_CELL_RENDERER (cellpixbuf)->xpad * 2 + + (cellpixbuf->pixbuf ? gdk_pixbuf_get_width (cellpixbuf->pixbuf) : 0); + + if (height) + *height = (gint) GTK_CELL_RENDERER (cellpixbuf)->ypad * 2 + + (cellpixbuf->pixbuf ? gdk_pixbuf_get_height (cellpixbuf->pixbuf) : 0); } static void @@ -184,54 +186,45 @@ gtk_cell_renderer_pixbuf_render (GtkCellRenderer *cell, guint flags) { - GtkCellRendererPixbuf *cellpixbuf = (GtkCellRendererPixbuf *) cell; - GdkPixbuf *pixbuf; - guchar *pixels; - gint rowstride; - gint real_xoffset; - gint real_yoffset; - GdkGC *bg_gc = NULL; - - pixbuf = cellpixbuf->pixbuf; - - if (!pixbuf) - return; - - if ((flags & GTK_CELL_RENDERER_SELECTED) == GTK_CELL_RENDERER_SELECTED) - bg_gc = widget->style->bg_gc [GTK_STATE_SELECTED]; - else - bg_gc = widget->style->base_gc [GTK_STATE_NORMAL]; - - gdk_gc_set_clip_rectangle (bg_gc, cell_area); - - rowstride = gdk_pixbuf_get_rowstride (pixbuf); - pixels = gdk_pixbuf_get_pixels (pixbuf); - - real_xoffset = GTK_CELL_RENDERER (cellpixbuf)->xalign * (cell_area->width - gdk_pixbuf_get_width (pixbuf) - (2 * GTK_CELL_RENDERER (cellpixbuf)->xpad)); - real_xoffset = MAX (real_xoffset, 0) + GTK_CELL_RENDERER (cellpixbuf)->xpad; - real_yoffset = GTK_CELL_RENDERER (cellpixbuf)->yalign * (cell_area->height - gdk_pixbuf_get_height (pixbuf) - (2 * GTK_CELL_RENDERER (cellpixbuf)->ypad)); - real_yoffset = MAX (real_yoffset, 0) + GTK_CELL_RENDERER (cellpixbuf)->ypad; - - if (gdk_pixbuf_get_has_alpha (pixbuf)) - gdk_draw_rgb_32_image (window, - bg_gc, - cell_area->x + real_xoffset, - cell_area->y + real_yoffset, - gdk_pixbuf_get_width (pixbuf), - gdk_pixbuf_get_height (pixbuf), - GDK_RGB_DITHER_NORMAL, - pixels, - rowstride); - else - gdk_draw_rgb_image (window, - bg_gc, - cell_area->x + real_xoffset, - cell_area->y + real_yoffset, - gdk_pixbuf_get_width (pixbuf), - gdk_pixbuf_get_height (pixbuf), - GDK_RGB_DITHER_NORMAL, - pixels, - rowstride); - - gdk_gc_set_clip_rectangle (bg_gc, NULL); + GtkCellRendererPixbuf *cellpixbuf = (GtkCellRendererPixbuf *) cell; + GdkPixbuf *pixbuf; + guchar *pixels; + gint rowstride; + gint real_xoffset; + gint real_yoffset; + GdkRectangle pix_rect; + GdkRectangle draw_rect; + + pixbuf = cellpixbuf->pixbuf; + + if (!pixbuf) + return; + + rowstride = gdk_pixbuf_get_rowstride (pixbuf); + pixels = gdk_pixbuf_get_pixels (pixbuf); + + real_xoffset = GTK_CELL_RENDERER (cellpixbuf)->xalign * (cell_area->width - gdk_pixbuf_get_width (pixbuf) - (2 * GTK_CELL_RENDERER (cellpixbuf)->xpad)); + real_xoffset = MAX (real_xoffset, 0) + GTK_CELL_RENDERER (cellpixbuf)->xpad; + real_yoffset = GTK_CELL_RENDERER (cellpixbuf)->yalign * (cell_area->height - gdk_pixbuf_get_height (pixbuf) - (2 * GTK_CELL_RENDERER (cellpixbuf)->ypad)); + real_yoffset = MAX (real_yoffset, 0) + GTK_CELL_RENDERER (cellpixbuf)->ypad; + + pix_rect.x = cell_area->x + real_xoffset; + pix_rect.y = cell_area->y + real_yoffset; + pix_rect.width = gdk_pixbuf_get_width (pixbuf); + pix_rect.height = gdk_pixbuf_get_height (pixbuf); + + if (gdk_rectangle_intersect (cell_area, &pix_rect, &draw_rect)) + gdk_pixbuf_render_to_drawable_alpha (pixbuf, + window, + /* pixbuf 0, 0 is at pix_rect.x, pix_rect.y */ + draw_rect.x - pix_rect.x, + draw_rect.y - pix_rect.y, + draw_rect.x, + draw_rect.y, + draw_rect.width, + draw_rect.height, + GDK_PIXBUF_ALPHA_FULL, + 0, + GDK_RGB_DITHER_NORMAL, + 0, 0); } |