aboutsummaryrefslogtreecommitdiffstats
path: root/lib/ephy-state.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ephy-state.c')
-rw-r--r--lib/ephy-state.c302
1 files changed, 212 insertions, 90 deletions
diff --git a/lib/ephy-state.c b/lib/ephy-state.c
index 9bf28ebdc..5debe8cf5 100644
--- a/lib/ephy-state.c
+++ b/lib/ephy-state.c
@@ -1,6 +1,7 @@
/*
* Copyright (C) 2001 Matthew Mueller
* (C) 2002 Jorn Baayen <jorn@nl.linux.org>
+ * (C) 2003 Marco Pesenti Gritti <mpeseng@tin.it>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -16,142 +17,263 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
- * $Id$
*/
-#include <stdio.h>
-#include <stdlib.h>
+#include "ephy-state.h"
+#include "ephy-file-helpers.h"
+#include "ephy-node.h"
+#include "ephy-types.h"
+
#include <string.h>
-#include <gtk/gtkpaned.h>
#include <gtk/gtkwindow.h>
-#include <gtk/gtktreeview.h>
-#include <libgnomeui/gnome-app.h>
-#include <bonobo/bonobo-dock.h>
-#include <bonobo/bonobo-dock-layout.h>
-#include "ephy-state.h"
-#include "eel-gconf-extensions.h"
+#define STATES_FILE "states.xml"
+
+enum
+{
+ EPHY_NODE_STATE_PROP_NAME = 2,
+ EPHY_NODE_STATE_PROP_WIDTH = 3,
+ EPHY_NODE_STATE_PROP_HEIGHT = 4,
+ EPHY_NODE_STATE_PROP_MAXIMIZE = 5
+};
-#define CONF_GUL_STATE_PATH "/apps/epiphany/state"
+static EphyNode *states;
static void
-window_save_size (GtkWidget *window, const gchar *name)
+ephy_states_load (void)
{
- int width, height;
- gchar *buf;
+ xmlDocPtr doc;
+ xmlNodePtr root, child;
+ char *xml_file;
- gtk_window_get_size (GTK_WINDOW(window),
- &width, &height);
+ xml_file = g_build_filename (ephy_dot_dir (),
+ STATES_FILE,
+ NULL);
+
+ if (g_file_test (xml_file, G_FILE_TEST_EXISTS) == FALSE)
+ return;
- buf = g_strdup_printf (CONF_GUL_STATE_PATH "/%s/width",name);
- eel_gconf_set_integer (buf, width);
- g_free (buf);
+ doc = xmlParseFile (xml_file);
+ g_assert (doc != NULL);
- buf = g_strdup_printf (CONF_GUL_STATE_PATH "/%s/height",name);
- eel_gconf_set_integer (buf, height);
- g_free (buf);
+ root = xmlDocGetRootElement (doc);
+
+ for (child = root->children; child != NULL; child = child->next)
+ {
+ EphyNode *node;
+
+ node = ephy_node_new_from_xml (child);
+ }
+
+ xmlFreeDoc (doc);
+
+ g_free (xml_file);
}
-/**
- * ephy_state_save_window: save the window dimensions
- */
-void
-ephy_state_save_window (GtkWidget *window,
- const gchar *name)
+static void
+ephy_states_save (void)
{
- GdkWindowState state;
- gboolean maximized;
- gchar *buf;
+ xmlDocPtr doc;
+ xmlNodePtr root;
+ GPtrArray *children;
+ int i;
+ char *xml_file;
- state = gdk_window_get_state (GTK_WIDGET (window)->window);
- maximized = ((state & GDK_WINDOW_STATE_MAXIMIZED) > 0);
-
- buf = g_strdup_printf (CONF_GUL_STATE_PATH "/%s/maximized",name);
- eel_gconf_set_boolean (buf, maximized);
- g_free (buf);
+ xml_file = g_build_filename (ephy_dot_dir (),
+ STATES_FILE,
+ NULL);
+
+ /* save nodes to xml */
+ xmlIndentTreeOutput = TRUE;
+ doc = xmlNewDoc ("1.0");
- if (!maximized)
+ root = xmlNewDocNode (doc, NULL, "ephy_bookmarks", NULL);
+ xmlDocSetRootElement (doc, root);
+
+ children = ephy_node_get_children (states);
+ for (i = 0; i < children->len; i++)
{
- window_save_size (window, name);
+ EphyNode *kid;
+
+ kid = g_ptr_array_index (children, i);
+
+ ephy_node_save_to_xml (kid, root);
}
+ ephy_node_thaw (states);
+
+ xmlSaveFormatFile (xml_file, doc, 1);
+ g_free (xml_file);
}
-/**
- * ephy_window_load_state: load the window state
- */
-void
-ephy_state_load_window (GtkWidget *window,
- const gchar *name,
- int default_width,
- int default_height,
- gboolean position)
+static EphyNode *
+find_by_name (const char *name)
{
- gchar *buf;
- gint width, height;
- gboolean maximized;
+ EphyNode *result = NULL;
+ GPtrArray *children;
+ int i;
- buf = g_strdup_printf (CONF_GUL_STATE_PATH "/%s/maximized",name);
- maximized = eel_gconf_get_boolean (buf);
- g_free (buf);
+ children = ephy_node_get_children (states);
+ for (i = 0; i < children->len; i++)
+ {
+ EphyNode *kid;
+ const char *node_name;
+
+ kid = g_ptr_array_index (children, i);
- buf = g_strdup_printf (CONF_GUL_STATE_PATH "/%s/width",name);
- width = eel_gconf_get_integer (buf);
- g_free (buf);
+ node_name = ephy_node_get_property_string
+ (kid, EPHY_NODE_STATE_PROP_NAME);
+ if (strcmp (node_name, name) == 0)
+ {
+ result = kid;
+ }
+ }
+ ephy_node_thaw (states);
- buf = g_strdup_printf (CONF_GUL_STATE_PATH "/%s/height",name);
- height = eel_gconf_get_integer (buf);
- g_free (buf);
+ return result;
+}
- /* try default size */
- if (width == 0 && height == 0 &&
- default_width != -1 && default_height != -1)
+static void
+ensure_states (void)
+{
+ if (states == NULL)
{
- width = default_width;
- height = default_height;
+ states = ephy_node_new_with_id (STATES_NODE_ID);
+ ephy_states_load ();
}
+}
+
+static void
+ephy_state_window_set_size (GtkWidget *window, EphyNode *node)
+{
+ int width;
+ int height;
+ gboolean maximize;
+
+ width = ephy_node_get_property_int (node, EPHY_NODE_STATE_PROP_WIDTH);
+ height = ephy_node_get_property_int (node, EPHY_NODE_STATE_PROP_HEIGHT);
+ maximize = ephy_node_get_property_boolean (node, EPHY_NODE_STATE_PROP_MAXIMIZE);
- if (width != 0 && height != 0)
+ if (width > 0 && height > 0)
{
gtk_window_set_default_size
(GTK_WINDOW (window), width, height);
}
- if (maximized)
+ if (maximize)
{
- gtk_window_maximize (GTK_WINDOW(window));
+ gtk_window_maximize (GTK_WINDOW (window));
}
}
-/**
- * ephy_state_load_pane_pos: load the paned position
- */
-void
-ephy_state_load_pane_pos (GtkWidget *pane,
- const gchar *name)
+static void
+ephy_state_window_save_size (GtkWidget *window, EphyNode *node)
{
- if (pane != NULL)
+ int width, height;
+ gboolean maximize;
+ GdkWindowState state;
+ GValue value = { 0, };
+
+ state = gdk_window_get_state (GTK_WIDGET (window)->window);
+ maximize = ((state & GDK_WINDOW_STATE_MAXIMIZED) > 0);
+
+ gtk_window_get_size (GTK_WINDOW(window),
+ &width, &height);
+
+ if (!maximize)
{
- gint pane_pos;
- gchar *buf = g_strdup_printf (CONF_GUL_STATE_PATH "/%s", name);
- pane_pos = eel_gconf_get_integer (buf);
- g_free (buf);
+ g_value_init (&value, G_TYPE_INT);
+ g_value_set_int (&value, width);
+ ephy_node_set_property (node, EPHY_NODE_STATE_PROP_WIDTH,
+ &value);
+ g_value_unset (&value);
- if (pane_pos != -1)
- gtk_paned_set_position (GTK_PANED (pane), pane_pos);
+ g_value_init (&value, G_TYPE_INT);
+ g_value_set_int (&value, height);
+ ephy_node_set_property (node, EPHY_NODE_STATE_PROP_HEIGHT,
+ &value);
+ g_value_unset (&value);
}
+
+ g_value_init (&value, G_TYPE_BOOLEAN);
+ g_value_set_boolean (&value, maximize);
+ ephy_node_set_property (node, EPHY_NODE_STATE_PROP_MAXIMIZE,
+ &value);
+ g_value_unset (&value);
+}
+
+static gboolean
+window_configure_event_cb (GtkWidget *widget,
+ GdkEventConfigure *event,
+ EphyNode *node)
+{
+ ephy_state_window_save_size (widget, node);
+ return FALSE;
+}
+
+static gboolean
+window_state_event_cb (GtkWidget *widget,
+ GdkEventWindowState *event,
+ EphyNode *node)
+{
+ ephy_state_window_save_size (widget, node);
+ return FALSE;
}
-/**
- * gul_state_save_pane_pos: save the paned position
- */
void
-ephy_state_save_pane_pos (GtkWidget *pane,
- const gchar *name)
+ephy_state_add_window (GtkWidget *window,
+ const char *name,
+ int default_width,
+ int default_height)
{
- if (pane != NULL)
+ EphyNode *node;
+
+ ensure_states ();
+
+ node = find_by_name (name);
+ if (node == NULL)
{
- gchar *buf = g_strdup_printf (CONF_GUL_STATE_PATH "/%s", name);
- eel_gconf_set_integer (buf, GTK_PANED (pane)->child1_size);
- g_free (buf);
+ GValue value = { 0, };
+
+ node = ephy_node_new ();
+ ephy_node_add_child (states, node);
+
+ g_value_init (&value, G_TYPE_STRING);
+ g_value_set_string (&value, name);
+ ephy_node_set_property (node, EPHY_NODE_STATE_PROP_NAME,
+ &value);
+ g_value_unset (&value);
+
+ g_value_init (&value, G_TYPE_INT);
+ g_value_set_int (&value, default_width);
+ ephy_node_set_property (node, EPHY_NODE_STATE_PROP_WIDTH,
+ &value);
+ g_value_unset (&value);
+
+ g_value_init (&value, G_TYPE_INT);
+ g_value_set_int (&value, default_height);
+ ephy_node_set_property (node, EPHY_NODE_STATE_PROP_HEIGHT,
+ &value);
+ g_value_unset (&value);
+
+ g_value_init (&value, G_TYPE_BOOLEAN);
+ g_value_set_boolean (&value, FALSE);
+ ephy_node_set_property (node, EPHY_NODE_STATE_PROP_MAXIMIZE,
+ &value);
+ g_value_unset (&value);
}
+
+ ephy_state_window_set_size (window, node);
+
+ g_signal_connect_object (window, "configure_event",
+ G_CALLBACK (window_configure_event_cb), node, 0);
+ g_signal_connect_object (window, "window_state_event",
+ G_CALLBACK (window_state_event_cb), node, 0);
+}
+
+void
+ephy_state_save (void)
+{
+ ephy_states_save ();
+ ephy_node_unref (states);
+ states = NULL;
}