Trim trailing white spaces on empty lines.
[geeqie.git] / src / pan-view.c
index 80b6ed2..2328756 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Geeqie
  * (C) 2006 John Ellis
- * Copyright (C) 2008 The Geeqie Team
+ * Copyright (C) 2008 - 2012 The Geeqie Team
  *
  * Author: John Ellis
  *
 #include "dnd.h"
 #include "editors.h"
 #include "exif.h"
+#include "metadata.h"
 #include "fullscreen.h"
 #include "history_list.h"
 #include "img-view.h"
-#include "info.h"
 #include "menu.h"
 #include "misc.h"
 #include "pan-types.h"
@@ -60,9 +60,9 @@ static GList *pan_window_list = NULL;
 
 static void pan_layout_update_idle(PanWindow *pw);
 
-static void pan_fullscreen_toggle(PanWindow *pw, gint force_off);
+static void pan_fullscreen_toggle(PanWindow *pw, gboolean force_off);
 
-static void pan_search_toggle_visible(PanWindow *pw, gint enable);
+static void pan_search_toggle_visible(PanWindow *pw, gboolean enable);
 static void pan_search_activate(PanWindow *pw);
 
 static void pan_window_close(PanWindow *pw);
@@ -78,7 +78,7 @@ static void pan_window_dnd_init(PanWindow *pw);
  *-----------------------------------------------------------------------------
  */
 
-static gint pan_queue_step(PanWindow *pw);
+static gboolean pan_queue_step(PanWindow *pw);
 
 
 static void pan_queue_thumb_done_cb(ThumbLoader *tl, gpointer data)
@@ -150,33 +150,7 @@ static void pan_queue_image_done_cb(ImageLoader *il, gpointer data)
        while (pan_queue_step(pw));
 }
 
-#if 0
-static void pan_queue_image_area_cb(ImageLoader *il, guint x, guint y,
-                                   guint width, guint height, gpointer data)
-{
-       PanWindow *pw = data;
-
-       if (pw->queue_pi)
-               {
-               PanItem *pi;
-               gint rc;
-
-               pi = pw->queue_pi;
-
-               if (!pi->pixbuf)
-                       {
-                       pi->pixbuf = image_loader_get_pixbuf(pw->il);
-                       if (pi->pixbuf) g_object_ref(pi->pixbuf);
-                       }
-
-               rc = pi->refcount;
-               image_area_changed(pw->imd, pi->x + x, pi->y + y, width, height);
-               pi->refcount = rc;
-               }
-}
-#endif
-
-static gint pan_queue_step(PanWindow *pw)
+static gboolean pan_queue_step(PanWindow *pw)
 {
        PanItem *pi;
 
@@ -207,11 +181,8 @@ static gint pan_queue_step(PanWindow *pw)
                        image_loader_set_requested_size(pw->il, pi->width, pi->height);
                        }
 
-#if 0
-               image_loader_set_area_ready_func(pw->il, pan_queue_image_area_cb, pw);
-#endif
-               g_signal_connect (G_OBJECT(pw->il), "error", (GCallback)pan_queue_image_done_cb, pw);
-               g_signal_connect (G_OBJECT(pw->il), "done", (GCallback)pan_queue_image_done_cb, pw);
+               g_signal_connect(G_OBJECT(pw->il), "error", (GCallback)pan_queue_image_done_cb, pw);
+               g_signal_connect(G_OBJECT(pw->il), "done", (GCallback)pan_queue_image_done_cb, pw);
 
                if (image_loader_start(pw->il)) return FALSE;
 
@@ -269,8 +240,8 @@ static void pan_queue_add(PanWindow *pw, PanItem *pi)
  *-----------------------------------------------------------------------------
  */
 
