From 4884d679aa800f1f64b3a13576b0109a6beabd96 Mon Sep 17 00:00:00 2001 From: John Ellis Date: Wed, 23 Mar 2005 05:29:45 +0000 Subject: [PATCH] Wed Mar 23 00:22:28 2005 John Ellis * image.c (image_change_from_image): Fix and use pixbuf_renderer_move. * pan-view.c: Convert back to ImageWindow from PixbufRenderer, so that focus and full screen work again. * pixbuf-renderer.[ch] (pixbuf_renderer_move): Add this function. ##### Note: GQview CVS on sourceforge is not always up to date, please use ##### ##### an offical release when making enhancements and translation updates. ##### --- ChangeLog | 7 +++ TODO | 4 +- src/image.c | 56 +------------------ src/pan-view.c | 126 ++++++++++++++++++------------------------ src/pixbuf-renderer.c | 53 ++++++++++++++++++ src/pixbuf-renderer.h | 4 ++ 6 files changed, 124 insertions(+), 126 deletions(-) diff --git a/ChangeLog b/ChangeLog index 55563b16..3ca2b4a2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Wed Mar 23 00:22:28 2005 John Ellis + + * image.c (image_change_from_image): Fix and use pixbuf_renderer_move. + * pan-view.c: Convert back to ImageWindow from PixbufRenderer, so that + focus and full screen work again. + * pixbuf-renderer.[ch] (pixbuf_renderer_move): Add this function. + Fri Mar 18 19:52:38 2005 John Ellis * pixbuf-renderer.c: Fix broken 2pass queueing so it merges a single diff --git a/TODO b/TODO index 07942805..537a2aad 100644 --- a/TODO +++ b/TODO @@ -5,8 +5,8 @@ Major: ---------------------------------------------- > pixbuf-renderer.c: - > fix two pass render from corrupting it->qd pointer (need one pointer for each queue?). - > fix image_change_from_image (to do this need a pixbuf_renderer_move_image). + d> fix two pass render from corrupting it->qd pointer (need one pointer for each queue?). + d> fix image_change_from_image (to do this need a pixbuf_renderer_move_image). > fix broken zoom out drawing when using source tiles. > image.c: diff --git a/src/image.c b/src/image.c index 99e3ebb6..07a4db76 100644 --- a/src/image.c +++ b/src/image.c @@ -947,7 +947,6 @@ CollectionData *image_get_collection(ImageWindow *imd, CollectInfo **info) return NULL; } -#if 0 static void image_loader_sync_data(ImageLoader *il, gpointer data) { /* change data for the callbacks directly */ @@ -957,24 +956,16 @@ static void image_loader_sync_data(ImageLoader *il, gpointer data) il->data_done = data; il->data_percent = data; } -#endif /* this is more like a move function - * it moves most data from source to imd, source does keep a ref on the pixbuf + * it moves most data from source to imd */ void image_change_from_image(ImageWindow *imd, ImageWindow *source) { if (imd == source) return; - printf("FIXME: enable set from image\n"); -#if 0 - imd->zoom_min = source->zoom_min; - imd->zoom_max = source->zoom_max; - imd->unknown = source->unknown; - image_set_pixbuf(imd, source->pixbuf, image_zoom_get(source), TRUE); - imd->collection = source->collection; imd->collection_info = source->collection_info; imd->size = source->size; @@ -985,7 +976,7 @@ void image_change_from_image(ImageWindow *imd, ImageWindow *source) image_loader_free(imd->il); imd->il = NULL; - if (imd->pixbuf && source->il) + if (source->il) { imd->il = source->il; source->il = NULL; @@ -1019,48 +1010,7 @@ void image_change_from_image(ImageWindow *imd, ImageWindow *source) imd->completed = source->completed; - imd->x_scroll = source->x_scroll; - imd->y_scroll = source->y_scroll; - - if (imd->source_tiles_enabled) - { - image_source_tile_unset(imd); - } - - if (source->source_tiles_enabled) - { - imd->source_tiles_enabled = source->source_tiles_enabled; - imd->source_tiles_cache_size = source->source_tiles_cache_size; - imd->source_tiles = source->source_tiles; - imd->source_tile_width = source->source_tile_width; - imd->source_tile_height = source->source_tile_height; - - source->source_tiles_enabled = FALSE; - source->source_tiles = NULL; - - imd->func_tile_request = source->func_tile_request; - imd->func_tile_dispose = source->func_tile_dispose; - imd->data_tile = source->data_tile; - - source->func_tile_request = NULL; - source->func_tile_dispose = NULL; - source->data_tile = NULL; - - imd->image_width = source->image_width; - imd->image_height = source->image_height; - - if (image_zoom_clamp(imd, source->zoom, TRUE, TRUE)) - { - image_size_clamp(imd); - image_scroll_clamp(imd); - image_tile_sync(imd, imd->width, imd->height, FALSE); - image_redraw(imd, FALSE); - } - return; - } - - image_scroll_clamp(imd); -#endif + pixbuf_renderer_move(PIXBUF_RENDERER(imd->pr), PIXBUF_RENDERER(source->pr)); } /* manipulation */ diff --git a/src/pan-view.c b/src/pan-view.c index ee5ece8a..c5f28515 100644 --- a/src/pan-view.c +++ b/src/pan-view.c @@ -18,6 +18,7 @@ #include "editors.h" #include "filelist.h" #include "fullscreen.h" +#include "image.h" #include "image-load.h" #include "img-view.h" #include "info.h" @@ -180,8 +181,8 @@ typedef struct _PanWindow PanWindow; struct _PanWindow { GtkWidget *window; - PixbufRenderer *pr; - PixbufRenderer *pr_normal; + ImageWindow *imd; + ImageWindow *imd_normal; FullScreenData *fs; GtkWidget *path_entry; @@ -1078,7 +1079,7 @@ static PanItem *pan_item_new_text(PanWindow *pw, gint x, gint y, const gchar *te pi->color_b = b; pi->color_a = a; - pan_item_text_compute_size(pi, (GtkWidget *)pw->pr); + pan_item_text_compute_size(pi, pw->imd->pr); pw->list = g_list_prepend(pw->list, pi); @@ -1099,7 +1100,7 @@ static void pan_item_set_key(PanItem *pi, const gchar *key) static void pan_item_added(PanWindow *pw, PanItem *pi) { if (!pi) return; - pixbuf_renderer_area_changed(pw->pr, pi->x, pi->y, pi->width, pi->height); + image_area_changed(pw->imd, pi->x, pi->y, pi->width, pi->height); } static void pan_item_remove(PanWindow *pw, PanItem *pi) @@ -1112,7 +1113,7 @@ static void pan_item_remove(PanWindow *pw, PanItem *pi) pw->queue = g_list_remove(pw->queue, pi); pw->list = g_list_remove(pw->list, pi); - pixbuf_renderer_area_changed(pw->pr, pi->x, pi->y, pi->width, pi->height); + image_area_changed(pw->imd, pi->x, pi->y, pi->width, pi->height); pan_item_free(pi); } @@ -2482,7 +2483,7 @@ static void pan_layout_queue_thumb_done_cb(ThumbLoader *tl, gpointer data) pi->pixbuf = thumb_loader_get_pixbuf(tl, TRUE); rc = pi->refcount; - pixbuf_renderer_area_changed(pw->pr, pi->x, pi->y, pi->width, pi->height); + image_area_changed(pw->imd, pi->x, pi->y, pi->width, pi->height); pi->refcount = rc; } @@ -2523,7 +2524,7 @@ static void pan_layout_queue_image_done_cb(ImageLoader *il, gpointer data) } rc = pi->refcount; - pixbuf_renderer_area_changed(pw->pr, pi->x, pi->y, pi->width, pi->height); + image_area_changed(pw->imd, pi->x, pi->y, pi->width, pi->height); pi->refcount = rc; } @@ -2553,7 +2554,7 @@ static void pan_layout_queue_image_area_cb(ImageLoader *il, guint x, guint y, } rc = pi->refcount; - pixbuf_renderer_area_changed(pw->pr, pi->x + x, pi->y + y, width, height); + image_area_changed(pw->imd, pi->x + x, pi->y + y, width, height); pi->refcount = rc; } } @@ -3094,15 +3095,6 @@ static void pan_window_message(PanWindow *pw, const gchar *text) g_free(buf); } -static PixbufRenderer *pan_window_active_image(PanWindow *pw) -{ -#if 0 - if (pw->fs) return pw->fs->imd; -#endif - - return pw->pr; -} - static void pan_window_zoom_limit(PanWindow *pw) { gdouble min; @@ -3133,7 +3125,7 @@ static void pan_window_zoom_limit(PanWindow *pw) break; } - pixbuf_renderer_zoom_set_limits(pw->pr, min, 32.0); + image_zoom_set_limits(pw->imd, min, 32.0); } static gint pan_window_layout_update_idle_cb(gpointer data) @@ -3187,7 +3179,7 @@ static gint pan_window_layout_update_idle_cb(gpointer data) { gdouble align; - pixbuf_renderer_set_tiles(pw->pr, width, height, + pixbuf_renderer_set_tiles(PIXBUF_RENDERER(pw->imd->pr), width, height, PAN_TILE_SIZE, PAN_TILE_SIZE, 10, pan_window_request_tile_cb, pan_window_dispose_tile_cb, pw, 1.0); @@ -3200,7 +3192,7 @@ static gint pan_window_layout_update_idle_cb(gpointer data) { align = 0.5; } - pixbuf_renderer_scroll_to_point(pw->pr, scroll_x, scroll_y, align, align); + pixbuf_renderer_scroll_to_point(PIXBUF_RENDERER(pw->imd->pr), scroll_x, scroll_y, align, align); } pan_window_message(pw, NULL); @@ -3234,10 +3226,8 @@ static const gchar *pan_menu_click_path(PanWindow *pw) static void pan_window_menu_pos_cb(GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer data) { PanWindow *pw = data; - PixbufRenderer *pr; - pr = pan_window_active_image(pw); - gdk_window_get_origin(GTK_WIDGET(pr)->window, x, y); + gdk_window_get_origin(pw->imd->pr->window, x, y); popup_menu_position_clamp(menu, x, y, 0); } @@ -3252,10 +3242,10 @@ static gint pan_window_key_press_cb(GtkWidget *widget, GdkEventKey *event, gpoin gint y = 0; gint focused; - pr = pan_window_active_image(pw); + pr = PIXBUF_RENDERER(pw->imd->pr); path = pan_menu_click_path(pw); - focused = (pw->fs || GTK_WIDGET_HAS_FOCUS(GTK_WIDGET(pr))); + focused = (pw->fs || GTK_WIDGET_HAS_FOCUS(GTK_WIDGET(pw->imd->widget))); if (focused) { @@ -3446,7 +3436,7 @@ static gint pan_window_key_press_cb(GtkWidget *widget, GdkEventKey *event, gpoin } else if (GTK_WIDGET_HAS_FOCUS(pw->search_entry)) { - gtk_widget_grab_focus(GTK_WIDGET(pw->pr)); + gtk_widget_grab_focus(GTK_WIDGET(pw->imd->widget)); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pw->search_button), FALSE); stop_signal = TRUE; } @@ -3597,7 +3587,7 @@ static gint pan_search_by_path(PanWindow *pw, const gchar *path) } pan_info_update(pw, pi); - pixbuf_renderer_scroll_to_point(pw->pr, pi->x + pi->width / 2, pi->y + pi->height / 2, 0.5, 0.5); + image_scroll_to_point(pw->imd, pi->x + pi->width / 2, pi->y + pi->height / 2, 0.5, 0.5); buf = g_strdup_printf("%s ( %d / %d )", (path[0] == '/') ? _("path found") : _("filename found"), @@ -3645,7 +3635,7 @@ static gint pan_search_by_partial(PanWindow *pw, const gchar *text) } pan_info_update(pw, pi); - pixbuf_renderer_scroll_to_point(pw->pr, pi->x + pi->width / 2, pi->y + pi->height / 2, 0.5, 0.5); + image_scroll_to_point(pw->imd, pi->x + pi->width / 2, pi->y + pi->height / 2, 0.5, 0.5); buf = g_strdup_printf("%s ( %d / %d )", _("partial match"), @@ -3823,16 +3813,16 @@ static gint pan_search_by_date(PanWindow *pw, const gchar *text) { pan_info_update(pw, NULL); pan_calendar_update(pw, pi); - pixbuf_renderer_scroll_to_point(pw->pr, - pi->x + pi->width / 2, - pi->y + pi->height / 2, 0.5, 0.5); + image_scroll_to_point(pw->imd, + pi->x + pi->width / 2, + pi->y + pi->height / 2, 0.5, 0.5); } else if (pi) { pan_info_update(pw, pi); - pixbuf_renderer_scroll_to_point(pw->pr, - pi->x - PAN_FOLDER_BOX_BORDER * 5 / 2, - pi->y, 0.0, 0.5); + image_scroll_to_point(pw->imd, + pi->x - PAN_FOLDER_BOX_BORDER * 5 / 2, + pi->y, 0.0, 0.5); } if (month > 0) @@ -4017,22 +4007,21 @@ static void scroll_cb(PixbufRenderer *pr, GdkEventScroll *event, gpointer data) } } -static void pan_image_set_buttons(PanWindow *pw, PixbufRenderer *pr) +static void pan_image_set_buttons(PanWindow *pw, ImageWindow *imd) { - g_signal_connect(G_OBJECT(pr), "clicked", + g_signal_connect(G_OBJECT(imd->pr), "clicked", G_CALLBACK(button_cb), pw); - g_signal_connect(G_OBJECT(pr), "scroll_event", + g_signal_connect(G_OBJECT(imd->pr), "scroll_event", G_CALLBACK(scroll_cb), pw); } -#if 0 static void pan_fullscreen_stop_func(FullScreenData *fs, gpointer data) { PanWindow *pw = data; pw->fs = NULL; + pw->imd = pw->imd_normal; } -#endif static void pan_fullscreen_toggle(PanWindow *pw, gint force_off) { @@ -4041,20 +4030,15 @@ static void pan_fullscreen_toggle(PanWindow *pw, gint force_off) if (pw->fs) { fullscreen_stop(pw->fs); - pw->pr = pw->pr_normal; } else { - printf("FIXME: fullscreen\n"); -#if 0 pw->fs = fullscreen_start(pw->window, pw->imd, pan_fullscreen_stop_func, pw); - pan_image_set_buttons(pw, pw->fs->imd); g_signal_connect(G_OBJECT(pw->fs->window), "key_press_event", G_CALLBACK(pan_window_key_press_cb), pw); pw->imd = pw->fs->imd; -#endif } } @@ -4111,25 +4095,31 @@ static void pan_window_image_scroll_notify_cb(PixbufRenderer *pr, gpointer data) static void pan_window_scrollbar_h_value_cb(GtkRange *range, gpointer data) { PanWindow *pw = data; + PixbufRenderer *pr; gint x; - if (!pw->pr->scale) return; + pr = PIXBUF_RENDERER(pw->imd_normal->pr); + + if (!pr->scale) return; x = (gint)gtk_range_get_value(range); - pixbuf_renderer_scroll_to_point(pw->pr, x, (gint)((gdouble)pw->pr->y_scroll / pw->pr->scale), 0.0, 0.0); + pixbuf_renderer_scroll_to_point(pr, x, (gint)((gdouble)pr->y_scroll / pr->scale), 0.0, 0.0); } static void pan_window_scrollbar_v_value_cb(GtkRange *range, gpointer data) { PanWindow *pw = data; + PixbufRenderer *pr; gint y; - if (!pw->pr->scale) return; + pr = PIXBUF_RENDERER(pw->imd_normal->pr); + + if (!pr->scale) return; y = (gint)gtk_range_get_value(range); - pixbuf_renderer_scroll_to_point(pw->pr, (gint)((gdouble)pw->pr->x_scroll / pw->pr->scale), y, 0.0, 0.0); + pixbuf_renderer_scroll_to_point(pr, (gint)((gdouble)pr->x_scroll / pr->scale), y, 0.0, 0.0); } static void pan_window_layout_change_cb(GtkWidget *combo, gpointer data) @@ -4298,25 +4288,21 @@ static void pan_window_new_real(const gchar *path) gtk_table_set_row_spacings(GTK_TABLE(table), 2); gtk_table_set_col_spacings(GTK_TABLE(table), 2); - pw->pr = pixbuf_renderer_new(); - pw->pr_normal = pw->pr; - - if (black_window_background) pixbuf_renderer_set_black(pw->pr, TRUE); - - g_object_set(G_OBJECT(pw->pr), "zoom_2pass", TRUE, NULL); + pw->imd = image_new(TRUE); + pw->imd_normal = pw->imd; - g_signal_connect(G_OBJECT(pw->pr), "zoom", + g_signal_connect(G_OBJECT(pw->imd->pr), "zoom", G_CALLBACK(pan_window_image_zoom_cb), pw); - g_signal_connect(G_OBJECT(pw->pr), "scroll_notify", + g_signal_connect(G_OBJECT(pw->imd->pr), "scroll_notify", G_CALLBACK(pan_window_image_scroll_notify_cb), pw); - gtk_table_attach(GTK_TABLE(table), GTK_WIDGET(pw->pr), 0, 1, 0, 1, + gtk_table_attach(GTK_TABLE(table), pw->imd->widget, 0, 1, 0, 1, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 0, 0); - gtk_widget_show(GTK_WIDGET(pw->pr)); + gtk_widget_show(GTK_WIDGET(pw->imd->widget)); pan_window_dnd_init(pw); - pan_image_set_buttons(pw, pw->pr); + pan_image_set_buttons(pw, pw->imd); pw->scrollbar_h = gtk_hscrollbar_new(NULL); g_signal_connect(G_OBJECT(pw->scrollbar_h), "value_changed", @@ -4405,9 +4391,7 @@ static void pan_window_new_real(const gchar *path) pan_window_layout_update_idle(pw); -#if 0 - gtk_widget_grab_focus(GTK_WIDGET(pw->pr)); -#endif + gtk_widget_grab_focus(GTK_WIDGET(pw->imd->widget)); gtk_widget_show(pw->window); pan_window_list = g_list_append(pan_window_list, pw); @@ -4548,21 +4532,21 @@ static void pan_zoom_in_cb(GtkWidget *widget, gpointer data) { PanWindow *pw = data; - pixbuf_renderer_zoom_adjust(pan_window_active_image(pw), ZOOM_INCREMENT); + image_zoom_adjust(pw->imd, ZOOM_INCREMENT); } static void pan_zoom_out_cb(GtkWidget *widget, gpointer data) { PanWindow *pw = data; - pixbuf_renderer_zoom_adjust(pan_window_active_image(pw), -ZOOM_INCREMENT); + image_zoom_adjust(pw->imd, -ZOOM_INCREMENT); } static void pan_zoom_1_1_cb(GtkWidget *widget, gpointer data) { PanWindow *pw = data; - pixbuf_renderer_zoom_set(pan_window_active_image(pw), 1.0); + image_zoom_set(pw->imd, 1.0); } static void pan_copy_cb(GtkWidget *widget, gpointer data) @@ -4571,7 +4555,7 @@ static void pan_copy_cb(GtkWidget *widget, gpointer data) const gchar *path; path = pan_menu_click_path(pw); - if (path) file_util_copy(path, NULL, NULL, GTK_WIDGET(pw->pr)); + if (path) file_util_copy(path, NULL, NULL, pw->imd->widget); } static void pan_move_cb(GtkWidget *widget, gpointer data) @@ -4580,7 +4564,7 @@ static void pan_move_cb(GtkWidget *widget, gpointer data) const gchar *path; path = pan_menu_click_path(pw); - if (path) file_util_move(path, NULL, NULL, GTK_WIDGET(pw->pr)); + if (path) file_util_move(path, NULL, NULL, pw->imd->widget); } static void pan_rename_cb(GtkWidget *widget, gpointer data) @@ -4589,7 +4573,7 @@ static void pan_rename_cb(GtkWidget *widget, gpointer data) const gchar *path; path = pan_menu_click_path(pw); - if (path) file_util_rename(path, NULL, GTK_WIDGET(pw->pr)); + if (path) file_util_rename(path, NULL, pw->imd->widget); } static void pan_delete_cb(GtkWidget *widget, gpointer data) @@ -4598,7 +4582,7 @@ static void pan_delete_cb(GtkWidget *widget, gpointer data) const gchar *path; path = pan_menu_click_path(pw); - if (path) file_util_delete(path, NULL, GTK_WIDGET(pw->pr)); + if (path) file_util_delete(path, NULL, pw->imd->widget); } static void pan_fullscreen_cb(GtkWidget *widget, gpointer data) @@ -4682,7 +4666,7 @@ static void pan_window_get_dnd_data(GtkWidget *widget, GdkDragContext *context, { PanWindow *pw = data; - if (gtk_drag_get_source_widget(context) == GTK_WIDGET(pw->pr)) return; + if (gtk_drag_get_source_widget(context) == pw->imd->pr) return; if (info == TARGET_URI_LIST) { @@ -4749,7 +4733,7 @@ static void pan_window_dnd_init(PanWindow *pw) { GtkWidget *widget; - widget = GTK_WIDGET(pw->pr); + widget = pw->imd->pr; gtk_drag_source_set(widget, GDK_BUTTON2_MASK, dnd_file_drag_types, dnd_file_drag_types_count, diff --git a/src/pixbuf-renderer.c b/src/pixbuf-renderer.c index 93347e0f..0a0dfd47 100644 --- a/src/pixbuf-renderer.c +++ b/src/pixbuf-renderer.c @@ -3019,6 +3019,59 @@ GdkPixbuf *pixbuf_renderer_get_pixbuf(PixbufRenderer *pr) return pr->pixbuf; } +void pixbuf_renderer_move(PixbufRenderer *pr, PixbufRenderer *source) +{ + GObject *object; + PixbufRendererScrollResetType scroll_reset; + + g_return_if_fail(IS_PIXBUF_RENDERER(pr)); + g_return_if_fail(IS_PIXBUF_RENDERER(source)); + + if (pr == source) return; + + object = G_OBJECT(pr); + + g_object_set(object, "zoom_min", source->zoom_min, NULL); + g_object_set(object, "zoom_max", source->zoom_max, NULL); + g_object_set(object, "loading", source->loading, NULL); + + pr->x_scroll = source->x_scroll; + pr->y_scroll = source->y_scroll; + + scroll_reset = pr->scroll_reset; + pr->scroll_reset = PR_SCROLL_RESET_NOCHANGE; + + if (source->source_tiles_enabled) + { + pr_source_tile_unset(pr); + + pr->source_tiles_enabled = source->source_tiles_enabled; + pr->source_tiles_cache_size = source->source_tiles_cache_size; + pr->source_tile_width = source->source_tile_width; + pr->source_tile_height = source->source_tile_height; + pr->image_width = source->image_width; + pr->image_height = source->image_height; + + pr->func_tile_request = source->func_tile_request; + pr->func_tile_dispose = source->func_tile_dispose; + pr->func_tile_data = source->func_tile_data; + + pr->source_tiles = source->source_tiles; + source->source_tiles = NULL; + + pr_zoom_sync(pr, pr->zoom, TRUE, FALSE, TRUE, FALSE, 0, 0); + pr_redraw(pr, TRUE); + } + else + { + pixbuf_renderer_set_pixbuf(pr, source->pixbuf, source->zoom); + } + + pr->scroll_reset = scroll_reset; + + pixbuf_renderer_set_pixbuf(source, NULL, source->zoom); +} + void pixbuf_renderer_area_changed(PixbufRenderer *pr, gint x, gint y, gint width, gint height) { gint sx, sy, sw, sh; diff --git a/src/pixbuf-renderer.h b/src/pixbuf-renderer.h index 7d2d2e48..900ac897 100644 --- a/src/pixbuf-renderer.h +++ b/src/pixbuf-renderer.h @@ -162,6 +162,10 @@ void pixbuf_renderer_set_tiles(PixbufRenderer *pr, gint width, gint height, gdouble zoom); gint pixbuf_renderer_get_tiles(PixbufRenderer *pr); +/* move image data from source to pr, source is then set to NULL image */ + +void pixbuf_renderer_move(PixbufRenderer *pr, PixbufRenderer *source); + /* update region of existing image */ void pixbuf_renderer_area_changed(PixbufRenderer *pr, gint x, gint y, gint width, gint height); -- 2.20.1