diff options
Diffstat (limited to 'lib/ephy-state.c')
-rw-r--r-- | lib/ephy-state.c | 302 |
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; } |