Drop unused variables and code.
[geeqie.git] / src / pan-view.c
index 4fefac5..ce741f5 100644 (file)
@@ -1,6 +1,7 @@
 /*
  * Geeqie
  * (C) 2006 John Ellis
+ * Copyright (C) 2008 - 2012 The Geeqie Team
  *
  * Author: John Ellis
  *
 #include "main.h"
 #include "pan-view.h"
 
-#include "pan-types.h"
 #include "bar_exif.h"
 #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"
 #include "thumb.h"
-#include "utilops.h"
-#include "ui_bookmark.h"
 #include "ui_fileops.h"
 #include "ui_menu.h"
 #include "ui_tabcomp.h"
 #include "ui_utildlg.h"
+#include "uri_utils.h"
+#include "utilops.h"
+#include "window.h"
 
 #include <gdk/gdkkeysyms.h> /* for keyboard values */
 
@@ -56,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);
@@ -74,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)
@@ -92,7 +96,7 @@ static void pan_queue_thumb_done_cb(ThumbLoader *tl, gpointer data)
                pi->queued = FALSE;
 
                if (pi->pixbuf) g_object_unref(pi->pixbuf);
-               pi->pixbuf = thumb_loader_get_pixbuf(tl, TRUE);
+               pi->pixbuf = thumb_loader_get_pixbuf(tl);
 
                rc = pi->refcount;
                image_area_changed(pw->imd, pi->x, pi->y, pi->width, pi->height);
@@ -131,7 +135,7 @@ static void pan_queue_image_done_cb(ImageLoader *il, gpointer data)
 
                        tmp = pi->pixbuf;
                        pi->pixbuf = gdk_pixbuf_scale_simple(tmp, pi->width, pi->height,
-                                                            (GdkInterpType)options->zoom_quality);
+                                                            (GdkInterpType)options->image.zoom_quality);
                        g_object_unref(tmp);
                        }
 
@@ -172,7 +176,7 @@ static void pan_queue_image_area_cb(ImageLoader *il, guint x, guint y,
 }
 #endif
 
-static gint pan_queue_step(PanWindow *pw)
+static gboolean pan_queue_step(PanWindow *pw)
 {
        PanItem *pi;
 
@@ -206,9 +210,10 @@ static gint pan_queue_step(PanWindow *pw)
 #if 0
                image_loader_set_area_ready_func(pw->il, pan_queue_image_area_cb, pw);
 #endif
-               image_loader_set_error_func(pw->il, 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, pan_queue_image_done_cb, pw)) return FALSE;
+               if (image_loader_start(pw->il)) return FALSE;
 
                image_loader_free(pw->il);
                pw->il = NULL;
@@ -231,7 +236,7 @@ static gint pan_queue_step(PanWindow *pw)
                                           pan_queue_thumb_done_cb,
                                           NULL, pw);
 
-               if (thumb_loader_start(pw->tl, pi->fd->path)) return FALSE;
+               if (thumb_loader_start(pw->tl, pi->fd)) return FALSE;
 
                thumb_loader_free(pw->tl);
                pw->tl = NULL;
@@ -254,7 +259,7 @@ static void pan_queue_add(PanWindow *pw, PanItem *pi)
        pi->queued = TRUE;
        pw->queue = g_list_prepend(pw->queue, pi);
 
-       if (!pw->tl && !pw->il) while(pan_queue_step(pw));
+       if (!pw->tl && !pw->il) while (pan_queue_step(pw));
 }
 
 
@@ -264,8 +269,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;
@@ -308,7 +313,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;
@@ -410,7 +415,7 @@ static void pan_window_dispose_tile_cb(PixbufRenderer *pr, gint x, gint y,
  *-----------------------------------------------------------------------------
  * misc
  *-----------------------------------------------------------------------------
- */ 
+ */
 
 static void pan_window_message(PanWindow *pw, const gchar *text)
 {
@@ -520,13 +525,13 @@ static void pan_window_zoom_limit(PanWindow *pw)
  *-----------------------------------------------------------------------------
  */
 
-static gint pan_cache_sort_file_cb(void *a, void *b)
+static gint pan_cache_sort_file_cb(gpointer a, gpointer b)
 {
        PanCacheData *pca = a;
        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);
 }
@@ -563,13 +568,13 @@ static void pan_cache_free(PanWindow *pw)
        pw->cache_cl = NULL;
 }
 
