Matthias Clasen
60cd7cd96c
css: Fix the ANY matcher state list
...
The ANY and matcher was not, in fact, matching any state,
since the list of states was not up-to-date.
The same fix applies to the superset matcher as well.
2020-01-16 19:09:19 -05:00
Matthias Clasen
192a24fa1f
css: Track selected state separately
...
Like the previous change, this reduces the number of
css nodes reacting to parent-state changes. The remaining
parent-state cases here are due to :link.
Before (numbers from widget-factory with Adwaita):
2247 nodes
class 612
name 2246
id 2
first-child 148
last-child 156
state 2245
hover 562
disabled 859
backdrop 1080
sibling-name 63
sibling-disabled 51
parent-class 586
parent-name 788
parent-id 2
parent-first-child 78
parent-last-child 78
parent-state 236
parent-hover 5
parent-disabled 91
parent-backdrop 4
After:
2247 nodes
class 612
name 2246
id 2
first-child 148
last-child 156
state 2245
hover 562
disabled 859
backdrop 1080
selected 579
sibling-name 63
sibling-disabled 51
parent-class 586
parent-name 788
parent-id 2
parent-first-child 78
parent-last-child 78
parent-state 115
parent-hover 5
parent-disabled 91
parent-backdrop 4
parent-selected 144
2020-01-16 11:26:46 -05:00
Matthias Clasen
2426b9e23a
css: Track backdrop state separately
...
Like the previous change, this reduces the number of
css nodes reacting to parent-state changes.
Before (numbers from widget-factory with Adwaita):
2247 nodes
class 612
name 2246
id 2
first-child 148
last-child 156
state 2247
hover 562
disabled 859
sibling-name 63
sibling-disabled 51
parent-class 586
parent-name 788
parent-id 2
parent-first-child 78
parent-last-child 78
parent-state 236
parent-hover 5
parent-disabled 91
After:
2247 nodes
class 612
name 2246
id 2
first-child 148
last-child 156
state 2245
hover 562
disabled 859
backdrop 1080
sibling-name 63
sibling-disabled 51
parent-class 586
parent-name 788
parent-id 2
parent-first-child 78
parent-last-child 78
parent-state 236
parent-hover 5
parent-disabled 91
parent-backdrop 4
2020-01-16 11:25:04 -05:00
Matthias Clasen
64848aebf4
css: Track disabled state separately
...
Significantly reduces the number of nodes that react to
parent-state changes.
Before (numbers from widget-factory with Adwaita):
2247 nodes
class 612
name 2246
id 2
first-child 148
last-child 156
state 2247
hover 2247
sibling-name 63
sibling-state 51
parent-class 586
parent-name 788
parent-id 2
parent-first-child 78
parent-last-child 78
parent-state 2226
parent-hover 5
After:
2247 nodes
class 612
name 2246
id 2
first-child 148
last-child 156
state 2247
hover 562
disabled 859
sibling-name 63
sibling-disabled 51
parent-class 586
parent-name 788
parent-id 2
parent-first-child 78
parent-last-child 78
parent-state 236
parent-hover 5
parent-disabled 91
2020-01-16 11:23:25 -05:00
Matthias Clasen
fcceac6d11
css: Track hover state changes separately
...
The idea is that this reduce the amount of frequently
changing state that css nodes are sensitive to.
This is going to reduce the amount of style recomputation.
2020-01-16 11:17:48 -05:00
Timm Bäder
a75529f3c0
cssmatcher: Inline node values into matcher
...
So we don't have to go through the matcher->node->decl every time
2019-09-09 17:36:24 +02:00
Benjamin Otte
e8fca5bbbe
cssmatcher: Remove type argument from name matcher
...
We no longer use types when matching names.
2016-02-05 23:43:05 +01:00
Benjamin Otte
517cea36ed
cssmatcher: Actually match names for widget paths
...
The type is always 0 when we use names. So this would always return
FALSE. Oops.
2015-10-27 03:13:42 +01:00
Benjamin Otte
101df329ae
API: Add gtk_widget_path_iter_set_object_name()
...
... and gtk_widget_path_iter_get_object_name(). This allows applications
that still use widget paths to use the new object names to get the
correct styling.
Mutter and webkit-gtk are examples here.
2015-10-27 01:44:50 +01:00
Benjamin Otte
55d496e917
cssmatcher: Remove matching API for regions
2015-10-22 16:42:47 +02:00
Benjamin Otte
385fda80b4
cssmatcher: Marshal name to matcher
...
... and use it in the node matcher.
Also rename function from _gtk_css_matcher_get_type() to
_gtk_css_matcher_get_name().
2015-10-22 16:35:14 +02:00
Matthias Clasen
a831f1fb11
css matcher: Avoid a redundant call
...
The sole caller passes an interned string, so we don't
need to call g_intern_string again.
2015-09-12 11:24:42 -04:00
Benjamin Otte
4cbab1180c
cssmatcher: Make nth-child(odd) work on first line
...
.. instead of only on 3rd, 5th, 7th, ...
2015-07-06 15:33:50 +02:00
Benjamin Otte
03312371da
cssmatcher: Speed up common matching
...
first-child and last-child are the most common usages of the nth-child
machinery, so special-casing them makes sense.
2015-05-28 17:41:47 +02:00
Benjamin Otte
59a7739fce
cssmatcher: Rewrite nth-child matcher
...
Instead of trying to be smart, be stupid but correct.
Fixes nth-child reftest.
2015-05-28 17:12:57 +02:00
Benjamin Otte
4847eff6c4
cssmatcher: Simplify code
...
Instead of copy/paste, pass the only difference as an argument
The code still doesn't work right, but at least it's easier to fix now.
2015-05-28 17:07:25 +02:00
Benjamin Otte
2694545468
cssnode: Add visibility concept
...
This allows hiding nodes of invisible widgets.
And that in turn makes sure :nth-child() works as expected.
2015-03-18 15:23:31 +01:00
Benjamin Otte
ee6d081ed9
cssnode: Remove now unused arg from vfunc
2015-03-18 15:23:31 +01:00
Benjamin Otte
89115be3cb
cssnode: Add a matcher for nodes
...
... and use that matcher by default - ie for transient nodes.
2015-03-18 15:23:31 +01:00
Benjamin Otte
2bf7bdd651
cssmatcher: Allow widget path matcher to take a node declaration
...
The node declaration has the same functionality as
gtk_css_node_declaration_add_to_widget_path(). So instead of using that
function on a path, you can use the original path and the declaration in
a matcher.
2015-03-18 15:23:30 +01:00
Benjamin Otte
dff52f7a04
css: Match state in siblings properly
...
Previously, we always returned the state flags of the original widget
and did not consider the siblings' pseudoclasses.
Testcase is attached.
2014-08-13 16:51:16 +02:00
Benjamin Otte
19eb1614de
cssmatcher: Use widget path's state
...
Don't take a state when constructing the CSS matcher. Instead, rely on
the newly introduced state in the widget path.
This way, the state can be queried not only on the first element, but on
all elements of the widget path.
2014-07-19 23:42:39 +02:00
Matthias Clasen
ecffe56955
Avoid deprecation warnings
...
We know regions are deprecated, no need to warn about it here.
2014-06-24 08:23:21 -04:00
Timm Bäder
9b1c943190
css parser: Add :link and :visited
...
... which are both to be used for links instead of the current
-GtkWidget-link-color and -GtkWidget-visited-link-color
https://bugzilla.gnome.org/show_bug.cgi?id=709629
2013-11-04 16:36:11 +01:00
Alexander Larsson
a1ee2b7b82
css: Speed up name matching
...
We use the new g_type_get_type_registration_serial() so that we can
cache and properly invalidate the result of g_type_from_name().
This bumps the glib requirement to 2.35.3 to get the new function.
https://bugzilla.gnome.org/show_bug.cgi?id=689847
2012-12-10 12:57:10 +01:00
Alexander Larsson
16f2b20f96
css: Add _gtk_css_matcher_matches_any()
...
This returns true if the matcher matches *anything*. We need
to check this later, because such matchers are dangerous in loops
that iterate over all parents/siblings since such loops would not
terminate.
2012-11-30 14:53:29 +01:00
Benjamin Otte
b4195cb408
cssmatcher: Handle case of empty widget path
...
This is tested by the stylecontext test, but doesn't appear in practice.
2012-05-01 03:13:02 +02:00
Benjamin Otte
44187ca3b5
cssmatcher: Use quarks for classes
2012-04-17 08:59:10 +02:00
Benjamin Otte
102d10016f
matcher: Add a superset matcher
...
This matcher always matches only on some relvant things and ignores the
rest. This allows you to match only on name and class, but ignore state
and parents/siblings for example.
2012-04-17 08:59:08 +02:00
Benjamin Otte
5f5bf27287
matcher: Add a matcher that matches anything
...
Lesson learned: Adwaita uses all possible selector types and all of
those for parents, too. But so far no siblings.
2012-04-17 08:59:08 +02:00
Benjamin Otte
3bdde54aaf
selector: Rewrite position tracking
...
We now track the position as a (type,a,b) tuple where the numbers make
up the an + b formula from CSS3 nth-child.
Also, the get_sibling() and get_sibling_index() vfuncs were replaced by
a has_position() vfunc. This is mostly so that the matcher can always
return TRUE. And I need that for the everything matcher.
2012-04-17 08:59:08 +02:00
Benjamin Otte
53317aed55
matcher: Turn GtkCssMatcher into a union
...
That way, we can add more matchers as we need them.
2012-04-17 08:59:07 +02:00
Benjamin Otte
b368c5f10a
matcher: Use a vtable
...
Now we can do lots of fancy matchers, yay!
2012-04-17 08:59:07 +02:00
Benjamin Otte
a94b85d375
css: Make the style provider take a matcher as an input argument
2012-04-17 08:59:07 +02:00
Benjamin Otte
c0b7c3321d
css: Add GtkCssMatcher
...
This is so we can later do matching with other things than
GtkWidgetPath.
In particular, this is a requirement for getting rid of GtkWidgetPath.
2012-04-17 08:59:07 +02:00