]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-history.c
[dualscreen] fix crash on ctrl+w and fix control window closing
[evince.git] / shell / ev-history.c
index 08e2d1c443ae4371182b169769c451ce8cfa91f3..9b59014ca90eb473af6ca40a6739e266c7136f96 100644 (file)
  *
  *  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.
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  *
- *  $Id$
  */
 
 #include "config.h"
 
 #include <glib/gi18n.h>
+#include <string.h>
 
 #include "ev-history.h"
 
-struct _EvHistoryPrivate
+
+enum
 {
-       GList *links;
-       int current_index;
+       HISTORY_CHANGED,
+       N_SIGNALS
 };
 
-enum {
-       PROP_0,
-       PROP_INDEX
+static guint signals[N_SIGNALS] = {0, };
+
+struct _EvHistoryPrivate
+{
+       GList *links;
 };
 
 static void ev_history_init       (EvHistory *history);
 static void ev_history_class_init (EvHistoryClass *class);
 
-static GObjectClass *parent_class = NULL;
-
 G_DEFINE_TYPE (EvHistory, ev_history, G_TYPE_OBJECT)
 
 #define EV_HISTORY_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), EV_TYPE_HISTORY, EvHistoryPrivate))
@@ -50,7 +51,6 @@ ev_history_init (EvHistory *history)
        history->priv = EV_HISTORY_GET_PRIVATE (history);
 
        history->priv->links = NULL;
-       history->priv->current_index = -1;
 }
 
 static void
@@ -67,47 +67,7 @@ ev_history_finalize (GObject *object)
 
        free_links_list (history->priv->links);
 
-       parent_class->finalize (object);
-}
-
-static void
-ev_history_get_property (GObject *object, guint prop_id, GValue *value,
-                        GParamSpec *param_spec)
-{
-       EvHistory *self;
-
-       self = EV_HISTORY (object);
-
-       switch (prop_id) {
-       case PROP_INDEX:
-               g_value_set_int (value, self->priv->current_index);
-               break;
-       default:
-               G_OBJECT_WARN_INVALID_PROPERTY_ID (object,
-                                                  prop_id,
-                                                  param_spec);
-               break;
-       }
-}
-
-static void
-ev_history_set_property (GObject *object, guint prop_id, const GValue *value,
-                        GParamSpec *param_spec)
-{
-       EvHistory *self;
-       
-       self = EV_HISTORY (object);
-       
-       switch (prop_id) {
-       case PROP_INDEX:
-               ev_history_set_current_index (self, g_value_get_int (value));
-               break;
-       default:
-               G_OBJECT_WARN_INVALID_PROPERTY_ID (object,
-                                                  prop_id,
-                                                  param_spec);
-               break;
-       }
+       G_OBJECT_CLASS (ev_history_parent_class)->finalize (object);
 }
 
 static void
@@ -116,67 +76,48 @@ ev_history_class_init (EvHistoryClass *class)
        GObjectClass *object_class = G_OBJECT_CLASS (class);
 
        object_class->finalize = ev_history_finalize;
-       object_class->set_property = ev_history_set_property;
-       object_class->get_property = ev_history_get_property;
-
-       parent_class = g_type_class_peek_parent (class);
 
-       g_object_class_install_property (object_class,
-                                        PROP_INDEX,
-                                        g_param_spec_int ("index",
-                                                          "Current Index",
-                                                          "The current index",
-                                                           -1,
-                                                           G_MAXINT,
-                                                           0,
-                                                           G_PARAM_READWRITE));
+       signals[HISTORY_CHANGED] = 
+                   g_signal_new ("changed",
+                                 G_OBJECT_CLASS_TYPE (object_class),
+                                 G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+                                 G_STRUCT_OFFSET (EvHistoryClass, changed),
+                                 NULL, NULL,
+                                 g_cclosure_marshal_VOID__VOID,
+                                 G_TYPE_NONE, 0);
 
        g_type_class_add_private (object_class, sizeof (EvHistoryPrivate));
 }
 
+#define HISTORY_LENGTH   7
+
 void
 ev_history_add_link (EvHistory *history, EvLink *link)
 {
-       int length;
+       GList *l;
 
        g_return_if_fail (EV_IS_HISTORY (history));
        g_return_if_fail (EV_IS_LINK (link));
 
-       length = g_list_length (history->priv->links);
-       if (history->priv->current_index < length - 1) {
-               GList *l = g_list_nth (history->priv->links,
-                                      history->priv->current_index + 1);
-               
-               if (l->prev) {
-                       l->prev->next = NULL;
-                       free_links_list (l);
-               } else {
-                       free_links_list (history->priv->links);
-                       history->priv->links = NULL;
+       for (l = history->priv->links; l; l = l->next) {
+               if (!strcmp (ev_link_get_title (EV_LINK (l->data)), ev_link_get_title (link))) {
+                       g_object_unref (G_OBJECT (l->data));
+                       history->priv->links = g_list_delete_link (history->priv->links, l);
+                       break;
                }
        }
 
        g_object_ref (link);
        history->priv->links = g_list_append (history->priv->links,
                                              link);
-
-       length = g_list_length (history->priv->links);
-       history->priv->current_index = length - 1;
-}
-
-void
-ev_history_add_page (EvHistory *history, int page)
-{
-       EvLink *link;
-       char *title;
-
-       g_return_if_fail (EV_IS_HISTORY (history));
-
-       title = g_strdup_printf (_("Page %d"), page);
-       link = ev_link_new_page (title, page);
-       g_free (title);
-
-       ev_history_add_link (history, link);
+                                             
+       if (g_list_length (history->priv->links) > HISTORY_LENGTH) {
+               g_object_unref (G_OBJECT (history->priv->links->data));
+               history->priv->links = g_list_delete_link (history->priv->links, 
+                                                          history->priv->links);
+       }
+       
+       g_signal_emit (history, signals[HISTORY_CHANGED], 0);
 }
 
 EvLink *
@@ -199,26 +140,9 @@ ev_history_get_n_links (EvHistory *history)
        return g_list_length (history->priv->links);
 }
 
-int
-ev_history_get_current_index (EvHistory *history)
-{
-       g_return_val_if_fail (EV_IS_HISTORY (history), -1);
-
-       return history->priv->current_index;
-}
-
-void
-ev_history_set_current_index (EvHistory *history, int index)
-{
-       g_return_if_fail (EV_IS_HISTORY (history));
-
-       history->priv->current_index = index;
-
-       g_object_notify (G_OBJECT (history), "index");
-}
-
 EvHistory *
 ev_history_new (void)
 {
        return EV_HISTORY (g_object_new (EV_TYPE_HISTORY, NULL));
 }
+