From a14a0c6315a59da5bbdc94f31812f04ceadb7c87 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Wed, 3 Feb 2021 11:21:23 -0500 Subject: [PATCH 1/9] css: Fix shadow value equal This function was not doing the right thing. Once we are doing the right thing and not compare shadows as unequal, some reftests that inhibit snapshots for a few frames now hang forever, since we are no more redrawing unnecessarily. Fix that with an explicit queue_draw. --- gtk/gtkcssshadowvalue.c | 10 +++++----- testsuite/reftests/frame-inhibitor.c | 1 + 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/gtk/gtkcssshadowvalue.c b/gtk/gtkcssshadowvalue.c index 9ad69b9182..126e9af8f2 100644 --- a/gtk/gtkcssshadowvalue.c +++ b/gtk/gtkcssshadowvalue.c @@ -151,11 +151,11 @@ gtk_css_value_shadow_equal (const GtkCssValue *value1, const ShadowValue *shadow2 = &value2->shadows[i]; if (shadow1->inset != shadow2->inset || - _gtk_css_value_equal (shadow1->hoffset, shadow2->hoffset) || - _gtk_css_value_equal (shadow1->voffset, shadow2->voffset) || - _gtk_css_value_equal (shadow1->radius, shadow2->radius) || - _gtk_css_value_equal (shadow1->spread, shadow2->spread) || - _gtk_css_value_equal (shadow1->color, shadow2->color)) + !_gtk_css_value_equal (shadow1->hoffset, shadow2->hoffset) || + !_gtk_css_value_equal (shadow1->voffset, shadow2->voffset) || + !_gtk_css_value_equal (shadow1->radius, shadow2->radius) || + !_gtk_css_value_equal (shadow1->spread, shadow2->spread) || + !_gtk_css_value_equal (shadow1->color, shadow2->color)) return FALSE; } diff --git a/testsuite/reftests/frame-inhibitor.c b/testsuite/reftests/frame-inhibitor.c index 567dc07ae1..9d699c4224 100644 --- a/testsuite/reftests/frame-inhibitor.c +++ b/testsuite/reftests/frame-inhibitor.c @@ -30,6 +30,7 @@ tick_callback_for_1_frame (GtkWidget *widget, gpointer unused) { reftest_uninhibit_snapshot (); + gtk_widget_queue_draw (widget); return G_SOURCE_REMOVE; } From 640273a0e27374f511c45752fa1f588d5e74add2 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Wed, 3 Feb 2021 11:21:57 -0500 Subject: [PATCH 2/9] Improve the css value tests The test code had some bugs. Fix those, and print out useful information when tests fail. --- testsuite/css/test-css-value.c | 69 +++++++++++++++++++++++----------- 1 file changed, 47 insertions(+), 22 deletions(-) diff --git a/testsuite/css/test-css-value.c b/testsuite/css/test-css-value.c index acbaf37397..f5a27c2fe7 100644 --- a/testsuite/css/test-css-value.c +++ b/testsuite/css/test-css-value.c @@ -77,6 +77,25 @@ value_is_near (int prop, return FALSE; } +static void +assert_css_value (int prop, + GtkCssValue *result, + GtkCssValue *expected) +{ + if (!value_is_near (prop, result, expected)) + { + char *r = _gtk_css_value_to_string (result); + char *e = _gtk_css_value_to_string (expected); + g_print ("Expected %s got %s\n", e, r); + g_free (r); + g_free (e); + + g_assert_not_reached (); + } +} + +/* Tests for css transitions */ + typedef struct { int prop; const char *value1; @@ -87,10 +106,28 @@ typedef struct { static ValueTransitionTest tests[] = { { GTK_CSS_PROPERTY_COLOR, "transparent", "rgb(255,0,0)", 0.25, "rgba(255,0,0,0.25)" }, - { GTK_CSS_PROPERTY_BOX_SHADOW, "none", "2px 2px 10px 4px rgb(200,200,200)", 0.5, "1px 1px 5px 2px rgb(100,100,100)" }, - { GTK_CSS_PROPERTY_BOX_SHADOW, "2px 2px 10px 4px rgb(200,200,200)", "none", 0.5, "1px 1px 5px 2px rgb(100,100,100)" }, + { GTK_CSS_PROPERTY_BOX_SHADOW, "none", "2px 2px 10px 4px rgb(200,200,200)", 0.5, "1px 1px 5px 2px rgba(200,200,200,0.5)" }, + { GTK_CSS_PROPERTY_BOX_SHADOW, "2px 2px 10px 4px rgb(200,200,200)", "none", 0.5, "1px 1px 5px 2px rgba(200,200,200,0.5)" }, + { GTK_CSS_PROPERTY_BOX_SHADOW, "2px 2px 10px 4px rgb(200,200,200), 0px 10px 8px 6px rgb(200,100,0)", "none", 0.5, "1px 1px 5px 2px rgba(200,200,200,0.5), 0px 5px 4px 3px rgba(200,100,0,0.5)" }, }; +static GtkCssValue * +value_from_string (GtkStyleProperty *prop, + const char *str) +{ + GBytes *bytes; + GtkCssParser *parser; + GtkCssValue *value; + + bytes = g_bytes_new_static (str, strlen (str)); + parser = gtk_css_parser_new_for_bytes (bytes, NULL, NULL, NULL, NULL, NULL); + value = _gtk_style_property_parse_value (prop, parser); + gtk_css_parser_unref (parser); + g_bytes_unref (bytes); + + return value; +} + static void test_transition (gconstpointer data) { @@ -100,31 +137,19 @@ test_transition (gconstpointer data) GtkCssValue *value2; GtkCssValue *expected; GtkCssValue *result; - GtkCssParser *parser; - GBytes *bytes; prop = (GtkStyleProperty *)_gtk_css_style_property_lookup_by_id (test->prop); - bytes = g_bytes_new_static (test->value1, strlen (test->value1)); - parser = gtk_css_parser_new_for_bytes (bytes, NULL, NULL, NULL, NULL, NULL); - value1 = _gtk_style_property_parse_value (prop, parser); - gtk_css_parser_unref (parser); - g_bytes_unref (bytes); - - bytes = g_bytes_new_static (test->value1, strlen (test->value2)); - parser = gtk_css_parser_new_for_bytes (bytes, NULL, NULL, NULL, NULL, NULL); - value2 = _gtk_style_property_parse_value (prop, parser); - gtk_css_parser_unref (parser); - g_bytes_unref (bytes); - - bytes = g_bytes_new_static (test->value1, strlen (test->expected)); - parser = gtk_css_parser_new_for_bytes (bytes, NULL, NULL, NULL, NULL, NULL); - expected = _gtk_style_property_parse_value (prop, parser); - gtk_css_parser_unref (parser); - g_bytes_unref (bytes); + value1 = value_from_string (prop, test->value1); + g_assert_nonnull (value1); + value2 = value_from_string (prop, test->value2); + g_assert_nonnull (value1); + expected = value_from_string (prop, test->expected); + g_assert_nonnull (value1); result = _gtk_css_value_transition (value1, value2, test->prop, test->progress); - g_assert_true (value_is_near (test->prop, result, expected)); + g_assert_nonnull (result); + assert_css_value (test->prop, result, expected); gtk_css_value_unref (value1); gtk_css_value_unref (value2); From 1af72eac210a3c4baea194c3823852fade96ff63 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Wed, 3 Feb 2021 11:56:19 -0500 Subject: [PATCH 3/9] cssvalue: Cosmetic change Don't return FALSE from pointer-returning functions. --- gtk/gtkcssvalue.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gtk/gtkcssvalue.c b/gtk/gtkcssvalue.c index dddfce8c40..b0c32c8e82 100644 --- a/gtk/gtkcssvalue.c +++ b/gtk/gtkcssvalue.c @@ -260,8 +260,8 @@ _gtk_css_value_transition (GtkCssValue *start, guint property_id, double progress) { - gtk_internal_return_val_if_fail (start != NULL, FALSE); - gtk_internal_return_val_if_fail (end != NULL, FALSE); + gtk_internal_return_val_if_fail (start != NULL, NULL); + gtk_internal_return_val_if_fail (end != NULL, NULL); if (start->class != end->class) return NULL; From 4e2ec2d68d63f9ee943070618d53f93e300d0ecd Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Wed, 3 Feb 2021 11:56:43 -0500 Subject: [PATCH 4/9] testsuite: Pass GDK_DEBUG=default-settings to css tests Otherwise, settings might creep in and change css defaults. --- testsuite/css/meson.build | 1 + 1 file changed, 1 insertion(+) diff --git a/testsuite/css/meson.build b/testsuite/css/meson.build index f8d13fe548..cd35ced891 100644 --- a/testsuite/css/meson.build +++ b/testsuite/css/meson.build @@ -6,6 +6,7 @@ csstest_env.set('G_TEST_BUILDDIR', meson.current_build_dir()) csstest_env.set('GIO_USE_VFS', 'local') csstest_env.set('GSETTINGS_BACKEND', 'memory') csstest_env.set('G_ENABLE_DIAGNOSTIC', '0') +csstest_env.set('GDK_DEBUG', 'default-settings') subdir('parser') subdir('nodes') From 3c6e7569ff00e5213961f4d63fd89b129cd10611 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Wed, 3 Feb 2021 11:57:34 -0500 Subject: [PATCH 5/9] Add more css transition tests Test font size transitions. --- testsuite/css/test-css-value.c | 53 ++++++++++++++++++++++++---------- 1 file changed, 38 insertions(+), 15 deletions(-) diff --git a/testsuite/css/test-css-value.c b/testsuite/css/test-css-value.c index f5a27c2fe7..cc0ea83086 100644 --- a/testsuite/css/test-css-value.c +++ b/testsuite/css/test-css-value.c @@ -23,7 +23,9 @@ #include #include "gtk/gtkcssvalueprivate.h" #include "gtk/gtkcsscolorvalueprivate.h" +#include "gtk/gtkcssnumbervalueprivate.h" #include "gtk/gtkcssstylepropertyprivate.h" +#include "gtk/gtkcssstaticstyleprivate.h" static gboolean color_is_near (const GdkRGBA *color1, @@ -52,24 +54,29 @@ value_is_near (int prop, { case GTK_CSS_PROPERTY_COLOR: { - GtkCssValue *v1, *v2; const GdkRGBA *c1, *c2; gboolean res; - v1 = _gtk_css_value_compute (value1, prop, NULL, NULL, NULL); - v2 = _gtk_css_value_compute (value2, prop, NULL, NULL, NULL); - c1 = gtk_css_color_value_get_rgba (v1); - c2 = gtk_css_color_value_get_rgba (v2); + c1 = gtk_css_color_value_get_rgba (value1); + c2 = gtk_css_color_value_get_rgba (value2); res = color_is_near (c1, c2); - gtk_css_value_unref (v1); - gtk_css_value_unref (v2); - return res; } break; + case GTK_CSS_PROPERTY_FONT_SIZE: + { + double n1, n2; + + n1 = _gtk_css_number_value_get (value1, 100); + n2 = _gtk_css_number_value_get (value2, 100); + + return fabs (n1 - n2) < FLT_EPSILON; + } + break; + default: break; } @@ -101,7 +108,7 @@ typedef struct { const char *value1; const char *value2; double progress; - const char *expected; + const char *value3; } ValueTransitionTest; static ValueTransitionTest tests[] = { @@ -109,6 +116,8 @@ static ValueTransitionTest tests[] = { { GTK_CSS_PROPERTY_BOX_SHADOW, "none", "2px 2px 10px 4px rgb(200,200,200)", 0.5, "1px 1px 5px 2px rgba(200,200,200,0.5)" }, { GTK_CSS_PROPERTY_BOX_SHADOW, "2px 2px 10px 4px rgb(200,200,200)", "none", 0.5, "1px 1px 5px 2px rgba(200,200,200,0.5)" }, { GTK_CSS_PROPERTY_BOX_SHADOW, "2px 2px 10px 4px rgb(200,200,200), 0px 10px 8px 6px rgb(200,100,0)", "none", 0.5, "1px 1px 5px 2px rgba(200,200,200,0.5), 0px 5px 4px 3px rgba(200,100,0,0.5)" }, + { GTK_CSS_PROPERTY_FONT_SIZE, "12px", "16px", 0.25, "13px" }, + { GTK_CSS_PROPERTY_FONT_SIZE, "10px", "10pt", 0.5, "11.66666667px" }, }; static GtkCssValue * @@ -135,8 +144,16 @@ test_transition (gconstpointer data) GtkStyleProperty *prop; GtkCssValue *value1; GtkCssValue *value2; - GtkCssValue *expected; + GtkCssValue *value3; + GtkCssValue *computed1; + GtkCssValue *computed2; + GtkCssValue *computed3; GtkCssValue *result; + GtkStyleProvider *provider; + GtkCssStyle *style; + + provider = GTK_STYLE_PROVIDER (gtk_settings_get_default ()); + style = gtk_css_static_style_get_default (); prop = (GtkStyleProperty *)_gtk_css_style_property_lookup_by_id (test->prop); @@ -144,16 +161,22 @@ test_transition (gconstpointer data) g_assert_nonnull (value1); value2 = value_from_string (prop, test->value2); g_assert_nonnull (value1); - expected = value_from_string (prop, test->expected); - g_assert_nonnull (value1); + value3 = value_from_string (prop, test->value3); + g_assert_nonnull (value3); - result = _gtk_css_value_transition (value1, value2, test->prop, test->progress); + computed1 = _gtk_css_value_compute (value1, test->prop, provider, style, NULL); + computed2 = _gtk_css_value_compute (value2, test->prop, provider, style, NULL); + computed3 = _gtk_css_value_compute (value3, test->prop, provider, style, NULL); + result = _gtk_css_value_transition (computed1, computed2, test->prop, test->progress); g_assert_nonnull (result); - assert_css_value (test->prop, result, expected); + assert_css_value (test->prop, result, computed3); gtk_css_value_unref (value1); gtk_css_value_unref (value2); - gtk_css_value_unref (expected); + gtk_css_value_unref (value3); + gtk_css_value_unref (computed1); + gtk_css_value_unref (computed2); + gtk_css_value_unref (computed3); gtk_css_value_unref (result); } From 90d7ed5dd17c5337d12bbf711565c51d3b52682f Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Wed, 3 Feb 2021 14:32:50 -0500 Subject: [PATCH 6/9] Rename test to transition Thats what it is about, so name it clearly. Add missing installed tests too. --- testsuite/css/data.test.in | 4 ++++ testsuite/css/meson.build | 20 +++++++++++++++++-- .../css/{test-css-value.c => transition.c} | 0 testsuite/css/transition.test.in | 4 ++++ 4 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 testsuite/css/data.test.in rename testsuite/css/{test-css-value.c => transition.c} (100%) create mode 100644 testsuite/css/transition.test.in diff --git a/testsuite/css/data.test.in b/testsuite/css/data.test.in new file mode 100644 index 0000000000..11e0e3950d --- /dev/null +++ b/testsuite/css/data.test.in @@ -0,0 +1,4 @@ +[Test] +Exec=/bin/sh -c "env G_ENABLE_DIAGNOSTIC=0 GTK_A11Y=test @libexecdir@/installed-tests/gtk-4.0/css/data --tap -k" +Type=session +Output=TAP diff --git a/testsuite/css/meson.build b/testsuite/css/meson.build index cd35ced891..def05adcaa 100644 --- a/testsuite/css/meson.build +++ b/testsuite/css/meson.build @@ -45,14 +45,14 @@ test('data', test_data, suite: 'css', ) -test_parser = executable('test-css-value', 'test-css-value.c', +transition = executable('transition', 'transition.c', c_args: common_cflags, dependencies: libgtk_static_dep, install: get_option('install-tests'), install_dir: testexecdir, ) -test('css value', test_parser, +test('transition', transition, args: [ '--tap', '-k' ], protocol: 'tap', env: csstest_env, @@ -67,6 +67,22 @@ if get_option('install-tests') configuration: conf, install_dir: testdatadir, ) + + conf = configuration_data() + conf.set('libexecdir', gtk_libexecdir) + configure_file(input: 'data.test.in', + output: 'data.test', + configuration: conf, + install_dir: testdatadir, + ) + + conf = configuration_data() + conf.set('libexecdir', gtk_libexecdir) + configure_file(input: 'transition.test.in', + output: 'transition.test', + configuration: conf, + install_dir: testdatadir, + ) endif if false and get_option ('profiler') diff --git a/testsuite/css/test-css-value.c b/testsuite/css/transition.c similarity index 100% rename from testsuite/css/test-css-value.c rename to testsuite/css/transition.c diff --git a/testsuite/css/transition.test.in b/testsuite/css/transition.test.in new file mode 100644 index 0000000000..d90acdfa4d --- /dev/null +++ b/testsuite/css/transition.test.in @@ -0,0 +1,4 @@ +[Test] +Exec=/bin/sh -c "env G_ENABLE_DIAGNOSTIC=0 GTK_A11Y=test @libexecdir@/installed-tests/gtk-4.0/css/transition --tap -k" +Type=session +Output=TAP From 18e83fe16df56ed338a52f66886fd175f8341189 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Wed, 3 Feb 2021 14:47:24 -0500 Subject: [PATCH 7/9] Add more css transition tests --- testsuite/css/transition.c | 44 ++++++++++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 11 deletions(-) diff --git a/testsuite/css/transition.c b/testsuite/css/transition.c index cc0ea83086..6d180b0b7d 100644 --- a/testsuite/css/transition.c +++ b/testsuite/css/transition.c @@ -89,10 +89,14 @@ assert_css_value (int prop, GtkCssValue *result, GtkCssValue *expected) { - if (!value_is_near (prop, result, expected)) + if (result == expected) + return; + + if (((result == NULL) != (expected == NULL)) || + !value_is_near (prop, result, expected)) { - char *r = _gtk_css_value_to_string (result); - char *e = _gtk_css_value_to_string (expected); + char *r = result ? _gtk_css_value_to_string (result) : g_strdup ("(nil)"); + char *e = expected ? _gtk_css_value_to_string (expected) : g_strdup ("(nil)"); g_print ("Expected %s got %s\n", e, r); g_free (r); g_free (e); @@ -118,6 +122,15 @@ static ValueTransitionTest tests[] = { { GTK_CSS_PROPERTY_BOX_SHADOW, "2px 2px 10px 4px rgb(200,200,200), 0px 10px 8px 6px rgb(200,100,0)", "none", 0.5, "1px 1px 5px 2px rgba(200,200,200,0.5), 0px 5px 4px 3px rgba(200,100,0,0.5)" }, { GTK_CSS_PROPERTY_FONT_SIZE, "12px", "16px", 0.25, "13px" }, { GTK_CSS_PROPERTY_FONT_SIZE, "10px", "10pt", 0.5, "11.66666667px" }, + { GTK_CSS_PROPERTY_FONT_FAMILY, "cantarell", "sans", 0, "cantarell"}, + { GTK_CSS_PROPERTY_FONT_FAMILY, "cantarell", "sans", 1, "sans" }, + { GTK_CSS_PROPERTY_FONT_FAMILY, "cantarell", "sans", 0.5, NULL }, + { GTK_CSS_PROPERTY_BACKGROUND_POSITION, "20px 10px", "40px", 0.5, "30px calc(5px + 25%)" }, + //TODO We don't currently transition border-image-width + //{ GTK_CSS_PROPERTY_BORDER_IMAGE_WIDTH, "10px 20px", "0px", 0.5, "5px 10px 0.5px 0.5px" }, + { GTK_CSS_PROPERTY_FILTER, "none", "blur(6px)", 0.5, "blur(3px)" }, + { GTK_CSS_PROPERTY_FILTER, "none", "blur(6px),contrast(0.6)", 0.5, "blur(3px),contrast(0.3)" }, + { GTK_CSS_PROPERTY_FILTER, "contrast(0.6)", "blur(6px)", 0.5, NULL}, }; static GtkCssValue * @@ -159,24 +172,33 @@ test_transition (gconstpointer data) value1 = value_from_string (prop, test->value1); g_assert_nonnull (value1); + computed1 = _gtk_css_value_compute (value1, test->prop, provider, style, NULL); + value2 = value_from_string (prop, test->value2); g_assert_nonnull (value1); - value3 = value_from_string (prop, test->value3); - g_assert_nonnull (value3); - - computed1 = _gtk_css_value_compute (value1, test->prop, provider, style, NULL); computed2 = _gtk_css_value_compute (value2, test->prop, provider, style, NULL); - computed3 = _gtk_css_value_compute (value3, test->prop, provider, style, NULL); + + if (test->value3) + { + value3 = value_from_string (prop, test->value3); + computed3 = _gtk_css_value_compute (value3, test->prop, provider, style, NULL); + } + else + { + value3 = computed3 = NULL; + } + result = _gtk_css_value_transition (computed1, computed2, test->prop, test->progress); - g_assert_nonnull (result); assert_css_value (test->prop, result, computed3); gtk_css_value_unref (value1); gtk_css_value_unref (value2); - gtk_css_value_unref (value3); + if (value3) + gtk_css_value_unref (value3); gtk_css_value_unref (computed1); gtk_css_value_unref (computed2); - gtk_css_value_unref (computed3); + if (computed3) + gtk_css_value_unref (computed3); gtk_css_value_unref (result); } From 0a0a059397cc3781501556a92a09dc5b63de385a Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Wed, 3 Feb 2021 20:27:55 -0500 Subject: [PATCH 8/9] docs: Mention css drop-shadow filter We don't support this filter, currently. --- docs/reference/gtk/css-properties.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reference/gtk/css-properties.md b/docs/reference/gtk/css-properties.md index 8fa9819fc7..809669dd90 100644 --- a/docs/reference/gtk/css-properties.md +++ b/docs/reference/gtk/css-properties.md @@ -129,7 +129,7 @@ done with |:-----------|:----------|:------| |color | [CSS Color Level 3](https://www.w3.org/TR/css3-color/#foreground) | | |opacity | [CSS Color Level 3](https://www.w3.org/TR/css3-color/#opacity) | | -|filter | [CSS Filter Effect Level 1](https://drafts.fxtf.org/filters/#FilterProperty) | | +|filter | [CSS Filter Effect Level 1](https://drafts.fxtf.org/filters/#FilterProperty) | CSS allows drop-shadow | |font-family | [CSS Fonts Level 3](https://www.w3.org/TR/css3-fonts/#font-family-prop) | defaults to gtk-font-name setting | |font-size | [CSS Fonts Level 3](https://www.w3.org/TR/css3-fonts/#font-size-prop) | defaults to gtk-font-name setting | |font-style | [CSS Fonts Level 3](https://www.w3.org/TR/css3-fonts/#font-style-prop) | | From d5838f14f969bfd6ddad7d955994c7144031374a Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Thu, 4 Feb 2021 01:05:40 -0500 Subject: [PATCH 9/9] Drop the installed test for now It fails in ci, and I have no idea why. --- testsuite/css/meson.build | 8 -------- testsuite/css/transition.test.in | 4 ---- 2 files changed, 12 deletions(-) delete mode 100644 testsuite/css/transition.test.in diff --git a/testsuite/css/meson.build b/testsuite/css/meson.build index def05adcaa..20c031410d 100644 --- a/testsuite/css/meson.build +++ b/testsuite/css/meson.build @@ -75,14 +75,6 @@ if get_option('install-tests') configuration: conf, install_dir: testdatadir, ) - - conf = configuration_data() - conf.set('libexecdir', gtk_libexecdir) - configure_file(input: 'transition.test.in', - output: 'transition.test', - configuration: conf, - install_dir: testdatadir, - ) endif if false and get_option ('profiler') diff --git a/testsuite/css/transition.test.in b/testsuite/css/transition.test.in deleted file mode 100644 index d90acdfa4d..0000000000 --- a/testsuite/css/transition.test.in +++ /dev/null @@ -1,4 +0,0 @@ -[Test] -Exec=/bin/sh -c "env G_ENABLE_DIAGNOSTIC=0 GTK_A11Y=test @libexecdir@/installed-tests/gtk-4.0/css/transition --tap -k" -Type=session -Output=TAP