about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/css/cascade.nim4
-rw-r--r--src/css/mediaquery.nim8
-rw-r--r--src/css/values.nim26
3 files changed, 23 insertions, 15 deletions
diff --git a/src/css/cascade.nim b/src/css/cascade.nim
index fcec96d6..84d0a89d 100644
--- a/src/css/cascade.nim
+++ b/src/css/cascade.nim
@@ -27,11 +27,11 @@ proc applyProperty(elem: Element, d: CSSDeclaration, pseudo: PseudoElem) =
 
   case pseudo
   of PSEUDO_NONE:
-    elem.css.applyValue(parent, d)
+    elem.rendered = not elem.css.applyValue(parent, d)
   of PSEUDO_BEFORE, PSEUDO_AFTER:
     if elem.pseudo[pseudo] == nil:
       elem.pseudo[pseudo] = elem.css.inheritProperties()
-    elem.pseudo[pseudo].applyValue(parent, d)
+    elem.rendered = not elem.pseudo[pseudo].applyValue(parent, d)
 
   elem.cssapplied = true
   elem.rendered = false
diff --git a/src/css/mediaquery.nim b/src/css/mediaquery.nim
index bf9d2535..cea35c36 100644
--- a/src/css/mediaquery.nim
+++ b/src/css/mediaquery.nim
@@ -172,11 +172,15 @@ proc parseMediaInParens(parser: var MediaQueryParser): MediaQuery =
 
 proc parseMediaOr(parser: var MediaQueryParser, left: MediaQuery): MediaQuery =
   let right = parser.parseMediaCondition()
-  return MediaQuery(t: CONDITION_OR, ora: left, orb: right)
+  if right != nil:
+    return MediaQuery(t: CONDITION_OR, ora: left, orb: right)
+  return nil
 
 proc parseMediaAnd(parser: var MediaQueryParser, left: MediaQuery): MediaQuery =
   let right = parser.parseMediaCondition()
-  return MediaQuery(t: CONDITION_AND, anda: left, andb: right)
+  if right != nil:
+    return MediaQuery(t: CONDITION_AND, anda: left, andb: right)
+  return nil
 
 proc parseMediaCondition(parser: var MediaQueryParser, non = false, noor = false): MediaQuery =
   var non = non
diff --git a/src/css/values.nim b/src/css/values.nim
index e064e909..7da9a248 100644
--- a/src/css/values.nim
+++ b/src/css/values.nim
@@ -691,7 +691,8 @@ func getSpecifiedValue(d: CSSDeclaration, parent: CSSSpecifiedValues): tuple[a:C
 
   return (val, cssGlobal(d))
 
-proc applyValue(vals, parent: CSSSpecifiedValues, t: CSSPropertyType, val: CSSSpecifiedValue, global: CSSGlobalValueType) =
+proc applyValue(vals, parent: CSSSpecifiedValues, t: CSSPropertyType, val: CSSSpecifiedValue, global: CSSGlobalValueType): bool =
+  let oval = vals[t]
   case global
   of VALUE_INHERIT, VALUE_UNSET:
     if inherited(t):
@@ -704,36 +705,39 @@ proc applyValue(vals, parent: CSSSpecifiedValues, t: CSSPropertyType, val: CSSSp
     vals[t] = getDefault(t) #TODO
   of VALUE_NOGLOBAL:
     vals[t] = val
+  return oval != vals[t]
 
-proc applyShorthand(vals, parent: CSSSpecifiedValues, left, right, top, bottom: CSSSpecifiedValue, global: CSSGlobalValueType) =
-  vals.applyValue(parent, left.t, left, global)
-  vals.applyValue(parent, right.t, right, global)
-  vals.applyValue(parent, top.t, top, global)
-  vals.applyValue(parent, bottom.t, bottom, global)
+proc applyShorthand(vals, parent: CSSSpecifiedValues, left, right, top, bottom: CSSSpecifiedValue, global: CSSGlobalValueType): bool =
+  result = result or vals.applyValue(parent, left.t, left, global)
+  result = result or vals.applyValue(parent, right.t, right, global)
+  result = result or vals.applyValue(parent, top.t, top, global)
+  result = result or vals.applyValue(parent, bottom.t, bottom, global)
 
-proc applyValue*(vals, parent: CSSSpecifiedValues, d: CSSDeclaration) =
+# Returns true if anything has changed. (TODO: not always...)
+proc applyValue*(vals, parent: CSSSpecifiedValues, d: CSSDeclaration): bool =
   let vv = getSpecifiedValue(d, parent)
   let val = vv.a
+  let oval = vals[val.t]
   case val.t
   of PROPERTY_ALL:
     let global = cssGlobal(d)
     if global != VALUE_NOGLOBAL:
       for t in CSSPropertyType:
-        vals.applyValue(parent, t, nil, global)
+        result = result or vals.applyValue(parent, t, nil, global)
   of PROPERTY_MARGIN:
     let left = CSSSpecifiedValue(t: PROPERTY_MARGIN_LEFT, v: VALUE_LENGTH, length: val.length)
     let right = CSSSpecifiedValue(t: PROPERTY_MARGIN_RIGHT, v: VALUE_LENGTH, length: val.length)
     let top = CSSSpecifiedValue(t: PROPERTY_MARGIN_TOP, v: VALUE_LENGTH, length: val.length)
     let bottom = CSSSpecifiedValue(t: PROPERTY_MARGIN_BOTTOM, v: VALUE_LENGTH, length: val.length)
-    vals.applyShorthand(parent, left, right, top, bottom, vv.b)
+    return vals.applyShorthand(parent, left, right, top, bottom, vv.b)
   of PROPERTY_PADDING:
     let left = CSSSpecifiedValue(t: PROPERTY_PADDING_LEFT, v: VALUE_LENGTH, length: val.length)
     let right = CSSSpecifiedValue(t: PROPERTY_PADDING_RIGHT, v: VALUE_LENGTH, length: val.length)
     let top = CSSSpecifiedValue(t: PROPERTY_PADDING_TOP, v: VALUE_LENGTH, length: val.length)
     let bottom = CSSSpecifiedValue(t: PROPERTY_PADDING_BOTTOM, v: VALUE_LENGTH, length: val.length)
-    vals.applyShorthand(parent, left, right, top, bottom, vv.b)
+    return vals.applyShorthand(parent, left, right, top, bottom, vv.b)
   else:
-    vals.applyValue(parent, val.t, vv.a, vv.b)
+    return vals.applyValue(parent, val.t, vv.a, vv.b)
 
 func inheritProperties*(parent: CSSSpecifiedValues): CSSSpecifiedValues =
   new(result)