From: Vladimir Nadvornik Date: Mon, 2 Mar 2009 22:48:04 +0000 (+0000) Subject: overlay now survives image split X-Git-Tag: v1.0.0~430 X-Git-Url: http://geeqie.org/cgi-bin/gitweb.cgi?p=geeqie.git;a=commitdiff_plain;h=a899ea58d94c14dc66d34a3567ebdcfa11a6a0f9 overlay now survives image split --- diff --git a/src/layout_image.c b/src/layout_image.c index 703a005e..caedd220 100644 --- a/src/layout_image.c +++ b/src/layout_image.c @@ -1588,6 +1588,11 @@ static void layout_image_setup_split_common(LayoutWindow *lw, gint n) image_set_frame(lw->split_images[i], frame); image_set_selectable(lw->split_images[i], 1); + if (lw->image) + { + image_osd_copy_status(lw->image, lw->split_images[i]); + } + if (layout_selection_count(lw, 0) > 1) { GList *work = g_list_last(layout_selection_list(lw)); diff --git a/src/pixbuf-renderer.c b/src/pixbuf-renderer.c index ad8607e7..ad65d959 100644 --- a/src/pixbuf-renderer.c +++ b/src/pixbuf-renderer.c @@ -221,6 +221,7 @@ static void pr_zoom_sync(PixbufRenderer *pr, gdouble zoom, static void pr_signals_connect(PixbufRenderer *pr); static void pr_size_cb(GtkWidget *widget, GtkAllocation *allocation, gpointer data); +static void pr_unmap_cb(GtkWidget *widget, gpointer data); static void pixbuf_renderer_paint(PixbufRenderer *pr, GdkRectangle *area); static gint pr_queue_draw_idle_cb(gpointer data); @@ -519,6 +520,9 @@ static void pixbuf_renderer_init(PixbufRenderer *pr) g_signal_connect_after(G_OBJECT(box), "size_allocate", G_CALLBACK(pr_size_cb), pr); + g_signal_connect(G_OBJECT(pr), "unmap", + G_CALLBACK(pr_unmap_cb), pr); + pr_signals_connect(pr); } @@ -852,6 +856,27 @@ static void pr_overlay_get_position(PixbufRenderer *pr, OverlayData *od, if (h) *h = ph; } +static void pr_overlay_init_window(PixbufRenderer *pr, OverlayData *od) +{ + gint px, py, pw, ph; + GdkWindowAttr attributes; + gint attributes_mask; + + pr_overlay_get_position(pr, od, &px, &py, &pw, &ph); + + attributes.window_type = GDK_WINDOW_CHILD; + attributes.wclass = GDK_INPUT_OUTPUT; + attributes.width = pw; + attributes.height = ph; + attributes.event_mask = GDK_EXPOSURE_MASK; + attributes_mask = 0; + + od->window = gdk_window_new(GTK_WIDGET(pr)->window, &attributes, attributes_mask); + gdk_window_set_user_data(od->window, pr); + gdk_window_move(od->window, px, py); + gdk_window_show(od->window); +} + static void pr_overlay_draw(PixbufRenderer *pr, gint x, gint y, gint w, gint h, ImageTile *it) { @@ -870,6 +895,8 @@ static void pr_overlay_draw(PixbufRenderer *pr, gint x, gint y, gint w, gint h, od = work->data; work = work->next; + if (!od->window) pr_overlay_init_window(pr, od); + pr_overlay_get_position(pr, od, &px, &py, &pw, &ph); if (pr_clip_region(x, y, w, h, px, py, pw, ph, &rx, &ry, &rw, &rh)) { @@ -965,7 +992,7 @@ static void pr_overlay_update_sizes(PixbufRenderer *pr) OverlayData *od = work->data; work = work->next; - if (!od->window) continue; + if (!od->window) pr_overlay_init_window(pr, od); if (od->flags & OVL_RELATIVE) { @@ -993,14 +1020,12 @@ static OverlayData *pr_overlay_find(PixbufRenderer *pr, gint id) return NULL; } + gint pixbuf_renderer_overlay_add(PixbufRenderer *pr, GdkPixbuf *pixbuf, gint x, gint y, OverlayRendererFlags flags) { OverlayData *od; gint id; - gint px, py, pw, ph; - GdkWindowAttr attributes; - gint attributes_mask; g_return_val_if_fail(IS_PIXBUF_RENDERER(pr), -1); g_return_val_if_fail(pixbuf != NULL, -1); @@ -1016,20 +1041,8 @@ gint pixbuf_renderer_overlay_add(PixbufRenderer *pr, GdkPixbuf *pixbuf, gint x, od->y = y; od->flags = flags; - pr_overlay_get_position(pr, od, &px, &py, &pw, &ph); - - attributes.window_type = GDK_WINDOW_CHILD; - attributes.wclass = GDK_INPUT_OUTPUT; - attributes.width = pw; - attributes.height = ph; - attributes.event_mask = GDK_EXPOSURE_MASK; - attributes_mask = 0; - - od->window = gdk_window_new(GTK_WIDGET(pr)->window, &attributes, attributes_mask); - gdk_window_set_user_data(od->window, pr); - gdk_window_move(od->window, px, py); - gdk_window_show(od->window); - + pr_overlay_init_window(pr, od); + pr->overlay_list = g_list_append(pr->overlay_list, od); pr_overlay_queue_draw(pr, od); @@ -1063,6 +1076,23 @@ static void pr_overlay_list_clear(PixbufRenderer *pr) } } +static void pr_overlay_list_reset_window(PixbufRenderer *pr) +{ + GList *work; + + if (pr->overlay_buffer) g_object_unref(pr->overlay_buffer); + pr->overlay_buffer = NULL; + + work = pr->overlay_list; + while (work) + { + OverlayData *od = work->data; + work = work->next; + if (od->window) gdk_window_destroy(od->window); + od->window = NULL; + } +} + void pixbuf_renderer_overlay_set(PixbufRenderer *pr, gint id, GdkPixbuf *pixbuf, gint x, gint y) { OverlayData *od; @@ -1115,6 +1145,13 @@ void pixbuf_renderer_overlay_remove(PixbufRenderer *pr, gint id) pixbuf_renderer_overlay_set(pr, id, NULL, 0, 0); } +static void pr_unmap_cb(GtkWidget *widget, gpointer data) +{ + PixbufRenderer *pr = data; + pr_overlay_list_reset_window(pr); +} + + /* *------------------------------------------------------------------- * scroller overlay @@ -3799,6 +3836,8 @@ static void pr_signals_connect(PixbufRenderer *pr) G_CALLBACK(pr_mouse_release_cb), pr); g_signal_connect(G_OBJECT(pr), "leave_notify_event", G_CALLBACK(pr_mouse_leave_cb), pr); + g_signal_connect(G_OBJECT(pr), "unmap", + G_CALLBACK(pr_unmap_cb), pr); gtk_widget_set_events(GTK_WIDGET(pr), GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK | GDK_BUTTON_PRESS_MASK |