-static gint pan_window_request_tile_cb(PixbufRenderer *pr, gint x, gint y,
-                                      gint width, gint height, GdkPixbuf *pixbuf, gpointer data)
+static gboolean pan_window_request_tile_cb(PixbufRenderer *pr, gint x, gint y,
+                                          gint width, gint height, GdkPixbuf *pixbuf, gpointer data)
 {
        PanWindow *pw = data;
        GList *list;
@@ -313,7 +284,7 @@ static gint pan_window_request_tile_cb(PixbufRenderer *pr, gint x, gint y,
        while (work)
                {
                PanItem *pi;
-               gint queue = FALSE;
+               gboolean queue = FALSE;
 
                pi = work->data;
                work = work->next;
@@ -347,26 +318,6 @@ static gint pan_window_request_tile_cb(PixbufRenderer *pr, gint x, gint y,
 
        g_list_free(list);
 
-#if 0
-       if (x%512 == 0 && y%512 == 0)
-               {
-               PangoLayout *layout;
-               gchar *buf;
-
-               layout = gtk_widget_create_pango_layout((GtkWidget *)pr, NULL);
-
-               buf = g_strdup_printf("%d,%d\n(#%d)", x, y,
-                                     (x / pr->source_tile_width) +
-                                     (y / pr->source_tile_height * (pr->image_width/pr->source_tile_width + 1)));
-               pango_layout_set_text(layout, buf, -1);
-               g_free(buf);
-
-               pixbuf_draw_layout(pixbuf, layout, (GtkWidget *)pr, 0, 0, 0, 0, 0, 255);
-
-               g_object_unref(G_OBJECT(layout));
-               }
-#endif
-
        return TRUE;
 }
 
@@ -531,7 +482,7 @@ static gint pan_cache_sort_file_cb(gpointer a, gpointer b)
        PanCacheData *pcb = b;
        return filelist_sort_compare_filedata(pca->fd, pcb->fd);
 }
-GList *pan_cache_sort(GList *list, SortType method, gint ascend)
+GList *pan_cache_sort(GList *list, SortType method, gboolean ascend)
 {
        return filelist_sort_full(list, method, ascend, (GCompareFunc) pan_cache_sort_file_cb);
 }
@@ -602,7 +553,7 @@ static void pan_cache_step_done_cb(CacheLoader *cl, gint error, gpointer data)
        pan_layout_update_idle(pw);
 }
 
-static gint pan_cache_step(PanWindow *pw)
+static gboolean pan_cache_step(PanWindow *pw)
 {
        FileData *fd;
        PanCacheData *pc;
@@ -613,46 +564,6 @@ static gint pan_cache_step(PanWindow *pw)
        fd = pw->cache_todo->data;
        pw->cache_todo = g_list_remove(pw->cache_todo, fd);
 
-#if 0
-       if (enable_thumb_caching)
-               {
-               gchar *found;
-
-               found = cache_find_location(CACHE_TYPE_SIM, fd->path);
-               if (found && filetime(found) == fd->date)
-                       {
-                       cd = cache_sim_data_load(found);
-                       }
-               g_free(found);
-               }
-
-       if (!cd) cd = cache_sim_data_new();
-
-       if (!cd->dimensions)
-               {
-               cd->dimensions = image_load_dimensions(fd, &cd->width, &cd->height);
-               if (enable_thumb_caching &&
-                   cd->dimensions)
-                       {
-                       gchar *base;
-                       mode_t mode = 0755;
-
-                       base = cache_get_location(CACHE_TYPE_SIM, fd->path, FALSE, &mode);
-                       if (recursive_mkdir_if_not_exists(base, mode))
-                               {
-                               g_free(cd->path);
-                               cd->path = cache_get_location(CACHE_TYPE_SIM, fd->path, TRUE, NULL);
-                               if (cache_sim_data_save(cd))
-                                       {
-                                       filetime_set(cd->path, filetime(fd->path));
-                                       }
-                               }
-                       g_free(base);
-                       }
-
-               pw->cache_tick = 9;
-               }
-#endif
        pc = g_new0(PanCacheData, 1);
        pc->fd = file_data_ref(fd);
 
@@ -748,9 +659,6 @@ static void pan_grid_build(PanWindow *pw, gint width, gint height, gint grid_siz
        gint col, row;
        gint cw, ch;
        gint l;
-       gdouble total;
-       gdouble s;
-       gdouble aw, ah;
        gint i, j;
 
        pan_grid_clear(pw);
@@ -759,12 +667,6 @@ static void pan_grid_build(PanWindow *pw, gint width, gint height, gint grid_siz
 
        if (l < 1) return;
 
-       total = (gdouble)width * (gdouble)height / (gdouble)l;
-       s = sqrt(total);
-
-       aw = (gdouble)width / s;
-       ah = (gdouble)height / s;
-
        col = (gint)(sqrt((gdouble)l / grid_size) * width / height + 0.999);
        col = CLAMP(col, 1, l / grid_size + 1);
        row = (gint)((gdouble)l / grid_size / col);
@@ -791,7 +693,6 @@ static void pan_grid_build(PanWindow *pw, gint width, gint height, gint grid_siz
                        pg->y = j * ch / 2;
                        pg->w = cw;
                        pg->h = ch;
-                       pg->list = NULL;
 
                        pw->list_grid = g_list_prepend(pw->list_grid, pg);
 
@@ -1108,7 +1009,7 @@ static gint pan_layout_update_idle_cb(gpointer data)
 
                        if (pan_cache_step(pw)) return TRUE;
 
-                       pw->idle_id = -1;
+                       pw->idle_id = 0;
                        return FALSE;
                        }
                }
@@ -1143,13 +1044,13 @@ static gint pan_layout_update_idle_cb(gpointer data)
 
        pan_window_message(pw, NULL);
 
-       pw->idle_id = -1;
+       pw->idle_id = 0;
        return FALSE;
 }
 
 static void pan_layout_update_idle(PanWindow *pw)
 {
-       if (pw->idle_id == -1)
+       if (!pw->idle_id)
                {
                pw->idle_id = g_idle_add(pan_layout_update_idle_cb, pw);
                }
@@ -1194,17 +1095,18 @@ static void pan_window_menu_pos_cb(GtkMenu *menu, gint *x, gint *y, gboolean *pu
 {
        PanWindow *pw = data;
 
-       gdk_window_get_origin(pw->imd->pr->window, x, y);
+       gdk_window_get_origin(gtk_widget_get_window(pw->imd->pr), x, y);
        popup_menu_position_clamp(menu, x, y, 0);
 }
 
-static gint pan_window_key_press_cb(GtkWidget *widget, GdkEventKey *event, gpointer data)
+static gboolean pan_window_key_press_cb(GtkWidget *widget, GdkEventKey *event, gpointer data)
 {
        PanWindow *pw = data;
        PixbufRenderer *pr;
        FileData *fd;
-       gint stop_signal = FALSE;
+       gboolean stop_signal = FALSE;
        GtkWidget *menu;
+       GtkWidget *imd_widget;
        gint x = 0;
        gint y = 0;
        gint focused;
@@ -1213,37 +1115,38 @@ static gint pan_window_key_press_cb(GtkWidget *widget, GdkEventKey *event, gpoin
        pr = PIXBUF_RENDERER(pw->imd->pr);
        fd = pan_menu_click_fd(pw);
 
-       focused = (pw->fs || GTK_WIDGET_HAS_FOCUS(GTK_WIDGET(pw->imd->widget)));
-       on_entry = (GTK_WIDGET_HAS_FOCUS(pw->path_entry) ||
-                   GTK_WIDGET_HAS_FOCUS(pw->search_entry));
+       imd_widget = gtk_container_get_focus_child(GTK_CONTAINER(pw->imd->widget));
+       focused = (pw->fs || (imd_widget && gtk_widget_has_focus(imd_widget)));
+       on_entry = (gtk_widget_has_focus(pw->path_entry) ||
+                   gtk_widget_has_focus(pw->search_entry));
 
        if (focused)
                {
                stop_signal = TRUE;
                switch (event->keyval)
                        {
-                       case GDK_Left: case GDK_KP_Left:
+                       case GDK_KEY_Left: case GDK_KEY_KP_Left:
                                x -= 1;
                                break;
-                       case GDK_Right: case GDK_KP_Right:
+                       case GDK_KEY_Right: case GDK_KEY_KP_Right:
                                x += 1;
                                break;
-                       case GDK_Up: case GDK_KP_Up:
+                       case GDK_KEY_Up: case GDK_KEY_KP_Up:
                                y -= 1;
                                break;
-                       case GDK_Down: case GDK_KP_Down:
+                       case GDK_KEY_Down: case GDK_KEY_KP_Down:
                                y += 1;
                                break;
-                       case GDK_Page_Up: case GDK_KP_Page_Up:
+                       case GDK_KEY_Page_Up: case GDK_KEY_KP_Page_Up:
                                pixbuf_renderer_scroll(pr, 0, 0 - pr->vis_height / 2);
                                break;
-                       case GDK_Page_Down: case GDK_KP_Page_Down:
+                       case GDK_KEY_Page_Down: case GDK_KEY_KP_Page_Down:
                                pixbuf_renderer_scroll(pr, 0, pr->vis_height / 2);
                                break;
-                       case GDK_Home: case GDK_KP_Home:
+                       case GDK_KEY_Home: case GDK_KEY_KP_Home:
                                pixbuf_renderer_scroll(pr, 0 - pr->vis_width / 2, 0);
                                break;
-                       case GDK_End: case GDK_KP_End:
+                       case GDK_KEY_End: case GDK_KEY_KP_End:
                                pixbuf_renderer_scroll(pr, pr->vis_width / 2, 0);
                                break;
                        default:
@@ -1267,40 +1170,19 @@ static gint pan_window_key_press_cb(GtkWidget *widget, GdkEventKey *event, gpoin
 
        if (event->state & GDK_CONTROL_MASK)
                {
-               gint n = -1;
-
                stop_signal = TRUE;
                switch (event->keyval)
                        {
                        case '1':
-                               n = 0;
-                               break;
                        case '2':
-                               n = 1;
-                               break;
                        case '3':
-                               n = 2;
-                               break;
                        case '4':
-                               n = 3;
-                               break;
                        case '5':
-                               n = 4;
-                               break;
                        case '6':
-                               n = 5;
-                               break;
                        case '7':
-                               n = 6;
-                               break;
                        case '8':
-                               n = 7;
-                               break;
                        case '9':
-                               n = 8;
-                               break;
                        case '0':
-                               n = 9;
                                break;
                        case 'C': case 'c':
                                if (fd) file_util_copy(fd, NULL, NULL, GTK_WIDGET(pr));
@@ -1314,9 +1196,6 @@ static gint pan_window_key_press_cb(GtkWidget *widget, GdkEventKey *event, gpoin
                        case 'D': case 'd':
                                if (fd) file_util_delete(fd, NULL, GTK_WIDGET(pr));
                                break;
-                       case 'P': case 'p':
-                               if (fd) info_window_new(fd, NULL, NULL);
-                               break;
                        case 'F': case 'f':
                                pan_search_toggle_visible(pw, TRUE);
                                break;
@@ -1330,23 +1209,13 @@ static gint pan_window_key_press_cb(GtkWidget *widget, GdkEventKey *event, gpoin
                                stop_signal = FALSE;
                                break;
                        }
-#if 0
-               if (n != -1 && fd)
-                       {
-                       if (!editor_window_flag_set(n))
-                               {
-                               pan_fullscreen_toggle(pw, TRUE);
-                               }
-                       file_util_start_editor_from_file(n, fd, GTK_WIDGET(pr));
-                       }
-#endif
                }
        else
                {
                stop_signal = TRUE;
                switch (event->keyval)
                        {
-                       case GDK_Escape:
+                       case GDK_KEY_Escape:
                                if (pw->fs)
                                        {
                                        pan_fullscreen_toggle(pw, TRUE);
@@ -1368,13 +1237,13 @@ static gint pan_window_key_press_cb(GtkWidget *widget, GdkEventKey *event, gpoin
                        stop_signal = TRUE;
                        switch (event->keyval)
                                {
-                               case '+': case '=': case GDK_KP_Add:
+                               case '+': case '=': case GDK_KEY_KP_Add:
                                        pixbuf_renderer_zoom_adjust(pr, ZOOM_INCREMENT);
                                        break;
-                               case '-': case GDK_KP_Subtract:
+                               case '-': case GDK_KEY_KP_Subtract:
                                        pixbuf_renderer_zoom_adjust(pr, -ZOOM_INCREMENT);
                                        break;
-                               case 'Z': case 'z': case GDK_KP_Divide: case '1':
+                               case 'Z': case 'z': case GDK_KEY_KP_Divide: case '1':
                                        pixbuf_renderer_zoom_set(pr, 1.0);
                                        break;
                                case '2':
@@ -1397,18 +1266,15 @@ static gint pan_window_key_press_cb(GtkWidget *widget, GdkEventKey *event, gpoin
                                        break;
                                case 'F': case 'f':
                                case 'V': case 'v':
-                               case GDK_F11:
+                               case GDK_KEY_F11:
                                        pan_fullscreen_toggle(pw, FALSE);
                                        break;
                                case 'I': case 'i':
-#if 0
-                                       pan_overlay_toggle(pw);
-#endif
                                        break;
-                               case GDK_Delete: case GDK_KP_Delete:
+                               case GDK_KEY_Delete: case GDK_KEY_KP_Delete:
                                        break;
-                               case GDK_Menu:
-                               case GDK_F10:
+                               case GDK_KEY_Menu:
+                               case GDK_KEY_F10:
                                        menu = pan_popup_menu(pw);
                                        gtk_menu_popup(GTK_MENU(menu), NULL, NULL,
                                                       pan_window_menu_pos_cb, pw, 0, GDK_CURRENT_TIME);
@@ -1434,68 +1300,13 @@ static gint pan_window_key_press_cb(GtkWidget *widget, GdkEventKey *event, gpoin
 
 static void pan_info_add_exif(PanTextAlignment *ta, FileData *fd)
 {
-       ExifData *exif;
-       GList *work;
-       gint i;
 
        if (!fd) return;
-       exif = exif_read_fd(fd);
-       if (!exif) return;
 
        pan_text_alignment_add(ta, NULL, NULL);
-
-       for (i = 0; ExifUIList[i].key; i++)
-               {
-               gchar *label;
-               gchar *desc;
-               gchar *text;
-               gchar *utf8_text;
-
-               if (ExifUIList[i].current == EXIF_UI_OFF) continue;
-
-               text = exif_get_data_as_text(exif, ExifUIList[i].key);
-               if (ExifUIList[i].current == EXIF_UI_IFSET && (!text || !*text))
-                       {
-                       g_free(text);
-                       continue;
-                       }
-               
-               desc = exif_get_description_by_key(ExifUIList[i].key);
-               label = g_strdup_printf("%s:", desc);
-               g_free(desc);
-               utf8_text = utf8_validate_or_convert(text);
-               g_free(text);
-               pan_text_alignment_add(ta, label, utf8_text);
-               g_free(label);
-               g_free(utf8_text);
-               }
-
-       work = g_list_last(history_list_get_by_key("exif_extras"));
-       if (work) pan_text_alignment_add(ta, "---", NULL);
-       while (work)
-               {
-               const gchar *name;
-               gchar *text;
-
-               name = work->data;
-               work = work->prev;
-
-               text = exif_get_data_as_text(exif, name);
-               if (text)
-                       {
-                       gchar *label = g_strdup_printf("%s:", name);
-                       gchar *utf8_text = utf8_validate_or_convert(text);
-
-                       g_free(text);
-                       pan_text_alignment_add(ta, label, utf8_text);
-                       g_free(label);
-                       g_free(utf8_text);
-                       }
-               }
-
-       exif_free_fd(fd, exif);
 }
 
+
 static void pan_info_update(PanWindow *pw, PanItem *pi)
 {
        PanTextAlignment *ta;
@@ -1606,7 +1417,7 @@ static void pan_info_update(PanWindow *pw, PanItem *pi)
                                                PAN_POPUP_BORDER_COLOR, PAN_POPUP_ALPHA);
                        pan_item_set_key(pbox, "info");
 
-                       p = pan_item_image_new(pw, file_data_new_simple(pi->fd->path),
+                       p = pan_item_image_new(pw, file_data_new_group(pi->fd->path),
                                               pbox->x + PREF_PAD_BORDER, pbox->y + PREF_PAD_BORDER, iw, ih);
                        pan_item_set_key(p, "info");
                        pan_item_size_by_item(pbox, p, PREF_PAD_BORDER);
@@ -1670,7 +1481,7 @@ static gint pan_search_by_path(PanWindow *pw, const gchar *path)
        return TRUE;
 }
 
-static gint pan_search_by_partial(PanWindow *pw, const gchar *text)
+static gboolean pan_search_by_partial(PanWindow *pw, const gchar *text)
 {
        PanItem *pi;
        GList *list;
@@ -1718,7 +1529,7 @@ static gint pan_search_by_partial(PanWindow *pw, const gchar *text)
        return TRUE;
 }
 
-static gint valid_date_separator(gchar c)
+static gboolean valid_date_separator(gchar c)
 {
        return (c == '/' || c == '-' || c == ' ' || c == '.' || c == ',');
 }
@@ -1760,7 +1571,7 @@ static GList *pan_search_by_date_val(PanWindow *pw, PanItemType type,
        return g_list_reverse(list);
 }
 
-static gint pan_search_by_date(PanWindow *pw, const gchar *text)
+static gboolean pan_search_by_date(PanWindow *pw, const gchar *text)
 {
        PanItem *pi = NULL;
        GList *list = NULL;
@@ -1958,13 +1769,6 @@ static void pan_search_activate(PanWindow *pw)
 {
        gchar *text;
 
-#if 0
-       if (!GTK_WIDGET_VISIBLE(pw->search_box))
-               {
-               gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pw->search_button), TRUE);
-               }
-#endif
-
        text = g_strdup(gtk_entry_get_text(GTK_ENTRY(pw->search_entry)));
        pan_search_activate_cb(text, pw);
        g_free(text);
@@ -1973,9 +1777,9 @@ static void pan_search_activate(PanWindow *pw)
 static void pan_search_toggle_cb(GtkWidget *button, gpointer data)
 {
        PanWindow *pw = data;
-       gint visible;
+       gboolean visible;
 
-       visible = GTK_WIDGET_VISIBLE(pw->search_box);
+       visible = gtk_widget_get_visible(pw->search_box);
        if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)) == visible) return;
 
        if (visible)
@@ -1991,13 +1795,13 @@ static void pan_search_toggle_cb(GtkWidget *button, gpointer data)
                }
 }
 
-static void pan_search_toggle_visible(PanWindow *pw, gint enable)
+static void pan_search_toggle_visible(PanWindow *pw, gboolean enable)
 {
        if (pw->fs) return;
 
        if (enable)
                {
-               if (GTK_WIDGET_VISIBLE(pw->search_box))
+               if (gtk_widget_get_visible(pw->search_box))
                        {
                        gtk_widget_grab_focus(pw->search_entry);
                        }
@@ -2008,9 +1812,9 @@ static void pan_search_toggle_visible(PanWindow *pw, gint enable)
                }
        else
                {
-               if (GTK_WIDGET_VISIBLE(pw->search_entry))
+               if (gtk_widget_get_visible(pw->search_entry))
                        {
-                       if (GTK_WIDGET_HAS_FOCUS(pw->search_entry))
+                       if (gtk_widget_has_focus(pw->search_entry))
                                {
                                gtk_widget_grab_focus(GTK_WIDGET(pw->imd->widget));
                                }
@@ -2075,9 +1879,6 @@ static void button_cb(PixbufRenderer *pr, GdkEventButton *event, gpointer data)
 
 static void scroll_cb(PixbufRenderer *pr, GdkEventScroll *event, gpointer data)
 {
-#if 0
-       PanWindow *pw = data;
-#endif
        gint w, h;
 
        w = pr->vis_width;
@@ -2143,7 +1944,7 @@ static void pan_fullscreen_stop_func(FullScreenData *fs, gpointer data)
        pw->imd = pw->imd_normal;
 }
 
-static void pan_fullscreen_toggle(PanWindow *pw, gint force_off)
+static void pan_fullscreen_toggle(PanWindow *pw, gboolean force_off)
 {
        if (force_off && !pw->fs) return;
 
@@ -2185,12 +1986,12 @@ static void pan_window_image_scroll_notify_cb(PixbufRenderer *pr, gpointer data)
        pixbuf_renderer_get_image_size(pr, &width, &height);
 
        adj = gtk_range_get_adjustment(GTK_RANGE(pw->scrollbar_h));
-       adj->page_size = (gdouble)rect.width;
-       adj->page_increment = adj->page_size / 2.0;
-       adj->step_increment = 48.0 / pr->scale;
-       adj->lower = 0.0;
-       adj->upper = MAX((gdouble)width, 1.0);
-       adj->value = (gdouble)rect.x;
+       gtk_adjustment_set_page_size(adj, rect.width);
+       gtk_adjustment_set_page_increment(adj, gtk_adjustment_get_page_size(adj) / 2.0);
+       gtk_adjustment_set_step_increment(adj, 48.0 / pr->scale);
+       gtk_adjustment_set_lower(adj, 0.0);
+       gtk_adjustment_set_upper(adj, MAX((gdouble)width, 1.0));
+       gtk_adjustment_set_value(adj, (gdouble)rect.x);
 
        pref_signal_block_data(pw->scrollbar_h, pw);
        gtk_adjustment_changed(adj);
@@ -2198,12 +1999,12 @@ static void pan_window_image_scroll_notify_cb(PixbufRenderer *pr, gpointer data)
        pref_signal_unblock_data(pw->scrollbar_h, pw);
 
        adj = gtk_range_get_adjustment(GTK_RANGE(pw->scrollbar_v));
-       adj->page_size = (gdouble)rect.height;
-       adj->page_increment = adj->page_size / 2.0;
-       adj->step_increment = 48.0 / pr->scale;
-       adj->lower = 0.0;
-       adj->upper = MAX((gdouble)height, 1.0);
-       adj->value = (gdouble)rect.y;
+       gtk_adjustment_set_page_size(adj, rect.height);
+       gtk_adjustment_set_page_increment(adj, gtk_adjustment_get_page_size(adj) / 2.0);
+       gtk_adjustment_set_step_increment(adj, 48.0 / pr->scale);
+       gtk_adjustment_set_lower(adj, 0.0);
+       gtk_adjustment_set_upper(adj, MAX((gdouble)height, 1.0));
+       gtk_adjustment_set_value(adj, (gdouble)rect.y);
 
        pref_signal_block_data(pw->scrollbar_v, pw);
        gtk_adjustment_changed(adj);
@@ -2257,16 +2058,6 @@ static void pan_window_layout_size_cb(GtkWidget *combo, gpointer data)
        pan_layout_update(pw);
 }
 
-#if 0
-static void pan_window_date_toggle_cb(GtkWidget *button, gpointer data)
-{
-       PanWindow *pw = data;
-
-       pw->exif_date_enable = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button));
-       pan_layout_update(pw);
-}
-#endif
-
 static void pan_window_entry_activate_cb(const gchar *new_text, gpointer data)
 {
        PanWindow *pw = data;
@@ -2283,7 +2074,7 @@ static void pan_window_entry_activate_cb(const gchar *new_text, gpointer data)
                }
        else
                {
-               FileData *dir_fd = file_data_new_simple(path);
+               FileData *dir_fd = file_data_new_dir(path);
                tab_completion_append_to_history(pw->path_entry, path);
 
                pan_layout_set_fd(pw, dir_fd);
@@ -2313,7 +2104,7 @@ static void pan_window_close(PanWindow *pw)
        pref_list_int_set(PAN_PREF_GROUP, PAN_PREF_INFO_IMAGE, pw->info_image_size);
        pref_list_int_set(PAN_PREF_GROUP, PAN_PREF_INFO_EXIF, pw->info_includes_exif);
 
-       if (pw->idle_id != -1)
+       if (pw->idle_id)
                {
                g_source_remove(pw->idle_id);
                }
@@ -2329,7 +2120,7 @@ static void pan_window_close(PanWindow *pw)
        g_free(pw);
 }
 
-static gint pan_window_delete_cb(GtkWidget *w, GdkEventAny *event, gpointer data)
+static gboolean pan_window_delete_cb(GtkWidget *w, GdkEventAny *event, gpointer data)
 {
        PanWindow *pw = data;
 
@@ -2371,13 +2162,7 @@ static void pan_window_new_real(FileData *dir_fd)
 
        pw->ignore_symlinks = TRUE;
 
-       pw->list = NULL;
-       pw->list_static = NULL;
-       pw->list_grid = NULL;
-
-       pw->fs = NULL;
-       pw->overlay_id = -1;
-       pw->idle_id = -1;
+       pw->idle_id = 0;
 
        pw->window = window_new(GTK_WINDOW_TOPLEVEL, "panview", NULL, NULL, _("Pan View"));
 
@@ -2398,17 +2183,17 @@ static void pan_window_new_real(FileData *dir_fd)
        pref_label_new(box, _("Location:"));
        combo = tab_completion_new_with_history(&pw->path_entry, dir_fd->path, "pan_view_path", -1,
                                                pan_window_entry_activate_cb, pw);
-       g_signal_connect(G_OBJECT(pw->path_entry->parent), "changed",
+       g_signal_connect(G_OBJECT(gtk_widget_get_parent(pw->path_entry)), "changed",
                         G_CALLBACK(pan_window_entry_change_cb), pw);
        gtk_box_pack_start(GTK_BOX(box), combo, TRUE, TRUE, 0);
        gtk_widget_show(combo);
 
-       combo = gtk_combo_box_new_text();
-       gtk_combo_box_append_text(GTK_COMBO_BOX(combo), _("Timeline"));
-       gtk_combo_box_append_text(GTK_COMBO_BOX(combo), _("Calendar"));
-       gtk_combo_box_append_text(GTK_COMBO_BOX(combo), _("Folders"));
-       gtk_combo_box_append_text(GTK_COMBO_BOX(combo), _("Folders (flower)"));
-       gtk_combo_box_append_text(GTK_COMBO_BOX(combo), _("Grid"));
+       combo = gtk_combo_box_text_new();
+       gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), _("Timeline"));
+       gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), _("Calendar"));
+       gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), _("Folders"));
+       gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), _("Folders (flower)"));
+       gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), _("Grid"));
 
        gtk_combo_box_set_active(GTK_COMBO_BOX(combo), pw->layout);
        g_signal_connect(G_OBJECT(combo), "changed",
@@ -2416,17 +2201,17 @@ static void pan_window_new_real(FileData *dir_fd)
        gtk_box_pack_start(GTK_BOX(box), combo, FALSE, FALSE, 0);
        gtk_widget_show(combo);
 
-       combo = gtk_combo_box_new_text();
-       gtk_combo_box_append_text(GTK_COMBO_BOX(combo), _("Dots"));
-       gtk_combo_box_append_text(GTK_COMBO_BOX(combo), _("No Images"));
-       gtk_combo_box_append_text(GTK_COMBO_BOX(combo), _("Small Thumbnails"));
-       gtk_combo_box_append_text(GTK_COMBO_BOX(combo), _("Normal Thumbnails"));
-       gtk_combo_box_append_text(GTK_COMBO_BOX(combo), _("Large Thumbnails"));
-       gtk_combo_box_append_text(GTK_COMBO_BOX(combo), _("1:10 (10%)"));
-       gtk_combo_box_append_text(GTK_COMBO_BOX(combo), _("1:4 (25%)"));
-       gtk_combo_box_append_text(GTK_COMBO_BOX(combo), _("1:3 (33%)"));
-       gtk_combo_box_append_text(GTK_COMBO_BOX(combo), _("1:2 (50%)"));
-       gtk_combo_box_append_text(GTK_COMBO_BOX(combo), _("1:1 (100%)"));
+       combo = gtk_combo_box_text_new();
+       gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), _("Dots"));
+       gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), _("No Images"));
+       gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), _("Small Thumbnails"));
+       gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), _("Normal Thumbnails"));
+       gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), _("Large Thumbnails"));
+       gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), _("1:10 (10%)"));
+       gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), _("1:4 (25%)"));
+       gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), _("1:3 (33%)"));
+       gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), _("1:2 (50%)"));
+       gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), _("1:1 (100%)"));
 
        gtk_combo_box_set_active(GTK_COMBO_BOX(combo), pw->size);
        g_signal_connect(G_OBJECT(combo), "changed",
@@ -2516,11 +2301,6 @@ static void pan_window_new_real(FileData *dir_fd)
        gtk_container_add(GTK_CONTAINER(frame), pw->label_zoom);
        gtk_widget_show(pw->label_zoom);
 
-#if 0
-       pw->date_button = pref_checkbox_new(box, _("Use Exif date"), pw->exif_date_enable,
-                                           G_CALLBACK(pan_window_date_toggle_cb), pw);
-#endif
-
        pw->search_button = gtk_toggle_button_new();
        gtk_button_set_relief(GTK_BUTTON(pw->search_button), GTK_RELIEF_NONE);
        gtk_button_set_focus_on_click(GTK_BUTTON(pw->search_button), FALSE);
@@ -2570,20 +2350,20 @@ static void pan_warning_ok_cb(GenericDialog *gd, gpointer data)
 
 static void pan_warning_hide_cb(GtkWidget *button, gpointer data)
 {
-       gint hide_dlg;
+       gboolean hide_dlg;
 
        hide_dlg = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button));
        pref_list_int_set(PAN_PREF_GROUP, PAN_PREF_HIDE_WARNING, hide_dlg);
 }
 
-static gint pan_warning(FileData *dir_fd)
+static gboolean pan_warning(FileData *dir_fd)
 {
        GenericDialog *gd;
        GtkWidget *box;
        GtkWidget *group;
        GtkWidget *button;
        GtkWidget *ct_button;
-       gint hide_dlg;
+       gboolean hide_dlg;
 
        if (dir_fd && strcmp(dir_fd->path, G_DIR_SEPARATOR_S) == 0)
                {
@@ -2686,15 +2466,6 @@ static void pan_edit_cb(GtkWidget *widget, gpointer data)
                }
 }
 
-static void pan_info_cb(GtkWidget *widget, gpointer data)
-{
-       PanWindow *pw = data;
-       FileData *fd;
-
-       fd = pan_menu_click_fd(pw);
-       if (fd) info_window_new(fd, NULL, NULL);
-}
-
 static void pan_zoom_in_cb(GtkWidget *widget, gpointer data)
 {
        PanWindow *pw = data;
@@ -2799,12 +2570,30 @@ static void pan_close_cb(GtkWidget *widget, gpointer data)
        pan_window_close(pw);
 }
 
+static void pan_popup_menu_destroy_cb(GtkWidget *widget, gpointer data)
+{
+       GList *editmenu_fd_list = data;
+
+       filelist_free(editmenu_fd_list);
+}
+
+static GList *pan_view_get_fd_list(PanWindow *pw)
+{
+       GList *list = NULL;
+       FileData *fd = pan_menu_click_fd(pw);
+
+       if (fd) list = g_list_prepend(filelist_copy(fd->sidecar_files), file_data_ref(fd));
+
+       return list;
+}
+
 static GtkWidget *pan_popup_menu(PanWindow *pw)
 {
        GtkWidget *menu;
        GtkWidget *submenu;
        GtkWidget *item;
-       gint active;
+       gboolean active;
+       GList *editmenu_fd_list;
 
        active = (pw->click_pi != NULL);
 
@@ -2818,11 +2607,12 @@ static GtkWidget *pan_popup_menu(PanWindow *pw)
                            G_CALLBACK(pan_zoom_1_1_cb), pw);
        menu_item_add_divider(menu);
 
-       submenu_add_edit(menu, &item, G_CALLBACK(pan_edit_cb), pw);
-       gtk_widget_set_sensitive(item, active);
+       editmenu_fd_list = pan_view_get_fd_list(pw);
+       g_signal_connect(G_OBJECT(menu), "destroy",
+                        G_CALLBACK(pan_popup_menu_destroy_cb), editmenu_fd_list);
 
-       menu_item_add_stock_sensitive(menu, _("_Properties"), GTK_STOCK_PROPERTIES, active,
-                                     G_CALLBACK(pan_info_cb), pw);
+       submenu_add_edit(menu, &item, G_CALLBACK(pan_edit_cb), pw, editmenu_fd_list);
+       gtk_widget_set_sensitive(item, active);
 
        menu_item_add_stock_sensitive(menu, _("View in _new window"), GTK_STOCK_NEW, active,
                                      G_CALLBACK(pan_new_window_cb), pw);
@@ -2836,9 +2626,8 @@ static GtkWidget *pan_popup_menu(PanWindow *pw)
                                G_CALLBACK(pan_rename_cb), pw);
        menu_item_add_stock_sensitive(menu, _("_Delete..."), GTK_STOCK_DELETE, active,
                                      G_CALLBACK(pan_delete_cb), pw);
-       if (options->show_copy_path)
-               menu_item_add_sensitive(menu, _("_Copy path"), active,
-                                       G_CALLBACK(pan_copy_path_cb), pw);
+       menu_item_add_sensitive(menu, _("_Copy path"), active,
+                               G_CALLBACK(pan_copy_path_cb), pw);
 
        menu_item_add_divider(menu);
        item = menu_item_add_check(menu, _("Sort by E_xif date"), pw->exif_date_enable,
@@ -2916,7 +2705,7 @@ static void pan_window_get_dnd_data(GtkWidget *widget, GdkDragContext *context,
                {
                GList *list;
 
-               list = uri_filelist_from_text((gchar *)selection_data->data, TRUE);
+               list = uri_filelist_from_gtk_selection_data(selection_data);
                if (list && isdir(((FileData *)list->data)->path))
                        {
                        FileData *fd = list->data;
@@ -2938,34 +2727,15 @@ static void pan_window_set_dnd_data(GtkWidget *widget, GdkDragContext *context,
        fd = pan_menu_click_fd(pw);
        if (fd)
                {
-               gchar *text = NULL;
-               gint len;
-               gint 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);
                }
 }
@@ -2990,9 +2760,4 @@ static void pan_window_dnd_init(PanWindow *pw)
                         G_CALLBACK(pan_window_get_dnd_data), pw);
 }
 
-/*
- *-----------------------------------------------------------------------------
- * maintenance (for rename, move, remove)
- *-----------------------------------------------------------------------------
- */
 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */