Package: release.debian.org Severity: normal User: release.debian....@packages.debian.org Usertags: unblock
Please unblock package geeqie The version in unstable has a patch cherry-picked from upstream which fixes showing images when using wayland, which has been problematic before, and it hasn't worked with some combinations of wayland and libclutter. This fixes two bugs (#983207, #977189) with severity important (and I fully believe that more bugs would be reported on the package if the fix isn't included). The patch fixes showing only a white image on some setups (wayland), which before the patch needs a setting change, or cli option to fix. [ Checklist ] [X] all changes are documented in the d/changelog [X] I reviewed all changes and I approve them [X] attach debdiff against the package in testing unblock geeqie/1.6-8 -- Andreas Rönnquist gus...@debian.org
diff -Nru geeqie-1.6/debian/changelog geeqie-1.6/debian/changelog --- geeqie-1.6/debian/changelog 2021-02-27 13:36:57.000000000 +0100 +++ geeqie-1.6/debian/changelog 2021-03-09 20:17:40.000000000 +0100 @@ -1,3 +1,11 @@ +geeqie (1:1.6-8) unstable; urgency=medium + + * Add patch to make image visible on wayland too, independent on + if we are using the clutter library or not + (Closes: #983207, #977189) + + -- Andreas Rönnquist <gus...@debian.org> Tue, 09 Mar 2021 20:17:40 +0100 + geeqie (1:1.6-7) unstable; urgency=medium * Add patch fixing regression --remote option failing diff -Nru geeqie-1.6/debian/patches/0007-Fix-644-Images-fail-to-render-on-MacOS.patch geeqie-1.6/debian/patches/0007-Fix-644-Images-fail-to-render-on-MacOS.patch --- geeqie-1.6/debian/patches/0007-Fix-644-Images-fail-to-render-on-MacOS.patch 1970-01-01 01:00:00.000000000 +0100 +++ geeqie-1.6/debian/patches/0007-Fix-644-Images-fail-to-render-on-MacOS.patch 2021-03-09 20:17:16.000000000 +0100 @@ -0,0 +1,317 @@ +From: Colin Clark <colin.cl...@cclark.uk> +Date: Sat, 6 Mar 2021 13:23:46 +0000 +Subject: Fix #644: Images fail to render on MacOS + +https://github.com/BestImageViewer/geeqie/issues/644 + +Change the way the "draw" signal is handled. + +Overlay guidelines are disabled. + +This patch also fixes showing the image on Wayland, without it we often +only get a white rectangle where the image was supposed to show. + +--- + src/image-overlay.c | 51 +++++++++++---------- + src/renderer-tiles.c | 127 +++++++++++++++++++++++++++++++++++++++++++++++---- + 2 files changed, 143 insertions(+), 35 deletions(-) + +diff --git a/src/image-overlay.c b/src/image-overlay.c +index 6116b5a..ff377e8 100644 +--- a/src/image-overlay.c ++++ b/src/image-overlay.c +@@ -202,7 +202,6 @@ gint image_osd_histogram_get_mode(ImageWindow *imd) + void image_osd_toggle(ImageWindow *imd) + { + OsdShowFlags show; +- + if (!imd) return; + + show = image_osd_get(imd); +@@ -522,30 +521,32 @@ static GdkPixbuf *image_osd_guidelines_render(OverlayStateData *osd) + GdkPixbuf *rectangles; + ImageWindow *imd = osd->imd; + +- pixbuf_renderer_get_scaled_size((PixbufRenderer *)imd->pr, &width, &height); +- +- if (width && height) +- { +- rectangles = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, width, height); +- if (rectangles) +- { +- pixbuf_set_rect_fill(rectangles, 0, 0, width, height, 255, 255, 255, 0); +- pixbuf_set_rect(rectangles, 0, 0 + (height / 3), width, height / 3, +- 0, 0, 0, 255, +- 1, 1, 1, 1); +- pixbuf_set_rect(rectangles, 0, 0 + (height / 3 + 1), width, height / 3 - 2, +- 255, 255, 255, 255, +- 1, 1, 1, 1); +- +- pixbuf_set_rect(rectangles, 0 + width / 3, 0 , width / 3, height, +- 0, 0, 0, 255, +- 1, 1, 1, 1); +- pixbuf_set_rect(rectangles, 0 + width / 3 + 1, 0, width / 3 - 2, height, +- 255, 255, 255, 255, +- 1, 1, 1, 1); +- return rectangles; +- } +- } ++/* FIXME: guidelines does not work with revised draw signal handling ++ */ ++ //~ pixbuf_renderer_get_scaled_size((PixbufRenderer *)imd->pr, &width, &height); ++ ++ //~ if (width && height) ++ //~ { ++ //~ rectangles = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, width, height); ++ //~ if (rectangles) ++ //~ { ++ //~ pixbuf_set_rect_fill(rectangles, 0, 0, width, height, 255, 255, 255, 0); ++ //~ pixbuf_set_rect(rectangles, 0, 0 + (height / 3), width, height / 3, ++ //~ 0, 0, 0, 255, ++ //~ 1, 1, 1, 1); ++ //~ pixbuf_set_rect(rectangles, 0, 0 + (height / 3 + 1), width, height / 3 - 2, ++ //~ 255, 255, 255, 255, ++ //~ 1, 1, 1, 1); ++ ++ //~ pixbuf_set_rect(rectangles, 0 + width / 3, 0 , width / 3, height, ++ //~ 0, 0, 0, 255, ++ //~ 1, 1, 1, 1); ++ //~ pixbuf_set_rect(rectangles, 0 + width / 3 + 1, 0, width / 3 - 2, height, ++ //~ 255, 255, 255, 255, ++ //~ 1, 1, 1, 1); ++ //~ return rectangles; ++ //~ } ++ //~ } + + return NULL; + } +diff --git a/src/renderer-tiles.c b/src/renderer-tiles.c +index 9b4f049..cc0483a 100644 +--- a/src/renderer-tiles.c ++++ b/src/renderer-tiles.c +@@ -1,6 +1,6 @@ + /* + * Copyright (C) 2006 John Ellis +- * Copyright (C) 2008 - 2016 The Geeqie Team ++ * Copyright (C) 2008 - 2021 The Geeqie Team + * + * Author: John Ellis + * +@@ -135,6 +135,7 @@ struct _RendererTiles + + GList *overlay_list; + cairo_surface_t *overlay_buffer; ++ cairo_surface_t *surface; + + guint draw_idle_id; /* event source id */ + +@@ -210,8 +211,11 @@ static void rt_border_draw(RendererTiles *rt, gint x, gint y, gint w, gint h) + + if (!window) return; + ++#if GTK_CHECK_VERSION(3,0,0) ++ cr = cairo_create(rt->surface); ++#else + cr = gdk_cairo_create(window); +- ++#endif + + if (!pr->pixbuf && !pr->source_tiles_enabled) + { +@@ -602,7 +606,9 @@ static void rt_overlay_init_window(RendererTiles *rt, OverlayData *od) + od->window = gdk_window_new(gtk_widget_get_window(GTK_WIDGET(pr)), &attributes, attributes_mask); + gdk_window_set_user_data(od->window, pr); + gdk_window_move(od->window, px + rt->stereo_off_x, py + rt->stereo_off_y); ++#if !GTK_CHECK_VERSION(3,0,0) + gdk_window_show(od->window); ++#endif + } + + static void rt_overlay_draw(RendererTiles *rt, gint x, gint y, gint w, gint h, +@@ -786,7 +792,11 @@ gint renderer_tiles_overlay_add(void *renderer, GdkPixbuf *pixbuf, gint x, gint + + rt->overlay_list = g_list_append(rt->overlay_list, od); + ++#if GTK_CHECK_VERSION(3,0,0) ++ gtk_widget_queue_draw(GTK_WIDGET(rt->pr)); ++#else + rt_overlay_queue_draw(rt, od, 0, 0, 0, 0); ++#endif + + return od->id; + } +@@ -834,6 +844,30 @@ static void rt_overlay_list_reset_window(RendererTiles *rt) + } + } + ++#if GTK_CHECK_VERSION(3,0,0) ++void renderer_tiles_overlay_set(void *renderer, gint id, GdkPixbuf *pixbuf, gint x, gint y) ++{ ++ RendererTiles *rc = (RendererTiles *)renderer; ++ PixbufRenderer *pr = rc->pr; ++ OverlayData *od; ++ ++ g_return_if_fail(IS_PIXBUF_RENDERER(pr)); ++ ++ od = rt_overlay_find(rc, id); ++ if (!od) return; ++ ++ if (pixbuf) ++ { ++ g_object_ref(G_OBJECT(pixbuf)); ++ g_object_unref(G_OBJECT(od->pixbuf)); ++ od->pixbuf = pixbuf; ++ } ++ else ++ { ++ rt_overlay_free(rc, od); ++ } ++} ++#else + void renderer_tiles_overlay_set(void *renderer, gint id, GdkPixbuf *pixbuf, gint x, gint y) + { + RendererTiles *rt = (RendererTiles *) renderer; +@@ -868,6 +902,7 @@ void renderer_tiles_overlay_set(void *renderer, gint id, GdkPixbuf *pixbuf, gint + rt_overlay_free(rt, od); + } + } ++#endif + + gboolean renderer_tiles_overlay_get(void *renderer, gint id, GdkPixbuf **pixbuf, gint *x, gint *y) + { +@@ -1520,7 +1555,11 @@ static void rt_tile_expose(RendererTiles *rt, ImageTile *it, + box = GTK_WIDGET(pr); + window = gtk_widget_get_window(box); + ++#if GTK_CHECK_VERSION(3,0,0) ++ cr = cairo_create(rt->surface); ++#else + cr = gdk_cairo_create(window); ++#endif + cairo_set_source_surface(cr, it->surface, pr->x_offset + (it->x - rt->x_scroll) + rt->stereo_off_x, pr->y_offset + (it->y - rt->y_scroll) + rt->stereo_off_y); + cairo_rectangle (cr, pr->x_offset + (it->x - rt->x_scroll) + x + rt->stereo_off_x, pr->y_offset + (it->y - rt->y_scroll) + y + rt->stereo_off_y, w, h); + cairo_fill (cr); +@@ -1533,6 +1572,10 @@ static void rt_tile_expose(RendererTiles *rt, ImageTile *it, + w, h, + it); + } ++ ++#if GTK_CHECK_VERSION(3,0,0) ++ gtk_widget_queue_draw(GTK_WIDGET(rt->pr)); ++#endif + } + + +@@ -1958,11 +2001,16 @@ static void rt_scroll(void *renderer, gint x_off, gint y_off) + y2 = abs(y_off); + } + ++#if GTK_CHECK_VERSION(3,0,0) ++ cr = cairo_create(rt->surface); ++ surface = rt->surface; ++#else + box = GTK_WIDGET(pr); + window = gtk_widget_get_window(box); + + cr = gdk_cairo_create(window); + surface = cairo_get_target(cr); ++#endif + /* clipping restricts the intermediate surface's size, so it's a good idea + * to use it. */ + cairo_rectangle(cr, x1 + pr->x_offset + rt->stereo_off_x, y1 + pr->y_offset + rt->stereo_off_y, w, h); +@@ -2128,21 +2176,78 @@ static void renderer_free(void *renderer) + } + + #if GTK_CHECK_VERSION(3,0,0) ++static gboolean rt_realize_cb(GtkWidget *widget, gpointer data) ++{ ++ RendererTiles *rt = (RendererTiles *)data; ++ cairo_t *cr; ++ ++ if (!rt->surface) ++ { ++ rt->surface = gdk_window_create_similar_surface(gtk_widget_get_window(widget), CAIRO_CONTENT_COLOR, gtk_widget_get_allocated_width(widget), gtk_widget_get_allocated_height(widget)); ++ ++ cr = cairo_create(rt->surface); ++ cairo_set_source_rgb(cr, (gdouble)options->image.border_color.red /65535, (gdouble)options->image.border_color.green / 65535, (gdouble)options->image.border_color.blue / 65535); ++ cairo_paint(cr); ++ cairo_destroy(cr); ++ } ++ ++ return FALSE; ++} ++ ++static gboolean rt_size_allocate_cb(GtkWidget *widget, GdkRectangle *allocation, gpointer data) ++{ ++ RendererTiles *rt = data; ++ cairo_t *cr; ++ cairo_surface_t *old_surface; ++ ++ if (gtk_widget_get_realized(GTK_WIDGET(rt->pr))) ++ { ++ old_surface = rt->surface; ++ rt->surface = gdk_window_create_similar_surface(gtk_widget_get_window(widget), CAIRO_CONTENT_COLOR, allocation->width, allocation->height); ++ ++ cr = cairo_create(rt->surface); ++ ++ cairo_set_source_rgb(cr, (gdouble)options->image.border_color.red / 65535, (gdouble)options->image.border_color.green / 65535, (gdouble)options->image.border_color.blue / 65535); ++ cairo_paint(cr); ++ cairo_set_source_surface(cr, old_surface, 0, 0); ++ cairo_paint(cr); ++ cairo_destroy(cr); ++ cairo_surface_destroy(old_surface); ++ ++ renderer_redraw(rt, allocation->x, allocation->y, allocation->width, allocation->height, FALSE, TILE_RENDER_ALL, FALSE, FALSE); ++ } ++ ++ return FALSE; ++} + + static gboolean rt_draw_cb(GtkWidget *widget, cairo_t *cr, gpointer data) + { + RendererTiles *rt = (RendererTiles *)data; +- if (gtk_widget_is_drawable(widget)) ++ GList *work; ++ OverlayData *od; ++ ++ cairo_set_source_surface (cr, rt->surface, 0, 0); ++ cairo_paint(cr); ++ ++ work = rt->overlay_list; ++ while (work) + { +- if (gtk_widget_get_has_window(widget)) ++ od = work->data; ++ gint px, py, pw, ph; ++ pw = gdk_pixbuf_get_width(od->pixbuf); ++ ph = gdk_pixbuf_get_height(od->pixbuf); ++ px = od->x; ++ py = od->y; ++ ++ if (od->flags & OVL_RELATIVE) + { +- GdkRectangle area; +- if (gdk_cairo_get_clip_rectangle(cr, &area)) +- { +- renderer_redraw(rt, area.x, area.y, area.width, area.height, +- FALSE, TILE_RENDER_ALL, FALSE, FALSE); +- } ++ if (px < 0) px = rt->pr->viewport_width - pw + px; ++ if (py < 0) py = rt->pr->viewport_height - ph + py; + } ++ ++ gdk_cairo_set_source_pixbuf(cr, od->pixbuf, px, py); ++ cairo_paint(cr); ++ work = work->next; + } + + return FALSE; +@@ -2229,6 +2334,8 @@ RendererFuncs *renderer_tiles_new(PixbufRenderer *pr) + #if GTK_CHECK_VERSION(3,0,0) + g_signal_connect(G_OBJECT(pr), "draw", + G_CALLBACK(rt_draw_cb), rt); ++ g_signal_connect(G_OBJECT(pr), "realize", G_CALLBACK(rt_realize_cb), rt); ++ g_signal_connect(G_OBJECT(pr), "size-allocate", G_CALLBACK(rt_size_allocate_cb), rt); + #else + g_signal_connect(G_OBJECT(pr), "expose_event", + G_CALLBACK(rt_expose_cb), rt); diff -Nru geeqie-1.6/debian/patches/series geeqie-1.6/debian/patches/series --- geeqie-1.6/debian/patches/series 2021-02-27 13:30:35.000000000 +0100 +++ geeqie-1.6/debian/patches/series 2021-03-09 18:57:49.000000000 +0100 @@ -4,3 +4,4 @@ 0004-Fix-829-segfault-with-clutter-gtk.patch 0005-Fix-822-The-image-rotation-keys-and-affect-the-wrong.patch 0006-Fix-860-871-remote-and-slideshow-on-startup.patch +0007-Fix-644-Images-fail-to-render-on-MacOS.patch