{
FullScreenData *fs;
GdkScreen *screen;
- gboolean same;
gint x, y;
gint w, h;
GdkGeometry geometry;
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"));
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);
/* 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;
}
fullscreen_busy_mouse_disable(fs);
gdk_keyboard_ungrab(GDK_CURRENT_TIME);
- image_change_from_image(fs->normal_imd, fs->imd);
-
- if (options->stereo.enable_fsmode) {
- image_stereo_set(fs->normal_imd, options->stereo.mode);
- }
-
+ if (fs->same_region)
+ {
+ image_move_from_image(fs->normal_imd, fs->imd);
#ifdef HIDE_WINDOW_IN_FULLSCREEN
- gtk_widget_show(fs->normal_window);
+ gtk_widget_show(fs->normal_window);
#endif
+ if (options->stereo.enable_fsmode)
+ {
+ image_stereo_set(fs->normal_imd, options->stereo.mode);
+ }
+ }
+
+
if (fs->stop_func) fs->stop_func(fs, fs->stop_data);
gtk_widget_destroy(fs->window);
/* 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;
source->delay_alter_type = ALTER_NONE;
}
+ 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 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;
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) );
}
+
/* manipulation */
void image_area_changed(ImageWindow *imd, gint x, gint y, gint width, gint height)
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);
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;
}
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);
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);
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);
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++)
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++)
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++)
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++)
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);
{
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;
{
if (lw->split_images[i] && lw->split_images[i] != imd)
{
- gdouble sx, sy;
if (event->state & GDK_CONTROL_MASK)
{
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)
/* 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 */
void (*stop_func)(FullScreenData *, gpointer);
gpointer stop_data;
+
+ gboolean same_region; /* the returned region will overlap the current location of widget. */
};
struct _PixmapFolders