/* this file is part of evince, a gnome document viewer * * Copyright (C) 2005 Red Hat, Inc * * Evince is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Evince is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * 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 /* 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; EvWindowTitleType type; 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 * ev_window_title_new (EvWindow *window) { EvWindowTitle *window_title; window_title = g_new0 (EvWindowTitle, 1); window_title->window = window; window_title->type = EV_WINDOW_TITLE_DOCUMENT; return window_title; } static char * get_filename_from_uri (const char *uri) { char *filename; char *basename; filename = g_uri_unescape_string (uri, NULL); 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 *title = NULL, *password_title, *p; if (window_title->document != NULL) { gchar *doc_title; doc_title = g_strdup (ev_document_get_title (window_title->document)); /* 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); } g_free (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, 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->uri); g_free (window_title); }