diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/ephy-dialog.c | 19 | ||||
-rw-r--r-- | lib/ephy-state.c | 302 | ||||
-rw-r--r-- | lib/ephy-state.h | 22 | ||||
-rw-r--r-- | lib/ephy-types.h | 3 |
4 files changed, 224 insertions, 122 deletions
diff --git a/lib/ephy-dialog.c b/lib/ephy-dialog.c index 8c8344dda..7262bc59c 100644 --- a/lib/ephy-dialog.c +++ b/lib/ephy-dialog.c @@ -837,26 +837,11 @@ impl_get_value (EphyDialog *dialog, } } -static gboolean -ephy_dialog_configure_event_cb (GtkWidget *widget, - GdkEventConfigure *event, - EphyDialog *dialog) -{ - ephy_state_save_window (widget, dialog->priv->name); - - return FALSE; -} - static void setup_default_size (EphyDialog *dialog) { - ephy_state_load_window (dialog->priv->dialog, - dialog->priv->name, -1, -1, FALSE); - - g_signal_connect (dialog->priv->dialog, - "configure_event", - G_CALLBACK (ephy_dialog_configure_event_cb), - dialog); + ephy_state_add_window (dialog->priv->dialog, + dialog->priv->name, -1, -1); } static gint 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; } diff --git a/lib/ephy-state.h b/lib/ephy-state.h index 508e986be..7e05e6106 100644 --- a/lib/ephy-state.h +++ b/lib/ephy-state.h @@ -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 @@ -15,29 +16,22 @@ * 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. - * - * $Id$ + * */ #ifndef EPHY_STATE_H #define EPHY_STATE_H -G_BEGIN_DECLS +#include "gtk/gtkwidget.h" -void ephy_state_save_window (GtkWidget *window, - const gchar *name); +G_BEGIN_DECLS -void ephy_state_load_window (GtkWidget *window, - const gchar *name, +void ephy_state_add_window (GtkWidget *window, + const char *name, int default_width, - int default_heigth, - gboolean position); - -void ephy_state_save_pane_pos (GtkWidget *pane, - const gchar *name); + int default_heigth); -void ephy_state_load_pane_pos (GtkWidget *pane, - const gchar *name); +void ephy_state_save (void); G_END_DECLS diff --git a/lib/ephy-types.h b/lib/ephy-types.h index 4b3652527..3d8b6be06 100644 --- a/lib/ephy-types.h +++ b/lib/ephy-types.h @@ -37,9 +37,10 @@ enum BOOKMARKS_NODE_ID = 0, KEYWORDS_NODE_ID = 1, FAVORITES_NODE_ID = 2, + STATES_NODE_ID = 4, HOSTS_NODE_ID = 5, PAGES_NODE_ID = 6, - ICONS_NODE_ID = 9, + ICONS_NODE_ID = 9 }; G_END_DECLS |