diff options
Diffstat (limited to 'shell/ev-window-title.c')
-rw-r--r-- | shell/ev-window-title.c | 203 |
1 files changed, 203 insertions, 0 deletions
diff --git a/shell/ev-window-title.c b/shell/ev-window-title.c new file mode 100644 index 00000000..ad2837a4 --- /dev/null +++ b/shell/ev-window-title.c @@ -0,0 +1,203 @@ +/* this file is part of evince, a mate 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <config.h> +#include "ev-window-title.h" +#include "ev-backends-manager.h" +#include "ev-utils.h" + +#include <string.h> +#include <gio/gio.h> +#include <glib/gi18n.h> + +/* 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); +} |