summaryrefslogtreecommitdiff
path: root/lib/ephy-node.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ephy-node.c')
-rw-r--r--lib/ephy-node.c1814
1 files changed, 887 insertions, 927 deletions
diff --git a/lib/ephy-node.c b/lib/ephy-node.c
index 9216a38c2..0303fdafd 100644
--- a/lib/ephy-node.c
+++ b/lib/ephy-node.c
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright © 2002 Jorn Baayen <jorn@nl.linux.org>
* Copyright © 2003 Marco Pesenti Gritti
* Copyright © 2003 Christian Persch
@@ -29,356 +29,348 @@
#include "ephy-node.h"
-typedef struct
-{
- EphyNode *node;
- int id;
- EphyNodeCallback callback;
- EphyNodeSignalType type;
- gpointer data;
- gboolean invalidated;
+typedef struct {
+ EphyNode *node;
+ int id;
+ EphyNodeCallback callback;
+ EphyNodeSignalType type;
+ gpointer data;
+ gboolean invalidated;
} EphyNodeSignalData;
-typedef struct
-{
- EphyNode *node;
- guint index;
+typedef struct {
+ EphyNode *node;
+ guint index;
} EphyNodeParent;
-typedef struct
-{
- EphyNode *node;
- guint property_id;
+typedef struct {
+ EphyNode *node;
+ guint property_id;
} EphyNodeChange;
-struct _EphyNode
-{
- int ref_count;
+struct _EphyNode {
+ int ref_count;
- guint id;
+ guint id;
- GPtrArray *properties;
+ GPtrArray *properties;
- GHashTable *parents;
- GPtrArray *children;
+ GHashTable *parents;
+ GPtrArray *children;
- GHashTable *signals;
- int signal_id;
- guint emissions;
- guint invalidated_signals;
- guint is_drag_source : 1;
- guint is_drag_dest : 1;
+ GHashTable *signals;
+ int signal_id;
+ guint emissions;
+ guint invalidated_signals;
+ guint is_drag_source : 1;
+ guint is_drag_dest : 1;
- EphyNodeDb *db;
+ EphyNodeDb *db;
};
-typedef struct
-{
- EphyNodeSignalType type;
- va_list valist;
+typedef struct {
+ EphyNodeSignalType type;
+ va_list valist;
} ENESCData;
static gboolean
int_equal (gconstpointer a,
- gconstpointer b)
+ gconstpointer b)
{
- return GPOINTER_TO_INT (a) == GPOINTER_TO_INT (b);
+ return GPOINTER_TO_INT (a) == GPOINTER_TO_INT (b);
}
static guint
int_hash (gconstpointer a)
{
- return GPOINTER_TO_INT (a);
+ return GPOINTER_TO_INT (a);
}
static void
callback (long id, EphyNodeSignalData *data, gpointer *dummy)
{
- ENESCData *user_data;
- va_list valist;
+ ENESCData *user_data;
+ va_list valist;
+
+ if (data->invalidated) return;
+
+ user_data = (ENESCData *)dummy;
- if (data->invalidated) return;
+ G_VA_COPY (valist, user_data->valist);
- user_data = (ENESCData *) dummy;
+ if (data->type != user_data->type) return;
- G_VA_COPY(valist, user_data->valist);
+ switch (data->type) {
+ case EPHY_NODE_DESTROY:
+ case EPHY_NODE_RESTORED:
+ data->callback (data->node, data->data);
+ break;
- if (data->type != user_data->type) return;
+ case EPHY_NODE_CHANGED:
+ {
+ guint property_id;
- switch (data->type)
- {
- case EPHY_NODE_DESTROY:
- case EPHY_NODE_RESTORED:
- data->callback (data->node, data->data);
- break;
+ property_id = va_arg (valist, guint);
- case EPHY_NODE_CHANGED:
- {
- guint property_id;
+ data->callback (data->node, property_id, data->data);
+ }
+ break;
- property_id = va_arg (valist, guint);
-
- data->callback (data->node, property_id, data->data);
- }
- break;
+ case EPHY_NODE_CHILD_ADDED:
+ {
+ EphyNode *node;
- case EPHY_NODE_CHILD_ADDED:
- {
- EphyNode *node;
+ node = va_arg (valist, EphyNode *);
- node = va_arg (valist, EphyNode *);
-
- data->callback (data->node, node, data->data);
- }
- break;
+ data->callback (data->node, node, data->data);
+ }
+ break;
- case EPHY_NODE_CHILD_CHANGED:
- {
- EphyNode *node;
- guint property_id;
+ case EPHY_NODE_CHILD_CHANGED:
+ {
+ EphyNode *node;
+ guint property_id;
- node = va_arg (valist, EphyNode *);
- property_id = va_arg (valist, guint);
-
- data->callback (data->node, node, property_id, data->data);
- }
- break;
+ node = va_arg (valist, EphyNode *);
+ property_id = va_arg (valist, guint);
- case EPHY_NODE_CHILD_REMOVED:
- {
- EphyNode *node;
- guint last_index;
+ data->callback (data->node, node, property_id, data->data);
+ }
+ break;
- node = va_arg (valist, EphyNode *);
- last_index = va_arg (valist, guint);
+ case EPHY_NODE_CHILD_REMOVED:
+ {
+ EphyNode *node;
+ guint last_index;
- data->callback (data->node, node, last_index, data->data);
- }
- break;
+ node = va_arg (valist, EphyNode *);
+ last_index = va_arg (valist, guint);
- case EPHY_NODE_CHILDREN_REORDERED:
- data->callback (data->node, va_arg (valist, int *), data->data);
- break;
+ data->callback (data->node, node, last_index, data->data);
+ }
+ break;
- default:
- break;
- }
+ case EPHY_NODE_CHILDREN_REORDERED:
+ data->callback (data->node, va_arg (valist, int *), data->data);
+ break;
- va_end(valist);
+ default:
+ break;
+ }
+
+ va_end (valist);
}
static gboolean
-remove_invalidated_signals (long id,
- EphyNodeSignalData *data,
- gpointer user_data)
+remove_invalidated_signals (long id,
+ EphyNodeSignalData *data,
+ gpointer user_data)
{
- return data->invalidated;
+ return data->invalidated;
}
static void
ephy_node_emit_signal (EphyNode *node, EphyNodeSignalType type, ...)
{
- ENESCData data;
+ ENESCData data;
- ++node->emissions;
+ ++node->emissions;
- va_start (data.valist, type);
+ va_start (data.valist, type);
- data.type = type;
+ data.type = type;
- g_hash_table_foreach (node->signals,
- (GHFunc) callback,
- &data);
+ g_hash_table_foreach (node->signals,
+ (GHFunc)callback,
+ &data);
- va_end (data.valist);
+ va_end (data.valist);
- if (G_UNLIKELY (--node->emissions == 0 && node->invalidated_signals))
- {
- guint removed;
+ if (G_UNLIKELY (--node->emissions == 0 && node->invalidated_signals)) {
+ guint removed;
- removed = g_hash_table_foreach_remove
- (node->signals,
- (GHRFunc) remove_invalidated_signals,
- NULL);
- g_assert (removed == node->invalidated_signals);
+ removed = g_hash_table_foreach_remove
+ (node->signals,
+ (GHRFunc)remove_invalidated_signals,
+ NULL);
+ g_assert (removed == node->invalidated_signals);
- node->invalidated_signals = 0;
- }
+ node->invalidated_signals = 0;
+ }
}
static inline void
real_remove_child (EphyNode *node,
- EphyNode *child,
- gboolean remove_from_parent,
- gboolean remove_from_child)
+ EphyNode *child,
+ gboolean remove_from_parent,
+ gboolean remove_from_child)
{
- EphyNodeParent *node_info;
+ EphyNodeParent *node_info;
- node_info = g_hash_table_lookup (child->parents,
- GINT_TO_POINTER (node->id));
+ node_info = g_hash_table_lookup (child->parents,
+ GINT_TO_POINTER (node->id));
- if (remove_from_parent) {
- guint i;
- guint old_index;
+ if (remove_from_parent) {
+ guint i;
+ guint old_index;
- old_index = node_info->index;
+ old_index = node_info->index;
- g_ptr_array_remove_index (node->children,
- node_info->index);
+ g_ptr_array_remove_index (node->children,
+ node_info->index);
- /* correct indices on kids */
- for (i = node_info->index; i < node->children->len; i++) {
- EphyNode *borked_node;
- EphyNodeParent *borked_node_info;
+ /* correct indices on kids */
+ for (i = node_info->index; i < node->children->len; i++) {
+ EphyNode *borked_node;
+ EphyNodeParent *borked_node_info;
- borked_node = g_ptr_array_index (node->children, i);
+ borked_node = g_ptr_array_index (node->children, i);
- borked_node_info = g_hash_table_lookup (borked_node->parents,
- GINT_TO_POINTER (node->id));
- borked_node_info->index--;
- }
+ borked_node_info = g_hash_table_lookup (borked_node->parents,
+ GINT_TO_POINTER (node->id));
+ borked_node_info->index--;
+ }
- ephy_node_emit_signal (node, EPHY_NODE_CHILD_REMOVED, child, old_index);
- }
+ ephy_node_emit_signal (node, EPHY_NODE_CHILD_REMOVED, child, old_index);
+ }
- if (remove_from_child) {
- g_hash_table_remove (child->parents,
- GINT_TO_POINTER (node->id));
- }
+ if (remove_from_child) {
+ g_hash_table_remove (child->parents,
+ GINT_TO_POINTER (node->id));
+ }
}
static void
-remove_child (long id,
- EphyNodeParent *node_info,
- EphyNode *node)
+remove_child (long id,
+ EphyNodeParent *node_info,
+ EphyNode *node)
{
- real_remove_child (node_info->node, node, TRUE, FALSE);
+ real_remove_child (node_info->node, node, TRUE, FALSE);
}
static void
signal_object_weak_notify (EphyNodeSignalData *signal_data,
- GObject *where_the_object_was)
+ GObject *where_the_object_was)
{
- signal_data->data = NULL;
- ephy_node_signal_disconnect (signal_data->node, signal_data->id);
+ signal_data->data = NULL;
+ ephy_node_signal_disconnect (signal_data->node, signal_data->id);
}
static void
destroy_signal_data (EphyNodeSignalData *signal_data)
{
- if (signal_data->data)
- {
- g_object_weak_unref (G_OBJECT (signal_data->data),
- (GWeakNotify)signal_object_weak_notify,
- signal_data);
- }
-
- g_slice_free (EphyNodeSignalData, signal_data);
+ if (signal_data->data) {
+ g_object_weak_unref (G_OBJECT (signal_data->data),
+ (GWeakNotify)signal_object_weak_notify,
+ signal_data);
+ }
+
+ g_slice_free (EphyNodeSignalData, signal_data);
}
static void
node_parent_free (EphyNodeParent *parent)
{
- g_slice_free (EphyNodeParent, parent);
+ g_slice_free (EphyNodeParent, parent);
}
static void
ephy_node_destroy (EphyNode *node)
{
- guint i;
+ guint i;
- ephy_node_emit_signal (node, EPHY_NODE_DESTROY);
+ ephy_node_emit_signal (node, EPHY_NODE_DESTROY);
- /* Remove from parents. */
- g_hash_table_foreach (node->parents,
- (GHFunc) remove_child,
- node);
- g_hash_table_destroy (node->parents);
+ /* Remove from parents. */
+ g_hash_table_foreach (node->parents,
+ (GHFunc)remove_child,
+ node);
+ g_hash_table_destroy (node->parents);
- /* Remove children. */
- for (i = 0; i < node->children->len; i++) {
- EphyNode *child;
+ /* Remove children. */
+ for (i = 0; i < node->children->len; i++) {
+ EphyNode *child;
- child = g_ptr_array_index (node->children, i);
+ child = g_ptr_array_index (node->children, i);
- real_remove_child (node, child, FALSE, TRUE);
- }
- g_ptr_array_free (node->children, TRUE);
-
- /* Remove signals. */
- g_hash_table_destroy (node->signals);
+ real_remove_child (node, child, FALSE, TRUE);
+ }
+ g_ptr_array_free (node->children, TRUE);
- /* Remove id. */
- _ephy_node_db_remove_id (node->db, node->id);
+ /* Remove signals. */
+ g_hash_table_destroy (node->signals);
- /* Remove properties. */
- for (i = 0; i < node->properties->len; i++) {
- GValue *val;
+ /* Remove id. */
+ _ephy_node_db_remove_id (node->db, node->id);
- val = g_ptr_array_index (node->properties, i);
+ /* Remove properties. */
+ for (i = 0; i < node->properties->len; i++) {
+ GValue *val;
- if (val != NULL) {
- g_value_unset (val);
- g_slice_free (GValue, val);
- }
- }
- g_ptr_array_free (node->properties, TRUE);
+ val = g_ptr_array_index (node->properties, i);
- g_slice_free (EphyNode, node);
+ if (val != NULL) {
+ g_value_unset (val);
+ g_slice_free (GValue, val);
+ }
+ }
+ g_ptr_array_free (node->properties, TRUE);
+
+ g_slice_free (EphyNode, node);
}
EphyNode *
ephy_node_new (EphyNodeDb *db)
{
- long id;
+ long id;
- g_return_val_if_fail (EPHY_IS_NODE_DB (db), NULL);
+ g_return_val_if_fail (EPHY_IS_NODE_DB (db), NULL);
- if (ephy_node_db_is_immutable (db)) return NULL;
+ if (ephy_node_db_is_immutable (db)) return NULL;
- id = _ephy_node_db_new_id (db);
+ id = _ephy_node_db_new_id (db);
- return ephy_node_new_with_id (db, id);
+ return ephy_node_new_with_id (db, id);
}
EphyNode *
ephy_node_new_with_id (EphyNodeDb *db, guint reserved_id)
{
- EphyNode *node;
+ EphyNode *node;
- g_return_val_if_fail (EPHY_IS_NODE_DB (db), NULL);
+ g_return_val_if_fail (EPHY_IS_NODE_DB (db), NULL);
- if (ephy_node_db_is_immutable (db)) return NULL;
+ if (ephy_node_db_is_immutable (db)) return NULL;
- node = g_slice_new0 (EphyNode);
+ node = g_slice_new0 (EphyNode);
- node->ref_count = 1;
+ node->ref_count = 1;
- node->id = reserved_id;
+ node->id = reserved_id;
- node->db = db;
+ node->db = db;
- node->properties = g_ptr_array_new ();
+ node->properties = g_ptr_array_new ();
- node->children = g_ptr_array_new ();
+ node->children = g_ptr_array_new ();
- node->parents = g_hash_table_new_full
- (int_hash, int_equal, NULL, (GDestroyNotify) node_parent_free);
+ node->parents = g_hash_table_new_full
+ (int_hash, int_equal, NULL, (GDestroyNotify)node_parent_free);
- node->signals = g_hash_table_new_full
- (int_hash, int_equal, NULL,
- (GDestroyNotify)destroy_signal_data);
+ node->signals = g_hash_table_new_full
+ (int_hash, int_equal, NULL,
+ (GDestroyNotify)destroy_signal_data);
- node->signal_id = 0;
- node->emissions = 0;
- node->invalidated_signals = 0;
- node->is_drag_source = TRUE;
- node->is_drag_dest = TRUE;
+ node->signal_id = 0;
+ node->emissions = 0;
+ node->invalidated_signals = 0;
+ node->is_drag_source = TRUE;
+ node->is_drag_dest = TRUE;
- _ephy_node_db_add_id (db, reserved_id, node);
+ _ephy_node_db_add_id (db, reserved_id, node);
- return node;
+ return node;
}
/**
@@ -389,108 +381,107 @@ ephy_node_new_with_id (EphyNodeDb *db, guint reserved_id)
EphyNodeDb *
ephy_node_get_db (EphyNode *node)
{
- g_return_val_if_fail (EPHY_IS_NODE (node), NULL);
-
- return node->db;
+ g_return_val_if_fail (EPHY_IS_NODE (node), NULL);
+
+ return node->db;
}
guint
ephy_node_get_id (EphyNode *node)
{
- long ret;
+ long ret;
- g_return_val_if_fail (EPHY_IS_NODE (node), G_MAXUINT);
+ g_return_val_if_fail (EPHY_IS_NODE (node), G_MAXUINT);
- ret = node->id;
+ ret = node->id;
- return ret;
+ return ret;
}
void
ephy_node_ref (EphyNode *node)
{
- g_return_if_fail (EPHY_IS_NODE (node));
+ g_return_if_fail (EPHY_IS_NODE (node));
- node->ref_count++;
+ node->ref_count++;
}
void
ephy_node_unref (EphyNode *node)
{
- g_return_if_fail (EPHY_IS_NODE (node));
+ g_return_if_fail (EPHY_IS_NODE (node));
- node->ref_count--;
+ node->ref_count--;
- if (node->ref_count <= 0) {
- ephy_node_destroy (node);
- }
+ if (node->ref_count <= 0) {
+ ephy_node_destroy (node);
+ }
}
static void
-child_changed (guint id,
- EphyNodeParent *node_info,
- EphyNodeChange *change)
+child_changed (guint id,
+ EphyNodeParent *node_info,
+ EphyNodeChange *change)
{
- ephy_node_emit_signal (node_info->node, EPHY_NODE_CHILD_CHANGED,
- change->node, change->property_id);
+ ephy_node_emit_signal (node_info->node, EPHY_NODE_CHILD_CHANGED,
+ change->node, change->property_id);
}
static inline void
real_set_property (EphyNode *node,
- guint property_id,
- GValue *value)
+ guint property_id,
+ GValue *value)
{
- GValue *old;
+ GValue *old;
- if (property_id >= node->properties->len) {
- g_ptr_array_set_size (node->properties, property_id + 1);
- }
+ if (property_id >= node->properties->len) {
+ g_ptr_array_set_size (node->properties, property_id + 1);
+ }
- old = g_ptr_array_index (node->properties, property_id);
- if (old != NULL) {
- g_value_unset (old);
- g_slice_free (GValue, old);
- }
+ old = g_ptr_array_index (node->properties, property_id);
+ if (old != NULL) {
+ g_value_unset (old);
+ g_slice_free (GValue, old);
+ }
- g_ptr_array_index (node->properties, property_id) = value;
+ g_ptr_array_index (node->properties, property_id) = value;
}
static inline void
ephy_node_set_property_internal (EphyNode *node,
- guint property_id,
- GValue *value)
+ guint property_id,
+ GValue *value)
{
- EphyNodeChange change;
+ EphyNodeChange change;
- real_set_property (node, property_id, value);
+ real_set_property (node, property_id, value);
- change.node = node;
- change.property_id = property_id;
- g_hash_table_foreach (node->parents,
- (GHFunc) child_changed,
- &change);
-
- ephy_node_emit_signal (node, EPHY_NODE_CHANGED, property_id);
+ change.node = node;
+ change.property_id = property_id;
+ g_hash_table_foreach (node->parents,
+ (GHFunc)child_changed,
+ &change);
+ ephy_node_emit_signal (node, EPHY_NODE_CHANGED, property_id);
}
void
-ephy_node_set_property (EphyNode *node,
- guint property_id,
- const GValue *value)
+ephy_node_set_property (EphyNode *node,
+ guint property_id,
+ const GValue *value)
{
- GValue *new;
+ GValue *new;
- g_return_if_fail (EPHY_IS_NODE (node));
- g_return_if_fail (value != NULL);
+ g_return_if_fail (EPHY_IS_NODE (node));
+ g_return_if_fail (value != NULL);
- if (ephy_node_db_is_immutable (node->db)) return;
+ if (ephy_node_db_is_immutable (node->db)) return;
- new = g_slice_new0 (GValue);
- g_value_init (new, G_VALUE_TYPE (value));
- g_value_copy (value, new);
+ new = g_slice_new0 (GValue);
+ g_value_init (new, G_VALUE_TYPE (value));
+ g_value_copy (value, new);
- ephy_node_set_property_internal (node, property_id, new);
+ ephy_node_set_property_internal (node, property_id, new);
}
/**
@@ -500,273 +491,273 @@ ephy_node_set_property (EphyNode *node,
*/
gboolean
ephy_node_get_property (EphyNode *node,
- guint property_id,
- GValue *value)
+ guint property_id,
+ GValue *value)
{
- GValue *ret;
+ GValue *ret;
- g_return_val_if_fail (EPHY_IS_NODE (node), FALSE);
- g_return_val_if_fail (value != NULL, FALSE);
+ g_return_val_if_fail (EPHY_IS_NODE (node), FALSE);
+ g_return_val_if_fail (value != NULL, FALSE);
- if (property_id >= node->properties->len) {
- return FALSE;
- }
+ if (property_id >= node->properties->len) {
+ return FALSE;
+ }
- ret = g_ptr_array_index (node->properties, property_id);
- if (ret == NULL) {
- return FALSE;
- }
+ ret = g_ptr_array_index (node->properties, property_id);
+ if (ret == NULL) {
+ return FALSE;
+ }
- g_value_init (value, G_VALUE_TYPE (ret));
- g_value_copy (ret, value);
+ g_value_init (value, G_VALUE_TYPE (ret));
+ g_value_copy (ret, value);
- return TRUE;
+ return TRUE;
}
void
-ephy_node_set_property_string (EphyNode *node,
- guint property_id,
- const char *value)
+ephy_node_set_property_string (EphyNode *node,
+ guint property_id,
+ const char *value)
{
- GValue *new;
+ GValue *new;
- g_return_if_fail (EPHY_IS_NODE (node));
+ g_return_if_fail (EPHY_IS_NODE (node));
- if (ephy_node_db_is_immutable (node->db)) return;
+ if (ephy_node_db_is_immutable (node->db)) return;
- new = g_slice_new0 (GValue);
- g_value_init (new, G_TYPE_STRING);
- g_value_set_string (new, value);
+ new = g_slice_new0 (GValue);
+ g_value_init (new, G_TYPE_STRING);
+ g_value_set_string (new, value);
- ephy_node_set_property_internal (node, property_id, new);
+ ephy_node_set_property_internal (node, property_id, new);
}
const char *
ephy_node_get_property_string (EphyNode *node,
- guint property_id)
+ guint property_id)
{
- GValue *ret;
- const char *retval;
+ GValue *ret;
+ const char *retval;
- g_return_val_if_fail (EPHY_IS_NODE (node), NULL);
+ g_return_val_if_fail (EPHY_IS_NODE (node), NULL);
- if (property_id >= node->properties->len) {
- return NULL;
- }
+ if (property_id >= node->properties->len) {
+ return NULL;
+ }
- ret = g_ptr_array_index (node->properties, property_id);
- if (ret == NULL) {
- return NULL;
- }
+ ret = g_ptr_array_index (node->properties, property_id);
+ if (ret == NULL) {
+ return NULL;
+ }
- retval = g_value_get_string (ret);
+ retval = g_value_get_string (ret);
- return retval;
+ return retval;
}
void
ephy_node_set_property_boolean (EphyNode *node,
- guint property_id,
- gboolean value)
+ guint property_id,
+ gboolean value)
{
- GValue *new;
+ GValue *new;
- g_return_if_fail (EPHY_IS_NODE (node));
+ g_return_if_fail (EPHY_IS_NODE (node));
- if (ephy_node_db_is_immutable (node->db)) return;
+ if (ephy_node_db_is_immutable (node->db)) return;
- new = g_slice_new0 (GValue);
- g_value_init (new, G_TYPE_BOOLEAN);
- g_value_set_boolean (new, value);
+ new = g_slice_new0 (GValue);
+ g_value_init (new, G_TYPE_BOOLEAN);
+ g_value_set_boolean (new, value);
- ephy_node_set_property_internal (node, property_id, new);
+ ephy_node_set_property_internal (node, property_id, new);
}
gboolean
ephy_node_get_property_boolean (EphyNode *node,
- guint property_id)
+ guint property_id)
{
- GValue *ret;
- gboolean retval;
+ GValue *ret;
+ gboolean retval;
- g_return_val_if_fail (EPHY_IS_NODE (node), FALSE);
+ g_return_val_if_fail (EPHY_IS_NODE (node), FALSE);
- if (property_id >= node->properties->len) {
- return FALSE;
- }
+ if (property_id >= node->properties->len) {
+ return FALSE;
+ }
- ret = g_ptr_array_index (node->properties, property_id);
- if (ret == NULL) {
- return FALSE;
- }
+ ret = g_ptr_array_index (node->properties, property_id);
+ if (ret == NULL) {
+ return FALSE;
+ }
- retval = g_value_get_boolean (ret);
+ retval = g_value_get_boolean (ret);
- return retval;
+ return retval;
}
void
ephy_node_set_property_long (EphyNode *node,
- guint property_id,
- long value)
+ guint property_id,
+ long value)
{
- GValue *new;
+ GValue *new;
- g_return_if_fail (EPHY_IS_NODE (node));
+ g_return_if_fail (EPHY_IS_NODE (node));
- if (ephy_node_db_is_immutable (node->db)) return;
+ if (ephy_node_db_is_immutable (node->db)) return;
- new = g_slice_new0 (GValue);
- g_value_init (new, G_TYPE_LONG);
- g_value_set_long (new, value);
+ new = g_slice_new0 (GValue);
+ g_value_init (new, G_TYPE_LONG);
+ g_value_set_long (new, value);
- ephy_node_set_property_internal (node, property_id, new);
+ ephy_node_set_property_internal (node, property_id, new);
}
long
ephy_node_get_property_long (EphyNode *node,
- guint property_id)
+ guint property_id)
{
- GValue *ret;
- long retval;
+ GValue *ret;
+ long retval;
- g_return_val_if_fail (EPHY_IS_NODE (node), -1);
+ g_return_val_if_fail (EPHY_IS_NODE (node), -1);
- if (property_id >= node->properties->len) {
- return -1;
- }
+ if (property_id >= node->properties->len) {
+ return -1;
+ }
- ret = g_ptr_array_index (node->properties, property_id);
- if (ret == NULL) {
- return -1;
- }
+ ret = g_ptr_array_index (node->properties, property_id);
+ if (ret == NULL) {
+ return -1;
+ }
- retval = g_value_get_long (ret);
+ retval = g_value_get_long (ret);
- return retval;
+ return retval;
}
void
ephy_node_set_property_int (EphyNode *node,
- guint property_id,
- int value)
+ guint property_id,
+ int value)
{
- GValue *new;
+ GValue *new;
- g_return_if_fail (EPHY_IS_NODE (node));
+ g_return_if_fail (EPHY_IS_NODE (node));
- if (ephy_node_db_is_immutable (node->db)) return;
+ if (ephy_node_db_is_immutable (node->db)) return;
- new = g_slice_new0 (GValue);
- g_value_init (new, G_TYPE_INT);
- g_value_set_int (new, value);
+ new = g_slice_new0 (GValue);
+ g_value_init (new, G_TYPE_INT);
+ g_value_set_int (new, value);
- ephy_node_set_property_internal (node, property_id, new);
+ ephy_node_set_property_internal (node, property_id, new);
}
int
ephy_node_get_property_int (EphyNode *node,
- guint property_id)
+ guint property_id)
{
- GValue *ret;
- int retval;
+ GValue *ret;
+ int retval;
- g_return_val_if_fail (EPHY_IS_NODE (node), -1);
+ g_return_val_if_fail (EPHY_IS_NODE (node), -1);
- if (property_id >= node->properties->len) {
- return -1;
- }
+ if (property_id >= node->properties->len) {
+ return -1;
+ }
- ret = g_ptr_array_index (node->properties, property_id);
- if (ret == NULL) {
- return -1;
- }
+ ret = g_ptr_array_index (node->properties, property_id);
+ if (ret == NULL) {
+ return -1;
+ }
- retval = g_value_get_int (ret);
+ retval = g_value_get_int (ret);
- return retval;
+ return retval;
}
void
ephy_node_set_property_double (EphyNode *node,
- guint property_id,
- double value)
+ guint property_id,
+ double value)
{
- GValue *new;
+ GValue *new;
- g_return_if_fail (EPHY_IS_NODE (node));
+ g_return_if_fail (EPHY_IS_NODE (node));
- if (ephy_node_db_is_immutable (node->db)) return;
+ if (ephy_node_db_is_immutable (node->db)) return;
- new = g_slice_new0 (GValue);
- g_value_init (new, G_TYPE_DOUBLE);
- g_value_set_double (new, value);
+ new = g_slice_new0 (GValue);
+ g_value_init (new, G_TYPE_DOUBLE);
+ g_value_set_double (new, value);
- ephy_node_set_property_internal (node, property_id, new);
+ ephy_node_set_property_internal (node, property_id, new);
}
double
ephy_node_get_property_double (EphyNode *node,
- guint property_id)
+ guint property_id)
{
- GValue *ret;
- double retval;
+ GValue *ret;
+ double retval;
- g_return_val_if_fail (EPHY_IS_NODE (node), -1);
+ g_return_val_if_fail (EPHY_IS_NODE (node), -1);
- if (property_id >= node->properties->len) {
- return -1;
- }
+ if (property_id >= node->properties->len) {
+ return -1;
+ }
- ret = g_ptr_array_index (node->properties, property_id);
- if (ret == NULL) {
- return -1;
- }
+ ret = g_ptr_array_index (node->properties, property_id);
+ if (ret == NULL) {
+ return -1;
+ }
- retval = g_value_get_double (ret);
+ retval = g_value_get_double (ret);
- return retval;
+ return retval;
}
void
ephy_node_set_property_float (EphyNode *node,
- guint property_id,
- float value)
+ guint property_id,
+ float value)
{
- GValue *new;
+ GValue *new;
- g_return_if_fail (EPHY_IS_NODE (node));
+ g_return_if_fail (EPHY_IS_NODE (node));
- if (ephy_node_db_is_immutable (node->db)) return;
+ if (ephy_node_db_is_immutable (node->db)) return;
- new = g_slice_new0 (GValue);
- g_value_init (new, G_TYPE_FLOAT);
- g_value_set_float (new, value);
+ new = g_slice_new0 (GValue);
+ g_value_init (new, G_TYPE_FLOAT);
+ g_value_set_float (new, value);
- ephy_node_set_property_internal (node, property_id, new);
+ ephy_node_set_property_internal (node, property_id, new);
}
float
ephy_node_get_property_float (EphyNode *node,
- guint property_id)
+ guint property_id)
{
- GValue *ret;
- float retval;
+ GValue *ret;
+ float retval;
- g_return_val_if_fail (EPHY_IS_NODE (node), -1);
+ g_return_val_if_fail (EPHY_IS_NODE (node), -1);
- if (property_id >= node->properties->len) {
- return -1;
- }
+ if (property_id >= node->properties->len) {
+ return -1;
+ }
- ret = g_ptr_array_index (node->properties, property_id);
- if (ret == NULL) {
- return -1;
- }
+ ret = g_ptr_array_index (node->properties, property_id);
+ if (ret == NULL) {
+ return -1;
+ }
- retval = g_value_get_float (ret);
+ retval = g_value_get_float (ret);
- return retval;
+ return retval;
}
/**
@@ -776,371 +767,351 @@ ephy_node_get_property_float (EphyNode *node,
**/
EphyNode *
ephy_node_get_property_node (EphyNode *node,
- guint property_id)
+ guint property_id)
{
- GValue *ret;
- EphyNode *retval;
+ GValue *ret;
+ EphyNode *retval;
- g_return_val_if_fail (EPHY_IS_NODE (node), NULL);
+ g_return_val_if_fail (EPHY_IS_NODE (node), NULL);
- if (property_id >= node->properties->len) {
- return NULL;
- }
+ if (property_id >= node->properties->len) {
+ return NULL;
+ }
- ret = g_ptr_array_index (node->properties, property_id);
- if (ret == NULL) {
- return NULL;
- }
+ ret = g_ptr_array_index (node->properties, property_id);
+ if (ret == NULL) {
+ return NULL;
+ }
- retval = g_value_get_pointer (ret);
+ retval = g_value_get_pointer (ret);
- return retval;
+ return retval;
}
-typedef struct
-{
- xmlTextWriterPtr writer;
- int ret;
+typedef struct {
+ xmlTextWriterPtr writer;
+ int ret;
} ForEachData;
static void
-write_parent (guint id,
- EphyNodeParent *node_info,
- ForEachData* data)
+write_parent (guint id,
+ EphyNodeParent *node_info,
+ ForEachData *data)
{
- xmlTextWriterPtr writer = data->writer;
+ xmlTextWriterPtr writer = data->writer;
- /* there already was an error, do nothing. this works around
- * the fact that g_hash_table_foreach cannot be cancelled.
- */
- if (data->ret < 0) return;
+ /* there already was an error, do nothing. this works around
+ * the fact that g_hash_table_foreach cannot be cancelled.
+ */
+ if (data->ret < 0) return;
- data->ret = xmlTextWriterStartElement (writer, (const xmlChar *)"parent");
- if (data->ret < 0) return;
+ data->ret = xmlTextWriterStartElement (writer, (const xmlChar *)"parent");
+ if (data->ret < 0) return;
- data->ret = xmlTextWriterWriteFormatAttribute
- (writer, (const xmlChar *)"id", "%d", node_info->node->id);
- if (data->ret < 0) return;
+ data->ret = xmlTextWriterWriteFormatAttribute
+ (writer, (const xmlChar *)"id", "%d", node_info->node->id);
+ if (data->ret < 0) return;
- data->ret = xmlTextWriterEndElement (writer); /* parent */
- if (data->ret < 0) return;
+ data->ret = xmlTextWriterEndElement (writer); /* parent */
+ if (data->ret < 0) return;
}
static inline int
safe_write_string (xmlTextWriterPtr writer,
- const xmlChar *string)
+ const xmlChar *string)
{
- int ret;
- xmlChar *copy, *p;
-
- if (!string)
- return 0;
-
- /* http://www.w3.org/TR/REC-xml/#sec-well-formed :
- Character Range
- [2] Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] |
- [#xE000-#xFFFD] | [#x10000-#x10FFFF]
- any Unicode character, excluding the surrogate blocks, FFFE, and FFFF.
- */
-
- copy = xmlStrdup (string);
- for (p = copy; *p; p++)
- {
- xmlChar c = *p;
- if (G_UNLIKELY (c < 0x20 && c != 0xd && c != 0xa && c != 0x9)) {
- *p = 0x20;
- }
- }
-
- ret = xmlTextWriterWriteString (writer, copy);
- xmlFree (copy);
-
- return ret;
+ int ret;
+ xmlChar *copy, *p;
+
+ if (!string)
+ return 0;
+
+ /* http://www.w3.org/TR/REC-xml/#sec-well-formed :
+ Character Range
+ [2] Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] |
+ [#xE000-#xFFFD] | [#x10000-#x10FFFF]
+ any Unicode character, excluding the surrogate blocks, FFFE, and FFFF.
+ */
+
+ copy = xmlStrdup (string);
+ for (p = copy; *p; p++) {
+ xmlChar c = *p;
+ if (G_UNLIKELY (c < 0x20 && c != 0xd && c != 0xa && c != 0x9)) {
+ *p = 0x20;
+ }
+ }
+
+ ret = xmlTextWriterWriteString (writer, copy);
+ xmlFree (copy);
+
+ return ret;
}
int
-ephy_node_write_to_xml(EphyNode *node,
- xmlTextWriterPtr writer)
-{
- xmlChar xml_buf[G_ASCII_DTOSTR_BUF_SIZE];
- guint i;
- int ret;
- ForEachData data;
-
- g_return_val_if_fail (EPHY_IS_NODE (node), -1);
- g_return_val_if_fail (writer != NULL, -1);
-
- /* start writing the node */
- ret = xmlTextWriterStartElement (writer, (const xmlChar *)"node");
- if (ret < 0) goto out;
-
- /* write node id */
- ret = xmlTextWriterWriteFormatAttribute (writer, (const xmlChar *)"id", "%d", node->id);
- if (ret < 0) goto out;
-
- /* write node properties */
- for (i = 0; i < node->properties->len; i++)
- {
- GValue *value;
-
- value = g_ptr_array_index (node->properties, i);
-
- if (value == NULL) continue;
- if (G_VALUE_TYPE (value) == G_TYPE_STRING &&
- g_value_get_string (value) == NULL) continue;
-
- ret = xmlTextWriterStartElement (writer, (const xmlChar *)"property");
- if (ret < 0) break;
-
- ret = xmlTextWriterWriteFormatAttribute (writer, (const xmlChar *)"id", "%d", i);
- if (ret < 0) break;
-
- ret = xmlTextWriterWriteAttribute
- (writer, (const xmlChar *)"value_type",
- (const xmlChar *)g_type_name (G_VALUE_TYPE (value)));
- if (ret < 0) break;
-
- switch (G_VALUE_TYPE (value))
- {
- case G_TYPE_STRING:
- ret = safe_write_string
- (writer, (const xmlChar *)g_value_get_string (value));
- break;
- case G_TYPE_BOOLEAN:
- ret = xmlTextWriterWriteFormatString
- (writer, "%d", g_value_get_boolean (value));
- break;
- case G_TYPE_INT:
- ret = xmlTextWriterWriteFormatString
- (writer, "%d", g_value_get_int (value));
- break;
- case G_TYPE_LONG:
- ret = xmlTextWriterWriteFormatString
- (writer, "%ld", g_value_get_long (value));
- break;
- case G_TYPE_FLOAT:
- g_ascii_dtostr ((gchar *)xml_buf, sizeof (xml_buf),
- g_value_get_float (value));
- ret = xmlTextWriterWriteString (writer, xml_buf);
- break;
- case G_TYPE_DOUBLE:
- g_ascii_dtostr ((gchar *)xml_buf, sizeof (xml_buf),
- g_value_get_double (value));
- ret = xmlTextWriterWriteString (writer, xml_buf);
- break;
- default:
- g_assert_not_reached ();
- break;
- }
- if (ret < 0) break;
-
- ret = xmlTextWriterEndElement (writer); /* property */
- if (ret < 0) break;
- }
- if (ret < 0) goto out;
-
- /* now write parent node ids */
- data.writer = writer;
- data.ret = 0;
-
- g_hash_table_foreach (node->parents,
- (GHFunc) write_parent,
- &data);
- ret = data.ret;
- if (ret < 0) goto out;
-
- ret = xmlTextWriterEndElement (writer); /* node */
- if (ret < 0) goto out;
-
-out:
- return ret >= 0 ? 0 : -1;
+ephy_node_write_to_xml (EphyNode *node,
+ xmlTextWriterPtr writer)
+{
+ xmlChar xml_buf[G_ASCII_DTOSTR_BUF_SIZE];
+ guint i;
+ int ret;
+ ForEachData data;
+
+ g_return_val_if_fail (EPHY_IS_NODE (node), -1);
+ g_return_val_if_fail (writer != NULL, -1);
+
+ /* start writing the node */
+ ret = xmlTextWriterStartElement (writer, (const xmlChar *)"node");
+ if (ret < 0) goto out;
+
+ /* write node id */
+ ret = xmlTextWriterWriteFormatAttribute (writer, (const xmlChar *)"id", "%d", node->id);
+ if (ret < 0) goto out;
+
+ /* write node properties */
+ for (i = 0; i < node->properties->len; i++) {
+ GValue *value;
+
+ value = g_ptr_array_index (node->properties, i);
+
+ if (value == NULL) continue;
+ if (G_VALUE_TYPE (value) == G_TYPE_STRING &&
+ g_value_get_string (value) == NULL) continue;
+
+ ret = xmlTextWriterStartElement (writer, (const xmlChar *)"property");
+ if (ret < 0) break;
+
+ ret = xmlTextWriterWriteFormatAttribute (writer, (const xmlChar *)"id", "%d", i);
+ if (ret < 0) break;
+
+ ret = xmlTextWriterWriteAttribute
+ (writer, (const xmlChar *)"value_type",
+ (const xmlChar *)g_type_name (G_VALUE_TYPE (value)));
+ if (ret < 0) break;
+
+ switch (G_VALUE_TYPE (value)) {
+ case G_TYPE_STRING:
+ ret = safe_write_string
+ (writer, (const xmlChar *)g_value_get_string (value));
+ break;
+ case G_TYPE_BOOLEAN:
+ ret = xmlTextWriterWriteFormatString
+ (writer, "%d", g_value_get_boolean (value));
+ break;
+ case G_TYPE_INT:
+ ret = xmlTextWriterWriteFormatString
+ (writer, "%d", g_value_get_int (value));
+ break;
+ case G_TYPE_LONG:
+ ret = xmlTextWriterWriteFormatString
+ (writer, "%ld", g_value_get_long (value));
+ break;
+ case G_TYPE_FLOAT:
+ g_ascii_dtostr ((gchar *)xml_buf, sizeof (xml_buf),
+ g_value_get_float (value));
+ ret = xmlTextWriterWriteString (writer, xml_buf);
+ break;
+ case G_TYPE_DOUBLE:
+ g_ascii_dtostr ((gchar *)xml_buf, sizeof (xml_buf),
+ g_value_get_double (value));
+ ret = xmlTextWriterWriteString (writer, xml_buf);
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+ if (ret < 0) break;
+
+ ret = xmlTextWriterEndElement (writer); /* property */
+ if (ret < 0) break;
+ }
+ if (ret < 0) goto out;
+
+ /* now write parent node ids */
+ data.writer = writer;
+ data.ret = 0;
+
+ g_hash_table_foreach (node->parents,
+ (GHFunc)write_parent,
+ &data);
+ ret = data.ret;
+ if (ret < 0) goto out;
+
+ ret = xmlTextWriterEndElement (writer); /* node */
+ if (ret < 0) goto out;
+
+ out:
+ return ret >= 0 ? 0 : -1;
}
static inline void
real_add_child (EphyNode *node,
- EphyNode *child)
+ EphyNode *child)
{
- EphyNodeParent *node_info;
+ EphyNodeParent *node_info;
- if (g_hash_table_lookup (child->parents,
- GINT_TO_POINTER (node->id)) != NULL) {
- return;
- }
+ if (g_hash_table_lookup (child->parents,
+ GINT_TO_POINTER (node->id)) != NULL) {
+ return;
+ }
- g_ptr_array_add (node->children, child);
+ g_ptr_array_add (node->children, child);
- node_info = g_slice_new0 (EphyNodeParent);
- node_info->node = node;
- node_info->index = node->children->len - 1;
+ node_info = g_slice_new0 (EphyNodeParent);
+ node_info->node = node;
+ node_info->index = node->children->len - 1;
- g_hash_table_insert (child->parents,
- GINT_TO_POINTER (node->id),
- node_info);
+ g_hash_table_insert (child->parents,
+ GINT_TO_POINTER (node->id),
+ node_info);
}
EphyNode *
ephy_node_new_from_xml (EphyNodeDb *db, xmlNodePtr xml_node)
{
- EphyNode *node;
- xmlNodePtr xml_child;
- xmlChar *xml;
- long id;
-
- g_return_val_if_fail (EPHY_IS_NODE_DB (db), NULL);
- g_return_val_if_fail (xml_node != NULL, NULL);
-
- if (ephy_node_db_is_immutable (db)) return NULL;
-
- xml = xmlGetProp (xml_node, (const xmlChar *)"id");
- if (xml == NULL)
- return NULL;
- id = atol ((const char *)xml);
- xmlFree (xml);
-
- node = ephy_node_new_with_id (db, id);
-
- for (xml_child = xml_node->children; xml_child != NULL; xml_child = xml_child->next) {
- if (strcmp ((const char *)xml_child->name, "parent") == 0) {
- EphyNode *parent;
- long parent_id;
-
- xml = xmlGetProp (xml_child, (const xmlChar *)"id");
- g_assert (xml != NULL);
- parent_id = atol ((const char *)xml);
- xmlFree (xml);
-
- parent = ephy_node_db_get_node_from_id (db, parent_id);
-
- if (parent != NULL)
- {
- real_add_child (parent, node);
-
- ephy_node_emit_signal (parent, EPHY_NODE_CHILD_ADDED, node);
- }
- } else if (strcmp ((const char *)xml_child->name, "property") == 0) {
- GValue *value;
- xmlChar *xmlType, *xmlValue;
- int property_id;
-
- xml = xmlGetProp (xml_child, (const xmlChar *)"id");
- property_id = atoi ((const char *)xml);
- xmlFree (xml);
-
- xmlType = xmlGetProp (xml_child, (const xmlChar *)"value_type");
- xmlValue = xmlNodeGetContent (xml_child);
-
- value = g_slice_new0 (GValue);
-
- if (xmlStrEqual (xmlType, (const xmlChar *) "gchararray"))
- {
- g_value_init (value, G_TYPE_STRING);
- g_value_set_string (value, (const gchar *)xmlValue);
- }
- else if (xmlStrEqual (xmlType, (const xmlChar *) "gint"))
- {
- g_value_init (value, G_TYPE_INT);
- g_value_set_int (value, atoi ((const char *)xmlValue));
- }
- else if (xmlStrEqual (xmlType, (const xmlChar *) "gboolean"))
- {
- g_value_init (value, G_TYPE_BOOLEAN);
- g_value_set_boolean (value, atoi ((const char *)xmlValue));
- }
- else if (xmlStrEqual (xmlType, (const xmlChar *) "glong"))
- {
- g_value_init (value, G_TYPE_LONG);
- g_value_set_long (value, atol ((const char *)xmlValue));
- }
- else if (xmlStrEqual (xmlType, (const xmlChar *) "gfloat"))
- {
- g_value_init (value, G_TYPE_FLOAT);
- g_value_set_float (value, g_ascii_strtod ((const gchar *)xmlValue, NULL));
- }
- else if (xmlStrEqual (xmlType, (const xmlChar *) "gdouble"))
- {
- g_value_init (value, G_TYPE_DOUBLE);
- g_value_set_double (value, g_ascii_strtod ((const gchar *)xmlValue, NULL));
- }
- else if (xmlStrEqual (xmlType, (const xmlChar *) "gpointer"))
- {
- EphyNode *property_node;
-
- property_node = ephy_node_db_get_node_from_id (db, atol ((const char *)xmlValue));
-
- g_value_set_pointer (value, property_node);
- break;
- }
- else
- {
- g_assert_not_reached ();
- }
-
- real_set_property (node, property_id, value);
-
- xmlFree (xmlValue);
- xmlFree (xmlType);
- }
- }
-
- ephy_node_emit_signal (node, EPHY_NODE_RESTORED);
-
- return node;
+ EphyNode *node;
+ xmlNodePtr xml_child;
+ xmlChar *xml;
+ long id;
+
+ g_return_val_if_fail (EPHY_IS_NODE_DB (db), NULL);
+ g_return_val_if_fail (xml_node != NULL, NULL);
+
+ if (ephy_node_db_is_immutable (db)) return NULL;
+
+ xml = xmlGetProp (xml_node, (const xmlChar *)"id");
+ if (xml == NULL)
+ return NULL;
+ id = atol ((const char *)xml);
+ xmlFree (xml);
+
+ node = ephy_node_new_with_id (db, id);
+
+ for (xml_child = xml_node->children; xml_child != NULL; xml_child = xml_child->next) {
+ if (strcmp ((const char *)xml_child->name, "parent") == 0) {
+ EphyNode *parent;
+ long parent_id;
+
+ xml = xmlGetProp (xml_child, (const xmlChar *)"id");
+ g_assert (xml != NULL);
+ parent_id = atol ((const char *)xml);
+ xmlFree (xml);
+
+ parent = ephy_node_db_get_node_from_id (db, parent_id);
+
+ if (parent != NULL) {
+ real_add_child (parent, node);
+
+ ephy_node_emit_signal (parent, EPHY_NODE_CHILD_ADDED, node);
+ }
+ } else if (strcmp ((const char *)xml_child->name, "property") == 0) {
+ GValue *value;
+ xmlChar *xmlType, *xmlValue;
+ int property_id;
+
+ xml = xmlGetProp (xml_child, (const xmlChar *)"id");
+ property_id = atoi ((const char *)xml);
+ xmlFree (xml);
+
+ xmlType = xmlGetProp (xml_child, (const xmlChar *)"value_type");
+ xmlValue = xmlNodeGetContent (xml_child);
+
+ value = g_slice_new0 (GValue);
+
+ if (xmlStrEqual (xmlType, (const xmlChar *)"gchararray")) {
+ g_value_init (value, G_TYPE_STRING);
+ g_value_set_string (value, (const gchar *)xmlValue);
+ } else if (xmlStrEqual (xmlType, (const xmlChar *)"gint")) {
+ g_value_init (value, G_TYPE_INT);
+ g_value_set_int (value, atoi ((const char *)xmlValue));
+ } else if (xmlStrEqual (xmlType, (const xmlChar *)"gboolean")) {
+ g_value_init (value, G_TYPE_BOOLEAN);
+ g_value_set_boolean (value, atoi ((const char *)xmlValue));
+ } else if (xmlStrEqual (xmlType, (const xmlChar *)"glong")) {
+ g_value_init (value, G_TYPE_LONG);
+ g_value_set_long (value, atol ((const char *)xmlValue));
+ } else if (xmlStrEqual (xmlType, (const xmlChar *)"gfloat")) {
+ g_value_init (value, G_TYPE_FLOAT);
+ g_value_set_float (value, g_ascii_strtod ((const gchar *)xmlValue, NULL));
+ } else if (xmlStrEqual (xmlType, (const xmlChar *)"gdouble")) {
+ g_value_init (value, G_TYPE_DOUBLE);
+ g_value_set_double (value, g_ascii_strtod ((const gchar *)xmlValue, NULL));
+ } else if (xmlStrEqual (xmlType, (const xmlChar *)"gpointer")) {
+ EphyNode *property_node;
+
+ property_node = ephy_node_db_get_node_from_id (db, atol ((const char *)xmlValue));
+
+ g_value_set_pointer (value, property_node);
+ break;
+ } else {
+ g_assert_not_reached ();
+ }
+
+ real_set_property (node, property_id, value);
+
+ xmlFree (xmlValue);
+ xmlFree (xmlType);
+ }
+ }
+
+ ephy_node_emit_signal (node, EPHY_NODE_RESTORED);
+
+ return node;
}
void
ephy_node_add_child (EphyNode *node,
- EphyNode *child)
+ EphyNode *child)
{
- g_return_if_fail (EPHY_IS_NODE (node));
+ g_return_if_fail (EPHY_IS_NODE (node));
- if (ephy_node_db_is_immutable (node->db)) return;
-
- real_add_child (node, child);
+ if (ephy_node_db_is_immutable (node->db)) return;
- ephy_node_emit_signal (node, EPHY_NODE_CHILD_ADDED, child);
+ real_add_child (node, child);
+
+ ephy_node_emit_signal (node, EPHY_NODE_CHILD_ADDED, child);
}
void
ephy_node_remove_child (EphyNode *node,
- EphyNode *child)
+ EphyNode *child)
{
- g_return_if_fail (EPHY_IS_NODE (node));
+ g_return_if_fail (EPHY_IS_NODE (node));
- if (ephy_node_db_is_immutable (node->db)) return;
+ if (ephy_node_db_is_immutable (node->db)) return;
- real_remove_child (node, child, TRUE, TRUE);
+ real_remove_child (node, child, TRUE, TRUE);
}
gboolean
ephy_node_has_child (EphyNode *node,
- EphyNode *child)
+ EphyNode *child)
{
- gboolean ret;
+ gboolean ret;
+
+ g_return_val_if_fail (EPHY_IS_NODE (node), FALSE);
- g_return_val_if_fail (EPHY_IS_NODE (node), FALSE);
-
- ret = (g_hash_table_lookup (child->parents,
- GINT_TO_POINTER (node->id)) != NULL);
+ ret = (g_hash_table_lookup (child->parents,
+ GINT_TO_POINTER (node->id)) != NULL);
- return ret;
+ return ret;
}
static int
ephy_node_real_get_child_index (EphyNode *node,
- EphyNode *child)
+ EphyNode *child)
{
- EphyNodeParent *node_info;
- int ret;
+ EphyNodeParent *node_info;
+ int ret;
- node_info = g_hash_table_lookup (child->parents,
- GINT_TO_POINTER (node->id));
+ node_info = g_hash_table_lookup (child->parents,
+ GINT_TO_POINTER (node->id));
- if (node_info == NULL)
- return -1;
+ if (node_info == NULL)
+ return -1;
- ret = node_info->index;
+ ret = node_info->index;
- return ret;
+ return ret;
}
/**
@@ -1152,83 +1123,81 @@ ephy_node_real_get_child_index (EphyNode *node,
*
**/
void
-ephy_node_sort_children (EphyNode *node,
- GCompareFunc compare_func)
+ephy_node_sort_children (EphyNode *node,
+ GCompareFunc compare_func)
{
- GPtrArray *newkids;
- guint i, *new_order;
+ GPtrArray *newkids;
+ guint i, *new_order;
- if (ephy_node_db_is_immutable (node->db)) return;
+ if (ephy_node_db_is_immutable (node->db)) return;
- g_return_if_fail (EPHY_IS_NODE (node));
- g_return_if_fail (compare_func != NULL);
+ g_return_if_fail (EPHY_IS_NODE (node));
+ g_return_if_fail (compare_func != NULL);
- newkids = g_ptr_array_new ();
- g_ptr_array_set_size (newkids, node->children->len);
+ newkids = g_ptr_array_new ();
+ g_ptr_array_set_size (newkids, node->children->len);
- /* dup the array */
- for (i = 0; i < node->children->len; i++)
- {
- g_ptr_array_index (newkids, i) = g_ptr_array_index (node->children, i);
- }
+ /* dup the array */
+ for (i = 0; i < node->children->len; i++) {
+ g_ptr_array_index (newkids, i) = g_ptr_array_index (node->children, i);
+ }
- g_ptr_array_sort (newkids, compare_func);
+ g_ptr_array_sort (newkids, compare_func);
- new_order = g_new (guint, newkids->len);
- memset (new_order, -1, sizeof (guint) * newkids->len);
+ new_order = g_new (guint, newkids->len);
+ memset (new_order, -1, sizeof (guint) * newkids->len);
- for (i = 0; i < newkids->len; i++)
- {
- EphyNodeParent *node_info;
- EphyNode *child;
+ for (i = 0; i < newkids->len; i++) {
+ EphyNodeParent *node_info;
+ EphyNode *child;
- child = g_ptr_array_index (newkids, i);
- new_order[ephy_node_real_get_child_index (node, child)] = i;
- node_info = g_hash_table_lookup (child->parents,
- GINT_TO_POINTER (node->id));
- node_info->index = i;
- }
+ child = g_ptr_array_index (newkids, i);
+ new_order[ephy_node_real_get_child_index (node, child)] = i;
+ node_info = g_hash_table_lookup (child->parents,
+ GINT_TO_POINTER (node->id));
+ node_info->index = i;
+ }
- g_ptr_array_free (node->children, FALSE);
- node->children = newkids;
+ g_ptr_array_free (node->children, FALSE);
+ node->children = newkids;
- ephy_node_emit_signal (node, EPHY_NODE_CHILDREN_REORDERED, new_order);
+ ephy_node_emit_signal (node, EPHY_NODE_CHILDREN_REORDERED, new_order);
- g_free (new_order);
+ g_free (new_order);
}
void
ephy_node_reorder_children (EphyNode *node,
- int *new_order)
+ int *new_order)
{
- GPtrArray *newkids;
- guint i;
+ GPtrArray *newkids;
+ guint i;
- g_return_if_fail (EPHY_IS_NODE (node));
- g_return_if_fail (new_order != NULL);
+ g_return_if_fail (EPHY_IS_NODE (node));
+ g_return_if_fail (new_order != NULL);
- if (ephy_node_db_is_immutable (node->db)) return;
+ if (ephy_node_db_is_immutable (node->db)) return;
- newkids = g_ptr_array_new ();
- g_ptr_array_set_size (newkids, node->children->len);
+ newkids = g_ptr_array_new ();
+ g_ptr_array_set_size (newkids, node->children->len);
- for (i = 0; i < node->children->len; i++) {
- EphyNode *child;
- EphyNodeParent *node_info;
+ for (i = 0; i < node->children->len; i++) {
+ EphyNode *child;
+ EphyNodeParent *node_info;
- child = g_ptr_array_index (node->children, i);
+ child = g_ptr_array_index (node->children, i);
- g_ptr_array_index (newkids, new_order[i]) = child;
+ g_ptr_array_index (newkids, new_order[i]) = child;
- node_info = g_hash_table_lookup (child->parents,
- GINT_TO_POINTER (node->id));
- node_info->index = new_order[i];
- }
+ node_info = g_hash_table_lookup (child->parents,
+ GINT_TO_POINTER (node->id));
+ node_info->index = new_order[i];
+ }
- g_ptr_array_free (node->children, FALSE);
- node->children = newkids;
+ g_ptr_array_free (node->children, FALSE);
+ node->children = newkids;
- ephy_node_emit_signal (node, EPHY_NODE_CHILDREN_REORDERED, new_order);
+ ephy_node_emit_signal (node, EPHY_NODE_CHILDREN_REORDERED, new_order);
}
/**
@@ -1239,21 +1208,21 @@ ephy_node_reorder_children (EphyNode *node,
GPtrArray *
ephy_node_get_children (EphyNode *node)
{
- g_return_val_if_fail (EPHY_IS_NODE (node), NULL);
+ g_return_val_if_fail (EPHY_IS_NODE (node), NULL);
- return node->children;
+ return node->children;
}
int
ephy_node_get_n_children (EphyNode *node)
{
- int ret;
+ int ret;
- g_return_val_if_fail (EPHY_IS_NODE (node), -1);
+ g_return_val_if_fail (EPHY_IS_NODE (node), -1);
- ret = node->children->len;
+ ret = node->children->len;
- return ret;
+ return ret;
}
/**
@@ -1263,49 +1232,49 @@ ephy_node_get_n_children (EphyNode *node)
**/
EphyNode *
ephy_node_get_nth_child (EphyNode *node,
- guint n)
+ guint n)
{
- EphyNode *ret;
+ EphyNode *ret;
- g_return_val_if_fail (EPHY_IS_NODE (node), NULL);
+ g_return_val_if_fail (EPHY_IS_NODE (node), NULL);
- if (n < node->children->len) {
- ret = g_ptr_array_index (node->children, n);
- } else {
- ret = NULL;
- }
+ if (n < node->children->len) {
+ ret = g_ptr_array_index (node->children, n);
+ } else {
+ ret = NULL;
+ }
- return ret;
+ return ret;
}
static inline int
get_child_index_real (EphyNode *node,
- EphyNode *child)
+ EphyNode *child)
{
- EphyNodeParent *node_info;
+ EphyNodeParent *node_info;
- node_info = g_hash_table_lookup (child->parents,
- GINT_TO_POINTER (node->id));
+ node_info = g_hash_table_lookup (child->parents,
+ GINT_TO_POINTER (node->id));
- if (node_info == NULL)
- return -1;
+ if (node_info == NULL)
+ return -1;
- return node_info->index;
+ return node_info->index;
}
int
ephy_node_get_child_index (EphyNode *node,
- EphyNode *child)
+ EphyNode *child)
{
- int ret;
+ int ret;
- g_return_val_if_fail (EPHY_IS_NODE (node), -1);
- g_return_val_if_fail (EPHY_IS_NODE (child), -1);
+ g_return_val_if_fail (EPHY_IS_NODE (node), -1);
+ g_return_val_if_fail (EPHY_IS_NODE (child), -1);
- ret = ephy_node_real_get_child_index (node, child);
+ ret = ephy_node_real_get_child_index (node, child);
- return ret;
+ return ret;
}
/**
@@ -1315,23 +1284,23 @@ ephy_node_get_child_index (EphyNode *node,
**/
EphyNode *
ephy_node_get_next_child (EphyNode *node,
- EphyNode *child)
+ EphyNode *child)
{
- EphyNode *ret;
- guint idx;
+ EphyNode *ret;
+ guint idx;
+
+ g_return_val_if_fail (EPHY_IS_NODE (node), NULL);
+ g_return_val_if_fail (EPHY_IS_NODE (child), NULL);
- g_return_val_if_fail (EPHY_IS_NODE (node), NULL);
- g_return_val_if_fail (EPHY_IS_NODE (child), NULL);
-
- idx = get_child_index_real (node, child);
+ idx = get_child_index_real (node, child);
- if ((idx + 1) < node->children->len) {
- ret = g_ptr_array_index (node->children, idx + 1);
- } else {
- ret = NULL;
- }
+ if ((idx + 1) < node->children->len) {
+ ret = g_ptr_array_index (node->children, idx + 1);
+ } else {
+ ret = NULL;
+ }
- return ret;
+ return ret;
}
/**
@@ -1341,23 +1310,23 @@ ephy_node_get_next_child (EphyNode *node,
**/
EphyNode *
ephy_node_get_previous_child (EphyNode *node,
- EphyNode *child)
+ EphyNode *child)
{
- EphyNode *ret;
- int idx;
+ EphyNode *ret;
+ int idx;
- g_return_val_if_fail (EPHY_IS_NODE (node), NULL);
- g_return_val_if_fail (EPHY_IS_NODE (child), NULL);
-
- idx = get_child_index_real (node, child);
+ g_return_val_if_fail (EPHY_IS_NODE (node), NULL);
+ g_return_val_if_fail (EPHY_IS_NODE (child), NULL);
- if ((idx - 1) >= 0) {
- ret = g_ptr_array_index (node->children, idx - 1);
- } else {
- ret = NULL;
- }
+ idx = get_child_index_real (node, child);
- return ret;
+ if ((idx - 1) >= 0) {
+ ret = g_ptr_array_index (node->children, idx - 1);
+ } else {
+ ret = NULL;
+ }
+
+ return ret;
}
/**
@@ -1372,64 +1341,62 @@ ephy_node_get_previous_child (EphyNode *node,
* Returns: an identifier for the connected signal
**/
int
-ephy_node_signal_connect_object (EphyNode *node,
- EphyNodeSignalType type,
- EphyNodeCallback cb,
- GObject *object)
-{
- EphyNodeSignalData *signal_data;
- int ret;
-
- g_return_val_if_fail (EPHY_IS_NODE (node), -1);
- /* FIXME: */
- g_return_val_if_fail (node->emissions == 0, -1);
-
- signal_data = g_slice_new0 (EphyNodeSignalData);
- signal_data->node = node;
- signal_data->id = node->signal_id;
- signal_data->callback = cb;
- signal_data->type = type;
- signal_data->data = object;
-
- g_hash_table_insert (node->signals,
- GINT_TO_POINTER (node->signal_id),
- signal_data);
- if (object)
- {
- g_object_weak_ref (object,
- (GWeakNotify)signal_object_weak_notify,
- signal_data);
- }
-
- ret = node->signal_id;
- node->signal_id++;
-
- return ret;
+ephy_node_signal_connect_object (EphyNode *node,
+ EphyNodeSignalType type,
+ EphyNodeCallback cb,
+ GObject *object)
+{
+ EphyNodeSignalData *signal_data;
+ int ret;
+
+ g_return_val_if_fail (EPHY_IS_NODE (node), -1);
+ /* FIXME: */
+ g_return_val_if_fail (node->emissions == 0, -1);
+
+ signal_data = g_slice_new0 (EphyNodeSignalData);
+ signal_data->node = node;
+ signal_data->id = node->signal_id;
+ signal_data->callback = cb;
+ signal_data->type = type;
+ signal_data->data = object;
+
+ g_hash_table_insert (node->signals,
+ GINT_TO_POINTER (node->signal_id),
+ signal_data);
+ if (object) {
+ g_object_weak_ref (object,
+ (GWeakNotify)signal_object_weak_notify,
+ signal_data);
+ }
+
+ ret = node->signal_id;
+ node->signal_id++;
+
+ return ret;
}
static gboolean
-remove_matching_signal_data (gpointer key,
- EphyNodeSignalData *signal_data,
- EphyNodeSignalData *user_data)
+remove_matching_signal_data (gpointer key,
+ EphyNodeSignalData *signal_data,
+ EphyNodeSignalData *user_data)
{
- return (user_data->data == signal_data->data &&
- user_data->type == signal_data->type &&
- user_data->callback == signal_data->callback);
+ return (user_data->data == signal_data->data &&
+ user_data->type == signal_data->type &&
+ user_data->callback == signal_data->callback);
}
static void
-invalidate_matching_signal_data (gpointer key,
- EphyNodeSignalData *signal_data,
- EphyNodeSignalData *user_data)
-{
- if (user_data->data == signal_data->data &&
- user_data->type == signal_data->type &&
- user_data->callback == signal_data->callback &&
- !signal_data->invalidated)
- {
- signal_data->invalidated = TRUE;
- ++signal_data->node->invalidated_signals;
- }
+invalidate_matching_signal_data (gpointer key,
+ EphyNodeSignalData *signal_data,
+ EphyNodeSignalData *user_data)
+{
+ if (user_data->data == signal_data->data &&
+ user_data->type == signal_data->type &&
+ user_data->callback == signal_data->callback &&
+ !signal_data->invalidated) {
+ signal_data->invalidated = TRUE;
+ ++signal_data->node->invalidated_signals;
+ }
}
/**
@@ -1445,97 +1412,90 @@ invalidate_matching_signal_data (gpointer key,
* Returns: the number of signal handlers removed
**/
guint
-ephy_node_signal_disconnect_object (EphyNode *node,
+ephy_node_signal_disconnect_object (EphyNode *node,
EphyNodeSignalType type,
- EphyNodeCallback cb,
- GObject *object)
-{
- EphyNodeSignalData user_data;
-
- g_return_val_if_fail (EPHY_IS_NODE (node), 0);
-
- user_data.callback = cb;
- user_data.type = type;
- user_data.data = object;
-
- if (G_LIKELY (node->emissions == 0))
- {
- return g_hash_table_foreach_remove (node->signals,
- (GHRFunc) remove_matching_signal_data,
- &user_data);
- }
- else
- {
- g_hash_table_foreach (node->signals,
- (GHFunc) invalidate_matching_signal_data,
- &user_data);
- return 0;
- }
+ EphyNodeCallback cb,
+ GObject *object)
+{
+ EphyNodeSignalData user_data;
+
+ g_return_val_if_fail (EPHY_IS_NODE (node), 0);
+
+ user_data.callback = cb;
+ user_data.type = type;
+ user_data.data = object;
+
+ if (G_LIKELY (node->emissions == 0)) {
+ return g_hash_table_foreach_remove (node->signals,
+ (GHRFunc)remove_matching_signal_data,
+ &user_data);
+ } else {
+ g_hash_table_foreach (node->signals,
+ (GHFunc)invalidate_matching_signal_data,
+ &user_data);
+ return 0;
+ }
}
void
ephy_node_signal_disconnect (EphyNode *node,
- int signal_id)
+ int signal_id)
{
- g_return_if_fail (EPHY_IS_NODE (node));
- g_return_if_fail (signal_id != -1);
-
- if (G_LIKELY (node->emissions == 0))
- {
- g_hash_table_remove (node->signals,
- GINT_TO_POINTER (signal_id));
- }
- else
- {
- EphyNodeSignalData *data;
-
- data = g_hash_table_lookup (node->signals,
- GINT_TO_POINTER (signal_id));
- g_return_if_fail (data != NULL);
- g_return_if_fail (!data->invalidated);
-
- data->invalidated = TRUE;
- node->invalidated_signals++;
- }
+ g_return_if_fail (EPHY_IS_NODE (node));
+ g_return_if_fail (signal_id != -1);
+
+ if (G_LIKELY (node->emissions == 0)) {
+ g_hash_table_remove (node->signals,
+ GINT_TO_POINTER (signal_id));
+ } else {
+ EphyNodeSignalData *data;
+
+ data = g_hash_table_lookup (node->signals,
+ GINT_TO_POINTER (signal_id));
+ g_return_if_fail (data != NULL);
+ g_return_if_fail (!data->invalidated);
+
+ data->invalidated = TRUE;
+ node->invalidated_signals++;
+ }
}
void
ephy_node_set_is_drag_source (EphyNode *node,
- gboolean allow)
+ gboolean allow)
{
- node->is_drag_source = allow != FALSE;
+ node->is_drag_source = allow != FALSE;
}
gboolean
ephy_node_get_is_drag_source (EphyNode *node)
{
- return node->is_drag_source;
+ return node->is_drag_source;
}
void
ephy_node_set_is_drag_dest (EphyNode *node,
- gboolean allow)
+ gboolean allow)
{
- node->is_drag_dest = allow != FALSE;
+ node->is_drag_dest = allow != FALSE;
}
gboolean
ephy_node_get_is_drag_dest (EphyNode *node)
{
- return node->is_drag_dest;
+ return node->is_drag_dest;
}
GType
ephy_node_get_type (void)
{
- static GType type = 0;
+ static GType type = 0;
- if (G_UNLIKELY (type == 0))
- {
- type = g_boxed_type_register_static ("EphyNode",
- (GBoxedCopyFunc) ephy_node_ref,
- (GBoxedFreeFunc) ephy_node_unref);
- }
+ if (G_UNLIKELY (type == 0)) {
+ type = g_boxed_type_register_static ("EphyNode",
+ (GBoxedCopyFunc)ephy_node_ref,
+ (GBoxedFreeFunc)ephy_node_unref);
+ }
- return type;
+ return type;
}