-static void pan_cache_fill(PanWindow *pw, const gchar *path)
+static void pan_cache_fill(PanWindow *pw, FileData *dir_fd)
 {
        GList *list;
 
        pan_cache_free(pw);
 
-       list = pan_list_tree(path, SORT_NAME, TRUE, pw->ignore_symlinks);
+       list = pan_list_tree(dir_fd, SORT_NAME, TRUE, pw->ignore_symlinks);
        pw->cache_todo = g_list_reverse(list);
 
        pw->cache_total = g_list_length(pw->cache_todo);
@@ -597,7 +602,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;
@@ -633,7 +638,7 @@ static gint pan_cache_step(PanWindow *pw)
                        mode_t mode = 0755;
 
                        base = cache_get_location(CACHE_TYPE_SIM, fd->path, FALSE, &mode);
-                       if (cache_ensure_dir_exists(base, 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);
@@ -686,7 +691,7 @@ void pan_cache_sync_date(PanWindow *pw, GList *list)
                while (needle)
                        {
                        PanCacheData *pc;
-                       
+
                        pc = needle->data;
                        if (pc->fd == fd)
                                {
@@ -743,9 +748,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);
@@ -754,12 +756,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);
@@ -772,7 +768,7 @@ static void pan_grid_build(PanWindow *pw, gint width, gint height, gint grid_siz
        row = row * 2 - 1;
        col = col * 2 - 1;
 
-       if (debug) printf("intersect speedup grid is %dx%d, based on %d average per grid\n", col, row, grid_size);
+       DEBUG_1("intersect speedup grid is %dx%d, based on %d average per grid", col, row, grid_size);
 
        for (j = 0; j < row; j++)
            for (i = 0; i < col; i++)
@@ -786,11 +782,10 @@ 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);
 
-                       if (debug) printf("grid section: %d,%d (%dx%d)\n", pg->x, pg->y, pg->w, pg->h);
+                       DEBUG_1("grid section: %d,%d (%dx%d)", pg->x, pg->y, pg->w, pg->h);
                        }
                }
 
@@ -882,7 +877,7 @@ static void pan_window_items_free(PanWindow *pw)
  *-----------------------------------------------------------------------------
  */
 
-static void pan_layout_compute(PanWindow *pw, const gchar *path,
+static void pan_layout_compute(PanWindow *pw, FileData *dir_fd,
                               gint *width, gint *height,
                               gint *scroll_x, gint *scroll_y)
 {
@@ -942,25 +937,25 @@ static void pan_layout_compute(PanWindow *pw, const gchar *path,
                {
                case PAN_LAYOUT_GRID:
                default:
-                       pan_grid_compute(pw, path, width, height);
+                       pan_grid_compute(pw, dir_fd, width, height);
                        break;
                case PAN_LAYOUT_FOLDERS_LINEAR:
-                       pan_folder_tree_compute(pw, path, width, height);
+                       pan_folder_tree_compute(pw, dir_fd, width, height);
                        break;
                case PAN_LAYOUT_FOLDERS_FLOWER:
-                       pan_flower_compute(pw, path, width, height, scroll_x, scroll_y);
+                       pan_flower_compute(pw, dir_fd, width, height, scroll_x, scroll_y);
                        break;
                case PAN_LAYOUT_CALENDAR:
-                       pan_calendar_compute(pw, path, width, height);
+                       pan_calendar_compute(pw, dir_fd, width, height);
                        break;
                case PAN_LAYOUT_TIMELINE:
-                       pan_timeline_compute(pw, path, width, height);
+                       pan_timeline_compute(pw, dir_fd, width, height);
                        break;
                }
 
        pan_cache_free(pw);
 
-       if (debug) printf("computed %d objects\n", g_list_length(pw->list));
+       DEBUG_1("computed %d objects", g_list_length(pw->list));
 }
 
 static GList *pan_layout_intersect_l(GList *list, GList *item_list,
@@ -1074,7 +1069,7 @@ static gint pan_layout_update_idle_cb(gpointer data)
                {
                if (!pw->cache_list && !pw->cache_todo)
                        {
-                       pan_cache_fill(pw, pw->path);
+                       pan_cache_fill(pw, pw->dir_fd);
                        if (pw->cache_todo)
                                {
                                pan_window_message(pw, _("Reading image data..."));
@@ -1103,12 +1098,12 @@ 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;
                        }
                }
 
-       pan_layout_compute(pw, pw->path, &width, &height, &scroll_x, &scroll_y);
+       pan_layout_compute(pw, pw->dir_fd, &width, &height, &scroll_x, &scroll_y);
 
        pan_window_zoom_limit(pw);
 
@@ -1116,7 +1111,7 @@ static gint pan_layout_update_idle_cb(gpointer data)
                {
                gdouble align;
 
-               if (debug) printf("Canvas size is %d x %d\n", width, height);
+               DEBUG_1("Canvas size is %d x %d", width, height);
 
                pan_grid_build(pw, width, height, 1000);
 
@@ -1138,13 +1133,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);
                }
@@ -1156,18 +1151,18 @@ static void pan_layout_update(PanWindow *pw)
        pan_layout_update_idle(pw);
 }
 
-static void pan_layout_set_path(PanWindow *pw, const gchar *path)
+static void pan_layout_set_fd(PanWindow *pw, FileData *dir_fd)
 {
-       if (!path) return;
+       if (!dir_fd) return;
 
-       if (strcmp(path, "/") == 0)
+       if (strcmp(dir_fd->path, G_DIR_SEPARATOR_S) == 0)
                {
-               pan_warning_folder(path, pw->window);
+               pan_warning_folder(dir_fd->path, pw->window);
                return;
                }
 
-       g_free(pw->path);
-       pw->path = g_strdup(path);
+       file_data_unref(pw->dir_fd);
+       pw->dir_fd = file_data_ref(dir_fd);
 
        pan_layout_update(pw);
 }
@@ -1189,17 +1184,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;
@@ -1207,38 +1203,39 @@ 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:
@@ -1262,40 +1259,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));
@@ -1309,9 +1285,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);
-                               break;
                        case 'F': case 'f':
                                pan_search_toggle_visible(pw, TRUE);
                                break;
