Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/shell
diff options
context:
space:
mode:
authorNickolay V. Shmyrev <nshmyrev@yandex.ru>2009-05-03 08:21:17 (GMT)
committer Nickolay V. Shmyrev <nshmyrev@yandex.ru>2009-05-03 08:21:17 (GMT)
commit28ffb1e81e22421674091f6ad73613684bad12de (patch)
tree5f7da21bf328c220ce35b99b73e8e94d5692a7a8 /shell
parent4a0680e34b63098c3d8b6a48b613958acd3e47a9 (diff)
[ui] Escape URIs for display
Uses uri escaping function to make more sensible URI's to display them. Fixes GNOME bug #581064.
Diffstat (limited to 'shell')
-rw-r--r--shell/ev-utils.c40
-rw-r--r--shell/ev-utils.h1
-rw-r--r--shell/ev-window-title.c11
-rw-r--r--shell/ev-window.c11
4 files changed, 55 insertions, 8 deletions
diff --git a/shell/ev-utils.c b/shell/ev-utils.c
index 13f1459..540836f 100644
--- a/shell/ev-utils.c
+++ b/shell/ev-utils.c
@@ -400,3 +400,43 @@ get_gdk_pixbuf_format_by_extension (gchar *uri)
return NULL;
}
+#define XDIGIT(c) ((c) <= '9' ? (c) - '0' : ((c) & 0x4F) - 'A' + 10)
+#define HEXCHAR(s) ((XDIGIT (s[1]) << 4) + XDIGIT (s[2]))
+
+static char *
+uri_decoded_copy (const char *part, int length)
+{
+ unsigned char *s, *d;
+ char *decoded = g_strndup (part, length);
+
+ s = d = (unsigned char *)decoded;
+ do {
+ if (*s == '%') {
+ if (!g_ascii_isxdigit (s[1]) ||
+ !g_ascii_isxdigit (s[2])) {
+ g_free (decoded);
+ return NULL;
+ }
+ *d++ = HEXCHAR (s);
+ s += 2;
+ } else
+ *d++ = *s;
+ } while (*s++);
+
+ return decoded;
+}
+
+char* escape_uri_for_display (const char *uri)
+{
+ GFile *file;
+ char *disp;
+ char *filename;
+
+ file = g_file_new_for_uri (uri);
+ filename = g_file_get_parse_name (file);
+ disp = uri_decoded_copy (filename, strlen (filename));
+ g_free (filename);
+ g_object_unref (file);
+
+ return disp;
+}
diff --git a/shell/ev-utils.h b/shell/ev-utils.h
index f7c58a7..ac89b1e 100644
--- a/shell/ev-utils.h
+++ b/shell/ev-utils.h
@@ -44,6 +44,7 @@ gdouble get_screen_dpi (GtkWindow * window);
void file_chooser_dialog_add_writable_pixbuf_formats (GtkFileChooser *chooser);
GdkPixbufFormat* get_gdk_pixbuf_format_by_extension (gchar *uri);
+char* escape_uri_for_display (const char *uri);
G_END_DECLS
#endif /* __EV_VIEW_H__ */
diff --git a/shell/ev-window-title.c b/shell/ev-window-title.c
index 9cfd865..baafa74 100644
--- a/shell/ev-window-title.c
+++ b/shell/ev-window-title.c
@@ -20,6 +20,7 @@
#include <config.h>
#include "ev-window-title.h"
#include "ev-backends-manager.h"
+#include "ev-utils.h"
#include <string.h>
#include <gio/gio.h>
@@ -71,14 +72,14 @@ ev_window_title_new (EvWindow *window)
static char *
get_filename_from_uri (const char *uri)
{
- GFile *file;
char *filename;
+ char *basename;
- file = g_file_new_for_uri (uri);
- filename = g_file_get_basename (file);
- g_object_unref (file);
+ filename = escape_uri_for_display (uri);
+ basename = g_path_get_basename (filename);
+ g_free(filename);
- return filename;
+ return basename;
}
/* Some docs report titles with confusing extensions (ex. .doc for pdf).
diff --git a/shell/ev-window.c b/shell/ev-window.c
index 92f5089..5d99f66 100644
--- a/shell/ev-window.c
+++ b/shell/ev-window.c
@@ -1586,12 +1586,15 @@ show_loading_progress (EvWindow *ev_window)
{
GtkWidget *area;
gchar *text;
+ gchar *display_name;
if (ev_window->priv->message_area)
return FALSE;
-
- text = g_strdup_printf (_("Loading document from %s"),
- ev_window->priv->uri);
+
+ display_name = escape_uri_for_display (ev_window->priv->uri);
+ text = g_strdup_printf (_("Loading document from ā€œ%sā€"),
+ display_name);
+
area = ev_progress_message_area_new (GTK_STOCK_OPEN,
text,
GTK_STOCK_CLOSE,
@@ -1604,7 +1607,9 @@ show_loading_progress (EvWindow *ev_window)
ev_window);
gtk_widget_show (area);
ev_window_set_message_area (ev_window, area);
+
g_free (text);
+ g_free (display_name);
return FALSE;
}