Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarco Pesenti Gritti <mpg@redhat.com>2005-09-16 11:55:26 (GMT)
committer Marco Pesenti Gritti <marco@src.gnome.org>2005-09-16 11:55:26 (GMT)
commit57eb84b3aa7def409e9b9939828b0a1f608e9a0e (patch)
tree34ca985f340ebd9bcbc92bb90f41f6d9bbf0ee08
parentc98583ed7fd17fef72c4d9787813059d2fa45a94 (diff)
Factor out and cleanup window title code
2005-09-16 Marco Pesenti Gritti <mpg@redhat.com> * shell/Makefile.am: * shell/ev-window-title.c: (ev_window_title_new), (ev_window_title_update), (ev_window_title_set_type), (ev_window_title_set_document), (ev_window_title_free): * shell/ev-window-title.h: * shell/ev-window.c: (ev_window_setup_document), (password_dialog_response), (ev_window_popup_password_dialog), (ev_window_dispose), (ev_window_init): Factor out and cleanup window title code
-rw-r--r--ChangeLog13
-rw-r--r--shell/Makefile.am2
-rw-r--r--shell/ev-window-title.c129
-rw-r--r--shell/ev-window-title.h46
-rw-r--r--shell/ev-window.c82
5 files changed, 206 insertions, 66 deletions
diff --git a/ChangeLog b/ChangeLog
index c572204..1a0f18f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,18 @@
2005-09-16 Marco Pesenti Gritti <mpg@redhat.com>
+ * shell/Makefile.am:
+ * shell/ev-window-title.c: (ev_window_title_new),
+ (ev_window_title_update), (ev_window_title_set_type),
+ (ev_window_title_set_document), (ev_window_title_free):
+ * shell/ev-window-title.h:
+ * shell/ev-window.c: (ev_window_setup_document),
+ (password_dialog_response), (ev_window_popup_password_dialog),
+ (ev_window_dispose), (ev_window_init):
+
+ Factor out and cleanup window title code
+
+2005-09-16 Marco Pesenti Gritti <mpg@redhat.com>
+
* shell/ev-window.c: (unable_to_load_dialog_response_cb),
(unable_to_load):
diff --git a/shell/Makefile.am b/shell/Makefile.am
index 9c032e5..27326a7 100644
--- a/shell/Makefile.am
+++ b/shell/Makefile.am
@@ -54,6 +54,8 @@ evince_SOURCES= \
ev-view.h \
ev-window.c \
ev-window.h \
+ ev-window-title.c \
+ ev-window-title.h \
ev-sidebar.c \
ev-sidebar.h \
ev-sidebar-links.c \
diff --git a/shell/ev-window-title.c b/shell/ev-window-title.c
new file mode 100644
index 0000000..86f75f3
--- /dev/null
+++ b/shell/ev-window-title.c
@@ -0,0 +1,129 @@
+/* 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 "ev-window-title.h"
+
+#include <glib/gi18n.h>
+#include <libgnomevfs/gnome-vfs-utils.h>
+
+struct _EvWindowTitle
+{
+ EvWindow *window;
+ EvDocument *document;
+ EvWindowTitleType type;
+ char *title;
+};
+
+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 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);
+}
+
+void
+ev_window_title_set_document (EvWindowTitle *window_title,
+ EvDocument *document,
+ const char *uri)
+{
+ 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);
+ }
+
+ if (window_title->title == NULL) {
+ window_title->title = g_strdup (_("Document Viewer"));
+ }
+
+ ev_window_title_update (window_title);
+}
+
+void
+ev_window_title_free (EvWindowTitle *window_title)
+{
+ g_free (window_title->title);
+ g_free (window_title);
+}
diff --git a/shell/ev-window-title.h b/shell/ev-window-title.h
new file mode 100644
index 0000000..b2035e2
--- /dev/null
+++ b/shell/ev-window-title.h
@@ -0,0 +1,46 @@
+/* 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.
+ */
+
+#ifndef __EV_WINDOW_TITLE_H__
+#define __EV_WINDOW_TITLE_H__
+
+#include "ev-window.h"
+#include "ev-document.h"
+
+G_BEGIN_DECLS
+
+typedef struct _EvWindowTitle EvWindowTitle;
+
+typedef enum
+{
+ EV_WINDOW_TITLE_DOCUMENT,
+ EV_WINDOW_TITLE_PASSWORD
+} EvWindowTitleType;
+
+EvWindowTitle *ev_window_title_new (EvWindow *window);
+void ev_window_title_set_type (EvWindowTitle *window_title,
+ EvWindowTitleType type);
+void ev_window_title_set_document (EvWindowTitle *window_title,
+ EvDocument *document,
+ const char *uri);
+void ev_window_title_free (EvWindowTitle *window_title);
+
+G_END_DECLS
+
+#endif /* __EV_WINDOW_TITLE_H__ */
diff --git a/shell/ev-window.c b/shell/ev-window.c
index 67bbfc8..c8e5ac9 100644
--- a/shell/ev-window.c
+++ b/shell/ev-window.c
@@ -29,6 +29,7 @@
#endif
#include "ev-window.h"
+#include "ev-window-title.h"
#include "ev-page-action.h"
#include "ev-sidebar.h"
#include "ev-sidebar-links.h"
@@ -62,6 +63,7 @@
#include "ev-metadata-manager.h"
#include "ev-file-helpers.h"
#include "ev-utils.h"
+#include "ev-debug.h"
#include <poppler.h>
@@ -105,6 +107,8 @@ struct _EvWindowPrivate {
GtkWidget *sidebar_thumbs;
GtkWidget *sidebar_links;
+ EvWindowTitle *title;
+
/* Dialogs */
GtkWidget *properties;
@@ -570,64 +574,6 @@ unable_to_load (EvWindow *ev_window,
}
static void
-update_window_title (EvDocument *document, GParamSpec *pspec, EvWindow *ev_window)
-{
- char *title = NULL;
- char *doc_title = NULL;
- gboolean password_needed;
-
- password_needed = (ev_window->priv->password_document != NULL);
- if (document && ev_window->priv->page_cache) {
- doc_title = g_strdup (ev_page_cache_get_title (ev_window->priv->page_cache));
-
- /* Make sure we get a valid title back */
- if (doc_title) {
- if (doc_title[0] == '\000' ||
- !g_utf8_validate (doc_title, -1, NULL)) {
- doc_title = NULL;
- }
- }
- }
-
- if (doc_title) {
- char *p;
-
- for (p = doc_title; *p; ++p) {
- /* an '\n' byte is always ASCII, no need for UTF-8 special casing */
- if (*p == '\n')
- *p = ' ';
- }
- }
-
- if (doc_title == NULL && ev_window->priv->uri) {
- char *display_name;
-
- display_name = gnome_vfs_format_uri_for_display (ev_window->priv->uri);
- doc_title = g_path_get_basename (display_name);
- g_free (display_name);
- }
-
- if (password_needed) {
- if (doc_title == NULL) {
- title = g_strdup (_("Document Viewer - Password Required"));
- } else {
- title = g_strdup_printf (_("%s - Password Required"), doc_title);
- }
- } else {
- if (doc_title == NULL) {
- title = g_strdup (_("Document Viewer"));
- } else {
- title = g_strdup (doc_title);
- }
- }
-
- gtk_window_set_title (GTK_WINDOW (ev_window), title);
-
- g_free (doc_title);
- g_free (title);
-}
-
-static void
find_changed_cb (EvDocument *document, int page, EvWindow *ev_window)
{
update_action_sensitivity (ev_window);
@@ -682,10 +628,6 @@ ev_window_setup_document (EvWindow *ev_window)
ev_window->priv->page_cache = ev_page_cache_get (ev_window->priv->document);
g_signal_connect (ev_window->priv->page_cache, "page-changed", G_CALLBACK (page_changed_cb), ev_window);
- g_signal_connect_object (G_OBJECT (document),
- "notify::title",
- G_CALLBACK (update_window_title),
- ev_window, 0);
if (EV_IS_DOCUMENT_FIND (document)) {
g_signal_connect_object (G_OBJECT (document),
"find_changed",
@@ -701,7 +643,7 @@ ev_window_setup_document (EvWindow *ev_window)
ev_view_set_document (view, document);
}
- update_window_title (document, NULL, ev_window);
+ ev_window_title_set_document (ev_window->priv->title, document, ev_window->priv->uri);
action = gtk_action_group_get_action (ev_window->priv->action_group, PAGE_SELECTOR_ACTION);
ev_page_action_set_document (EV_PAGE_ACTION (action), document);
update_action_sensitivity (ev_window);
@@ -744,7 +686,9 @@ password_dialog_response (GtkWidget *password_dialog,
ev_window->priv->password_document = NULL;
ev_window->priv->password_uri = NULL;
-
+
+ ev_window_title_set_type (ev_window->priv->title, EV_WINDOW_TITLE_DOCUMENT);
+
ev_job_queue_add_job (ev_window->priv->load_job, EV_JOB_PRIORITY_HIGH);
gtk_widget_destroy (password_dialog);
@@ -771,7 +715,8 @@ ev_window_popup_password_dialog (EvWindow *ev_window)
gtk_widget_set_sensitive (ev_window->priv->password_view, FALSE);
- update_window_title (ev_window->priv->password_document, NULL, ev_window);
+ ev_window_title_set_type (ev_window->priv->title, EV_WINDOW_TITLE_PASSWORD);
+
if (ev_window->priv->password_dialog == NULL) {
ev_window->priv->password_dialog =
g_object_new (EV_TYPE_PASSWORD_DIALOG, "uri", ev_window->priv->password_uri, NULL);
@@ -2757,6 +2702,11 @@ ev_window_dispose (GObject *object)
EvWindow *window = EV_WINDOW (object);
EvWindowPrivate *priv = window->priv;
+ if (priv->title) {
+ ev_window_title_free (priv->title);
+ priv->title = NULL;
+ }
+
if (priv->recent_view) {
g_object_unref (priv->recent_view);
priv->recent_view = NULL;
@@ -3309,7 +3259,7 @@ ev_window_init (EvWindow *ev_window)
ev_window->priv = EV_WINDOW_GET_PRIVATE (ev_window);
ev_window->priv->page_mode = PAGE_MODE_DOCUMENT;
- update_window_title (NULL, NULL, ev_window);
+ ev_window->priv->title = ev_window_title_new (ev_window);
ev_window->priv->main_box = gtk_vbox_new (FALSE, 0);
gtk_container_add (GTK_CONTAINER (ev_window), ev_window->priv->main_box);