summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog10
-rw-r--r--src/cr-prop-list.c49
-rw-r--r--src/cr-prop-list.h3
-rw-r--r--src/cr-sel-eng.c33
4 files changed, 86 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog
index 0530c2b..c2d4c30 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2004-03-01 dodji <dodji@gnome.org>
+
+ * src/cr-prop-list.[ch]: added the (cr_prop_list_unlink) function.
+ * src/cr-sel-eng.c:
+ (put_css_properties_in_props_list): put the properties at the
+ end of the properties list built by this function. This is
+ necessary to keep the properties declaration order. This order
+ is significant for example when you consider short hand
+ properties expansion.
+
2004-02-29 Dodji Seketeli <dodji@gnome.org>
* src/cr-input.c,src/cr-num.c,src/cr-prop-list.[ch],
diff --git a/src/cr-prop-list.c b/src/cr-prop-list.c
index aaaba71..9b2cf47 100644
--- a/src/cr-prop-list.c
+++ b/src/cr-prop-list.c
@@ -321,6 +321,55 @@ cr_prop_list_get_prev (CRPropList *a_this)
return PRIVATE (a_this)->prev ;
}
+/**
+ *Unlinks a prop/decl pair from the list
+ *@param a_this the current list of prop/decl pairs
+ *@param a_pair the prop/decl pair to unlink.
+ *@return the new list or NULL in case of an error.
+ */
+CRPropList *
+cr_prop_list_unlink (CRPropList *a_this,
+ CRPropList *a_pair)
+{
+ CRPropList *prev = NULL, *next = NULL ;
+
+ g_return_val_if_fail (a_this && PRIVATE (a_this) && a_pair,
+ NULL) ;
+
+ /*some sanity checks*/
+ if (PRIVATE (a_this)->next)
+ {
+ next = PRIVATE (a_this)->next ;
+ g_return_val_if_fail (PRIVATE (next), NULL) ;
+ g_return_val_if_fail
+ (PRIVATE (next)->prev == a_this,
+ NULL) ;
+ }
+ if (PRIVATE (a_this)->prev)
+ {
+ prev = PRIVATE (a_this)->prev ;
+ g_return_val_if_fail (PRIVATE (prev), NULL) ;
+ g_return_val_if_fail
+ (PRIVATE (prev)->next == a_this, NULL) ;
+ }
+ if (prev)
+ {
+ PRIVATE (prev)->next = next ;
+ }
+ if (next)
+ {
+ PRIVATE (next)->prev = prev ;
+ }
+ PRIVATE (a_pair)->prev = PRIVATE (a_pair)->next = NULL ;
+ if (a_this == a_pair)
+ {
+ if (next)
+ return next ;
+ return a_this ;
+ }
+ return a_this ;
+}
+
void
cr_prop_list_destroy (CRPropList *a_this)
{
diff --git a/src/cr-prop-list.h b/src/cr-prop-list.h
index 55d3dc1..eb6beac 100644
--- a/src/cr-prop-list.h
+++ b/src/cr-prop-list.h
@@ -68,6 +68,9 @@ enum CRStatus cr_prop_list_set_decl (CRPropList *a_this,
enum CRStatus cr_prop_list_get_decl (CRPropList *a_this,
CRDeclaration **a_decl) ;
+CRPropList * cr_prop_list_unlink (CRPropList *a_this,
+ CRPropList *a_pair) ;
+
void cr_prop_list_destroy (CRPropList *a_this) ;
G_END_DECLS
diff --git a/src/cr-sel-eng.c b/src/cr-sel-eng.c
index bfa61ea..92de775 100644
--- a/src/cr-sel-eng.c
+++ b/src/cr-sel-eng.c
@@ -1195,10 +1195,18 @@ put_css_properties_in_props_list (CRPropList **a_props,
<
a_stmt->parent_sheet->origin))
{
- cr_prop_list_set_prop (pair,
- cur_decl->property) ;
- cr_prop_list_set_decl (pair,
- cur_decl) ;
+ tmp_props = cr_prop_list_unlink
+ (props, pair) ;
+ if (!tmp_props)
+ {
+ cr_utils_trace_info ("tmp_props != NULL failed") ;
+ continue ;
+ }
+ props = tmp_props ;
+ tmp_props = NULL ;
+ cr_prop_list_append2 (props,
+ cur_decl->property,
+ cur_decl) ;
continue ;
}
else if (decl->parent_statement
@@ -1227,11 +1235,18 @@ put_css_properties_in_props_list (CRPropList **a_props,
if (a_stmt->specificity
>= decl->parent_statement->specificity)
{
-
- cr_prop_list_set_prop (pair,
- cur_decl->property) ;
- cr_prop_list_set_decl (pair,
- cur_decl) ;
+ tmp_props = cr_prop_list_unlink (props,
+ pair) ;
+ if (!tmp_props)
+ {
+ cr_utils_trace_info ("tmp_props != NULL failed") ;
+ continue ;
+ }
+ props = tmp_props ;
+ tmp_props = NULL ;
+ cr_prop_list_append2 (props,
+ cur_decl->property,
+ cur_decl) ;
}
}
/*TODO: this may leak. Check this out*/