@@ -1325,22 +1298,23 @@ 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);
                                }
-                       start_editor_from_file(n, fd);
+                       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);
@@ -1362,13 +1336,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':
@@ -1391,7 +1365,7 @@ 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':
@@ -1399,10 +1373,10 @@ static gint pan_window_key_press_cb(GtkWidget *widget, GdkEventKey *event, gpoin
                                        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);
@@ -1428,24 +1402,35 @@ 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, FALSE);
-       if (!exif) return;
 
        pan_text_alignment_add(ta, NULL, NULL);
+#if 0
+       {
+       GList *work;
+       gint i;
+
 
        for (i = 0; ExifUIList[i].key; i++)
                {
                gchar *label;
+               gchar *desc;
                gchar *text;
 
-               label = g_strdup_printf("%s:", exif_get_description_by_key(ExifUIList[i].key));
-               text = exif_get_data_as_text(exif, ExifUIList[i].key);
-               text = bar_exif_validate_text(text);
+               if (ExifUIList[i].current == EXIF_UI_OFF) continue;
+
+               text = metadata_read_string(fd, ExifUIList[i].key, METADATA_FORMATTED);
+               
+               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);
                pan_text_alignment_add(ta, label, text);
                g_free(label);
                g_free(text);
@@ -1456,23 +1441,25 @@ static void pan_info_add_exif(PanTextAlignment *ta, FileData *fd)
        while (work)
                {
                const gchar *name;
-               gchar *label;
                gchar *text;
 
                name = work->data;
                work = work->prev;
 
-               label = g_strdup_printf("%s:", name);
-               text = exif_get_data_as_text(exif, name);
-               text = bar_exif_validate_text(text);
-               pan_text_alignment_add(ta, label, text);
-               g_free(label);
-               g_free(text);
+               text =  metadata_read_string(fd, name, METADATA_FORMATTED);
+               if (text)
+                       {
+                       gchar *label = g_strdup_printf("%s:", name);
+                       pan_text_alignment_add(ta, label, text);
+                       g_free(label);
+                       g_free(text);
+                       }
                }
-
-       exif_free(exif);
+       }
+#endif
 }
 
