X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;ds=sidebyside;f=shell%2Fev-window-title.c;h=baafa74f399278d607418375085c43efb0c1d0d0;hb=e2796d0d1a833e63c9495193c9241bd718f68082;hp=86f75f3205ccbdaa98f2b0cc84aaa65f58b09c18;hpb=57eb84b3aa7def409e9b9939828b0a1f608e9a0e;p=evince.git diff --git a/shell/ev-window-title.c b/shell/ev-window-title.c index 86f75f32..baafa74f 100644 --- a/shell/ev-window-title.c +++ b/shell/ev-window-title.c @@ -17,17 +17,44 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ +#include #include "ev-window-title.h" +#include "ev-backends-manager.h" +#include "ev-utils.h" +#include +#include #include -#include + +/* Known backends (for bad extensions fix) */ +#define EV_BACKEND_PS "psdocument" +#define EV_BACKEND_PDF "pdfdocument" + +typedef struct +{ + const gchar *backend; + const gchar *text; +} BadTitleEntry; struct _EvWindowTitle { EvWindow *window; - EvDocument *document; EvWindowTitleType type; - char *title; + EvDocument *document; + char *uri; +}; + +static const BadTitleEntry bad_extensions[] = { + { EV_BACKEND_PS, ".dvi" }, + { EV_BACKEND_PDF, ".doc" }, + { EV_BACKEND_PDF, ".dvi" }, + { EV_BACKEND_PDF, ".indd" }, + { EV_BACKEND_PDF, ".rtf" } +}; + +static const BadTitleEntry bad_prefixes[] = { + { EV_BACKEND_PDF, "Microsoft Word - " }, + { EV_BACKEND_PDF, "Microsoft PowerPoint - " } }; EvWindowTitle * @@ -42,23 +69,104 @@ ev_window_title_new (EvWindow *window) return window_title; } +static char * +get_filename_from_uri (const char *uri) +{ + char *filename; + char *basename; + + filename = escape_uri_for_display (uri); + basename = g_path_get_basename (filename); + g_free(filename); + + return basename; +} + +/* Some docs report titles with confusing extensions (ex. .doc for pdf). + Let's show the filename in this case */ +static void +ev_window_title_sanitize_title (EvWindowTitle *window_title, char **title) { + const gchar *backend; + int i; + + backend = ev_backends_manager_get_document_module_name (window_title->document); + + for (i = 0; i < G_N_ELEMENTS (bad_extensions); i++) { + if (g_ascii_strcasecmp (bad_extensions[i].backend, backend) == 0 && + g_str_has_suffix (*title, bad_extensions[i].text)) { + char *new_title; + char *filename = get_filename_from_uri (window_title->uri); + + new_title = g_strdup_printf ("%s (%s)", *title, filename); + g_free (*title); + *title = new_title; + + g_free (filename); + } + } + for (i = 0; i < G_N_ELEMENTS (bad_prefixes); i++) { + if (g_ascii_strcasecmp (bad_prefixes[i].backend, backend) == 0 && + g_str_has_prefix (*title, bad_prefixes[i].text)) { + char *new_title; + int len = strlen(bad_prefixes[i].text); + + new_title = g_strdup_printf ("%s", (*title) + len); + g_free (*title); + *title = new_title; + } + } +} + static void ev_window_title_update (EvWindowTitle *window_title) { GtkWindow *window = GTK_WINDOW (window_title->window); - char *password_title; + char *title = NULL, *password_title, *p; + EvPageCache *page_cache; + + if (window_title->document != NULL) { + char *doc_title; + + page_cache = ev_page_cache_get (window_title->document); + g_return_if_fail (page_cache != NULL); + doc_title = (char *)ev_page_cache_get_title (page_cache); + + /* Make sure we get a valid title back */ + if (doc_title != NULL) { + doc_title = g_strstrip (doc_title); + + if (doc_title[0] != '\0' && + g_utf8_validate (doc_title, -1, NULL)) { + title = g_strdup (doc_title); + } + } + } + + if (title && window_title->uri) { + ev_window_title_sanitize_title (window_title, &title); + } else if (window_title->uri) { + title = get_filename_from_uri (window_title->uri); + } else if (!title) { + title = g_strdup (_("Document Viewer")); + } + + for (p = title; *p; ++p) { + /* an '\n' byte is always ASCII, no need for UTF-8 special casing */ + if (*p == '\n') *p = ' '; + } switch (window_title->type) { case EV_WINDOW_TITLE_DOCUMENT: - gtk_window_set_title (window, window_title->title); + gtk_window_set_title (window, title); break; case EV_WINDOW_TITLE_PASSWORD: - password_title = g_strdup_printf (_("%s - Password Required"), - window_title->title); + password_title = g_strdup_printf (_("%s - Password Required"), title); gtk_window_set_title (window, password_title); g_free (password_title); break; } + + g_free (title); } void @@ -71,52 +179,19 @@ ev_window_title_set_type (EvWindowTitle *window_title, EvWindowTitleType type) void ev_window_title_set_document (EvWindowTitle *window_title, - EvDocument *document, - const char *uri) + EvDocument *document) { - EvPageCache *page_cache; - const char *title; - window_title->document = document; - g_free (window_title->title); - - if (document == NULL) { - window_title->title = NULL; - return; - } - - page_cache = ev_page_cache_get (document); - g_return_if_fail (page_cache != NULL); - - title = ev_page_cache_get_title (page_cache); - - /* Make sure we get a valid title back */ - if (title && title[0] != '\000' && g_utf8_validate (title, -1, NULL)) { - window_title->title = g_strdup (title); - } - - if (window_title->title) { - char *p; - - for (p = window_title->title; *p; ++p) { - /* an '\n' byte is always ASCII, no need for UTF-8 special casing */ - if (*p == '\n') - *p = ' '; - } - } - - if (window_title->title == NULL && uri) { - char *display_name; - - display_name = gnome_vfs_format_uri_for_display (uri); - window_title->title = g_path_get_basename (display_name); - g_free (display_name); - } + ev_window_title_update (window_title); +} - if (window_title->title == NULL) { - window_title->title = g_strdup (_("Document Viewer")); - } +void +ev_window_title_set_uri (EvWindowTitle *window_title, + const char *uri) +{ + g_free (window_title->uri); + window_title->uri = g_strdup (uri); ev_window_title_update (window_title); } @@ -124,6 +199,6 @@ ev_window_title_set_document (EvWindowTitle *window_title, void ev_window_title_free (EvWindowTitle *window_title) { - g_free (window_title->title); + g_free (window_title->uri); g_free (window_title); }