]> www.fi.muni.cz Git - evince.git/commitdiff
Factor out and cleanup window title code
authorMarco Pesenti Gritti <mpg@redhat.com>
Fri, 16 Sep 2005 11:55:26 +0000 (11:55 +0000)
committerMarco Pesenti Gritti <marco@src.gnome.org>
Fri, 16 Sep 2005 11:55:26 +0000 (11:55 +0000)
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

ChangeLog
shell/Makefile.am
shell/ev-window-title.c [new file with mode: 0644]
shell/ev-window-title.h [new file with mode: 0644]
shell/ev-window.c

index c5722040e198b3eadfb1e52a0b67c1652121a40f..1a0f18fc405bd97ca12ef579785b0ef6290eae29 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+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),
index 9c032e5335498dd590427207ea8cd29ebd4b13ab..27326a718022e0f8dad3177c219012df4e16d807 100644 (file)
@@ -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 (file)
index 0000000..86f75f3
--- /dev/null
@@ -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 (file)
index 0000000..b2035e2
--- /dev/null
@@ -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__ */
index 67bbfc893abba7c7f14da58e2712db328d3518c0..c8e5ac9ffd7ab846175adf34f0f00437d8d0e6f4 100644 (file)
@@ -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;
 
@@ -569,64 +573,6 @@ unable_to_load (EvWindow   *ev_window,
        gtk_widget_show (dialog);
 }
 
-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)
 {
@@ -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);