+
 static void pan_info_update(PanWindow *pw, PanItem *pi)
 {
        PanTextAlignment *ta;
@@ -1490,7 +1477,7 @@ static void pan_info_update(PanWindow *pw, PanItem *pi)
 
        if (!pi) return;
 
-       if (debug) printf("info set to %s\n", pi->fd->path);
+       DEBUG_1("info set to %s", pi->fd->path);
 
        pbox = pan_item_box_new(pw, NULL, pi->x + pi->width + 4, pi->y, 10, 10,
                                PAN_POPUP_BORDER,
@@ -1583,7 +1570,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);
@@ -1636,7 +1623,7 @@ static gint pan_search_by_path(PanWindow *pw, const gchar *path)
        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"),
+                             (path[0] == G_DIR_SEPARATOR) ? _("path found") : _("filename found"),
                              g_list_index(list, pi) + 1,
                              g_list_length(list));
        pan_search_status(pw, buf);
@@ -1647,7 +1634,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;
@@ -1695,7 +1682,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 == ',');
 }
@@ -1737,7 +1724,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;
@@ -1950,9 +1937,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)
@@ -1968,13 +1955,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);
                        }
@@ -1985,9 +1972,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));
                                }
@@ -2001,7 +1988,7 @@ static void pan_search_toggle_visible(PanWindow *pw, gint enable)
  *-----------------------------------------------------------------------------
  * main window
  *-----------------------------------------------------------------------------
- */ 
+ */
 
 static void button_cb(PixbufRenderer *pr, GdkEventButton *event, gpointer data)
 {
@@ -2013,12 +2000,12 @@ static void button_cb(PixbufRenderer *pr, GdkEventButton *event, gpointer data)
        rx = ry = 0;
        if (pr->scale)
                {
-               rx = (double)(pr->x_scroll + event->x - pr->x_offset) / pr->scale;
-               ry = (double)(pr->y_scroll + event->y - pr->y_offset) / pr->scale;
+               rx = (gdouble)(pr->x_scroll + event->x - pr->x_offset) / pr->scale;
+               ry = (gdouble)(pr->y_scroll + event->y - pr->y_offset) / pr->scale;
                }
 
        pi = pan_item_find_by_coord(pw, PAN_ITEM_BOX, rx, ry, "info");
-       if (pi && event->button == 1)
+       if (pi && event->button == MOUSE_BUTTON_LEFT)
                {
                pan_info_update(pw, NULL);
                return;
@@ -2029,7 +2016,7 @@ static void button_cb(PixbufRenderer *pr, GdkEventButton *event, gpointer data)
 
        switch (event->button)
                {
-               case 1:
+               case MOUSE_BUTTON_LEFT:
                        pan_info_update(pw, pi);
 
                        if (!pi && pw->layout == PAN_LAYOUT_CALENDAR)
@@ -2038,12 +2025,12 @@ static void button_cb(PixbufRenderer *pr, GdkEventButton *event, gpointer data)
                                pan_calendar_update(pw, pi);
                                }
                        break;
-               case 2:
+               case MOUSE_BUTTON_MIDDLE:
                        break;
-               case 3:
+               case MOUSE_BUTTON_RIGHT:
                        pan_info_update(pw, pi);
                        menu = pan_popup_menu(pw);
-                       gtk_menu_popup (GTK_MENU(menu), NULL, NULL, NULL, NULL, 3, event->time);
+                       gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 3, event->time);
                        break;
                default:
                        break;
@@ -2120,7 +2107,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;
 
@@ -2162,12 +2149,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);
@@ -2175,12 +2162,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);
@@ -2260,9 +2247,11 @@ static void pan_window_entry_activate_cb(const gchar *new_text, gpointer data)
                }
        else
                {
+               FileData *dir_fd = file_data_new_dir(path);
                tab_completion_append_to_history(pw->path_entry, path);
 
-               pan_layout_set_path(pw, path);
+               pan_layout_set_fd(pw, dir_fd);
+               file_data_unref(dir_fd);
                }
 
        g_free(path);
@@ -2288,7 +2277,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);
                }
@@ -2299,12 +2288,12 @@ static void pan_window_close(PanWindow *pw)
        pan_window_items_free(pw);
        pan_cache_free(pw);
 
-       g_free(pw->path);
+       file_data_unref(pw->dir_fd);
 
        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;
 
@@ -2312,7 +2301,7 @@ static gint pan_window_delete_cb(GtkWidget *w, GdkEventAny *event, gpointer data
        return TRUE;
 }
 
