X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=shell%2Fev-window-title.c;h=3a7d908dafeb99fec468421fc2e310eaa6cf1f4d;hb=88f0701b10f70b8aede0f7e23014875ab72c2e26;hp=cfa013e270f8d38df081a85b3dcfda49708d8fee;hpb=ea7ab15dc184f23fad8b853cbd227b39356c3732;p=evince.git diff --git a/shell/ev-window-title.c b/shell/ev-window-title.c index cfa013e2..3a7d908d 100644 --- a/shell/ev-window-title.c +++ b/shell/ev-window-title.c @@ -32,14 +32,17 @@ typedef struct struct _EvWindowTitle { EvWindow *window; - EvDocument *document; EvWindowTitleType type; - char *title; + EvDocument *document; + char *uri; }; static const BadExtensionEntry bad_extensions[] = { { EV_BACKEND_PS, ".dvi" }, - { EV_BACKEND_PDF, ".doc" } + { EV_BACKEND_PDF, ".doc" }, + { EV_BACKEND_PDF, ".dvi" }, + { EV_BACKEND_PDF, ".indd" }, + { EV_BACKEND_PDF, ".rtf" } }; EvWindowTitle * @@ -54,33 +57,6 @@ ev_window_title_new (EvWindow *window) return window_title; } -static void -ev_window_title_update (EvWindowTitle *window_title) -{ - GtkWindow *window = GTK_WINDOW (window_title->window); - char *password_title; - - switch (window_title->type) { - case EV_WINDOW_TITLE_DOCUMENT: - gtk_window_set_title (window, window_title->title); - break; - case EV_WINDOW_TITLE_PASSWORD: - password_title = g_strdup_printf (_("%s - Password Required"), - window_title->title); - gtk_window_set_title (window, password_title); - g_free (password_title); - break; - } -} - -void -ev_window_title_set_type (EvWindowTitle *window_title, EvWindowTitleType type) -{ - window_title->type = type; - - ev_window_title_update (window_title); -} - static char * get_filename_from_uri (const char *uri) { @@ -94,74 +70,111 @@ get_filename_from_uri (const char *uri) return filename; } -void -ev_window_title_set_document (EvWindowTitle *window_title, - EvDocument *document, - const char *uri) -{ - EvPageCache *page_cache; - const char *title; +/* 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_extension (EvWindowTitle *window_title, char **title) { + EvBackend backend; int i; - window_title->document = document; + backend = ev_document_factory_get_backend (window_title->document); + for (i = 0; i < G_N_ELEMENTS (bad_extensions); i++) { + if (bad_extensions[i].backend == backend && + g_str_has_suffix (*title, bad_extensions[i].ext)) { + char *new_title; + char *filename = get_filename_from_uri (window_title->uri); - g_free (window_title->title); + new_title = g_strdup_printf ("%s (%s)", *title, filename); + g_free (*title); + *title = new_title; - if (document == NULL) { - window_title->title = NULL; - return; + g_free (filename); + } } +} - 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); - } +static void +ev_window_title_update (EvWindowTitle *window_title) +{ + GtkWindow *window = GTK_WINDOW (window_title->window); + char *title = NULL, *password_title, *p; + EvPageCache *page_cache; - if (window_title->title) { - char *p; + if (window_title->document != NULL) { + char *doc_title; - /* Some docs report titles with confusing extensions (ex. .doc for pdf). - Let's show the filename in this case */ - for (i = 0; i < G_N_ELEMENTS (bad_extensions); i++) { - if (bad_extensions[i].backend == ev_document_factory_get_backend (document) && - g_str_has_suffix (window_title->title, bad_extensions[i].ext)) { - char *new_title; - char *filename = get_filename_from_uri (uri); + 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); - new_title = g_strdup_printf ("%s (%s)", window_title->title, filename); - g_free (window_title->title); - window_title->title = new_title; + /* Make sure we get a valid title back */ + if (doc_title != NULL) { + doc_title = g_strstrip (doc_title); - g_free (filename); + if (doc_title[0] != '\0' && + g_utf8_validate (doc_title, -1, NULL)) { + title = g_strdup (doc_title); } } + } - 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 (title && window_title->uri) { + ev_window_title_sanitize_extension (window_title, &title); + } else if (window_title->uri) { + title = get_filename_from_uri (window_title->uri); + } else if (!title) { + title = g_strdup (_("Document Viewer")); } - if (window_title->title == NULL && uri) { - window_title->title = get_filename_from_uri (uri); + for (p = 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) { - window_title->title = g_strdup (_("Document Viewer")); + switch (window_title->type) { + case EV_WINDOW_TITLE_DOCUMENT: + gtk_window_set_title (window, title); + break; + case EV_WINDOW_TITLE_PASSWORD: + 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 +ev_window_title_set_type (EvWindowTitle *window_title, EvWindowTitleType type) +{ + window_title->type = type; + + ev_window_title_update (window_title); +} + +void +ev_window_title_set_document (EvWindowTitle *window_title, + EvDocument *document) +{ + window_title->document = document; + + ev_window_title_update (window_title); +} + +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); } void ev_window_title_free (EvWindowTitle *window_title) { - g_free (window_title->title); + g_free (window_title->uri); g_free (window_title); }