X-Git-Url: http://geeqie.org/cgi-bin/gitweb.cgi?p=geeqie.git;a=blobdiff_plain;f=src%2Flayout_image.c;h=091a75dd6250a70222e7145fc40e63444102556a;hp=33b8f199f358d9be14062a53f5cb8c16fcfd5330;hb=e826f76dba8d57420edcfcf4bf47612798aadfa7;hpb=f333692b5cb1214bfc7b5e890894c7cb8a7c49a0 diff --git a/src/layout_image.c b/src/layout_image.c index 33b8f199..091a75dd 100644 --- a/src/layout_image.c +++ b/src/layout_image.c @@ -1,7 +1,7 @@ /* * Geeqie * (C) 2006 John Ellis - * Copyright (C) 2008 - 2009 The Geeqie Team + * Copyright (C) 2008 - 2012 The Geeqie Team * * Author: John Ellis * @@ -33,6 +33,7 @@ #include "ui_menu.h" #include "uri_utils.h" #include "utilops.h" +#include "view_file.h" #include /* for keyboard values */ @@ -63,12 +64,8 @@ static void layout_image_full_screen_stop_func(FullScreenData *fs, gpointer data LayoutWindow *lw = data; /* restore image window */ - lw->image = fs->normal_imd; - - if (lw->slideshow) - { - lw->slideshow->imd = lw->image; - } + if (lw->image == fs->imd) + lw->image = fs->normal_imd; lw->full_screen = NULL; } @@ -83,12 +80,8 @@ void layout_image_full_screen_start(LayoutWindow *lw) layout_image_full_screen_stop_func, lw); /* set to new image window */ - lw->image = lw->full_screen->imd; - - if (lw->slideshow) - { - lw->slideshow->imd = lw->image; - } + if (lw->full_screen->same_region) + lw->image = lw->full_screen->imd; layout_image_set_buttons(lw); @@ -96,10 +89,6 @@ void layout_image_full_screen_start(LayoutWindow *lw) G_CALLBACK(layout_key_press_cb), lw); layout_actions_add_window(lw, lw->full_screen->window); -#if 0 - gtk_widget_set_sensitive(lw->window, FALSE); - if (lw->tools) gtk_widget_set_sensitive(lw->tools, FALSE); -#endif image_osd_copy_status(lw->full_screen->normal_imd, lw->image); } @@ -109,14 +98,10 @@ void layout_image_full_screen_stop(LayoutWindow *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); - -#if 0 - gtk_widget_set_sensitive(lw->window, TRUE); - if (lw->tools) gtk_widget_set_sensitive(lw->tools, TRUE); -#endif } void layout_image_full_screen_toggle(LayoutWindow *lw) @@ -175,12 +160,12 @@ void layout_image_slideshow_start(LayoutWindow *lw) if (cd && info) { - lw->slideshow = slideshow_start_from_collection(lw->image, cd, + lw->slideshow = slideshow_start_from_collection(lw, NULL, cd, layout_image_slideshow_stop_func, lw, info); } else { - lw->slideshow = slideshow_start(lw->image, lw, + lw->slideshow = slideshow_start(lw, layout_list_get_index(lw, layout_image_get_fd(lw)), layout_image_slideshow_stop_func, lw); } @@ -199,7 +184,7 @@ void layout_image_slideshow_start_from_list(LayoutWindow *lw, GList *list) return; } - lw->slideshow = slideshow_start_from_filelist(lw->image, list, + lw->slideshow = slideshow_start_from_filelist(lw, NULL, list, layout_image_slideshow_stop_func, lw); layout_status_update_info(lw, NULL); @@ -459,11 +444,10 @@ static gboolean li_check_if_current_path(LayoutWindow *lw, const gchar *path) static void layout_image_popup_menu_destroy_cb(GtkWidget *widget, gpointer data) { - LayoutWindow *lw = data; + GList *editmenu_fd_list = data; - filelist_free(lw->editmenu_fd_list); - lw->editmenu_fd_list = NULL; -} + filelist_free(editmenu_fd_list); +} static GList *layout_image_get_fd_list(LayoutWindow *lw) { @@ -471,7 +455,13 @@ static GList *layout_image_get_fd_list(LayoutWindow *lw) FileData *fd = layout_image_get_fd(lw); if (fd) - list = g_list_append(NULL, file_data_ref(fd)); + { + if (lw->vf) + /* optionally include sidecars if the filelist entry is not expanded */ + list = vf_selection_get_one(lw->vf, fd); + else + list = g_list_append(NULL, file_data_ref(fd)); + } return list; } @@ -483,13 +473,12 @@ static GtkWidget *layout_image_pop_menu(LayoutWindow *lw) GtkWidget *submenu; const gchar *path; gboolean fullscreen; + GList *editmenu_fd_list; path = layout_image_get_path(lw); fullscreen = layout_image_full_screen_active(lw); menu = popup_menu_short_lived(); - g_signal_connect(G_OBJECT(menu), "destroy", - G_CALLBACK(layout_image_popup_menu_destroy_cb), lw); menu_item_add_stock(menu, _("Zoom _in"), GTK_STOCK_ZOOM_IN, G_CALLBACK(li_pop_menu_zoom_in_cb), lw); menu_item_add_stock(menu, _("Zoom _out"), GTK_STOCK_ZOOM_OUT, G_CALLBACK(li_pop_menu_zoom_out_cb), lw); @@ -497,8 +486,10 @@ static GtkWidget *layout_image_pop_menu(LayoutWindow *lw) menu_item_add_stock(menu, _("Fit image to _window"), GTK_STOCK_ZOOM_FIT, G_CALLBACK(li_pop_menu_zoom_fit_cb), lw); menu_item_add_divider(menu); - lw->editmenu_fd_list = layout_image_get_fd_list(lw); - submenu = submenu_add_edit(menu, &item, G_CALLBACK(li_pop_menu_edit_cb), lw, lw->editmenu_fd_list); + editmenu_fd_list = layout_image_get_fd_list(lw); + g_signal_connect(G_OBJECT(menu), "destroy", + G_CALLBACK(layout_image_popup_menu_destroy_cb), editmenu_fd_list); + submenu = submenu_add_edit(menu, &item, G_CALLBACK(li_pop_menu_edit_cb), lw, editmenu_fd_list); if (!path) gtk_widget_set_sensitive(item, FALSE); menu_item_add_divider(submenu); menu_item_add(submenu, _("Set as _wallpaper"), G_CALLBACK(li_pop_menu_wallpaper_cb), lw); @@ -570,7 +561,7 @@ static void layout_image_menu_pos_cb(GtkMenu *menu, gint *x, gint *y, gboolean * { LayoutWindow *lw = data; - gdk_window_get_origin(lw->image->pr->window, x, y); + gdk_window_get_origin(gtk_widget_get_window(lw->image->pr), x, y); popup_menu_position_clamp(menu, x, y, 0); } @@ -605,7 +596,7 @@ static void layout_image_dnd_receive(GtkWidget *widget, GdkDragContext *context, if (i < MAX_SPLIT_IMAGES) { DEBUG_1("dnd image activate %d", i); - layout_image_activate(lw, i); + layout_image_activate(lw, i, FALSE); } @@ -617,13 +608,13 @@ static void layout_image_dnd_receive(GtkWidget *widget, GdkDragContext *context, if (info == TARGET_URI_LIST) { - list = uri_filelist_from_text((gchar *)selection_data->data, TRUE); + list = uri_filelist_from_gtk_selection_data(selection_data); source = NULL; info_list = NULL; } else { - source = collection_from_dnd_data((gchar *)selection_data->data, &list, &info_list); + source = collection_from_dnd_data((gchar *)gtk_selection_data_get_data(selection_data), &list, &info_list); } if (list) @@ -637,7 +628,7 @@ static void layout_image_dnd_receive(GtkWidget *widget, GdkDragContext *context, FileData *dir_fd; base = remove_level_from_path(fd->path); - dir_fd = file_data_new_simple(base); + dir_fd = file_data_new_dir(base); if (dir_fd != lw->dir_fd) { layout_set_fd(lw, dir_fd); @@ -695,34 +686,15 @@ static void layout_image_dnd_get(GtkWidget *widget, GdkDragContext *context, if (fd) { - gchar *text = NULL; - gint len; - gboolean plain_text; GList *list; - switch (info) - { - case TARGET_URI_LIST: - plain_text = FALSE; - break; - case TARGET_TEXT_PLAIN: - default: - plain_text = TRUE; - break; - } list = g_list_append(NULL, fd); - text = uri_text_from_filelist(list, &len, plain_text); + uri_selection_data_set_uris_from_filelist(selection_data, list); g_list_free(list); - if (text) - { - gtk_selection_data_set(selection_data, selection_data->target, - 8, (guchar *)text, len); - g_free(text); - } } else { - gtk_selection_data_set(selection_data, selection_data->target, + gtk_selection_data_set(selection_data, gtk_selection_data_get_target(selection_data), 8, NULL, 0); } } @@ -730,7 +702,7 @@ static void layout_image_dnd_get(GtkWidget *widget, GdkDragContext *context, static void layout_image_dnd_end(GtkWidget *widget, GdkDragContext *context, gpointer data) { LayoutWindow *lw = data; - if (context->action == GDK_ACTION_MOVE) + if (gdk_drag_context_get_selected_action(context) == GDK_ACTION_MOVE) { FileData *fd; gint row; @@ -800,6 +772,11 @@ void layout_image_scroll(LayoutWindow *lw, gint x, gint y, gboolean connect_scro 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); @@ -827,6 +804,11 @@ void layout_image_zoom_adjust(LayoutWindow *lw, gdouble increment, gboolean conn 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++) @@ -843,6 +825,11 @@ void layout_image_zoom_adjust_at_point(LayoutWindow *lw, gdouble increment, gint 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++) @@ -859,6 +846,11 @@ void layout_image_zoom_set(LayoutWindow *lw, gdouble zoom, gboolean connect_zoom 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++) @@ -875,6 +867,11 @@ void layout_image_zoom_set_fill_geometry(LayoutWindow *lw, gboolean vertical, gb 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++) @@ -905,7 +902,42 @@ gboolean layout_image_get_desaturate(LayoutWindow *lw) return image_get_desaturate(lw->image); } +/* stereo */ +/* +gint layout_image_stereo_get(LayoutWindow *lw) +{ + if (!layout_valid(&lw)) return 0; + return image_stereo_get(lw->image); +} + +void layout_image_stereo_set(LayoutWindow *lw, gint stereo_mode) +{ + if (!layout_valid(&lw)) return; + + image_stereo_set(lw->image, stereo_mode); +} +void layout_image_stereo_swap(LayoutWindow *lw) +{ + if (!layout_valid(&lw)) return; + + image_stereo_swap(lw->image); +} +*/ + +gint layout_image_stereo_pixbuf_get(LayoutWindow *lw) +{ + if (!layout_valid(&lw)) return 0; + + return image_stereo_pixbuf_get(lw->image); +} + +void layout_image_stereo_pixbuf_set(LayoutWindow *lw, gint stereo_mode) +{ + if (!layout_valid(&lw)) return; + + image_stereo_pixbuf_set(lw->image, stereo_mode); +} const gchar *layout_image_get_path(LayoutWindow *lw) { @@ -952,6 +984,12 @@ void layout_image_set_fd(LayoutWindow *lw, FileData *fd) 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); @@ -1345,7 +1383,7 @@ static void layout_image_focus_in_cb(ImageWindow *imd, gpointer data) if (i != -1) { DEBUG_1("image activate focus_in %d", i); - layout_image_activate(lw, i); + layout_image_activate(lw, i, FALSE); } } @@ -1387,7 +1425,7 @@ static void layout_image_scroll_cb(ImageWindow *imd, GdkEventScroll *event, gpoi if (i != -1) { DEBUG_1("image activate scroll %d", i); - layout_image_activate(lw, i); + layout_image_activate(lw, i, FALSE); } @@ -1445,6 +1483,23 @@ static void layout_image_drag_cb(ImageWindow *imd, GdkEventButton *event, gdoubl { gint i; LayoutWindow *lw = data; + gdouble sx, sy; + + if (lw->full_screen && lw->image != lw->full_screen->imd && + imd != lw->full_screen->imd) + { + if (event->state & GDK_CONTROL_MASK) + { + image_get_scroll_center(imd, &sx, &sy); + } + else + { + image_get_scroll_center(lw->full_screen->imd, &sx, &sy); + sx += dx; + sy += dy; + } + image_set_scroll_center(lw->full_screen->imd, sx, sy); + } if (!(event->state & GDK_SHIFT_MASK)) return; @@ -1452,7 +1507,6 @@ static void layout_image_drag_cb(ImageWindow *imd, GdkEventButton *event, gdoubl { if (lw->split_images[i] && lw->split_images[i] != imd) { - gdouble sx, sy; if (event->state & GDK_CONTROL_MASK) { @@ -1477,7 +1531,7 @@ static void layout_image_button_inactive_cb(ImageWindow *imd, GdkEventButton *ev if (i != -1) { - layout_image_activate(lw, i); + layout_image_activate(lw, i, FALSE); } switch (event->button) @@ -1503,7 +1557,7 @@ static void layout_image_drag_inactive_cb(ImageWindow *imd, GdkEventButton *even if (i != -1) { - layout_image_activate(lw, i); + layout_image_activate(lw, i, FALSE); } /* continue as with active image */ @@ -1601,11 +1655,7 @@ GtkWidget *layout_image_new(LayoutWindow *lw, gint i) { lw->split_images[i] = image_new(TRUE); -#if GTK_CHECK_VERSION(2,12,0) g_object_ref(lw->split_images[i]->widget); -#else - gtk_widget_ref(lw->split_images[i]->widget); -#endif g_signal_connect(G_OBJECT(lw->split_images[i]->pr), "update-pixel", G_CALLBACK(layout_status_update_pixel_cb), lw); @@ -1641,12 +1691,13 @@ void layout_image_deactivate(LayoutWindow *lw, gint i) image_select(lw->split_images[i], FALSE); } - -void layout_image_activate(LayoutWindow *lw, gint i) +/* force should be set after change of lw->split_mode */ +void layout_image_activate(LayoutWindow *lw, gint i, gboolean force) { FileData *fd; if (!lw->split_images[i]) return; + if (!force && lw->active_split_image == i) return; /* deactivate currently active */ if (lw->active_split_image != i) @@ -1676,12 +1727,13 @@ void layout_image_activate(LayoutWindow *lw, gint i) // layout_list_sync_path(lw, path); layout_set_fd(lw, fd); } + layout_status_update_image(lw); } static void layout_image_setup_split_common(LayoutWindow *lw, gint n) { - gboolean frame = (n == 1) ? (!lw->options.tools_float && !lw->options.tools_hidden) : 1; + gboolean frame = (n > 1) || (!lw->options.tools_float && !lw->options.tools_hidden); gint i; for (i = 0; i < n; i++) @@ -1692,7 +1744,7 @@ static void layout_image_setup_split_common(LayoutWindow *lw, gint n) layout_image_new(lw, i); image_set_frame(lw->split_images[i], frame); - image_set_selectable(lw->split_images[i], 1); + image_set_selectable(lw->split_images[i], (n > 1)); if (lw->image) { @@ -1735,31 +1787,27 @@ static void layout_image_setup_split_common(LayoutWindow *lw, gint n) else { image_set_frame(lw->split_images[i], frame); - image_set_selectable(lw->split_images[i], 1); + image_set_selectable(lw->split_images[i], (n > 1)); } for (i = n; i < MAX_SPLIT_IMAGES; i++) { if (lw->split_images[i]) { -#if GTK_CHECK_VERSION(2,12,0) g_object_unref(lw->split_images[i]->widget); -#else - gtk_widget_unref(lw->split_images[i]->widget); -#endif lw->split_images[i] = NULL; } } if (!lw->image || lw->active_split_image < 0 || lw->active_split_image >= n) { - layout_image_activate(lw, 0); + layout_image_activate(lw, 0, TRUE); } else { /* this will draw the frame around selected image (image_select) on switch from single to split images */ - layout_image_activate(lw, lw->active_split_image); + layout_image_activate(lw, lw->active_split_image, TRUE); } } @@ -1888,9 +1936,11 @@ static void layout_image_maint_removed(LayoutWindow *lw, FileData *fd) layout_image_set_collection(lw, cd, new); return; } + layout_image_set_fd(lw, NULL); } - - layout_image_set_fd(lw, NULL); + + /* the image will be set to the next image from the list soon, + setting it to NULL here is not necessary*/ } }