Mercurial > hg > forks > geeqie
changeset 2040:4c5ad6846300
fixed dnd
used glib functions for uri manipulation
author | Vladimir Nadvornik <nadvornik@suse.cz> |
---|---|
date | Fri, 10 Aug 2012 21:55:29 +0200 |
parents | 995254a632bb |
children | 4f01c4aeb2d9 |
files | src/collect-table.c src/dupe.c src/img-view.c src/layout_image.c src/pan-view.c src/search.c src/ui_bookmark.c src/ui_pathsel.c src/uri_utils.c src/uri_utils.h src/view_dir.c src/view_file_icon.c src/view_file_list.c |
diffstat | 13 files changed, 104 insertions(+), 372 deletions(-) [+] |
line wrap: on
line diff
--- a/src/collect-table.c Sat Aug 04 22:13:33 2012 +0200 +++ b/src/collect-table.c Fri Aug 10 21:55:29 2012 +0200 @@ -2175,6 +2175,9 @@ uri_text = collection_info_list_to_dnd_data(ct->cd, list, &total); g_list_free(list); } + gtk_selection_data_set(selection_data, gtk_selection_data_get_target(selection_data), + 8, (guchar *)uri_text, total); + g_free(uri_text); break; case TARGET_URI_LIST: case TARGET_TEXT_PLAIN: @@ -2189,13 +2192,10 @@ } if (!list) return; - uri_text = uri_text_from_filelist(list, &total, (info == TARGET_TEXT_PLAIN)); + uri_selection_data_set_uris_from_filelist(selection_data, list); filelist_free(list); break; } - - gtk_selection_data_set_text(selection_data, uri_text, total); - g_free(uri_text); } @@ -2254,7 +2254,7 @@ } break; case TARGET_URI_LIST: - list = uri_filelist_from_text((gchar *)gtk_selection_data_get_data(selection_data), TRUE); + list = uri_filelist_from_gtk_selection_data(selection_data); work = list; while (work) {
--- a/src/dupe.c Sat Aug 04 22:13:33 2012 +0200 +++ b/src/dupe.c Fri Aug 10 21:55:29 2012 +0200 @@ -3404,16 +3404,13 @@ case TARGET_TEXT_PLAIN: list = dupe_listview_get_selection(dw, widget); if (!list) return; - uri_text = uri_text_from_filelist(list, &length, (info == TARGET_TEXT_PLAIN)); + uri_selection_data_set_uris_from_filelist(selection_data, list); filelist_free(list); break; default: uri_text = NULL; break; } - - if (uri_text) gtk_selection_data_set_text(selection_data, uri_text, length); - g_free(uri_text); } static void dupe_dnd_data_get(GtkWidget *widget, GdkDragContext *context, @@ -3437,7 +3434,7 @@ collection_from_dnd_data((gchar *)gtk_selection_data_get_data(selection_data), &list, NULL); break; case TARGET_URI_LIST: - list = uri_filelist_from_text((gchar *)gtk_selection_data_get_data(selection_data), TRUE); + list = uri_filelist_from_gtk_selection_data(selection_data); work = list; while (work) {
--- a/src/img-view.c Sat Aug 04 22:13:33 2012 +0200 +++ b/src/img-view.c Fri Aug 10 21:55:29 2012 +0200 @@ -1487,7 +1487,7 @@ { GList *work; - list = uri_filelist_from_text((gchar *)gtk_selection_data_get_data(selection_data), TRUE); + list = uri_filelist_from_gtk_selection_data(selection_data); work = list; while (work) @@ -1558,27 +1558,11 @@ { 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_text(selection_data, text, len); - g_free(text); - } } else {
--- a/src/layout_image.c Sat Aug 04 22:13:33 2012 +0200 +++ b/src/layout_image.c Fri Aug 10 21:55:29 2012 +0200 @@ -614,7 +614,7 @@ if (info == TARGET_URI_LIST) { - list = uri_filelist_from_text((gchar *)gtk_selection_data_get_data(selection_data), TRUE); + list = uri_filelist_from_gtk_selection_data(selection_data); source = NULL; info_list = NULL; } @@ -694,27 +694,11 @@ { 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_text(selection_data, text, len); - g_free(text); - } } else {
--- a/src/pan-view.c Sat Aug 04 22:13:33 2012 +0200 +++ b/src/pan-view.c Fri Aug 10 21:55:29 2012 +0200 @@ -2933,7 +2933,7 @@ { GList *list; - list = uri_filelist_from_text((gchar *)gtk_selection_data_get_data(selection_data), TRUE); + list = uri_filelist_from_gtk_selection_data(selection_data); if (list && isdir(((FileData *)list->data)->path)) { FileData *fd = list->data; @@ -2957,27 +2957,11 @@ { 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_text(selection_data, text, len); - g_free(text); - } } else {
--- a/src/search.c Sat Aug 04 22:13:33 2012 +0200 +++ b/src/search.c Fri Aug 10 21:55:29 2012 +0200 @@ -1376,26 +1376,13 @@ guint time, gpointer data) { SearchData *sd = data; - gchar *uri_text; - gint length; GList *list; - switch (info) - { - case TARGET_URI_LIST: - case TARGET_TEXT_PLAIN: - list = search_result_selection_list(sd); - if (!list) return; - uri_text = uri_text_from_filelist(list, &length, (info == TARGET_TEXT_PLAIN)); - filelist_free(list); - break; - default: - uri_text = NULL; - break; - } - - if (uri_text) gtk_selection_data_set_text(selection_data, uri_text, length); - g_free(uri_text); + list = search_result_selection_list(sd); + if (!list) return; + + uri_selection_data_set_uris_from_filelist(selection_data, list); + filelist_free(list); } static void search_dnd_begin(GtkWidget *widget, GdkDragContext *context, gpointer data)
--- a/src/ui_bookmark.c Sat Aug 04 22:13:33 2012 +0200 +++ b/src/ui_bookmark.c Fri Aug 10 21:55:29 2012 +0200 @@ -470,33 +470,30 @@ { BookMarkData *bm = data; BookButtonData *b; - gchar *uri_text = NULL; - gint length = 0; GList *list = NULL; -// if (context->dest_window == bm->widget->window) return; +#if GTK_CHECK_VERSION(3,0,0) + if (gdk_drag_context_get_dest_window(context) == gtk_widget_get_window(bm->widget)) return; +#else + if (context->dest_window == bm->widget->window) return; +#endif b = g_object_get_data(G_OBJECT(button), "bookbuttondata"); if (!b) return; list = g_list_append(list, b->path); - switch (info) + gchar **uris = uris_from_filelist(list); + gboolean ret = gtk_selection_data_set_uris(selection_data, uris); + if (!ret) { - case TARGET_URI_LIST: - uri_text = uri_text_from_list(list, &length, FALSE); - break; - case TARGET_TEXT_PLAIN: - uri_text = uri_text_from_list(list, &length, TRUE); - break; + char *str = g_strjoinv("\r\n", uris); + ret = gtk_selection_data_set_text(selection_data, str, -1); + g_free(str); } + g_strfreev(uris); g_list_free(list); - - if (!uri_text) return; - - gtk_selection_data_set_text(selection_data, uri_text, length); - g_free(uri_text); } static void bookmark_drag_begin(GtkWidget *button, GdkDragContext *context, gpointer data) @@ -686,16 +683,13 @@ BookMarkData *bm = data; GList *list = NULL; GList *work; + gchar **uris; if (!bm->editable) return; - switch (info) - { - case TARGET_URI_LIST: - case TARGET_X_URL: - list = uri_list_from_text((gchar *)gtk_selection_data_get_data(selection_data), FALSE); - break; - } + uris = gtk_selection_data_get_uris(selection_data); + list = uri_filelist_from_uris(uris); + g_strfreev(uris); work = list; while (work)
--- a/src/ui_pathsel.c Sat Aug 04 22:13:33 2012 +0200 +++ b/src/ui_pathsel.c Fri Aug 10 21:55:29 2012 +0200 @@ -331,9 +331,7 @@ guint info, guint time, gpointer data) { gchar *path = NULL; - gchar *uri_text = NULL; GList *list = NULL; - gint length = 0; GtkTreeModel *model; GtkTreeSelection *selection; GtkTreeIter iter; @@ -346,22 +344,16 @@ list = g_list_append(list, path); - switch (info) + gchar **uris = uris_from_filelist(list); + gboolean ret = gtk_selection_data_set_uris(selection_data, uris); + if (!ret) { - case TARGET_URI_LIST: - uri_text = uri_text_from_list(list, &length, FALSE); - break; - case TARGET_TEXT_PLAIN: - uri_text = uri_text_from_list(list, &length, TRUE); - break; + char *str = g_strjoinv("\r\n", uris); + ret = gtk_selection_data_set_text(selection_data, str, -1); + g_free(str); } string_list_free(list); - - if (!uri_text) return; - - gtk_selection_data_set_text(selection_data, uri_text, length); - g_free(uri_text); } static void dest_dnd_init(Dest_Data *dd)
--- a/src/uri_utils.c Sat Aug 04 22:13:33 2012 +0200 +++ b/src/uri_utils.c Fri Aug 10 21:55:29 2012 +0200 @@ -16,256 +16,87 @@ #include "filedata.h" #include "ui_fileops.h" -/* - *----------------------------------------------------------------------------- - * drag and drop uri utils - *----------------------------------------------------------------------------- - */ +gchar **uris_from_pathlist(GList *list) +{ + GList *work; + guint i = 0; + guint num = g_list_length(list); + gchar **uris = g_new0(gchar *, num + 1); -/* the following characters are allowed to be unencoded for pathnames: - * $ & + , / : = @ - */ -static gint escape_char_list[] = { - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0 */ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 10 */ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 20 */ -/* spc ! " # $ % & ' */ - 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, /* 30 */ -/* ( ) * + , - . / 0 1 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 40 */ -/* 2 3 4 5 6 7 8 9 : ; */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, /* 50 */ -/* < = > ? @ A B C D E */ - 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, /* 60 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 70 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 80 */ -/* Z [ \ ] ^ _ ` a b c */ - 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, /* 90 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 100 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 110 */ -/* x y z { | } ~ del */ - 0, 0, 0, 1, 1, 1, 0, 0 /* 120, 127 is end */ -}; + work = list; + while (work) + { + const gchar *path = work->data; + gchar *local_path = path_from_utf8(path); + uris[i] = g_filename_to_uri(local_path, NULL, NULL); + g_free(local_path); + + i++; + work = work->next; + } -static gchar *hex_char = "0123456789ABCDEF"; - -static gboolean escape_test(guchar c) -{ - if (c < 32 || c > 127) return TRUE; - return (escape_char_list[c] != 0); + uris[i] = NULL; + return uris; } -static const gchar *escape_code(guchar c) -{ - static gchar text[4]; - - text[0] = '%'; - text[1] = hex_char[c>>4]; - text[2] = hex_char[c%16]; - text[3] = '\0'; - - return text; -} - -gchar *uri_text_escape(const gchar *text) +gchar **uris_from_filelist(GList *list) { - GString *string; - gchar *result; - const gchar *p; - - if (!text) return NULL; - - string = g_string_new(""); - - p = text; - while (*p != '\0') - { - if (escape_test(*p)) - { - g_string_append(string, escape_code(*p)); - } - else - { - g_string_append_c(string, *p); - } - p++; - } - - result = string->str; - g_string_free(string, FALSE); - - /* dropped filenames are expected to be utf-8 compatible */ - if (!g_utf8_validate(result, -1, NULL)) - { - gchar *tmp; - - tmp = g_locale_to_utf8(result, -1, NULL, NULL, NULL); - if (tmp) - { - g_free(result); - result = tmp; - } - } - - return result; + GList *path_list = filelist_to_path_list(list); + gchar **ret = uris_from_pathlist(path_list); + string_list_free(path_list); + return ret; } -/* this operates on the passed string, decoding escaped characters */ -void uri_text_decode(gchar *text) +gboolean uri_selection_data_set_uris_from_filelist(GtkSelectionData *selection_data, GList *list) { - if (strchr(text, '%')) + gchar **uris = uris_from_filelist(list); + gboolean ret = gtk_selection_data_set_uris(selection_data, uris); + if (!ret) { - gchar *w; - gchar *r; - - w = r = text; - - while (*r != '\0') - { - if (*r == '%' && *(r + 1) != '\0' && *(r + 2) != '\0') - { - gchar t[3]; - gint n; + char *str = g_strjoinv("\r\n", uris); + ret = gtk_selection_data_set_text(selection_data, str, -1); + g_free(str); + } - r++; - t[0] = *r; - r++; - t[1] = *r; - t[2] = '\0'; - n = (gint)strtol(t, NULL, 16); - if (n > 0 && n < 256) - { - *w = (gchar)n; - } - else - { - /* invalid number, rewind and ignore this escape */ - r -= 2; - *w = *r; - } - } - else if (w != r) - { - *w = *r; - } - r++; - w++; - } - if (*w != '\0') *w = '\0'; - } + g_strfreev(uris); + return ret; } -static void uri_list_parse_encoded_chars(GList *list) -{ - GList *work = list; - - while (work) - { - gchar *text = work->data; - - uri_text_decode(text); - - work = work->next; - } -} - -GList *uri_list_from_text(gchar *data, gboolean files_only) +GList *uri_pathlist_from_uris(gchar **uris) { GList *list = NULL; - gint b, e; + guint i = 0; - b = e = 0; - - while (data[b] != '\0') + while (uris[i]) { - while (data[e] != '\r' && data[e] != '\n' && data[e] != '\0') e++; - if (strncmp(data + b, "file:", 5) == 0) - { - gchar *path; - b += 5; - while (data[b] == '/' && data[b+1] == '/') b++; - path = g_strndup(data + b, e - b); - list = g_list_append(list, path_to_utf8(path)); - g_free(path); - } - else if (!files_only && strncmp(data + b, "http:", 5) == 0) - { - list = g_list_append(list, g_strndup(data + b, e - b)); - } - else if (!files_only && strncmp(data + b, "ftp:", 3) == 0) - { - list = g_list_append(list, g_strndup(data + b, e - b)); - } - while (data[e] == '\r' || data[e] == '\n') e++; - b = e; + gchar *local_path = g_filename_from_uri(uris[i], NULL, NULL); + gchar *path = path_to_utf8(local_path); + g_free(local_path); + list = g_list_prepend(list, path); + i++; } - uri_list_parse_encoded_chars(list); - - return list; + return g_list_reverse(list); } -GList *uri_filelist_from_text(gchar *data, gboolean files_only) + + +GList *uri_filelist_from_uris(gchar **uris) { - GList *path_list = uri_list_from_text(data, files_only); + GList *path_list = uri_pathlist_from_uris(uris); GList *filelist = filelist_from_path_list(path_list); string_list_free(path_list); return filelist; } -gchar *uri_text_from_list(GList *list, gint *len, gboolean plain_text) +GList *uri_filelist_from_gtk_selection_data(GtkSelectionData *selection_data) { - gchar *uri_text = NULL; - GString *string; - GList *work; - - if (!list) - { - if (len) *len = 0; - return NULL; - } - - string = g_string_new(""); - - work = list; - while (work) - { - const gchar *name8; /* dnd filenames are in utf-8 */ - - name8 = work->data; - - if (!plain_text) - { - gchar *escaped; - - escaped = uri_text_escape(name8); - g_string_append(string, "file:"); - g_string_append(string, escaped); - g_free(escaped); - - g_string_append(string, "\r\n"); - } - else - { - g_string_append(string, name8); - if (work->next) g_string_append(string, "\n"); - } - - work = work->next; - } - - uri_text = string->str; - if (len) *len = string->len; - g_string_free(string, FALSE); - - return uri_text; + gchar **uris = gtk_selection_data_get_uris(selection_data); + GList *ret = uri_filelist_from_uris(uris); + g_strfreev(uris); + return ret; } -gchar *uri_text_from_filelist(GList *list, gint *len, gboolean plain_text) -{ - GList *path_list = filelist_to_path_list(list); - gchar *ret = uri_text_from_list(path_list, len, plain_text); - string_list_free(path_list); - return ret; -} + + /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
--- a/src/uri_utils.h Sat Aug 04 22:13:33 2012 +0200 +++ b/src/uri_utils.h Fri Aug 10 21:55:29 2012 +0200 @@ -12,15 +12,12 @@ #ifndef URI_UTILS_H #define URI_UTILS_H -/* dnd data parsers (uris) */ - -gchar *uri_text_escape(const gchar *text); -void uri_text_decode(gchar *text); - -GList *uri_list_from_text(gchar *data, gboolean files_only); -GList *uri_filelist_from_text(gchar *data, gboolean files_only); -gchar *uri_text_from_list(GList *list, gint *len, gboolean plain_text); -gchar *uri_text_from_filelist(GList *list, gint *len, gboolean plain_text); +GList *uri_filelist_from_uris(gchar **uris); +gchar **uris_from_pathlist(GList *list); +gchar **uris_from_filelist(GList *list); +GList *uri_pathlist_from_uris(gchar **uris); +gboolean uri_selection_data_set_uris_from_filelist(GtkSelectionData *selection_data, GList *list); +GList *uri_filelist_from_gtk_selection_data(GtkSelectionData *selection_data); #endif /* URI_UTILS_H */ /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
--- a/src/view_dir.c Sat Aug 04 22:13:33 2012 +0200 +++ b/src/view_dir.c Fri Aug 10 21:55:29 2012 +0200 @@ -728,8 +728,6 @@ { ViewDir *vd = data; GList *list; - gchar *uritext = NULL; - gint length = 0; if (!vd->click_fd) return; @@ -738,15 +736,10 @@ case TARGET_URI_LIST: case TARGET_TEXT_PLAIN: list = g_list_prepend(NULL, vd->click_fd); - uritext = uri_text_from_filelist(list, &length, (info == TARGET_TEXT_PLAIN)); + uri_selection_data_set_uris_from_filelist(selection_data, list); g_list_free(list); break; } - if (uritext) - { - gtk_selection_data_set_text(selection_data, uritext, length); - g_free(uritext); - } } static void vd_dnd_begin(GtkWidget *widget, GdkDragContext *context, gpointer data) @@ -796,7 +789,7 @@ gint active; gboolean done = FALSE; - list = uri_filelist_from_text((gchar *)gtk_selection_data_get_data(selection_data), TRUE); + list = uri_filelist_from_gtk_selection_data(selection_data); if (!list) return; active = access_file(fd->path, W_OK | X_OK);
--- a/src/view_file_icon.c Sat Aug 04 22:13:33 2012 +0200 +++ b/src/view_file_icon.c Fri Aug 10 21:55:29 2012 +0200 @@ -557,13 +557,8 @@ } if (!list) return; - uri_text = uri_text_from_filelist(list, &total, (info == TARGET_TEXT_PLAIN)); + uri_selection_data_set_uris_from_filelist(selection_data, list); filelist_free(list); - - DEBUG_1("%s", uri_text); - - gtk_selection_data_set_text(selection_data, uri_text, total); - g_free(uri_text); } static void vficon_drag_data_received(GtkWidget *entry_widget, GdkDragContext *context,
--- a/src/view_file_list.c Sat Aug 04 22:13:33 2012 +0200 +++ b/src/view_file_list.c Fri Aug 10 21:55:29 2012 +0200 @@ -268,14 +268,8 @@ } if (!list) return; - - uri_text = uri_text_from_filelist(list, &total, (info == TARGET_TEXT_PLAIN)); + uri_selection_data_set_uris_from_filelist(selection_data, list); filelist_free(list); - - DEBUG_1("%s", uri_text); - - gtk_selection_data_set_text(selection_data, uri_text, total); - g_free(uri_text); } static void vflist_dnd_begin(GtkWidget *widget, GdkDragContext *context, gpointer data)