* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*/
+#include <config.h>
#include "ev-window-title.h"
-#include "ev-document-factory.h"
+#include "ev-backends-manager.h"
#include <glib/gi18n.h>
#include <libgnomevfs/gnome-vfs-utils.h>
+/* Known backends (for bad extensions fix) */
+#define EV_BACKEND_PS "psdocument"
+#define EV_BACKEND_PDF "pdfdocument"
+
typedef struct
{
- EvBackend backend;
- const char *ext;
+ const gchar *backend;
+ const gchar *ext;
} BadExtensionEntry;
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 *
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)
{
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) {
+ const gchar *backend;
int i;
- 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);
+ backend = ev_backends_manager_get_document_module_name (window_title->document);
- /* 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);
- }
-
- /* 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)) {
+ if (g_ascii_strcasecmp (bad_extensions[i].backend, backend) == 0 &&
+ g_str_has_suffix (*title, bad_extensions[i].ext)) {
char *new_title;
- char *filename = get_filename_from_uri (uri);
+ char *filename = get_filename_from_uri (window_title->uri);
- new_title = g_strdup_printf ("%s (%s)", window_title->title, filename);
- g_free (window_title->title);
- window_title->title = new_title;
+ new_title = g_strdup_printf ("%s (%s)", *title, filename);
+ g_free (*title);
+ *title = new_title;
g_free (filename);
}
- }
+ }
+}
+
+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->document != NULL) {
+ char *doc_title;
- if (window_title->title) {
- char *p;
+ 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);
- for (p = window_title->title; *p; ++p) {
- /* an '\n' byte is always ASCII, no need for UTF-8 special casing */
- if (*p == '\n')
- *p = ' ';
+ /* 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 (window_title->title == NULL && uri) {
- window_title->title = get_filename_from_uri (uri);
+ 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"));
+ }
+
+ 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);
}