Compare commits

...

53 Commits

Author SHA1 Message Date
Matthias Clasen ebd3c2b3f5 theme: Reduce the height of titlebars
The height of our titlebars is geared towards headerbars that can
host controls. For a traditional title-only titlebar, a smaller
footprint is sufficient and frees up some valuable vertical space
2024-05-15 13:22:32 -04:00
Matthias Clasen 7898d1b46d Merge branch 'wip/sophie-h/print' into 'main'
printdialog: Fix some annotiations

Closes #6709

See merge request GNOME/gtk!7251
2024-05-14 20:51:54 +00:00
Sophie Herold 3648398f6d printsetup: Remove nullable from settings getters
GtkPrintSetup is initialized with the values returned from the portal.
Therefore the page setup and the print settings can never be NULL.
2024-05-14 22:21:19 +02:00
Sophie Herold 019916c5b9 printdialog: Remove nullable for GError functions
Functions that set a GError should not be marked as nullable if they
only return NULL on error.
2024-05-14 22:12:04 +02:00
Sophie Herold ebb31590ae printdialog: Add missing nullable to getters
The initial values are NULL.
2024-05-14 22:10:29 +02:00
Benjamin Otte 32ea1cf32d Merge branch 'wip/kabus/scroll_to_null_tile' into 'main'
listbase: Fix a null dereference

See merge request GNOME/gtk!7240
2024-05-14 19:48:42 +00:00
Khalid Abu Shawarib 172cdf8e21 listbase: Return early on non-existent scroll position 2024-05-14 15:27:38 +03:00
Matthias Clasen dc07bcf3a3 Merge branch 'michaelweghorn/a11y_atspi_map_level_property' into 'main'
a11y atspi: Map GTK_ACCESSIBLE_PROPERTY_LEVEL to AT-SPI attr

See merge request GNOME/gtk!6549
2024-05-13 16:02:53 +00:00
Matthias Clasen bd96c10563 Merge branch 'matthiasc/for-main' into 'main'
testsuite: Improve test-css-parser

See merge request GNOME/gtk!7248
2024-05-13 14:57:15 +00:00
Matthias Clasen 76299396cf testsuite: Improve test-css-parser
Make it so that --generate parse produces output that can be
directly pasted into the ref.css file.
2024-05-13 10:04:28 -04:00
Ekaterine Papava a96dd2ad0a Update Georgian translation 2024-05-13 00:45:14 +00:00
Matthias Clasen 1e210e83bb Merge branch 'structcleanup' into 'main'
gdk: Remove unused struct 'XPointerUngrabInfo'

See merge request GNOME/gtk!7245
2024-05-12 04:52:19 +00:00
Dr. David Alan Gilbert 14f1a91bff gdk: Remove unused struct 'XPointerUngrabInfo'
'XPointerUngrabInfo' appears unused since
commit 26cbf87d7d ("New approach for grab tracking code")
Remove it.

Signed-off-by: Dr. David Alan Gilbert <dave@treblig.org>
2024-05-12 01:06:31 +01:00
Matthias Clasen 3f2bcdf82e Merge branch 'matthiasc/for-main' into 'main'
wayland: Tweak cursor sizing code

See merge request GNOME/gtk!7244
2024-05-11 03:40:53 +00:00
Matthias Clasen c61d8bc188 wayland: Tweak cursor sizing code
We want to take advantage of a viewporter also for named cursors.
2024-05-10 23:10:50 -04:00
Matthias Clasen 4e5976427b NEWS: Updates 2024-05-10 21:47:44 -04:00
Matthias Clasen 7fcdb0205f Merge branch 'wip/alice/css-variables' into 'main'
CSS custom properties/variables

See merge request GNOME/gtk!6540
2024-05-11 01:38:10 +00:00
Benjamin Otte 4814c5f653 array: Don't overflow array size
Copy what gcc's libstdc++ does for vectors to avoid overflows:

1. Define a max size macro and assert against it
   Note that we don't assert but actually check, because this needs
   to abort even if assertions are disabled.
2. Don't do fancy math to compute new capacity.
   Just size *= 2 instead and be careful about overflow.
2024-05-10 21:22:03 -04:00
Alice Mikhaylenko eb24e3548f inspector: Sort GTK CSS properties between standard and custom ones 2024-05-10 18:29:48 +04:00
Alice Mikhaylenko 87f0f374a9 inspector: Show custom properties for css nodes 2024-05-10 18:29:48 +04:00
Alice Mikhaylenko 0cd95951e6 testsuite: Add css variables tests 2024-05-10 18:29:48 +04:00
Matthias Clasen c45815c217 css: Improve error reporting for variables
Emit errors for all the variables that were being expanded
if an error occurs while parsing a property value at compute time.

Include the variables that are being expanded in the error message.
2024-05-10 18:29:48 +04:00
Matthias Clasen b914869715 css parser: Keep variables for tokenizers
Add a function that gets the names of the variables that the
parser is currently in the process of expanding. This will
be used for error reporting.
2024-05-10 18:29:48 +04:00
Matthias Clasen ff5699e097 css parser: Inline the tokenizer array
This is in preparation of associating more data with the token streams.
2024-05-10 18:29:47 +04:00
Matthias Clasen 8846f85874 css provider: Set bytes on sections
Pass the bytes we're parsing to the sections, and keep a pointer
to them around, so we can compare them in the has_section
implementation.

This commit also corrects some of the location information that
we add into the section for variables to be more accurate.
2024-05-10 18:29:47 +04:00
Matthias Clasen fc1c6cfb1a css parser: Add gtk_css_parser_get_bytes
Gets the bytes that the parser is operating on.
2024-05-10 18:29:47 +04:00
Matthias Clasen 77028362ab css provider: Set sections on all variable values
We were doing it in one case, but forgetting it in another.
These sections are necessary to report meaningful error locations
when parsing property values at compute time.
2024-05-10 18:29:47 +04:00
Matthias Clasen 496aee5b02 style cascade: Propagate errors
When we compute values, the provider we use ends up being the
style cascade. If we hit a parser error when parsing variable-bearing
property values at compute time, we emit the error on that provider.

By making the cascade propagate the error back to the proper css
provider that contains the section in question, we get it reported
back to the css editor in the inspector.
2024-05-10 18:29:47 +04:00
Matthias Clasen b2fb624496 style provider: Add a has_section api
Add gtk_style_provider_has_section and implement it for
GtkCssProvider. This will be used later to direct error
emissions to the right provider.
2024-05-10 18:29:47 +04:00
Matthias Clasen f2ef5d85ea css parser: Add bytes to sections
We will use this later to link sections back to the providers
they come from.
2024-05-10 18:29:47 +04:00
Matthias Clasen 7eca32edf0 css parser: Add gtk_css_parser_skip_whitespace
Does what it says.
2024-05-10 18:29:47 +04:00
Matthias Clasen 7775bcf2fb css: Don't accept junk
Check that there is no junk at the end of the property value
when parsing variable-bearing properties at compute time.
2024-05-10 18:29:47 +04:00
Alice Mikhaylenko ed35f6f8b8 css: Condense compute parameters into GtkCssComputeContext
That list is getting out of hand, let's make it a struct.
2024-05-10 18:29:47 +04:00
Matthias Clasen 307942e1f7 css: Only compute shorthand values once
When computing a style, only compute the shorthand value once.
2024-05-10 18:29:47 +04:00
Alice Mikhaylenko 92b7231168 csskeyframes: Support variables 2024-05-10 18:29:47 +04:00
Alice Mikhaylenko 14d7eb97d2 cssanimation: Recompute values while playing
This will be necessary for supporting variables in animations.

For this we need to pass all the gtk_css_value_compute() parameters into
GtkCssAnimatedStyle: parent style and provider.
2024-05-10 18:29:47 +04:00
Alice Mikhaylenko fed1c3d3fc cssstaticstyle: Split property lists into a separate header
We'll need to use them in GtkCssAnimatedStyle too.
2024-05-10 18:29:47 +04:00
Alice Mikhaylenko e1ac97a185 cssvalue: Pass an extra GtkCssVariableSet to compute()
We'll need this to support variables in @keyframes, since styles will
need to combine their own variables and the ones from the keyframes.

See the next commit, this one is split out to avoid a huge diff.
2024-05-10 18:29:47 +04:00
Alice Mikhaylenko 08a48dd97e Implement basic support for CSS variables 2024-05-10 18:29:47 +04:00
Matthias Clasen 50df3ebb46 css: Give shorthand properties an ID
This will be used in future commits.
2024-05-10 18:29:47 +04:00
Alice Mikhaylenko df77f22740 cssvalue: Add contains_variables()
We'll need this to know which values to recompute for animations.

It will be used in the next commit, it's separate to avoid the diff
being too large.
2024-05-10 18:29:47 +04:00
Alice Mikhaylenko 2437a551ec csstokenizer: Add save() and restore()
We'll need that to check if property values contain variables.
2024-05-10 18:29:47 +04:00
Alice Mikhaylenko 46ab71fc8a cssprovider: Copy bytes when loading
We'll need to keep accessing them later to compute values with variables,
so we can't avoid this anymore.
2024-05-10 18:29:47 +04:00
Matthias Clasen f922ff8597 Merge branch 'speed-up-cairo-icons' into 'main'
gsk: Speed up mask nodes with cairo

Closes #6700

See merge request GNOME/gtk!7243
2024-05-10 14:10:18 +00:00
Matthias Clasen 690c06109e gsk: Speed up mask nodes with cairo
Switch symbolc icon drawing from color-matrix to mask nodes
make the performance of the iconscroll demo crater (from 60fps
to 10fps).

Apply the same optimization we already have for color-matrix
nodes when drawing mask nodes. This gets us back to 60fps.

Fixes: #6700
2024-05-10 07:24:25 -04:00
Matthias Clasen 94505987fe Merge branch 'matthiasc/for-main' into 'main'
css parser: Fix a typo

See merge request GNOME/gtk!7241
2024-05-10 04:11:08 +00:00
Matthias Clasen c6d7b704cb css parser: Fix a typo
Due to an ARAY vs ARRAY mishap, we weren't actually preallocating
any blocks. Fix that, and reduce the number of preallocated blocks
to 12. That seems sufficient, since parsing the Default theme never
needs more than 5 blocks.
2024-05-09 23:26:55 -04:00
Hugo Carvalho 349509c332 Update Portuguese translation
(cherry picked from commit 40e99590e7)
2024-05-09 16:01:52 +00:00
Matthias Clasen 84fd420271 Merge branch '6674_fix_flickering_tooltip' into 'main'
tooltip: query tooltip on widget under pointer only

Closes #6674

See merge request GNOME/gtk!7237
2024-05-08 00:43:05 +00:00
Matthias Clasen 0c40defaf1 Merge branch 'realize_accessible_before_add_event_emission' into 'main'
a11y: Realize the AT context before firing a children added event for it

See merge request GNOME/gtk!7229
2024-05-08 00:42:33 +00:00
g.willems d665274eb1 tooltip: query tooltip on widget under pointer only
When changing the tooltip text or markup of widget A, we simulate a
motion event on that widget to update the display.
But if there is an active tooltip on widget B, then the current code
belives we moved the pointer from B to A thus hides/shows the tooltip
of B alternatively.

Instead, simulate the motion event on the widget currently under the pointer.
This will avoid flickering if we keep the pointer over widget B.

Fixes #6674
Closes #6674
2024-05-07 19:32:15 +02:00
Lukáš Tyrychtr 81b6251073 a11y: Realize the AT context before firing a children added event for it
This allows, with some other changes, AdwToasts to be read on appearance by Orca.
2024-05-07 15:49:59 +02:00
Michael Weghorn bcf78aeb39 a11y atspi: Map GTK_ACCESSIBLE_PROPERTY_LEVEL to AT-SPI attr
Map GTK_ACCESSIBLE_PROPERTY_LEVEL to the corresponding
AT-SPI object attribute "level", as it is specified
e.g. in the Core Accessibility Mappings 1.2 for the
"aria-level" attribute, for both, headings [1] and
non-headings [2].

This e.g. makes reporting the header level via
AT-SPI work for the gtk4-based LibreOffice variant
when combined with the corresponding LibreOffice
change [3] to set the GTK_ACCESSIBLE_PROPERTY_LEVEL
property.

For a related discussion, see issue #6196.

[1] https://www.w3.org/TR/core-aam-1.2/#ariaLevelHeading
[2] https://www.w3.org/TR/core-aam-1.2/#ariaLevel
[3] https://gerrit.libreoffice.org/c/core/+/159216
2023-11-09 17:21:00 +01:00
118 changed files with 5038 additions and 2025 deletions
+6 -1
View File
@@ -6,6 +6,7 @@ Overview of Changes in 4.15.1, xx-xx-xxxx
* CSS: * CSS:
- Support the :root selector - Support the :root selector
- Support variables and custom properties
* Icontheme: * Icontheme:
- Make symbolic svg loading more efficient - Make symbolic svg loading more efficient
@@ -14,19 +15,22 @@ Overview of Changes in 4.15.1, xx-xx-xxxx
* Accessibility: * Accessibility:
- Make the gtk-demo sidebar search more accessible - Make the gtk-demo sidebar search more accessible
- Stop emitting focus events - Stop emitting focus events
- Realize child contexts when necessary
* GDK: * GDK:
- Support XDG_ACTIVATION_TOKEN - Support XDG_ACTIVATION_TOKEN
- dmabuf: Be more defensive when importing unknown formats to GL - dmabuf: Be more defensive when importing unknown formats to GL
- dmabuf: Use narrow range for YUV - dmabuf: Use narrow range for YUV
- vulkan: Recreate swapchains when necessary or beneficial
* GSK: * GSK:
- Improve logging for GDK_DEBUG=offload - Improve logging for GDK_DEBUG=offload
- Improve logging for GSK_DEBUG=renderer - Improve logging for GSK_DEBUG=renderer
- gpu: Warn about inefficient texture import - gpu: Warn about inefficient texture import
- gpu: Handle tiny offscreens correctly - gpu: Handle tiny offscreens correctly
- vulkan: Add profiler marks in various places - vulkan: Add profiler marks in various places
- vulkan: Fix a problem with imported dmabufs showing up black - vulkan: Fix a problem with imported dmabufs showing up black
- cairo: Speed up mask nodes, since we use them for symbolic icons
* Wayland: * Wayland:
- Use wl_compositor version 6 - Use wl_compositor version 6
@@ -46,6 +50,7 @@ Overview of Changes in 4.15.1, xx-xx-xxxx
* Translation updates: * Translation updates:
Korean Korean
Portuguese
Turkish Turkish
+24
View File
@@ -56,6 +56,30 @@ follows:
1 value: 1 value:
: all : all
## Custom Properties
GTK supports custom properties as defined in the
[CSS Custom Properties for Cascading Variables](https://www.w3.org/TR/css-variables-1)
spec.
Custom properties are defined as follows:
```css
--prop: red;
```
and used via the `var` keyword:
```css
color: var(--prop);
```
Custom properties can have a fallback for when the referred property is invalid:
```css
color: var(--prop, green);
```
## Colors ## Colors
GTK extends the CSS syntax with several additional ways to specify colors. GTK extends the CSS syntax with several additional ways to specify colors.
+16 -8
View File
@@ -41,8 +41,10 @@ G_BEGIN_DECLS
#ifdef GDK_ARRAY_NULL_TERMINATED #ifdef GDK_ARRAY_NULL_TERMINATED
#define GDK_ARRAY_REAL_SIZE(_size) ((_size) + 1) #define GDK_ARRAY_REAL_SIZE(_size) ((_size) + 1)
#define GDK_ARRAY_MAX_SIZE (G_MAXSIZE / sizeof (_T_) - 1)
#else #else
#define GDK_ARRAY_REAL_SIZE(_size) (_size) #define GDK_ARRAY_REAL_SIZE(_size) (_size)
#define GDK_ARRAY_MAX_SIZE (G_MAXSIZE / sizeof (_T_))
#endif #endif
/* make this readable */ /* make this readable */
@@ -177,18 +179,23 @@ G_GNUC_UNUSED static inline void
gdk_array(reserve) (GdkArray *self, gdk_array(reserve) (GdkArray *self,
gsize n) gsize n)
{ {
gsize new_size, size; gsize new_capacity, size, capacity;
if (n <= gdk_array(get_capacity) (self)) if (G_UNLIKELY (n > GDK_ARRAY_MAX_SIZE))
return; g_error ("requesting array size of %zu, but maximum size is %zu", n, GDK_ARRAY_MAX_SIZE);
capacity = gdk_array(get_capacity) (self);
if (n <= capacity)
return;
size = gdk_array(get_size) (self); size = gdk_array(get_size) (self);
new_size = ((gsize) 1) << g_bit_storage (MAX (GDK_ARRAY_REAL_SIZE (n), 16) - 1); /* capacity * 2 can overflow, that's why we MAX() */
new_capacity = MAX (GDK_ARRAY_REAL_SIZE (n), capacity * 2);
#ifdef GDK_ARRAY_PREALLOC #ifdef GDK_ARRAY_PREALLOC
if (self->start == self->preallocated) if (self->start == self->preallocated)
{ {
self->start = g_new (_T_, new_size); self->start = g_new (_T_, new_capacity);
memcpy (self->start, self->preallocated, sizeof (_T_) * GDK_ARRAY_REAL_SIZE (size)); memcpy (self->start, self->preallocated, sizeof (_T_) * GDK_ARRAY_REAL_SIZE (size));
} }
else else
@@ -196,15 +203,15 @@ gdk_array(reserve) (GdkArray *self,
#ifdef GDK_ARRAY_NULL_TERMINATED #ifdef GDK_ARRAY_NULL_TERMINATED
if (self->start == NULL) if (self->start == NULL)
{ {
self->start = g_new (_T_, new_size); self->start = g_new (_T_, new_capacity);
*self->start = *(_T_[1]) { 0 }; *self->start = *(_T_[1]) { 0 };
} }
else else
#endif #endif
self->start = g_renew (_T_, self->start, new_size); self->start = g_renew (_T_, self->start, new_capacity);
self->end = self->start + size; self->end = self->start + size;
self->end_allocation = self->start + new_size; self->end_allocation = self->start + new_capacity;
#ifdef GDK_ARRAY_NULL_TERMINATED #ifdef GDK_ARRAY_NULL_TERMINATED
self->end_allocation--; self->end_allocation--;
#endif #endif
@@ -312,6 +319,7 @@ gdk_array(get) (const GdkArray *self,
#undef gdk_array_paste #undef gdk_array_paste
#undef gdk_array #undef gdk_array
#undef GDK_ARRAY_REAL_SIZE #undef GDK_ARRAY_REAL_SIZE
#undef GDK_ARRAY_MAX_SIZE
#undef GDK_ARRAY_BY_VALUE #undef GDK_ARRAY_BY_VALUE
#undef GDK_ARRAY_ELEMENT_TYPE #undef GDK_ARRAY_ELEMENT_TYPE
+37 -38
View File
@@ -165,25 +165,29 @@ _gdk_wayland_cursor_get_buffer (GdkWaylandDisplay *display,
double *scale) double *scale)
{ {
GdkTexture *texture; GdkTexture *texture;
int desired_scale_factor;
desired_scale_factor = (int) ceil (desired_scale);
if (gdk_cursor_get_name (cursor)) if (gdk_cursor_get_name (cursor))
{ {
struct wl_cursor *c; struct wl_cursor *c;
int scale_factor;
if (g_str_equal (gdk_cursor_get_name (cursor), "none")) if (g_str_equal (gdk_cursor_get_name (cursor), "none"))
goto none; {
*hotspot_x = *hotspot_y = 0;
*width = *height = 0;
*scale = 1;
return NULL;
}
scale_factor = (int) ceil (desired_scale);
c = gdk_wayland_cursor_load_for_name (display, c = gdk_wayland_cursor_load_for_name (display,
_gdk_wayland_display_get_cursor_theme (display), display->cursor_theme,
desired_scale_factor, scale_factor,
gdk_cursor_get_name (cursor)); gdk_cursor_get_name (cursor));
if (c && c->image_count > 0) if (c && c->image_count > 0)
{ {
struct wl_cursor_image *image; struct wl_cursor_image *image;
int cursor_scale;
if (image_index >= c->image_count) if (image_index >= c->image_count)
{ {
@@ -195,23 +199,23 @@ _gdk_wayland_cursor_get_buffer (GdkWaylandDisplay *display,
image = c->images[image_index]; image = c->images[image_index];
cursor_scale = desired_scale_factor; *width = display->cursor_theme_size;
if ((image->width % cursor_scale != 0) || *height = display->cursor_theme_size;
(image->height % cursor_scale != 0)) *scale = image->width / (double) *width;
*hotspot_x = image->hotspot_x / scale_factor;
*hotspot_y = image->hotspot_y / scale_factor;
if (*scale != scale_factor && !use_viewporter)
{ {
g_warning (G_STRLOC " cursor image size (%dx%d) not an integer " g_warning (G_STRLOC " cursor image size (%d) not an integer "
"multiple of scale (%d)", image->width, image->height, "multiple of theme size (%d)", image->width, *width);
cursor_scale); *width = image->width;
cursor_scale = 1; *height = image->height;
*hotspot_x = image->hotspot_x;
*hotspot_y = image->hotspot_y;
*scale = 1;
} }
*hotspot_x = image->hotspot_x / cursor_scale;
*hotspot_y = image->hotspot_y / cursor_scale;
*width = image->width / cursor_scale;
*height = image->height / cursor_scale;
*scale = cursor_scale;
return wl_cursor_image_get_buffer (image); return wl_cursor_image_get_buffer (image);
} }
} }
@@ -257,7 +261,7 @@ from_texture:
else else
{ {
if (!use_viewporter) if (!use_viewporter)
*scale = desired_scale_factor; *scale = ceil (desired_scale);
else else
*scale = desired_scale; *scale = desired_scale;
@@ -294,28 +298,23 @@ from_texture:
} }
if (gdk_cursor_get_fallback (cursor)) if (gdk_cursor_get_fallback (cursor))
return _gdk_wayland_cursor_get_buffer (display, {
gdk_cursor_get_fallback (cursor), return _gdk_wayland_cursor_get_buffer (display,
desired_scale, gdk_cursor_get_fallback (cursor),
use_viewporter, desired_scale,
image_index, use_viewporter,
hotspot_x, hotspot_y, image_index,
width, height, hotspot_x, hotspot_y,
scale); width, height,
scale);
}
else else
{ {
texture = gdk_texture_new_from_resource ("/org/gtk/libgdk/cursor/default"); texture = gdk_texture_new_from_resource ("/org/gtk/libgdk/cursor/default");
goto from_texture; goto from_texture;
} }
none: g_assert_not_reached ();
*hotspot_x = 0;
*hotspot_y = 0;
*width = 0;
*height = 0;
*scale = 1;
return NULL;
} }
guint guint
-5
View File
@@ -1776,11 +1776,6 @@ _gdk_x11_display_is_root_window (GdkDisplay *display,
return GDK_SCREEN_XROOTWIN (display_x11->screen) == xroot_window; return GDK_SCREEN_XROOTWIN (display_x11->screen) == xroot_window;
} }
struct XPointerUngrabInfo {
GdkDisplay *display;
guint32 time;
};
static void static void
device_grab_update_callback (GdkDisplay *display, device_grab_update_callback (GdkDisplay *display,
gpointer data, gpointer data,
+4
View File
@@ -6397,6 +6397,10 @@ gsk_mask_node_draw (GskRenderNode *node,
graphene_matrix_t color_matrix; graphene_matrix_t color_matrix;
graphene_vec4_t color_offset; graphene_vec4_t color_offset;
/* clip so the push_group() creates a smaller surface */
gsk_cairo_rectangle (cr, &node->bounds);
cairo_clip (cr);
if (has_empty_clip (cr)) if (has_empty_clip (cr))
return; return;
+12
View File
@@ -530,6 +530,15 @@ handle_accessible_method (GDBusConnection *connection,
g_variant_builder_open (&builder, G_VARIANT_TYPE ("a{ss}")); g_variant_builder_open (&builder, G_VARIANT_TYPE ("a{ss}"));
g_variant_builder_add (&builder, "{ss}", "toolkit", "GTK"); g_variant_builder_add (&builder, "{ss}", "toolkit", "GTK");
if (gtk_at_context_has_accessible_property (GTK_AT_CONTEXT (self), GTK_ACCESSIBLE_PROPERTY_LEVEL))
{
GtkAccessibleValue *value = gtk_at_context_get_accessible_property (GTK_AT_CONTEXT (self),
GTK_ACCESSIBLE_PROPERTY_LEVEL);
char *level = g_strdup_printf ("%d", gtk_int_accessible_value_get (value));
g_variant_builder_add (&builder, "{ss}", "level", level);
g_free (level);
}
if (gtk_at_context_has_accessible_property (GTK_AT_CONTEXT (self), GTK_ACCESSIBLE_PROPERTY_PLACEHOLDER)) if (gtk_at_context_has_accessible_property (GTK_AT_CONTEXT (self), GTK_ACCESSIBLE_PROPERTY_PLACEHOLDER))
{ {
GtkAccessibleValue *value; GtkAccessibleValue *value;
@@ -1257,10 +1266,13 @@ gtk_at_spi_context_child_change (GtkATContext *ctx,
} }
if (change & GTK_ACCESSIBLE_CHILD_CHANGE_ADDED) if (change & GTK_ACCESSIBLE_CHILD_CHANGE_ADDED)
{
gtk_at_context_realize (child_context);
emit_children_changed (self, emit_children_changed (self,
GTK_AT_SPI_CONTEXT (child_context), GTK_AT_SPI_CONTEXT (child_context),
idx, idx,
GTK_ACCESSIBLE_CHILD_STATE_ADDED); GTK_ACCESSIBLE_CHILD_STATE_ADDED);
}
else if (change & GTK_ACCESSIBLE_CHILD_CHANGE_REMOVED) else if (change & GTK_ACCESSIBLE_CHILD_CHANGE_REMOVED)
emit_children_changed (self, emit_children_changed (self,
GTK_AT_SPI_CONTEXT (child_context), GTK_AT_SPI_CONTEXT (child_context),
+484 -9
View File
@@ -26,6 +26,16 @@
#include "gtkcsserror.h" #include "gtkcsserror.h"
#include "gtkcsslocationprivate.h" #include "gtkcsslocationprivate.h"
static void clear_ref (GtkCssVariableValueReference *ref);
#define GDK_ARRAY_NAME gtk_css_parser_references
#define GDK_ARRAY_TYPE_NAME GtkCssParserReferences
#define GDK_ARRAY_ELEMENT_TYPE GtkCssVariableValueReference
#define GDK_ARRAY_BY_VALUE 1
#define GDK_ARRAY_NO_MEMSET 1
#define GDK_ARRAY_FREE_FUNC clear_ref
#include "gdk/gdkarrayimpl.c"
typedef struct _GtkCssParserBlock GtkCssParserBlock; typedef struct _GtkCssParserBlock GtkCssParserBlock;
struct _GtkCssParserBlock struct _GtkCssParserBlock
@@ -39,7 +49,7 @@ struct _GtkCssParserBlock
#define GDK_ARRAY_NAME gtk_css_parser_blocks #define GDK_ARRAY_NAME gtk_css_parser_blocks
#define GDK_ARRAY_TYPE_NAME GtkCssParserBlocks #define GDK_ARRAY_TYPE_NAME GtkCssParserBlocks
#define GDK_ARRAY_ELEMENT_TYPE GtkCssParserBlock #define GDK_ARRAY_ELEMENT_TYPE GtkCssParserBlock
#define GDK_ARAY_PREALLOC 32 #define GDK_ARRAY_PREALLOC 12
#define GDK_ARRAY_NO_MEMSET 1 #define GDK_ARRAY_NO_MEMSET 1
#include "gdk/gdkarrayimpl.c" #include "gdk/gdkarrayimpl.c"
@@ -55,11 +65,53 @@ gtk_css_parser_blocks_drop_last (GtkCssParserBlocks *blocks)
gtk_css_parser_blocks_set_size (blocks, gtk_css_parser_blocks_get_size (blocks) - 1); gtk_css_parser_blocks_set_size (blocks, gtk_css_parser_blocks_get_size (blocks) - 1);
} }
typedef struct _GtkCssTokenizerData GtkCssTokenizerData;
struct _GtkCssTokenizerData
{
GtkCssTokenizer *tokenizer;
char *var_name;
GtkCssVariableValue *variable;
};
static void
gtk_css_tokenizer_data_clear (gpointer data)
{
GtkCssTokenizerData *td = data;
gtk_css_tokenizer_unref (td->tokenizer);
if (td->var_name)
g_free (td->var_name);
if (td->variable)
gtk_css_variable_value_unref (td->variable);
}
#define GDK_ARRAY_NAME gtk_css_tokenizers
#define GDK_ARRAY_TYPE_NAME GtkCssTokenizers
#define GDK_ARRAY_ELEMENT_TYPE GtkCssTokenizerData
#define GDK_ARRAY_FREE_FUNC gtk_css_tokenizer_data_clear
#define GDK_ARRAY_BY_VALUE 1
#define GDK_ARRAY_PREALLOC 16
#define GDK_ARRAY_NO_MEMSET 1
#include "gdk/gdkarrayimpl.c"
static inline GtkCssTokenizerData *
gtk_css_tokenizers_get_last (GtkCssTokenizers *tokenizers)
{
return gtk_css_tokenizers_index (tokenizers, gtk_css_tokenizers_get_size (tokenizers) - 1);
}
static inline void
gtk_css_tokenizers_drop_last (GtkCssTokenizers *tokenizers)
{
gtk_css_tokenizers_set_size (tokenizers, gtk_css_tokenizers_get_size (tokenizers) - 1);
}
struct _GtkCssParser struct _GtkCssParser
{ {
volatile int ref_count; volatile int ref_count;
GtkCssTokenizer *tokenizer; GtkCssTokenizers tokenizers;
GFile *file; GFile *file;
GFile *directory; GFile *directory;
GtkCssParserErrorFunc error_func; GtkCssParserErrorFunc error_func;
@@ -69,10 +121,22 @@ struct _GtkCssParser
GtkCssParserBlocks blocks; GtkCssParserBlocks blocks;
GtkCssLocation location; GtkCssLocation location;
GtkCssToken token; GtkCssToken token;
GtkCssVariableValue **refs;
gsize n_refs;
gsize next_ref;
gboolean var_fallback;
}; };
static inline GtkCssTokenizer *
get_tokenizer (GtkCssParser *self)
{
return gtk_css_tokenizers_get_last (&self->tokenizers)->tokenizer;
}
static GtkCssParser * static GtkCssParser *
gtk_css_parser_new (GtkCssTokenizer *tokenizer, gtk_css_parser_new (GtkCssTokenizer *tokenizer,
GtkCssVariableValue *value,
GFile *file, GFile *file,
GtkCssParserErrorFunc error_func, GtkCssParserErrorFunc error_func,
gpointer user_data, gpointer user_data,
@@ -83,7 +147,14 @@ gtk_css_parser_new (GtkCssTokenizer *tokenizer,
self = g_new0 (GtkCssParser, 1); self = g_new0 (GtkCssParser, 1);
self->ref_count = 1; self->ref_count = 1;
self->tokenizer = gtk_css_tokenizer_ref (tokenizer);
gtk_css_tokenizers_init (&self->tokenizers);
gtk_css_tokenizers_append (&self->tokenizers,
&(GtkCssTokenizerData) {
gtk_css_tokenizer_ref (tokenizer),
NULL,
value ? gtk_css_variable_value_ref (value) : NULL });
if (file) if (file)
self->file = g_object_ref (file); self->file = g_object_ref (file);
@@ -125,21 +196,45 @@ gtk_css_parser_new_for_bytes (GBytes *bytes,
{ {
GtkCssTokenizer *tokenizer; GtkCssTokenizer *tokenizer;
GtkCssParser *result; GtkCssParser *result;
tokenizer = gtk_css_tokenizer_new (bytes); tokenizer = gtk_css_tokenizer_new (bytes);
result = gtk_css_parser_new (tokenizer, file, error_func, user_data, user_destroy); result = gtk_css_parser_new (tokenizer, NULL, file, error_func, user_data, user_destroy);
gtk_css_tokenizer_unref (tokenizer); gtk_css_tokenizer_unref (tokenizer);
return result; return result;
} }
GtkCssParser *
gtk_css_parser_new_for_token_stream (GtkCssVariableValue *value,
GFile *file,
GtkCssVariableValue **refs,
gsize n_refs,
GtkCssParserErrorFunc error_func,
gpointer user_data,
GDestroyNotify user_destroy)
{
GtkCssTokenizer *tokenizer;
GtkCssParser *result;
tokenizer = gtk_css_tokenizer_new_for_range (value->bytes, value->offset,
value->end_offset - value->offset);
result = gtk_css_parser_new (tokenizer, value, file, error_func, user_data, user_destroy);
gtk_css_tokenizer_unref (tokenizer);
result->refs = refs;
result->n_refs = n_refs;
result->next_ref = 0;
return result;
}
static void static void
gtk_css_parser_finalize (GtkCssParser *self) gtk_css_parser_finalize (GtkCssParser *self)
{ {
if (self->user_destroy) if (self->user_destroy)
self->user_destroy (self->user_data); self->user_destroy (self->user_data);
g_clear_pointer (&self->tokenizer, gtk_css_tokenizer_unref); gtk_css_tokenizers_clear (&self->tokenizers);
g_clear_object (&self->file); g_clear_object (&self->file);
g_clear_object (&self->directory); g_clear_object (&self->directory);
if (gtk_css_parser_blocks_get_size (&self->blocks) > 0) if (gtk_css_parser_blocks_get_size (&self->blocks) > 0)
@@ -179,6 +274,12 @@ gtk_css_parser_get_file (GtkCssParser *self)
return self->file; return self->file;
} }
GBytes *
gtk_css_parser_get_bytes (GtkCssParser *self)
{
return gtk_css_tokenizer_get_bytes (gtk_css_tokenizers_get (&self->tokenizers, 0)->tokenizer);
}
/** /**
* gtk_css_parser_resolve_url: * gtk_css_parser_resolve_url:
* @self: a `GtkCssParser` * @self: a `GtkCssParser`
@@ -260,7 +361,7 @@ gtk_css_parser_get_start_location (GtkCssParser *self)
const GtkCssLocation * const GtkCssLocation *
gtk_css_parser_get_end_location (GtkCssParser *self) gtk_css_parser_get_end_location (GtkCssParser *self)
{ {
return gtk_css_tokenizer_get_location (self->tokenizer); return gtk_css_tokenizer_get_location (get_tokenizer (self));
} }
/** /**
@@ -294,12 +395,14 @@ static void
gtk_css_parser_ensure_token (GtkCssParser *self) gtk_css_parser_ensure_token (GtkCssParser *self)
{ {
GError *error = NULL; GError *error = NULL;
GtkCssTokenizer *tokenizer;
if (!gtk_css_token_is (&self->token, GTK_CSS_TOKEN_EOF)) if (!gtk_css_token_is (&self->token, GTK_CSS_TOKEN_EOF))
return; return;
self->location = *gtk_css_tokenizer_get_location (self->tokenizer); tokenizer = get_tokenizer (self);
if (!gtk_css_tokenizer_read_token (self->tokenizer, &self->token, &error)) self->location = *gtk_css_tokenizer_get_location (tokenizer);
if (!gtk_css_tokenizer_read_token (tokenizer, &self->token, &error))
{ {
/* We ignore the error here, because the resulting token will /* We ignore the error here, because the resulting token will
* likely already trigger an error in the parsing code and * likely already trigger an error in the parsing code and
@@ -307,6 +410,49 @@ gtk_css_parser_ensure_token (GtkCssParser *self)
*/ */
g_clear_error (&error); g_clear_error (&error);
} }
if (gtk_css_tokenizers_get_size (&self->tokenizers) > 1 && gtk_css_token_is (&self->token, GTK_CSS_TOKEN_EOF))
{
gtk_css_tokenizers_drop_last (&self->tokenizers);
gtk_css_parser_ensure_token (self);
return;
}
/* Resolve var(--name): skip it and insert the resolved reference instead */
if (self->n_refs > 0 && gtk_css_token_is_function (&self->token, "var") && self->var_fallback == 0)
{
GtkCssVariableValue *ref;
GtkCssTokenizer *ref_tokenizer;
gtk_css_parser_start_block (self);
g_assert (gtk_css_parser_has_token (self, GTK_CSS_TOKEN_IDENT));
char *var_name = gtk_css_parser_consume_ident (self);
g_assert (var_name[0] == '-' && var_name[1] == '-');
/* If we encounter var() in a fallback when we can already resolve the
* actual variable, skip it */
self->var_fallback++;
gtk_css_parser_skip (self);
gtk_css_parser_end_block (self);
self->var_fallback--;
g_assert (self->next_ref < self->n_refs);
ref = self->refs[self->next_ref++];
ref_tokenizer = gtk_css_tokenizer_new_for_range (ref->bytes, ref->offset,
ref->end_offset - ref->offset);
gtk_css_tokenizers_append (&self->tokenizers,
&(GtkCssTokenizerData) {
ref_tokenizer,
g_strdup (var_name),
gtk_css_variable_value_ref (ref)
});
gtk_css_parser_ensure_token (self);
g_free (var_name);
}
} }
const GtkCssToken * const GtkCssToken *
@@ -523,6 +669,19 @@ gtk_css_parser_skip_until (GtkCssParser *self,
} }
} }
void
gtk_css_parser_skip_whitespace (GtkCssParser *self)
{
const GtkCssToken *token;
for (token = gtk_css_parser_peek_token (self);
gtk_css_token_is (token, GTK_CSS_TOKEN_WHITESPACE);
token = gtk_css_parser_peek_token (self))
{
gtk_css_parser_consume_token (self);
}
}
void void
gtk_css_parser_emit_error (GtkCssParser *self, gtk_css_parser_emit_error (GtkCssParser *self,
const GtkCssLocation *start, const GtkCssLocation *start,
@@ -1133,3 +1292,319 @@ gtk_css_parser_consume_any (GtkCssParser *parser,
return result; return result;
} }
gboolean
gtk_css_parser_has_references (GtkCssParser *self)
{
GtkCssTokenizer *tokenizer = get_tokenizer (self);
gboolean ret = FALSE;
int inner_blocks = 0, i;
gtk_css_tokenizer_save (tokenizer);
do {
const GtkCssToken *token;
token = gtk_css_parser_get_token (self);
if (inner_blocks == 0)
{
if (gtk_css_token_is (token, GTK_CSS_TOKEN_EOF))
break;
if (gtk_css_token_is (token, GTK_CSS_TOKEN_CLOSE_PARENS) ||
gtk_css_token_is (token, GTK_CSS_TOKEN_CLOSE_SQUARE))
{
goto error;
}
}
if (gtk_css_token_is_preserved (token, NULL))
{
if (inner_blocks > 0 && gtk_css_token_is (token, GTK_CSS_TOKEN_EOF))
{
gtk_css_parser_end_block (self);
inner_blocks--;
}
else
{
gtk_css_parser_consume_token (self);
}
}
else
{
gboolean is_var = gtk_css_token_is_function (token, "var");
inner_blocks++;
gtk_css_parser_start_block (self);
if (!ret && is_var)
{
token = gtk_css_parser_get_token (self);
if (gtk_css_token_is (token, GTK_CSS_TOKEN_IDENT))
{
const char *var_name = gtk_css_token_get_string (token);
if (var_name[0] != '-' || var_name[1] != '-')
goto error;
gtk_css_parser_consume_token (self);
if (!gtk_css_parser_has_token (self, GTK_CSS_TOKEN_EOF) &&
!gtk_css_parser_has_token (self, GTK_CSS_TOKEN_COMMA))
{
goto error;
}
ret = TRUE;
}
}
}
}
while (!gtk_css_parser_has_token (self, GTK_CSS_TOKEN_SEMICOLON) &&
!gtk_css_parser_has_token (self, GTK_CSS_TOKEN_CLOSE_CURLY));
if (inner_blocks > 0)
goto error;
g_assert (tokenizer == get_tokenizer (self));
gtk_css_tokenizer_restore (tokenizer);
self->location = *gtk_css_tokenizer_get_location (tokenizer);
gtk_css_tokenizer_read_token (tokenizer, &self->token, NULL);
return ret;
error:
for (i = 0; i < inner_blocks; i++)
gtk_css_parser_end_block (self);
g_assert (tokenizer == get_tokenizer (self));
gtk_css_tokenizer_restore (tokenizer);
self->location = *gtk_css_tokenizer_get_location (tokenizer);
gtk_css_tokenizer_read_token (tokenizer, &self->token, NULL);
return FALSE;
}
static void
clear_ref (GtkCssVariableValueReference *ref)
{
g_free (ref->name);
if (ref->fallback)
gtk_css_variable_value_unref (ref->fallback);
}
#define GDK_ARRAY_NAME gtk_css_parser_references
#define GDK_ARRAY_TYPE_NAME GtkCssParserReferences
#define GDK_ARRAY_ELEMENT_TYPE GtkCssVariableValueReference
GtkCssVariableValue *
gtk_css_parser_parse_value_into_token_stream (GtkCssParser *self)
{
GBytes *bytes = gtk_css_tokenizer_get_bytes (get_tokenizer (self));
const GtkCssToken *token;
gsize offset;
gsize length = 0;
GtkCssParserReferences refs;
int inner_blocks = 0, i;
gboolean is_initial = FALSE;
for (token = gtk_css_parser_peek_token (self);
gtk_css_token_is (token, GTK_CSS_TOKEN_WHITESPACE);
token = gtk_css_parser_peek_token (self))
{
gtk_css_parser_consume_token (self);
}
gtk_css_parser_references_init (&refs);
offset = self->location.bytes;
do {
token = gtk_css_parser_get_token (self);
if (length == 0 && gtk_css_token_is_ident (token, "initial"))
is_initial = TRUE;
if (gtk_css_token_is (token, GTK_CSS_TOKEN_BAD_STRING) ||
gtk_css_token_is (token, GTK_CSS_TOKEN_BAD_URL))
{
gtk_css_parser_error_syntax (self, "Invalid property value");
goto error;
}
if (inner_blocks == 0)
{
if (gtk_css_token_is (token, GTK_CSS_TOKEN_EOF))
break;
if (gtk_css_token_is (token, GTK_CSS_TOKEN_CLOSE_PARENS) ||
gtk_css_token_is (token, GTK_CSS_TOKEN_CLOSE_SQUARE))
{
gtk_css_parser_error_syntax (self, "Invalid property value");
goto error;
}
}
if (gtk_css_token_is_preserved (token, NULL))
{
if (inner_blocks > 0 && gtk_css_token_is (token, GTK_CSS_TOKEN_EOF))
{
length++;
gtk_css_parser_end_block (self);
inner_blocks--;
}
else
{
length++;
gtk_css_parser_consume_token (self);
}
}
else
{
gboolean is_var = gtk_css_token_is_function (token, "var");
length++;
inner_blocks++;
gtk_css_parser_start_block (self);
if (is_var)
{
token = gtk_css_parser_get_token (self);
if (gtk_css_token_is (token, GTK_CSS_TOKEN_IDENT))
{
GtkCssVariableValueReference ref;
char *var_name = g_strdup (gtk_css_token_get_string (token));
if (var_name[0] != '-' || var_name[1] != '-')
{
gtk_css_parser_error_value (self, "Invalid variable name: %s", var_name);
g_free (var_name);
goto error;
}
length++;
gtk_css_parser_consume_token (self);
if (!gtk_css_parser_has_token (self, GTK_CSS_TOKEN_EOF) &&
!gtk_css_parser_has_token (self, GTK_CSS_TOKEN_COMMA))
{
gtk_css_parser_error_syntax (self, "Invalid property value");
g_free (var_name);
goto error;
}
ref.name = var_name;
if (gtk_css_parser_has_token (self, GTK_CSS_TOKEN_EOF))
{
ref.length = 3;
ref.fallback = NULL;
}
else
{
length++;
gtk_css_parser_consume_token (self);
ref.fallback = gtk_css_parser_parse_value_into_token_stream (self);
if (ref.fallback == NULL)
{
gtk_css_parser_error_value (self, "Invalid fallback for: %s", var_name);
g_free (var_name);
goto error;
}
ref.length = 4 + ref.fallback->length;
length += ref.fallback->length;
}
gtk_css_parser_references_append (&refs, &ref);
}
}
}
}
while (!gtk_css_parser_has_token (self, GTK_CSS_TOKEN_SEMICOLON) &&
!gtk_css_parser_has_token (self, GTK_CSS_TOKEN_CLOSE_CURLY));
if (inner_blocks > 0)
{
gtk_css_parser_error_syntax (self, "Invalid property value");
goto error;
}
if (is_initial && length == 1)
{
gtk_css_parser_references_clear (&refs);
return gtk_css_variable_value_new_initial (bytes,
offset,
self->location.bytes);
}
else
{
GtkCssVariableValueReference *out_refs;
gsize n_refs;
n_refs = gtk_css_parser_references_get_size (&refs);
out_refs = gtk_css_parser_references_steal (&refs);
return gtk_css_variable_value_new (bytes,
offset,
self->location.bytes,
length,
out_refs,
n_refs);
}
error:
for (i = 0; i < inner_blocks; i++)
gtk_css_parser_end_block (self);
gtk_css_parser_references_clear (&refs);
return NULL;
}
void
gtk_css_parser_get_expanding_variables (GtkCssParser *self,
GtkCssVariableValue ***variables,
char ***variable_names,
gsize *n_variables)
{
gsize len = gtk_css_tokenizers_get_size (&self->tokenizers);
GtkCssVariableValue **vars = NULL;
char **names = NULL;
gsize n;
if (variables)
vars = g_new0 (GtkCssVariableValue *, len + 1);
if (variable_names)
names = g_new0 (char *, len + 1);
n = 0;
for (gsize i = 0; i < gtk_css_tokenizers_get_size (&self->tokenizers); i++)
{
GtkCssTokenizerData *data = gtk_css_tokenizers_index (&self->tokenizers, i);
if (variables && data->variable)
vars[n] = gtk_css_variable_value_ref (data->variable);
if (variable_names)
names[n] = g_strdup (data->var_name);
n++;
}
if (variables)
*variables = vars;
if (variable_names)
*variable_names = names;
if (n_variables)
*n_variables = n;
}
+19
View File
@@ -22,6 +22,7 @@
#include "gtkcssenums.h" #include "gtkcssenums.h"
#include "gtkcsstokenizerprivate.h" #include "gtkcsstokenizerprivate.h"
#include "gtkcssvariablevalueprivate.h"
#include <gio/gio.h> #include <gio/gio.h>
@@ -58,10 +59,18 @@ GtkCssParser * gtk_css_parser_new_for_bytes (GBytes
GtkCssParserErrorFunc error_func, GtkCssParserErrorFunc error_func,
gpointer user_data, gpointer user_data,
GDestroyNotify user_destroy); GDestroyNotify user_destroy);
GtkCssParser * gtk_css_parser_new_for_token_stream (GtkCssVariableValue *value,
GFile *file,
GtkCssVariableValue **refs,
gsize n_refs,
GtkCssParserErrorFunc error_func,
gpointer user_data,
GDestroyNotify user_destroy);
GtkCssParser * gtk_css_parser_ref (GtkCssParser *self); GtkCssParser * gtk_css_parser_ref (GtkCssParser *self);
void gtk_css_parser_unref (GtkCssParser *self); void gtk_css_parser_unref (GtkCssParser *self);
GFile * gtk_css_parser_get_file (GtkCssParser *self) G_GNUC_PURE; GFile * gtk_css_parser_get_file (GtkCssParser *self) G_GNUC_PURE;
GBytes * gtk_css_parser_get_bytes (GtkCssParser *self) G_GNUC_PURE;
GFile * gtk_css_parser_resolve_url (GtkCssParser *self, GFile * gtk_css_parser_resolve_url (GtkCssParser *self,
const char *url); const char *url);
@@ -81,6 +90,7 @@ void gtk_css_parser_end_block (GtkCssParser
void gtk_css_parser_skip (GtkCssParser *self); void gtk_css_parser_skip (GtkCssParser *self);
void gtk_css_parser_skip_until (GtkCssParser *self, void gtk_css_parser_skip_until (GtkCssParser *self,
GtkCssTokenType token_type); GtkCssTokenType token_type);
void gtk_css_parser_skip_whitespace (GtkCssParser *self);
void gtk_css_parser_emit_error (GtkCssParser *self, void gtk_css_parser_emit_error (GtkCssParser *self,
const GtkCssLocation *start, const GtkCssLocation *start,
@@ -150,5 +160,14 @@ gsize gtk_css_parser_consume_any (GtkCssParser
gsize n_options, gsize n_options,
gpointer user_data); gpointer user_data);
gboolean gtk_css_parser_has_references (GtkCssParser *parser);
GtkCssVariableValue * gtk_css_parser_parse_value_into_token_stream (GtkCssParser *parser);
void gtk_css_parser_get_expanding_variables (GtkCssParser *parser,
GtkCssVariableValue ***variables,
char ***names,
gsize *n_variables);
G_END_DECLS G_END_DECLS
+22
View File
@@ -26,6 +26,7 @@ struct _GtkCssSection
int ref_count; int ref_count;
GtkCssSection *parent; GtkCssSection *parent;
GFile *file; GFile *file;
GBytes *bytes;
GtkCssLocation start_location; GtkCssLocation start_location;
GtkCssLocation end_location; /* end location if parser is %NULL */ GtkCssLocation end_location; /* end location if parser is %NULL */
}; };
@@ -48,6 +49,15 @@ GtkCssSection *
gtk_css_section_new (GFile *file, gtk_css_section_new (GFile *file,
const GtkCssLocation *start, const GtkCssLocation *start,
const GtkCssLocation *end) const GtkCssLocation *end)
{
return gtk_css_section_new_with_bytes (file, NULL,start, end);
}
GtkCssSection *
gtk_css_section_new_with_bytes (GFile *file,
GBytes *bytes,
const GtkCssLocation *start,
const GtkCssLocation *end)
{ {
GtkCssSection *result; GtkCssSection *result;
@@ -60,6 +70,8 @@ gtk_css_section_new (GFile *file,
result->ref_count = 1; result->ref_count = 1;
if (file) if (file)
result->file = g_object_ref (file); result->file = g_object_ref (file);
if (bytes)
result->bytes = g_bytes_ref (bytes);
result->start_location = *start; result->start_location = *start;
result->end_location = *end; result->end_location = *end;
@@ -104,6 +116,8 @@ gtk_css_section_unref (GtkCssSection *section)
gtk_css_section_unref (section->parent); gtk_css_section_unref (section->parent);
if (section->file) if (section->file)
g_object_unref (section->file); g_object_unref (section->file);
if (section->bytes)
g_bytes_unref (section->bytes);
g_free (section); g_free (section);
} }
@@ -151,6 +165,14 @@ gtk_css_section_get_file (const GtkCssSection *section)
return section->file; return section->file;
} }
GBytes *
gtk_css_section_get_bytes (const GtkCssSection *section)
{
g_return_val_if_fail (section != NULL, NULL);
return section->bytes;
}
/** /**
* gtk_css_section_get_start_location: * gtk_css_section_get_start_location:
* @section: the section * @section: the section
+7
View File
@@ -46,6 +46,11 @@ GDK_AVAILABLE_IN_ALL
GtkCssSection * gtk_css_section_new (GFile *file, GtkCssSection * gtk_css_section_new (GFile *file,
const GtkCssLocation *start, const GtkCssLocation *start,
const GtkCssLocation *end); const GtkCssLocation *end);
GDK_AVAILABLE_IN_4_16
GtkCssSection * gtk_css_section_new_with_bytes (GFile *file,
GBytes *bytes,
const GtkCssLocation *start,
const GtkCssLocation *end);
GDK_AVAILABLE_IN_ALL GDK_AVAILABLE_IN_ALL
GtkCssSection * gtk_css_section_ref (GtkCssSection *section); GtkCssSection * gtk_css_section_ref (GtkCssSection *section);
GDK_AVAILABLE_IN_ALL GDK_AVAILABLE_IN_ALL
@@ -61,6 +66,8 @@ GDK_AVAILABLE_IN_ALL
GtkCssSection * gtk_css_section_get_parent (const GtkCssSection *section); GtkCssSection * gtk_css_section_get_parent (const GtkCssSection *section);
GDK_AVAILABLE_IN_ALL GDK_AVAILABLE_IN_ALL
GFile * gtk_css_section_get_file (const GtkCssSection *section); GFile * gtk_css_section_get_file (const GtkCssSection *section);
GDK_AVAILABLE_IN_4_16
GBytes * gtk_css_section_get_bytes (const GtkCssSection *section);
GDK_AVAILABLE_IN_ALL GDK_AVAILABLE_IN_ALL
const GtkCssLocation * const GtkCssLocation *
gtk_css_section_get_start_location (const GtkCssSection *section); gtk_css_section_get_start_location (const GtkCssSection *section);
+39 -2
View File
@@ -36,6 +36,9 @@ struct _GtkCssTokenizer
const char *end; const char *end;
GtkCssLocation position; GtkCssLocation position;
GtkCssLocation saved_position;
const char *saved_data;
}; };
void void
@@ -568,6 +571,14 @@ gtk_css_token_init_dimension (GtkCssToken *token,
GtkCssTokenizer * GtkCssTokenizer *
gtk_css_tokenizer_new (GBytes *bytes) gtk_css_tokenizer_new (GBytes *bytes)
{
return gtk_css_tokenizer_new_for_range (bytes, 0, g_bytes_get_size (bytes));
}
GtkCssTokenizer *
gtk_css_tokenizer_new_for_range (GBytes *bytes,
gsize offset,
gsize length)
{ {
GtkCssTokenizer *tokenizer; GtkCssTokenizer *tokenizer;
@@ -576,8 +587,8 @@ gtk_css_tokenizer_new (GBytes *bytes)
tokenizer->bytes = g_bytes_ref (bytes); tokenizer->bytes = g_bytes_ref (bytes);
tokenizer->name_buffer = g_string_new (NULL); tokenizer->name_buffer = g_string_new (NULL);
tokenizer->data = g_bytes_get_data (bytes, NULL); tokenizer->data = g_bytes_get_region (bytes, 1, offset, length);
tokenizer->end = tokenizer->data + g_bytes_get_size (bytes); tokenizer->end = tokenizer->data + length;
gtk_css_location_init (&tokenizer->position); gtk_css_location_init (&tokenizer->position);
@@ -604,6 +615,12 @@ gtk_css_tokenizer_unref (GtkCssTokenizer *tokenizer)
g_free (tokenizer); g_free (tokenizer);
} }
GBytes *
gtk_css_tokenizer_get_bytes (GtkCssTokenizer *tokenizer)
{
return tokenizer->bytes;
}
const GtkCssLocation * const GtkCssLocation *
gtk_css_tokenizer_get_location (GtkCssTokenizer *tokenizer) gtk_css_tokenizer_get_location (GtkCssTokenizer *tokenizer)
{ {
@@ -1484,3 +1501,23 @@ gtk_css_tokenizer_read_token (GtkCssTokenizer *tokenizer,
} }
} }
void
gtk_css_tokenizer_save (GtkCssTokenizer *tokenizer)
{
g_assert (!tokenizer->saved_data);
tokenizer->saved_position = tokenizer->position;
tokenizer->saved_data = tokenizer->data;
}
void
gtk_css_tokenizer_restore (GtkCssTokenizer *tokenizer)
{
g_assert (tokenizer->saved_data);
tokenizer->position = tokenizer->saved_position;
tokenizer->data = tokenizer->saved_data;
gtk_css_location_init (&tokenizer->saved_position);
tokenizer->saved_data = NULL;
}
+7
View File
@@ -138,15 +138,22 @@ void gtk_css_token_print (const GtkCssTok
char * gtk_css_token_to_string (const GtkCssToken *token); char * gtk_css_token_to_string (const GtkCssToken *token);
GtkCssTokenizer * gtk_css_tokenizer_new (GBytes *bytes); GtkCssTokenizer * gtk_css_tokenizer_new (GBytes *bytes);
GtkCssTokenizer * gtk_css_tokenizer_new_for_range (GBytes *bytes,
gsize offset,
gsize length);
GtkCssTokenizer * gtk_css_tokenizer_ref (GtkCssTokenizer *tokenizer); GtkCssTokenizer * gtk_css_tokenizer_ref (GtkCssTokenizer *tokenizer);
void gtk_css_tokenizer_unref (GtkCssTokenizer *tokenizer); void gtk_css_tokenizer_unref (GtkCssTokenizer *tokenizer);
GBytes * gtk_css_tokenizer_get_bytes (GtkCssTokenizer *tokenizer);
const GtkCssLocation * gtk_css_tokenizer_get_location (GtkCssTokenizer *tokenizer) G_GNUC_CONST; const GtkCssLocation * gtk_css_tokenizer_get_location (GtkCssTokenizer *tokenizer) G_GNUC_CONST;
gboolean gtk_css_tokenizer_read_token (GtkCssTokenizer *tokenizer, gboolean gtk_css_tokenizer_read_token (GtkCssTokenizer *tokenizer,
GtkCssToken *token, GtkCssToken *token,
GError **error); GError **error);
void gtk_css_tokenizer_save (GtkCssTokenizer *tokenizer);
void gtk_css_tokenizer_restore (GtkCssTokenizer *tokenizer);
G_END_DECLS G_END_DECLS
+158
View File
@@ -0,0 +1,158 @@
/*
* Copyright (C) 2023 GNOME Foundation Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
* Authors: Alice Mikhaylenko <alicem@gnome.org>
*/
#include "gtkcssvariablevalueprivate.h"
GtkCssVariableValue *
gtk_css_variable_value_new (GBytes *bytes,
gsize offset,
gsize end_offset,
gsize length,
GtkCssVariableValueReference *references,
gsize n_references)
{
GtkCssVariableValue *self = g_new0 (GtkCssVariableValue, 1);
self->ref_count = 1;
self->bytes = g_bytes_ref (bytes);
self->offset = offset;
self->end_offset = end_offset;
self->length = length;
self->references = references;
self->n_references = n_references;
return self;
}
GtkCssVariableValue *
gtk_css_variable_value_new_initial (GBytes *bytes,
gsize offset,
gsize end_offset)
{
GtkCssVariableValue *self = gtk_css_variable_value_new (bytes, offset, end_offset, 1, NULL, 0);
self->is_invalid = TRUE;
return self;
}
GtkCssVariableValue *
gtk_css_variable_value_ref (GtkCssVariableValue *self)
{
self->ref_count++;
return self;
}
void
gtk_css_variable_value_unref (GtkCssVariableValue *self)
{
gsize i;
self->ref_count--;
if (self->ref_count > 0)
return;
g_bytes_unref (self->bytes);
for (i = 0; i < self->n_references; i++)
{
GtkCssVariableValueReference *ref = &self->references[i];
g_free (ref->name);
if (ref->fallback)
gtk_css_variable_value_unref (ref->fallback);
}
if (self->section)
gtk_css_section_unref (self->section);
g_free (self->references);
g_free (self);
}
void
gtk_css_variable_value_print (GtkCssVariableValue *self,
GString *string)
{
gsize len = self->end_offset - self->offset;
gconstpointer data = g_bytes_get_region (self->bytes, 1, self->offset, len);
g_assert (data != NULL);
g_string_append_len (string, (const char *) data, len);
}
char *
gtk_css_variable_value_to_string (GtkCssVariableValue *self)
{
GString *string = g_string_new (NULL);
gtk_css_variable_value_print (self, string);
return g_string_free (string, FALSE);
}
gboolean
gtk_css_variable_value_equal (const GtkCssVariableValue *value1,
const GtkCssVariableValue *value2)
{
if (value1 == value2)
return TRUE;
if (value1 == NULL || value2 == NULL)
return FALSE;
if (value1->bytes != value2->bytes)
return FALSE;
if (value1->offset != value2->offset)
return FALSE;
if (value1->end_offset != value2->end_offset)
return FALSE;
return TRUE;
}
GtkCssVariableValue *
gtk_css_variable_value_transition (GtkCssVariableValue *start,
GtkCssVariableValue *end,
double progress)
{
GtkCssVariableValue *ret = progress < 0.5 ? start : end;
if (ret == NULL)
return NULL;
return gtk_css_variable_value_ref (ret);
}
void
gtk_css_variable_value_set_section (GtkCssVariableValue *self,
GtkCssSection *section)
{
self->section = gtk_css_section_ref (section);
}
void
gtk_css_variable_value_taint (GtkCssVariableValue *self)
{
self->is_animation_tainted = TRUE;
}
+77
View File
@@ -0,0 +1,77 @@
/*
* Copyright (C) 2023 GNOME Foundation Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
* Authors: Alice Mikhaylenko <alicem@gnome.org>
*/
#pragma once
#include "gtkcss.h"
#include "gtkcsstokenizerprivate.h"
G_BEGIN_DECLS
typedef struct _GtkCssVariableValueReference GtkCssVariableValueReference;
typedef struct _GtkCssVariableValue GtkCssVariableValue;
struct _GtkCssVariableValueReference
{
char *name;
gsize length;
GtkCssVariableValue *fallback;
};
struct _GtkCssVariableValue
{
int ref_count;
GBytes *bytes;
gsize offset;
gsize end_offset;
gsize length;
GtkCssVariableValueReference *references;
gsize n_references;
GtkCssSection *section;
gboolean is_invalid;
gboolean is_animation_tainted;
};
GtkCssVariableValue *gtk_css_variable_value_new (GBytes *bytes,
gsize offset,
gsize end_offset,
gsize length,
GtkCssVariableValueReference *references,
gsize n_references);
GtkCssVariableValue *gtk_css_variable_value_new_initial (GBytes *bytes,
gsize offset,
gsize end_offset);
GtkCssVariableValue *gtk_css_variable_value_ref (GtkCssVariableValue *self);
void gtk_css_variable_value_unref (GtkCssVariableValue *self);
void gtk_css_variable_value_print (GtkCssVariableValue *self,
GString *string);
char * gtk_css_variable_value_to_string (GtkCssVariableValue *self);
gboolean gtk_css_variable_value_equal (const GtkCssVariableValue *value1,
const GtkCssVariableValue *value2) G_GNUC_PURE;
GtkCssVariableValue *gtk_css_variable_value_transition (GtkCssVariableValue *start,
GtkCssVariableValue *end,
double progress);
void gtk_css_variable_value_set_section (GtkCssVariableValue *self,
GtkCssSection *section);
void gtk_css_variable_value_taint (GtkCssVariableValue *self);
G_END_DECLS
+2 -1
View File
@@ -6,8 +6,9 @@ gtk_css_public_sources = files([
gtk_css_private_sources = files([ gtk_css_private_sources = files([
'gtkcssdataurl.c', 'gtkcssdataurl.c',
'gtkcssparser.c', 'gtkcssparser.c',
'gtkcsstokenizer.c',
'gtkcssserializer.c', 'gtkcssserializer.c',
'gtkcsstokenizer.c',
'gtkcssvariablevalue.c',
]) ])
gtk_css_public_headers = files([ gtk_css_public_headers = files([
+3 -1
View File
@@ -2188,7 +2188,8 @@ gtk_column_view_set_header_factory (GtkColumnView *self,
/** /**
* gtk_column_view_scroll_to: * gtk_column_view_scroll_to:
* @self: The columnview to scroll in * @self: The columnview to scroll in
* @pos: position of the item * @pos: position of the item. Must be less than the number of
* items in the view.
* @column: (nullable) (transfer none): The column to scroll to * @column: (nullable) (transfer none): The column to scroll to
* or %NULL to not scroll columns. * or %NULL to not scroll columns.
* @flags: actions to perform * @flags: actions to perform
@@ -2211,6 +2212,7 @@ gtk_column_view_scroll_to (GtkColumnView *self,
GtkScrollInfo *scroll) GtkScrollInfo *scroll)
{ {
g_return_if_fail (GTK_IS_COLUMN_VIEW (self)); g_return_if_fail (GTK_IS_COLUMN_VIEW (self));
g_return_if_fail (pos < gtk_list_base_get_n_items (GTK_LIST_BASE (self)));
g_return_if_fail (column == NULL || GTK_IS_COLUMN_VIEW_COLUMN (column)); g_return_if_fail (column == NULL || GTK_IS_COLUMN_VIEW_COLUMN (column));
if (column) if (column)
{ {
+148 -6
View File
@@ -33,13 +33,57 @@
#include "gtkcssstringvalueprivate.h" #include "gtkcssstringvalueprivate.h"
#include "gtkcssstylepropertyprivate.h" #include "gtkcssstylepropertyprivate.h"
#include "gtkcsstransitionprivate.h" #include "gtkcsstransitionprivate.h"
#include "gtkcssvaluesprivate.h"
#include "gtkprivate.h" #include "gtkprivate.h"
#include "gtkstyleanimationprivate.h" #include "gtkstyleanimationprivate.h"
#include "gtkstylepropertyprivate.h" #include "gtkstylepropertyprivate.h"
#include "gtkstyleproviderprivate.h" #include "gtkstyleproviderprivate.h"
#include "gtkcsscustompropertypoolprivate.h"
G_DEFINE_TYPE (GtkCssAnimatedStyle, gtk_css_animated_style, GTK_TYPE_CSS_STYLE) G_DEFINE_TYPE (GtkCssAnimatedStyle, gtk_css_animated_style, GTK_TYPE_CSS_STYLE)
#define DEFINE_VALUES(ENUM, TYPE, NAME) \
static inline void \
gtk_css_ ## NAME ## _values_recompute (GtkCssAnimatedStyle *animated, \
GtkCssComputeContext *context) \
{ \
GtkCssStyle *style = (GtkCssStyle *)animated; \
GtkCssValue **values = (GtkCssValue **)((guint8*)(animated->style->NAME) + sizeof (GtkCssValues)); \
int i; \
\
for (i = 0; i < G_N_ELEMENTS (NAME ## _props); i++) \
{ \
guint id = NAME ## _props[i]; \
GtkCssValue *original, *computed; \
\
if (values[i] == NULL) \
continue; \
\
original = gtk_css_style_get_original_value (style, id); \
if (original == NULL) \
continue; \
\
computed = _gtk_css_value_compute (original, \
id, \
context); \
if (computed == NULL) \
continue; \
\
gtk_css_animated_style_set_animated_value (animated, id, computed); \
} \
}
DEFINE_VALUES (CORE, Core, core)
DEFINE_VALUES (BACKGROUND, Background, background)
DEFINE_VALUES (BORDER, Border, border)
DEFINE_VALUES (ICON, Icon, icon)
DEFINE_VALUES (OUTLINE, Outline, outline)
DEFINE_VALUES (FONT, Font, font)
DEFINE_VALUES (FONT_VARIANT, FontVariant, font_variant)
DEFINE_VALUES (ANIMATION, Animation, animation)
DEFINE_VALUES (TRANSITION, Transition, transition)
DEFINE_VALUES (SIZE, Size, size)
DEFINE_VALUES (OTHER, Other, other)
static GtkCssSection * static GtkCssSection *
gtk_css_animated_style_get_section (GtkCssStyle *style, gtk_css_animated_style_get_section (GtkCssStyle *style,
@@ -74,6 +118,15 @@ gtk_css_animated_style_get_static_style (GtkCssStyle *style)
return (GtkCssStaticStyle *)animated->style; return (GtkCssStaticStyle *)animated->style;
} }
static GtkCssValue *
gtk_css_animated_style_get_original_value (GtkCssStyle *style,
guint id)
{
GtkCssAnimatedStyle *animated = GTK_CSS_ANIMATED_STYLE (style);
return gtk_css_style_get_original_value (animated->style, id);
}
static void static void
gtk_css_animated_style_dispose (GObject *object) gtk_css_animated_style_dispose (GObject *object)
{ {
@@ -96,6 +149,9 @@ gtk_css_animated_style_finalize (GObject *object)
GtkCssAnimatedStyle *style = GTK_CSS_ANIMATED_STYLE (object); GtkCssAnimatedStyle *style = GTK_CSS_ANIMATED_STYLE (object);
g_object_unref (style->style); g_object_unref (style->style);
if (style->parent_style)
g_object_unref (style->parent_style);
g_object_unref (style->provider);
G_OBJECT_CLASS (gtk_css_animated_style_parent_class)->finalize (object); G_OBJECT_CLASS (gtk_css_animated_style_parent_class)->finalize (object);
} }
@@ -112,6 +168,7 @@ gtk_css_animated_style_class_init (GtkCssAnimatedStyleClass *klass)
style_class->get_section = gtk_css_animated_style_get_section; style_class->get_section = gtk_css_animated_style_get_section;
style_class->is_static = gtk_css_animated_style_is_static; style_class->is_static = gtk_css_animated_style_is_static;
style_class->get_static_style = gtk_css_animated_style_get_static_style; style_class->get_static_style = gtk_css_animated_style_get_static_style;
style_class->get_original_value = gtk_css_animated_style_get_original_value;
} }
static void static void
@@ -546,6 +603,57 @@ gtk_css_animated_style_get_intrinsic_value (GtkCssAnimatedStyle *style,
return gtk_css_style_get_value (style->style, id); return gtk_css_style_get_value (style->style, id);
} }
void
gtk_css_animated_style_set_animated_custom_value (GtkCssAnimatedStyle *animated,
int id,
GtkCssVariableValue *value)
{
GtkCssStyle *style = (GtkCssStyle *)animated;
GtkCssComputeContext context = { NULL, };
gtk_internal_return_if_fail (GTK_IS_CSS_ANIMATED_STYLE (style));
gtk_internal_return_if_fail (value != NULL);
if (style->variables == NULL)
{
style->variables = gtk_css_variable_set_new ();
if (animated->parent_style)
gtk_css_variable_set_set_parent (style->variables,
animated->parent_style->variables);
}
else if (style->variables == animated->style->variables)
{
gtk_css_variable_set_unref (style->variables);
style->variables = gtk_css_variable_set_copy (animated->style->variables);
}
gtk_css_variable_set_add (style->variables, id, value);
context.provider = animated->provider;
context.style = animated->style;
context.parent_style = animated->parent_style;
context.provider = animated->provider;
gtk_css_core_values_recompute (animated, &context);
gtk_css_background_values_recompute (animated, &context);
gtk_css_border_values_recompute (animated, &context);
gtk_css_icon_values_recompute (animated, &context);
gtk_css_outline_values_recompute (animated, &context);
gtk_css_font_values_recompute (animated, &context);
gtk_css_font_variant_values_recompute (animated, &context);
gtk_css_animation_values_recompute (animated, &context);
gtk_css_transition_values_recompute (animated, &context);
gtk_css_size_values_recompute (animated, &context);
gtk_css_other_values_recompute (animated, &context);
}
GtkCssVariableValue *
gtk_css_animated_style_get_intrinsic_custom_value (GtkCssAnimatedStyle *style,
int id)
{
return gtk_css_style_get_custom_property (style->style, id);
}
static GPtrArray * static GPtrArray *
gtk_css_animated_style_create_dynamic (GPtrArray *animations, gtk_css_animated_style_create_dynamic (GPtrArray *animations,
GtkCssStyle *style, GtkCssStyle *style,
@@ -770,7 +878,6 @@ gtk_css_animated_style_find_animation (GtkStyleAnimation **animations,
static GPtrArray * static GPtrArray *
gtk_css_animated_style_create_css_animations (GPtrArray *animations, gtk_css_animated_style_create_css_animations (GPtrArray *animations,
GtkCssStyle *base_style, GtkCssStyle *base_style,
GtkCssStyle *parent_style,
gint64 timestamp, gint64 timestamp,
GtkStyleProvider *provider, GtkStyleProvider *provider,
GtkCssStyle *source) GtkCssStyle *source)
@@ -832,8 +939,6 @@ gtk_css_animated_style_create_css_animations (GPtrArray *animations,
if (keyframes == NULL) if (keyframes == NULL)
continue; continue;
keyframes = _gtk_css_keyframes_compute (keyframes, provider, base_style, parent_style);
animation = _gtk_css_animation_new (name, animation = _gtk_css_animation_new (name,
keyframes, keyframes,
timestamp, timestamp,
@@ -844,7 +949,6 @@ gtk_css_animated_style_create_css_animations (GPtrArray *animations,
_gtk_css_play_state_value_get (_gtk_css_array_value_get_nth (play_states, i)), _gtk_css_play_state_value_get (_gtk_css_array_value_get_nth (play_states, i)),
_gtk_css_fill_mode_value_get (_gtk_css_array_value_get_nth (fill_modes, i)), _gtk_css_fill_mode_value_get (_gtk_css_array_value_get_nth (fill_modes, i)),
_gtk_css_number_value_get (_gtk_css_array_value_get_nth (iteration_counts, i), 100)); _gtk_css_number_value_get (_gtk_css_array_value_get_nth (iteration_counts, i), 100));
_gtk_css_keyframes_unref (keyframes);
} }
if (!animations) if (!animations)
@@ -893,7 +997,7 @@ gtk_css_animated_style_new (GtkCssStyle *base_style,
if (previous_style != NULL) if (previous_style != NULL)
animations = gtk_css_animated_style_create_css_transitions (animations, base_style, timestamp, previous_style); animations = gtk_css_animated_style_create_css_transitions (animations, base_style, timestamp, previous_style);
animations = gtk_css_animated_style_create_css_animations (animations, base_style, parent_style, timestamp, provider, previous_style); animations = gtk_css_animated_style_create_css_animations (animations, base_style, timestamp, provider, previous_style);
animations = gtk_css_animated_style_create_dynamic (animations, base_style, timestamp); animations = gtk_css_animated_style_create_dynamic (animations, base_style, timestamp);
if (animations == NULL) if (animations == NULL)
@@ -902,6 +1006,9 @@ gtk_css_animated_style_new (GtkCssStyle *base_style,
result = g_object_new (GTK_TYPE_CSS_ANIMATED_STYLE, NULL); result = g_object_new (GTK_TYPE_CSS_ANIMATED_STYLE, NULL);
result->style = g_object_ref (base_style); result->style = g_object_ref (base_style);
if (parent_style)
result->parent_style = g_object_ref (parent_style);
result->provider = g_object_ref (provider);
result->current_time = timestamp; result->current_time = timestamp;
result->n_animations = animations->len; result->n_animations = animations->len;
result->animations = g_ptr_array_free (animations, FALSE); result->animations = g_ptr_array_free (animations, FALSE);
@@ -918,6 +1025,8 @@ gtk_css_animated_style_new (GtkCssStyle *base_style,
style->transition = (GtkCssTransitionValues *)gtk_css_values_ref ((GtkCssValues *)base_style->transition); style->transition = (GtkCssTransitionValues *)gtk_css_values_ref ((GtkCssValues *)base_style->transition);
style->size = (GtkCssSizeValues *)gtk_css_values_ref ((GtkCssValues *)base_style->size); style->size = (GtkCssSizeValues *)gtk_css_values_ref ((GtkCssValues *)base_style->size);
style->other = (GtkCssOtherValues *)gtk_css_values_ref ((GtkCssValues *)base_style->other); style->other = (GtkCssOtherValues *)gtk_css_values_ref ((GtkCssValues *)base_style->other);
if (base_style->variables)
style->variables = gtk_css_variable_set_ref (base_style->variables);
gtk_css_animated_style_apply_animations (result); gtk_css_animated_style_apply_animations (result);
@@ -927,7 +1036,9 @@ gtk_css_animated_style_new (GtkCssStyle *base_style,
GtkCssStyle * GtkCssStyle *
gtk_css_animated_style_new_advance (GtkCssAnimatedStyle *source, gtk_css_animated_style_new_advance (GtkCssAnimatedStyle *source,
GtkCssStyle *base_style, GtkCssStyle *base_style,
gint64 timestamp) GtkCssStyle *parent_style,
gint64 timestamp,
GtkStyleProvider *provider)
{ {
GtkCssAnimatedStyle *result; GtkCssAnimatedStyle *result;
GtkCssStyle *style; GtkCssStyle *style;
@@ -936,6 +1047,8 @@ gtk_css_animated_style_new_advance (GtkCssAnimatedStyle *source,
gtk_internal_return_val_if_fail (GTK_IS_CSS_ANIMATED_STYLE (source), NULL); gtk_internal_return_val_if_fail (GTK_IS_CSS_ANIMATED_STYLE (source), NULL);
gtk_internal_return_val_if_fail (GTK_IS_CSS_STYLE (base_style), NULL); gtk_internal_return_val_if_fail (GTK_IS_CSS_STYLE (base_style), NULL);
gtk_internal_return_val_if_fail (parent_style == NULL || GTK_IS_CSS_STYLE (parent_style), NULL);
gtk_internal_return_val_if_fail (GTK_IS_STYLE_PROVIDER (provider), NULL);
if (timestamp == 0) if (timestamp == 0)
return g_object_ref (source->style); return g_object_ref (source->style);
@@ -966,6 +1079,9 @@ gtk_css_animated_style_new_advance (GtkCssAnimatedStyle *source,
result = g_object_new (GTK_TYPE_CSS_ANIMATED_STYLE, NULL); result = g_object_new (GTK_TYPE_CSS_ANIMATED_STYLE, NULL);
result->style = g_object_ref (base_style); result->style = g_object_ref (base_style);
if (parent_style)
result->parent_style = g_object_ref (parent_style);
result->provider = g_object_ref (provider);
result->current_time = timestamp; result->current_time = timestamp;
result->n_animations = animations->len; result->n_animations = animations->len;
result->animations = g_ptr_array_free (animations, FALSE); result->animations = g_ptr_array_free (animations, FALSE);
@@ -982,8 +1098,34 @@ gtk_css_animated_style_new_advance (GtkCssAnimatedStyle *source,
style->transition = (GtkCssTransitionValues *)gtk_css_values_ref ((GtkCssValues *)base_style->transition); style->transition = (GtkCssTransitionValues *)gtk_css_values_ref ((GtkCssValues *)base_style->transition);
style->size = (GtkCssSizeValues *)gtk_css_values_ref ((GtkCssValues *)base_style->size); style->size = (GtkCssSizeValues *)gtk_css_values_ref ((GtkCssValues *)base_style->size);
style->other = (GtkCssOtherValues *)gtk_css_values_ref ((GtkCssValues *)base_style->other); style->other = (GtkCssOtherValues *)gtk_css_values_ref ((GtkCssValues *)base_style->other);
if (base_style->variables)
style->variables = gtk_css_variable_set_ref (base_style->variables);
gtk_css_animated_style_apply_animations (result); gtk_css_animated_style_apply_animations (result);
return GTK_CSS_STYLE (result); return GTK_CSS_STYLE (result);
} }
GtkCssStyle *
gtk_css_animated_style_get_base_style (GtkCssAnimatedStyle *style)
{
gtk_internal_return_val_if_fail (GTK_IS_CSS_ANIMATED_STYLE (style), NULL);
return style->style;
}
GtkCssStyle *
gtk_css_animated_style_get_parent_style (GtkCssAnimatedStyle *style)
{
gtk_internal_return_val_if_fail (GTK_IS_CSS_ANIMATED_STYLE (style), NULL);
return style->parent_style;
}
GtkStyleProvider *
gtk_css_animated_style_get_provider (GtkCssAnimatedStyle *style)
{
gtk_internal_return_val_if_fail (GTK_IS_CSS_ANIMATED_STYLE (style), NULL);
return style->provider;
}
+16 -3
View File
@@ -38,6 +38,8 @@ struct _GtkCssAnimatedStyle
GtkCssStyle parent; GtkCssStyle parent;
GtkCssStyle *style; /* the style if we weren't animating */ GtkCssStyle *style; /* the style if we weren't animating */
GtkCssStyle *parent_style;
GtkStyleProvider *provider;
gint64 current_time; /* the current time in our world */ gint64 current_time; /* the current time in our world */
gpointer *animations; /* GtkStyleAnimation**, least important one first */ gpointer *animations; /* GtkStyleAnimation**, least important one first */
@@ -57,15 +59,26 @@ GtkCssStyle * gtk_css_animated_style_new (GtkCssStyle
GtkStyleProvider *provider, GtkStyleProvider *provider,
GtkCssStyle *previous_style); GtkCssStyle *previous_style);
GtkCssStyle * gtk_css_animated_style_new_advance (GtkCssAnimatedStyle *source, GtkCssStyle * gtk_css_animated_style_new_advance (GtkCssAnimatedStyle *source,
GtkCssStyle *base, GtkCssStyle *base_style,
gint64 timestamp); GtkCssStyle *parent_style,
gint64 timestamp,
GtkStyleProvider *provider);
void gtk_css_animated_style_set_animated_value(GtkCssAnimatedStyle *style, void gtk_css_animated_style_set_animated_value(GtkCssAnimatedStyle *style,
guint id, guint id,
GtkCssValue *value); GtkCssValue *value);
GtkCssValue * gtk_css_animated_style_get_intrinsic_value (GtkCssAnimatedStyle *style, GtkCssValue * gtk_css_animated_style_get_intrinsic_value (GtkCssAnimatedStyle *style,
guint id); guint id);
void gtk_css_animated_style_set_animated_custom_value (GtkCssAnimatedStyle *animated,
int id,
GtkCssVariableValue *value);
GtkCssVariableValue * gtk_css_animated_style_get_intrinsic_custom_value (GtkCssAnimatedStyle *style,
int id);
GtkCssStyle * gtk_css_animated_style_get_base_style (GtkCssAnimatedStyle *style);
GtkCssStyle * gtk_css_animated_style_get_parent_style (GtkCssAnimatedStyle *style);
GtkStyleProvider * gtk_css_animated_style_get_provider (GtkCssAnimatedStyle *style);
G_END_DECLS G_END_DECLS
+36 -3
View File
@@ -90,6 +90,9 @@ gtk_css_animation_apply_values (GtkStyleAnimation *style_animation,
GtkCssAnimatedStyle *style) GtkCssAnimatedStyle *style)
{ {
GtkCssAnimation *animation = (GtkCssAnimation *)style_animation; GtkCssAnimation *animation = (GtkCssAnimation *)style_animation;
GtkCssStyle *base_style, *parent_style;
GtkStyleProvider *provider;
GtkCssKeyframes *resolved_keyframes;
double progress; double progress;
guint i; guint i;
@@ -99,19 +102,49 @@ gtk_css_animation_apply_values (GtkStyleAnimation *style_animation,
progress = gtk_css_animation_get_progress (animation); progress = gtk_css_animation_get_progress (animation);
progress = _gtk_css_ease_value_transform (animation->ease, progress); progress = _gtk_css_ease_value_transform (animation->ease, progress);
for (i = 0; i < _gtk_css_keyframes_get_n_properties (animation->keyframes); i++) base_style = gtk_css_animated_style_get_base_style (style);
parent_style = gtk_css_animated_style_get_parent_style (style);
provider = gtk_css_animated_style_get_provider (style);
resolved_keyframes = _gtk_css_keyframes_compute (animation->keyframes,
provider,
base_style,
parent_style);
for (i = 0; i < _gtk_css_keyframes_get_n_variables (resolved_keyframes); i++)
{
GtkCssVariableValue *value;
int variable_id;
variable_id = _gtk_css_keyframes_get_variable_id (resolved_keyframes, i);
value = _gtk_css_keyframes_get_variable (resolved_keyframes,
i,
progress,
gtk_css_animated_style_get_intrinsic_custom_value (style, variable_id));
if (!value)
continue;
gtk_css_animated_style_set_animated_custom_value (style, variable_id, value);
gtk_css_variable_value_unref (value);
}
for (i = 0; i < _gtk_css_keyframes_get_n_properties (resolved_keyframes); i++)
{ {
GtkCssValue *value; GtkCssValue *value;
guint property_id; guint property_id;
property_id = _gtk_css_keyframes_get_property_id (animation->keyframes, i); property_id = _gtk_css_keyframes_get_property_id (resolved_keyframes, i);
value = _gtk_css_keyframes_get_value (animation->keyframes, value = _gtk_css_keyframes_get_value (resolved_keyframes,
i, i,
progress, progress,
gtk_css_animated_style_get_intrinsic_value (style, property_id)); gtk_css_animated_style_get_intrinsic_value (style, property_id));
gtk_css_animated_style_set_animated_value (style, property_id, value); gtk_css_animated_style_set_animated_value (style, property_id, value);
} }
_gtk_css_keyframes_unref (resolved_keyframes);
} }
static gboolean static gboolean
+12 -10
View File
@@ -41,11 +41,9 @@ gtk_css_value_array_free (GtkCssValue *value)
} }
static GtkCssValue * static GtkCssValue *
gtk_css_value_array_compute (GtkCssValue *value, gtk_css_value_array_compute (GtkCssValue *value,
guint property_id, guint property_id,
GtkStyleProvider *provider, GtkCssComputeContext *context)
GtkCssStyle *style,
GtkCssStyle *parent_style)
{ {
GtkCssValue *result; GtkCssValue *result;
GtkCssValue *i_value; GtkCssValue *i_value;
@@ -54,7 +52,7 @@ gtk_css_value_array_compute (GtkCssValue *value,
result = NULL; result = NULL;
for (i = 0; i < value->n_values; i++) for (i = 0; i < value->n_values; i++)
{ {
i_value = _gtk_css_value_compute (value->values[i], property_id, provider, style, parent_style); i_value = _gtk_css_value_compute (value->values[i], property_id, context);
if (result == NULL && if (result == NULL &&
i_value != value->values[i]) i_value != value->values[i])
@@ -402,10 +400,13 @@ _gtk_css_array_value_new_from_array (GtkCssValue **values,
for (i = 0; i < n_values; i ++) for (i = 0; i < n_values; i ++)
{ {
if (!gtk_css_value_is_computed (values[i])) if (!gtk_css_value_is_computed (values[i]))
{ result->is_computed = FALSE;
result->is_computed = FALSE;
break; if (gtk_css_value_contains_variables (values[i]))
} result->contains_variables = TRUE;
if (!result->is_computed && result->contains_variables)
break;
} }
return result; return result;
@@ -467,3 +468,4 @@ _gtk_css_array_value_get_n_values (const GtkCssValue *value)
return value->n_values; return value->n_values;
} }
+8 -10
View File
@@ -41,11 +41,9 @@ gtk_css_value_bg_size_free (GtkCssValue *value)
} }
static GtkCssValue * static GtkCssValue *
gtk_css_value_bg_size_compute (GtkCssValue *value, gtk_css_value_bg_size_compute (GtkCssValue *value,
guint property_id, guint property_id,
GtkStyleProvider *provider, GtkCssComputeContext *context)
GtkCssStyle *style,
GtkCssStyle *parent_style)
{ {
GtkCssValue *x, *y; GtkCssValue *x, *y;
@@ -55,10 +53,10 @@ gtk_css_value_bg_size_compute (GtkCssValue *value,
x = y = NULL; x = y = NULL;
if (value->x) if (value->x)
x = _gtk_css_value_compute (value->x, property_id, provider, style, parent_style); x = _gtk_css_value_compute (value->x, property_id, context);
if (value->y) if (value->y)
y = _gtk_css_value_compute (value->y, property_id, provider, style, parent_style); y = _gtk_css_value_compute (value->y, property_id, context);
if (x == value->x && y == value->y) if (x == value->x && y == value->y)
{ {
@@ -163,9 +161,9 @@ static const GtkCssValueClass GTK_CSS_VALUE_BG_SIZE = {
gtk_css_value_bg_size_print gtk_css_value_bg_size_print
}; };
static GtkCssValue auto_singleton = { &GTK_CSS_VALUE_BG_SIZE, 1, TRUE, FALSE, FALSE, NULL, NULL }; static GtkCssValue auto_singleton = { &GTK_CSS_VALUE_BG_SIZE, 1, TRUE, FALSE, FALSE, FALSE, NULL, NULL };
static GtkCssValue cover_singleton = { &GTK_CSS_VALUE_BG_SIZE, 1, TRUE, TRUE, FALSE, NULL, NULL }; static GtkCssValue cover_singleton = { &GTK_CSS_VALUE_BG_SIZE, 1, TRUE, FALSE, TRUE, FALSE, NULL, NULL };
static GtkCssValue contain_singleton = { &GTK_CSS_VALUE_BG_SIZE, 1, TRUE, FALSE, TRUE, NULL, NULL }; static GtkCssValue contain_singleton = { &GTK_CSS_VALUE_BG_SIZE, 1, TRUE, FALSE, FALSE, TRUE, NULL, NULL };
GtkCssValue * GtkCssValue *
_gtk_css_bg_size_value_new (GtkCssValue *x, _gtk_css_bg_size_value_new (GtkCssValue *x,
+5 -6
View File
@@ -42,11 +42,9 @@ gtk_css_value_border_free (GtkCssValue *value)
} }
static GtkCssValue * static GtkCssValue *
gtk_css_value_border_compute (GtkCssValue *value, gtk_css_value_border_compute (GtkCssValue *value,
guint property_id, guint property_id,
GtkStyleProvider *provider, GtkCssComputeContext *context)
GtkCssStyle *style,
GtkCssStyle *parent_style)
{ {
GtkCssValue *values[4]; GtkCssValue *values[4];
GtkCssValue *computed; GtkCssValue *computed;
@@ -57,7 +55,7 @@ gtk_css_value_border_compute (GtkCssValue *value,
{ {
if (value->values[i]) if (value->values[i])
{ {
values[i] = _gtk_css_value_compute (value->values[i], property_id, provider, style, parent_style); values[i] = _gtk_css_value_compute (value->values[i], property_id, context);
changed |= (values[i] != value->values[i]); changed |= (values[i] != value->values[i]);
} }
else else
@@ -260,3 +258,4 @@ _gtk_css_border_value_get_left (const GtkCssValue *value)
return value->values[GTK_CSS_LEFT]; return value->values[GTK_CSS_LEFT];
} }
+16 -22
View File
@@ -94,10 +94,8 @@ gtk_css_value_color_free (GtkCssValue *color)
} }
static GtkCssValue * static GtkCssValue *
gtk_css_value_color_get_fallback (guint property_id, gtk_css_value_color_get_fallback (guint property_id,
GtkStyleProvider *provider, GtkCssComputeContext *context)
GtkCssStyle *style,
GtkCssStyle *parent_style)
{ {
switch (property_id) switch (property_id)
{ {
@@ -118,11 +116,9 @@ gtk_css_value_color_get_fallback (guint property_id,
case GTK_CSS_PROPERTY_SECONDARY_CARET_COLOR: case GTK_CSS_PROPERTY_SECONDARY_CARET_COLOR:
return _gtk_css_value_compute (_gtk_css_style_property_get_initial_value (_gtk_css_style_property_lookup_by_id (property_id)), return _gtk_css_value_compute (_gtk_css_style_property_get_initial_value (_gtk_css_style_property_lookup_by_id (property_id)),
property_id, property_id,
provider, context);
style,
parent_style);
case GTK_CSS_PROPERTY_ICON_PALETTE: case GTK_CSS_PROPERTY_ICON_PALETTE:
return _gtk_css_value_ref (style->core->color); return _gtk_css_value_ref (context->style->core->color);
default: default:
if (property_id < GTK_CSS_PROPERTY_N_PROPERTIES) if (property_id < GTK_CSS_PROPERTY_N_PROPERTIES)
g_warning ("No fallback color defined for property '%s'", g_warning ("No fallback color defined for property '%s'",
@@ -132,11 +128,9 @@ gtk_css_value_color_get_fallback (guint property_id,
} }
static GtkCssValue * static GtkCssValue *
gtk_css_value_color_compute (GtkCssValue *value, gtk_css_value_color_compute (GtkCssValue *value,
guint property_id, guint property_id,
GtkStyleProvider *provider, GtkCssComputeContext *context)
GtkCssStyle *style,
GtkCssStyle *parent_style)
{ {
GtkCssValue *resolved; GtkCssValue *resolved;
@@ -148,13 +142,13 @@ gtk_css_value_color_compute (GtkCssValue *value,
{ {
GtkCssValue *current; GtkCssValue *current;
if (parent_style) if (context->parent_style)
current = parent_style->core->color; current = context->parent_style->core->color;
else else
current = NULL; current = NULL;
resolved = _gtk_css_color_value_resolve (value, resolved = _gtk_css_color_value_resolve (value,
provider, context->provider,
current, current,
NULL); NULL);
} }
@@ -164,16 +158,16 @@ gtk_css_value_color_compute (GtkCssValue *value,
} }
else else
{ {
GtkCssValue *current = style->core->color; GtkCssValue *current = context->style->core->color;
resolved = _gtk_css_color_value_resolve (value, resolved = _gtk_css_color_value_resolve (value,
provider, context->provider,
current, current,
NULL); NULL);
} }
if (resolved == NULL) if (resolved == NULL)
return gtk_css_value_color_get_fallback (property_id, provider, style, parent_style); return gtk_css_value_color_get_fallback (property_id, context);
return resolved; return resolved;
} }
@@ -484,9 +478,9 @@ _gtk_css_color_value_resolve (GtkCssValue *color,
return value; return value;
} }
static GtkCssValue transparent_black_singleton = { &GTK_CSS_VALUE_COLOR, 1, TRUE, COLOR_TYPE_LITERAL, NULL, static GtkCssValue transparent_black_singleton = { &GTK_CSS_VALUE_COLOR, 1, TRUE, FALSE, COLOR_TYPE_LITERAL, NULL,
.sym_col.rgba = {0, 0, 0, 0} }; .sym_col.rgba = {0, 0, 0, 0} };
static GtkCssValue white_singleton = { &GTK_CSS_VALUE_COLOR, 1, TRUE, COLOR_TYPE_LITERAL, NULL, static GtkCssValue white_singleton = { &GTK_CSS_VALUE_COLOR, 1, TRUE, FALSE, COLOR_TYPE_LITERAL, NULL,
.sym_col.rgba = {1, 1, 1, 1} }; .sym_col.rgba = {1, 1, 1, 1} };
@@ -620,7 +614,7 @@ _gtk_css_color_value_new_mix (GtkCssValue *color1,
GtkCssValue * GtkCssValue *
_gtk_css_color_value_new_current_color (void) _gtk_css_color_value_new_current_color (void)
{ {
static GtkCssValue current_color = { &GTK_CSS_VALUE_COLOR, 1, FALSE, COLOR_TYPE_CURRENT_COLOR, NULL, }; static GtkCssValue current_color = { &GTK_CSS_VALUE_COLOR, 1, FALSE, FALSE, COLOR_TYPE_CURRENT_COLOR, NULL, };
return _gtk_css_value_ref (&current_color); return _gtk_css_value_ref (&current_color);
} }
+14 -15
View File
@@ -37,16 +37,14 @@ gtk_css_value_corner_free (GtkCssValue *value)
} }
static GtkCssValue * static GtkCssValue *
gtk_css_value_corner_compute (GtkCssValue *corner, gtk_css_value_corner_compute (GtkCssValue *corner,
guint property_id, guint property_id,
GtkStyleProvider *provider, GtkCssComputeContext *context)
GtkCssStyle *style,
GtkCssStyle *parent_style)
{ {
GtkCssValue *x, *y; GtkCssValue *x, *y;
x = _gtk_css_value_compute (corner->x, property_id, provider, style, parent_style); x = _gtk_css_value_compute (corner->x, property_id, context);
y = _gtk_css_value_compute (corner->y, property_id, provider, style, parent_style); y = _gtk_css_value_compute (corner->y, property_id, context);
if (x == corner->x && y == corner->y) if (x == corner->x && y == corner->y)
{ {
_gtk_css_value_unref (x); _gtk_css_value_unref (x);
@@ -110,14 +108,14 @@ static const GtkCssValueClass GTK_CSS_VALUE_CORNER = {
}; };
static GtkCssValue corner_singletons[] = { static GtkCssValue corner_singletons[] = {
{ &GTK_CSS_VALUE_CORNER, 1, TRUE, NULL, NULL }, { &GTK_CSS_VALUE_CORNER, 1, TRUE, FALSE, NULL, NULL },
{ &GTK_CSS_VALUE_CORNER, 1, TRUE, NULL, NULL }, { &GTK_CSS_VALUE_CORNER, 1, TRUE, FALSE, NULL, NULL },
{ &GTK_CSS_VALUE_CORNER, 1, TRUE, NULL, NULL }, { &GTK_CSS_VALUE_CORNER, 1, TRUE, FALSE, NULL, NULL },
{ &GTK_CSS_VALUE_CORNER, 1, TRUE, NULL, NULL }, { &GTK_CSS_VALUE_CORNER, 1, TRUE, FALSE, NULL, NULL },
{ &GTK_CSS_VALUE_CORNER, 1, TRUE, NULL, NULL }, { &GTK_CSS_VALUE_CORNER, 1, TRUE, FALSE, NULL, NULL },
{ &GTK_CSS_VALUE_CORNER, 1, TRUE, NULL, NULL }, { &GTK_CSS_VALUE_CORNER, 1, TRUE, FALSE, NULL, NULL },
{ &GTK_CSS_VALUE_CORNER, 1, TRUE, NULL, NULL }, { &GTK_CSS_VALUE_CORNER, 1, TRUE, FALSE, NULL, NULL },
{ &GTK_CSS_VALUE_CORNER, 1, TRUE, NULL, NULL }, { &GTK_CSS_VALUE_CORNER, 1, TRUE, FALSE, NULL, NULL },
}; };
static inline void static inline void
@@ -226,3 +224,4 @@ gtk_css_corner_value_is_zero (const GtkCssValue *corner)
return gtk_css_dimension_value_is_zero (corner->x) && return gtk_css_dimension_value_is_zero (corner->x) &&
gtk_css_dimension_value_is_zero (corner->y); gtk_css_dimension_value_is_zero (corner->y);
} }
+161
View File
@@ -0,0 +1,161 @@
/*
* Copyright (C) 2023 GNOME Foundation Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
* Authors: Alice Mikhaylenko <alicem@gnome.org>
*/
#include "gtkcsscustompropertypoolprivate.h"
struct _GtkCssCustomPropertyPool
{
GObject parent_instance;
GArray *names;
GHashTable *name_mappings;
};
struct _GtkCssCustomPropertyName
{
int ref_count;
char *name;
};
typedef struct _GtkCssCustomPropertyName GtkCssCustomPropertyName;
static GtkCssCustomPropertyPool *instance = NULL;
G_DEFINE_FINAL_TYPE (GtkCssCustomPropertyPool, gtk_css_custom_property_pool, G_TYPE_OBJECT)
static void
clear_custom_property_name (GtkCssCustomPropertyName *name)
{
g_clear_pointer (&name->name, g_free);
}
static void
gtk_css_custom_property_pool_finalize (GObject *object)
{
GtkCssCustomPropertyPool *self = (GtkCssCustomPropertyPool *)object;
g_hash_table_unref (self->name_mappings);
g_array_unref (self->names);
G_OBJECT_CLASS (gtk_css_custom_property_pool_parent_class)->finalize (object);
}
static void
gtk_css_custom_property_pool_class_init (GtkCssCustomPropertyPoolClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->finalize = gtk_css_custom_property_pool_finalize;
}
static void
gtk_css_custom_property_pool_init (GtkCssCustomPropertyPool *self)
{
self->name_mappings = g_hash_table_new (g_str_hash, g_str_equal);
self->names = g_array_new (FALSE, FALSE, sizeof (GtkCssCustomPropertyName));
g_array_set_clear_func (self->names, (GDestroyNotify) clear_custom_property_name);
}
GtkCssCustomPropertyPool *
gtk_css_custom_property_pool_get (void)
{
if (instance == NULL)
instance = g_object_new (GTK_TYPE_CSS_CUSTOM_PROPERTY_POOL, NULL);
return instance;
}
int
gtk_css_custom_property_pool_add (GtkCssCustomPropertyPool *self,
const char *str)
{
GtkCssCustomPropertyName name;
int id;
id = gtk_css_custom_property_pool_lookup (self, str);
if (id > 0)
return gtk_css_custom_property_pool_ref (self, id);
name.ref_count = 1;
name.name = g_strdup (str);
// TODO reuse slots after they're gone
g_array_append_val (self->names, name);
id = self->names->len;
g_hash_table_insert (self->name_mappings, (char *) name.name, GINT_TO_POINTER (id));
return id;
}
int
gtk_css_custom_property_pool_lookup (GtkCssCustomPropertyPool *self,
const char *str)
{
gpointer id;
id = g_hash_table_lookup (self->name_mappings, str);
return GPOINTER_TO_INT (id);
}
int
gtk_css_custom_property_pool_ref (GtkCssCustomPropertyPool *self,
int id)
{
GtkCssCustomPropertyName *name;
name = &g_array_index (self->names, GtkCssCustomPropertyName, id - 1);
name->ref_count++;
return id;
}
void
gtk_css_custom_property_pool_unref (GtkCssCustomPropertyPool *self,
int id)
{
GtkCssCustomPropertyName *name;
name = &g_array_index (self->names, GtkCssCustomPropertyName, id - 1);
g_assert (name->ref_count > 0);
name->ref_count--;
if (name->ref_count == 0)
{
g_hash_table_remove (self->name_mappings, name->name);
clear_custom_property_name (name);
}
}
const char *
gtk_css_custom_property_pool_get_name (GtkCssCustomPropertyPool *self,
int id)
{
GtkCssCustomPropertyName *name;
name = &g_array_index (self->names, GtkCssCustomPropertyName, id - 1);
return name->name;
}
+43
View File
@@ -0,0 +1,43 @@
/*
* Copyright (C) 2023 GNOME Foundation Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
* Authors: Alice Mikhaylenko <alicem@gnome.org>
*/
#pragma once
#include <glib-object.h>
G_BEGIN_DECLS
#define GTK_TYPE_CSS_CUSTOM_PROPERTY_POOL (gtk_css_custom_property_pool_get_type())
G_DECLARE_FINAL_TYPE (GtkCssCustomPropertyPool, gtk_css_custom_property_pool, GTK, CSS_CUSTOM_PROPERTY_POOL, GObject)
GtkCssCustomPropertyPool *gtk_css_custom_property_pool_get (void);
int gtk_css_custom_property_pool_add (GtkCssCustomPropertyPool *self,
const char *str);
int gtk_css_custom_property_pool_lookup (GtkCssCustomPropertyPool *self,
const char *str);
const char * gtk_css_custom_property_pool_get_name (GtkCssCustomPropertyPool *self,
int id);
int gtk_css_custom_property_pool_ref (GtkCssCustomPropertyPool *self,
int id);
void gtk_css_custom_property_pool_unref (GtkCssCustomPropertyPool *self,
int id);
G_END_DECLS
+4 -5
View File
@@ -50,11 +50,9 @@ gtk_css_value_ease_free (GtkCssValue *value)
} }
static GtkCssValue * static GtkCssValue *
gtk_css_value_ease_compute (GtkCssValue *value, gtk_css_value_ease_compute (GtkCssValue *value,
guint property_id, guint property_id,
GtkStyleProvider *provider, GtkCssComputeContext *context)
GtkCssStyle *style,
GtkCssStyle *parent_style)
{ {
return _gtk_css_value_ref (value); return _gtk_css_value_ref (value);
} }
@@ -407,3 +405,4 @@ _gtk_css_ease_value_transform (const GtkCssValue *ease,
} }
+102 -104
View File
@@ -41,11 +41,9 @@ gtk_css_value_enum_free (GtkCssValue *value)
} }
static GtkCssValue * static GtkCssValue *
gtk_css_value_enum_compute (GtkCssValue *value, gtk_css_value_enum_compute (GtkCssValue *value,
guint property_id, guint property_id,
GtkStyleProvider *provider, GtkCssComputeContext *context)
GtkCssStyle *style,
GtkCssStyle *parent_style)
{ {
return _gtk_css_value_ref (value); return _gtk_css_value_ref (value);
} }
@@ -87,16 +85,16 @@ static const GtkCssValueClass GTK_CSS_VALUE_BORDER_STYLE = {
}; };
static GtkCssValue border_style_values[] = { static GtkCssValue border_style_values[] = {
{ &GTK_CSS_VALUE_BORDER_STYLE, 1, TRUE, GTK_BORDER_STYLE_NONE, "none" }, { &GTK_CSS_VALUE_BORDER_STYLE, 1, TRUE, FALSE, GTK_BORDER_STYLE_NONE, "none" },
{ &GTK_CSS_VALUE_BORDER_STYLE, 1, TRUE, GTK_BORDER_STYLE_SOLID, "solid" }, { &GTK_CSS_VALUE_BORDER_STYLE, 1, TRUE, FALSE, GTK_BORDER_STYLE_SOLID, "solid" },
{ &GTK_CSS_VALUE_BORDER_STYLE, 1, TRUE, GTK_BORDER_STYLE_INSET, "inset" }, { &GTK_CSS_VALUE_BORDER_STYLE, 1, TRUE, FALSE, GTK_BORDER_STYLE_INSET, "inset" },
{ &GTK_CSS_VALUE_BORDER_STYLE, 1, TRUE, GTK_BORDER_STYLE_OUTSET, "outset" }, { &GTK_CSS_VALUE_BORDER_STYLE, 1, TRUE, FALSE, GTK_BORDER_STYLE_OUTSET, "outset" },
{ &GTK_CSS_VALUE_BORDER_STYLE, 1, TRUE, GTK_BORDER_STYLE_HIDDEN, "hidden" }, { &GTK_CSS_VALUE_BORDER_STYLE, 1, TRUE, FALSE, GTK_BORDER_STYLE_HIDDEN, "hidden" },
{ &GTK_CSS_VALUE_BORDER_STYLE, 1, TRUE, GTK_BORDER_STYLE_DOTTED, "dotted" }, { &GTK_CSS_VALUE_BORDER_STYLE, 1, TRUE, FALSE, GTK_BORDER_STYLE_DOTTED, "dotted" },
{ &GTK_CSS_VALUE_BORDER_STYLE, 1, TRUE, GTK_BORDER_STYLE_DASHED, "dashed" }, { &GTK_CSS_VALUE_BORDER_STYLE, 1, TRUE, FALSE, GTK_BORDER_STYLE_DASHED, "dashed" },
{ &GTK_CSS_VALUE_BORDER_STYLE, 1, TRUE, GTK_BORDER_STYLE_DOUBLE, "double" }, { &GTK_CSS_VALUE_BORDER_STYLE, 1, TRUE, FALSE, GTK_BORDER_STYLE_DOUBLE, "double" },
{ &GTK_CSS_VALUE_BORDER_STYLE, 1, TRUE, GTK_BORDER_STYLE_GROOVE, "groove" }, { &GTK_CSS_VALUE_BORDER_STYLE, 1, TRUE, FALSE, GTK_BORDER_STYLE_GROOVE, "groove" },
{ &GTK_CSS_VALUE_BORDER_STYLE, 1, TRUE, GTK_BORDER_STYLE_RIDGE, "ridge" } { &GTK_CSS_VALUE_BORDER_STYLE, 1, TRUE, FALSE, GTK_BORDER_STYLE_RIDGE, "ridge" }
}; };
GtkCssValue * GtkCssValue *
@@ -145,22 +143,22 @@ static const GtkCssValueClass GTK_CSS_VALUE_BLEND_MODE = {
}; };
static GtkCssValue blend_mode_values[] = { static GtkCssValue blend_mode_values[] = {
{ &GTK_CSS_VALUE_BLEND_MODE, 1, TRUE, GSK_BLEND_MODE_DEFAULT, "normal" }, { &GTK_CSS_VALUE_BLEND_MODE, 1, TRUE, FALSE, GSK_BLEND_MODE_DEFAULT, "normal" },
{ &GTK_CSS_VALUE_BLEND_MODE, 1, TRUE, GSK_BLEND_MODE_MULTIPLY, "multiply" }, { &GTK_CSS_VALUE_BLEND_MODE, 1, TRUE, FALSE, GSK_BLEND_MODE_MULTIPLY, "multiply" },
{ &GTK_CSS_VALUE_BLEND_MODE, 1, TRUE, GSK_BLEND_MODE_SCREEN, "screen" }, { &GTK_CSS_VALUE_BLEND_MODE, 1, TRUE, FALSE, GSK_BLEND_MODE_SCREEN, "screen" },
{ &GTK_CSS_VALUE_BLEND_MODE, 1, TRUE, GSK_BLEND_MODE_OVERLAY, "overlay" }, { &GTK_CSS_VALUE_BLEND_MODE, 1, TRUE, FALSE, GSK_BLEND_MODE_OVERLAY, "overlay" },
{ &GTK_CSS_VALUE_BLEND_MODE, 1, TRUE, GSK_BLEND_MODE_DARKEN, "darken" }, { &GTK_CSS_VALUE_BLEND_MODE, 1, TRUE, FALSE, GSK_BLEND_MODE_DARKEN, "darken" },
{ &GTK_CSS_VALUE_BLEND_MODE, 1, TRUE, GSK_BLEND_MODE_LIGHTEN, "lighten" }, { &GTK_CSS_VALUE_BLEND_MODE, 1, TRUE, FALSE, GSK_BLEND_MODE_LIGHTEN, "lighten" },
{ &GTK_CSS_VALUE_BLEND_MODE, 1, TRUE, GSK_BLEND_MODE_COLOR_DODGE, "color-dodge" }, { &GTK_CSS_VALUE_BLEND_MODE, 1, TRUE, FALSE, GSK_BLEND_MODE_COLOR_DODGE, "color-dodge" },
{ &GTK_CSS_VALUE_BLEND_MODE, 1, TRUE, GSK_BLEND_MODE_COLOR_BURN, "color-burn" }, { &GTK_CSS_VALUE_BLEND_MODE, 1, TRUE, FALSE, GSK_BLEND_MODE_COLOR_BURN, "color-burn" },
{ &GTK_CSS_VALUE_BLEND_MODE, 1, TRUE, GSK_BLEND_MODE_HARD_LIGHT, "hard-light" }, { &GTK_CSS_VALUE_BLEND_MODE, 1, TRUE, FALSE, GSK_BLEND_MODE_HARD_LIGHT, "hard-light" },
{ &GTK_CSS_VALUE_BLEND_MODE, 1, TRUE, GSK_BLEND_MODE_SOFT_LIGHT, "soft-light" }, { &GTK_CSS_VALUE_BLEND_MODE, 1, TRUE, FALSE, GSK_BLEND_MODE_SOFT_LIGHT, "soft-light" },
{ &GTK_CSS_VALUE_BLEND_MODE, 1, TRUE, GSK_BLEND_MODE_DIFFERENCE, "difference" }, { &GTK_CSS_VALUE_BLEND_MODE, 1, TRUE, FALSE, GSK_BLEND_MODE_DIFFERENCE, "difference" },
{ &GTK_CSS_VALUE_BLEND_MODE, 1, TRUE, GSK_BLEND_MODE_EXCLUSION, "exclusion" }, { &GTK_CSS_VALUE_BLEND_MODE, 1, TRUE, FALSE, GSK_BLEND_MODE_EXCLUSION, "exclusion" },
{ &GTK_CSS_VALUE_BLEND_MODE, 1, TRUE, GSK_BLEND_MODE_COLOR, "color" }, { &GTK_CSS_VALUE_BLEND_MODE, 1, TRUE, FALSE, GSK_BLEND_MODE_COLOR, "color" },
{ &GTK_CSS_VALUE_BLEND_MODE, 1, TRUE, GSK_BLEND_MODE_HUE, "hue" }, { &GTK_CSS_VALUE_BLEND_MODE, 1, TRUE, FALSE, GSK_BLEND_MODE_HUE, "hue" },
{ &GTK_CSS_VALUE_BLEND_MODE, 1, TRUE, GSK_BLEND_MODE_SATURATION, "saturation" }, { &GTK_CSS_VALUE_BLEND_MODE, 1, TRUE, FALSE, GSK_BLEND_MODE_SATURATION, "saturation" },
{ &GTK_CSS_VALUE_BLEND_MODE, 1, TRUE, GSK_BLEND_MODE_LUMINOSITY, "luminosity" } { &GTK_CSS_VALUE_BLEND_MODE, 1, TRUE, FALSE, GSK_BLEND_MODE_LUMINOSITY, "luminosity" }
}; };
GtkCssValue * GtkCssValue *
@@ -229,12 +227,14 @@ gtk_css_font_size_get_default_px (GtkStyleProvider *provider,
} }
static GtkCssValue * static GtkCssValue *
gtk_css_value_font_size_compute (GtkCssValue *value, gtk_css_value_font_size_compute (GtkCssValue *value,
guint property_id, guint property_id,
GtkStyleProvider *provider, GtkCssComputeContext *context)
GtkCssStyle *style,
GtkCssStyle *parent_style)
{ {
GtkStyleProvider *provider = context->provider;
GtkCssStyle *style = context->style;
GtkCssStyle *parent_style = context->parent_style;
double font_size; double font_size;
switch (value->value) switch (value->value)
@@ -296,15 +296,15 @@ static const GtkCssValueClass GTK_CSS_VALUE_FONT_SIZE = {
}; };
static GtkCssValue font_size_values[] = { static GtkCssValue font_size_values[] = {
{ &GTK_CSS_VALUE_FONT_SIZE, 1, FALSE, GTK_CSS_FONT_SIZE_SMALLER, "smaller" }, { &GTK_CSS_VALUE_FONT_SIZE, 1, FALSE, FALSE, GTK_CSS_FONT_SIZE_SMALLER, "smaller" },
{ &GTK_CSS_VALUE_FONT_SIZE, 1, FALSE, GTK_CSS_FONT_SIZE_LARGER, "larger" }, { &GTK_CSS_VALUE_FONT_SIZE, 1, FALSE, FALSE, GTK_CSS_FONT_SIZE_LARGER, "larger" },
{ &GTK_CSS_VALUE_FONT_SIZE, 1, FALSE, GTK_CSS_FONT_SIZE_XX_SMALL, "xx-small" }, { &GTK_CSS_VALUE_FONT_SIZE, 1, FALSE, FALSE, GTK_CSS_FONT_SIZE_XX_SMALL, "xx-small" },
{ &GTK_CSS_VALUE_FONT_SIZE, 1, FALSE, GTK_CSS_FONT_SIZE_X_SMALL, "x-small" }, { &GTK_CSS_VALUE_FONT_SIZE, 1, FALSE, FALSE, GTK_CSS_FONT_SIZE_X_SMALL, "x-small" },
{ &GTK_CSS_VALUE_FONT_SIZE, 1, FALSE, GTK_CSS_FONT_SIZE_SMALL, "small" }, { &GTK_CSS_VALUE_FONT_SIZE, 1, FALSE, FALSE, GTK_CSS_FONT_SIZE_SMALL, "small" },
{ &GTK_CSS_VALUE_FONT_SIZE, 1, FALSE, GTK_CSS_FONT_SIZE_MEDIUM, "medium" }, { &GTK_CSS_VALUE_FONT_SIZE, 1, FALSE, FALSE, GTK_CSS_FONT_SIZE_MEDIUM, "medium" },
{ &GTK_CSS_VALUE_FONT_SIZE, 1, FALSE, GTK_CSS_FONT_SIZE_LARGE, "large" }, { &GTK_CSS_VALUE_FONT_SIZE, 1, FALSE, FALSE, GTK_CSS_FONT_SIZE_LARGE, "large" },
{ &GTK_CSS_VALUE_FONT_SIZE, 1, FALSE, GTK_CSS_FONT_SIZE_X_LARGE, "x-large" }, { &GTK_CSS_VALUE_FONT_SIZE, 1, FALSE, FALSE, GTK_CSS_FONT_SIZE_X_LARGE, "x-large" },
{ &GTK_CSS_VALUE_FONT_SIZE, 1, FALSE, GTK_CSS_FONT_SIZE_XX_LARGE, "xx-large" } { &GTK_CSS_VALUE_FONT_SIZE, 1, FALSE, FALSE, GTK_CSS_FONT_SIZE_XX_LARGE, "xx-large" }
}; };
GtkCssValue * GtkCssValue *
@@ -353,9 +353,9 @@ static const GtkCssValueClass GTK_CSS_VALUE_FONT_STYLE = {
}; };
static GtkCssValue font_style_values[] = { static GtkCssValue font_style_values[] = {
{ &GTK_CSS_VALUE_FONT_STYLE, 1, TRUE, PANGO_STYLE_NORMAL, "normal" }, { &GTK_CSS_VALUE_FONT_STYLE, 1, TRUE, FALSE, PANGO_STYLE_NORMAL, "normal" },
{ &GTK_CSS_VALUE_FONT_STYLE, 1, TRUE, PANGO_STYLE_OBLIQUE, "oblique" }, { &GTK_CSS_VALUE_FONT_STYLE, 1, TRUE, FALSE, PANGO_STYLE_OBLIQUE, "oblique" },
{ &GTK_CSS_VALUE_FONT_STYLE, 1, TRUE, PANGO_STYLE_ITALIC, "italic" } { &GTK_CSS_VALUE_FONT_STYLE, 1, TRUE, FALSE, PANGO_STYLE_ITALIC, "italic" }
}; };
GtkCssValue * GtkCssValue *
@@ -396,11 +396,9 @@ _gtk_css_font_style_value_get (const GtkCssValue *value)
#define LIGHTER -2 #define LIGHTER -2
static GtkCssValue * static GtkCssValue *
gtk_css_value_font_weight_compute (GtkCssValue *value, gtk_css_value_font_weight_compute (GtkCssValue *value,
guint property_id, guint property_id,
GtkStyleProvider *provider, GtkCssComputeContext *context)
GtkCssStyle *style,
GtkCssStyle *parent_style)
{ {
PangoWeight new_weight; PangoWeight new_weight;
int parent_value; int parent_value;
@@ -408,8 +406,8 @@ gtk_css_value_font_weight_compute (GtkCssValue *value,
if (value->value >= 0) if (value->value >= 0)
return _gtk_css_value_ref (value); return _gtk_css_value_ref (value);
if (parent_style) if (context->parent_style)
parent_value = _gtk_css_number_value_get (parent_style->font->font_weight, 100); parent_value = _gtk_css_number_value_get (context->parent_style->font->font_weight, 100);
else else
parent_value = 400; parent_value = 400;
@@ -452,8 +450,8 @@ static const GtkCssValueClass GTK_CSS_VALUE_FONT_WEIGHT = {
}; };
static GtkCssValue font_weight_values[] = { static GtkCssValue font_weight_values[] = {
{ &GTK_CSS_VALUE_FONT_WEIGHT, 1, FALSE, BOLDER, "bolder" }, { &GTK_CSS_VALUE_FONT_WEIGHT, 1, FALSE, FALSE, BOLDER, "bolder" },
{ &GTK_CSS_VALUE_FONT_WEIGHT, 1, FALSE, LIGHTER, "lighter" }, { &GTK_CSS_VALUE_FONT_WEIGHT, 1, FALSE, FALSE, LIGHTER, "lighter" },
}; };
GtkCssValue * GtkCssValue *
@@ -502,15 +500,15 @@ static const GtkCssValueClass GTK_CSS_VALUE_FONT_STRETCH = {
}; };
static GtkCssValue font_stretch_values[] = { static GtkCssValue font_stretch_values[] = {
{ &GTK_CSS_VALUE_FONT_STRETCH, 1, TRUE, PANGO_STRETCH_ULTRA_CONDENSED, "ultra-condensed" }, { &GTK_CSS_VALUE_FONT_STRETCH, 1, TRUE, FALSE, PANGO_STRETCH_ULTRA_CONDENSED, "ultra-condensed" },
{ &GTK_CSS_VALUE_FONT_STRETCH, 1, TRUE, PANGO_STRETCH_EXTRA_CONDENSED, "extra-condensed" }, { &GTK_CSS_VALUE_FONT_STRETCH, 1, TRUE, FALSE, PANGO_STRETCH_EXTRA_CONDENSED, "extra-condensed" },
{ &GTK_CSS_VALUE_FONT_STRETCH, 1, TRUE, PANGO_STRETCH_CONDENSED, "condensed" }, { &GTK_CSS_VALUE_FONT_STRETCH, 1, TRUE, FALSE, PANGO_STRETCH_CONDENSED, "condensed" },
{ &GTK_CSS_VALUE_FONT_STRETCH, 1, TRUE, PANGO_STRETCH_SEMI_CONDENSED, "semi-condensed" }, { &GTK_CSS_VALUE_FONT_STRETCH, 1, TRUE, FALSE, PANGO_STRETCH_SEMI_CONDENSED, "semi-condensed" },
{ &GTK_CSS_VALUE_FONT_STRETCH, 1, TRUE, PANGO_STRETCH_NORMAL, "normal" }, { &GTK_CSS_VALUE_FONT_STRETCH, 1, TRUE, FALSE, PANGO_STRETCH_NORMAL, "normal" },
{ &GTK_CSS_VALUE_FONT_STRETCH, 1, TRUE, PANGO_STRETCH_SEMI_EXPANDED, "semi-expanded" }, { &GTK_CSS_VALUE_FONT_STRETCH, 1, TRUE, FALSE, PANGO_STRETCH_SEMI_EXPANDED, "semi-expanded" },
{ &GTK_CSS_VALUE_FONT_STRETCH, 1, TRUE, PANGO_STRETCH_EXPANDED, "expanded" }, { &GTK_CSS_VALUE_FONT_STRETCH, 1, TRUE, FALSE, PANGO_STRETCH_EXPANDED, "expanded" },
{ &GTK_CSS_VALUE_FONT_STRETCH, 1, TRUE, PANGO_STRETCH_EXTRA_EXPANDED, "extra-expanded" }, { &GTK_CSS_VALUE_FONT_STRETCH, 1, TRUE, FALSE, PANGO_STRETCH_EXTRA_EXPANDED, "extra-expanded" },
{ &GTK_CSS_VALUE_FONT_STRETCH, 1, TRUE, PANGO_STRETCH_ULTRA_EXPANDED, "ultra-expanded" }, { &GTK_CSS_VALUE_FONT_STRETCH, 1, TRUE, FALSE, PANGO_STRETCH_ULTRA_EXPANDED, "ultra-expanded" },
}; };
GtkCssValue * GtkCssValue *
@@ -559,9 +557,9 @@ static const GtkCssValueClass GTK_CSS_VALUE_TEXT_DECORATION_STYLE = {
}; };
static GtkCssValue text_decoration_style_values[] = { static GtkCssValue text_decoration_style_values[] = {
{ &GTK_CSS_VALUE_TEXT_DECORATION_STYLE, 1, TRUE, GTK_CSS_TEXT_DECORATION_STYLE_SOLID, "solid" }, { &GTK_CSS_VALUE_TEXT_DECORATION_STYLE, 1, TRUE, FALSE, GTK_CSS_TEXT_DECORATION_STYLE_SOLID, "solid" },
{ &GTK_CSS_VALUE_TEXT_DECORATION_STYLE, 1, TRUE, GTK_CSS_TEXT_DECORATION_STYLE_DOUBLE, "double" }, { &GTK_CSS_VALUE_TEXT_DECORATION_STYLE, 1, TRUE, FALSE, GTK_CSS_TEXT_DECORATION_STYLE_DOUBLE, "double" },
{ &GTK_CSS_VALUE_TEXT_DECORATION_STYLE, 1, TRUE, GTK_CSS_TEXT_DECORATION_STYLE_WAVY, "wavy" }, { &GTK_CSS_VALUE_TEXT_DECORATION_STYLE, 1, TRUE, FALSE, GTK_CSS_TEXT_DECORATION_STYLE_WAVY, "wavy" },
}; };
GtkCssValue * GtkCssValue *
@@ -610,9 +608,9 @@ static const GtkCssValueClass GTK_CSS_VALUE_AREA = {
}; };
static GtkCssValue area_values[] = { static GtkCssValue area_values[] = {
{ &GTK_CSS_VALUE_AREA, 1, TRUE, GTK_CSS_AREA_BORDER_BOX, "border-box" }, { &GTK_CSS_VALUE_AREA, 1, TRUE, FALSE, GTK_CSS_AREA_BORDER_BOX, "border-box" },
{ &GTK_CSS_VALUE_AREA, 1, TRUE, GTK_CSS_AREA_PADDING_BOX, "padding-box" }, { &GTK_CSS_VALUE_AREA, 1, TRUE, FALSE, GTK_CSS_AREA_PADDING_BOX, "padding-box" },
{ &GTK_CSS_VALUE_AREA, 1, TRUE, GTK_CSS_AREA_CONTENT_BOX, "content-box" } { &GTK_CSS_VALUE_AREA, 1, TRUE, FALSE, GTK_CSS_AREA_CONTENT_BOX, "content-box" }
}; };
GtkCssValue * GtkCssValue *
@@ -667,10 +665,10 @@ static const GtkCssValueClass GTK_CSS_VALUE_DIRECTION = {
}; };
static GtkCssValue direction_values[] = { static GtkCssValue direction_values[] = {
{ &GTK_CSS_VALUE_DIRECTION, 1, TRUE, GTK_CSS_DIRECTION_NORMAL, "normal" }, { &GTK_CSS_VALUE_DIRECTION, 1, TRUE, FALSE, GTK_CSS_DIRECTION_NORMAL, "normal" },
{ &GTK_CSS_VALUE_DIRECTION, 1, TRUE, GTK_CSS_DIRECTION_REVERSE, "reverse" }, { &GTK_CSS_VALUE_DIRECTION, 1, TRUE, FALSE, GTK_CSS_DIRECTION_REVERSE, "reverse" },
{ &GTK_CSS_VALUE_DIRECTION, 1, TRUE, GTK_CSS_DIRECTION_ALTERNATE, "alternate" }, { &GTK_CSS_VALUE_DIRECTION, 1, TRUE, FALSE, GTK_CSS_DIRECTION_ALTERNATE, "alternate" },
{ &GTK_CSS_VALUE_DIRECTION, 1, TRUE, GTK_CSS_DIRECTION_ALTERNATE_REVERSE, "alternate-reverse" } { &GTK_CSS_VALUE_DIRECTION, 1, TRUE, FALSE, GTK_CSS_DIRECTION_ALTERNATE_REVERSE, "alternate-reverse" }
}; };
GtkCssValue * GtkCssValue *
@@ -728,8 +726,8 @@ static const GtkCssValueClass GTK_CSS_VALUE_PLAY_STATE = {
}; };
static GtkCssValue play_state_values[] = { static GtkCssValue play_state_values[] = {
{ &GTK_CSS_VALUE_PLAY_STATE, 1, TRUE, GTK_CSS_PLAY_STATE_RUNNING, "running" }, { &GTK_CSS_VALUE_PLAY_STATE, 1, TRUE, FALSE, GTK_CSS_PLAY_STATE_RUNNING, "running" },
{ &GTK_CSS_VALUE_PLAY_STATE, 1, TRUE, GTK_CSS_PLAY_STATE_PAUSED, "paused" } { &GTK_CSS_VALUE_PLAY_STATE, 1, TRUE, FALSE, GTK_CSS_PLAY_STATE_PAUSED, "paused" }
}; };
GtkCssValue * GtkCssValue *
@@ -784,10 +782,10 @@ static const GtkCssValueClass GTK_CSS_VALUE_FILL_MODE = {
}; };
static GtkCssValue fill_mode_values[] = { static GtkCssValue fill_mode_values[] = {
{ &GTK_CSS_VALUE_FILL_MODE, 1, TRUE, GTK_CSS_FILL_NONE, "none" }, { &GTK_CSS_VALUE_FILL_MODE, 1, TRUE, FALSE, GTK_CSS_FILL_NONE, "none" },
{ &GTK_CSS_VALUE_FILL_MODE, 1, TRUE, GTK_CSS_FILL_FORWARDS, "forwards" }, { &GTK_CSS_VALUE_FILL_MODE, 1, TRUE, FALSE, GTK_CSS_FILL_FORWARDS, "forwards" },
{ &GTK_CSS_VALUE_FILL_MODE, 1, TRUE, GTK_CSS_FILL_BACKWARDS, "backwards" }, { &GTK_CSS_VALUE_FILL_MODE, 1, TRUE, FALSE, GTK_CSS_FILL_BACKWARDS, "backwards" },
{ &GTK_CSS_VALUE_FILL_MODE, 1, TRUE, GTK_CSS_FILL_BOTH, "both" } { &GTK_CSS_VALUE_FILL_MODE, 1, TRUE, FALSE, GTK_CSS_FILL_BOTH, "both" }
}; };
GtkCssValue * GtkCssValue *
@@ -842,9 +840,9 @@ static const GtkCssValueClass GTK_CSS_VALUE_ICON_STYLE = {
}; };
static GtkCssValue icon_style_values[] = { static GtkCssValue icon_style_values[] = {
{ &GTK_CSS_VALUE_ICON_STYLE, 1, TRUE, GTK_CSS_ICON_STYLE_REQUESTED, "requested" }, { &GTK_CSS_VALUE_ICON_STYLE, 1, TRUE, FALSE, GTK_CSS_ICON_STYLE_REQUESTED, "requested" },
{ &GTK_CSS_VALUE_ICON_STYLE, 1, TRUE, GTK_CSS_ICON_STYLE_REGULAR, "regular" }, { &GTK_CSS_VALUE_ICON_STYLE, 1, TRUE, FALSE, GTK_CSS_ICON_STYLE_REGULAR, "regular" },
{ &GTK_CSS_VALUE_ICON_STYLE, 1, TRUE, GTK_CSS_ICON_STYLE_SYMBOLIC, "symbolic" } { &GTK_CSS_VALUE_ICON_STYLE, 1, TRUE, FALSE, GTK_CSS_ICON_STYLE_SYMBOLIC, "symbolic" }
}; };
GtkCssValue * GtkCssValue *
@@ -899,9 +897,9 @@ static const GtkCssValueClass GTK_CSS_VALUE_FONT_KERNING = {
}; };
static GtkCssValue font_kerning_values[] = { static GtkCssValue font_kerning_values[] = {
{ &GTK_CSS_VALUE_FONT_KERNING, 1, TRUE, GTK_CSS_FONT_KERNING_AUTO, "auto" }, { &GTK_CSS_VALUE_FONT_KERNING, 1, TRUE, FALSE, GTK_CSS_FONT_KERNING_AUTO, "auto" },
{ &GTK_CSS_VALUE_FONT_KERNING, 1, TRUE, GTK_CSS_FONT_KERNING_NORMAL, "normal" }, { &GTK_CSS_VALUE_FONT_KERNING, 1, TRUE, FALSE, GTK_CSS_FONT_KERNING_NORMAL, "normal" },
{ &GTK_CSS_VALUE_FONT_KERNING, 1, TRUE, GTK_CSS_FONT_KERNING_NONE, "none" } { &GTK_CSS_VALUE_FONT_KERNING, 1, TRUE, FALSE, GTK_CSS_FONT_KERNING_NONE, "none" }
}; };
GtkCssValue * GtkCssValue *
@@ -956,9 +954,9 @@ static const GtkCssValueClass GTK_CSS_VALUE_FONT_VARIANT_POSITION = {
}; };
static GtkCssValue font_variant_position_values[] = { static GtkCssValue font_variant_position_values[] = {
{ &GTK_CSS_VALUE_FONT_VARIANT_POSITION, 1, TRUE, GTK_CSS_FONT_VARIANT_POSITION_NORMAL, "normal" }, { &GTK_CSS_VALUE_FONT_VARIANT_POSITION, 1, TRUE, FALSE, GTK_CSS_FONT_VARIANT_POSITION_NORMAL, "normal" },
{ &GTK_CSS_VALUE_FONT_VARIANT_POSITION, 1, TRUE, GTK_CSS_FONT_VARIANT_POSITION_SUB, "sub" }, { &GTK_CSS_VALUE_FONT_VARIANT_POSITION, 1, TRUE, FALSE, GTK_CSS_FONT_VARIANT_POSITION_SUB, "sub" },
{ &GTK_CSS_VALUE_FONT_VARIANT_POSITION, 1, TRUE, GTK_CSS_FONT_VARIANT_POSITION_SUPER, "super" } { &GTK_CSS_VALUE_FONT_VARIANT_POSITION, 1, TRUE, FALSE, GTK_CSS_FONT_VARIANT_POSITION_SUPER, "super" }
}; };
GtkCssValue * GtkCssValue *
@@ -1013,13 +1011,13 @@ static const GtkCssValueClass GTK_CSS_VALUE_FONT_VARIANT_CAPS = {
}; };
static GtkCssValue font_variant_caps_values[] = { static GtkCssValue font_variant_caps_values[] = {
{ &GTK_CSS_VALUE_FONT_VARIANT_CAPS, 1, TRUE, GTK_CSS_FONT_VARIANT_CAPS_NORMAL, "normal" }, { &GTK_CSS_VALUE_FONT_VARIANT_CAPS, 1, TRUE, FALSE, GTK_CSS_FONT_VARIANT_CAPS_NORMAL, "normal" },
{ &GTK_CSS_VALUE_FONT_VARIANT_CAPS, 1, TRUE, GTK_CSS_FONT_VARIANT_CAPS_SMALL_CAPS, "small-caps" }, { &GTK_CSS_VALUE_FONT_VARIANT_CAPS, 1, TRUE, FALSE, GTK_CSS_FONT_VARIANT_CAPS_SMALL_CAPS, "small-caps" },
{ &GTK_CSS_VALUE_FONT_VARIANT_CAPS, 1, TRUE, GTK_CSS_FONT_VARIANT_CAPS_ALL_SMALL_CAPS, "all-small-caps" }, { &GTK_CSS_VALUE_FONT_VARIANT_CAPS, 1, TRUE, FALSE, GTK_CSS_FONT_VARIANT_CAPS_ALL_SMALL_CAPS, "all-small-caps" },
{ &GTK_CSS_VALUE_FONT_VARIANT_CAPS, 1, TRUE, GTK_CSS_FONT_VARIANT_CAPS_PETITE_CAPS, "petite-caps" }, { &GTK_CSS_VALUE_FONT_VARIANT_CAPS, 1, TRUE, FALSE, GTK_CSS_FONT_VARIANT_CAPS_PETITE_CAPS, "petite-caps" },
{ &GTK_CSS_VALUE_FONT_VARIANT_CAPS, 1, TRUE, GTK_CSS_FONT_VARIANT_CAPS_ALL_PETITE_CAPS, "all-petite-caps" }, { &GTK_CSS_VALUE_FONT_VARIANT_CAPS, 1, TRUE, FALSE, GTK_CSS_FONT_VARIANT_CAPS_ALL_PETITE_CAPS, "all-petite-caps" },
{ &GTK_CSS_VALUE_FONT_VARIANT_CAPS, 1, TRUE, GTK_CSS_FONT_VARIANT_CAPS_UNICASE, "unicase" }, { &GTK_CSS_VALUE_FONT_VARIANT_CAPS, 1, TRUE, FALSE, GTK_CSS_FONT_VARIANT_CAPS_UNICASE, "unicase" },
{ &GTK_CSS_VALUE_FONT_VARIANT_CAPS, 1, TRUE, GTK_CSS_FONT_VARIANT_CAPS_TITLING_CAPS, "titling-caps" } { &GTK_CSS_VALUE_FONT_VARIANT_CAPS, 1, TRUE, FALSE, GTK_CSS_FONT_VARIANT_CAPS_TITLING_CAPS, "titling-caps" }
}; };
GtkCssValue * GtkCssValue *
@@ -1074,8 +1072,8 @@ static const GtkCssValueClass GTK_CSS_VALUE_FONT_VARIANT_ALTERNATE = {
}; };
static GtkCssValue font_variant_alternate_values[] = { static GtkCssValue font_variant_alternate_values[] = {
{ &GTK_CSS_VALUE_FONT_VARIANT_ALTERNATE, 1, TRUE, GTK_CSS_FONT_VARIANT_ALTERNATE_NORMAL, "normal" }, { &GTK_CSS_VALUE_FONT_VARIANT_ALTERNATE, 1, TRUE, FALSE, GTK_CSS_FONT_VARIANT_ALTERNATE_NORMAL, "normal" },
{ &GTK_CSS_VALUE_FONT_VARIANT_ALTERNATE, 1, TRUE, GTK_CSS_FONT_VARIANT_ALTERNATE_HISTORICAL_FORMS, "historical-forms" } { &GTK_CSS_VALUE_FONT_VARIANT_ALTERNATE, 1, TRUE, FALSE, GTK_CSS_FONT_VARIANT_ALTERNATE_HISTORICAL_FORMS, "historical-forms" }
}; };
GtkCssValue * GtkCssValue *
@@ -1583,10 +1581,10 @@ static const GtkCssValueClass GTK_CSS_VALUE_TEXT_TRANSFORM = {
}; };
static GtkCssValue text_transform_values[] = { static GtkCssValue text_transform_values[] = {
{ &GTK_CSS_VALUE_TEXT_TRANSFORM, 1, TRUE, GTK_CSS_TEXT_TRANSFORM_NONE, "none" }, { &GTK_CSS_VALUE_TEXT_TRANSFORM, 1, TRUE, FALSE, GTK_CSS_TEXT_TRANSFORM_NONE, "none" },
{ &GTK_CSS_VALUE_TEXT_TRANSFORM, 1, TRUE, GTK_CSS_TEXT_TRANSFORM_LOWERCASE, "lowercase" }, { &GTK_CSS_VALUE_TEXT_TRANSFORM, 1, TRUE, FALSE, GTK_CSS_TEXT_TRANSFORM_LOWERCASE, "lowercase" },
{ &GTK_CSS_VALUE_TEXT_TRANSFORM, 1, TRUE, GTK_CSS_TEXT_TRANSFORM_UPPERCASE, "uppercase" }, { &GTK_CSS_VALUE_TEXT_TRANSFORM, 1, TRUE, FALSE, GTK_CSS_TEXT_TRANSFORM_UPPERCASE, "uppercase" },
{ &GTK_CSS_VALUE_TEXT_TRANSFORM, 1, TRUE, GTK_CSS_TEXT_TRANSFORM_CAPITALIZE, "capitalize" }, { &GTK_CSS_VALUE_TEXT_TRANSFORM, 1, TRUE, FALSE, GTK_CSS_TEXT_TRANSFORM_CAPITALIZE, "capitalize" },
}; };
GtkCssValue * GtkCssValue *
+19 -25
View File
@@ -307,55 +307,53 @@ gtk_css_value_filter_free (GtkCssValue *value)
/* returns TRUE if dest == src */ /* returns TRUE if dest == src */
static gboolean static gboolean
gtk_css_filter_compute (GtkCssFilter *dest, gtk_css_filter_compute (GtkCssFilter *dest,
GtkCssFilter *src, GtkCssFilter *src,
guint property_id, guint property_id,
GtkStyleProvider *provider, GtkCssComputeContext *context)
GtkCssStyle *style,
GtkCssStyle *parent_style)
{ {
dest->type = src->type; dest->type = src->type;
switch (src->type) switch (src->type)
{ {
case GTK_CSS_FILTER_BRIGHTNESS: case GTK_CSS_FILTER_BRIGHTNESS:
dest->brightness.value = _gtk_css_value_compute (src->brightness.value, property_id, provider, style, parent_style); dest->brightness.value = _gtk_css_value_compute (src->brightness.value, property_id, context);
return dest->brightness.value == src->brightness.value; return dest->brightness.value == src->brightness.value;
case GTK_CSS_FILTER_CONTRAST: case GTK_CSS_FILTER_CONTRAST:
dest->contrast.value = _gtk_css_value_compute (src->contrast.value, property_id, provider, style, parent_style); dest->contrast.value = _gtk_css_value_compute (src->contrast.value, property_id, context);
return dest->contrast.value == src->contrast.value; return dest->contrast.value == src->contrast.value;
case GTK_CSS_FILTER_GRAYSCALE: case GTK_CSS_FILTER_GRAYSCALE:
dest->grayscale.value = _gtk_css_value_compute (src->grayscale.value, property_id, provider, style, parent_style); dest->grayscale.value = _gtk_css_value_compute (src->grayscale.value, property_id, context);
return dest->grayscale.value == src->grayscale.value; return dest->grayscale.value == src->grayscale.value;
case GTK_CSS_FILTER_HUE_ROTATE: case GTK_CSS_FILTER_HUE_ROTATE:
dest->hue_rotate.value = _gtk_css_value_compute (src->hue_rotate.value, property_id, provider, style, parent_style); dest->hue_rotate.value = _gtk_css_value_compute (src->hue_rotate.value, property_id, context);
return dest->hue_rotate.value == src->hue_rotate.value; return dest->hue_rotate.value == src->hue_rotate.value;
case GTK_CSS_FILTER_INVERT: case GTK_CSS_FILTER_INVERT:
dest->invert.value = _gtk_css_value_compute (src->invert.value, property_id, provider, style, parent_style); dest->invert.value = _gtk_css_value_compute (src->invert.value, property_id, context);
return dest->invert.value == src->invert.value; return dest->invert.value == src->invert.value;
case GTK_CSS_FILTER_OPACITY: case GTK_CSS_FILTER_OPACITY:
dest->opacity.value = _gtk_css_value_compute (src->opacity.value, property_id, provider, style, parent_style); dest->opacity.value = _gtk_css_value_compute (src->opacity.value, property_id, context);
return dest->opacity.value == src->opacity.value; return dest->opacity.value == src->opacity.value;
case GTK_CSS_FILTER_SATURATE: case GTK_CSS_FILTER_SATURATE:
dest->saturate.value = _gtk_css_value_compute (src->saturate.value, property_id, provider, style, parent_style); dest->saturate.value = _gtk_css_value_compute (src->saturate.value, property_id, context);
return dest->saturate.value == src->saturate.value; return dest->saturate.value == src->saturate.value;
case GTK_CSS_FILTER_SEPIA: case GTK_CSS_FILTER_SEPIA:
dest->sepia.value = _gtk_css_value_compute (src->sepia.value, property_id, provider, style, parent_style); dest->sepia.value = _gtk_css_value_compute (src->sepia.value, property_id, context);
return dest->sepia.value == src->sepia.value; return dest->sepia.value == src->sepia.value;
case GTK_CSS_FILTER_BLUR: case GTK_CSS_FILTER_BLUR:
dest->blur.value = _gtk_css_value_compute (src->blur.value, property_id, provider, style, parent_style); dest->blur.value = _gtk_css_value_compute (src->blur.value, property_id, context);
return dest->blur.value == src->blur.value; return dest->blur.value == src->blur.value;
case GTK_CSS_FILTER_DROP_SHADOW: case GTK_CSS_FILTER_DROP_SHADOW:
dest->drop_shadow.value = _gtk_css_value_compute (src->drop_shadow.value, property_id, provider, style, parent_style); dest->drop_shadow.value = _gtk_css_value_compute (src->drop_shadow.value, property_id, context);
return dest->drop_shadow.value == src->drop_shadow.value; return dest->drop_shadow.value == src->drop_shadow.value;
case GTK_CSS_FILTER_NONE: case GTK_CSS_FILTER_NONE:
@@ -366,11 +364,9 @@ gtk_css_filter_compute (GtkCssFilter *dest,
} }
static GtkCssValue * static GtkCssValue *
gtk_css_value_filter_compute (GtkCssValue *value, gtk_css_value_filter_compute (GtkCssValue *value,
guint property_id, guint property_id,
GtkStyleProvider *provider, GtkCssComputeContext *context)
GtkCssStyle *style,
GtkCssStyle *parent_style)
{ {
GtkCssValue *result; GtkCssValue *result;
gboolean changes; gboolean changes;
@@ -388,9 +384,7 @@ gtk_css_value_filter_compute (GtkCssValue *value,
changes |= !gtk_css_filter_compute (&result->filters[i], changes |= !gtk_css_filter_compute (&result->filters[i],
&value->filters[i], &value->filters[i],
property_id, property_id,
provider, context);
style,
parent_style);
} }
if (!changes) if (!changes)
@@ -723,7 +717,7 @@ static const GtkCssValueClass GTK_CSS_VALUE_FILTER = {
gtk_css_value_filter_print gtk_css_value_filter_print
}; };
static GtkCssValue filter_none_singleton = { &GTK_CSS_VALUE_FILTER, 1, TRUE, 0, { { GTK_CSS_FILTER_NONE } } }; static GtkCssValue filter_none_singleton = { &GTK_CSS_VALUE_FILTER, 1, TRUE, FALSE, 0, { { GTK_CSS_FILTER_NONE } } };
static GtkCssValue * static GtkCssValue *
gtk_css_filter_value_alloc (guint n_filters) gtk_css_filter_value_alloc (guint n_filters)
+3 -5
View File
@@ -53,11 +53,9 @@ gtk_css_value_font_features_free (GtkCssValue *value)
} }
static GtkCssValue * static GtkCssValue *
gtk_css_value_font_features_compute (GtkCssValue *specified, gtk_css_value_font_features_compute (GtkCssValue *specified,
guint property_id, guint property_id,
GtkStyleProvider *provider, GtkCssComputeContext *context)
GtkCssStyle *style,
GtkCssStyle *parent_style)
{ {
return _gtk_css_value_ref (specified); return _gtk_css_value_ref (specified);
} }
+3 -5
View File
@@ -52,11 +52,9 @@ gtk_css_value_font_variations_free (GtkCssValue *value)
} }
static GtkCssValue * static GtkCssValue *
gtk_css_value_font_variations_compute (GtkCssValue *specified, gtk_css_value_font_variations_compute (GtkCssValue *specified,
guint property_id, guint property_id,
GtkStyleProvider *provider, GtkCssComputeContext *context)
GtkCssStyle *style,
GtkCssStyle *parent_style)
{ {
return _gtk_css_value_ref (specified); return _gtk_css_value_ref (specified);
} }
+9 -13
View File
@@ -65,11 +65,9 @@ gtk_css_image_real_get_aspect_ratio (GtkCssImage *image)
} }
static GtkCssImage * static GtkCssImage *
gtk_css_image_real_compute (GtkCssImage *image, gtk_css_image_real_compute (GtkCssImage *image,
guint property_id, guint property_id,
GtkStyleProvider *provider, GtkCssComputeContext *context)
GtkCssStyle *style,
GtkCssStyle *parent_style)
{ {
return g_object_ref (image); return g_object_ref (image);
} }
@@ -173,21 +171,19 @@ _gtk_css_image_get_aspect_ratio (GtkCssImage *image)
} }
GtkCssImage * GtkCssImage *
_gtk_css_image_compute (GtkCssImage *image, _gtk_css_image_compute (GtkCssImage *image,
guint property_id, guint property_id,
GtkStyleProvider *provider, GtkCssComputeContext *context)
GtkCssStyle *style,
GtkCssStyle *parent_style)
{ {
GtkCssImageClass *klass; GtkCssImageClass *klass;
gtk_internal_return_val_if_fail (GTK_IS_CSS_IMAGE (image), NULL); gtk_internal_return_val_if_fail (GTK_IS_CSS_IMAGE (image), NULL);
gtk_internal_return_val_if_fail (GTK_IS_CSS_STYLE (style), NULL); gtk_internal_return_val_if_fail (GTK_IS_CSS_STYLE (context->style), NULL);
gtk_internal_return_val_if_fail (parent_style == NULL || GTK_IS_CSS_STYLE (parent_style), NULL); gtk_internal_return_val_if_fail (context->parent_style == NULL || GTK_IS_CSS_STYLE (context->parent_style), NULL);
klass = GTK_CSS_IMAGE_GET_CLASS (image); klass = GTK_CSS_IMAGE_GET_CLASS (image);
return klass->compute (image, property_id, provider, style, parent_style); return klass->compute (image, property_id, context);
} }
GtkCssImage * GtkCssImage *
+7 -9
View File
@@ -313,11 +313,9 @@ gtk_css_image_conic_print (GtkCssImage *image,
} }
static GtkCssImage * static GtkCssImage *
gtk_css_image_conic_compute (GtkCssImage *image, gtk_css_image_conic_compute (GtkCssImage *image,
guint property_id, guint property_id,
GtkStyleProvider *provider, GtkCssComputeContext *context)
GtkCssStyle *style,
GtkCssStyle *parent_style)
{ {
GtkCssImageConic *self = GTK_CSS_IMAGE_CONIC (image); GtkCssImageConic *self = GTK_CSS_IMAGE_CONIC (image);
GtkCssImageConic *copy; GtkCssImageConic *copy;
@@ -325,8 +323,8 @@ gtk_css_image_conic_compute (GtkCssImage *image,
copy = g_object_new (GTK_TYPE_CSS_IMAGE_CONIC, NULL); copy = g_object_new (GTK_TYPE_CSS_IMAGE_CONIC, NULL);
copy->center = _gtk_css_value_compute (self->center, property_id, provider, style, parent_style); copy->center = _gtk_css_value_compute (self->center, property_id, context);
copy->rotation = _gtk_css_value_compute (self->rotation, property_id, provider, style, parent_style); copy->rotation = _gtk_css_value_compute (self->rotation, property_id, context);
copy->n_stops = self->n_stops; copy->n_stops = self->n_stops;
copy->color_stops = g_malloc (sizeof (GtkCssImageConicColorStop) * copy->n_stops); copy->color_stops = g_malloc (sizeof (GtkCssImageConicColorStop) * copy->n_stops);
@@ -335,11 +333,11 @@ gtk_css_image_conic_compute (GtkCssImage *image,
const GtkCssImageConicColorStop *stop = &self->color_stops[i]; const GtkCssImageConicColorStop *stop = &self->color_stops[i];
GtkCssImageConicColorStop *scopy = &copy->color_stops[i]; GtkCssImageConicColorStop *scopy = &copy->color_stops[i];
scopy->color = _gtk_css_value_compute (stop->color, property_id, provider, style, parent_style); scopy->color = _gtk_css_value_compute (stop->color, property_id, context);
if (stop->offset) if (stop->offset)
{ {
scopy->offset = _gtk_css_value_compute (stop->offset, property_id, provider, style, parent_style); scopy->offset = _gtk_css_value_compute (stop->offset, property_id, context);
} }
else else
{ {
+4 -6
View File
@@ -399,11 +399,9 @@ gtk_css_image_cross_fade_print (GtkCssImage *image,
} }
static GtkCssImage * static GtkCssImage *
gtk_css_image_cross_fade_compute (GtkCssImage *image, gtk_css_image_cross_fade_compute (GtkCssImage *image,
guint property_id, guint property_id,
GtkStyleProvider *provider, GtkCssComputeContext *context)
GtkCssStyle *style,
GtkCssStyle *parent_style)
{ {
GtkCssImageCrossFade *self = GTK_CSS_IMAGE_CROSS_FADE (image); GtkCssImageCrossFade *self = GTK_CSS_IMAGE_CROSS_FADE (image);
GtkCssImageCrossFade *result; GtkCssImageCrossFade *result;
@@ -418,7 +416,7 @@ gtk_css_image_cross_fade_compute (GtkCssImage *image,
gtk_css_image_cross_fade_add (result, gtk_css_image_cross_fade_add (result,
entry->has_progress, entry->has_progress,
entry->progress, entry->progress,
_gtk_css_image_compute (entry->image, property_id, provider, style, parent_style)); _gtk_css_image_compute (entry->image, property_id, context));
} }
return GTK_CSS_IMAGE (result); return GTK_CSS_IMAGE (result);
+5 -11
View File
@@ -133,11 +133,9 @@ gtk_css_image_fallback_dispose (GObject *object)
static GtkCssImage * static GtkCssImage *
gtk_css_image_fallback_compute (GtkCssImage *image, gtk_css_image_fallback_compute (GtkCssImage *image,
guint property_id, guint property_id,
GtkStyleProvider *provider, GtkCssComputeContext *context)
GtkCssStyle *style,
GtkCssStyle *parent_style)
{ {
GtkCssImageFallback *fallback = GTK_CSS_IMAGE_FALLBACK (image); GtkCssImageFallback *fallback = GTK_CSS_IMAGE_FALLBACK (image);
GtkCssImageFallback *copy; GtkCssImageFallback *copy;
@@ -150,9 +148,7 @@ gtk_css_image_fallback_compute (GtkCssImage *image,
if (fallback->color) if (fallback->color)
computed_color = _gtk_css_value_compute (fallback->color, computed_color = _gtk_css_value_compute (fallback->color,
property_id, property_id,
provider, context);
style,
parent_style);
/* image($color) that didn't change */ /* image($color) that didn't change */
if (computed_color && !fallback->images && if (computed_color && !fallback->images &&
@@ -166,9 +162,7 @@ gtk_css_image_fallback_compute (GtkCssImage *image,
{ {
copy->images[i] = _gtk_css_image_compute (fallback->images[i], copy->images[i] = _gtk_css_image_compute (fallback->images[i],
property_id, property_id,
provider, context);
style,
parent_style);
if (gtk_css_image_is_invalid (copy->images[i])) if (gtk_css_image_is_invalid (copy->images[i]))
continue; continue;
+6 -8
View File
@@ -138,11 +138,9 @@ gtk_css_image_icon_theme_print (GtkCssImage *image,
} }
static GtkCssImage * static GtkCssImage *
gtk_css_image_icon_theme_compute (GtkCssImage *image, gtk_css_image_icon_theme_compute (GtkCssImage *image,
guint property_id, guint property_id,
GtkStyleProvider *provider, GtkCssComputeContext *context)
GtkCssStyle *style,
GtkCssStyle *parent_style)
{ {
GtkCssImageIconTheme *icon_theme = GTK_CSS_IMAGE_ICON_THEME (image); GtkCssImageIconTheme *icon_theme = GTK_CSS_IMAGE_ICON_THEME (image);
GtkCssImageIconTheme *copy; GtkCssImageIconTheme *copy;
@@ -151,12 +149,12 @@ gtk_css_image_icon_theme_compute (GtkCssImage *image,
copy = g_object_new (GTK_TYPE_CSS_IMAGE_ICON_THEME, NULL); copy = g_object_new (GTK_TYPE_CSS_IMAGE_ICON_THEME, NULL);
copy->name = g_strdup (icon_theme->name); copy->name = g_strdup (icon_theme->name);
settings = gtk_style_provider_get_settings (provider); settings = gtk_style_provider_get_settings (context->provider);
display = _gtk_settings_get_display (settings); display = _gtk_settings_get_display (settings);
copy->icon_theme = gtk_icon_theme_get_for_display (display); copy->icon_theme = gtk_icon_theme_get_for_display (display);
copy->serial = gtk_icon_theme_get_serial (copy->icon_theme); copy->serial = gtk_icon_theme_get_serial (copy->icon_theme);
copy->scale = gtk_style_provider_get_scale (provider); copy->scale = gtk_style_provider_get_scale (context->provider);
gtk_css_style_lookup_symbolic_colors (style, copy->colors); gtk_css_style_lookup_symbolic_colors (context->style, copy->colors);
return GTK_CSS_IMAGE (copy); return GTK_CSS_IMAGE (copy);
} }
+6 -8
View File
@@ -488,11 +488,9 @@ gtk_css_image_linear_print (GtkCssImage *image,
} }
static GtkCssImage * static GtkCssImage *
gtk_css_image_linear_compute (GtkCssImage *image, gtk_css_image_linear_compute (GtkCssImage *image,
guint property_id, guint property_id,
GtkStyleProvider *provider, GtkCssComputeContext *context)
GtkCssStyle *style,
GtkCssStyle *parent_style)
{ {
GtkCssImageLinear *linear = GTK_CSS_IMAGE_LINEAR (image); GtkCssImageLinear *linear = GTK_CSS_IMAGE_LINEAR (image);
GtkCssImageLinear *copy; GtkCssImageLinear *copy;
@@ -503,7 +501,7 @@ gtk_css_image_linear_compute (GtkCssImage *image,
copy->side = linear->side; copy->side = linear->side;
if (linear->angle) if (linear->angle)
copy->angle = _gtk_css_value_compute (linear->angle, property_id, provider, style, parent_style); copy->angle = _gtk_css_value_compute (linear->angle, property_id, context);
copy->n_stops = linear->n_stops; copy->n_stops = linear->n_stops;
copy->color_stops = g_malloc (sizeof (GtkCssImageLinearColorStop) * copy->n_stops); copy->color_stops = g_malloc (sizeof (GtkCssImageLinearColorStop) * copy->n_stops);
@@ -512,11 +510,11 @@ gtk_css_image_linear_compute (GtkCssImage *image,
const GtkCssImageLinearColorStop *stop = &linear->color_stops[i]; const GtkCssImageLinearColorStop *stop = &linear->color_stops[i];
GtkCssImageLinearColorStop *scopy = &copy->color_stops[i]; GtkCssImageLinearColorStop *scopy = &copy->color_stops[i];
scopy->color = _gtk_css_value_compute (stop->color, property_id, provider, style, parent_style); scopy->color = _gtk_css_value_compute (stop->color, property_id, context);
if (stop->offset) if (stop->offset)
{ {
scopy->offset = _gtk_css_value_compute (stop->offset, property_id, provider, style, parent_style); scopy->offset = _gtk_css_value_compute (stop->offset, property_id, context);
} }
else else
{ {
+4 -5
View File
@@ -20,6 +20,7 @@
#include "config.h" #include "config.h"
#include "gtkcssimagepaintableprivate.h" #include "gtkcssimagepaintableprivate.h"
#include "gtkcssvalueprivate.h"
#include "gtkprivate.h" #include "gtkprivate.h"
@@ -96,11 +97,9 @@ gtk_css_image_paintable_get_static_image (GtkCssImage *image)
} }
static GtkCssImage * static GtkCssImage *
gtk_css_image_paintable_compute (GtkCssImage *image, gtk_css_image_paintable_compute (GtkCssImage *image,
guint property_id, guint property_id,
GtkStyleProvider *provider, GtkCssComputeContext *context)
GtkCssStyle *style,
GtkCssStyle *parent_style)
{ {
return gtk_css_image_paintable_get_static_image (image); return gtk_css_image_paintable_get_static_image (image);
} }
+4 -6
View File
@@ -26,6 +26,8 @@
#include "gtk/css/gtkcsstokenizerprivate.h" #include "gtk/css/gtkcsstokenizerprivate.h"
#include "gtk/css/gtkcssparserprivate.h" #include "gtk/css/gtkcssparserprivate.h"
#include "gtk/gtkcsstypesprivate.h" #include "gtk/gtkcsstypesprivate.h"
#include "gtk/gtkcssvariablesetprivate.h"
#include "gtk/gtkcssvalueprivate.h"
#include "gtk/gtksnapshot.h" #include "gtk/gtksnapshot.h"
#include "gtk/gtkstyleprovider.h" #include "gtk/gtkstyleprovider.h"
@@ -60,9 +62,7 @@ struct _GtkCssImageClass
/* create "computed value" in CSS terms, returns a new reference */ /* create "computed value" in CSS terms, returns a new reference */
GtkCssImage *(* compute) (GtkCssImage *image, GtkCssImage *(* compute) (GtkCssImage *image,
guint property_id, guint property_id,
GtkStyleProvider *provider, GtkCssComputeContext *context);
GtkCssStyle *style,
GtkCssStyle *parent_style);
/* compare two images for equality */ /* compare two images for equality */
gboolean (* equal) (GtkCssImage *image1, gboolean (* equal) (GtkCssImage *image1,
GtkCssImage *image2); GtkCssImage *image2);
@@ -104,9 +104,7 @@ double _gtk_css_image_get_aspect_ratio (GtkCssImage *
GtkCssImage * _gtk_css_image_compute (GtkCssImage *image, GtkCssImage * _gtk_css_image_compute (GtkCssImage *image,
guint property_id, guint property_id,
GtkStyleProvider *provider, GtkCssComputeContext *context);
GtkCssStyle *style,
GtkCssStyle *parent_style);
gboolean _gtk_css_image_equal (GtkCssImage *image1, gboolean _gtk_css_image_equal (GtkCssImage *image1,
GtkCssImage *image2) G_GNUC_PURE; GtkCssImage *image2) G_GNUC_PURE;
GtkCssImage * _gtk_css_image_transition (GtkCssImage *start, GtkCssImage * _gtk_css_image_transition (GtkCssImage *start,
+8 -10
View File
@@ -489,11 +489,9 @@ gtk_css_image_radial_print (GtkCssImage *image,
} }
static GtkCssImage * static GtkCssImage *
gtk_css_image_radial_compute (GtkCssImage *image, gtk_css_image_radial_compute (GtkCssImage *image,
guint property_id, guint property_id,
GtkStyleProvider *provider, GtkCssComputeContext *context)
GtkCssStyle *style,
GtkCssStyle *parent_style)
{ {
GtkCssImageRadial *radial = GTK_CSS_IMAGE_RADIAL (image); GtkCssImageRadial *radial = GTK_CSS_IMAGE_RADIAL (image);
GtkCssImageRadial *copy; GtkCssImageRadial *copy;
@@ -504,13 +502,13 @@ gtk_css_image_radial_compute (GtkCssImage *image,
copy->circle = radial->circle; copy->circle = radial->circle;
copy->size = radial->size; copy->size = radial->size;
copy->position = _gtk_css_value_compute (radial->position, property_id, provider, style, parent_style); copy->position = _gtk_css_value_compute (radial->position, property_id, context);
if (radial->sizes[0]) if (radial->sizes[0])
copy->sizes[0] = _gtk_css_value_compute (radial->sizes[0], property_id, provider, style, parent_style); copy->sizes[0] = _gtk_css_value_compute (radial->sizes[0], property_id, context);
if (radial->sizes[1]) if (radial->sizes[1])
copy->sizes[1] = _gtk_css_value_compute (radial->sizes[1], property_id, provider, style, parent_style); copy->sizes[1] = _gtk_css_value_compute (radial->sizes[1], property_id, context);
copy->n_stops = radial->n_stops; copy->n_stops = radial->n_stops;
copy->color_stops = g_malloc (sizeof (GtkCssImageRadialColorStop) * copy->n_stops); copy->color_stops = g_malloc (sizeof (GtkCssImageRadialColorStop) * copy->n_stops);
@@ -519,11 +517,11 @@ gtk_css_image_radial_compute (GtkCssImage *image,
const GtkCssImageRadialColorStop *stop = &radial->color_stops[i]; const GtkCssImageRadialColorStop *stop = &radial->color_stops[i];
GtkCssImageRadialColorStop *scopy = &copy->color_stops[i]; GtkCssImageRadialColorStop *scopy = &copy->color_stops[i];
scopy->color = _gtk_css_value_compute (stop->color, property_id, provider, style, parent_style); scopy->color = _gtk_css_value_compute (stop->color, property_id, context);
if (stop->offset) if (stop->offset)
{ {
scopy->offset = _gtk_css_value_compute (stop->offset, property_id, provider, style, parent_style); scopy->offset = _gtk_css_value_compute (stop->offset, property_id, context);
} }
else else
{ {
+9 -11
View File
@@ -201,11 +201,9 @@ gtk_css_image_recolor_snapshot (GtkCssImage *image,
} }
static GtkCssImage * static GtkCssImage *
gtk_css_image_recolor_compute (GtkCssImage *image, gtk_css_image_recolor_compute (GtkCssImage *image,
guint property_id, guint property_id,
GtkStyleProvider *provider, GtkCssComputeContext *context)
GtkCssStyle *style,
GtkCssStyle *parent_style)
{ {
GtkCssImageRecolor *recolor = GTK_CSS_IMAGE_RECOLOR (image); GtkCssImageRecolor *recolor = GTK_CSS_IMAGE_RECOLOR (image);
GtkCssValue *palette; GtkCssValue *palette;
@@ -213,19 +211,19 @@ gtk_css_image_recolor_compute (GtkCssImage *image,
int scale; int scale;
GError *error = NULL; GError *error = NULL;
scale = gtk_style_provider_get_scale (provider); scale = gtk_style_provider_get_scale (context->provider);
if (recolor->palette) if (recolor->palette)
palette = _gtk_css_value_compute (recolor->palette, property_id, provider, style, parent_style); palette = _gtk_css_value_compute (recolor->palette, property_id, context);
else else
palette = _gtk_css_value_ref (style->core->icon_palette); palette = _gtk_css_value_ref (context->style->core->icon_palette);
img = gtk_css_image_recolor_load (recolor, style, palette, scale, &error); img = gtk_css_image_recolor_load (recolor, context->style, palette, scale, &error);
if (error) if (error)
{ {
GtkCssSection *section = gtk_css_style_get_section (style, property_id); GtkCssSection *section = gtk_css_style_get_section (context->style, property_id);
gtk_style_provider_emit_error (provider, section, error); gtk_style_provider_emit_error (context->provider, section, error);
g_error_free (error); g_error_free (error);
} }
+5 -9
View File
@@ -97,11 +97,9 @@ gtk_css_image_scaled_dispose (GObject *object)
static GtkCssImage * static GtkCssImage *
gtk_css_image_scaled_compute (GtkCssImage *image, gtk_css_image_scaled_compute (GtkCssImage *image,
guint property_id, guint property_id,
GtkStyleProvider *provider, GtkCssComputeContext *context)
GtkCssStyle *style,
GtkCssStyle *parent_style)
{ {
GtkCssImageScaled *scaled = GTK_CSS_IMAGE_SCALED (image); GtkCssImageScaled *scaled = GTK_CSS_IMAGE_SCALED (image);
int scale; int scale;
@@ -109,7 +107,7 @@ gtk_css_image_scaled_compute (GtkCssImage *image,
int i; int i;
int best; int best;
scale = gtk_style_provider_get_scale (provider); scale = gtk_style_provider_get_scale (context->provider);
scale = MAX(scale, 1); scale = MAX(scale, 1);
best = 0; best = 0;
@@ -135,9 +133,7 @@ gtk_css_image_scaled_compute (GtkCssImage *image,
res->images[0] = _gtk_css_image_compute (scaled->images[best], res->images[0] = _gtk_css_image_compute (scaled->images[best],
property_id, property_id,
provider, context);
style,
parent_style);
res->scales[0] = scaled->scales[best]; res->scales[0] = scaled->scales[best];
return GTK_CSS_IMAGE (res); return GTK_CSS_IMAGE (res);
+5 -7
View File
@@ -112,11 +112,9 @@ gtk_css_image_url_snapshot (GtkCssImage *image,
} }
static GtkCssImage * static GtkCssImage *
gtk_css_image_url_compute (GtkCssImage *image, gtk_css_image_url_compute (GtkCssImage *image,
guint property_id, guint property_id,
GtkStyleProvider *provider, GtkCssComputeContext *context)
GtkCssStyle *style,
GtkCssStyle *parent_style)
{ {
GtkCssImageUrl *url = GTK_CSS_IMAGE_URL (image); GtkCssImageUrl *url = GTK_CSS_IMAGE_URL (image);
GtkCssImage *copy; GtkCssImage *copy;
@@ -125,8 +123,8 @@ gtk_css_image_url_compute (GtkCssImage *image,
copy = gtk_css_image_url_load_image (url, &error); copy = gtk_css_image_url_load_image (url, &error);
if (error) if (error)
{ {
GtkCssSection *section = gtk_css_style_get_section (style, property_id); GtkCssSection *section = gtk_css_style_get_section (context->style, property_id);
gtk_style_provider_emit_error (provider, section, error); gtk_style_provider_emit_error (context->provider, section, error);
g_error_free (error); g_error_free (error);
} }
+5 -7
View File
@@ -34,11 +34,9 @@ gtk_css_value_image_free (GtkCssValue *value)
} }
static GtkCssValue * static GtkCssValue *
gtk_css_value_image_compute (GtkCssValue *value, gtk_css_value_image_compute (GtkCssValue *value,
guint property_id, guint property_id,
GtkStyleProvider *provider, GtkCssComputeContext *context)
GtkCssStyle *style,
GtkCssStyle *parent_style)
{ {
GtkCssImage *image, *computed; GtkCssImage *image, *computed;
@@ -47,7 +45,7 @@ gtk_css_value_image_compute (GtkCssValue *value,
if (image == NULL) if (image == NULL)
return _gtk_css_value_ref (value); return _gtk_css_value_ref (value);
computed = _gtk_css_image_compute (image, property_id, provider, style, parent_style); computed = _gtk_css_image_compute (image, property_id, context);
if (computed == image) if (computed == image)
{ {
@@ -136,7 +134,7 @@ static const GtkCssValueClass GTK_CSS_VALUE_IMAGE = {
GtkCssValue * GtkCssValue *
_gtk_css_image_value_new (GtkCssImage *image) _gtk_css_image_value_new (GtkCssImage *image)
{ {
static GtkCssValue image_none_singleton = { &GTK_CSS_VALUE_IMAGE, 1, TRUE, NULL }; static GtkCssValue image_none_singleton = { &GTK_CSS_VALUE_IMAGE, 1, TRUE, FALSE, NULL };
GtkCssValue *value; GtkCssValue *value;
if (image == NULL) if (image == NULL)
+6 -10
View File
@@ -34,23 +34,19 @@ gtk_css_value_inherit_free (GtkCssValue *value)
} }
static GtkCssValue * static GtkCssValue *
gtk_css_value_inherit_compute (GtkCssValue *value, gtk_css_value_inherit_compute (GtkCssValue *value,
guint property_id, guint property_id,
GtkStyleProvider *provider, GtkCssComputeContext *context)
GtkCssStyle *style,
GtkCssStyle *parent_style)
{ {
if (parent_style) if (context->parent_style)
{ {
return _gtk_css_value_ref (gtk_css_style_get_value (parent_style, property_id)); return _gtk_css_value_ref (gtk_css_style_get_value (context->parent_style, property_id));
} }
else else
{ {
return _gtk_css_value_compute (_gtk_css_initial_value_get (), return _gtk_css_value_compute (_gtk_css_initial_value_get (),
property_id, property_id,
provider, context);
style,
parent_style);
} }
} }
+9 -17
View File
@@ -38,18 +38,16 @@ gtk_css_value_initial_free (GtkCssValue *value)
} }
static GtkCssValue * static GtkCssValue *
gtk_css_value_initial_compute (GtkCssValue *value, gtk_css_value_initial_compute (GtkCssValue *value,
guint property_id, guint property_id,
GtkStyleProvider *provider, GtkCssComputeContext *context)
GtkCssStyle *style,
GtkCssStyle *parent_style)
{ {
GtkSettings *settings; GtkSettings *settings;
switch (property_id) switch (property_id)
{ {
case GTK_CSS_PROPERTY_DPI: case GTK_CSS_PROPERTY_DPI:
settings = gtk_style_provider_get_settings (provider); settings = gtk_style_provider_get_settings (context->provider);
if (settings) if (settings)
{ {
int dpi_int; int dpi_int;
@@ -62,7 +60,7 @@ gtk_css_value_initial_compute (GtkCssValue *value,
break; break;
case GTK_CSS_PROPERTY_FONT_FAMILY: case GTK_CSS_PROPERTY_FONT_FAMILY:
settings = gtk_style_provider_get_settings (provider); settings = gtk_style_provider_get_settings (context->provider);
if (settings && gtk_settings_get_font_family (settings) != NULL) if (settings && gtk_settings_get_font_family (settings) != NULL)
return _gtk_css_array_value_new (_gtk_css_string_value_new (gtk_settings_get_font_family (settings))); return _gtk_css_array_value_new (_gtk_css_string_value_new (gtk_settings_get_font_family (settings)));
break; break;
@@ -73,9 +71,7 @@ gtk_css_value_initial_compute (GtkCssValue *value,
return _gtk_css_value_compute (_gtk_css_style_property_get_initial_value (_gtk_css_style_property_lookup_by_id (property_id)), return _gtk_css_value_compute (_gtk_css_style_property_get_initial_value (_gtk_css_style_property_lookup_by_id (property_id)),
property_id, property_id,
provider, context);
style,
parent_style);
} }
static gboolean static gboolean
@@ -126,14 +122,10 @@ _gtk_css_initial_value_get (void)
return &initial; return &initial;
} }
GtkCssValue * GtkCssValue *
_gtk_css_initial_value_new_compute (guint property_id, _gtk_css_initial_value_new_compute (guint property_id,
GtkStyleProvider *provider, GtkCssComputeContext *context)
GtkCssStyle *style,
GtkCssStyle *parent_style)
{ {
return gtk_css_value_initial_compute (NULL, return gtk_css_value_initial_compute (NULL,
property_id, property_id,
provider, context);
style,
parent_style);
} }
+2 -4
View File
@@ -25,10 +25,8 @@ G_BEGIN_DECLS
GtkCssValue * _gtk_css_initial_value_new (void); GtkCssValue * _gtk_css_initial_value_new (void);
GtkCssValue * _gtk_css_initial_value_get (void); GtkCssValue * _gtk_css_initial_value_get (void);
GtkCssValue * _gtk_css_initial_value_new_compute (guint property_id, GtkCssValue * _gtk_css_initial_value_new_compute (guint property_id,
GtkStyleProvider *provider, GtkCssComputeContext *context);
GtkCssStyle *style,
GtkCssStyle *parent_style);
G_END_DECLS G_END_DECLS
+294 -13
View File
@@ -21,6 +21,8 @@
#include "gtkcssstyleprivate.h" #include "gtkcssstyleprivate.h"
#include "gtkcssarrayvalueprivate.h" #include "gtkcssarrayvalueprivate.h"
#include "gtkcsscustompropertypoolprivate.h"
#include "gtkcssreferencevalueprivate.h"
#include "gtkcssshorthandpropertyprivate.h" #include "gtkcssshorthandpropertyprivate.h"
#include "gtkcssstylepropertyprivate.h" #include "gtkcssstylepropertyprivate.h"
#include "gtkstylepropertyprivate.h" #include "gtkstylepropertyprivate.h"
@@ -31,12 +33,15 @@
#include <string.h> #include <string.h>
struct _GtkCssKeyframes { struct _GtkCssKeyframes {
int ref_count; /* ref count */ int ref_count; /* ref count */
int n_keyframes; /* number of keyframes (at least 2 for 0% and 100% */ int n_keyframes; /* number of keyframes (at least 2 for 0% and 100% */
double *keyframe_progress; /* ordered array of n_keyframes of [0..1] */ double *keyframe_progress; /* ordered array of n_keyframes of [0..1] */
int n_properties; /* number of properties used by keyframes */ int n_properties; /* number of properties used by keyframes */
guint *property_ids; /* ordered array of n_properties property ids */ guint *property_ids; /* ordered array of n_properties property ids */
GtkCssValue **values; /* 2D array: n_keyframes * n_properties of (value or NULL) for all the keyframes */ GtkCssValue **values; /* 2D array: n_keyframes * n_properties of (value or NULL) for all the keyframes */
GtkCssVariableSet **variables; /* array of variable sets for each keyframe */
int *variable_ids; /* ordered array of variable ids */
int n_variables; /* number of variable used by keyframes */
}; };
#define KEYFRAMES_VALUE(keyframes, k, p) ((keyframes)->values[(k) * (keyframes)->n_properties + (p)]) #define KEYFRAMES_VALUE(keyframes, k, p) ((keyframes)->values[(k) * (keyframes)->n_properties + (p)])
@@ -72,8 +77,13 @@ _gtk_css_keyframes_unref (GtkCssKeyframes *keyframes)
_gtk_css_value_unref (KEYFRAMES_VALUE (keyframes, k, p)); _gtk_css_value_unref (KEYFRAMES_VALUE (keyframes, k, p));
KEYFRAMES_VALUE (keyframes, k, p) = NULL; KEYFRAMES_VALUE (keyframes, k, p) = NULL;
} }
if (keyframes->variables && keyframes->variables[k])
gtk_css_variable_set_unref (keyframes->variables[k]);
} }
g_free (keyframes->values); g_free (keyframes->values);
g_free (keyframes->variables);
g_free (keyframes->variable_ids);
g_free (keyframes); g_free (keyframes);
} }
@@ -120,6 +130,9 @@ gtk_css_keyframes_add_keyframe (GtkCssKeyframes *keyframes,
memset (&KEYFRAMES_VALUE (keyframes, k, 0), 0, size); memset (&KEYFRAMES_VALUE (keyframes, k, 0), 0, size);
} }
if (keyframes->variables)
keyframes->variables = g_realloc (keyframes->variables, sizeof (GtkCssVariableSet *) * keyframes->n_keyframes);
return k; return k;
} }
@@ -173,6 +186,26 @@ gtk_css_keyframes_lookup_property (GtkCssKeyframes *keyframes,
return p; return p;
} }
static void
gtk_css_keyframes_register_variable (GtkCssKeyframes *keyframes,
int variable_id)
{
guint p;
for (p = 0; p < keyframes->n_variables; p++)
{
if (keyframes->variable_ids[p] == variable_id)
return;
else if (keyframes->variable_ids[p] > variable_id)
break;
}
keyframes->n_variables++;
keyframes->variable_ids = g_realloc (keyframes->variable_ids, sizeof (int) * keyframes->n_variables);
memmove (keyframes->variable_ids + p + 1, keyframes->variable_ids + p, sizeof (int) * (keyframes->n_variables - p - 1));
keyframes->variable_ids[p] = variable_id;
}
static GtkCssKeyframes * static GtkCssKeyframes *
gtk_css_keyframes_alloc (void) gtk_css_keyframes_alloc (void)
{ {
@@ -235,6 +268,47 @@ gtk_css_keyframes_parse_declaration (GtkCssKeyframes *keyframes,
return FALSE; return FALSE;
} }
/* This is a custom property */
if (name[0] == '-' && name[1] == '-')
{
GtkCssVariableValue *var_value;
GtkCssCustomPropertyPool *pool;
int id;
if (!gtk_css_parser_try_token (parser, GTK_CSS_TOKEN_COLON))
{
gtk_css_parser_error_syntax (parser, "Expected a ':'");
g_free (name);
return FALSE;
}
var_value = gtk_css_parser_parse_value_into_token_stream (parser);
if (var_value == NULL)
{
g_free (name);
return FALSE;
}
if (!keyframes->variables)
keyframes->variables = g_new0 (GtkCssVariableSet *, keyframes->n_keyframes);
if (!keyframes->variables[k])
keyframes->variables[k] = gtk_css_variable_set_new ();
pool = gtk_css_custom_property_pool_get ();
id = gtk_css_custom_property_pool_add (pool, name);
gtk_css_keyframes_register_variable (keyframes, id);
gtk_css_variable_value_taint (var_value);
gtk_css_variable_set_add (keyframes->variables[k], id, var_value);
gtk_css_custom_property_pool_unref (pool, id);
g_free (name);
return TRUE;
}
property = _gtk_style_property_lookup (name); property = _gtk_style_property_lookup (name);
if (property == NULL) if (property == NULL)
{ {
@@ -251,9 +325,53 @@ gtk_css_keyframes_parse_declaration (GtkCssKeyframes *keyframes,
return FALSE; return FALSE;
} }
value = _gtk_style_property_parse_value (property, parser); if (gtk_css_parser_has_references (parser))
if (value == NULL) {
return FALSE; GtkCssVariableValue *var_value;
var_value = gtk_css_parser_parse_value_into_token_stream (parser);
if (var_value == NULL)
return FALSE;
if (GTK_IS_CSS_SHORTHAND_PROPERTY (property))
{
GtkCssShorthandProperty *shorthand = GTK_CSS_SHORTHAND_PROPERTY (property);
guint i, n;
GtkCssValue **values;
n = _gtk_css_shorthand_property_get_n_subproperties (shorthand);
values = g_new (GtkCssValue *, n);
for (i = 0; i < n; i++)
{
GtkCssValue *child =
_gtk_css_reference_value_new (property,
var_value,
gtk_css_parser_get_file (parser));
_gtk_css_reference_value_set_subproperty (child, i);
values[i] = _gtk_css_array_value_get_nth (child, i);
}
value = _gtk_css_array_value_new_from_array (values, n);
g_free (values);
}
else
{
value = _gtk_css_reference_value_new (property,
var_value,
gtk_css_parser_get_file (parser));
}
gtk_css_variable_value_unref (var_value);
}
else
{
value = _gtk_style_property_parse_value (property, parser);
if (value == NULL)
return FALSE;
}
if (!gtk_css_parser_has_token (parser, GTK_CSS_TOKEN_EOF)) if (!gtk_css_parser_has_token (parser, GTK_CSS_TOKEN_EOF))
{ {
@@ -314,6 +432,9 @@ gtk_css_keyframes_parse_block (GtkCssKeyframes *keyframes,
gtk_css_parser_end_block (parser); gtk_css_parser_end_block (parser);
} }
if (keyframes->variables && keyframes->variables[k])
gtk_css_variable_set_resolve_cycles (keyframes->variables[k]);
gtk_css_parser_end_block (parser); gtk_css_parser_end_block (parser);
return TRUE; return TRUE;
@@ -378,12 +499,27 @@ compare_property_by_name (gconstpointer a,
_gtk_css_style_property_lookup_by_id (keyframes->property_ids[*(const guint *) b])))); _gtk_css_style_property_lookup_by_id (keyframes->property_ids[*(const guint *) b]))));
} }
static int
compare_custom_property_ids (gconstpointer a, gconstpointer b, gpointer user_data)
{
GtkCssCustomPropertyPool *pool = user_data;
int id1 = GPOINTER_TO_INT (*((const int *) a));
int id2 = GPOINTER_TO_INT (*((const int *) b));
const char *name1, *name2;
name1 = gtk_css_custom_property_pool_get_name (pool, id1);
name2 = gtk_css_custom_property_pool_get_name (pool, id2);
return strcmp (name1, name2);
}
void void
_gtk_css_keyframes_print (GtkCssKeyframes *keyframes, _gtk_css_keyframes_print (GtkCssKeyframes *keyframes,
GString *string) GString *string)
{ {
GtkCssCustomPropertyPool *pool = gtk_css_custom_property_pool_get ();
guint k, p; guint k, p;
guint *sorted; guint *sorted, *sorted_variable_ids = NULL;
g_return_if_fail (keyframes != NULL); g_return_if_fail (keyframes != NULL);
g_return_if_fail (string != NULL); g_return_if_fail (string != NULL);
@@ -393,6 +529,18 @@ _gtk_css_keyframes_print (GtkCssKeyframes *keyframes,
sorted[p] = p; sorted[p] = p;
g_qsort_with_data (sorted, keyframes->n_properties, sizeof (guint), compare_property_by_name, keyframes); g_qsort_with_data (sorted, keyframes->n_properties, sizeof (guint), compare_property_by_name, keyframes);
if (keyframes->variable_ids)
{
sorted_variable_ids = g_memdup2 (keyframes->variable_ids,
sizeof (int) * keyframes->n_variables);
g_qsort_with_data (sorted_variable_ids,
keyframes->n_variables,
sizeof (int),
compare_custom_property_ids,
pool);
}
for (k = 0; k < keyframes->n_keyframes; k++) for (k = 0; k < keyframes->n_keyframes; k++)
{ {
/* useful for 0% and 100% which might be empty */ /* useful for 0% and 100% which might be empty */
@@ -422,11 +570,43 @@ _gtk_css_keyframes_print (GtkCssKeyframes *keyframes,
g_string_append (string, ";\n"); g_string_append (string, ";\n");
} }
if (keyframes->variables && keyframes->variables[k])
{
for (p = 0; p < keyframes->n_variables; p++)
{
int variable_id = sorted_variable_ids[p];
GtkCssVariableValue *value =
gtk_css_variable_set_lookup (keyframes->variables[k], variable_id, NULL);
const char *name;
if (value == NULL)
continue;
if (!opened)
{
if (keyframes->keyframe_progress[k] == 0.0)
g_string_append (string, " from {\n");
else if (keyframes->keyframe_progress[k] == 1.0)
g_string_append (string, " to {\n");
else
g_string_append_printf (string, " %g%% {\n", keyframes->keyframe_progress[k] * 100);
opened = TRUE;
}
name = gtk_css_custom_property_pool_get_name (pool, variable_id);
g_string_append_printf (string, " %s: ", name);
gtk_css_variable_value_print (value, string);
g_string_append (string, ";\n");
}
}
if (opened) if (opened)
g_string_append (string, " }\n"); g_string_append (string, " }\n");
} }
g_free (sorted); g_free (sorted);
g_free (sorted_variable_ids);
} }
GtkCssKeyframes * GtkCssKeyframes *
@@ -435,6 +615,7 @@ _gtk_css_keyframes_compute (GtkCssKeyframes *keyframes,
GtkCssStyle *style, GtkCssStyle *style,
GtkCssStyle *parent_style) GtkCssStyle *parent_style)
{ {
GtkCssComputeContext context = { NULL, };
GtkCssKeyframes *resolved; GtkCssKeyframes *resolved;
guint k, p; guint k, p;
@@ -450,6 +631,10 @@ _gtk_css_keyframes_compute (GtkCssKeyframes *keyframes,
resolved->property_ids = g_memdup2 (keyframes->property_ids, keyframes->n_properties * sizeof (guint)); resolved->property_ids = g_memdup2 (keyframes->property_ids, keyframes->n_properties * sizeof (guint));
resolved->values = g_new0 (GtkCssValue *, resolved->n_keyframes * resolved->n_properties); resolved->values = g_new0 (GtkCssValue *, resolved->n_keyframes * resolved->n_properties);
context.provider = provider;
context.style = style;
context.parent_style = parent_style;
for (p = 0; p < resolved->n_properties; p++) for (p = 0; p < resolved->n_properties; p++)
{ {
for (k = 0; k < resolved->n_keyframes; k++) for (k = 0; k < resolved->n_keyframes; k++)
@@ -457,14 +642,30 @@ _gtk_css_keyframes_compute (GtkCssKeyframes *keyframes,
if (KEYFRAMES_VALUE (keyframes, k, p) == NULL) if (KEYFRAMES_VALUE (keyframes, k, p) == NULL)
continue; continue;
context.variables = keyframes->variables ? keyframes->variables[k] : NULL;
KEYFRAMES_VALUE (resolved, k, p) = _gtk_css_value_compute (KEYFRAMES_VALUE (keyframes, k, p), KEYFRAMES_VALUE (resolved, k, p) = _gtk_css_value_compute (KEYFRAMES_VALUE (keyframes, k, p),
resolved->property_ids[p], resolved->property_ids[p],
provider, &context);
style,
parent_style);
} }
} }
if (keyframes->variables)
{
resolved->variables = g_new0 (GtkCssVariableSet *, resolved->n_keyframes);
for (k = 0; k < resolved->n_keyframes; k++)
{
if (keyframes->variables[k])
resolved->variables[k] = gtk_css_variable_set_ref (keyframes->variables[k]);
}
}
else
resolved->variables = NULL;
resolved->variable_ids = g_memdup2 (keyframes->variable_ids, keyframes->n_variables * sizeof (int));
resolved->n_variables = keyframes->n_variables;
return resolved; return resolved;
} }
@@ -540,3 +741,83 @@ _gtk_css_keyframes_get_value (GtkCssKeyframes *keyframes,
return result; return result;
} }
guint
_gtk_css_keyframes_get_n_variables (GtkCssKeyframes *keyframes)
{
g_return_val_if_fail (keyframes != NULL, 0);
return keyframes->n_variables;
}
int
_gtk_css_keyframes_get_variable_id (GtkCssKeyframes *keyframes,
guint id)
{
g_return_val_if_fail (keyframes != NULL, 0);
g_return_val_if_fail (id < keyframes->n_variables, 0);
return keyframes->variable_ids[id];
}
GtkCssVariableValue *
_gtk_css_keyframes_get_variable (GtkCssKeyframes *keyframes,
guint id,
double progress,
GtkCssVariableValue *default_value)
{
GtkCssVariableValue *start_value, *end_value, *result;
double start_progress, end_progress;
int variable_id;
guint k;
g_return_val_if_fail (keyframes != NULL, 0);
g_return_val_if_fail (id < keyframes->n_variables, 0);
start_value = default_value;
start_progress = 0.0;
end_value = default_value;
end_progress = 1.0;
variable_id = keyframes->variable_ids[id];
for (k = 0; k < keyframes->n_keyframes; k++)
{
GtkCssVariableValue *value;
if (keyframes->variables[k] == NULL)
continue;
value = gtk_css_variable_set_lookup (keyframes->variables[k], variable_id, NULL);
if (value == NULL)
continue;
if (keyframes->keyframe_progress[k] == progress)
{
return gtk_css_variable_value_ref (value);
}
else if (keyframes->keyframe_progress[k] < progress)
{
start_value = value;
start_progress = keyframes->keyframe_progress[k];
}
else
{
end_value = value;
end_progress = keyframes->keyframe_progress[k];
break;
}
}
progress = (progress - start_progress) / (end_progress - start_progress);
result = gtk_css_variable_value_transition (start_value,
end_value,
progress);
/* XXX: Dear spec, what's the correct thing to do here? */
if (result == NULL)
return start_value ? gtk_css_variable_value_ref (start_value) : NULL;
return result;
}
+8
View File
@@ -50,5 +50,13 @@ GtkCssValue * _gtk_css_keyframes_get_value (GtkCssKeyframes
double progress, double progress,
GtkCssValue *default_value); GtkCssValue *default_value);
guint _gtk_css_keyframes_get_n_variables (GtkCssKeyframes *keyframes);
int _gtk_css_keyframes_get_variable_id (GtkCssKeyframes *keyframes,
guint id);
GtkCssVariableValue *_gtk_css_keyframes_get_variable (GtkCssKeyframes *keyframes,
guint id,
double progress,
GtkCssVariableValue *default_value);
G_END_DECLS G_END_DECLS
+5 -7
View File
@@ -39,15 +39,13 @@ gtk_css_value_line_height_free (GtkCssValue *value)
} }
static GtkCssValue * static GtkCssValue *
gtk_css_value_line_height_compute (GtkCssValue *value, gtk_css_value_line_height_compute (GtkCssValue *value,
guint property_id, guint property_id,
GtkStyleProvider *provider, GtkCssComputeContext *context)
GtkCssStyle *style,
GtkCssStyle *parent_style)
{ {
GtkCssValue *height; GtkCssValue *height;
height = _gtk_css_value_compute (value->height, property_id, provider, style, parent_style); height = _gtk_css_value_compute (value->height, property_id, context);
if (gtk_css_number_value_get_dimension (height) == GTK_CSS_DIMENSION_PERCENTAGE) if (gtk_css_number_value_get_dimension (height) == GTK_CSS_DIMENSION_PERCENTAGE)
{ {
@@ -55,7 +53,7 @@ gtk_css_value_line_height_compute (GtkCssValue *value,
GtkCssValue *computed; GtkCssValue *computed;
factor = _gtk_css_number_value_get (height, 1); factor = _gtk_css_number_value_get (height, 1);
computed = gtk_css_number_value_multiply (style->core->font_size, factor); computed = gtk_css_number_value_multiply (context->style->core->font_size, factor);
_gtk_css_value_unref (height); _gtk_css_value_unref (height);
+18
View File
@@ -19,6 +19,7 @@
#include "gtkcsslookupprivate.h" #include "gtkcsslookupprivate.h"
#include "gtkcsscustompropertypoolprivate.h"
#include "gtkcssstylepropertyprivate.h" #include "gtkcssstylepropertyprivate.h"
#include "gtkcsstypesprivate.h" #include "gtkcsstypesprivate.h"
#include "gtkprivatetypebuiltins.h" #include "gtkprivatetypebuiltins.h"
@@ -36,6 +37,9 @@ void
_gtk_css_lookup_destroy (GtkCssLookup *lookup) _gtk_css_lookup_destroy (GtkCssLookup *lookup)
{ {
_gtk_bitmask_free (lookup->set_values); _gtk_bitmask_free (lookup->set_values);
if (lookup->custom_values)
g_hash_table_unref (lookup->custom_values);
} }
gboolean gboolean
@@ -74,3 +78,17 @@ _gtk_css_lookup_set (GtkCssLookup *lookup,
lookup->values[id].section = section; lookup->values[id].section = section;
lookup->set_values = _gtk_bitmask_set (lookup->set_values, id, TRUE); lookup->set_values = _gtk_bitmask_set (lookup->set_values, id, TRUE);
} }
void
_gtk_css_lookup_set_custom (GtkCssLookup *lookup,
int id,
GtkCssVariableValue *value)
{
gtk_internal_return_if_fail (lookup != NULL);
if (!lookup->custom_values)
lookup->custom_values = g_hash_table_new (g_direct_hash, g_direct_equal);
if (!g_hash_table_contains (lookup->custom_values, GINT_TO_POINTER (id)))
g_hash_table_replace (lookup->custom_values, GINT_TO_POINTER (id), value);
}
+6
View File
@@ -23,6 +23,8 @@
#include "gtk/gtkcssstaticstyleprivate.h" #include "gtk/gtkcssstaticstyleprivate.h"
#include "gtk/css/gtkcsssection.h" #include "gtk/css/gtkcsssection.h"
#include "gtk/css/gtkcsstokenizerprivate.h"
#include "gtk/css/gtkcssvariablevalueprivate.h"
G_BEGIN_DECLS G_BEGIN_DECLS
@@ -37,6 +39,7 @@ typedef struct {
struct _GtkCssLookup { struct _GtkCssLookup {
GtkBitmask *set_values; GtkBitmask *set_values;
GtkCssLookupValue values[GTK_CSS_PROPERTY_N_PROPERTIES]; GtkCssLookupValue values[GTK_CSS_PROPERTY_N_PROPERTIES];
GHashTable *custom_values;
}; };
void _gtk_css_lookup_init (GtkCssLookup *lookup); void _gtk_css_lookup_init (GtkCssLookup *lookup);
@@ -47,6 +50,9 @@ void _gtk_css_lookup_set (GtkCssLookup
guint id, guint id,
GtkCssSection *section, GtkCssSection *section,
GtkCssValue *value); GtkCssValue *value);
void _gtk_css_lookup_set_custom (GtkCssLookup *lookup,
int id,
GtkCssVariableValue *value);
static inline const GtkBitmask * static inline const GtkBitmask *
_gtk_css_lookup_get_set_values (const GtkCssLookup *lookup) _gtk_css_lookup_get_set_values (const GtkCssLookup *lookup)
+4 -1
View File
@@ -445,9 +445,12 @@ gtk_css_node_real_update_style (GtkCssNode *cssnode,
} }
else if (static_style != style && (change & GTK_CSS_CHANGE_TIMESTAMP)) else if (static_style != style && (change & GTK_CSS_CHANGE_TIMESTAMP))
{ {
GtkCssNode *parent = gtk_css_node_get_parent (cssnode);
new_style = gtk_css_animated_style_new_advance (GTK_CSS_ANIMATED_STYLE (style), new_style = gtk_css_animated_style_new_advance (GTK_CSS_ANIMATED_STYLE (style),
static_style, static_style,
timestamp); parent ? gtk_css_node_get_style (parent) : NULL,
timestamp,
gtk_css_node_get_style_provider (cssnode));
} }
else else
{ {
+32 -31
View File
@@ -108,12 +108,13 @@ get_base_font_size_px (guint property_id,
} }
static GtkCssValue * static GtkCssValue *
gtk_css_value_number_compute (GtkCssValue *number, gtk_css_value_number_compute (GtkCssValue *number,
guint property_id, guint property_id,
GtkStyleProvider *provider, GtkCssComputeContext *context)
GtkCssStyle *style,
GtkCssStyle *parent_style)
{ {
GtkStyleProvider *provider = context->provider;
GtkCssStyle *style = context->style;
GtkCssStyle *parent_style = context->parent_style;
double value; double value;
if (G_UNLIKELY (number->type == TYPE_CALC)) if (G_UNLIKELY (number->type == TYPE_CALC))
@@ -129,8 +130,8 @@ gtk_css_value_number_compute (GtkCssValue *number,
for (i = 0; i < n_terms; i++) for (i = 0; i < n_terms; i++)
{ {
GtkCssValue *computed = _gtk_css_value_compute (number->calc.terms[i], GtkCssValue *computed = _gtk_css_value_compute (number->calc.terms[i],
property_id, provider, style, property_id,
parent_style); context);
changed |= computed != number->calc.terms[i]; changed |= computed != number->calc.terms[i];
new_values[i] = computed; new_values[i] = computed;
} }
@@ -366,38 +367,38 @@ gtk_css_dimension_value_new (double value,
GtkCssUnit unit) GtkCssUnit unit)
{ {
static GtkCssValue number_singletons[] = { static GtkCssValue number_singletons[] = {
{ &GTK_CSS_VALUE_NUMBER, 1, TRUE, TYPE_DIMENSION, {{ GTK_CSS_NUMBER, 0 }} }, { &GTK_CSS_VALUE_NUMBER, 1, TRUE, FALSE, TYPE_DIMENSION, {{ GTK_CSS_NUMBER, 0 }} },
{ &GTK_CSS_VALUE_NUMBER, 1, TRUE, TYPE_DIMENSION, {{ GTK_CSS_NUMBER, 1 }} }, { &GTK_CSS_VALUE_NUMBER, 1, TRUE, FALSE, TYPE_DIMENSION, {{ GTK_CSS_NUMBER, 1 }} },
{ &GTK_CSS_VALUE_NUMBER, 1, TRUE, TYPE_DIMENSION, {{ GTK_CSS_NUMBER, 96 }} }, /* DPI default */ { &GTK_CSS_VALUE_NUMBER, 1, TRUE, FALSE, TYPE_DIMENSION, {{ GTK_CSS_NUMBER, 96 }} }, /* DPI default */
}; };
static GtkCssValue px_singletons[] = { static GtkCssValue px_singletons[] = {
{ &GTK_CSS_VALUE_NUMBER, 1, TRUE, TYPE_DIMENSION, {{ GTK_CSS_PX, 0 }} }, { &GTK_CSS_VALUE_NUMBER, 1, TRUE, FALSE, TYPE_DIMENSION, {{ GTK_CSS_PX, 0 }} },
{ &GTK_CSS_VALUE_NUMBER, 1, TRUE, TYPE_DIMENSION, {{ GTK_CSS_PX, 1 }} }, { &GTK_CSS_VALUE_NUMBER, 1, TRUE, FALSE, TYPE_DIMENSION, {{ GTK_CSS_PX, 1 }} },
{ &GTK_CSS_VALUE_NUMBER, 1, TRUE, TYPE_DIMENSION, {{ GTK_CSS_PX, 2 }} }, { &GTK_CSS_VALUE_NUMBER, 1, TRUE, FALSE, TYPE_DIMENSION, {{ GTK_CSS_PX, 2 }} },
{ &GTK_CSS_VALUE_NUMBER, 1, TRUE, TYPE_DIMENSION, {{ GTK_CSS_PX, 3 }} }, { &GTK_CSS_VALUE_NUMBER, 1, TRUE, FALSE, TYPE_DIMENSION, {{ GTK_CSS_PX, 3 }} },
{ &GTK_CSS_VALUE_NUMBER, 1, TRUE, TYPE_DIMENSION, {{ GTK_CSS_PX, 4 }} }, { &GTK_CSS_VALUE_NUMBER, 1, TRUE, FALSE, TYPE_DIMENSION, {{ GTK_CSS_PX, 4 }} },
{ &GTK_CSS_VALUE_NUMBER, 1, TRUE, TYPE_DIMENSION, {{ GTK_CSS_PX, 5 }} }, { &GTK_CSS_VALUE_NUMBER, 1, TRUE, FALSE, TYPE_DIMENSION, {{ GTK_CSS_PX, 5 }} },
{ &GTK_CSS_VALUE_NUMBER, 1, TRUE, TYPE_DIMENSION, {{ GTK_CSS_PX, 6 }} }, { &GTK_CSS_VALUE_NUMBER, 1, TRUE, FALSE, TYPE_DIMENSION, {{ GTK_CSS_PX, 6 }} },
{ &GTK_CSS_VALUE_NUMBER, 1, TRUE, TYPE_DIMENSION, {{ GTK_CSS_PX, 7 }} }, { &GTK_CSS_VALUE_NUMBER, 1, TRUE, FALSE, TYPE_DIMENSION, {{ GTK_CSS_PX, 7 }} },
{ &GTK_CSS_VALUE_NUMBER, 1, TRUE, TYPE_DIMENSION, {{ GTK_CSS_PX, 8 }} }, { &GTK_CSS_VALUE_NUMBER, 1, TRUE, FALSE, TYPE_DIMENSION, {{ GTK_CSS_PX, 8 }} },
{ &GTK_CSS_VALUE_NUMBER, 1, TRUE, TYPE_DIMENSION, {{ GTK_CSS_PX, 16 }} }, /* Icon size default */ { &GTK_CSS_VALUE_NUMBER, 1, TRUE, FALSE, TYPE_DIMENSION, {{ GTK_CSS_PX, 16 }} }, /* Icon size default */
{ &GTK_CSS_VALUE_NUMBER, 1, TRUE, TYPE_DIMENSION, {{ GTK_CSS_PX, 32 }} }, { &GTK_CSS_VALUE_NUMBER, 1, TRUE, FALSE, TYPE_DIMENSION, {{ GTK_CSS_PX, 32 }} },
{ &GTK_CSS_VALUE_NUMBER, 1, TRUE, TYPE_DIMENSION, {{ GTK_CSS_PX, 64 }} }, { &GTK_CSS_VALUE_NUMBER, 1, TRUE, FALSE, TYPE_DIMENSION, {{ GTK_CSS_PX, 64 }} },
}; };
static GtkCssValue percent_singletons[] = { static GtkCssValue percent_singletons[] = {
{ &GTK_CSS_VALUE_NUMBER, 1, TRUE, TYPE_DIMENSION, {{ GTK_CSS_PERCENT, 0 }} }, { &GTK_CSS_VALUE_NUMBER, 1, TRUE, FALSE, TYPE_DIMENSION, {{ GTK_CSS_PERCENT, 0 }} },
{ &GTK_CSS_VALUE_NUMBER, 1, FALSE, TYPE_DIMENSION, {{ GTK_CSS_PERCENT, 50 }} }, { &GTK_CSS_VALUE_NUMBER, 1, FALSE, FALSE, TYPE_DIMENSION, {{ GTK_CSS_PERCENT, 50 }} },
{ &GTK_CSS_VALUE_NUMBER, 1, FALSE, TYPE_DIMENSION, {{ GTK_CSS_PERCENT, 100 }} }, { &GTK_CSS_VALUE_NUMBER, 1, FALSE, FALSE, TYPE_DIMENSION, {{ GTK_CSS_PERCENT, 100 }} },
}; };
static GtkCssValue second_singletons[] = { static GtkCssValue second_singletons[] = {
{ &GTK_CSS_VALUE_NUMBER, 1, TRUE, TYPE_DIMENSION, {{ GTK_CSS_S, 0 }} }, { &GTK_CSS_VALUE_NUMBER, 1, TRUE, FALSE, TYPE_DIMENSION, {{ GTK_CSS_S, 0 }} },
{ &GTK_CSS_VALUE_NUMBER, 1, TRUE, TYPE_DIMENSION, {{ GTK_CSS_S, 1 }} }, { &GTK_CSS_VALUE_NUMBER, 1, TRUE, FALSE, TYPE_DIMENSION, {{ GTK_CSS_S, 1 }} },
}; };
static GtkCssValue deg_singletons[] = { static GtkCssValue deg_singletons[] = {
{ &GTK_CSS_VALUE_NUMBER, 1, TRUE, TYPE_DIMENSION, {{ GTK_CSS_DEG, 0 }} }, { &GTK_CSS_VALUE_NUMBER, 1, TRUE, FALSE, TYPE_DIMENSION, {{ GTK_CSS_DEG, 0 }} },
{ &GTK_CSS_VALUE_NUMBER, 1, TRUE, TYPE_DIMENSION, {{ GTK_CSS_DEG, 90 }} }, { &GTK_CSS_VALUE_NUMBER, 1, TRUE, FALSE, TYPE_DIMENSION, {{ GTK_CSS_DEG, 90 }} },
{ &GTK_CSS_VALUE_NUMBER, 1, TRUE, TYPE_DIMENSION, {{ GTK_CSS_DEG, 180 }} }, { &GTK_CSS_VALUE_NUMBER, 1, TRUE, FALSE, TYPE_DIMENSION, {{ GTK_CSS_DEG, 180 }} },
{ &GTK_CSS_VALUE_NUMBER, 1, TRUE, TYPE_DIMENSION, {{ GTK_CSS_DEG, 270 }} }, { &GTK_CSS_VALUE_NUMBER, 1, TRUE, FALSE, TYPE_DIMENSION, {{ GTK_CSS_DEG, 270 }} },
}; };
GtkCssValue *result; GtkCssValue *result;
+4 -6
View File
@@ -103,11 +103,9 @@ gtk_css_value_palette_free (GtkCssValue *value)
} }
static GtkCssValue * static GtkCssValue *
gtk_css_value_palette_compute (GtkCssValue *specified, gtk_css_value_palette_compute (GtkCssValue *specified,
guint property_id, guint property_id,
GtkStyleProvider *provider, GtkCssComputeContext *context)
GtkCssStyle *style,
GtkCssStyle *parent_style)
{ {
GtkCssValue *computed_color; GtkCssValue *computed_color;
GtkCssValue *result; GtkCssValue *result;
@@ -120,7 +118,7 @@ gtk_css_value_palette_compute (GtkCssValue *specified,
{ {
GtkCssValue *value = specified->color_values[i]; GtkCssValue *value = specified->color_values[i];
computed_color = _gtk_css_value_compute (value, property_id, provider, style, parent_style); computed_color = _gtk_css_value_compute (value, property_id, context);
result->color_names[i] = g_strdup (specified->color_names[i]); result->color_names[i] = g_strdup (specified->color_names[i]);
result->color_values[i] = computed_color; result->color_values[i] = computed_color;
+5 -7
View File
@@ -36,16 +36,14 @@ gtk_css_value_position_free (GtkCssValue *value)
} }
static GtkCssValue * static GtkCssValue *
gtk_css_value_position_compute (GtkCssValue *position, gtk_css_value_position_compute (GtkCssValue *position,
guint property_id, guint property_id,
GtkStyleProvider *provider, GtkCssComputeContext *context)
GtkCssStyle *style,
GtkCssStyle *parent_style)
{ {
GtkCssValue *x, *y; GtkCssValue *x, *y;
x = _gtk_css_value_compute (position->x, property_id, provider, style, parent_style); x = _gtk_css_value_compute (position->x, property_id, context);
y = _gtk_css_value_compute (position->y, property_id, provider, style, parent_style); y = _gtk_css_value_compute (position->y, property_id, context);
if (x == position->x && y == position->y) if (x == position->x && y == position->y)
{ {
_gtk_css_value_unref (x); _gtk_css_value_unref (x);
+234 -20
View File
@@ -22,10 +22,13 @@
#include <gtk/css/gtkcss.h> #include <gtk/css/gtkcss.h>
#include "gtk/css/gtkcsstokenizerprivate.h" #include "gtk/css/gtkcsstokenizerprivate.h"
#include "gtk/css/gtkcssparserprivate.h" #include "gtk/css/gtkcssparserprivate.h"
#include "gtk/css/gtkcssvariablevalueprivate.h"
#include "gtkbitmaskprivate.h" #include "gtkbitmaskprivate.h"
#include "gtkcssarrayvalueprivate.h" #include "gtkcssarrayvalueprivate.h"
#include "gtkcsscolorvalueprivate.h" #include "gtkcsscolorvalueprivate.h"
#include "gtkcsscustompropertypoolprivate.h"
#include "gtkcsskeyframesprivate.h" #include "gtkcsskeyframesprivate.h"
#include "gtkcssreferencevalueprivate.h"
#include "gtkcssselectorprivate.h" #include "gtkcssselectorprivate.h"
#include "gtkcssshorthandpropertyprivate.h" #include "gtkcssshorthandpropertyprivate.h"
#include "gtksettingsprivate.h" #include "gtksettingsprivate.h"
@@ -113,6 +116,7 @@ struct GtkCssRuleset
PropertyValue *styles; PropertyValue *styles;
guint n_styles; guint n_styles;
guint owns_styles : 1; guint owns_styles : 1;
GHashTable *custom_properties;
}; };
struct _GtkCssScanner struct _GtkCssScanner
@@ -133,6 +137,7 @@ struct _GtkCssProviderPrivate
GtkCssSelectorTree *tree; GtkCssSelectorTree *tree;
GResource *resource; GResource *resource;
char *path; char *path;
GBytes *bytes; /* *no* reference */
}; };
enum { enum {
@@ -270,6 +275,8 @@ gtk_css_ruleset_clear (GtkCssRuleset *ruleset)
gtk_css_section_unref (ruleset->styles[i].section); gtk_css_section_unref (ruleset->styles[i].section);
} }
g_free (ruleset->styles); g_free (ruleset->styles);
if (ruleset->custom_properties)
g_hash_table_unref (ruleset->custom_properties);
} }
if (ruleset->selector) if (ruleset->selector)
_gtk_css_selector_free (ruleset->selector); _gtk_css_selector_free (ruleset->selector);
@@ -285,7 +292,7 @@ gtk_css_ruleset_add (GtkCssRuleset *ruleset,
{ {
guint i; guint i;
g_return_if_fail (ruleset->owns_styles || ruleset->n_styles == 0); g_return_if_fail (ruleset->owns_styles || (ruleset->n_styles == 0 && ruleset->custom_properties == NULL));
ruleset->owns_styles = TRUE; ruleset->owns_styles = TRUE;
@@ -315,6 +322,39 @@ gtk_css_ruleset_add (GtkCssRuleset *ruleset,
ruleset->styles[i].section = NULL; ruleset->styles[i].section = NULL;
} }
static void
unref_custom_property_name (gpointer pointer)
{
GtkCssCustomPropertyPool *pool = gtk_css_custom_property_pool_get ();
gtk_css_custom_property_pool_unref (pool, GPOINTER_TO_INT (pointer));
}
static void
gtk_css_ruleset_add_custom (GtkCssRuleset *ruleset,
const char *name,
GtkCssVariableValue *value)
{
GtkCssCustomPropertyPool *pool;
int id;
g_return_if_fail (ruleset->owns_styles || (ruleset->n_styles == 0 && ruleset->custom_properties == NULL));
ruleset->owns_styles = TRUE;
if (ruleset->custom_properties == NULL)
{
ruleset->custom_properties = g_hash_table_new_full (g_direct_hash, g_direct_equal,
unref_custom_property_name,
(GDestroyNotify) gtk_css_variable_value_unref);
}
pool = gtk_css_custom_property_pool_get ();
id = gtk_css_custom_property_pool_add (pool, name);
g_hash_table_replace (ruleset->custom_properties, GINT_TO_POINTER (id), value);
}
static void static void
gtk_css_scanner_destroy (GtkCssScanner *scanner) gtk_css_scanner_destroy (GtkCssScanner *scanner)
{ {
@@ -342,9 +382,10 @@ gtk_css_scanner_parser_error (GtkCssParser *parser,
GtkCssScanner *scanner = user_data; GtkCssScanner *scanner = user_data;
GtkCssSection *section; GtkCssSection *section;
section = gtk_css_section_new (gtk_css_parser_get_file (parser), section = gtk_css_section_new_with_bytes (gtk_css_parser_get_file (parser),
start, gtk_css_parser_get_bytes (parser),
end); start,
end);
gtk_css_style_provider_emit_error (GTK_STYLE_PROVIDER (scanner->provider), section, error); gtk_css_style_provider_emit_error (GTK_STYLE_PROVIDER (scanner->provider), section, error);
@@ -490,7 +531,7 @@ gtk_css_style_provider_lookup (GtkStyleProvider *provider,
{ {
ruleset = gtk_css_selector_matches_get (&tree_rules, i); ruleset = gtk_css_selector_matches_get (&tree_rules, i);
if (ruleset->styles == NULL) if (ruleset->styles == NULL && ruleset->custom_properties == NULL)
continue; continue;
for (j = 0; j < ruleset->n_styles; j++) for (j = 0; j < ruleset->n_styles; j++)
@@ -506,6 +547,18 @@ gtk_css_style_provider_lookup (GtkStyleProvider *provider,
ruleset->styles[j].section, ruleset->styles[j].section,
ruleset->styles[j].value); ruleset->styles[j].value);
} }
if (ruleset->custom_properties)
{
GHashTableIter iter;
gpointer id;
GtkCssVariableValue *value;
g_hash_table_iter_init (&iter, ruleset->custom_properties);
while (g_hash_table_iter_next (&iter, &id, (gpointer) &value))
_gtk_css_lookup_set_custom (lookup, GPOINTER_TO_INT (id), value);
}
} }
} }
gtk_css_selector_matches_clear (&tree_rules); gtk_css_selector_matches_clear (&tree_rules);
@@ -514,6 +567,16 @@ gtk_css_style_provider_lookup (GtkStyleProvider *provider,
*change = gtk_css_selector_tree_get_change_all (priv->tree, filter, node); *change = gtk_css_selector_tree_get_change_all (priv->tree, filter, node);
} }
static gboolean
gtk_css_style_provider_has_section (GtkStyleProvider *provider,
GtkCssSection *section)
{
GtkCssProvider *self = GTK_CSS_PROVIDER (provider);
GtkCssProviderPrivate *priv = gtk_css_provider_get_instance_private (self);
return priv->bytes == gtk_css_section_get_bytes (section);
}
static void static void
gtk_css_style_provider_iface_init (GtkStyleProviderInterface *iface) gtk_css_style_provider_iface_init (GtkStyleProviderInterface *iface)
{ {
@@ -521,6 +584,7 @@ gtk_css_style_provider_iface_init (GtkStyleProviderInterface *iface)
iface->get_keyframes = gtk_css_style_provider_get_keyframes; iface->get_keyframes = gtk_css_style_provider_get_keyframes;
iface->lookup = gtk_css_style_provider_lookup; iface->lookup = gtk_css_style_provider_lookup;
iface->emit_error = gtk_css_style_provider_emit_error; iface->emit_error = gtk_css_style_provider_emit_error;
iface->has_section = gtk_css_style_provider_has_section;
} }
static void static void
@@ -572,7 +636,7 @@ css_provider_commit (GtkCssProvider *css_provider,
GtkCssProviderPrivate *priv = gtk_css_provider_get_instance_private (css_provider); GtkCssProviderPrivate *priv = gtk_css_provider_get_instance_private (css_provider);
guint i; guint i;
if (ruleset->styles == NULL) if (ruleset->styles == NULL && ruleset->custom_properties == NULL)
{ {
for (i = 0; i < gtk_css_selectors_get_size (selectors); i++) for (i = 0; i < gtk_css_selectors_get_size (selectors); i++)
_gtk_css_selector_free (gtk_css_selectors_get (selectors, i)); _gtk_css_selector_free (gtk_css_selectors_get (selectors, i));
@@ -814,6 +878,49 @@ parse_declaration (GtkCssScanner *scanner,
if (name == NULL) if (name == NULL)
goto out; goto out;
/* This is a custom property */
if (name[0] == '-' && name[1] == '-')
{
GtkCssVariableValue *value;
GtkCssLocation start_location;
GtkCssSection *section;
if (!gtk_css_parser_try_token (scanner->parser, GTK_CSS_TOKEN_COLON))
{
gtk_css_parser_error_syntax (scanner->parser, "Expected ':'");
goto out;
}
gtk_css_parser_skip_whitespace (scanner->parser);
if (gtk_keep_css_sections)
start_location = *gtk_css_parser_get_start_location (scanner->parser);
value = gtk_css_parser_parse_value_into_token_stream (scanner->parser);
if (value == NULL)
goto out;
if (gtk_keep_css_sections)
{
section = gtk_css_section_new_with_bytes (gtk_css_parser_get_file (scanner->parser),
gtk_css_parser_get_bytes (scanner->parser),
&start_location,
gtk_css_parser_get_start_location (scanner->parser));
}
else
section = NULL;
if (section != NULL)
{
gtk_css_variable_value_set_section (value, section);
gtk_css_section_unref (section);
}
gtk_css_ruleset_add_custom (ruleset, name, value);
goto out;
}
property = _gtk_style_property_lookup (name); property = _gtk_style_property_lookup (name);
if (property) if (property)
@@ -827,22 +934,88 @@ parse_declaration (GtkCssScanner *scanner,
goto out; goto out;
} }
value = _gtk_style_property_parse_value (property, scanner->parser); if (gtk_css_parser_has_references (scanner->parser))
if (value == NULL)
goto out;
if (!gtk_css_parser_has_token (scanner->parser, GTK_CSS_TOKEN_EOF))
{ {
gtk_css_parser_error_syntax (scanner->parser, "Junk at end of value for %s", property->name); GtkCssLocation start_location;
goto out; GtkCssVariableValue *var_value;
gtk_css_parser_skip_whitespace (scanner->parser);
if (gtk_keep_css_sections)
start_location = *gtk_css_parser_get_start_location (scanner->parser);
var_value = gtk_css_parser_parse_value_into_token_stream (scanner->parser);
if (var_value == NULL)
goto out;
if (gtk_keep_css_sections)
section = gtk_css_section_new_with_bytes (gtk_css_parser_get_file (scanner->parser),
gtk_css_parser_get_bytes (scanner->parser),
&start_location,
gtk_css_parser_get_start_location (scanner->parser));
else
section = NULL;
if (section != NULL)
{
gtk_css_variable_value_set_section (var_value, section);
gtk_css_section_unref (section);
}
if (GTK_IS_CSS_SHORTHAND_PROPERTY (property))
{
GtkCssShorthandProperty *shorthand = GTK_CSS_SHORTHAND_PROPERTY (property);
guint i, n;
GtkCssValue **values;
n = _gtk_css_shorthand_property_get_n_subproperties (shorthand);
values = g_new (GtkCssValue *, n);
for (i = 0; i < n; i++)
{
GtkCssValue *child =
_gtk_css_reference_value_new (property,
var_value,
gtk_css_parser_get_file (scanner->parser));
_gtk_css_reference_value_set_subproperty (child, i);
values[i] = _gtk_css_array_value_get_nth (child, i);
}
value = _gtk_css_array_value_new_from_array (values, n);
g_free (values);
}
else
{
value = _gtk_css_reference_value_new (property,
var_value,
gtk_css_parser_get_file (scanner->parser));
}
gtk_css_variable_value_unref (var_value);
}
else
{
value = _gtk_style_property_parse_value (property, scanner->parser);
if (value == NULL)
goto out;
if (!gtk_css_parser_has_token (scanner->parser, GTK_CSS_TOKEN_EOF))
{
gtk_css_parser_error_syntax (scanner->parser, "Junk at end of value for %s", property->name);
gtk_css_value_unref (value);
goto out;
}
} }
if (gtk_keep_css_sections) if (gtk_keep_css_sections)
{ {
section = gtk_css_section_new (gtk_css_parser_get_file (scanner->parser), section = gtk_css_section_new_with_bytes (gtk_css_parser_get_file (scanner->parser),
gtk_css_parser_get_block_location (scanner->parser), gtk_css_parser_get_bytes (scanner->parser),
gtk_css_parser_get_end_location (scanner->parser)); gtk_css_parser_get_block_location (scanner->parser),
gtk_css_parser_get_end_location (scanner->parser));
} }
else else
section = NULL; section = NULL;
@@ -1025,6 +1198,7 @@ gtk_css_provider_load_internal (GtkCssProvider *self,
GFile *file, GFile *file,
GBytes *bytes) GBytes *bytes)
{ {
GtkCssProviderPrivate *priv = gtk_css_provider_get_instance_private (self);
gint64 before G_GNUC_UNUSED; gint64 before G_GNUC_UNUSED;
before = GDK_PROFILER_CURRENT_TIME; before = GDK_PROFILER_CURRENT_TIME;
@@ -1059,6 +1233,8 @@ gtk_css_provider_load_internal (GtkCssProvider *self,
} }
} }
priv->bytes = bytes;
if (bytes) if (bytes)
{ {
GtkCssScanner *scanner; GtkCssScanner *scanner;
@@ -1112,7 +1288,7 @@ gtk_css_provider_load_from_data (GtkCssProvider *css_provider,
if (length < 0) if (length < 0)
length = strlen (data); length = strlen (data);
bytes = g_bytes_new_static (data, length); bytes = g_bytes_new (data, length);
gtk_css_provider_load_from_bytes (css_provider, bytes); gtk_css_provider_load_from_bytes (css_provider, bytes);
@@ -1139,7 +1315,7 @@ gtk_css_provider_load_from_string (GtkCssProvider *css_provider,
g_return_if_fail (GTK_IS_CSS_PROVIDER (css_provider)); g_return_if_fail (GTK_IS_CSS_PROVIDER (css_provider));
g_return_if_fail (string != NULL); g_return_if_fail (string != NULL);
bytes = g_bytes_new_static (string, strlen (string)); bytes = g_bytes_new (string, strlen (string));
gtk_css_provider_load_from_bytes (css_provider, bytes); gtk_css_provider_load_from_bytes (css_provider, bytes);
@@ -1473,6 +1649,20 @@ compare_properties (gconstpointer a, gconstpointer b, gpointer style)
_gtk_style_property_get_name (GTK_STYLE_PROPERTY (styles[*ub].property))); _gtk_style_property_get_name (GTK_STYLE_PROPERTY (styles[*ub].property)));
} }
static int
compare_custom_properties (gconstpointer a, gconstpointer b, gpointer user_data)
{
GtkCssCustomPropertyPool *pool = user_data;
int id1 = GPOINTER_TO_INT (*((const int *) a));
int id2 = GPOINTER_TO_INT (*((const int *) b));
const char *name1, *name2;
name1 = gtk_css_custom_property_pool_get_name (pool, id1);
name2 = gtk_css_custom_property_pool_get_name (pool, id2);
return strcmp (name1, name2);
}
static void static void
gtk_css_ruleset_print (const GtkCssRuleset *ruleset, gtk_css_ruleset_print (const GtkCssRuleset *ruleset,
GString *str) GString *str)
@@ -1506,6 +1696,31 @@ gtk_css_ruleset_print (const GtkCssRuleset *ruleset,
g_free (sorted); g_free (sorted);
} }
if (ruleset->custom_properties)
{
GtkCssCustomPropertyPool *pool = gtk_css_custom_property_pool_get ();
GPtrArray *keys;
keys = g_hash_table_get_keys_as_ptr_array (ruleset->custom_properties);
g_ptr_array_sort_with_data (keys, compare_custom_properties, pool);
for (i = 0; i < keys->len; i++)
{
int id = GPOINTER_TO_INT (g_ptr_array_index (keys, i));
const char *name = gtk_css_custom_property_pool_get_name (pool, id);
GtkCssVariableValue *value = g_hash_table_lookup (ruleset->custom_properties,
GINT_TO_POINTER (id));
g_string_append (str, " ");
g_string_append (str, name);
g_string_append (str, ": ");
gtk_css_variable_value_print (value, str);
g_string_append (str, ";\n");
}
g_ptr_array_unref (keys);
}
g_string_append (str, "}\n"); g_string_append (str, "}\n");
} }
@@ -1598,4 +1813,3 @@ gtk_css_provider_to_string (GtkCssProvider *provider)
return g_string_free (str, FALSE); return g_string_free (str, FALSE);
} }
+390
View File
@@ -0,0 +1,390 @@
/*
* Copyright (C) 2023 GNOME Foundation Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
* Authors: Alice Mikhaylenko <alicem@gnome.org>
*/
#include "config.h"
#include "gtkcssreferencevalueprivate.h"
#include "gtkcssarrayvalueprivate.h"
#include "gtkcsscustompropertypoolprivate.h"
#include "gtkcssshorthandpropertyprivate.h"
#include "gtkcssstyleprivate.h"
#include "gtkcssunsetvalueprivate.h"
#include "gtkcssvalueprivate.h"
#include "gtkstyleproviderprivate.h"
#define GDK_ARRAY_NAME gtk_css_refs
#define GDK_ARRAY_TYPE_NAME GtkCssRefs
#define GDK_ARRAY_ELEMENT_TYPE gpointer
#define GDK_ARAY_PREALLOC 32
#define GDK_ARRAY_NO_MEMSET 1
#include "gdk/gdkarrayimpl.c"
#define MAX_TOKEN_LENGTH 65536
typedef enum {
RESOLVE_SUCCESS,
RESOLVE_INVALID,
RESOLVE_ANIMATION_TAINTED,
} ResolveResult;
struct _GtkCssValue {
GTK_CSS_VALUE_BASE
GtkStyleProperty *property;
GtkCssVariableValue *value;
GFile *file;
guint subproperty;
};
static void
gtk_css_value_reference_free (GtkCssValue *value)
{
gtk_css_variable_value_unref (value->value);
if (value->file)
g_object_unref (value->file);
}
static ResolveResult
resolve_references_do (GtkCssVariableValue *value,
guint property_id,
GtkCssVariableSet *style_variables,
GtkCssVariableSet *keyframes_variables,
gboolean root,
GtkCssRefs *refs,
gsize *out_length,
gsize *out_n_refs)
{
GtkCssCustomPropertyPool *pool = gtk_css_custom_property_pool_get ();
gsize i;
gsize length = value->length;
gsize n_refs = 0;
ResolveResult ret = RESOLVE_SUCCESS;
if (value->is_animation_tainted)
{
GtkCssStyleProperty *prop = _gtk_css_style_property_lookup_by_id (property_id);
if (!_gtk_css_style_property_is_animated (prop))
{
/* Animation-tainted variables make other variables that reference
* them animation-tainted too, so unlike regular invalid variables it
* propagates to the root. For example, if --test is animation-tainted,
* --test2: var(--test, fallback1); prop: var(--test2, fallback2); will\
* resolve to fallback2 and _not_ to fallback1. So we'll propagate it
* up until the root, and treat it same as invalid there instead. */
ret = RESOLVE_ANIMATION_TAINTED;
goto error;
}
}
if (value->is_invalid)
{
ret = RESOLVE_INVALID;
goto error;
}
if (!root)
{
n_refs += 1;
gtk_css_refs_append (refs, value);
}
for (i = 0; i < value->n_references; i++)
{
GtkCssVariableValueReference *ref = &value->references[i];
int id = gtk_css_custom_property_pool_lookup (pool, ref->name);
GtkCssVariableValue *var_value = NULL;
gsize var_length, var_refs;
GtkCssVariableSet *source = style_variables;
ResolveResult result = RESOLVE_INVALID;
if (keyframes_variables)
var_value = gtk_css_variable_set_lookup (keyframes_variables, id, NULL);
if (!var_value && style_variables)
var_value = gtk_css_variable_set_lookup (style_variables, id, &source);
if (var_value)
{
result = resolve_references_do (var_value, property_id, source,
keyframes_variables, FALSE,
refs, &var_length, &var_refs);
if (root && result == RESOLVE_ANIMATION_TAINTED)
result = RESOLVE_INVALID;
}
if (result == RESOLVE_INVALID)
{
if (ref->fallback)
{
result = resolve_references_do (ref->fallback, property_id,
style_variables, keyframes_variables,
FALSE, refs, &var_length, &var_refs);
if (root && result == RESOLVE_ANIMATION_TAINTED)
result = RESOLVE_INVALID;
}
if (result != RESOLVE_SUCCESS)
{
ret = result;
goto error;
}
}
else if (result == RESOLVE_ANIMATION_TAINTED)
{
ret = RESOLVE_ANIMATION_TAINTED;
goto error;
}
length += var_length - ref->length;
n_refs += var_refs;
if (length > MAX_TOKEN_LENGTH)
{
ret = RESOLVE_INVALID;
goto error;
}
}
if (out_length)
*out_length = length;
if (out_n_refs)
*out_n_refs = n_refs;
return ret;
error:
/* Remove the references we added as if nothing happened */
gtk_css_refs_splice (refs, gtk_css_refs_get_size (refs) - n_refs, n_refs, TRUE, NULL, 0);
if (out_length)
*out_length = 0;
if (out_n_refs)
*out_n_refs = 0;
return ret;
}
static void
resolve_references (GtkCssVariableValue *input,
guint property_id,
GtkCssStyle *style,
GtkCssVariableSet *keyframes_variables,
GtkCssRefs *refs)
{
if (resolve_references_do (input, property_id, style->variables,
keyframes_variables, TRUE, refs,
NULL, NULL) != RESOLVE_SUCCESS)
{
gtk_css_refs_clear (refs);
}
}
static void
parser_error (GtkCssParser *parser,
const GtkCssLocation *start,
const GtkCssLocation *end,
const GError *error,
gpointer user_data)
{
GtkStyleProvider *provider = user_data;
GError *new_error = NULL;
GtkCssVariableValue **vars;
char **names;
gsize n_vars;
gtk_css_parser_get_expanding_variables (parser, &vars, &names, &n_vars);
if (n_vars > 0)
{
for (int i = 0; i < n_vars; i++)
{
if (names[i + 1])
g_set_error (&new_error,
GTK_CSS_PARSER_ERROR, GTK_CSS_PARSER_ERROR_UNKNOWN_VALUE,
"While expanding %s: %s", names[i + 1], error->message);
else
g_set_error_literal (&new_error,
GTK_CSS_PARSER_ERROR, GTK_CSS_PARSER_ERROR_UNKNOWN_VALUE,
error->message);
gtk_style_provider_emit_error (provider, vars[i]->section, new_error);
g_clear_error (&new_error);
}
for (int i = 0; i < n_vars; i++)
{
if (vars[i])
gtk_css_variable_value_unref (vars[i]);
g_free (names[i]);
}
g_free (vars);
g_free (names);
}
}
static GtkCssValue *
gtk_css_value_reference_compute (GtkCssValue *value,
guint property_id,
GtkCssComputeContext *context)
{
GtkCssValue *result = NULL, *computed;
GtkCssRefs refs;
guint shorthand_id = G_MAXUINT;
if (GTK_IS_CSS_SHORTHAND_PROPERTY (value->property))
{
shorthand_id = _gtk_css_shorthand_property_get_id (GTK_CSS_SHORTHAND_PROPERTY (value->property));
if (context->shorthands && context->shorthands[shorthand_id])
{
result = gtk_css_value_ref (context->shorthands[shorthand_id]);
goto pick_subproperty;
}
}
gtk_css_refs_init (&refs);
resolve_references (value->value, property_id, context->style, context->variables, &refs);
if (gtk_css_refs_get_size (&refs) > 0)
{
const GtkCssToken *token;
GtkCssParser *value_parser =
gtk_css_parser_new_for_token_stream (value->value,
value->file,
(GtkCssVariableValue **) refs.start,
gtk_css_refs_get_size (&refs),
parser_error, context->provider,
NULL);
result = _gtk_style_property_parse_value (value->property, value_parser);
token = gtk_css_parser_peek_token (value_parser);
if (!gtk_css_token_is (token, GTK_CSS_TOKEN_EOF))
{
char *junk;
junk = gtk_css_token_to_string (token);
gtk_css_parser_error_syntax (value_parser,
"Junk at end of %s value: %s",
value->property->name, junk);
g_free (junk);
g_clear_pointer (&result, gtk_css_value_unref);
}
gtk_css_parser_unref (value_parser);
}
gtk_css_refs_clear (&refs);
if (result == NULL)
result = _gtk_css_unset_value_new ();
if (shorthand_id != G_MAXUINT)
{
GtkCssValue *sub;
if (context->shorthands)
{
g_assert (context->shorthands[shorthand_id] == NULL);
context->shorthands[shorthand_id] = gtk_css_value_ref (result);
}
pick_subproperty:
sub = gtk_css_value_ref (_gtk_css_array_value_get_nth (result, value->subproperty));
gtk_css_value_unref (result);
result = sub;
}
computed = _gtk_css_value_compute (result, property_id, context);
computed->is_computed = TRUE;
gtk_css_value_unref (result);
return computed;
}
static gboolean
gtk_css_value_reference_equal (const GtkCssValue *value1,
const GtkCssValue *value2)
{
return FALSE;
}
static GtkCssValue *
gtk_css_value_reference_transition (GtkCssValue *start,
GtkCssValue *end,
guint property_id,
double progress)
{
return NULL;
}
static void
gtk_css_value_reference_print (const GtkCssValue *value,
GString *string)
{
gtk_css_variable_value_print (value->value, string);
}
static const GtkCssValueClass GTK_CSS_VALUE_REFERENCE = {
"GtkCssReferenceValue",
gtk_css_value_reference_free,
gtk_css_value_reference_compute,
gtk_css_value_reference_equal,
gtk_css_value_reference_transition,
NULL,
NULL,
gtk_css_value_reference_print
};
GtkCssValue *
_gtk_css_reference_value_new (GtkStyleProperty *property,
GtkCssVariableValue *value,
GFile *file)
{
GtkCssValue *result;
result = _gtk_css_value_new (GtkCssValue, &GTK_CSS_VALUE_REFERENCE);
result->property = property;
result->value = gtk_css_variable_value_ref (value);
result->contains_variables = TRUE;
if (file)
result->file = g_object_ref (file);
else
result->file = NULL;
return result;
}
void
_gtk_css_reference_value_set_subproperty (GtkCssValue *value,
guint property)
{
g_assert (GTK_IS_CSS_SHORTHAND_PROPERTY (value->property));
value->subproperty = property;
}
+35
View File
@@ -0,0 +1,35 @@
/*
* Copyright (C) 2023 GNOME Foundation Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
* Authors: Alice Mikhaylenko <alicem@gnome.org>
*/
#pragma once
#include <gtk/css/gtkcss.h>
#include "gtkcssvalueprivate.h"
#include "gtkstylepropertyprivate.h"
#include "css/gtkcssvariablevalueprivate.h"
G_BEGIN_DECLS
GtkCssValue *_gtk_css_reference_value_new (GtkStyleProperty *property,
GtkCssVariableValue *value,
GFile *file);
void _gtk_css_reference_value_set_subproperty (GtkCssValue *value,
guint property);
G_END_DECLS
+35 -37
View File
@@ -34,11 +34,9 @@ gtk_css_value_repeat_free (GtkCssValue *value)
} }
static GtkCssValue * static GtkCssValue *
gtk_css_value_repeat_compute (GtkCssValue *value, gtk_css_value_repeat_compute (GtkCssValue *value,
guint property_id, guint property_id,
GtkStyleProvider *provider, GtkCssComputeContext *context)
GtkCssStyle *style,
GtkCssStyle *parent_style)
{ {
return _gtk_css_value_ref (value); return _gtk_css_value_ref (value);
} }
@@ -140,28 +138,28 @@ static struct {
GtkCssValue values[4]; GtkCssValue values[4];
} background_repeat_values[4] = { } background_repeat_values[4] = {
{ "no-repeat", { "no-repeat",
{ { &GTK_CSS_VALUE_BACKGROUND_REPEAT, 1, TRUE, GTK_CSS_REPEAT_STYLE_NO_REPEAT, GTK_CSS_REPEAT_STYLE_NO_REPEAT }, { { &GTK_CSS_VALUE_BACKGROUND_REPEAT, 1, TRUE, FALSE, GTK_CSS_REPEAT_STYLE_NO_REPEAT, GTK_CSS_REPEAT_STYLE_NO_REPEAT },
{ &GTK_CSS_VALUE_BACKGROUND_REPEAT, 1, TRUE, GTK_CSS_REPEAT_STYLE_NO_REPEAT, GTK_CSS_REPEAT_STYLE_REPEAT }, { &GTK_CSS_VALUE_BACKGROUND_REPEAT, 1, TRUE, FALSE, GTK_CSS_REPEAT_STYLE_NO_REPEAT, GTK_CSS_REPEAT_STYLE_REPEAT },
{ &GTK_CSS_VALUE_BACKGROUND_REPEAT, 1, TRUE, GTK_CSS_REPEAT_STYLE_NO_REPEAT, GTK_CSS_REPEAT_STYLE_ROUND }, { &GTK_CSS_VALUE_BACKGROUND_REPEAT, 1, TRUE, FALSE, GTK_CSS_REPEAT_STYLE_NO_REPEAT, GTK_CSS_REPEAT_STYLE_ROUND },
{ &GTK_CSS_VALUE_BACKGROUND_REPEAT, 1, TRUE, GTK_CSS_REPEAT_STYLE_NO_REPEAT, GTK_CSS_REPEAT_STYLE_SPACE } { &GTK_CSS_VALUE_BACKGROUND_REPEAT, 1, TRUE, FALSE, GTK_CSS_REPEAT_STYLE_NO_REPEAT, GTK_CSS_REPEAT_STYLE_SPACE }
} }, } },
{ "repeat", { "repeat",
{ { &GTK_CSS_VALUE_BACKGROUND_REPEAT, 1, TRUE, GTK_CSS_REPEAT_STYLE_REPEAT, GTK_CSS_REPEAT_STYLE_NO_REPEAT }, { { &GTK_CSS_VALUE_BACKGROUND_REPEAT, 1, TRUE, FALSE, GTK_CSS_REPEAT_STYLE_REPEAT, GTK_CSS_REPEAT_STYLE_NO_REPEAT },
{ &GTK_CSS_VALUE_BACKGROUND_REPEAT, 1, TRUE, GTK_CSS_REPEAT_STYLE_REPEAT, GTK_CSS_REPEAT_STYLE_REPEAT }, { &GTK_CSS_VALUE_BACKGROUND_REPEAT, 1, TRUE, FALSE, GTK_CSS_REPEAT_STYLE_REPEAT, GTK_CSS_REPEAT_STYLE_REPEAT },
{ &GTK_CSS_VALUE_BACKGROUND_REPEAT, 1, TRUE, GTK_CSS_REPEAT_STYLE_REPEAT, GTK_CSS_REPEAT_STYLE_ROUND }, { &GTK_CSS_VALUE_BACKGROUND_REPEAT, 1, TRUE, FALSE, GTK_CSS_REPEAT_STYLE_REPEAT, GTK_CSS_REPEAT_STYLE_ROUND },
{ &GTK_CSS_VALUE_BACKGROUND_REPEAT, 1, TRUE, GTK_CSS_REPEAT_STYLE_REPEAT, GTK_CSS_REPEAT_STYLE_SPACE } { &GTK_CSS_VALUE_BACKGROUND_REPEAT, 1, TRUE, FALSE, GTK_CSS_REPEAT_STYLE_REPEAT, GTK_CSS_REPEAT_STYLE_SPACE }
} }, } },
{ "round", { "round",
{ { &GTK_CSS_VALUE_BACKGROUND_REPEAT, 1, TRUE, GTK_CSS_REPEAT_STYLE_ROUND, GTK_CSS_REPEAT_STYLE_NO_REPEAT }, { { &GTK_CSS_VALUE_BACKGROUND_REPEAT, 1, TRUE, FALSE, GTK_CSS_REPEAT_STYLE_ROUND, GTK_CSS_REPEAT_STYLE_NO_REPEAT },
{ &GTK_CSS_VALUE_BACKGROUND_REPEAT, 1, TRUE, GTK_CSS_REPEAT_STYLE_ROUND, GTK_CSS_REPEAT_STYLE_REPEAT }, { &GTK_CSS_VALUE_BACKGROUND_REPEAT, 1, TRUE, FALSE, GTK_CSS_REPEAT_STYLE_ROUND, GTK_CSS_REPEAT_STYLE_REPEAT },
{ &GTK_CSS_VALUE_BACKGROUND_REPEAT, 1, TRUE, GTK_CSS_REPEAT_STYLE_ROUND, GTK_CSS_REPEAT_STYLE_ROUND }, { &GTK_CSS_VALUE_BACKGROUND_REPEAT, 1, TRUE, FALSE, GTK_CSS_REPEAT_STYLE_ROUND, GTK_CSS_REPEAT_STYLE_ROUND },
{ &GTK_CSS_VALUE_BACKGROUND_REPEAT, 1, TRUE, GTK_CSS_REPEAT_STYLE_ROUND, GTK_CSS_REPEAT_STYLE_SPACE } { &GTK_CSS_VALUE_BACKGROUND_REPEAT, 1, TRUE, FALSE, GTK_CSS_REPEAT_STYLE_ROUND, GTK_CSS_REPEAT_STYLE_SPACE }
} }, } },
{ "space", { "space",
{ { &GTK_CSS_VALUE_BACKGROUND_REPEAT, 1, TRUE, GTK_CSS_REPEAT_STYLE_SPACE, GTK_CSS_REPEAT_STYLE_NO_REPEAT }, { { &GTK_CSS_VALUE_BACKGROUND_REPEAT, 1, TRUE, FALSE, GTK_CSS_REPEAT_STYLE_SPACE, GTK_CSS_REPEAT_STYLE_NO_REPEAT },
{ &GTK_CSS_VALUE_BACKGROUND_REPEAT, 1, TRUE, GTK_CSS_REPEAT_STYLE_SPACE, GTK_CSS_REPEAT_STYLE_REPEAT }, { &GTK_CSS_VALUE_BACKGROUND_REPEAT, 1, TRUE, FALSE, GTK_CSS_REPEAT_STYLE_SPACE, GTK_CSS_REPEAT_STYLE_REPEAT },
{ &GTK_CSS_VALUE_BACKGROUND_REPEAT, 1, TRUE, GTK_CSS_REPEAT_STYLE_SPACE, GTK_CSS_REPEAT_STYLE_ROUND }, { &GTK_CSS_VALUE_BACKGROUND_REPEAT, 1, TRUE, FALSE, GTK_CSS_REPEAT_STYLE_SPACE, GTK_CSS_REPEAT_STYLE_ROUND },
{ &GTK_CSS_VALUE_BACKGROUND_REPEAT, 1, TRUE, GTK_CSS_REPEAT_STYLE_SPACE, GTK_CSS_REPEAT_STYLE_SPACE } { &GTK_CSS_VALUE_BACKGROUND_REPEAT, 1, TRUE, FALSE, GTK_CSS_REPEAT_STYLE_SPACE, GTK_CSS_REPEAT_STYLE_SPACE }
} } } }
}; };
@@ -234,28 +232,28 @@ static struct {
GtkCssValue values[4]; GtkCssValue values[4];
} border_repeat_values[4] = { } border_repeat_values[4] = {
{ "stretch", { "stretch",
{ { &GTK_CSS_VALUE_BORDER_REPEAT, 1, TRUE, GTK_CSS_REPEAT_STYLE_STRETCH, GTK_CSS_REPEAT_STYLE_STRETCH }, { { &GTK_CSS_VALUE_BORDER_REPEAT, 1, TRUE, FALSE, GTK_CSS_REPEAT_STYLE_STRETCH, GTK_CSS_REPEAT_STYLE_STRETCH },
{ &GTK_CSS_VALUE_BORDER_REPEAT, 1, TRUE, GTK_CSS_REPEAT_STYLE_STRETCH, GTK_CSS_REPEAT_STYLE_REPEAT }, { &GTK_CSS_VALUE_BORDER_REPEAT, 1, TRUE, FALSE, GTK_CSS_REPEAT_STYLE_STRETCH, GTK_CSS_REPEAT_STYLE_REPEAT },
{ &GTK_CSS_VALUE_BORDER_REPEAT, 1, TRUE, GTK_CSS_REPEAT_STYLE_STRETCH, GTK_CSS_REPEAT_STYLE_ROUND }, { &GTK_CSS_VALUE_BORDER_REPEAT, 1, TRUE, FALSE, GTK_CSS_REPEAT_STYLE_STRETCH, GTK_CSS_REPEAT_STYLE_ROUND },
{ &GTK_CSS_VALUE_BORDER_REPEAT, 1, TRUE, GTK_CSS_REPEAT_STYLE_STRETCH, GTK_CSS_REPEAT_STYLE_SPACE } { &GTK_CSS_VALUE_BORDER_REPEAT, 1, TRUE, FALSE, GTK_CSS_REPEAT_STYLE_STRETCH, GTK_CSS_REPEAT_STYLE_SPACE }
} }, } },
{ "repeat", { "repeat",
{ { &GTK_CSS_VALUE_BORDER_REPEAT, 1, TRUE, GTK_CSS_REPEAT_STYLE_REPEAT, GTK_CSS_REPEAT_STYLE_STRETCH }, { { &GTK_CSS_VALUE_BORDER_REPEAT, 1, TRUE, FALSE, GTK_CSS_REPEAT_STYLE_REPEAT, GTK_CSS_REPEAT_STYLE_STRETCH },
{ &GTK_CSS_VALUE_BORDER_REPEAT, 1, TRUE, GTK_CSS_REPEAT_STYLE_REPEAT, GTK_CSS_REPEAT_STYLE_REPEAT }, { &GTK_CSS_VALUE_BORDER_REPEAT, 1, TRUE, FALSE, GTK_CSS_REPEAT_STYLE_REPEAT, GTK_CSS_REPEAT_STYLE_REPEAT },
{ &GTK_CSS_VALUE_BORDER_REPEAT, 1, TRUE, GTK_CSS_REPEAT_STYLE_REPEAT, GTK_CSS_REPEAT_STYLE_ROUND }, { &GTK_CSS_VALUE_BORDER_REPEAT, 1, TRUE, FALSE, GTK_CSS_REPEAT_STYLE_REPEAT, GTK_CSS_REPEAT_STYLE_ROUND },
{ &GTK_CSS_VALUE_BORDER_REPEAT, 1, TRUE, GTK_CSS_REPEAT_STYLE_REPEAT, GTK_CSS_REPEAT_STYLE_SPACE } { &GTK_CSS_VALUE_BORDER_REPEAT, 1, TRUE, FALSE, GTK_CSS_REPEAT_STYLE_REPEAT, GTK_CSS_REPEAT_STYLE_SPACE }
} }, } },
{ "round", { "round",
{ { &GTK_CSS_VALUE_BORDER_REPEAT, 1, TRUE, GTK_CSS_REPEAT_STYLE_ROUND, GTK_CSS_REPEAT_STYLE_STRETCH }, { { &GTK_CSS_VALUE_BORDER_REPEAT, 1, TRUE, FALSE, GTK_CSS_REPEAT_STYLE_ROUND, GTK_CSS_REPEAT_STYLE_STRETCH },
{ &GTK_CSS_VALUE_BORDER_REPEAT, 1, TRUE, GTK_CSS_REPEAT_STYLE_ROUND, GTK_CSS_REPEAT_STYLE_REPEAT }, { &GTK_CSS_VALUE_BORDER_REPEAT, 1, TRUE, FALSE, GTK_CSS_REPEAT_STYLE_ROUND, GTK_CSS_REPEAT_STYLE_REPEAT },
{ &GTK_CSS_VALUE_BORDER_REPEAT, 1, TRUE, GTK_CSS_REPEAT_STYLE_ROUND, GTK_CSS_REPEAT_STYLE_ROUND }, { &GTK_CSS_VALUE_BORDER_REPEAT, 1, TRUE, FALSE, GTK_CSS_REPEAT_STYLE_ROUND, GTK_CSS_REPEAT_STYLE_ROUND },
{ &GTK_CSS_VALUE_BORDER_REPEAT, 1, TRUE, GTK_CSS_REPEAT_STYLE_ROUND, GTK_CSS_REPEAT_STYLE_SPACE } { &GTK_CSS_VALUE_BORDER_REPEAT, 1, TRUE, FALSE, GTK_CSS_REPEAT_STYLE_ROUND, GTK_CSS_REPEAT_STYLE_SPACE }
} }, } },
{ "space", { "space",
{ { &GTK_CSS_VALUE_BORDER_REPEAT, 1, TRUE, GTK_CSS_REPEAT_STYLE_SPACE, GTK_CSS_REPEAT_STYLE_STRETCH }, { { &GTK_CSS_VALUE_BORDER_REPEAT, 1, TRUE, FALSE, GTK_CSS_REPEAT_STYLE_SPACE, GTK_CSS_REPEAT_STYLE_STRETCH },
{ &GTK_CSS_VALUE_BORDER_REPEAT, 1, TRUE, GTK_CSS_REPEAT_STYLE_SPACE, GTK_CSS_REPEAT_STYLE_REPEAT }, { &GTK_CSS_VALUE_BORDER_REPEAT, 1, TRUE, FALSE, GTK_CSS_REPEAT_STYLE_SPACE, GTK_CSS_REPEAT_STYLE_REPEAT },
{ &GTK_CSS_VALUE_BORDER_REPEAT, 1, TRUE, GTK_CSS_REPEAT_STYLE_SPACE, GTK_CSS_REPEAT_STYLE_ROUND }, { &GTK_CSS_VALUE_BORDER_REPEAT, 1, TRUE, FALSE, GTK_CSS_REPEAT_STYLE_SPACE, GTK_CSS_REPEAT_STYLE_ROUND },
{ &GTK_CSS_VALUE_BORDER_REPEAT, 1, TRUE, GTK_CSS_REPEAT_STYLE_SPACE, GTK_CSS_REPEAT_STYLE_SPACE } { &GTK_CSS_VALUE_BORDER_REPEAT, 1, TRUE, FALSE, GTK_CSS_REPEAT_STYLE_SPACE, GTK_CSS_REPEAT_STYLE_SPACE }
} } } }
}; };
+8 -10
View File
@@ -113,11 +113,9 @@ gtk_css_value_shadow_free (GtkCssValue *value)
} }
static GtkCssValue * static GtkCssValue *
gtk_css_value_shadow_compute (GtkCssValue *value, gtk_css_value_shadow_compute (GtkCssValue *value,
guint property_id, guint property_id,
GtkStyleProvider *provider, GtkCssComputeContext *context)
GtkCssStyle *style,
GtkCssStyle *parent_style)
{ {
guint i; guint i;
ShadowValue *shadows; ShadowValue *shadows;
@@ -128,11 +126,11 @@ gtk_css_value_shadow_compute (GtkCssValue *value,
{ {
const ShadowValue *shadow = &value->shadows[i]; const ShadowValue *shadow = &value->shadows[i];
shadows[i].hoffset = _gtk_css_value_compute (shadow->hoffset, property_id, provider, style, parent_style); shadows[i].hoffset = _gtk_css_value_compute (shadow->hoffset, property_id, context);
shadows[i].voffset = _gtk_css_value_compute (shadow->voffset, property_id, provider, style, parent_style); shadows[i].voffset = _gtk_css_value_compute (shadow->voffset, property_id, context);
shadows[i].radius = _gtk_css_value_compute (shadow->radius, property_id, provider, style, parent_style); shadows[i].radius = _gtk_css_value_compute (shadow->radius, property_id, context);
shadows[i].spread = _gtk_css_value_compute (shadow->spread, property_id, provider, style, parent_style), shadows[i].spread = _gtk_css_value_compute (shadow->spread, property_id, context),
shadows[i].color = _gtk_css_value_compute (shadow->color, property_id, provider, style, parent_style); shadows[i].color = _gtk_css_value_compute (shadow->color, property_id, context);
shadows[i].inset = shadow->inset; shadows[i].inset = shadow->inset;
} }
+8 -1
View File
@@ -160,7 +160,14 @@ guint
_gtk_css_shorthand_property_get_n_subproperties (GtkCssShorthandProperty *shorthand) _gtk_css_shorthand_property_get_n_subproperties (GtkCssShorthandProperty *shorthand)
{ {
g_return_val_if_fail (GTK_IS_CSS_SHORTHAND_PROPERTY (shorthand), 0); g_return_val_if_fail (GTK_IS_CSS_SHORTHAND_PROPERTY (shorthand), 0);
return shorthand->subproperties->len; return shorthand->subproperties->len;
} }
guint
_gtk_css_shorthand_property_get_id (GtkCssShorthandProperty *shorthand)
{
g_return_val_if_fail (GTK_IS_CSS_SHORTHAND_PROPERTY (shorthand), 0);
return shorthand->id;
}
+23
View File
@@ -1093,6 +1093,7 @@ parse_all (GtkCssShorthandProperty *shorthand,
static void static void
gtk_css_shorthand_property_register (const char *name, gtk_css_shorthand_property_register (const char *name,
unsigned int id,
const char **subproperties, const char **subproperties,
GtkCssShorthandPropertyParseFunc parse_func) GtkCssShorthandPropertyParseFunc parse_func)
{ {
@@ -1103,6 +1104,8 @@ gtk_css_shorthand_property_register (const char *name,
"subproperties", subproperties, "subproperties", subproperties,
NULL); NULL);
node->id = id;
node->parse = parse_func; node->parse = parse_func;
} }
@@ -1158,65 +1161,85 @@ _gtk_css_shorthand_property_init_properties (void)
const char **all_subproperties; const char **all_subproperties;
gtk_css_shorthand_property_register ("font", gtk_css_shorthand_property_register ("font",
GTK_CSS_SHORTHAND_PROPERTY_FONT,
font_subproperties, font_subproperties,
parse_font); parse_font);
gtk_css_shorthand_property_register ("margin", gtk_css_shorthand_property_register ("margin",
GTK_CSS_SHORTHAND_PROPERTY_MARGIN,
margin_subproperties, margin_subproperties,
parse_margin); parse_margin);
gtk_css_shorthand_property_register ("padding", gtk_css_shorthand_property_register ("padding",
GTK_CSS_SHORTHAND_PROPERTY_PADDING,
padding_subproperties, padding_subproperties,
parse_padding); parse_padding);
gtk_css_shorthand_property_register ("border-width", gtk_css_shorthand_property_register ("border-width",
GTK_CSS_SHORTHAND_PROPERTY_BORDER_WIDTH,
border_width_subproperties, border_width_subproperties,
parse_border_width); parse_border_width);
gtk_css_shorthand_property_register ("border-radius", gtk_css_shorthand_property_register ("border-radius",
GTK_CSS_SHORTHAND_PROPERTY_BORDER_RADIUS,
border_radius_subproperties, border_radius_subproperties,
parse_border_radius); parse_border_radius);
gtk_css_shorthand_property_register ("border-color", gtk_css_shorthand_property_register ("border-color",
GTK_CSS_SHORTHAND_PROPERTY_BORDER_COLOR,
border_color_subproperties, border_color_subproperties,
parse_border_color); parse_border_color);
gtk_css_shorthand_property_register ("border-style", gtk_css_shorthand_property_register ("border-style",
GTK_CSS_SHORTHAND_PROPERTY_BORDER_STYLE,
border_style_subproperties, border_style_subproperties,
parse_border_style); parse_border_style);
gtk_css_shorthand_property_register ("border-image", gtk_css_shorthand_property_register ("border-image",
GTK_CSS_SHORTHAND_PROPERTY_BORDER_IMAGE,
border_image_subproperties, border_image_subproperties,
parse_border_image); parse_border_image);
gtk_css_shorthand_property_register ("border-top", gtk_css_shorthand_property_register ("border-top",
GTK_CSS_SHORTHAND_PROPERTY_BORDER_TOP,
border_top_subproperties, border_top_subproperties,
parse_border_side); parse_border_side);
gtk_css_shorthand_property_register ("border-right", gtk_css_shorthand_property_register ("border-right",
GTK_CSS_SHORTHAND_PROPERTY_BORDER_RIGHT,
border_right_subproperties, border_right_subproperties,
parse_border_side); parse_border_side);
gtk_css_shorthand_property_register ("border-bottom", gtk_css_shorthand_property_register ("border-bottom",
GTK_CSS_SHORTHAND_PROPERTY_BORDER_BOTTOM,
border_bottom_subproperties, border_bottom_subproperties,
parse_border_side); parse_border_side);
gtk_css_shorthand_property_register ("border-left", gtk_css_shorthand_property_register ("border-left",
GTK_CSS_SHORTHAND_PROPERTY_BORDER_LEFT,
border_left_subproperties, border_left_subproperties,
parse_border_side); parse_border_side);
gtk_css_shorthand_property_register ("border", gtk_css_shorthand_property_register ("border",
GTK_CSS_SHORTHAND_PROPERTY_BORDER,
border_subproperties, border_subproperties,
parse_border); parse_border);
gtk_css_shorthand_property_register ("outline", gtk_css_shorthand_property_register ("outline",
GTK_CSS_SHORTHAND_PROPERTY_OUTLINE,
outline_subproperties, outline_subproperties,
parse_border_side); parse_border_side);
gtk_css_shorthand_property_register ("background", gtk_css_shorthand_property_register ("background",
GTK_CSS_SHORTHAND_PROPERTY_BACKGROUND,
background_subproperties, background_subproperties,
parse_background); parse_background);
gtk_css_shorthand_property_register ("transition", gtk_css_shorthand_property_register ("transition",
GTK_CSS_SHORTHAND_PROPERTY_TRANSITION,
transition_subproperties, transition_subproperties,
parse_transition); parse_transition);
gtk_css_shorthand_property_register ("animation", gtk_css_shorthand_property_register ("animation",
GTK_CSS_SHORTHAND_PROPERTY_ANIMATION,
animation_subproperties, animation_subproperties,
parse_animation); parse_animation);
gtk_css_shorthand_property_register ("text-decoration", gtk_css_shorthand_property_register ("text-decoration",
GTK_CSS_SHORTHAND_PROPERTY_TEXT_DECORATION,
text_decoration_subproperties, text_decoration_subproperties,
parse_text_decoration); parse_text_decoration);
gtk_css_shorthand_property_register ("font-variant", gtk_css_shorthand_property_register ("font-variant",
GTK_CSS_SHORTHAND_PROPERTY_FONT_VARIANT,
font_variant_subproperties, font_variant_subproperties,
parse_font_variant); parse_font_variant);
all_subproperties = get_all_subproperties (); all_subproperties = get_all_subproperties ();
gtk_css_shorthand_property_register ("all", gtk_css_shorthand_property_register ("all",
GTK_CSS_SHORTHAND_PROPERTY_ALL,
all_subproperties, all_subproperties,
parse_all); parse_all);
g_free (all_subproperties); g_free (all_subproperties);
+4
View File
@@ -49,6 +49,8 @@ struct _GtkCssShorthandProperty
GPtrArray *subproperties; GPtrArray *subproperties;
guint id;
GtkCssShorthandPropertyParseFunc parse; GtkCssShorthandPropertyParseFunc parse;
}; };
@@ -65,6 +67,8 @@ GtkCssStyleProperty * _gtk_css_shorthand_property_get_subproperty (GtkCssS
guint property); guint property);
guint _gtk_css_shorthand_property_get_n_subproperties (GtkCssShorthandProperty *shorthand) G_GNUC_CONST; guint _gtk_css_shorthand_property_get_n_subproperties (GtkCssShorthandProperty *shorthand) G_GNUC_CONST;
guint _gtk_css_shorthand_property_get_id (GtkCssShorthandProperty *shorthand) G_GNUC_CONST;
G_END_DECLS G_END_DECLS
+224 -232
View File
@@ -31,6 +31,7 @@
#include "gtkcssstringvalueprivate.h" #include "gtkcssstringvalueprivate.h"
#include "gtkcssstylepropertyprivate.h" #include "gtkcssstylepropertyprivate.h"
#include "gtkcsstransitionprivate.h" #include "gtkcsstransitionprivate.h"
#include "gtkcssvaluesprivate.h"
#include "gtkprivate.h" #include "gtkprivate.h"
#include "gtksettings.h" #include "gtksettings.h"
#include "gtkstyleanimationprivate.h" #include "gtkstyleanimationprivate.h"
@@ -38,136 +39,11 @@
#include "gtkstyleproviderprivate.h" #include "gtkstyleproviderprivate.h"
#include "gtkcssdimensionvalueprivate.h" #include "gtkcssdimensionvalueprivate.h"
static void gtk_css_static_style_compute_value (GtkCssStaticStyle *style, static void gtk_css_static_style_compute_value (GtkCssStaticStyle *style,
GtkStyleProvider *provider, guint id,
GtkCssStyle *parent_style, GtkCssValue *specified,
guint id, GtkCssSection *section,
GtkCssValue *specified, GtkCssComputeContext *context);
GtkCssSection *section);
static const int core_props[] = {
GTK_CSS_PROPERTY_COLOR,
GTK_CSS_PROPERTY_DPI,
GTK_CSS_PROPERTY_FONT_SIZE,
GTK_CSS_PROPERTY_ICON_PALETTE
};
static const int background_props[] = {
GTK_CSS_PROPERTY_BACKGROUND_COLOR,
GTK_CSS_PROPERTY_BOX_SHADOW,
GTK_CSS_PROPERTY_BACKGROUND_CLIP,
GTK_CSS_PROPERTY_BACKGROUND_ORIGIN,
GTK_CSS_PROPERTY_BACKGROUND_SIZE,
GTK_CSS_PROPERTY_BACKGROUND_POSITION,
GTK_CSS_PROPERTY_BACKGROUND_REPEAT,
GTK_CSS_PROPERTY_BACKGROUND_IMAGE,
GTK_CSS_PROPERTY_BACKGROUND_BLEND_MODE
};
static const int border_props[] = {
GTK_CSS_PROPERTY_BORDER_TOP_STYLE,
GTK_CSS_PROPERTY_BORDER_TOP_WIDTH,
GTK_CSS_PROPERTY_BORDER_LEFT_STYLE,
GTK_CSS_PROPERTY_BORDER_LEFT_WIDTH,
GTK_CSS_PROPERTY_BORDER_BOTTOM_STYLE,
GTK_CSS_PROPERTY_BORDER_BOTTOM_WIDTH,
GTK_CSS_PROPERTY_BORDER_RIGHT_STYLE,
GTK_CSS_PROPERTY_BORDER_RIGHT_WIDTH,
GTK_CSS_PROPERTY_BORDER_TOP_LEFT_RADIUS,
GTK_CSS_PROPERTY_BORDER_TOP_RIGHT_RADIUS,
GTK_CSS_PROPERTY_BORDER_BOTTOM_RIGHT_RADIUS,
GTK_CSS_PROPERTY_BORDER_BOTTOM_LEFT_RADIUS,
GTK_CSS_PROPERTY_BORDER_TOP_COLOR,
GTK_CSS_PROPERTY_BORDER_RIGHT_COLOR,
GTK_CSS_PROPERTY_BORDER_BOTTOM_COLOR,
GTK_CSS_PROPERTY_BORDER_LEFT_COLOR,
GTK_CSS_PROPERTY_BORDER_IMAGE_SOURCE,
GTK_CSS_PROPERTY_BORDER_IMAGE_REPEAT,
GTK_CSS_PROPERTY_BORDER_IMAGE_SLICE,
GTK_CSS_PROPERTY_BORDER_IMAGE_WIDTH
};
static const int icon_props[] = {
GTK_CSS_PROPERTY_ICON_SIZE,
GTK_CSS_PROPERTY_ICON_SHADOW,
GTK_CSS_PROPERTY_ICON_STYLE,
};
static const int outline_props[] = {
GTK_CSS_PROPERTY_OUTLINE_STYLE,
GTK_CSS_PROPERTY_OUTLINE_WIDTH,
GTK_CSS_PROPERTY_OUTLINE_OFFSET,
GTK_CSS_PROPERTY_OUTLINE_COLOR,
};
static const int font_props[] = {
GTK_CSS_PROPERTY_FONT_FAMILY,
GTK_CSS_PROPERTY_FONT_STYLE,
GTK_CSS_PROPERTY_FONT_WEIGHT,
GTK_CSS_PROPERTY_FONT_STRETCH,
GTK_CSS_PROPERTY_LETTER_SPACING,
GTK_CSS_PROPERTY_TEXT_SHADOW,
GTK_CSS_PROPERTY_CARET_COLOR,
GTK_CSS_PROPERTY_SECONDARY_CARET_COLOR,
GTK_CSS_PROPERTY_FONT_FEATURE_SETTINGS,
GTK_CSS_PROPERTY_FONT_VARIATION_SETTINGS,
GTK_CSS_PROPERTY_LINE_HEIGHT,
};
static const int font_variant_props[] = {
GTK_CSS_PROPERTY_TEXT_DECORATION_LINE,
GTK_CSS_PROPERTY_TEXT_DECORATION_COLOR,
GTK_CSS_PROPERTY_TEXT_DECORATION_STYLE,
GTK_CSS_PROPERTY_TEXT_TRANSFORM,
GTK_CSS_PROPERTY_FONT_KERNING,
GTK_CSS_PROPERTY_FONT_VARIANT_LIGATURES,
GTK_CSS_PROPERTY_FONT_VARIANT_POSITION,
GTK_CSS_PROPERTY_FONT_VARIANT_CAPS,
GTK_CSS_PROPERTY_FONT_VARIANT_NUMERIC,
GTK_CSS_PROPERTY_FONT_VARIANT_ALTERNATES,
GTK_CSS_PROPERTY_FONT_VARIANT_EAST_ASIAN,
};
static const int animation_props[] = {
GTK_CSS_PROPERTY_ANIMATION_NAME,
GTK_CSS_PROPERTY_ANIMATION_DURATION,
GTK_CSS_PROPERTY_ANIMATION_TIMING_FUNCTION,
GTK_CSS_PROPERTY_ANIMATION_ITERATION_COUNT,
GTK_CSS_PROPERTY_ANIMATION_DIRECTION,
GTK_CSS_PROPERTY_ANIMATION_PLAY_STATE,
GTK_CSS_PROPERTY_ANIMATION_DELAY,
GTK_CSS_PROPERTY_ANIMATION_FILL_MODE,
};
static const int transition_props[] = {
GTK_CSS_PROPERTY_TRANSITION_PROPERTY,
GTK_CSS_PROPERTY_TRANSITION_DURATION,
GTK_CSS_PROPERTY_TRANSITION_TIMING_FUNCTION,
GTK_CSS_PROPERTY_TRANSITION_DELAY,
};
static const int size_props[] = {
GTK_CSS_PROPERTY_MARGIN_TOP,
GTK_CSS_PROPERTY_MARGIN_LEFT,
GTK_CSS_PROPERTY_MARGIN_BOTTOM,
GTK_CSS_PROPERTY_MARGIN_RIGHT,
GTK_CSS_PROPERTY_PADDING_TOP,
GTK_CSS_PROPERTY_PADDING_LEFT,
GTK_CSS_PROPERTY_PADDING_BOTTOM,
GTK_CSS_PROPERTY_PADDING_RIGHT,
GTK_CSS_PROPERTY_BORDER_SPACING,
GTK_CSS_PROPERTY_MIN_WIDTH,
GTK_CSS_PROPERTY_MIN_HEIGHT,
};
static const int other_props[] = {
GTK_CSS_PROPERTY_ICON_SOURCE,
GTK_CSS_PROPERTY_ICON_TRANSFORM,
GTK_CSS_PROPERTY_ICON_FILTER,
GTK_CSS_PROPERTY_TRANSFORM,
GTK_CSS_PROPERTY_TRANSFORM_ORIGIN,
GTK_CSS_PROPERTY_OPACITY,
GTK_CSS_PROPERTY_FILTER,
};
#define GET_VALUES(v) (GtkCssValue **)((guint8*)(v) + sizeof (GtkCssValues)) #define GET_VALUES(v) (GtkCssValue **)((guint8*)(v) + sizeof (GtkCssValues))
@@ -195,10 +71,9 @@ gtk_css_## NAME ## _values_compute_changes_and_affects (GtkCssStyle *style1, \
} \ } \
\ \
static inline void \ static inline void \
gtk_css_ ## NAME ## _values_new_compute (GtkCssStaticStyle *sstyle, \ gtk_css_ ## NAME ## _values_new_compute (GtkCssStaticStyle *sstyle, \
GtkStyleProvider *provider, \ GtkCssLookup *lookup, \
GtkCssStyle *parent_style, \ GtkCssComputeContext *context) \
GtkCssLookup *lookup) \
{ \ { \
GtkCssStyle *style = (GtkCssStyle *)sstyle; \ GtkCssStyle *style = (GtkCssStyle *)sstyle; \
int i; \ int i; \
@@ -209,11 +84,10 @@ gtk_css_ ## NAME ## _values_new_compute (GtkCssStaticStyle *sstyle, \
{ \ { \
guint id = NAME ## _props[i]; \ guint id = NAME ## _props[i]; \
gtk_css_static_style_compute_value (sstyle, \ gtk_css_static_style_compute_value (sstyle, \
provider, \
parent_style, \
id, \ id, \
lookup->values[id].value, \ lookup->values[id].value, \
lookup->values[id].section); \ lookup->values[id].section, \
context); \
} \ } \
} \ } \
static GtkBitmask * gtk_css_ ## NAME ## _values_mask; \ static GtkBitmask * gtk_css_ ## NAME ## _values_mask; \
@@ -322,6 +196,12 @@ gtk_css_static_style_dispose (GObject *object)
style->sections = NULL; style->sections = NULL;
} }
if (style->original_values)
{
g_ptr_array_unref (style->original_values);
style->original_values = NULL;
}
G_OBJECT_CLASS (gtk_css_static_style_parent_class)->dispose (object); G_OBJECT_CLASS (gtk_css_static_style_parent_class)->dispose (object);
} }
@@ -331,6 +211,19 @@ gtk_css_static_style_get_static_style (GtkCssStyle *style)
return (GtkCssStaticStyle *)style; return (GtkCssStaticStyle *)style;
} }
static GtkCssValue *
gtk_css_static_style_get_original_value (GtkCssStyle *style,
guint id)
{
GtkCssStaticStyle *sstyle = GTK_CSS_STATIC_STYLE (style);
if (sstyle->original_values == NULL ||
id >= sstyle->original_values->len)
return NULL;
return g_ptr_array_index (sstyle->original_values, id);
}
static void static void
gtk_css_static_style_class_init (GtkCssStaticStyleClass *klass) gtk_css_static_style_class_init (GtkCssStaticStyleClass *klass)
{ {
@@ -341,6 +234,7 @@ gtk_css_static_style_class_init (GtkCssStaticStyleClass *klass)
style_class->get_section = gtk_css_static_style_get_section; style_class->get_section = gtk_css_static_style_get_section;
style_class->get_static_style = gtk_css_static_style_get_static_style; style_class->get_static_style = gtk_css_static_style_get_static_style;
style_class->get_original_value = gtk_css_static_style_get_original_value;
gtk_css_core_values_init (); gtk_css_core_values_init ();
gtk_css_background_values_init (); gtk_css_background_values_init ();
@@ -369,6 +263,13 @@ maybe_unref_section (gpointer section)
gtk_css_section_unref (section); gtk_css_section_unref (section);
} }
static void
maybe_unref_value (gpointer value)
{
if (value)
_gtk_css_value_unref (value);
}
static inline void static inline void
gtk_css_take_value (GtkCssValue **variable, gtk_css_take_value (GtkCssValue **variable,
GtkCssValue *value) GtkCssValue *value)
@@ -382,6 +283,7 @@ static void
gtk_css_static_style_set_value (GtkCssStaticStyle *sstyle, gtk_css_static_style_set_value (GtkCssStaticStyle *sstyle,
guint id, guint id,
GtkCssValue *value, GtkCssValue *value,
GtkCssValue *original_value,
GtkCssSection *section) GtkCssSection *section)
{ {
GtkCssStyle *style = (GtkCssStyle *)sstyle; GtkCssStyle *style = (GtkCssStyle *)sstyle;
@@ -684,6 +586,22 @@ gtk_css_static_style_set_value (GtkCssStaticStyle *sstyle,
g_ptr_array_set_size (sstyle->sections, id + 1); g_ptr_array_set_size (sstyle->sections, id + 1);
g_ptr_array_index (sstyle->sections, id) = gtk_css_section_ref (section); g_ptr_array_index (sstyle->sections, id) = gtk_css_section_ref (section);
} }
if (sstyle->original_values && sstyle->original_values->len > id &&
g_ptr_array_index (sstyle->original_values, id))
{
_gtk_css_value_unref (g_ptr_array_index (sstyle->original_values, id));
g_ptr_array_index (sstyle->original_values, id) = NULL;
}
if (original_value)
{
if (sstyle->original_values == NULL)
sstyle->original_values = g_ptr_array_new_with_free_func (maybe_unref_value);
if (sstyle->original_values->len <= id)
g_ptr_array_set_size (sstyle->original_values, id + 1);
g_ptr_array_index (sstyle->original_values, id) = _gtk_css_value_ref (original_value);
}
} }
static GtkCssStyle *default_style; static GtkCssStyle *default_style;
@@ -729,18 +647,19 @@ static GtkCssValues *
gtk_css_background_create_initial_values (void) gtk_css_background_create_initial_values (void)
{ {
GtkCssBackgroundValues *values; GtkCssBackgroundValues *values;
GtkCssComputeContext context = { NULL, };
values = (GtkCssBackgroundValues *)gtk_css_values_new (GTK_CSS_BACKGROUND_INITIAL_VALUES); values = (GtkCssBackgroundValues *)gtk_css_values_new (GTK_CSS_BACKGROUND_INITIAL_VALUES);
values->background_color = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BACKGROUND_COLOR, NULL, NULL, NULL); values->background_color = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BACKGROUND_COLOR, &context);
values->box_shadow = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BOX_SHADOW, NULL, NULL, NULL); values->box_shadow = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BOX_SHADOW, &context);
values->background_clip = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BACKGROUND_CLIP, NULL, NULL, NULL); values->background_clip = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BACKGROUND_CLIP, &context);
values->background_origin = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BACKGROUND_ORIGIN, NULL, NULL, NULL); values->background_origin = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BACKGROUND_ORIGIN, &context);
values->background_size = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BACKGROUND_SIZE, NULL, NULL, NULL); values->background_size = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BACKGROUND_SIZE, &context);
values->background_position = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BACKGROUND_POSITION, NULL, NULL, NULL); values->background_position = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BACKGROUND_POSITION, &context);
values->background_repeat = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BACKGROUND_REPEAT, NULL, NULL, NULL); values->background_repeat = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BACKGROUND_REPEAT, &context);
values->background_image = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BACKGROUND_IMAGE, NULL, NULL, NULL); values->background_image = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BACKGROUND_IMAGE, &context);
values->background_blend_mode = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BACKGROUND_BLEND_MODE, NULL, NULL, NULL); values->background_blend_mode = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BACKGROUND_BLEND_MODE, &context);
return (GtkCssValues *)values; return (GtkCssValues *)values;
} }
@@ -749,29 +668,30 @@ static GtkCssValues *
gtk_css_border_create_initial_values (void) gtk_css_border_create_initial_values (void)
{ {
GtkCssBorderValues *values; GtkCssBorderValues *values;
GtkCssComputeContext context = { NULL, };
values = (GtkCssBorderValues *)gtk_css_values_new (GTK_CSS_BORDER_INITIAL_VALUES); values = (GtkCssBorderValues *)gtk_css_values_new (GTK_CSS_BORDER_INITIAL_VALUES);
values->border_top_style = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_TOP_STYLE, NULL, NULL, NULL); values->border_top_style = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_TOP_STYLE, &context);
values->border_top_width = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_TOP_WIDTH, NULL, NULL, NULL); values->border_top_width = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_TOP_WIDTH, &context);
values->border_left_style = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_LEFT_STYLE, NULL, NULL, NULL); values->border_left_style = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_LEFT_STYLE, &context);
values->border_left_width = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_LEFT_WIDTH, NULL, NULL, NULL); values->border_left_width = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_LEFT_WIDTH, &context);
values->border_bottom_style = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_BOTTOM_STYLE, NULL, NULL, NULL); values->border_bottom_style = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_BOTTOM_STYLE, &context);
values->border_bottom_width = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_BOTTOM_WIDTH, NULL, NULL, NULL); values->border_bottom_width = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_BOTTOM_WIDTH, &context);
values->border_right_style = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_RIGHT_STYLE, NULL, NULL, NULL); values->border_right_style = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_RIGHT_STYLE, &context);
values->border_right_width = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_RIGHT_WIDTH, NULL, NULL, NULL); values->border_right_width = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_RIGHT_WIDTH, &context);
values->border_top_left_radius = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_TOP_LEFT_RADIUS, NULL, NULL, NULL); values->border_top_left_radius = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_TOP_LEFT_RADIUS, &context);
values->border_top_right_radius = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_TOP_RIGHT_RADIUS, NULL, NULL, NULL); values->border_top_right_radius = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_TOP_RIGHT_RADIUS, &context);
values->border_bottom_left_radius = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_BOTTOM_LEFT_RADIUS, NULL, NULL, NULL); values->border_bottom_left_radius = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_BOTTOM_LEFT_RADIUS, &context);
values->border_bottom_right_radius = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_BOTTOM_RIGHT_RADIUS, NULL, NULL, NULL); values->border_bottom_right_radius = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_BOTTOM_RIGHT_RADIUS, &context);
values->border_top_color = NULL; values->border_top_color = NULL;
values->border_right_color = NULL; values->border_right_color = NULL;
values->border_bottom_color = NULL; values->border_bottom_color = NULL;
values->border_left_color = NULL; values->border_left_color = NULL;
values->border_image_source = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_IMAGE_SOURCE, NULL, NULL, NULL); values->border_image_source = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_IMAGE_SOURCE, &context);
values->border_image_repeat = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_IMAGE_REPEAT, NULL, NULL, NULL); values->border_image_repeat = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_IMAGE_REPEAT, &context);
values->border_image_slice = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_IMAGE_SLICE, NULL, NULL, NULL); values->border_image_slice = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_IMAGE_SLICE, &context);
values->border_image_width = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_IMAGE_WIDTH, NULL, NULL, NULL); values->border_image_width = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_IMAGE_WIDTH, &context);
return (GtkCssValues *)values; return (GtkCssValues *)values;
} }
@@ -780,12 +700,13 @@ static GtkCssValues *
gtk_css_outline_create_initial_values (void) gtk_css_outline_create_initial_values (void)
{ {
GtkCssOutlineValues *values; GtkCssOutlineValues *values;
GtkCssComputeContext context = { NULL, };
values = (GtkCssOutlineValues *)gtk_css_values_new (GTK_CSS_OUTLINE_INITIAL_VALUES); values = (GtkCssOutlineValues *)gtk_css_values_new (GTK_CSS_OUTLINE_INITIAL_VALUES);
values->outline_style = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_OUTLINE_STYLE, NULL, NULL, NULL); values->outline_style = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_OUTLINE_STYLE, &context);
values->outline_width = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_OUTLINE_WIDTH, NULL, NULL, NULL); values->outline_width = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_OUTLINE_WIDTH, &context);
values->outline_offset = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_OUTLINE_OFFSET, NULL, NULL, NULL); values->outline_offset = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_OUTLINE_OFFSET, &context);
values->outline_color = NULL; values->outline_color = NULL;
return (GtkCssValues *)values; return (GtkCssValues *)values;
@@ -807,20 +728,21 @@ static GtkCssValues *
gtk_css_font_variant_create_initial_values (void) gtk_css_font_variant_create_initial_values (void)
{ {
GtkCssFontVariantValues *values; GtkCssFontVariantValues *values;
GtkCssComputeContext context = { NULL, };
values = (GtkCssFontVariantValues *)gtk_css_values_new (GTK_CSS_FONT_VARIANT_INITIAL_VALUES); values = (GtkCssFontVariantValues *)gtk_css_values_new (GTK_CSS_FONT_VARIANT_INITIAL_VALUES);
values->text_decoration_line = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_TEXT_DECORATION_LINE, NULL, NULL, NULL); values->text_decoration_line = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_TEXT_DECORATION_LINE, &context);
values->text_decoration_color = NULL; values->text_decoration_color = NULL;
values->text_decoration_style = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_TEXT_DECORATION_STYLE, NULL, NULL, NULL); values->text_decoration_style = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_TEXT_DECORATION_STYLE, &context);
values->text_transform = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_TEXT_TRANSFORM, NULL, NULL, NULL); values->text_transform = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_TEXT_TRANSFORM, &context);
values->font_kerning = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_FONT_KERNING, NULL, NULL, NULL); values->font_kerning = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_FONT_KERNING, &context);
values->font_variant_ligatures = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_FONT_VARIANT_LIGATURES, NULL, NULL, NULL); values->font_variant_ligatures = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_FONT_VARIANT_LIGATURES, &context);
values->font_variant_position = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_FONT_VARIANT_POSITION, NULL, NULL, NULL); values->font_variant_position = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_FONT_VARIANT_POSITION, &context);
values->font_variant_caps = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_FONT_VARIANT_CAPS, NULL, NULL, NULL); values->font_variant_caps = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_FONT_VARIANT_CAPS, &context);
values->font_variant_numeric = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_FONT_VARIANT_NUMERIC, NULL, NULL, NULL); values->font_variant_numeric = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_FONT_VARIANT_NUMERIC, &context);
values->font_variant_alternates = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_FONT_VARIANT_ALTERNATES, NULL, NULL, NULL); values->font_variant_alternates = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_FONT_VARIANT_ALTERNATES, &context);
values->font_variant_east_asian = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_FONT_VARIANT_EAST_ASIAN, NULL, NULL, NULL); values->font_variant_east_asian = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_FONT_VARIANT_EAST_ASIAN, &context);
return (GtkCssValues *)values; return (GtkCssValues *)values;
} }
@@ -829,17 +751,18 @@ static GtkCssValues *
gtk_css_animation_create_initial_values (void) gtk_css_animation_create_initial_values (void)
{ {
GtkCssAnimationValues *values; GtkCssAnimationValues *values;
GtkCssComputeContext context = { NULL, };
values = (GtkCssAnimationValues *)gtk_css_values_new (GTK_CSS_ANIMATION_INITIAL_VALUES); values = (GtkCssAnimationValues *)gtk_css_values_new (GTK_CSS_ANIMATION_INITIAL_VALUES);
values->animation_name = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_ANIMATION_NAME, NULL, NULL, NULL); values->animation_name = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_ANIMATION_NAME, &context);
values->animation_duration = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_ANIMATION_DURATION, NULL, NULL, NULL); values->animation_duration = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_ANIMATION_DURATION, &context);
values->animation_timing_function = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_ANIMATION_TIMING_FUNCTION, NULL, NULL, NULL); values->animation_timing_function = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_ANIMATION_TIMING_FUNCTION, &context);
values->animation_iteration_count = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_ANIMATION_ITERATION_COUNT, NULL, NULL, NULL); values->animation_iteration_count = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_ANIMATION_ITERATION_COUNT, &context);
values->animation_direction = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_ANIMATION_DIRECTION, NULL, NULL, NULL); values->animation_direction = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_ANIMATION_DIRECTION, &context);
values->animation_play_state = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_ANIMATION_PLAY_STATE, NULL, NULL, NULL); values->animation_play_state = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_ANIMATION_PLAY_STATE, &context);
values->animation_delay = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_ANIMATION_DELAY, NULL, NULL, NULL); values->animation_delay = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_ANIMATION_DELAY, &context);
values->animation_fill_mode = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_ANIMATION_FILL_MODE, NULL, NULL, NULL); values->animation_fill_mode = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_ANIMATION_FILL_MODE, &context);
return (GtkCssValues *)values; return (GtkCssValues *)values;
} }
@@ -848,13 +771,14 @@ static GtkCssValues *
gtk_css_transition_create_initial_values (void) gtk_css_transition_create_initial_values (void)
{ {
GtkCssTransitionValues *values; GtkCssTransitionValues *values;
GtkCssComputeContext context = { NULL, };
values = (GtkCssTransitionValues *)gtk_css_values_new (GTK_CSS_TRANSITION_INITIAL_VALUES); values = (GtkCssTransitionValues *)gtk_css_values_new (GTK_CSS_TRANSITION_INITIAL_VALUES);
values->transition_property = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_TRANSITION_PROPERTY, NULL, NULL, NULL); values->transition_property = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_TRANSITION_PROPERTY, &context);
values->transition_duration = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_TRANSITION_DURATION, NULL, NULL, NULL); values->transition_duration = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_TRANSITION_DURATION, &context);
values->transition_timing_function = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_TRANSITION_TIMING_FUNCTION, NULL, NULL, NULL); values->transition_timing_function = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_TRANSITION_TIMING_FUNCTION, &context);
values->transition_delay = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_TRANSITION_DELAY, NULL, NULL, NULL); values->transition_delay = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_TRANSITION_DELAY, &context);
return (GtkCssValues *)values; return (GtkCssValues *)values;
} }
@@ -863,20 +787,21 @@ static GtkCssValues *
gtk_css_size_create_initial_values (void) gtk_css_size_create_initial_values (void)
{ {
GtkCssSizeValues *values; GtkCssSizeValues *values;
GtkCssComputeContext context = { NULL, };
values = (GtkCssSizeValues *)gtk_css_values_new (GTK_CSS_SIZE_INITIAL_VALUES); values = (GtkCssSizeValues *)gtk_css_values_new (GTK_CSS_SIZE_INITIAL_VALUES);
values->margin_top = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_MARGIN_TOP, NULL, NULL, NULL); values->margin_top = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_MARGIN_TOP, &context);
values->margin_left = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_MARGIN_LEFT, NULL, NULL, NULL); values->margin_left = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_MARGIN_LEFT, &context);
values->margin_bottom = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_MARGIN_BOTTOM, NULL, NULL, NULL); values->margin_bottom = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_MARGIN_BOTTOM, &context);
values->margin_right = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_MARGIN_RIGHT, NULL, NULL, NULL); values->margin_right = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_MARGIN_RIGHT, &context);
values->padding_top = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_PADDING_TOP, NULL, NULL, NULL); values->padding_top = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_PADDING_TOP, &context);
values->padding_left = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_PADDING_LEFT, NULL, NULL, NULL); values->padding_left = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_PADDING_LEFT, &context);
values->padding_bottom = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_PADDING_BOTTOM, NULL, NULL, NULL); values->padding_bottom = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_PADDING_BOTTOM, &context);
values->padding_right = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_PADDING_RIGHT, NULL, NULL, NULL); values->padding_right = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_PADDING_RIGHT, &context);
values->border_spacing = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_SPACING, NULL, NULL, NULL); values->border_spacing = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_SPACING, &context);
values->min_width = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_MIN_WIDTH, NULL, NULL, NULL); values->min_width = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_MIN_WIDTH, &context);
values->min_height = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_MIN_HEIGHT, NULL, NULL, NULL); values->min_height = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_MIN_HEIGHT, &context);
return (GtkCssValues *)values; return (GtkCssValues *)values;
} }
@@ -885,16 +810,17 @@ static GtkCssValues *
gtk_css_other_create_initial_values (void) gtk_css_other_create_initial_values (void)
{ {
GtkCssOtherValues *values; GtkCssOtherValues *values;
GtkCssComputeContext context = { NULL, };
values = (GtkCssOtherValues *)gtk_css_values_new (GTK_CSS_OTHER_INITIAL_VALUES); values = (GtkCssOtherValues *)gtk_css_values_new (GTK_CSS_OTHER_INITIAL_VALUES);
values->icon_source = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_ICON_SOURCE, NULL, NULL, NULL); values->icon_source = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_ICON_SOURCE, &context);
values->icon_transform = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_ICON_TRANSFORM, NULL, NULL, NULL); values->icon_transform = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_ICON_TRANSFORM, &context);
values->icon_filter = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_ICON_FILTER, NULL, NULL, NULL); values->icon_filter = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_ICON_FILTER, &context);
values->transform = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_TRANSFORM, NULL, NULL, NULL); values->transform = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_TRANSFORM, &context);
values->transform_origin = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_TRANSFORM_ORIGIN, NULL, NULL, NULL); values->transform_origin = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_TRANSFORM_ORIGIN, &context);
values->opacity = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_OPACITY, NULL, NULL, NULL); values->opacity = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_OPACITY, &context);
values->filter = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_FILTER, NULL, NULL, NULL); values->filter = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_FILTER, &context);
return (GtkCssValues *)values; return (GtkCssValues *)values;
} }
@@ -906,12 +832,46 @@ gtk_css_lookup_resolve (GtkCssLookup *lookup,
GtkCssStyle *parent_style) GtkCssStyle *parent_style)
{ {
GtkCssStyle *style = (GtkCssStyle *)sstyle; GtkCssStyle *style = (GtkCssStyle *)sstyle;
GtkCssValue *shorthands[GTK_CSS_SHORTHAND_PROPERTY_N_PROPERTIES] = { NULL, };
GtkCssComputeContext context = { NULL, };
gtk_internal_return_if_fail (lookup != NULL); gtk_internal_return_if_fail (lookup != NULL);
gtk_internal_return_if_fail (GTK_IS_STYLE_PROVIDER (provider)); gtk_internal_return_if_fail (GTK_IS_STYLE_PROVIDER (provider));
gtk_internal_return_if_fail (GTK_IS_CSS_STATIC_STYLE (style)); gtk_internal_return_if_fail (GTK_IS_CSS_STATIC_STYLE (style));
gtk_internal_return_if_fail (parent_style == NULL || GTK_IS_CSS_STYLE (parent_style)); gtk_internal_return_if_fail (parent_style == NULL || GTK_IS_CSS_STYLE (parent_style));
if (lookup->custom_values)
{
GHashTableIter iter;
gpointer id;
GtkCssVariableValue *value;
g_clear_pointer (&style->variables, gtk_css_variable_set_unref);
style->variables = gtk_css_variable_set_new ();
g_hash_table_iter_init (&iter, lookup->custom_values);
while (g_hash_table_iter_next (&iter, &id, (gpointer) &value))
gtk_css_variable_set_add (style->variables, GPOINTER_TO_INT (id), value);
gtk_css_variable_set_resolve_cycles (style->variables);
if (parent_style)
{
gtk_css_variable_set_set_parent (style->variables,
parent_style->variables);
}
}
else if (parent_style && parent_style->variables)
{
style->variables = gtk_css_variable_set_ref (parent_style->variables);
}
context.provider = provider;
context.style = (GtkCssStyle *) sstyle;
context.parent_style = parent_style;
context.shorthands = shorthands;
if (_gtk_bitmask_is_empty (_gtk_css_lookup_get_set_values (lookup))) if (_gtk_bitmask_is_empty (_gtk_css_lookup_get_set_values (lookup)))
{ {
style->background = (GtkCssBackgroundValues *)gtk_css_values_ref (gtk_css_background_initial_values); style->background = (GtkCssBackgroundValues *)gtk_css_values_ref (gtk_css_background_initial_values);
@@ -931,9 +891,9 @@ gtk_css_lookup_resolve (GtkCssLookup *lookup,
} }
else else
{ {
gtk_css_core_values_new_compute (sstyle, provider, parent_style, lookup); gtk_css_core_values_new_compute (sstyle, lookup, &context);
gtk_css_icon_values_new_compute (sstyle, provider, parent_style, lookup); gtk_css_icon_values_new_compute (sstyle, lookup, &context);
gtk_css_font_values_new_compute (sstyle, provider, parent_style, lookup); gtk_css_font_values_new_compute (sstyle, lookup, &context);
} }
return; return;
@@ -942,57 +902,63 @@ gtk_css_lookup_resolve (GtkCssLookup *lookup,
if (parent_style && gtk_css_core_values_unset (lookup)) if (parent_style && gtk_css_core_values_unset (lookup))
style->core = (GtkCssCoreValues *)gtk_css_values_ref ((GtkCssValues *)parent_style->core); style->core = (GtkCssCoreValues *)gtk_css_values_ref ((GtkCssValues *)parent_style->core);
else else
gtk_css_core_values_new_compute (sstyle, provider, parent_style, lookup); gtk_css_core_values_new_compute (sstyle, lookup, &context);
if (gtk_css_background_values_unset (lookup)) if (gtk_css_background_values_unset (lookup))
style->background = (GtkCssBackgroundValues *)gtk_css_values_ref (gtk_css_background_initial_values); style->background = (GtkCssBackgroundValues *)gtk_css_values_ref (gtk_css_background_initial_values);
else else
gtk_css_background_values_new_compute (sstyle, provider, parent_style, lookup); gtk_css_background_values_new_compute (sstyle, lookup, &context);
if (gtk_css_border_values_unset (lookup)) if (gtk_css_border_values_unset (lookup))
style->border = (GtkCssBorderValues *)gtk_css_values_ref (gtk_css_border_initial_values); style->border = (GtkCssBorderValues *)gtk_css_values_ref (gtk_css_border_initial_values);
else else
gtk_css_border_values_new_compute (sstyle, provider, parent_style, lookup); gtk_css_border_values_new_compute (sstyle, lookup, &context);
if (parent_style && gtk_css_icon_values_unset (lookup)) if (parent_style && gtk_css_icon_values_unset (lookup))
style->icon = (GtkCssIconValues *)gtk_css_values_ref ((GtkCssValues *)parent_style->icon); style->icon = (GtkCssIconValues *)gtk_css_values_ref ((GtkCssValues *)parent_style->icon);
else else
gtk_css_icon_values_new_compute (sstyle, provider, parent_style, lookup); gtk_css_icon_values_new_compute (sstyle, lookup, &context);
if (gtk_css_outline_values_unset (lookup)) if (gtk_css_outline_values_unset (lookup))
style->outline = (GtkCssOutlineValues *)gtk_css_values_ref (gtk_css_outline_initial_values); style->outline = (GtkCssOutlineValues *)gtk_css_values_ref (gtk_css_outline_initial_values);
else else
gtk_css_outline_values_new_compute (sstyle, provider, parent_style, lookup); gtk_css_outline_values_new_compute (sstyle, lookup, &context);
if (parent_style && gtk_css_font_values_unset (lookup)) if (parent_style && gtk_css_font_values_unset (lookup))
style->font = (GtkCssFontValues *)gtk_css_values_ref ((GtkCssValues *)parent_style->font); style->font = (GtkCssFontValues *)gtk_css_values_ref ((GtkCssValues *)parent_style->font);
else else
gtk_css_font_values_new_compute (sstyle, provider, parent_style, lookup); gtk_css_font_values_new_compute (sstyle, lookup, &context);
if (gtk_css_font_variant_values_unset (lookup)) if (gtk_css_font_variant_values_unset (lookup))
style->font_variant = (GtkCssFontVariantValues *)gtk_css_values_ref (gtk_css_font_variant_initial_values); style->font_variant = (GtkCssFontVariantValues *)gtk_css_values_ref (gtk_css_font_variant_initial_values);
else else
gtk_css_font_variant_values_new_compute (sstyle, provider, parent_style, lookup); gtk_css_font_variant_values_new_compute (sstyle, lookup, &context);
if (gtk_css_animation_values_unset (lookup)) if (gtk_css_animation_values_unset (lookup))
style->animation = (GtkCssAnimationValues *)gtk_css_values_ref (gtk_css_animation_initial_values); style->animation = (GtkCssAnimationValues *)gtk_css_values_ref (gtk_css_animation_initial_values);
else else
gtk_css_animation_values_new_compute (sstyle, provider, parent_style, lookup); gtk_css_animation_values_new_compute (sstyle, lookup, &context);
if (gtk_css_transition_values_unset (lookup)) if (gtk_css_transition_values_unset (lookup))
style->transition = (GtkCssTransitionValues *)gtk_css_values_ref (gtk_css_transition_initial_values); style->transition = (GtkCssTransitionValues *)gtk_css_values_ref (gtk_css_transition_initial_values);
else else
gtk_css_transition_values_new_compute (sstyle, provider, parent_style, lookup); gtk_css_transition_values_new_compute (sstyle, lookup, &context);
if (gtk_css_size_values_unset (lookup)) if (gtk_css_size_values_unset (lookup))
style->size = (GtkCssSizeValues *)gtk_css_values_ref (gtk_css_size_initial_values); style->size = (GtkCssSizeValues *)gtk_css_values_ref (gtk_css_size_initial_values);
else else
gtk_css_size_values_new_compute (sstyle, provider, parent_style, lookup); gtk_css_size_values_new_compute (sstyle, lookup, &context);
if (gtk_css_other_values_unset (lookup)) if (gtk_css_other_values_unset (lookup))
style->other = (GtkCssOtherValues *)gtk_css_values_ref (gtk_css_other_initial_values); style->other = (GtkCssOtherValues *)gtk_css_values_ref (gtk_css_other_initial_values);
else else
gtk_css_other_values_new_compute (sstyle, provider, parent_style, lookup); gtk_css_other_values_new_compute (sstyle, lookup, &context);
for (unsigned int i = 0; i < GTK_CSS_SHORTHAND_PROPERTY_N_PROPERTIES; i++)
{
if (shorthands[i])
gtk_css_value_unref (shorthands[i]);
}
} }
GtkCssStyle * GtkCssStyle *
@@ -1040,14 +1006,13 @@ G_STATIC_ASSERT (GTK_CSS_PROPERTY_BORDER_LEFT_STYLE == GTK_CSS_PROPERTY_BORDER_L
G_STATIC_ASSERT (GTK_CSS_PROPERTY_OUTLINE_STYLE == GTK_CSS_PROPERTY_OUTLINE_WIDTH - 1); G_STATIC_ASSERT (GTK_CSS_PROPERTY_OUTLINE_STYLE == GTK_CSS_PROPERTY_OUTLINE_WIDTH - 1);
static void static void
gtk_css_static_style_compute_value (GtkCssStaticStyle *style, gtk_css_static_style_compute_value (GtkCssStaticStyle *style,
GtkStyleProvider *provider, guint id,
GtkCssStyle *parent_style, GtkCssValue *specified,
guint id, GtkCssSection *section,
GtkCssValue *specified, GtkCssComputeContext *context)
GtkCssSection *section)
{ {
GtkCssValue *value; GtkCssValue *value, *original_value;
GtkBorderStyle border_style; GtkBorderStyle border_style;
gtk_internal_return_if_fail (id < GTK_CSS_PROPERTY_N_PROPERTIES); gtk_internal_return_if_fail (id < GTK_CSS_PROPERTY_N_PROPERTIES);
@@ -1068,7 +1033,7 @@ gtk_css_static_style_compute_value (GtkCssStaticStyle *style,
border_style = _gtk_css_border_style_value_get (gtk_css_style_get_value ((GtkCssStyle *)style, id - 1)); border_style = _gtk_css_border_style_value_get (gtk_css_style_get_value ((GtkCssStyle *)style, id - 1));
if (border_style == GTK_BORDER_STYLE_NONE || border_style == GTK_BORDER_STYLE_HIDDEN) if (border_style == GTK_BORDER_STYLE_NONE || border_style == GTK_BORDER_STYLE_HIDDEN)
{ {
gtk_css_static_style_set_value (style, id, gtk_css_dimension_value_new (0, GTK_CSS_NUMBER), section); gtk_css_static_style_set_value (style, id, gtk_css_dimension_value_new (0, GTK_CSS_NUMBER), NULL, section);
return; return;
} }
break; break;
@@ -1085,19 +1050,34 @@ gtk_css_static_style_compute_value (GtkCssStaticStyle *style,
*/ */
if (specified) if (specified)
{ {
value = _gtk_css_value_compute (specified, id, provider, (GtkCssStyle *)style, parent_style); value = _gtk_css_value_compute (specified, id, context);
if (gtk_css_value_contains_variables (specified))
original_value = specified;
else
original_value = NULL;
} }
else if (parent_style && _gtk_css_style_property_is_inherit (_gtk_css_style_property_lookup_by_id (id))) else if (context->parent_style && _gtk_css_style_property_is_inherit (_gtk_css_style_property_lookup_by_id (id)))
{ {
GtkCssValue *parent_original_value;
/* Just take the style from the parent */ /* Just take the style from the parent */
value = _gtk_css_value_ref (gtk_css_style_get_value (parent_style, id)); value = _gtk_css_value_ref (gtk_css_style_get_value (context->parent_style, id));
parent_original_value = gtk_css_style_get_original_value (context->parent_style, id);
if (parent_original_value)
original_value = parent_original_value;
else
original_value = NULL;
} }
else else
{ {
value = _gtk_css_initial_value_new_compute (id, provider, (GtkCssStyle *)style, parent_style); value = _gtk_css_initial_value_new_compute (id, context);
original_value = NULL;
} }
gtk_css_static_style_set_value (style, id, value, section); gtk_css_static_style_set_value (style, id, value, original_value, section);
} }
GtkCssChange GtkCssChange
@@ -1107,3 +1087,15 @@ gtk_css_static_style_get_change (GtkCssStaticStyle *style)
return style->change; return style->change;
} }
void
gtk_css_custom_values_compute_changes_and_affects (GtkCssStyle *style1,
GtkCssStyle *style2,
GtkBitmask **changes,
GtkCssAffects *affects)
{
if (gtk_css_variable_set_equal (style1->variables, style2->variables))
return;
*changes = _gtk_bitmask_set (*changes, GTK_CSS_PROPERTY_CUSTOM, TRUE);
}
+1
View File
@@ -40,6 +40,7 @@ struct _GtkCssStaticStyle
GtkCssStyle parent; GtkCssStyle parent;
GPtrArray *sections; /* sections the values are defined in */ GPtrArray *sections; /* sections the values are defined in */
GPtrArray *original_values;
GtkCssChange change; /* change as returned by value lookup */ GtkCssChange change; /* change as returned by value lookup */
}; };
+4 -5
View File
@@ -35,11 +35,9 @@ gtk_css_value_string_free (GtkCssValue *value)
} }
static GtkCssValue * static GtkCssValue *
gtk_css_value_string_compute (GtkCssValue *value, gtk_css_value_string_compute (GtkCssValue *value,
guint property_id, guint property_id,
GtkStyleProvider *provider, GtkCssComputeContext *context)
GtkCssStyle *style,
GtkCssStyle *parent_style)
{ {
return _gtk_css_value_ref (value); return _gtk_css_value_ref (value);
} }
@@ -226,3 +224,4 @@ _gtk_css_ident_value_get (const GtkCssValue *value)
return value->string; return value->string;
} }
+69
View File
@@ -24,6 +24,7 @@
#include "gtkcssanimationprivate.h" #include "gtkcssanimationprivate.h"
#include "gtkcssarrayvalueprivate.h" #include "gtkcssarrayvalueprivate.h"
#include "gtkcsscustompropertypoolprivate.h"
#include "gtkcssenumvalueprivate.h" #include "gtkcssenumvalueprivate.h"
#include "gtkcssinheritvalueprivate.h" #include "gtkcssinheritvalueprivate.h"
#include "gtkcssinitialvalueprivate.h" #include "gtkcssinitialvalueprivate.h"
@@ -74,6 +75,9 @@ gtk_css_style_finalize (GObject *object)
gtk_css_values_unref ((GtkCssValues *)style->size); gtk_css_values_unref ((GtkCssValues *)style->size);
gtk_css_values_unref ((GtkCssValues *)style->other); gtk_css_values_unref ((GtkCssValues *)style->other);
if (style->variables)
gtk_css_variable_set_unref (style->variables);
G_OBJECT_CLASS (gtk_css_style_parent_class)->finalize (object); G_OBJECT_CLASS (gtk_css_style_parent_class)->finalize (object);
} }
@@ -312,6 +316,15 @@ gtk_css_style_get_static_style (GtkCssStyle *style)
return GTK_CSS_STYLE_GET_CLASS (style)->get_static_style (style); return GTK_CSS_STYLE_GET_CLASS (style)->get_static_style (style);
} }
GtkCssValue *
gtk_css_style_get_original_value (GtkCssStyle *style,
guint id)
{
gtk_internal_return_val_if_fail (GTK_IS_CSS_STYLE (style), NULL);
return GTK_CSS_STYLE_GET_CLASS (style)->get_original_value (style, id);
}
/* /*
* gtk_css_style_print: * gtk_css_style_print:
* @style: a `GtkCssStyle` * @style: a `GtkCssStyle`
@@ -369,6 +382,43 @@ gtk_css_style_print (GtkCssStyle *style,
retval = TRUE; retval = TRUE;
} }
if (style->variables)
{
GtkCssCustomPropertyPool *pool = gtk_css_custom_property_pool_get ();
GArray *ids = gtk_css_variable_set_list_ids (style->variables);
for (i = 0; i < ids->len; i++)
{
int id = g_array_index (ids, int, i);
const char *name = gtk_css_custom_property_pool_get_name (pool, id);
GtkCssVariableSet *source;
GtkCssVariableValue *value = gtk_css_variable_set_lookup (style->variables, id, &source);
if (!value)
continue;
if (source != style->variables && skip_initial)
continue;
g_string_append_printf (string, "%*s%s: ", indent, "", name);
gtk_css_variable_value_print (value, string);
g_string_append_c (string, ';');
if (value->section)
{
g_string_append (string, " /* ");
gtk_css_section_print (value->section, string);
g_string_append (string, " */");
}
g_string_append_c (string, '\n');
}
retval = TRUE;
g_array_unref (ids);
}
return retval; return retval;
} }
@@ -865,3 +915,22 @@ gtk_css_values_new (GtkCssValuesType type)
return values; return values;
} }
GtkCssVariableValue *
gtk_css_style_get_custom_property (GtkCssStyle *style,
int id)
{
if (style->variables)
return gtk_css_variable_set_lookup (style->variables, id, NULL);
return NULL;
}
GArray *
gtk_css_style_list_custom_properties (GtkCssStyle *style)
{
if (style->variables)
return gtk_css_variable_set_list_ids (style->variables);
return NULL;
}
+6
View File
@@ -102,6 +102,12 @@ compute_change (GtkCssStyleChange *change)
change->new_style, change->new_style,
&change->changes, &change->changes,
&change->affects); &change->affects);
if (change->old_style->variables != change->new_style->variables)
gtk_css_custom_values_compute_changes_and_affects (change->old_style,
change->new_style,
&change->changes,
&change->affects);
} }
void void
+20
View File
@@ -24,6 +24,8 @@
#include "gtk/gtkbitmaskprivate.h" #include "gtk/gtkbitmaskprivate.h"
#include "gtk/gtkcssvalueprivate.h" #include "gtk/gtkcssvalueprivate.h"
#include "gtk/gtkcssvariablesetprivate.h"
#include "gtk/css/gtkcssvariablevalueprivate.h"
G_BEGIN_DECLS G_BEGIN_DECLS
@@ -232,6 +234,10 @@ struct _GtkCssStyle
GtkCssTransitionValues *transition; GtkCssTransitionValues *transition;
GtkCssSizeValues *size; GtkCssSizeValues *size;
GtkCssOtherValues *other; GtkCssOtherValues *other;
GtkCssVariableSet *variables;
GtkCssValue *variable_values;
int n_variable_values;
}; };
struct _GtkCssStyleClass struct _GtkCssStyleClass
@@ -246,6 +252,9 @@ struct _GtkCssStyleClass
gboolean (* is_static) (GtkCssStyle *style); gboolean (* is_static) (GtkCssStyle *style);
GtkCssStaticStyle * (* get_static_style) (GtkCssStyle *style); GtkCssStaticStyle * (* get_static_style) (GtkCssStyle *style);
GtkCssValue * (* get_original_value) (GtkCssStyle *style,
guint id);
}; };
GType gtk_css_style_get_type (void) G_GNUC_CONST; GType gtk_css_style_get_type (void) G_GNUC_CONST;
@@ -257,6 +266,9 @@ GtkCssSection * gtk_css_style_get_section (GtkCssStyle
gboolean gtk_css_style_is_static (GtkCssStyle *style) G_GNUC_PURE; gboolean gtk_css_style_is_static (GtkCssStyle *style) G_GNUC_PURE;
GtkCssStaticStyle * gtk_css_style_get_static_style (GtkCssStyle *style); GtkCssStaticStyle * gtk_css_style_get_static_style (GtkCssStyle *style);
GtkCssValue * gtk_css_style_get_original_value (GtkCssStyle *style,
guint id) G_GNUC_PURE;
char * gtk_css_style_to_string (GtkCssStyle *style); char * gtk_css_style_to_string (GtkCssStyle *style);
gboolean gtk_css_style_print (GtkCssStyle *style, gboolean gtk_css_style_print (GtkCssStyle *style,
GString *string, GString *string,
@@ -271,6 +283,10 @@ PangoFontDescription * gtk_css_style_get_pango_font (GtkCssStyle
void gtk_css_style_lookup_symbolic_colors (GtkCssStyle *style, void gtk_css_style_lookup_symbolic_colors (GtkCssStyle *style,
GdkRGBA color_out[4]); GdkRGBA color_out[4]);
GtkCssVariableValue * gtk_css_style_get_custom_property (GtkCssStyle *style,
int id);
GArray * gtk_css_style_list_custom_properties (GtkCssStyle *style);
GtkCssValues *gtk_css_values_new (GtkCssValuesType type); GtkCssValues *gtk_css_values_new (GtkCssValuesType type);
GtkCssValues *gtk_css_values_ref (GtkCssValues *values); GtkCssValues *gtk_css_values_ref (GtkCssValues *values);
void gtk_css_values_unref (GtkCssValues *values); void gtk_css_values_unref (GtkCssValues *values);
@@ -320,6 +336,10 @@ void gtk_css_other_values_compute_changes_and_affects (GtkCssStyle *style1,
GtkCssStyle *style2, GtkCssStyle *style2,
GtkBitmask **changes, GtkBitmask **changes,
GtkCssAffects *affects); GtkCssAffects *affects);
void gtk_css_custom_values_compute_changes_and_affects (GtkCssStyle *style1,
GtkCssStyle *style2,
GtkBitmask **changes,
GtkCssAffects *affects);
G_END_DECLS G_END_DECLS
+24 -30
View File
@@ -273,12 +273,10 @@ gtk_css_value_transform_free (GtkCssValue *value)
/* returns TRUE if dest == src */ /* returns TRUE if dest == src */
static gboolean static gboolean
gtk_css_transform_compute (GtkCssTransform *dest, gtk_css_transform_compute (GtkCssTransform *dest,
GtkCssTransform *src, GtkCssTransform *src,
guint property_id, guint property_id,
GtkStyleProvider *provider, GtkCssComputeContext *context)
GtkCssStyle *style,
GtkCssStyle *parent_style)
{ {
dest->type = src->type; dest->type = src->type;
@@ -288,41 +286,41 @@ gtk_css_transform_compute (GtkCssTransform *dest,
memcpy (dest, src, sizeof (GtkCssTransform)); memcpy (dest, src, sizeof (GtkCssTransform));
return TRUE; return TRUE;
case GTK_CSS_TRANSFORM_TRANSLATE: case GTK_CSS_TRANSFORM_TRANSLATE:
dest->translate.x = _gtk_css_value_compute (src->translate.x, property_id, provider, style, parent_style); dest->translate.x = _gtk_css_value_compute (src->translate.x, property_id, context);
dest->translate.y = _gtk_css_value_compute (src->translate.y, property_id, provider, style, parent_style); dest->translate.y = _gtk_css_value_compute (src->translate.y, property_id, context);
dest->translate.z = _gtk_css_value_compute (src->translate.z, property_id, provider, style, parent_style); dest->translate.z = _gtk_css_value_compute (src->translate.z, property_id, context);
return dest->translate.x == src->translate.x return dest->translate.x == src->translate.x
&& dest->translate.y == src->translate.y && dest->translate.y == src->translate.y
&& dest->translate.z == src->translate.z; && dest->translate.z == src->translate.z;
case GTK_CSS_TRANSFORM_ROTATE: case GTK_CSS_TRANSFORM_ROTATE:
dest->rotate.x = _gtk_css_value_compute (src->rotate.x, property_id, provider, style, parent_style); dest->rotate.x = _gtk_css_value_compute (src->rotate.x, property_id, context);
dest->rotate.y = _gtk_css_value_compute (src->rotate.y, property_id, provider, style, parent_style); dest->rotate.y = _gtk_css_value_compute (src->rotate.y, property_id, context);
dest->rotate.z = _gtk_css_value_compute (src->rotate.z, property_id, provider, style, parent_style); dest->rotate.z = _gtk_css_value_compute (src->rotate.z, property_id, context);
dest->rotate.angle = _gtk_css_value_compute (src->rotate.angle, property_id, provider, style, parent_style); dest->rotate.angle = _gtk_css_value_compute (src->rotate.angle, property_id, context);
return dest->rotate.x == src->rotate.x return dest->rotate.x == src->rotate.x
&& dest->rotate.y == src->rotate.y && dest->rotate.y == src->rotate.y
&& dest->rotate.z == src->rotate.z && dest->rotate.z == src->rotate.z
&& dest->rotate.angle == src->rotate.angle; && dest->rotate.angle == src->rotate.angle;
case GTK_CSS_TRANSFORM_SCALE: case GTK_CSS_TRANSFORM_SCALE:
dest->scale.x = _gtk_css_value_compute (src->scale.x, property_id, provider, style, parent_style); dest->scale.x = _gtk_css_value_compute (src->scale.x, property_id, context);
dest->scale.y = _gtk_css_value_compute (src->scale.y, property_id, provider, style, parent_style); dest->scale.y = _gtk_css_value_compute (src->scale.y, property_id, context);
dest->scale.z = _gtk_css_value_compute (src->scale.z, property_id, provider, style, parent_style); dest->scale.z = _gtk_css_value_compute (src->scale.z, property_id, context);
return dest->scale.x == src->scale.x return dest->scale.x == src->scale.x
&& dest->scale.y == src->scale.y && dest->scale.y == src->scale.y
&& dest->scale.z == src->scale.z; && dest->scale.z == src->scale.z;
case GTK_CSS_TRANSFORM_SKEW: case GTK_CSS_TRANSFORM_SKEW:
dest->skew.x = _gtk_css_value_compute (src->skew.x, property_id, provider, style, parent_style); dest->skew.x = _gtk_css_value_compute (src->skew.x, property_id, context);
dest->skew.y = _gtk_css_value_compute (src->skew.y, property_id, provider, style, parent_style); dest->skew.y = _gtk_css_value_compute (src->skew.y, property_id, context);
return dest->skew.x == src->skew.x return dest->skew.x == src->skew.x
&& dest->skew.y == src->skew.y; && dest->skew.y == src->skew.y;
case GTK_CSS_TRANSFORM_SKEW_X: case GTK_CSS_TRANSFORM_SKEW_X:
dest->skew_x.skew = _gtk_css_value_compute (src->skew_x.skew, property_id, provider, style, parent_style); dest->skew_x.skew = _gtk_css_value_compute (src->skew_x.skew, property_id, context);
return dest->skew_x.skew == src->skew_x.skew; return dest->skew_x.skew == src->skew_x.skew;
case GTK_CSS_TRANSFORM_SKEW_Y: case GTK_CSS_TRANSFORM_SKEW_Y:
dest->skew_y.skew = _gtk_css_value_compute (src->skew_y.skew, property_id, provider, style, parent_style); dest->skew_y.skew = _gtk_css_value_compute (src->skew_y.skew, property_id, context);
return dest->skew_y.skew == src->skew_y.skew; return dest->skew_y.skew == src->skew_y.skew;
case GTK_CSS_TRANSFORM_PERSPECTIVE: case GTK_CSS_TRANSFORM_PERSPECTIVE:
dest->perspective.depth = _gtk_css_value_compute (src->perspective.depth, property_id, provider, style, parent_style); dest->perspective.depth = _gtk_css_value_compute (src->perspective.depth, property_id, context);
return dest->perspective.depth == src->perspective.depth; return dest->perspective.depth == src->perspective.depth;
case GTK_CSS_TRANSFORM_NONE: case GTK_CSS_TRANSFORM_NONE:
default: default:
@@ -332,11 +330,9 @@ gtk_css_transform_compute (GtkCssTransform *dest,
} }
static GtkCssValue * static GtkCssValue *
gtk_css_value_transform_compute (GtkCssValue *value, gtk_css_value_transform_compute (GtkCssValue *value,
guint property_id, guint property_id,
GtkStyleProvider *provider, GtkCssComputeContext *context)
GtkCssStyle *style,
GtkCssStyle *parent_style)
{ {
GtkCssValue *result; GtkCssValue *result;
gboolean changes; gboolean changes;
@@ -354,9 +350,7 @@ gtk_css_value_transform_compute (GtkCssValue *value,
changes |= !gtk_css_transform_compute (&result->transforms[i], changes |= !gtk_css_transform_compute (&result->transforms[i],
&value->transforms[i], &value->transforms[i],
property_id, property_id,
provider, context);
style,
parent_style);
} }
if (!changes) if (!changes)
@@ -801,7 +795,7 @@ static const GtkCssValueClass GTK_CSS_VALUE_TRANSFORM = {
gtk_css_value_transform_print gtk_css_value_transform_print
}; };
static GtkCssValue transform_none_singleton = { &GTK_CSS_VALUE_TRANSFORM, 1, TRUE, 0, { { GTK_CSS_TRANSFORM_NONE } } }; static GtkCssValue transform_none_singleton = { &GTK_CSS_VALUE_TRANSFORM, 1, TRUE, FALSE, 0, { { GTK_CSS_TRANSFORM_NONE } } };
static GtkCssValue * static GtkCssValue *
gtk_css_transform_value_alloc (guint n_transforms) gtk_css_transform_value_alloc (guint n_transforms)
+27 -1
View File
@@ -277,7 +277,33 @@ enum { /*< skip >*/
GTK_CSS_PROPERTY_FONT_VARIATION_SETTINGS, GTK_CSS_PROPERTY_FONT_VARIATION_SETTINGS,
GTK_CSS_PROPERTY_LINE_HEIGHT, GTK_CSS_PROPERTY_LINE_HEIGHT,
/* add more */ /* add more */
GTK_CSS_PROPERTY_N_PROPERTIES GTK_CSS_PROPERTY_N_PROPERTIES,
GTK_CSS_PROPERTY_CUSTOM,
};
enum {
GTK_CSS_SHORTHAND_PROPERTY_FONT,
GTK_CSS_SHORTHAND_PROPERTY_MARGIN,
GTK_CSS_SHORTHAND_PROPERTY_PADDING,
GTK_CSS_SHORTHAND_PROPERTY_BORDER_WIDTH,
GTK_CSS_SHORTHAND_PROPERTY_BORDER_RADIUS,
GTK_CSS_SHORTHAND_PROPERTY_BORDER_COLOR,
GTK_CSS_SHORTHAND_PROPERTY_BORDER_STYLE,
GTK_CSS_SHORTHAND_PROPERTY_BORDER_IMAGE,
GTK_CSS_SHORTHAND_PROPERTY_BORDER_TOP,
GTK_CSS_SHORTHAND_PROPERTY_BORDER_RIGHT,
GTK_CSS_SHORTHAND_PROPERTY_BORDER_BOTTOM,
GTK_CSS_SHORTHAND_PROPERTY_BORDER_LEFT,
GTK_CSS_SHORTHAND_PROPERTY_BORDER,
GTK_CSS_SHORTHAND_PROPERTY_OUTLINE,
GTK_CSS_SHORTHAND_PROPERTY_BACKGROUND,
GTK_CSS_SHORTHAND_PROPERTY_TRANSITION,
GTK_CSS_SHORTHAND_PROPERTY_ANIMATION,
GTK_CSS_SHORTHAND_PROPERTY_TEXT_DECORATION,
GTK_CSS_SHORTHAND_PROPERTY_FONT_VARIANT,
GTK_CSS_SHORTHAND_PROPERTY_ALL,
/* add more */
GTK_CSS_SHORTHAND_PROPERTY_N_PROPERTIES,
}; };
typedef enum /*< skip >*/ { typedef enum /*< skip >*/ {
+4 -10
View File
@@ -35,11 +35,9 @@ gtk_css_value_unset_free (GtkCssValue *value)
} }
static GtkCssValue * static GtkCssValue *
gtk_css_value_unset_compute (GtkCssValue *value, gtk_css_value_unset_compute (GtkCssValue *value,
guint property_id, guint property_id,
GtkStyleProvider *provider, GtkCssComputeContext *context)
GtkCssStyle *style,
GtkCssStyle *parent_style)
{ {
GtkCssStyleProperty *property; GtkCssStyleProperty *property;
GtkCssValue *unset_value; GtkCssValue *unset_value;
@@ -51,11 +49,7 @@ gtk_css_value_unset_compute (GtkCssValue *value,
else else
unset_value = _gtk_css_initial_value_get (); unset_value = _gtk_css_initial_value_get ();
return _gtk_css_value_compute (unset_value, return _gtk_css_value_compute (unset_value, property_id, context);
property_id,
provider,
style,
parent_style);
} }
static gboolean static gboolean
+12 -6
View File
@@ -199,6 +199,8 @@ gtk_css_value_unref (GtkCssValue *value)
* @provider: Style provider for looking up extra information * @provider: Style provider for looking up extra information
* @style: Style to compute for * @style: Style to compute for
* @parent_style: parent style to use for inherited values * @parent_style: parent style to use for inherited values
* @variables: an additional set of variables to use along with @style
* @shorthands: (nullable): Already computed values for shorthands
* *
* Converts the specified @value into the computed value for the CSS * Converts the specified @value into the computed value for the CSS
* property given by @property_id using the information in @context. * property given by @property_id using the information in @context.
@@ -208,11 +210,9 @@ gtk_css_value_unref (GtkCssValue *value)
* Returns: the computed value * Returns: the computed value
**/ **/
GtkCssValue * GtkCssValue *
_gtk_css_value_compute (GtkCssValue *value, _gtk_css_value_compute (GtkCssValue *value,
guint property_id, guint property_id,
GtkStyleProvider *provider, GtkCssComputeContext *context)
GtkCssStyle *style,
GtkCssStyle *parent_style)
{ {
if (gtk_css_value_is_computed (value)) if (gtk_css_value_is_computed (value))
return _gtk_css_value_ref (value); return _gtk_css_value_ref (value);
@@ -221,7 +221,7 @@ _gtk_css_value_compute (GtkCssValue *value,
get_accounting_data (value->class->type_name)->computed++; get_accounting_data (value->class->type_name)->computed++;
#endif #endif
return value->class->compute (value, property_id, provider, style, parent_style); return value->class->compute (value, property_id, context);
} }
gboolean gboolean
@@ -367,3 +367,9 @@ gtk_css_value_is_computed (const GtkCssValue *value)
{ {
return value->is_computed; return value->is_computed;
} }
gboolean
gtk_css_value_contains_variables (const GtkCssValue *value)
{
return value->contains_variables;
}
+14 -7
View File
@@ -22,6 +22,7 @@
#include <glib-object.h> #include <glib-object.h>
#include "gtkcsstypesprivate.h" #include "gtkcsstypesprivate.h"
#include "gtkcssvariablesetprivate.h"
#include "gtkstyleprovider.h" #include "gtkstyleprovider.h"
G_BEGIN_DECLS G_BEGIN_DECLS
@@ -37,7 +38,16 @@ typedef struct _GtkCssValueClass GtkCssValueClass;
#define GTK_CSS_VALUE_BASE \ #define GTK_CSS_VALUE_BASE \
const GtkCssValueClass *class; \ const GtkCssValueClass *class; \
int ref_count; \ int ref_count; \
guint is_computed: 1; guint is_computed: 1; \
guint contains_variables: 1;
typedef struct {
GtkStyleProvider *provider;
GtkCssStyle *style;
GtkCssStyle *parent_style;
GtkCssVariableSet *variables;
GtkCssValue **shorthands;
} GtkCssComputeContext;
struct _GtkCssValueClass { struct _GtkCssValueClass {
const char *type_name; const char *type_name;
@@ -45,9 +55,7 @@ struct _GtkCssValueClass {
GtkCssValue * (* compute) (GtkCssValue *value, GtkCssValue * (* compute) (GtkCssValue *value,
guint property_id, guint property_id,
GtkStyleProvider *provider, GtkCssComputeContext *context);
GtkCssStyle *style,
GtkCssStyle *parent_style);
gboolean (* equal) (const GtkCssValue *value1, gboolean (* equal) (const GtkCssValue *value1,
const GtkCssValue *value2); const GtkCssValue *value2);
GtkCssValue * (* transition) (GtkCssValue *start, GtkCssValue * (* transition) (GtkCssValue *start,
@@ -74,9 +82,7 @@ void gtk_css_value_unref (GtkCssValue
GtkCssValue *_gtk_css_value_compute (GtkCssValue *value, GtkCssValue *_gtk_css_value_compute (GtkCssValue *value,
guint property_id, guint property_id,
GtkStyleProvider *provider, GtkCssComputeContext *context) G_GNUC_PURE;
GtkCssStyle *style,
GtkCssStyle *parent_style) G_GNUC_PURE;
gboolean _gtk_css_value_equal (const GtkCssValue *value1, gboolean _gtk_css_value_equal (const GtkCssValue *value1,
const GtkCssValue *value2) G_GNUC_PURE; const GtkCssValue *value2) G_GNUC_PURE;
gboolean _gtk_css_value_equal0 (const GtkCssValue *value1, gboolean _gtk_css_value_equal0 (const GtkCssValue *value1,
@@ -93,6 +99,7 @@ char * _gtk_css_value_to_string (const GtkCssValue
void _gtk_css_value_print (const GtkCssValue *value, void _gtk_css_value_print (const GtkCssValue *value,
GString *string); GString *string);
gboolean gtk_css_value_is_computed (const GtkCssValue *value) G_GNUC_PURE; gboolean gtk_css_value_is_computed (const GtkCssValue *value) G_GNUC_PURE;
gboolean gtk_css_value_contains_variables (const GtkCssValue *value) G_GNUC_PURE;
G_END_DECLS G_END_DECLS
+151
View File
@@ -0,0 +1,151 @@
/*
* Copyright © 2012 Red Hat Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
* Authors: Benjamin Otte <otte@gnome.org>
*/
#pragma once
#include <glib-object.h>
G_BEGIN_DECLS
static const int core_props[] = {
GTK_CSS_PROPERTY_COLOR,
GTK_CSS_PROPERTY_DPI,
GTK_CSS_PROPERTY_FONT_SIZE,
GTK_CSS_PROPERTY_ICON_PALETTE
};
static const int background_props[] = {
GTK_CSS_PROPERTY_BACKGROUND_COLOR,
GTK_CSS_PROPERTY_BOX_SHADOW,
GTK_CSS_PROPERTY_BACKGROUND_CLIP,
GTK_CSS_PROPERTY_BACKGROUND_ORIGIN,
GTK_CSS_PROPERTY_BACKGROUND_SIZE,
GTK_CSS_PROPERTY_BACKGROUND_POSITION,
GTK_CSS_PROPERTY_BACKGROUND_REPEAT,
GTK_CSS_PROPERTY_BACKGROUND_IMAGE,
GTK_CSS_PROPERTY_BACKGROUND_BLEND_MODE
};
static const int border_props[] = {
GTK_CSS_PROPERTY_BORDER_TOP_STYLE,
GTK_CSS_PROPERTY_BORDER_TOP_WIDTH,
GTK_CSS_PROPERTY_BORDER_LEFT_STYLE,
GTK_CSS_PROPERTY_BORDER_LEFT_WIDTH,
GTK_CSS_PROPERTY_BORDER_BOTTOM_STYLE,
GTK_CSS_PROPERTY_BORDER_BOTTOM_WIDTH,
GTK_CSS_PROPERTY_BORDER_RIGHT_STYLE,
GTK_CSS_PROPERTY_BORDER_RIGHT_WIDTH,
GTK_CSS_PROPERTY_BORDER_TOP_LEFT_RADIUS,
GTK_CSS_PROPERTY_BORDER_TOP_RIGHT_RADIUS,
GTK_CSS_PROPERTY_BORDER_BOTTOM_RIGHT_RADIUS,
GTK_CSS_PROPERTY_BORDER_BOTTOM_LEFT_RADIUS,
GTK_CSS_PROPERTY_BORDER_TOP_COLOR,
GTK_CSS_PROPERTY_BORDER_RIGHT_COLOR,
GTK_CSS_PROPERTY_BORDER_BOTTOM_COLOR,
GTK_CSS_PROPERTY_BORDER_LEFT_COLOR,
GTK_CSS_PROPERTY_BORDER_IMAGE_SOURCE,
GTK_CSS_PROPERTY_BORDER_IMAGE_REPEAT,
GTK_CSS_PROPERTY_BORDER_IMAGE_SLICE,
GTK_CSS_PROPERTY_BORDER_IMAGE_WIDTH
};
static const int icon_props[] = {
GTK_CSS_PROPERTY_ICON_SIZE,
GTK_CSS_PROPERTY_ICON_SHADOW,
GTK_CSS_PROPERTY_ICON_STYLE,
};
static const int outline_props[] = {
GTK_CSS_PROPERTY_OUTLINE_STYLE,
GTK_CSS_PROPERTY_OUTLINE_WIDTH,
GTK_CSS_PROPERTY_OUTLINE_OFFSET,
GTK_CSS_PROPERTY_OUTLINE_COLOR,
};
static const int font_props[] = {
GTK_CSS_PROPERTY_FONT_FAMILY,
GTK_CSS_PROPERTY_FONT_STYLE,
GTK_CSS_PROPERTY_FONT_WEIGHT,
GTK_CSS_PROPERTY_FONT_STRETCH,
GTK_CSS_PROPERTY_LETTER_SPACING,
GTK_CSS_PROPERTY_TEXT_SHADOW,
GTK_CSS_PROPERTY_CARET_COLOR,
GTK_CSS_PROPERTY_SECONDARY_CARET_COLOR,
GTK_CSS_PROPERTY_FONT_FEATURE_SETTINGS,
GTK_CSS_PROPERTY_FONT_VARIATION_SETTINGS,
GTK_CSS_PROPERTY_LINE_HEIGHT,
};
static const int font_variant_props[] = {
GTK_CSS_PROPERTY_TEXT_DECORATION_LINE,
GTK_CSS_PROPERTY_TEXT_DECORATION_COLOR,
GTK_CSS_PROPERTY_TEXT_DECORATION_STYLE,
GTK_CSS_PROPERTY_TEXT_TRANSFORM,
GTK_CSS_PROPERTY_FONT_KERNING,
GTK_CSS_PROPERTY_FONT_VARIANT_LIGATURES,
GTK_CSS_PROPERTY_FONT_VARIANT_POSITION,
GTK_CSS_PROPERTY_FONT_VARIANT_CAPS,
GTK_CSS_PROPERTY_FONT_VARIANT_NUMERIC,
GTK_CSS_PROPERTY_FONT_VARIANT_ALTERNATES,
GTK_CSS_PROPERTY_FONT_VARIANT_EAST_ASIAN,
};
static const int animation_props[] = {
GTK_CSS_PROPERTY_ANIMATION_NAME,
GTK_CSS_PROPERTY_ANIMATION_DURATION,
GTK_CSS_PROPERTY_ANIMATION_TIMING_FUNCTION,
GTK_CSS_PROPERTY_ANIMATION_ITERATION_COUNT,
GTK_CSS_PROPERTY_ANIMATION_DIRECTION,
GTK_CSS_PROPERTY_ANIMATION_PLAY_STATE,
GTK_CSS_PROPERTY_ANIMATION_DELAY,
GTK_CSS_PROPERTY_ANIMATION_FILL_MODE,
};
static const int transition_props[] = {
GTK_CSS_PROPERTY_TRANSITION_PROPERTY,
GTK_CSS_PROPERTY_TRANSITION_DURATION,
GTK_CSS_PROPERTY_TRANSITION_TIMING_FUNCTION,
GTK_CSS_PROPERTY_TRANSITION_DELAY,
};
static const int size_props[] = {
GTK_CSS_PROPERTY_MARGIN_TOP,
GTK_CSS_PROPERTY_MARGIN_LEFT,
GTK_CSS_PROPERTY_MARGIN_BOTTOM,
GTK_CSS_PROPERTY_MARGIN_RIGHT,
GTK_CSS_PROPERTY_PADDING_TOP,
GTK_CSS_PROPERTY_PADDING_LEFT,
GTK_CSS_PROPERTY_PADDING_BOTTOM,
GTK_CSS_PROPERTY_PADDING_RIGHT,
GTK_CSS_PROPERTY_BORDER_SPACING,
GTK_CSS_PROPERTY_MIN_WIDTH,
GTK_CSS_PROPERTY_MIN_HEIGHT,
};
static const int other_props[] = {
GTK_CSS_PROPERTY_ICON_SOURCE,
GTK_CSS_PROPERTY_ICON_TRANSFORM,
GTK_CSS_PROPERTY_ICON_FILTER,
GTK_CSS_PROPERTY_TRANSFORM,
GTK_CSS_PROPERTY_TRANSFORM_ORIGIN,
GTK_CSS_PROPERTY_OPACITY,
GTK_CSS_PROPERTY_FILTER,
};
G_END_DECLS
+359
View File
@@ -0,0 +1,359 @@
/*
* Copyright (C) 2023 GNOME Foundation Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
* Authors: Alice Mikhaylenko <alicem@gnome.org>
*/
#include "gtkcssvariablesetprivate.h"
#include "gtkcsscustompropertypoolprivate.h"
static void
unref_custom_property_name (gpointer pointer)
{
GtkCssCustomPropertyPool *pool = gtk_css_custom_property_pool_get ();
gtk_css_custom_property_pool_unref (pool, GPOINTER_TO_INT (pointer));
}
static void
maybe_unref_variable (gpointer pointer)
{
if (pointer != NULL)
gtk_css_variable_value_unref (pointer);
}
GtkCssVariableSet *
gtk_css_variable_set_new (void)
{
GtkCssVariableSet *self = g_new0 (GtkCssVariableSet, 1);
self->ref_count = 1;
self->variables = g_hash_table_new_full (g_direct_hash,
g_direct_equal,
unref_custom_property_name,
maybe_unref_variable);
return self;
}
GtkCssVariableSet *
gtk_css_variable_set_ref (GtkCssVariableSet *self)
{
self->ref_count++;
return self;
}
void
gtk_css_variable_set_unref (GtkCssVariableSet *self)
{
self->ref_count--;
if (self->ref_count > 0)
return;
g_hash_table_unref (self->variables);
g_clear_pointer (&self->parent, gtk_css_variable_set_unref);
g_free (self);
}
GtkCssVariableSet *
gtk_css_variable_set_copy (GtkCssVariableSet *self)
{
GtkCssVariableSet *ret = gtk_css_variable_set_new ();
GHashTableIter iter;
gpointer id;
GtkCssVariableValue *value;
g_hash_table_iter_init (&iter, self->variables);
while (g_hash_table_iter_next (&iter, &id, (gpointer) &value))
gtk_css_variable_set_add (ret, GPOINTER_TO_INT (id), value);
gtk_css_variable_set_set_parent (ret, self->parent);
return ret;
}
void
gtk_css_variable_set_set_parent (GtkCssVariableSet *self,
GtkCssVariableSet *parent)
{
if (self->parent)
gtk_css_variable_set_unref (self->parent);
self->parent = parent;
if (self->parent)
gtk_css_variable_set_ref (self->parent);
}
void
gtk_css_variable_set_add (GtkCssVariableSet *self,
int id,
GtkCssVariableValue *value)
{
GtkCssCustomPropertyPool *pool = gtk_css_custom_property_pool_get ();
g_hash_table_insert (self->variables,
GINT_TO_POINTER (gtk_css_custom_property_pool_ref (pool, id)),
value ? gtk_css_variable_value_ref (value) : NULL);
}
static gboolean check_variable (GtkCssVariableSet *self,
GHashTable *unvisited_variables,
GArray *stack,
int id,
GtkCssVariableValue *value);
static gboolean
check_references (GtkCssVariableSet *self,
GHashTable *unvisited_variables,
GArray *stack,
GtkCssVariableValue *value)
{
GtkCssCustomPropertyPool *pool = gtk_css_custom_property_pool_get ();
int i;
for (i = 0; i < value->n_references; i++)
{
GtkCssVariableValueReference *ref = &value->references[i];
int ref_id = gtk_css_custom_property_pool_lookup (pool, ref->name);
if (g_hash_table_contains (unvisited_variables, GINT_TO_POINTER (ref_id)))
{
GtkCssVariableValue *ref_value;
ref_value = g_hash_table_lookup (self->variables, GINT_TO_POINTER (ref_id));
if (check_variable (self, unvisited_variables, stack, ref_id, ref_value))
return TRUE;
}
if (ref->fallback)
{
if (check_references (self, unvisited_variables, stack, ref->fallback))
return TRUE;
}
}
return FALSE;
}
static gboolean
check_variable (GtkCssVariableSet *self,
GHashTable *unvisited_variables,
GArray *stack,
int id,
GtkCssVariableValue *value)
{
int i;
g_array_append_val (stack, id);
for (i = stack->len - 2; i >= 0; i--)
{
/* Found a cycle, stop checking */
if (id == g_array_index (stack, int, i))
return TRUE;
}
if (check_references (self, unvisited_variables, stack, value))
return TRUE;
g_array_remove_index_fast (stack, stack->len - 1);
g_hash_table_remove (unvisited_variables, GINT_TO_POINTER (id));
return FALSE;
}
void
gtk_css_variable_set_resolve_cycles (GtkCssVariableSet *self)
{
GHashTable *variables = g_hash_table_new (g_direct_hash, g_direct_equal);
GHashTable *unvisited_variables = g_hash_table_new (g_direct_hash, g_direct_equal);
GArray *stack;
GHashTableIter iter;
gpointer id;
GtkCssVariableValue *value;
stack = g_array_new (FALSE, FALSE, sizeof (int));
g_hash_table_iter_init (&iter, self->variables);
while (g_hash_table_iter_next (&iter, &id, (gpointer) &value))
{
/* Have 2 copies of self->variables: "variables" can be iterated safely as
* we remove values, and "unvisited_variables" as a visited node marker
* for DFS */
g_hash_table_insert (variables, id, value);
g_hash_table_add (unvisited_variables, id);
}
g_hash_table_iter_init (&iter, variables);
while (g_hash_table_iter_next (&iter, &id, (gpointer) &value))
{
if (!g_hash_table_contains (unvisited_variables, id))
continue;
if (!g_hash_table_contains (self->variables, id))
continue;
if (check_variable (self, unvisited_variables, stack, GPOINTER_TO_INT (id), value))
{
int i;
/* Found a cycle, remove the offending variables */
for (i = stack->len - 2; i >= 0; i--)
{
int id_to_remove = g_array_index (stack, int, i);
g_hash_table_remove (self->variables, GINT_TO_POINTER (id_to_remove));
if (g_array_index (stack, int, i) == g_array_index (stack, int, stack->len - 1))
break;
}
g_array_remove_range (stack, 0, stack->len);
}
}
g_array_unref (stack);
g_hash_table_unref (variables);
g_hash_table_unref (unvisited_variables);
}
GtkCssVariableValue *
gtk_css_variable_set_lookup (GtkCssVariableSet *self,
int id,
GtkCssVariableSet **source)
{
GtkCssVariableValue *ret = g_hash_table_lookup (self->variables, GINT_TO_POINTER (id));
if (ret)
{
if (source)
*source = self;
return ret;
}
if (self->parent)
return gtk_css_variable_set_lookup (self->parent, id, source);
if (source)
*source = NULL;
return NULL;
}
static void
list_ids_recursive (GtkCssVariableSet *self,
GHashTable *table)
{
GHashTableIter iter;
gpointer id;
if (self->parent)
list_ids_recursive (self->parent, table);
g_hash_table_iter_init (&iter, self->variables);
while (g_hash_table_iter_next (&iter, &id, NULL))
g_hash_table_add (table, id);
}
static int
compare_ids (gconstpointer a, gconstpointer b, gpointer user_data)
{
GtkCssCustomPropertyPool *pool = user_data;
int id1 = GPOINTER_TO_INT (*((const int *) a));
int id2 = GPOINTER_TO_INT (*((const int *) b));
const char *name1, *name2;
name1 = gtk_css_custom_property_pool_get_name (pool, id1);
name2 = gtk_css_custom_property_pool_get_name (pool, id2);
return strcmp (name1, name2);
}
GArray *
gtk_css_variable_set_list_ids (GtkCssVariableSet *self)
{
GtkCssCustomPropertyPool *pool = gtk_css_custom_property_pool_get ();
GArray *ret = g_array_new (FALSE, FALSE, sizeof (int));
GHashTable *all_ids;
GHashTableIter iter;
gpointer id;
all_ids = g_hash_table_new (g_direct_hash, g_direct_equal);
list_ids_recursive (self, all_ids);
g_hash_table_iter_init (&iter, all_ids);
while (g_hash_table_iter_next (&iter, &id, NULL))
g_array_append_val (ret, id);
g_hash_table_unref (all_ids);
g_array_sort_with_data (ret, compare_ids, pool);
return ret;
}
gboolean
gtk_css_variable_set_equal (GtkCssVariableSet *set1,
GtkCssVariableSet *set2)
{
GHashTableIter iter;
gpointer id;
GtkCssVariableValue *value1;
if (set1 == set2)
return TRUE;
if (set1 == NULL || set2 == NULL)
return FALSE;
if (g_hash_table_size (set1->variables) != g_hash_table_size (set2->variables))
return FALSE;
if (set1->parent != set2->parent)
return FALSE;
g_hash_table_iter_init (&iter, set2->variables);
while (g_hash_table_iter_next (&iter, &id, NULL))
{
if (!g_hash_table_contains (set1->variables, id))
return FALSE;
}
g_hash_table_iter_init (&iter, set1->variables);
while (g_hash_table_iter_next (&iter, &id, (gpointer) &value1))
{
GtkCssVariableValue *value2 = g_hash_table_lookup (set2->variables, id);
if (value2 == NULL)
return FALSE;
if (!gtk_css_variable_value_equal (value1, value2))
return FALSE;
}
return TRUE;
}
+60
View File
@@ -0,0 +1,60 @@
/*
* Copyright (C) 2023 GNOME Foundation Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
* Authors: Alice Mikhaylenko <alicem@gnome.org>
*/
#pragma once
#include "gtk/css/gtkcssvariablevalueprivate.h"
G_BEGIN_DECLS
typedef struct _GtkCssVariableSet GtkCssVariableSet;
struct _GtkCssVariableSet
{
int ref_count;
GHashTable *variables;
GtkCssVariableSet *parent;
};
GtkCssVariableSet * gtk_css_variable_set_new (void);
GtkCssVariableSet * gtk_css_variable_set_ref (GtkCssVariableSet *self);
void gtk_css_variable_set_unref (GtkCssVariableSet *self);
GtkCssVariableSet * gtk_css_variable_set_copy (GtkCssVariableSet *self);
void gtk_css_variable_set_set_parent (GtkCssVariableSet *self,
GtkCssVariableSet *parent);
void gtk_css_variable_set_add (GtkCssVariableSet *self,
int id,
GtkCssVariableValue *value);
void gtk_css_variable_set_resolve_cycles (GtkCssVariableSet *self);
GtkCssVariableValue *gtk_css_variable_set_lookup (GtkCssVariableSet *self,
int id,
GtkCssVariableSet **source);
GArray * gtk_css_variable_set_list_ids (GtkCssVariableSet *self);
gboolean gtk_css_variable_set_equal (GtkCssVariableSet *set1,
GtkCssVariableSet *set2);
G_END_DECLS
+3 -1
View File
@@ -1576,7 +1576,8 @@ gtk_grid_view_get_tab_behavior (GtkGridView *self)
/** /**
* gtk_grid_view_scroll_to: * gtk_grid_view_scroll_to:
* @self: The gridview to scroll in * @self: The gridview to scroll in
* @pos: position of the item * @pos: position of the item. Must be less than the number of
* items in the view.
* @flags: actions to perform * @flags: actions to perform
* @scroll: (nullable) (transfer full): details of how to perform * @scroll: (nullable) (transfer full): details of how to perform
* the scroll operation or %NULL to scroll into view * the scroll operation or %NULL to scroll into view
@@ -1596,6 +1597,7 @@ gtk_grid_view_scroll_to (GtkGridView *self,
GtkScrollInfo *scroll) GtkScrollInfo *scroll)
{ {
g_return_if_fail (GTK_IS_GRID_VIEW (self)); g_return_if_fail (GTK_IS_GRID_VIEW (self));
g_return_if_fail (pos < gtk_list_base_get_n_items (GTK_LIST_BASE (self)));
gtk_list_base_scroll_to (GTK_LIST_BASE (self), pos, flags, scroll); gtk_list_base_scroll_to (GTK_LIST_BASE (self), pos, flags, scroll);
} }
+3 -1
View File
@@ -1356,7 +1356,8 @@ gtk_list_view_get_tab_behavior (GtkListView *self)
/** /**
* gtk_list_view_scroll_to: * gtk_list_view_scroll_to:
* @self: The listview to scroll in * @self: The listview to scroll in
* @pos: position of the item * @pos: position of the item. Must be less than the number of
* items in the view.
* @flags: actions to perform * @flags: actions to perform
* @scroll: (nullable) (transfer full): details of how to perform * @scroll: (nullable) (transfer full): details of how to perform
* the scroll operation or %NULL to scroll into view * the scroll operation or %NULL to scroll into view
@@ -1376,6 +1377,7 @@ gtk_list_view_scroll_to (GtkListView *self,
GtkScrollInfo *scroll) GtkScrollInfo *scroll)
{ {
g_return_if_fail (GTK_IS_LIST_VIEW (self)); g_return_if_fail (GTK_IS_LIST_VIEW (self));
g_return_if_fail (pos < gtk_list_base_get_n_items (GTK_LIST_BASE (self)));
gtk_list_base_scroll_to (GTK_LIST_BASE (self), pos, flags, scroll); gtk_list_base_scroll_to (GTK_LIST_BASE (self), pos, flags, scroll);
} }
+6 -6
View File
@@ -142,7 +142,7 @@ gtk_print_setup_unref (GtkPrintSetup *setup)
* They may be different from the `GtkPrintDialog`'s settings * They may be different from the `GtkPrintDialog`'s settings
* if the user changed them during the setup process. * if the user changed them during the setup process.
* *
* Returns: (nullable) (transfer none): the print settings, or `NULL` * Returns: (transfer none): the print settings, or `NULL`
* *
* Since: 4.14 * Since: 4.14
*/ */
@@ -168,7 +168,7 @@ gtk_print_setup_set_print_settings (GtkPrintSetup *setup,
* It may be different from the `GtkPrintDialog`'s page setup * It may be different from the `GtkPrintDialog`'s page setup
* if the user changed it during the setup process. * if the user changed it during the setup process.
* *
* Returns: (nullable) (transfer none): the page setup, or `NULL` * Returns: (transfer none): the page setup, or `NULL`
* *
* Since: 4.14 * Since: 4.14
*/ */
@@ -585,7 +585,7 @@ gtk_print_dialog_set_modal (GtkPrintDialog *self,
* *
* Returns the page setup. * Returns the page setup.
* *
* Returns: (transfer none): the page setup * Returns: (nullable) (transfer none): the page setup
* *
* Since: 4.14 * Since: 4.14
*/ */
@@ -623,7 +623,7 @@ gtk_print_dialog_set_page_setup (GtkPrintDialog *self,
* *
* Returns the print settings for the print dialog. * Returns the print settings for the print dialog.
* *
* Returns: (transfer none): the settings * Returns: (nullable) (transfer none): the settings
* *
* Since: 4.14 * Since: 4.14
*/ */
@@ -1502,7 +1502,7 @@ gtk_print_dialog_setup (GtkPrintDialog *self,
* which contains the print settings and page setup information that * which contains the print settings and page setup information that
* will be used to print. * will be used to print.
* *
* Returns: (nullable): The `GtkPrintSetup` object that resulted from the call, * Returns: The `GtkPrintSetup` object that resulted from the call,
* or `NULL` if the call was not successful * or `NULL` if the call was not successful
* *
* Since: 4.14 * Since: 4.14
@@ -1628,7 +1628,7 @@ gtk_print_dialog_print (GtkPrintDialog *self,
* call may not be instant as it operation will for the printer to finish * call may not be instant as it operation will for the printer to finish
* printing. * printing.
* *
* Returns: (nullable) (transfer full): a [class@Gio.OutputStream] * Returns: (transfer full): a [class@Gio.OutputStream]
* *
* Since: 4.14 * Since: 4.14
*/ */
+24
View File
@@ -208,6 +208,29 @@ gtk_style_cascade_lookup (GtkStyleProvider *provider,
gtk_style_cascade_iter_clear (&iter); gtk_style_cascade_iter_clear (&iter);
} }
static void
gtk_style_cascade_emit_error (GtkStyleProvider *provider,
GtkCssSection *section,
const GError *error)
{
GtkStyleCascade *cascade = GTK_STYLE_CASCADE (provider);
GtkStyleCascadeIter iter;
GtkStyleProvider *item;
for (item = gtk_style_cascade_iter_init (cascade, &iter);
item;
item = gtk_style_cascade_iter_next (cascade, &iter))
{
if (gtk_style_provider_has_section (item, section))
{
gtk_style_provider_emit_error (item, section, (GError *) error);
break;
}
}
gtk_style_cascade_iter_clear (&iter);
}
static void static void
gtk_style_cascade_provider_iface_init (GtkStyleProviderInterface *iface) gtk_style_cascade_provider_iface_init (GtkStyleProviderInterface *iface)
{ {
@@ -216,6 +239,7 @@ gtk_style_cascade_provider_iface_init (GtkStyleProviderInterface *iface)
iface->get_scale = gtk_style_cascade_get_scale; iface->get_scale = gtk_style_cascade_get_scale;
iface->get_keyframes = gtk_style_cascade_get_keyframes; iface->get_keyframes = gtk_style_cascade_get_keyframes;
iface->lookup = gtk_style_cascade_lookup; iface->lookup = gtk_style_cascade_lookup;
iface->emit_error = gtk_style_cascade_emit_error;
} }
G_DEFINE_TYPE_EXTENDED (GtkStyleCascade, _gtk_style_cascade, G_TYPE_OBJECT, 0, G_DEFINE_TYPE_EXTENDED (GtkStyleCascade, _gtk_style_cascade, G_TYPE_OBJECT, 0,
+13 -1
View File
@@ -170,6 +170,19 @@ gtk_style_provider_emit_error (GtkStyleProvider *provider,
iface->emit_error (provider, section, error); iface->emit_error (provider, section, error);
} }
gboolean
gtk_style_provider_has_section (GtkStyleProvider *provider,
GtkCssSection *section)
{
GtkStyleProviderInterface *iface;
iface = GTK_STYLE_PROVIDER_GET_INTERFACE (provider);
if (iface->has_section)
return iface->has_section (provider, section);
return FALSE;
}
/* These apis are misnamed, and the rest of GtkStyleContext is deprecated, /* These apis are misnamed, and the rest of GtkStyleContext is deprecated,
* so put them here for now * so put them here for now
@@ -230,4 +243,3 @@ gtk_style_context_remove_provider_for_display (GdkDisplay *display,
cascade = _gtk_settings_get_style_cascade (gtk_settings_get_for_display (display), 1); cascade = _gtk_settings_get_style_cascade (gtk_settings_get_for_display (display), 1);
_gtk_style_cascade_remove_provider (cascade, provider); _gtk_style_cascade_remove_provider (cascade, provider);
} }
+4
View File
@@ -52,6 +52,8 @@ struct _GtkStyleProviderInterface
const GError *error); const GError *error);
/* signal */ /* signal */
void (* changed) (GtkStyleProvider *provider); void (* changed) (GtkStyleProvider *provider);
gboolean (* has_section) (GtkStyleProvider *provider,
GtkCssSection *section);
}; };
GtkSettings * gtk_style_provider_get_settings (GtkStyleProvider *provider); GtkSettings * gtk_style_provider_get_settings (GtkStyleProvider *provider);
@@ -71,6 +73,8 @@ void gtk_style_provider_changed (GtkStyleProvid
void gtk_style_provider_emit_error (GtkStyleProvider *provider, void gtk_style_provider_emit_error (GtkStyleProvider *provider,
GtkCssSection *section, GtkCssSection *section,
GError *error); GError *error);
gboolean gtk_style_provider_has_section (GtkStyleProvider *provider,
GtkCssSection *section);
G_END_DECLS G_END_DECLS
+9 -6
View File
@@ -366,9 +366,10 @@ gtk_tooltip_trigger_tooltip_query (GtkWidget *widget)
GdkSeat *seat; GdkSeat *seat;
GdkDevice *device; GdkDevice *device;
GdkSurface *surface; GdkSurface *surface;
double x, y; double px, py;
graphene_point_t p; int x, y;
GtkWidget *toplevel; GtkWidget *toplevel;
GtkWidget *target_widget;
g_return_if_fail (GTK_IS_WIDGET (widget)); g_return_if_fail (GTK_IS_WIDGET (widget));
@@ -381,7 +382,7 @@ gtk_tooltip_trigger_tooltip_query (GtkWidget *widget)
else else
device = NULL; device = NULL;
if (device) if (device)
surface = gdk_device_get_surface_at_position (device, &x, &y); surface = gdk_device_get_surface_at_position (device, &px, &py);
else else
surface = NULL; surface = NULL;
if (!surface) if (!surface)
@@ -395,10 +396,12 @@ gtk_tooltip_trigger_tooltip_query (GtkWidget *widget)
if (gtk_native_get_surface (GTK_NATIVE (toplevel)) != surface) if (gtk_native_get_surface (GTK_NATIVE (toplevel)) != surface)
return; return;
if (!gtk_widget_compute_point (toplevel, widget, &GRAPHENE_POINT_INIT (x, y), &p)) x = round (px);
graphene_point_init (&p, x, y); y = round (py);
gtk_tooltip_handle_event_internal (GDK_MOTION_NOTIFY, surface, widget, p.x, p.y); target_widget = _gtk_widget_find_at_coords (surface, x, y, &x, &y);
gtk_tooltip_handle_event_internal (GDK_MOTION_NOTIFY, surface, target_widget, x, y);
} }
static void static void
+77 -3
View File
@@ -28,6 +28,7 @@
#include "gtklabel.h" #include "gtklabel.h"
#include "gtk/gtkwidgetprivate.h" #include "gtk/gtkwidgetprivate.h"
#include "gtkcsscustompropertypoolprivate.h"
#include "gtkcssproviderprivate.h" #include "gtkcssproviderprivate.h"
#include "gtkcssstylepropertyprivate.h" #include "gtkcssstylepropertyprivate.h"
#include "gtkcssstyleprivate.h" #include "gtkcssstyleprivate.h"
@@ -600,6 +601,33 @@ bind_node_state (GtkSignalListItemFactory *factory,
g_free (text); g_free (text);
} }
static int
compare_name_cb (gconstpointer a,
gconstpointer b,
gpointer user_data)
{
const CssProperty *prop_a = a;
const CssProperty *prop_b = b;
gboolean a_var = prop_a->name[0] == '-' && prop_a->name[1] == '-';
gboolean b_var = prop_b->name[0] == '-' && prop_b->name[1] == '-';
gboolean a_gtk = prop_a->name[0] == '-' && prop_a->name[1] != '-';
gboolean b_gtk = prop_b->name[0] == '-' && prop_b->name[1] != '-';
int ret;
if (a_var && !b_var)
ret = 1;
else if (b_var && !a_var)
ret = -1;
else if (a_gtk && !b_gtk)
ret = 1;
else if (b_gtk && !a_gtk)
ret = -1;
else
ret = g_utf8_collate (prop_a->name, prop_b->name);
return gtk_ordering_from_cmpfunc (ret);
}
static void static void
gtk_inspector_css_node_tree_init (GtkInspectorCssNodeTree *cnt) gtk_inspector_css_node_tree_init (GtkInspectorCssNodeTree *cnt)
{ {
@@ -676,7 +704,7 @@ gtk_inspector_css_node_tree_init (GtkInspectorCssNodeTree *cnt)
g_signal_connect (factory, "setup", G_CALLBACK (setup_label), NULL); g_signal_connect (factory, "setup", G_CALLBACK (setup_label), NULL);
g_signal_connect (factory, "bind", G_CALLBACK (bind_name), NULL); g_signal_connect (factory, "bind", G_CALLBACK (bind_name), NULL);
gtk_column_view_column_set_factory (column, factory); gtk_column_view_column_set_factory (column, factory);
sorter = GTK_SORTER (gtk_string_sorter_new (gtk_property_expression_new (css_property_get_type (), NULL, "name"))); sorter = GTK_SORTER (gtk_custom_sorter_new ((GCompareDataFunc) compare_name_cb, NULL, NULL));
gtk_column_view_column_set_sorter (column, sorter); gtk_column_view_column_set_sorter (column, sorter);
gtk_column_view_sort_by_column (GTK_COLUMN_VIEW (priv->prop_tree), column, GTK_SORT_ASCENDING); gtk_column_view_sort_by_column (GTK_COLUMN_VIEW (priv->prop_tree), column, GTK_SORT_ASCENDING);
g_object_unref (sorter); g_object_unref (sorter);
@@ -773,9 +801,14 @@ gtk_inspector_css_node_tree_update_style (GtkInspectorCssNodeTree *cnt,
GtkCssStyle *new_style) GtkCssStyle *new_style)
{ {
GtkInspectorCssNodeTreePrivate *priv = cnt->priv; GtkInspectorCssNodeTreePrivate *priv = cnt->priv;
int i; GtkCssCustomPropertyPool *pool = gtk_css_custom_property_pool_get ();
GArray *custom_props;
int i, n, n_props;
for (i = 0; i < _gtk_css_style_property_get_n_properties (); i++) n_props = _gtk_css_style_property_get_n_properties ();
n = g_list_model_get_n_items (G_LIST_MODEL (priv->prop_model));
for (i = 0; i < n_props; i++)
{ {
GtkCssStyleProperty *prop; GtkCssStyleProperty *prop;
const char *name; const char *name;
@@ -809,6 +842,47 @@ gtk_inspector_css_node_tree_update_style (GtkInspectorCssNodeTree *cnt,
g_free (location); g_free (location);
g_free (value); g_free (value);
} }
g_list_store_splice (priv->prop_model, n_props, n - n_props, NULL, 0);
if (new_style)
{
custom_props = gtk_css_style_list_custom_properties (new_style);
if (custom_props)
{
for (i = 0; i < custom_props->len; i++)
{
GtkCssVariableValue *var_value;
int id;
const char *name;
GtkCssSection *section;
char *location;
char *value;
CssProperty *property;
id = g_array_index (custom_props, int, i);
name = gtk_css_custom_property_pool_get_name (pool, id);
var_value = gtk_css_style_get_custom_property (new_style, id);
value = gtk_css_variable_value_to_string (var_value);
section = var_value->section;
if (section)
location = gtk_css_section_to_string (section);
else
location = NULL;
property = css_property_new (name, value, location);
g_list_store_append (priv->prop_model, property);
g_free (location);
g_free (value);
}
g_array_unref (custom_props);
}
}
} }
static void static void
+3
View File
@@ -53,6 +53,7 @@ gtk_private_sources = files([
'gtkcsscalcvalue.c', 'gtkcsscalcvalue.c',
'gtkcsscolorvalue.c', 'gtkcsscolorvalue.c',
'gtkcsscornervalue.c', 'gtkcsscornervalue.c',
'gtkcsscustompropertypool.c',
'gtkcssdimensionvalue.c', 'gtkcssdimensionvalue.c',
'gtkcssdynamic.c', 'gtkcssdynamic.c',
'gtkcsseasevalue.c', 'gtkcsseasevalue.c',
@@ -84,6 +85,7 @@ gtk_private_sources = files([
'gtkcssnumbervalue.c', 'gtkcssnumbervalue.c',
'gtkcsspalettevalue.c', 'gtkcsspalettevalue.c',
'gtkcsspositionvalue.c', 'gtkcsspositionvalue.c',
'gtkcssreferencevalue.c',
'gtkcssrepeatvalue.c', 'gtkcssrepeatvalue.c',
'gtkcssselector.c', 'gtkcssselector.c',
'gtkcssshadowvalue.c', 'gtkcssshadowvalue.c',
@@ -101,6 +103,7 @@ gtk_private_sources = files([
'gtkcsstypes.c', 'gtkcsstypes.c',
'gtkcssunsetvalue.c', 'gtkcssunsetvalue.c',
'gtkcssvalue.c', 'gtkcssvalue.c',
'gtkcssvariableset.c',
'gtkcsswidgetnode.c', 'gtkcsswidgetnode.c',
'gtkdrop.c', 'gtkdrop.c',
'gtkfilechooserentry.c', 'gtkfilechooserentry.c',
+6 -6
View File
@@ -1555,21 +1555,21 @@ headerbar {
} }
&.default-decoration { &.default-decoration {
min-height: 28px; min-height: 0px;
padding: 4px; padding: 0px 2px;
windowcontrols { windowcontrols {
button, button,
menubutton { menubutton {
min-height: 26px; min-height: 18px;
min-width: 26px; min-width: 18px;
margin: 0; margin: 0;
padding: 0; padding: 0;
} }
menubutton button { menubutton button {
min-height: 20px; min-height: 18px;
min-width: 20px; min-width: 18px;
margin: 0; margin: 0;
padding: 4px; padding: 4px;
} }
+139 -129
View File
@@ -11,8 +11,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gtk\n" "Project-Id-Version: gtk\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gtk/-/issues/\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gtk/-/issues/\n"
"POT-Creation-Date: 2024-03-30 09:15+0000\n" "POT-Creation-Date: 2024-05-11 03:40+0000\n"
"PO-Revision-Date: 2024-03-30 19:22+0100\n" "PO-Revision-Date: 2024-05-13 02:43+0200\n"
"Last-Translator: Ekaterine Papava <papava.e@gtu.ge>\n" "Last-Translator: Ekaterine Papava <papava.e@gtu.ge>\n"
"Language-Team: Georgian <http://mail.gnome.org/mailman/listinfo/gnome-ge-" "Language-Team: Georgian <http://mail.gnome.org/mailman/listinfo/gnome-ge-"
"list>\n" "list>\n"
@@ -55,7 +55,7 @@ msgstr "შემცველობის %s-ად გამოტანა შ
msgid "The current backend does not support OpenGL" msgid "The current backend does not support OpenGL"
msgstr "მიმდინარე უკანაბოლოს OpenGL-ის მხარდაჭერა არ გააჩნია" msgstr "მიმდინარე უკანაბოლოს OpenGL-ის მხარდაჭერა არ გააჩნია"
#: gdk/gdkdisplay.c:1315 gdk/gdkvulkancontext.c:1600 #: gdk/gdkdisplay.c:1315 gdk/gdkvulkancontext.c:1636
msgid "Vulkan support disabled via GDK_DEBUG" msgid "Vulkan support disabled via GDK_DEBUG"
msgstr "Vulkan-ის მხარდაჭერა გამორთულია GDK_DEBUG-ით" msgstr "Vulkan-ის მხარდაჭერა გამორთულია GDK_DEBUG-ით"
@@ -139,7 +139,7 @@ msgstr "აპლიკაციას %s-ის API-ის მხარდა
#. translators: This is about OpenGL backend names, like #. translators: This is about OpenGL backend names, like
#. * "Trying to use X11 GLX, but EGL is already in use" #. * "Trying to use X11 GLX, but EGL is already in use"
#: gdk/gdkglcontext.c:2123 #: gdk/gdkglcontext.c:2121
#, c-format #, c-format
msgid "Trying to use %s, but %s is already in use" msgid "Trying to use %s, but %s is already in use"
msgstr "%s გამოყენების მცდელობა, მაგრამ %s უკვე გამოიყენება" msgstr "%s გამოყენების მცდელობა, მაგრამ %s უკვე გამოიყენება"
@@ -535,7 +535,7 @@ msgstr "JPEG გამოსახულების ფაილის კი
msgid "Unsupported JPEG colorspace (%d)" msgid "Unsupported JPEG colorspace (%d)"
msgstr "მხარდაუჭერელი JPEG ფერთა სივრცე (%d)" msgstr "მხარდაუჭერელი JPEG ფერთა სივრცე (%d)"
#: gdk/loaders/gdkjpeg.c:203 gdk/loaders/gdkpng.c:286 gdk/loaders/gdktiff.c:472 #: gdk/loaders/gdkjpeg.c:203 gdk/loaders/gdkpng.c:289 gdk/loaders/gdktiff.c:472
#, c-format #, c-format
msgid "Not enough memory for image size %ux%u" msgid "Not enough memory for image size %ux%u"
msgstr "არასაკმარისი მეხსიერება გამოსახულების ჩასატვირთად %ux%u" msgstr "არასაკმარისი მეხსიერება გამოსახულების ჩასატვირთად %ux%u"
@@ -545,17 +545,17 @@ msgstr "არასაკმარისი მეხსიერება გ
msgid "Error reading png (%s)" msgid "Error reading png (%s)"
msgstr "PNG-ის წაკითხვის შეცდომა (%s)" msgstr "PNG-ის წაკითხვის შეცდომა (%s)"
#: gdk/loaders/gdkpng.c:212 #: gdk/loaders/gdkpng.c:215
#, c-format #, c-format
msgid "Unsupported depth %u in png image" msgid "Unsupported depth %u in png image"
msgstr "PNG გამოსახულების მხარდაუჭერელი ფერთა სიღრმე %u" msgstr "PNG გამოსახულების მხარდაუჭერელი ფერთა სიღრმე %u"
#: gdk/loaders/gdkpng.c:262 #: gdk/loaders/gdkpng.c:265
#, c-format #, c-format
msgid "Unsupported color type %u in png image" msgid "Unsupported color type %u in png image"
msgstr "PNG გამოსახულების ფერების მხარდაუჭერელი ტიპი %u" msgstr "PNG გამოსახულების ფერების მხარდაუჭერელი ტიპი %u"
#: gdk/loaders/gdkpng.c:272 #: gdk/loaders/gdkpng.c:275
#, c-format #, c-format
msgid "Image stride too large for image size %ux%u" msgid "Image stride too large for image size %ux%u"
msgstr "გამოსახულებს ბიჯი მეტისმეტად დიდია გამოსახულების ზომისთვის %ux%u" msgstr "გამოსახულებს ბიჯი მეტისმეტად დიდია გამოსახულების ზომისთვის %ux%u"
@@ -2274,7 +2274,7 @@ msgstr "ფაილი ამ სახელით უკვე არსე
#: gtk/gtkmessagedialog.c:179 gtk/gtkmountoperation.c:608 #: gtk/gtkmessagedialog.c:179 gtk/gtkmountoperation.c:608
#: gtk/print/gtkpagesetupunixdialog.c:282 gtk/print/gtkprintbackend.c:638 #: gtk/print/gtkpagesetupunixdialog.c:282 gtk/print/gtkprintbackend.c:638
#: gtk/print/gtkprintunixdialog.c:682 gtk/print/gtkprintunixdialog.c:839 #: gtk/print/gtkprintunixdialog.c:682 gtk/print/gtkprintunixdialog.c:839
#: gtk/gtkwindow.c:6256 gtk/ui/gtkappchooserdialog.ui:48 #: gtk/gtkwindow.c:6257 gtk/ui/gtkappchooserdialog.ui:48
#: gtk/ui/gtkassistant.ui:52 gtk/ui/gtkcolorchooserdialog.ui:36 #: gtk/ui/gtkassistant.ui:52 gtk/ui/gtkcolorchooserdialog.ui:36
#: gtk/ui/gtkfontchooserdialog.ui:27 #: gtk/ui/gtkfontchooserdialog.ui:27
msgid "_Cancel" msgid "_Cancel"
@@ -2362,7 +2362,7 @@ msgid "If you delete an item, it will be permanently lost."
msgstr "თუ წაშლით ელემენტს, ის სამუდამოდ დაიკარგება." msgstr "თუ წაშლით ელემენტს, ის სამუდამოდ დაიკარგება."
#: gtk/gtkfilechooserwidget.c:1188 gtk/gtkfilechooserwidget.c:1786 #: gtk/gtkfilechooserwidget.c:1188 gtk/gtkfilechooserwidget.c:1786
#: gtk/gtklabel.c:5712 gtk/gtktext.c:6194 gtk/gtktextview.c:9099 #: gtk/gtklabel.c:5745 gtk/gtktext.c:6194 gtk/gtktextview.c:9099
msgid "_Delete" msgid "_Delete"
msgstr "წაშლა" msgstr "წაშლა"
@@ -2688,7 +2688,7 @@ msgstr "სტილის ვარიაციები"
msgid "Character Variations" msgid "Character Variations"
msgstr "სიმბოლოების ვარიანტები" msgstr "სიმბოლოების ვარიანტები"
#: gtk/gtkglarea.c:309 #: gtk/gtkglarea.c:316
msgid "OpenGL context creation failed" msgid "OpenGL context creation failed"
msgstr "OpenGL-ის კონტექსტის შექმნის შეცდომა" msgstr "OpenGL-ის კონტექსტის შექმნის შეცდომა"
@@ -2701,31 +2701,31 @@ msgstr "დახურვა"
msgid "Close the infobar" msgid "Close the infobar"
msgstr "საინფორმაციო ზოლის დახურვა" msgstr "საინფორმაციო ზოლის დახურვა"
#: gtk/gtklabel.c:5709 gtk/gtktext.c:6182 gtk/gtktextview.c:9087 #: gtk/gtklabel.c:5742 gtk/gtktext.c:6182 gtk/gtktextview.c:9087
msgid "Cu_t" msgid "Cu_t"
msgstr "ამოჭრა" msgstr "ამოჭრა"
#: gtk/gtklabel.c:5710 gtk/gtktext.c:6186 gtk/gtktextview.c:9091 #: gtk/gtklabel.c:5743 gtk/gtktext.c:6186 gtk/gtktextview.c:9091
msgid "_Copy" msgid "_Copy"
msgstr "ასლი" msgstr "ასლი"
#: gtk/gtklabel.c:5711 gtk/gtktext.c:6190 gtk/gtktextview.c:9095 #: gtk/gtklabel.c:5744 gtk/gtktext.c:6190 gtk/gtktextview.c:9095
msgid "_Paste" msgid "_Paste"
msgstr "ჩასმა" msgstr "ჩასმა"
#: gtk/gtklabel.c:5717 gtk/gtktext.c:6203 gtk/gtktextview.c:9120 #: gtk/gtklabel.c:5750 gtk/gtktext.c:6203 gtk/gtktextview.c:9120
msgid "Select _All" msgid "Select _All"
msgstr "ყველაფრის _მონიშვნა" msgstr "ყველაფრის _მონიშვნა"
#: gtk/gtklabel.c:5722 #: gtk/gtklabel.c:5755
msgid "_Open Link" msgid "_Open Link"
msgstr "_ბმულის გახსნა" msgstr "_ბმულის გახსნა"
#: gtk/gtklabel.c:5726 #: gtk/gtklabel.c:5759
msgid "Copy _Link Address" msgid "Copy _Link Address"
msgstr "დაა_კოპირე ბმულის მისამართი" msgstr "დაა_კოპირე ბმულის მისამართი"
#: gtk/gtklabel.c:5770 gtk/gtktext.c:2723 gtk/gtktextview.c:9169 #: gtk/gtklabel.c:5803 gtk/gtktext.c:2723 gtk/gtktextview.c:9169
msgid "Context menu" msgid "Context menu"
msgstr "კონტექსტური მენიუ" msgstr "კონტექსტური მენიუ"
@@ -2733,7 +2733,7 @@ msgstr "კონტექსტური მენიუ"
msgid "_Copy URL" msgid "_Copy URL"
msgstr "URL-ის _კოპირება" msgstr "URL-ის _კოპირება"
#: gtk/gtklinkbutton.c:567 #: gtk/gtklinkbutton.c:589
msgid "Invalid URI" msgid "Invalid URI"
msgstr "მცდარი URI" msgstr "მცდარი URI"
@@ -2796,7 +2796,7 @@ msgid "Play"
msgstr "დაკვრა" msgstr "დაკვრა"
#: gtk/gtkmessagedialog.c:162 gtk/gtkmessagedialog.c:180 #: gtk/gtkmessagedialog.c:162 gtk/gtkmessagedialog.c:180
#: gtk/print/gtkprintbackend.c:639 gtk/gtkwindow.c:6257 #: gtk/print/gtkprintbackend.c:639 gtk/gtkwindow.c:6258
msgid "_OK" msgid "_OK"
msgstr "_დიახ" msgstr "_დიახ"
@@ -3414,7 +3414,7 @@ msgstr "არ არის ქაღალდი"
#. Translators: this is a printer status. #. Translators: this is a printer status.
#: gtk/print/gtkprintoperation-win32.c:640 #: gtk/print/gtkprintoperation-win32.c:640
#: modules/printbackends/gtkprintbackendcpdb.c:1528 #: modules/printbackends/gtkprintbackendcpdb.c:1533
#: modules/printbackends/gtkprintbackendcups.c:2639 #: modules/printbackends/gtkprintbackendcups.c:2639
msgid "Paused" msgid "Paused"
msgstr "შეჩერებულია" msgstr "შეჩერებულია"
@@ -3485,42 +3485,42 @@ msgstr "პრინტერის ინფორმაციის მიღ
#. * multiple pages on a sheet when printing #. * multiple pages on a sheet when printing
#. #.
#: gtk/print/gtkprintunixdialog.c:2753 #: gtk/print/gtkprintunixdialog.c:2753
#: modules/printbackends/gtkprintbackendcups.c:5672 #: modules/printbackends/gtkprintbackendcups.c:5677
msgid "Left to right, top to bottom" msgid "Left to right, top to bottom"
msgstr "მარცხნიდან მარჯვნივ, ქვევიდან ზემოთ" msgstr "მარცხნიდან მარჯვნივ, ქვევიდან ზემოთ"
#: gtk/print/gtkprintunixdialog.c:2753 #: gtk/print/gtkprintunixdialog.c:2753
#: modules/printbackends/gtkprintbackendcups.c:5672 #: modules/printbackends/gtkprintbackendcups.c:5677
msgid "Left to right, bottom to top" msgid "Left to right, bottom to top"
msgstr "მარცხნიდან მარჯვნივ, ქვემოდან ზემოთ" msgstr "მარცხნიდან მარჯვნივ, ქვემოდან ზემოთ"
#: gtk/print/gtkprintunixdialog.c:2754 #: gtk/print/gtkprintunixdialog.c:2754
#: modules/printbackends/gtkprintbackendcups.c:5673 #: modules/printbackends/gtkprintbackendcups.c:5678
msgid "Right to left, top to bottom" msgid "Right to left, top to bottom"
msgstr "მარჯვნიდან მარცხნივ, ზევიდან ქვემოთ" msgstr "მარჯვნიდან მარცხნივ, ზევიდან ქვემოთ"
#: gtk/print/gtkprintunixdialog.c:2754 #: gtk/print/gtkprintunixdialog.c:2754
#: modules/printbackends/gtkprintbackendcups.c:5673 #: modules/printbackends/gtkprintbackendcups.c:5678
msgid "Right to left, bottom to top" msgid "Right to left, bottom to top"
msgstr "მარჯვნიდან მარცხნივ, ქვემოდან ზემოთ" msgstr "მარჯვნიდან მარცხნივ, ქვემოდან ზემოთ"
#: gtk/print/gtkprintunixdialog.c:2755 #: gtk/print/gtkprintunixdialog.c:2755
#: modules/printbackends/gtkprintbackendcups.c:5674 #: modules/printbackends/gtkprintbackendcups.c:5679
msgid "Top to bottom, left to right" msgid "Top to bottom, left to right"
msgstr "ზემოდან ქვემოთ, მარცხნიდან მარჯვნივ" msgstr "ზემოდან ქვემოთ, მარცხნიდან მარჯვნივ"
#: gtk/print/gtkprintunixdialog.c:2755 #: gtk/print/gtkprintunixdialog.c:2755
#: modules/printbackends/gtkprintbackendcups.c:5674 #: modules/printbackends/gtkprintbackendcups.c:5679
msgid "Top to bottom, right to left" msgid "Top to bottom, right to left"
msgstr "ზემოდან ქვემოთ, მარჯვნიდან მარცხნივ" msgstr "ზემოდან ქვემოთ, მარჯვნიდან მარცხნივ"
#: gtk/print/gtkprintunixdialog.c:2756 #: gtk/print/gtkprintunixdialog.c:2756
#: modules/printbackends/gtkprintbackendcups.c:5675 #: modules/printbackends/gtkprintbackendcups.c:5680
msgid "Bottom to top, left to right" msgid "Bottom to top, left to right"
msgstr "ქვემოდან ზემოთ, მარცხნიდან მარჯვნივ" msgstr "ქვემოდან ზემოთ, მარცხნიდან მარჯვნივ"
#: gtk/print/gtkprintunixdialog.c:2756 #: gtk/print/gtkprintunixdialog.c:2756
#: modules/printbackends/gtkprintbackendcups.c:5675 #: modules/printbackends/gtkprintbackendcups.c:5680
msgid "Bottom to top, right to left" msgid "Bottom to top, right to left"
msgstr "ქვემოდან ზემოთ, მარჯვნიდან მარცხნივ" msgstr "ქვემოდან ზემოთ, მარჯვნიდან მარცხნივ"
@@ -3672,12 +3672,12 @@ msgstr "_დაბრუნება"
msgid "_Redo" msgid "_Redo"
msgstr "_გამეორება" msgstr "_გამეორება"
#: gtk/gtkwindow.c:6245 #: gtk/gtkwindow.c:6246
#, c-format #, c-format
msgid "Do you want to use GTK Inspector?" msgid "Do you want to use GTK Inspector?"
msgstr "გნებავთ GTK-ის ინსპექტორის გამოყენება?" msgstr "გნებავთ GTK-ის ინსპექტორის გამოყენება?"
#: gtk/gtkwindow.c:6247 #: gtk/gtkwindow.c:6248
#, c-format #, c-format
msgid "" msgid ""
"GTK Inspector is an interactive debugger that lets you explore and modify " "GTK Inspector is an interactive debugger that lets you explore and modify "
@@ -3688,7 +3688,7 @@ msgstr ""
"ნებისმიერი GTK აპლიკაციის შიდა პარამეტრები დაათვალიეროთ და შეცვალოთ. მისი " "ნებისმიერი GTK აპლიკაციის შიდა პარამეტრები დაათვალიეროთ და შეცვალოთ. მისი "
"გამოყენებით ასევე შეიძლება პროგრამა ავარიულად დასრულდეს." "გამოყენებით ასევე შეიძლება პროგრამა ავარიულად დასრულდეს."
#: gtk/gtkwindow.c:6252 #: gtk/gtkwindow.c:6253
msgid "Dont show this message again" msgid "Dont show this message again"
msgstr "მეტჯერ აღარ მაჩვენო ეს გაფრთხილება" msgstr "მეტჯერ აღარ მაჩვენო ეს გაფრთხილება"
@@ -3866,37 +3866,37 @@ msgstr "სტილის კლასები"
msgid "CSS Property" msgid "CSS Property"
msgstr "CSS-ის თვისება" msgstr "CSS-ის თვისება"
#: gtk/inspector/general.c:370 #: gtk/inspector/general.c:371
msgctxt "GL version" msgctxt "GL version"
msgid "None" msgid "None"
msgstr "არცერთი" msgstr "არცერთი"
#: gtk/inspector/general.c:461 #: gtk/inspector/general.c:462
msgctxt "GL version" msgctxt "GL version"
msgid "Unknown" msgid "Unknown"
msgstr "უცნობი" msgstr "უცნობი"
#: gtk/inspector/general.c:523 #: gtk/inspector/general.c:524
msgctxt "Vulkan device" msgctxt "Vulkan device"
msgid "Disabled" msgid "Disabled"
msgstr "გამორთულია" msgstr "გამორთულია"
#: gtk/inspector/general.c:524 gtk/inspector/general.c:525 #: gtk/inspector/general.c:525 gtk/inspector/general.c:526
msgctxt "Vulkan version" msgctxt "Vulkan version"
msgid "Disabled" msgid "Disabled"
msgstr "გამორთულია" msgstr "გამორთულია"
#: gtk/inspector/general.c:576 #: gtk/inspector/general.c:577
msgctxt "Vulkan device" msgctxt "Vulkan device"
msgid "None" msgid "None"
msgstr "არცერთი" msgstr "არცერთი"
#: gtk/inspector/general.c:577 gtk/inspector/general.c:578 #: gtk/inspector/general.c:578 gtk/inspector/general.c:579
msgctxt "Vulkan version" msgctxt "Vulkan version"
msgid "None" msgid "None"
msgstr "არცერთი" msgstr "არცერთი"
#: gtk/inspector/general.c:924 #: gtk/inspector/general.c:930
msgid "IM Context is hardcoded by GTK_IM_MODULE" msgid "IM Context is hardcoded by GTK_IM_MODULE"
msgstr "IM-ის კონტექსტი GTK_IM_MODULE-ში ხელითაა ჩაწერილი" msgstr "IM-ის კონტექსტი GTK_IM_MODULE-ში ხელითაა ჩაწერილი"
@@ -4206,7 +4206,7 @@ msgstr "წყარო:"
msgid "Defined At" msgid "Defined At"
msgstr "აღწერის წერტილი" msgstr "აღწერის წერტილი"
#: gtk/inspector/recorder.c:1941 #: gtk/inspector/recorder.c:1950
#, c-format #, c-format
msgid "Saving RenderNode failed" msgid "Saving RenderNode failed"
msgstr "RenderNode-ის შენახვის შეცდომა" msgstr "RenderNode-ის შენახვის შეცდომა"
@@ -4344,7 +4344,7 @@ msgstr "იერარქია"
msgid "Implements" msgid "Implements"
msgstr "იმპლემენტაციას უკეთებს" msgstr "იმპლემენტაციას უკეთებს"
#: gtk/inspector/visual.c:765 gtk/inspector/visual.c:784 #: gtk/inspector/visual.c:690 gtk/inspector/visual.c:708
msgid "Theme is hardcoded by GTK_THEME" msgid "Theme is hardcoded by GTK_THEME"
msgstr "თემა ჩადგმულია GTK_THEME-ის მიერ" msgstr "თემა ჩადგმულია GTK_THEME-ის მიერ"
@@ -4389,43 +4389,28 @@ msgid "Slowdown"
msgstr "შენელება" msgstr "შენელება"
#: gtk/inspector/visual.ui:362 #: gtk/inspector/visual.ui:362
msgid "Antialiasing" msgid "Rendering"
msgstr "მომრგვალება" msgstr "რენდერი"
#: gtk/inspector/visual.ui:387 #: gtk/inspector/visual.ui:377
msgid "Hinting" msgctxt "Font rendering"
msgstr "მომრგვალება" msgid "Automatic"
msgstr "ავტომატური"
#: gtk/inspector/visual.ui:402 #: gtk/inspector/visual.ui:378
msgid "None" msgctxt "Font rendering"
msgstr "არცერთი" msgid "Manual"
msgstr "ხელით"
#: gtk/inspector/visual.ui:403
msgid "Slight"
msgstr "ოდნავ"
#: gtk/inspector/visual.ui:404 modules/printbackends/gtkprintbackendcpdb.c:541
#: modules/printbackends/gtkprintbackendcups.c:5667
msgid "Medium"
msgstr "საშუალო"
#: gtk/inspector/visual.ui:405 #: gtk/inspector/visual.ui:405
msgid "Full"
msgstr "სრული"
#: gtk/inspector/visual.ui:422
msgid "Metrics Hinting"
msgstr "მეტრიკის მომრგვალება"
#: gtk/inspector/visual.ui:457
msgid "Show Framerate" msgid "Show Framerate"
msgstr "კადრების სიხშირის ჩვენება" msgstr "კადრების სიხშირის ჩვენება"
#: gtk/inspector/visual.ui:482 #: gtk/inspector/visual.ui:430
msgid "Show Graphic Updates" msgid "Show Graphic Updates"
msgstr "გრაფიკული განახლებების ჩვენება" msgstr "გრაფიკული განახლებების ჩვენება"
#: gtk/inspector/visual.ui:502 #: gtk/inspector/visual.ui:450
msgid "" msgid ""
"Tints all the places where the current renderer uses Cairo instead of the " "Tints all the places where the current renderer uses Cairo instead of the "
"GPU." "GPU."
@@ -4433,47 +4418,47 @@ msgstr ""
"შეღებავს ყველა ადგილს, სადაც მიმდინარე რენდერერი GPU-ის მაგიერ Cairo-ს " "შეღებავს ყველა ადგილს, სადაც მიმდინარე რენდერერი GPU-ის მაგიერ Cairo-ს "
"იყენებს." "იყენებს."
#: gtk/inspector/visual.ui:508 #: gtk/inspector/visual.ui:456
msgid "Show Cairo Rendering" msgid "Show Cairo Rendering"
msgstr "Cairo-ის რენდერის ჩვენება" msgstr "Cairo-ის რენდერის ჩვენება"
#: gtk/inspector/visual.ui:533 #: gtk/inspector/visual.ui:481
msgid "Show Baselines" msgid "Show Baselines"
msgstr "საბაზისო ხაზების ჩვენება" msgstr "საბაზისო ხაზების ჩვენება"
#: gtk/inspector/visual.ui:561 #: gtk/inspector/visual.ui:509
msgid "Show Layout Borders" msgid "Show Layout Borders"
msgstr "განლაგების საზღვრების ჩვენება" msgstr "განლაგების საზღვრების ჩვენება"
#: gtk/inspector/visual.ui:618 #: gtk/inspector/visual.ui:566
msgid "CSS Padding" msgid "CSS Padding"
msgstr "CSS-ის შეწევა" msgstr "CSS-ის შეწევა"
#: gtk/inspector/visual.ui:628 #: gtk/inspector/visual.ui:576
msgid "CSS Border" msgid "CSS Border"
msgstr "CSS-ის საზღვარი" msgstr "CSS-ის საზღვარი"
#: gtk/inspector/visual.ui:638 #: gtk/inspector/visual.ui:586
msgid "CSS Margin" msgid "CSS Margin"
msgstr "CSS-ის შეწევა" msgstr "CSS-ის შეწევა"
#: gtk/inspector/visual.ui:648 #: gtk/inspector/visual.ui:596
msgid "Widget Margin" msgid "Widget Margin"
msgstr "ვიჯეტის შეწევა" msgstr "ვიჯეტის შეწევა"
#: gtk/inspector/visual.ui:683 #: gtk/inspector/visual.ui:631
msgid "Show Focus" msgid "Show Focus"
msgstr "ფოკუსის ჩვენება" msgstr "ფოკუსის ჩვენება"
#: gtk/inspector/visual.ui:708 #: gtk/inspector/visual.ui:656
msgid "Show Accessibility warnings" msgid "Show Accessibility warnings"
msgstr "წვდომადობის გაფრთხილებების ჩვენება" msgstr "წვდომადობის გაფრთხილებების ჩვენება"
#: gtk/inspector/visual.ui:733 #: gtk/inspector/visual.ui:681
msgid "Show Graphics Offload" msgid "Show Graphics Offload"
msgstr "გრაფიკის რენდერის გატანის ჩვენება" msgstr "გრაფიკის რენდერის გატანის ჩვენება"
#: gtk/inspector/visual.ui:765 #: gtk/inspector/visual.ui:713
msgid "Inspect Inspector" msgid "Inspect Inspector"
msgstr "კონტროლის ინსპექტორი" msgstr "კონტროლის ინსპექტორი"
@@ -6599,29 +6584,35 @@ msgstr "დამატებითი"
msgid "Some of the settings in the dialog conflict" msgid "Some of the settings in the dialog conflict"
msgstr "კონფლიქტი ფანჯრის რამდენიმე პარამეტრს შორის" msgstr "კონფლიქტი ფანჯრის რამდენიმე პარამეტრს შორის"
#. Translators: These strings name the possible values of the #: modules/printbackends/gtkprintbackendcpdb.c:542
#. * job priority option in the print dialog #: modules/printbackends/gtkprintbackendcups.c:5668
#. msgctxt "Print job priority"
#: modules/printbackends/gtkprintbackendcpdb.c:541
#: modules/printbackends/gtkprintbackendcups.c:5667
msgid "Urgent" msgid "Urgent"
msgstr "გადაუდებელი" msgstr "გადაუდებელი"
#: modules/printbackends/gtkprintbackendcpdb.c:541 #: modules/printbackends/gtkprintbackendcpdb.c:543
#: modules/printbackends/gtkprintbackendcups.c:5667 #: modules/printbackends/gtkprintbackendcups.c:5669
msgctxt "Print job priority"
msgid "High" msgid "High"
msgstr "მაღალი" msgstr "მაღალი"
#: modules/printbackends/gtkprintbackendcpdb.c:541 #: modules/printbackends/gtkprintbackendcpdb.c:544
#: modules/printbackends/gtkprintbackendcups.c:5667 #: modules/printbackends/gtkprintbackendcups.c:5670
msgctxt "Print job priority"
msgid "Medium"
msgstr "საშუალო"
#: modules/printbackends/gtkprintbackendcpdb.c:545
#: modules/printbackends/gtkprintbackendcups.c:5671
msgctxt "Print job priority"
msgid "Low" msgid "Low"
msgstr "დაბალი" msgstr "დაბალი"
#. Translators, this is the label used for the option in the print #. Translators, this is the label used for the option in the print
#. * dialog that controls the front cover page. #. * dialog that controls the front cover page.
#. #.
#: modules/printbackends/gtkprintbackendcpdb.c:562 #: modules/printbackends/gtkprintbackendcpdb.c:567
#: modules/printbackends/gtkprintbackendcups.c:5809 #: modules/printbackends/gtkprintbackendcups.c:5814
msgctxt "printer option" msgctxt "printer option"
msgid "Before" msgid "Before"
msgstr "ჯერ" msgstr "ჯერ"
@@ -6629,33 +6620,33 @@ msgstr "ჯერ"
#. Translators, this is the label used for the option in the print #. Translators, this is the label used for the option in the print
#. * dialog that controls the back cover page. #. * dialog that controls the back cover page.
#. #.
#: modules/printbackends/gtkprintbackendcpdb.c:569 #: modules/printbackends/gtkprintbackendcpdb.c:574
#: modules/printbackends/gtkprintbackendcups.c:5824 #: modules/printbackends/gtkprintbackendcups.c:5829
msgctxt "printer option" msgctxt "printer option"
msgid "After" msgid "After"
msgstr "შემდეგ" msgstr "შემდეგ"
#: modules/printbackends/gtkprintbackendcpdb.c:592 #: modules/printbackends/gtkprintbackendcpdb.c:597
msgid "Print at" msgid "Print at"
msgstr "დაბეჭდვის დრო" msgstr "დაბეჭდვის დრო"
#: modules/printbackends/gtkprintbackendcpdb.c:602 #: modules/printbackends/gtkprintbackendcpdb.c:607
msgid "Print at time" msgid "Print at time"
msgstr "დაბეჭდვის დრო" msgstr "დაბეჭდვის დრო"
#: modules/printbackends/gtkprintbackendcpdb.c:665 #: modules/printbackends/gtkprintbackendcpdb.c:670
msgctxt "print option" msgctxt "print option"
msgid "Borderless" msgid "Borderless"
msgstr "საზღვრების გარეშე" msgstr "საზღვრების გარეშე"
#. Translators: this is a printer status. #. Translators: this is a printer status.
#: modules/printbackends/gtkprintbackendcpdb.c:1525 #: modules/printbackends/gtkprintbackendcpdb.c:1530
#: modules/printbackends/gtkprintbackendcups.c:2636 #: modules/printbackends/gtkprintbackendcups.c:2636
msgid "Paused; Rejecting Jobs" msgid "Paused; Rejecting Jobs"
msgstr "შეყოვნებულია; დავალებების უარყოფა" msgstr "შეყოვნებულია; დავალებების უარყოფა"
#. Translators: this is a printer status. #. Translators: this is a printer status.
#: modules/printbackends/gtkprintbackendcpdb.c:1531 #: modules/printbackends/gtkprintbackendcpdb.c:1536
#: modules/printbackends/gtkprintbackendcups.c:2642 #: modules/printbackends/gtkprintbackendcups.c:2642
msgid "Rejecting Jobs" msgid "Rejecting Jobs"
msgstr "დავალებების უარყოფა" msgstr "დავალებების უარყოფა"
@@ -7021,51 +7012,51 @@ msgstr "ნაგულისხმევი პრინტერი"
#. Translators, this string is used to label the job priority option #. Translators, this string is used to label the job priority option
#. * in the print dialog #. * in the print dialog
#. #.
#: modules/printbackends/gtkprintbackendcups.c:5697 #: modules/printbackends/gtkprintbackendcups.c:5702
msgid "Job Priority" msgid "Job Priority"
msgstr "ამოცანის პრიორიტეტი" msgstr "ამოცანის პრიორიტეტი"
#. Translators, this string is used to label the billing info entry #. Translators, this string is used to label the billing info entry
#. * in the print dialog #. * in the print dialog
#. #.
#: modules/printbackends/gtkprintbackendcups.c:5708 #: modules/printbackends/gtkprintbackendcups.c:5713
msgid "Billing Info" msgid "Billing Info"
msgstr "ანგარიშთა ინფორმაცია" msgstr "ანგარიშთა ინფორმაცია"
#. Translators, these strings are names for various 'standard' cover #. Translators, these strings are names for various 'standard' cover
#. * pages that the printing system may support. #. * pages that the printing system may support.
#. #.
#: modules/printbackends/gtkprintbackendcups.c:5732 #: modules/printbackends/gtkprintbackendcups.c:5737
msgctxt "cover page" msgctxt "cover page"
msgid "None" msgid "None"
msgstr "არცერთი" msgstr "არცერთი"
#: modules/printbackends/gtkprintbackendcups.c:5733 #: modules/printbackends/gtkprintbackendcups.c:5738
msgctxt "cover page" msgctxt "cover page"
msgid "Classified" msgid "Classified"
msgstr "საიდუმლო" msgstr "საიდუმლო"
#: modules/printbackends/gtkprintbackendcups.c:5734 #: modules/printbackends/gtkprintbackendcups.c:5739
msgctxt "cover page" msgctxt "cover page"
msgid "Confidential" msgid "Confidential"
msgstr "კონფიდენციალური" msgstr "კონფიდენციალური"
#: modules/printbackends/gtkprintbackendcups.c:5735 #: modules/printbackends/gtkprintbackendcups.c:5740
msgctxt "cover page" msgctxt "cover page"
msgid "Secret" msgid "Secret"
msgstr "სამხედრო საიდუმლო" msgstr "სამხედრო საიდუმლო"
#: modules/printbackends/gtkprintbackendcups.c:5736 #: modules/printbackends/gtkprintbackendcups.c:5741
msgctxt "cover page" msgctxt "cover page"
msgid "Standard" msgid "Standard"
msgstr "სტანდარტული" msgstr "სტანდარტული"
#: modules/printbackends/gtkprintbackendcups.c:5737 #: modules/printbackends/gtkprintbackendcups.c:5742
msgctxt "cover page" msgctxt "cover page"
msgid "Top Secret" msgid "Top Secret"
msgstr "უმაღლესი დონის საიდუმლო" msgstr "უმაღლესი დონის საიდუმლო"
#: modules/printbackends/gtkprintbackendcups.c:5738 #: modules/printbackends/gtkprintbackendcups.c:5743
msgctxt "cover page" msgctxt "cover page"
msgid "Unclassified" msgid "Unclassified"
msgstr "არასაიდუმლო" msgstr "არასაიდუმლო"
@@ -7073,7 +7064,7 @@ msgstr "არასაიდუმლო"
#. Translators, this string is used to label the pages-per-sheet option #. Translators, this string is used to label the pages-per-sheet option
#. * in the print dialog #. * in the print dialog
#. #.
#: modules/printbackends/gtkprintbackendcups.c:5750 #: modules/printbackends/gtkprintbackendcups.c:5755
msgctxt "printer option" msgctxt "printer option"
msgid "Pages per Sheet" msgid "Pages per Sheet"
msgstr "გვერდები ფურცელზე" msgstr "გვერდები ფურცელზე"
@@ -7081,7 +7072,7 @@ msgstr "გვერდები ფურცელზე"
#. Translators, this string is used to label the option in the print #. Translators, this string is used to label the option in the print
#. * dialog that controls in what order multiple pages are arranged #. * dialog that controls in what order multiple pages are arranged
#. #.
#: modules/printbackends/gtkprintbackendcups.c:5767 #: modules/printbackends/gtkprintbackendcups.c:5772
msgctxt "printer option" msgctxt "printer option"
msgid "Page Ordering" msgid "Page Ordering"
msgstr "გვერდის დალაგება" msgstr "გვერდის დალაგება"
@@ -7090,7 +7081,7 @@ msgstr "გვერდის დალაგება"
#. * a print job is printed. Possible values are 'now', a specified time, #. * a print job is printed. Possible values are 'now', a specified time,
#. * or 'on hold' #. * or 'on hold'
#. #.
#: modules/printbackends/gtkprintbackendcups.c:5844 #: modules/printbackends/gtkprintbackendcups.c:5849
msgctxt "printer option" msgctxt "printer option"
msgid "Print at" msgid "Print at"
msgstr "დაბეჭდვის დრო" msgstr "დაბეჭდვის დრო"
@@ -7098,7 +7089,7 @@ msgstr "დაბეჭდვის დრო"
#. Translators: this is the name of the option that allows the user #. Translators: this is the name of the option that allows the user
#. * to specify a time when a print job will be printed. #. * to specify a time when a print job will be printed.
#. #.
#: modules/printbackends/gtkprintbackendcups.c:5855 #: modules/printbackends/gtkprintbackendcups.c:5860
msgctxt "printer option" msgctxt "printer option"
msgid "Print at time" msgid "Print at time"
msgstr "დაბეჭდვის დრო" msgstr "დაბეჭდვის დრო"
@@ -7108,19 +7099,19 @@ msgstr "დაბეჭდვის დრო"
#. * the width and height in points. E.g: "Custom #. * the width and height in points. E.g: "Custom
#. * 230.4x142.9" #. * 230.4x142.9"
#. #.
#: modules/printbackends/gtkprintbackendcups.c:5902 #: modules/printbackends/gtkprintbackendcups.c:5907
#, c-format #, c-format
msgid "Custom %s×%s" msgid "Custom %s×%s"
msgstr "ხელით %s×%s" msgstr "ხელით %s×%s"
#. TRANSLATORS: this is the ICC color profile to use for this job #. TRANSLATORS: this is the ICC color profile to use for this job
#: modules/printbackends/gtkprintbackendcups.c:6013 #: modules/printbackends/gtkprintbackendcups.c:6018
msgctxt "printer option" msgctxt "printer option"
msgid "Printer Profile" msgid "Printer Profile"
msgstr "პრინტერის პროფილი" msgstr "პრინტერის პროფილი"
#. TRANSLATORS: this is when color profile information is unavailable #. TRANSLATORS: this is when color profile information is unavailable
#: modules/printbackends/gtkprintbackendcups.c:6020 #: modules/printbackends/gtkprintbackendcups.c:6025
msgctxt "printer option value" msgctxt "printer option value"
msgid "Unavailable" msgid "Unavailable"
msgstr "მიუწვდომელია" msgstr "მიუწვდომელია"
@@ -7181,22 +7172,22 @@ msgstr "მიმდინარის მაგიერ ამ საქაღ
msgid "Generate debug output" msgid "Generate debug output"
msgstr "პროგრამის გამართვის ინფორმაციის გენერაცია" msgstr "პროგრამის გამართვის ინფორმაციის გენერაცია"
#: tools/encodesymbolic.c:92 #: tools/encodesymbolic.c:95
#, c-format #, c-format
msgid "Invalid size %s\n" msgid "Invalid size %s\n"
msgstr "არასწორი ზომა: %s\n" msgstr "არასწორი ზომა: %s\n"
#: tools/encodesymbolic.c:104 tools/encodesymbolic.c:113 #: tools/encodesymbolic.c:107 tools/encodesymbolic.c:116
#, c-format #, c-format
msgid "Cant load file: %s\n" msgid "Cant load file: %s\n"
msgstr "ფაილის ჩატვირთვა შეუძლებელია: \"%s\"\n" msgstr "ფაილის ჩატვირთვა შეუძლებელია: \"%s\"\n"
#: tools/encodesymbolic.c:141 tools/encodesymbolic.c:147 #: tools/encodesymbolic.c:144 tools/encodesymbolic.c:162
#, c-format #, c-format
msgid "Cant save file %s: %s\n" msgid "Cant save file %s: %s\n"
msgstr "ფაილის შენახვა შეუძლებელია: \"%s\": %s\n" msgstr "ფაილის შენახვა შეუძლებელია: \"%s\": %s\n"
#: tools/encodesymbolic.c:153 #: tools/encodesymbolic.c:168
#, c-format #, c-format
msgid "Cant close stream" msgid "Cant close stream"
msgstr "ნაკადის დახურვა შეუძლებელია" msgstr "ნაკადის დახურვა შეუძლებელია"
@@ -7269,7 +7260,7 @@ msgstr "სტილის CSS ფაილიდან გამოყენე
#: tools/gtk-builder-tool-preview.c:187 tools/gtk-builder-tool-screenshot.c:370 #: tools/gtk-builder-tool-preview.c:187 tools/gtk-builder-tool-screenshot.c:370
#: tools/gtk-builder-tool-validate.c:268 #: tools/gtk-builder-tool-validate.c:268
#: tools/gtk-rendernode-tool-benchmark.c:106 #: tools/gtk-rendernode-tool-benchmark.c:106
#: tools/gtk-rendernode-tool-render.c:203 tools/gtk-rendernode-tool-show.c:113 #: tools/gtk-rendernode-tool-render.c:262 tools/gtk-rendernode-tool-show.c:113
#, c-format #, c-format
msgid "Could not initialize windowing system\n" msgid "Could not initialize windowing system\n"
msgstr "ფანჯრული სისტემის ინიციალიზაციის შეცდომა\n" msgstr "ფანჯრული სისტემის ინიციალიზაციის შეცდომა\n"
@@ -7314,13 +7305,13 @@ msgstr ""
"თავზე გადასაწერად გამოიყენეთ --force.\n" "თავზე გადასაწერად გამოიყენეთ --force.\n"
#: tools/gtk-builder-tool-screenshot.c:332 #: tools/gtk-builder-tool-screenshot.c:332
#: tools/gtk-rendernode-tool-render.c:171 #: tools/gtk-rendernode-tool-render.c:230
#, c-format #, c-format
msgid "Output written to %s.\n" msgid "Output written to %s.\n"
msgstr "გამოტანილი ინფორმაცია ჩაწერილია %s-ში.\n" msgstr "გამოტანილი ინფორმაცია ჩაწერილია %s-ში.\n"
#: tools/gtk-builder-tool-screenshot.c:336 #: tools/gtk-builder-tool-screenshot.c:336
#: tools/gtk-rendernode-tool-render.c:175 #: tools/gtk-rendernode-tool-render.c:234
#, c-format #, c-format
msgid "Failed to save %s: %s\n" msgid "Failed to save %s: %s\n"
msgstr "\"%s'-ის შენახვის შეცდომა: %s\n" msgstr "\"%s'-ის შენახვის შეცდომა: %s\n"
@@ -7339,7 +7330,7 @@ msgstr "არსებულ ფაილზე გადაწერა"
#: tools/gtk-builder-tool-screenshot.c:363 #: tools/gtk-builder-tool-screenshot.c:363
#: tools/gtk-rendernode-tool-benchmark.c:97 #: tools/gtk-rendernode-tool-benchmark.c:97
#: tools/gtk-rendernode-tool-render.c:196 #: tools/gtk-rendernode-tool-render.c:255
msgid "FILE…" msgid "FILE…"
msgstr "FILE…" msgstr "FILE…"
@@ -7835,7 +7826,7 @@ msgstr "რენდერერის დამატება ტესტი
#: tools/gtk-rendernode-tool-benchmark.c:94 #: tools/gtk-rendernode-tool-benchmark.c:94
#: tools/gtk-rendernode-tool-compare.c:65 #: tools/gtk-rendernode-tool-compare.c:65
#: tools/gtk-rendernode-tool-render.c:195 #: tools/gtk-rendernode-tool-render.c:254
msgid "RENDERER" msgid "RENDERER"
msgstr "რენდერერი" msgstr "რენდერერი"
@@ -7856,7 +7847,7 @@ msgid "Benchmark rendering of a .node file."
msgstr ".node ფაილის სატესტო რენდერი." msgstr ".node ფაილის სატესტო რენდერი."
#: tools/gtk-rendernode-tool-benchmark.c:127 #: tools/gtk-rendernode-tool-benchmark.c:127
#: tools/gtk-rendernode-tool-info.c:236 tools/gtk-rendernode-tool-render.c:224 #: tools/gtk-rendernode-tool-info.c:236 tools/gtk-rendernode-tool-render.c:283
#: tools/gtk-rendernode-tool-show.c:134 #: tools/gtk-rendernode-tool-show.c:134
#, c-format #, c-format
msgid "No .node file specified\n" msgid "No .node file specified\n"
@@ -7868,7 +7859,7 @@ msgid "Can only benchmark a single .node file\n"
msgstr "შეგიძლიათ მხოლოდ ერთი .node ფაილის დატესტვა\n" msgstr "შეგიძლიათ მხოლოდ ერთი .node ფაილის დატესტვა\n"
#: tools/gtk-rendernode-tool-compare.c:65 #: tools/gtk-rendernode-tool-compare.c:65
#: tools/gtk-rendernode-tool-render.c:195 #: tools/gtk-rendernode-tool-render.c:254
msgid "Renderer to use" msgid "Renderer to use"
msgstr "გამოყენებული რენდერერი" msgstr "გამოყენებული რენდერერი"
@@ -7890,7 +7881,7 @@ msgid "Must specify two files\n"
msgstr "აუცილებელია ორი ფაილის მითითება\n" msgstr "აუცილებელია ორი ფაილის მითითება\n"
#: tools/gtk-rendernode-tool-compare.c:102 #: tools/gtk-rendernode-tool-compare.c:102
#: tools/gtk-rendernode-tool-render.c:150 #: tools/gtk-rendernode-tool-render.c:209
#, c-format #, c-format
msgid "Failed to create renderer: %s\n" msgid "Failed to create renderer: %s\n"
msgstr "რენდერერის შექმნა ჩავარდა: %s\n" msgstr "რენდერერის შექმნა ჩავარდა: %s\n"
@@ -7951,7 +7942,7 @@ msgstr "შეიყვანეთ ინფორმაცია რენდ
msgid "Can only accept a single .node file\n" msgid "Can only accept a single .node file\n"
msgstr "შეგიძლიათ მხოლოდ ერთი .node ფაილის მიღება\n" msgstr "შეგიძლიათ მხოლოდ ერთი .node ფაილის მიღება\n"
#: tools/gtk-rendernode-tool-render.c:123 #: tools/gtk-rendernode-tool-render.c:170
#, c-format #, c-format
msgid "" msgid ""
"File %s exists.\n" "File %s exists.\n"
@@ -7961,16 +7952,17 @@ msgstr ""
"თუ გნებავთ, თავზე გადააწეროთ, ფაილის სახელი მიუთითეთ.\n" "თუ გნებავთ, თავზე გადააწეროთ, ფაილის სახელი მიუთითეთ.\n"
"\n" "\n"
#: tools/gtk-rendernode-tool-render.c:137 #: tools/gtk-rendernode-tool-render.c:184
#: tools/gtk-rendernode-tool-render.c:196
#, c-format #, c-format
msgid "Failed to generate SVG: %s\n" msgid "Failed to generate SVG: %s\n"
msgstr "შეცდომა SVG-ის გენერაციისას: %s\n" msgstr "შეცდომა SVG-ის გენერაციისას: %s\n"
#: tools/gtk-rendernode-tool-render.c:211 #: tools/gtk-rendernode-tool-render.c:270
msgid "Render a .node file to an image." msgid "Render a .node file to an image."
msgstr ".ui ფაილის რენდერი გამოსახულებაში." msgstr ".ui ფაილის რენდერი გამოსახულებაში."
#: tools/gtk-rendernode-tool-render.c:230 #: tools/gtk-rendernode-tool-render.c:289
#, c-format #, c-format
msgid "Can only render a single .node file to a single output file\n" msgid "Can only render a single .node file to a single output file\n"
msgstr "ერთი .node ფაილის მხოლოდ ერთ გამოტანის ფაილში რენდერი შეგიძლიათ\n" msgstr "ერთი .node ფაილის მხოლოდ ერთ გამოტანის ფაილში რენდერი შეგიძლიათ\n"
@@ -8106,6 +8098,24 @@ msgstr ""
"თუ მართლა გნებავთ, ხატულების კეში აქ შექმნათ, --ignore-theme-index " "თუ მართლა გნებავთ, ხატულების კეში აქ შექმნათ, --ignore-theme-index "
"გამოიყენეთ.\n" "გამოიყენეთ.\n"
#~ msgid "Antialiasing"
#~ msgstr "მომრგვალება"
#~ msgid "Hinting"
#~ msgstr "მომრგვალება"
#~ msgid "None"
#~ msgstr "არცერთი"
#~ msgid "Slight"
#~ msgstr "ოდნავ"
#~ msgid "Full"
#~ msgstr "სრული"
#~ msgid "Metrics Hinting"
#~ msgstr "მეტრიკის მომრგვალება"
#~ msgid "Backend does not support window scaling" #~ msgid "Backend does not support window scaling"
#~ msgstr "უკანაბოლოს ფანჯრის მასშტაბირების მხარდაჭერა არ გააჩნია" #~ msgstr "უკანაბოლოს ფანჯრის მასშტაბირების მხარდაჭერა არ გააჩნია"
+518 -1004
View File
File diff suppressed because it is too large Load Diff
+14
View File
@@ -0,0 +1,14 @@
/* test variable changes */
box {
--test: red;
color: var(--test, green);
}
label:hover {
--test: blue;
}
label:active {
--test: initial;
}
+3
View File
@@ -0,0 +1,3 @@
window.background:dir(ltr)
box.horizontal:dir(ltr) name
label.a:dir(ltr) name|state|hover
+17
View File
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<object class="GtkWindow" id="window1">
<property name="can_focus">False</property>
<property name="decorated">0</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<child>
<object class="GtkLabel">
<style><class name="a"/></style>
</object>
</child>
</object>
</child>
</object>
</interface>
+17
View File
@@ -606,6 +606,23 @@ test_data = [
'value-none.css', 'value-none.css',
'value-none.errors', 'value-none.errors',
'value-none.ref.css', 'value-none.ref.css',
'variables.css',
'variables.ref.css',
'variables-invalid-01.css',
'variables-invalid-01.errors',
'variables-invalid-01.ref.css',
'variables-invalid-02.css',
'variables-invalid-02.errors',
'variables-invalid-02.ref.css',
'variables-invalid-03.css',
'variables-invalid-03.errors',
'variables-invalid-03.ref.css',
'variables-invalid-04.css',
'variables-invalid-04.errors',
'variables-invalid-04.ref.css',
'variables-invalid-05.css',
'variables-invalid-05.errors',
'variables-invalid-05.ref.css',
] ]
foreach testname : test_data foreach testname : test_data
+14 -16
View File
@@ -269,6 +269,17 @@ add_tests_for_files_in_directory (GFile *dir)
int int
main (int argc, char **argv) main (int argc, char **argv)
{ {
if (argc >= 2 && strcmp (argv[1], "--generate") == 0)
{
GFile *file;
file = g_file_new_for_commandline_arg (argv[2]);
parse_css_file (file, TRUE);
g_object_unref (file);
return 0;
}
gtk_test_init (&argc, &argv); gtk_test_init (&argc, &argv);
if (argc < 2) if (argc < 2)
@@ -282,27 +293,14 @@ main (int argc, char **argv)
g_object_unref (dir); g_object_unref (dir);
} }
else if (strcmp (argv[1], "--generate") == 0)
{
if (argc >= 3)
{
GFile *file = g_file_new_for_commandline_arg (argv[2]);
parse_css_file (file, TRUE);
g_object_unref (file);
}
}
else else
{ {
guint i; for (guint i = 1; i < argc; i++)
for (i = 1; i < argc; i++)
{ {
GFile *file = g_file_new_for_commandline_arg (argv[i]); GFile *file;
file = g_file_new_for_commandline_arg (argv[i]);
add_test_for_file (file); add_test_for_file (file);
g_object_unref (file); g_object_unref (file);
} }
} }
@@ -0,0 +1,3 @@
label {
color: var(
}
@@ -0,0 +1,5 @@
variables-invalid-01.css:2:10-4:1: error: GTK_CSS_PARSER_WARNING_SYNTAX
variables-invalid-01.css:2:10-14: error: GTK_CSS_PARSER_ERROR_SYNTAX
variables-invalid-01.css:2:10-4:1: error: GTK_CSS_PARSER_WARNING_SYNTAX
variables-invalid-01.css:2:3-4:1: error: GTK_CSS_PARSER_WARNING_SYNTAX
variables-invalid-01.css:1:7-4:1: error: GTK_CSS_PARSER_WARNING_SYNTAX
@@ -0,0 +1,3 @@
label {
color: var(color);
}

Some files were not shown because too many files have changed in this diff Show More