Mercurial > hg > forks > geeqie
changeset 2099:cd445a64205f
implemented presentation mode
This is first version of presentation mode. It basically works
but the current caching and preload algorithms do not work well
with it.
author | Vladimir Nadvornik <nadvornik@suse.cz> |
---|---|
date | Mon, 20 Aug 2012 22:42:33 +0200 |
parents | 6e1d3aafb7c3 |
children | b2d8adb561e3 f32b6969ac46 |
files | src/fullscreen.c src/image.c src/image.h src/layout_image.c src/pixbuf-renderer.c src/pixbuf-renderer.h src/typedefs.h |
diffstat | 7 files changed, 197 insertions(+), 21 deletions(-) [+] |
line wrap: on
line diff
--- a/src/fullscreen.c Mon Aug 20 18:29:31 2012 +0200 +++ b/src/fullscreen.c Mon Aug 20 22:42:33 2012 +0200 @@ -211,7 +211,6 @@ { FullScreenData *fs; GdkScreen *screen; - gboolean same; gint x, y; gint w, h; GdkGeometry geometry; @@ -231,7 +230,7 @@ DEBUG_1("full screen requests screen %d", options->fullscreen.screen); fullscreen_prefs_get_geometry(options->fullscreen.screen, window, &x, &y, &w, &h, - &screen, &same); + &screen, &fs->same_region); fs->window = window_new(GTK_WINDOW_TOPLEVEL, "fullscreen", NULL, NULL, _("Full screen")); @@ -300,7 +299,16 @@ gtk_widget_show(fs->imd->widget); - image_change_from_image(fs->imd, fs->normal_imd); + if (fs->same_region) + { + DEBUG_0("Original vindow is not visible, enabling std. fullscreen mode"); + image_move_from_image(fs->imd, fs->normal_imd); + } + else + { + DEBUG_0("Original vindow is still visible, enabling presentation fullscreen mode"); + image_copy_from_image(fs->imd, fs->normal_imd); + } if (options->stereo.enable_fsmode) { image_stereo_set(fs->imd, options->stereo.fsmode); @@ -319,10 +327,13 @@ /* hide normal window * FIXME: properly restore this window on show */ + if (fs->same_region) + { #ifdef HIDE_WINDOW_IN_FULLSCREEN - gtk_widget_hide(fs->normal_window); + gtk_widget_hide(fs->normal_window); #endif - image_change_fd(fs->normal_imd, NULL, image_zoom_get(fs->normal_imd)); + image_change_fd(fs->normal_imd, NULL, image_zoom_get(fs->normal_imd)); + } return fs; } @@ -337,15 +348,19 @@ fullscreen_busy_mouse_disable(fs); gdk_keyboard_ungrab(GDK_CURRENT_TIME); - image_change_from_image(fs->normal_imd, fs->imd); + if (fs->same_region) + { + image_move_from_image(fs->normal_imd, fs->imd); +#ifdef HIDE_WINDOW_IN_FULLSCREEN + gtk_widget_show(fs->normal_window); +#endif + if (options->stereo.enable_fsmode) + { + image_stereo_set(fs->normal_imd, options->stereo.mode); + } + } - if (options->stereo.enable_fsmode) { - image_stereo_set(fs->normal_imd, options->stereo.mode); - } -#ifdef HIDE_WINDOW_IN_FULLSCREEN - gtk_widget_show(fs->normal_window); -#endif if (fs->stop_func) fs->stop_func(fs, fs->stop_data); gtk_widget_destroy(fs->window);
--- a/src/image.c Mon Aug 20 18:29:31 2012 +0200 +++ b/src/image.c Mon Aug 20 22:42:33 2012 +0200 @@ -1166,7 +1166,7 @@ /* this is more like a move function * it moves most data from source to imd */ -void image_change_from_image(ImageWindow *imd, ImageWindow *source) +void image_move_from_image(ImageWindow *imd, ImageWindow *source) { if (imd == source) return; @@ -1197,6 +1197,60 @@ imd->color_profile_use_image = source->color_profile_use_image; color_man_free((ColorMan *)imd->cm); imd->cm = NULL; +#if 0 + if (source->cm) + { + ColorMan *cm; + + imd->cm = source->cm; + source->cm = NULL; + + cm = (ColorMan *)imd->cm; + cm->imd = imd; + cm->func_done_data = imd; + } +#endif + + file_data_unref(imd->read_ahead_fd); + source->read_ahead_fd = NULL; + + imd->orientation = source->orientation; + imd->desaturate = source->desaturate; + + imd->user_stereo = source->user_stereo; + + pixbuf_renderer_move(PIXBUF_RENDERER(imd->pr), PIXBUF_RENDERER(source->pr)); + + if (imd->cm || imd->desaturate) + pixbuf_renderer_set_post_process_func((PixbufRenderer *)imd->pr, image_post_process_tile_color_cb, (gpointer) imd, (imd->cm != NULL) ); + else + pixbuf_renderer_set_post_process_func((PixbufRenderer *)imd->pr, NULL, NULL, TRUE); + +} + +/* this is a copy function + * source stays unchanged + */ +void image_copy_from_image(ImageWindow *imd, ImageWindow *source) +{ + if (imd == source) return; + + imd->unknown = source->unknown; + + imd->collection = source->collection; + imd->collection_info = source->collection_info; + + image_loader_free(imd->il); + imd->il = NULL; + + image_set_fd(imd, image_get_fd(source)); + + + imd->color_profile_enable = source->color_profile_enable; + imd->color_profile_input = source->color_profile_input; + imd->color_profile_use_image = source->color_profile_use_image; + color_man_free((ColorMan *)imd->cm); + imd->cm = NULL; if (source->cm) { ColorMan *cm; @@ -1227,7 +1281,7 @@ imd->user_stereo = source->user_stereo; - pixbuf_renderer_move(PIXBUF_RENDERER(imd->pr), PIXBUF_RENDERER(source->pr)); + pixbuf_renderer_copy(PIXBUF_RENDERER(imd->pr), PIXBUF_RENDERER(source->pr)); if (imd->cm || imd->desaturate) pixbuf_renderer_set_post_process_func((PixbufRenderer *)imd->pr, image_post_process_tile_color_cb, (gpointer) imd, (imd->cm != NULL) ); @@ -1236,6 +1290,7 @@ } + /* manipulation */ void image_area_changed(ImageWindow *imd, gint x, gint y, gint width, gint height)
--- a/src/image.h Mon Aug 20 18:29:31 2012 +0200 +++ b/src/image.h Mon Aug 20 22:42:33 2012 +0200 @@ -63,7 +63,8 @@ void image_change_pixbuf(ImageWindow *imd, GdkPixbuf *pixbuf, gdouble zoom, gboolean lazy); void image_change_from_collection(ImageWindow *imd, CollectionData *cd, CollectInfo *info, gdouble zoom); CollectionData *image_get_collection(ImageWindow *imd, CollectInfo **info); -void image_change_from_image(ImageWindow *imd, ImageWindow *source); +void image_copy_from_image(ImageWindow *imd, ImageWindow *source); +void image_movee_from_image(ImageWindow *imd, ImageWindow *source); gboolean image_get_image_size(ImageWindow *imd, gint *width, gint *height); GdkPixbuf *image_get_pixbuf(ImageWindow *imd);
--- a/src/layout_image.c Mon Aug 20 18:29:31 2012 +0200 +++ b/src/layout_image.c Mon Aug 20 22:42:33 2012 +0200 @@ -64,7 +64,8 @@ LayoutWindow *lw = data; /* restore image window */ - lw->image = fs->normal_imd; + if (lw->image == fs->imd) + lw->image = fs->normal_imd; lw->full_screen = NULL; } @@ -79,7 +80,8 @@ layout_image_full_screen_stop_func, lw); /* set to new image window */ - lw->image = lw->full_screen->imd; + if (lw->full_screen->same_region) + lw->image = lw->full_screen->imd; layout_image_set_buttons(lw); @@ -100,7 +102,8 @@ if (!layout_valid(&lw)) return; if (!lw->full_screen) return; - image_osd_copy_status(lw->image, lw->full_screen->normal_imd); + if (lw->image == lw->full_screen->imd) + image_osd_copy_status(lw->image, lw->full_screen->normal_imd); fullscreen_stop(lw->full_screen); @@ -780,6 +783,11 @@ image_scroll(lw->image, x, y); + if (lw->full_screen && lw->image != lw->full_screen->imd) + { + image_scroll(lw->full_screen->imd, x, y); + } + if (!connect_scroll) return; image_get_image_size(lw->image, &width, &height); @@ -807,6 +815,11 @@ image_zoom_adjust(lw->image, increment); + if (lw->full_screen && lw->image != lw->full_screen->imd) + { + image_zoom_adjust(lw->full_screen->imd, increment); + } + if (!connect_zoom) return; for (i = 0; i < MAX_SPLIT_IMAGES; i++) @@ -823,6 +836,11 @@ image_zoom_adjust_at_point(lw->image, increment, x, y); + if (lw->full_screen && lw->image != lw->full_screen->imd) + { + image_zoom_adjust_at_point(lw->full_screen->imd, increment, x, y); + } + if (!connect_zoom) return; for (i = 0; i < MAX_SPLIT_IMAGES; i++) @@ -839,6 +857,11 @@ image_zoom_set(lw->image, zoom); + if (lw->full_screen && lw->image != lw->full_screen->imd) + { + image_zoom_set(lw->full_screen->imd, zoom); + } + if (!connect_zoom) return; for (i = 0; i < MAX_SPLIT_IMAGES; i++) @@ -855,6 +878,11 @@ image_zoom_set_fill_geometry(lw->image, vertical); + if (lw->full_screen && lw->image != lw->full_screen->imd) + { + image_zoom_set_fill_geometry(lw->full_screen->imd, vertical); + } + if (!connect_zoom) return; for (i = 0; i < MAX_SPLIT_IMAGES; i++) @@ -967,6 +995,12 @@ image_change_fd(lw->image, fd, image_zoom_get_default(lw->image)); + if (lw->full_screen && lw->image != lw->full_screen->imd) + { + image_change_fd(lw->full_screen->imd, fd, image_zoom_get_default(lw->full_screen->imd)); + } + + layout_list_sync_fd(lw, fd); layout_image_slideshow_continue_check(lw); layout_bars_new_image(lw); @@ -1460,6 +1494,22 @@ { gint i; LayoutWindow *lw = data; + gdouble sx, sy; + + if (lw->full_screen && lw->image != lw->full_screen->imd) + { + if (event->state & GDK_CONTROL_MASK) + { + image_get_scroll_center(imd, &sx, &sy); + } + else + { + image_get_scroll_center(lw->split_images[i], &sx, &sy); + sx += dx; + sy += dy; + } + image_set_scroll_center(lw->full_screen->imd, sx, sy); + } if (!(event->state & GDK_SHIFT_MASK)) return; @@ -1467,7 +1517,6 @@ { if (lw->split_images[i] && lw->split_images[i] != imd) { - gdouble sx, sy; if (event->state & GDK_CONTROL_MASK) {
--- a/src/pixbuf-renderer.c Mon Aug 20 18:29:31 2012 +0200 +++ b/src/pixbuf-renderer.c Mon Aug 20 22:42:33 2012 +0200 @@ -2495,8 +2495,61 @@ pr->scroll_reset = scroll_reset; pixbuf_renderer_set_pixbuf(source, NULL, source->zoom); -// pr_queue_clear(source); -// pr_tile_free_all(source); +} + +void pixbuf_renderer_copy(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->complete = source->complete; + + pr->x_scroll = source->x_scroll; + pr->y_scroll = source->y_scroll; + pr->x_mouse = source->x_mouse; + pr->y_mouse = source->y_mouse; + + scroll_reset = pr->scroll_reset; + pr->scroll_reset = PR_SCROLL_RESET_NOCHANGE; + + pr->orientation = source->orientation; + pr->stereo_data = source->stereo_data; + + if (source->source_tiles_enabled) + { + 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, source->zoom, PR_ZOOM_FORCE | PR_ZOOM_NEW, 0, 0); + } + else + { + pixbuf_renderer_set_pixbuf(pr, source->pixbuf, source->zoom); + } + + pr->scroll_reset = scroll_reset; } void pixbuf_renderer_area_changed(PixbufRenderer *pr, gint x, gint y, gint w, gint h)
--- a/src/pixbuf-renderer.h Mon Aug 20 18:29:31 2012 +0200 +++ b/src/pixbuf-renderer.h Mon Aug 20 22:42:33 2012 +0200 @@ -262,6 +262,7 @@ /* move image data from source to pr, source is then set to NULL image */ void pixbuf_renderer_move(PixbufRenderer *pr, PixbufRenderer *source); +void pixbuf_renderer_copy(PixbufRenderer *pr, PixbufRenderer *source); /* update region of existing image */
--- a/src/typedefs.h Mon Aug 20 18:29:31 2012 +0200 +++ b/src/typedefs.h Mon Aug 20 22:42:33 2012 +0200 @@ -868,6 +868,8 @@ void (*stop_func)(FullScreenData *, gpointer); gpointer stop_data; + + gboolean same_region; /* the returned region will overlap the current location of widget. */ }; struct _PixmapFolders