-static void pan_window_new_real(const gchar *path)
+static void pan_window_new_real(FileData *dir_fd)
 {
        PanWindow *pw;
        GtkWidget *vbox;
@@ -2325,7 +2314,7 @@ static void pan_window_new_real(const gchar *path)
 
        pw = g_new0(PanWindow, 1);
 
-       pw->path = g_strdup(path);
+       pw->dir_fd = file_data_ref(dir_fd);
        pw->layout = PAN_LAYOUT_TIMELINE;
        pw->size = PAN_IMAGE_SIZE_THUMB_NORMAL;
        pw->thumb_size = PAN_THUMB_SIZE_NORMAL;
@@ -2346,22 +2335,16 @@ static void pan_window_new_real(const gchar *path)
 
        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"));
 
-       geometry.min_width = 8;
-       geometry.min_height = 8;
+       geometry.min_width = DEFAULT_MINIMAL_WINDOW_SIZE;
+       geometry.min_height = DEFAULT_MINIMAL_WINDOW_SIZE;
        gtk_window_set_geometry_hints(GTK_WINDOW(pw->window), NULL, &geometry, GDK_HINT_MIN_SIZE);
 
        gtk_window_set_resizable(GTK_WINDOW(pw->window), TRUE);
-        gtk_container_set_border_width(GTK_CONTAINER(pw->window), 0);
+       gtk_container_set_border_width(GTK_CONTAINER(pw->window), 0);
 
        vbox = gtk_vbox_new(FALSE, 0);
        gtk_container_add(GTK_CONTAINER(pw->window), vbox);
@@ -2371,19 +2354,19 @@ static void pan_window_new_real(const gchar *path)
 
        pref_spacer(box, 0);
        pref_label_new(box, _("Location:"));
-       combo = tab_completion_new_with_history(&pw->path_entry, path, "pan_view_path", -1,
+       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",
@@ -2391,17 +2374,17 @@ static void pan_window_new_real(const gchar *path)
        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",
@@ -2535,34 +2518,34 @@ static void pan_window_new_real(const gchar *path)
 
 static void pan_warning_ok_cb(GenericDialog *gd, gpointer data)
 {
-       gchar *path = data;
+       FileData *dir_fd = data;
 
        generic_dialog_close(gd);
 
-       pan_window_new_real(path);
-       g_free(path);
+       pan_window_new_real(dir_fd);
+       file_data_unref(dir_fd);
 }
 
 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(const gchar *path)
+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 (path && strcmp(path, "/") == 0)
+       if (dir_fd && strcmp(dir_fd->path, G_DIR_SEPARATOR_S) == 0)
                {
-               pan_warning_folder(path, NULL);
+               pan_warning_folder(dir_fd->path, NULL);
                return TRUE;
                }
 
@@ -2572,9 +2555,9 @@ static gint pan_warning(const gchar *path)
        if (!pref_list_int_get(PAN_PREF_GROUP, PAN_PREF_HIDE_WARNING, &hide_dlg)) hide_dlg = FALSE;
        if (hide_dlg) return FALSE;
 
-       gd = generic_dialog_new(_("Pan View Performance"), GQ_WMCLASS, "pan_view_warning", NULL, FALSE,
+       gd = generic_dialog_new(_("Pan View Performance"), "pan_view_warning", NULL, FALSE,
                                NULL, NULL);
-       gd->data = g_strdup(path);
+       gd->data = file_data_ref(dir_fd);
        generic_dialog_add_button(gd, GTK_STOCK_OK, NULL,
                                  pan_warning_ok_cb, TRUE);
 
@@ -2589,7 +2572,7 @@ static gint pan_warning(const gchar *path)
        group = pref_box_new(group, TRUE, GTK_ORIENTATION_VERTICAL, PREF_PAD_GAP);
 
        ct_button = pref_checkbox_new_int(group, _("Cache thumbnails"),
-                                         options->thumbnails.enable_caching, &options->thumbnails.enable_caching);
+                                         options->thumbnails.enable_caching, &options->thumbnails.enable_caching);
        button = pref_checkbox_new_int(group, _("Use shared thumbnail cache"),
                                       options->thumbnails.spec_standard, &options->thumbnails.spec_standard);
        pref_checkbox_link_sensitivity(ct_button, button);
@@ -2611,11 +2594,11 @@ static gint pan_warning(const gchar *path)
  *-----------------------------------------------------------------------------
  */
 
-void pan_window_new(const gchar *path)
+void pan_window_new(FileData *dir_fd)
 {
-       if (pan_warning(path)) return;
+       if (pan_warning(dir_fd)) return;
 
-       pan_window_new_real(path);
+       pan_window_new_real(dir_fd);
 }
 
 
@@ -2645,32 +2628,22 @@ static void pan_edit_cb(GtkWidget *widget, gpointer data)
 {
        PanWindow *pw;
        FileData *fd;
-       gint n;
+       const gchar *key = data;
 
        pw = submenu_item_get_data(widget);
-       n = GPOINTER_TO_INT(data);
        if (!pw) return;
 
        fd = pan_menu_click_fd(pw);
        if (fd)
                {
-               if (!editor_window_flag_set(n))
+               if (!editor_window_flag_set(key))
                        {
                        pan_fullscreen_toggle(pw, TRUE);
                        }
-               start_editor_from_file(n, fd);
+               file_util_start_editor_from_file(key, fd, pw->imd->widget);
                }
 }
 
-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);
-}
-
 static void pan_zoom_in_cb(GtkWidget *widget, gpointer data)
 {
        PanWindow *pw = data;
@@ -2728,6 +2701,15 @@ static void pan_delete_cb(GtkWidget *widget, gpointer data)
        if (fd) file_util_delete(fd, NULL, pw->imd->widget);
 }
 
+static void pan_copy_path_cb(GtkWidget *widget, gpointer data)
+{
+       PanWindow *pw = data;
+       FileData *fd;
+
+       fd = pan_menu_click_fd(pw);
+       if (fd) file_util_copy_path_to_clipboard(fd);
+}
+
 static void pan_exif_date_toggle_cb(GtkWidget *widget, gpointer data)
 {
        PanWindow *pw = data;
@@ -2766,12 +2748,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);
 
@@ -2785,12 +2785,13 @@ 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);
-
-       menu_item_add_stock_sensitive(menu, _("_Properties"), GTK_STOCK_PROPERTIES, active,
-                                     G_CALLBACK(pan_info_cb), pw);
+       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);
 
+       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);
 
@@ -2803,6 +2804,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);
+       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,
@@ -2814,8 +2817,8 @@ static GtkWidget *pan_popup_menu(PanWindow *pw)
        menu_item_add_check(menu, _("_Show Exif information"), pw->info_includes_exif,
                            G_CALLBACK(pan_info_toggle_exif_cb), pw);
        item = menu_item_add(menu, _("Show im_age"), NULL, NULL);
-        submenu = gtk_menu_new();
-        gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);
+       submenu = gtk_menu_new();
+       gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);
 
        item = menu_item_add_check(submenu, _("_None"), (pw->info_image_size == PAN_IMAGE_SIZE_THUMB_NONE),
                                   G_CALLBACK(pan_info_toggle_image_cb), pw);
@@ -2840,8 +2843,8 @@ static GtkWidget *pan_popup_menu(PanWindow *pw)
        item = menu_item_add_check(submenu, _("1:10 (10%)"), (pw->info_image_size == PAN_IMAGE_SIZE_10),
                                   G_CALLBACK(pan_info_toggle_image_cb), pw);
        g_object_set_data(G_OBJECT(item), INFO_IMAGE_SIZE_KEY, GINT_TO_POINTER(PAN_IMAGE_SIZE_10));
-       
-       
+
+
 
        menu_item_add_divider(menu);
 
@@ -2880,12 +2883,12 @@ 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;
 
-                       pan_layout_set_path(pw, fd->path);
+                       pan_layout_set_fd(pw, fd);
                        }
 
                filelist_free(list);
@@ -2902,35 +2905,16 @@ 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,
-                                       8, NULL, 0);
+               gtk_selection_data_set(selection_data, gtk_selection_data_get_target(selection_data),
+                                      8, NULL, 0);
                }
 }
 
@@ -2949,14 +2933,9 @@ static void pan_window_dnd_init(PanWindow *pw)
        gtk_drag_dest_set(widget,
                          GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_DROP,
                          dnd_file_drop_types, dnd_file_drop_types_count,
-                          GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK);
+                         GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK);
        g_signal_connect(G_OBJECT(widget), "drag_data_received",
                         G_CALLBACK(pan_window_get_dnd_data), pw);
 }
 
-/*
- *-----------------------------------------------------------------------------
- * maintenance (for rename, move, remove)
- *-----------------------------------------------------------------------------
- */
-
+/* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */