Compare commits

...

7 Commits

Author SHA1 Message Date
Matthias Clasen
d47392487f textview fixes 2021-08-06 16:41:16 -04:00
Matthias Clasen
1394f73ce2 label fixes 2021-08-06 16:41:04 -04:00
Matthias Clasen
4a5025eca1 css fixes 2021-08-06 16:40:54 -04:00
Matthias Clasen
be8cbb2adb textview: Use line-height from css
Pass the line height from the style on to the
text attributes.
2021-08-06 14:35:48 -04:00
Matthias Clasen
3c9edc1afa textview: Add line-spacing plumbing
This adds a line-spacing property to GtkTextAttributes
and GtkTextTag.
2021-08-06 14:35:43 -04:00
Matthias Clasen
630bbf8d9b label: Use line-height from css 2021-08-06 14:20:10 -04:00
Matthias Clasen
8eb82da896 css: Add line-height property
This adds the plumbing to parse the line-height
property from CSS. Widgets are not picking it
up yet.
2021-08-06 14:19:34 -04:00
16 changed files with 132 additions and 2 deletions

View File

@@ -204,6 +204,10 @@ gtk_css_animated_style_set_animated_value (GtkCssAnimatedStyle *animated,
unshare_font (animated);
gtk_css_take_value (&style->font->letter_spacing, value);
break;
case GTK_CSS_PROPERTY_LINE_HEIGHT:
unshare_font (animated);
gtk_css_take_value (&style->font->line_height, value);
break;
case GTK_CSS_PROPERTY_TEXT_DECORATION_LINE:
unshare_font_variant (animated);
gtk_css_take_value (&style->font_variant->text_decoration_line, value);

View File

@@ -107,11 +107,12 @@ static const int font_props[] = {
GTK_CSS_PROPERTY_FONT_WEIGHT,
GTK_CSS_PROPERTY_FONT_STRETCH,
GTK_CSS_PROPERTY_LETTER_SPACING,
GTK_CSS_PROPERTY_TEXT_SHADOW,
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,
@@ -417,6 +418,9 @@ gtk_css_static_style_set_value (GtkCssStaticStyle *sstyle,
case GTK_CSS_PROPERTY_LETTER_SPACING:
gtk_css_take_value (&style->font->letter_spacing, value);
break;
case GTK_CSS_PROPERTY_LINE_HEIGHT:
gtk_css_take_value (&style->font->line_height, value);
break;
case GTK_CSS_PROPERTY_TEXT_DECORATION_LINE:
gtk_css_take_value (&style->font_variant->text_decoration_line, value);
break;

View File

@@ -226,3 +226,13 @@ _gtk_css_ident_value_get (const GtkCssValue *value)
return value->string;
}
GtkCssValue *
gtk_css_line_height_value_get_default (void)
{
static GtkCssValue *normal_line_height;
if (normal_line_height == NULL)
normal_line_height = _gtk_css_ident_value_new_take ("normal");
return normal_line_height;
}

View File

@@ -40,6 +40,7 @@ GtkCssValue * _gtk_css_string_value_parse (GtkCssParser *par
const char * _gtk_css_string_value_get (const GtkCssValue *string);
GtkCssValue * gtk_css_line_height_value_get_default (void);
G_END_DECLS

View File

@@ -117,6 +117,8 @@ gtk_css_style_get_value (GtkCssStyle *style,
return style->font->font_stretch;
case GTK_CSS_PROPERTY_LETTER_SPACING:
return style->font->letter_spacing;
case GTK_CSS_PROPERTY_LINE_HEIGHT:
return style->font->line_height;
case GTK_CSS_PROPERTY_TEXT_DECORATION_LINE:
return style->font_variant->text_decoration_line;
case GTK_CSS_PROPERTY_TEXT_DECORATION_COLOR:

0
gtk/gtkcssstyle.h Normal file
View File

View File

@@ -151,6 +151,7 @@ struct _GtkCssFontValues {
GtkCssValue *secondary_caret_color; // NULL if currentColor
GtkCssValue *font_feature_settings;
GtkCssValue *font_variation_settings;
GtkCssValue *line_height;
};
struct _GtkCssFontVariantValues {

View File

@@ -812,6 +812,25 @@ transform_origin_parse (GtkCssStyleProperty *property,
return _gtk_css_position_value_parse (parser);
}
static GtkCssValue *
parse_line_height (GtkCssStyleProperty *property,
GtkCssParser *parser)
{
GtkCssValue *value = NULL;
if (gtk_css_parser_try_ident (parser, "normal"))
value = _gtk_css_ident_value_new ("normal");
else
value = _gtk_css_number_value_parse (parser, GTK_CSS_PARSE_NUMBER |
GTK_CSS_PARSE_PERCENT |
GTK_CSS_POSITIVE_ONLY);
if (value == NULL)
gtk_css_parser_error_syntax (parser, "Not a valid line-height value");
return value;
}
/*** REGISTRATION ***/
G_STATIC_ASSERT (GTK_CSS_PROPERTY_COLOR == 0);
@@ -1401,4 +1420,10 @@ _gtk_css_style_property_init_properties (void)
GTK_CSS_AFFECTS_TEXT_ATTRS | GTK_CSS_AFFECTS_TEXT_SIZE,
parse_font_variation_settings,
gtk_css_font_variations_value_new_default ());
gtk_css_style_property_register ("line-height",
GTK_CSS_PROPERTY_LINE_HEIGHT,
GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
GTK_CSS_AFFECTS_TEXT_SIZE,
parse_line_height,
_gtk_css_value_ref (gtk_css_line_height_value_get_default ()));
}

View File

@@ -275,6 +275,7 @@ enum { /*< skip >*/
GTK_CSS_PROPERTY_SECONDARY_CARET_COLOR,
GTK_CSS_PROPERTY_FONT_FEATURE_SETTINGS,
GTK_CSS_PROPERTY_FONT_VARIATION_SETTINGS,
GTK_CSS_PROPERTY_LINE_HEIGHT,
/* add more */
GTK_CSS_PROPERTY_N_PROPERTIES
};

View File

@@ -53,6 +53,8 @@
#include "gtkdragicon.h"
#include "gtkcsscolorvalueprivate.h"
#include "gtkjoinedmenuprivate.h"
#include "gtkcssstylepropertyprivate.h"
#include "gtkcssnumbervalueprivate.h"
#include <math.h>
#include <string.h>
@@ -841,6 +843,26 @@ gtk_label_update_layout_attributes (GtkLabel *self,
pango_attr_list_unref (attrs);
}
static void
gtk_label_update_layout (GtkLabel *self)
{
GtkCssStyle *style;
GtkCssStyleProperty *prop;
float line_spacing;
if (self->layout == NULL)
return;
style = gtk_css_node_get_style (gtk_widget_get_css_node (GTK_WIDGET (self)));
if (_gtk_css_value_equal (style->font->line_height, gtk_css_line_height_value_get_default ()))
line_spacing = 0.0;
else
line_spacing = _gtk_css_number_value_get (style->font->line_height, 1.0);
pango_layout_set_line_spacing (self->layout, line_spacing);
}
static void
gtk_label_css_changed (GtkWidget *widget,
GtkCssStyleChange *change)
@@ -851,6 +873,11 @@ gtk_label_css_changed (GtkWidget *widget,
GTK_WIDGET_CLASS (gtk_label_parent_class)->css_changed (widget, change);
if (gtk_css_style_change_affects (change, GTK_CSS_AFFECTS_TEXT_SIZE))
{
gtk_label_update_layout (self);
}
if (gtk_css_style_change_affects (change, GTK_CSS_AFFECTS_TEXT_ATTRS))
{
new_attrs = gtk_css_style_get_pango_attributes (gtk_css_style_change_get_new_style (change));
@@ -860,7 +887,7 @@ gtk_label_css_changed (GtkWidget *widget,
else
attrs_affected = FALSE;
if (change == NULL || attrs_affected || (self->select_info && self->select_info->links))
if (change == NULL || attrs_affected || (self->select_info && self->select_info->links))
{
gtk_label_update_layout_attributes (self, new_attrs);
@@ -3982,6 +4009,7 @@ gtk_label_ensure_layout (GtkLabel *self)
self->layout = gtk_widget_create_pango_layout (GTK_WIDGET (self), self->text);
gtk_label_update_layout_attributes (self, NULL);
gtk_label_update_layout (self);
switch (self->jtype)
{

View File

@@ -387,6 +387,9 @@ _gtk_text_attributes_fill_from_tags (GtkTextAttributes *dest,
if (tag->priv->pixels_inside_wrap_set)
dest->pixels_inside_wrap = vals->pixels_inside_wrap;
if (tag->priv->line_spacing_set)
dest->line_spacing = vals->line_spacing;
if (tag->priv->tabs_set)
{
if (dest->tabs)
@@ -457,6 +460,7 @@ _gtk_text_tag_affects_size (GtkTextTag *tag)
priv->pixels_above_lines_set ||
priv->pixels_below_lines_set ||
priv->pixels_inside_wrap_set ||
priv->line_spacing_set ||
priv->tabs_set ||
priv->underline_set ||
priv->overline_set ||

View File

@@ -147,6 +147,8 @@ struct _GtkTextAttributes
int pixels_below_lines;
int pixels_inside_wrap;
float line_spacing;
int letter_spacing;
guint invisible : 1;

View File

@@ -1277,6 +1277,8 @@ set_para_values (GtkTextLayout *layout,
pango_layout_set_spacing (display->layout,
style->pixels_inside_wrap * PANGO_SCALE);
pango_layout_set_line_spacing (display->layout, style->line_spacing);
if (style->tabs)
pango_layout_set_tabs (display->layout, style->tabs);

View File

@@ -107,6 +107,7 @@ enum {
PROP_PIXELS_ABOVE_LINES,
PROP_PIXELS_BELOW_LINES,
PROP_PIXELS_INSIDE_WRAP,
PROP_LINE_SPACING,
PROP_EDITABLE,
PROP_WRAP_MODE,
PROP_JUSTIFICATION,
@@ -150,6 +151,7 @@ enum {
PROP_PIXELS_ABOVE_LINES_SET,
PROP_PIXELS_BELOW_LINES_SET,
PROP_PIXELS_INSIDE_WRAP_SET,
PROP_LINE_SPACING_SET,
PROP_EDITABLE_SET,
PROP_WRAP_MODE_SET,
PROP_JUSTIFICATION_SET,
@@ -585,6 +587,8 @@ gtk_text_tag_class_init (GtkTextTagClass *klass)
* GtkTextTag:pixels-inside-wrap:
*
* Pixels of blank space between wrapped lines in a paragraph.
*
* Ignored if line-spacing is set.
*/
g_object_class_install_property (object_class,
PROP_PIXELS_INSIDE_WRAP,
@@ -596,6 +600,21 @@ gtk_text_tag_class_init (GtkTextTagClass *klass)
0,
GTK_PARAM_READWRITE));
/**
* GtkTexTag:line-spacing:
*
* The line spacing factor that is applied between consecutive lines.
*
* Since: 4.4
*/
g_object_class_install_property (object_class,
PROP_LINE_SPACING,
g_param_spec_float ("line-spacing",
P_("Line spacing"),
P_("The factor for spacing between lines"),
0.0, 10.0, 0.0,
GTK_PARAM_READWRITE));
/**
* GtkTextTag:strikethrough:
*
@@ -936,6 +955,10 @@ gtk_text_tag_class_init (GtkTextTagClass *klass)
P_("Pixels inside wrap set"),
P_("Whether this tag affects the number of pixels between wrapped lines"));
ADD_SET_PROP ("line-spacing-set", PROP_LINE_SPACING_SET,
P_("Linespacing set"),
P_("Whether this tag affects spacing between wrapped lines"));
ADD_SET_PROP ("strikethrough-set", PROP_STRIKETHROUGH_SET,
P_("Strikethrough set"),
P_("Whether this tag affects strikethrough"));
@@ -1573,6 +1596,13 @@ gtk_text_tag_set_property (GObject *object,
size_changed = TRUE;
break;
case PROP_LINE_SPACING:
priv->line_spacing_set = TRUE;
priv->values->line_spacing = g_value_get_float (value);
g_object_notify (object, "line-spacing-set");
size_changed = TRUE;
break;
case PROP_EDITABLE:
priv->editable_set = TRUE;
priv->values->editable = g_value_get_boolean (value);
@@ -2022,6 +2052,10 @@ gtk_text_tag_get_property (GObject *object,
g_value_set_int (value, priv->values->pixels_inside_wrap);
break;
case PROP_LINE_SPACING:
g_value_set_float (value, priv->values->line_spacing);
break;
case PROP_EDITABLE:
g_value_set_boolean (value, priv->values->editable);
break;
@@ -2169,6 +2203,10 @@ gtk_text_tag_get_property (GObject *object,
g_value_set_boolean (value, priv->pixels_inside_wrap_set);
break;
case PROP_LINE_SPACING_SET:
g_value_set_boolean (value, priv->line_spacing_set);
break;
case PROP_EDITABLE_SET:
g_value_set_boolean (value, priv->editable_set);
break;

View File

@@ -71,6 +71,7 @@ struct _GtkTextTagPrivate
guint pixels_above_lines_set : 1;
guint pixels_below_lines_set : 1;
guint pixels_inside_wrap_set : 1;
guint line_spacing_set : 1;
guint tabs_set : 1;
guint underline_set : 1;
guint overline_set : 1;

View File

@@ -57,6 +57,8 @@
#include "gtknative.h"
#include "gtkwidgetprivate.h"
#include "gtkjoinedmenuprivate.h"
#include "gtkcssstylepropertyprivate.h"
#include "gtkcssstringvalueprivate.h"
/**
* GtkTextView:
@@ -7659,6 +7661,11 @@ gtk_text_view_set_attributes_from_style (GtkTextView *text_view,
pango_font_description_free (values->font);
values->font = gtk_css_style_get_pango_font (style);
if (_gtk_css_value_equal (style->font->line_height, gtk_css_line_height_value_get_default ()))
values->line_spacing = 0.0;
else
values->line_spacing = _gtk_css_number_value_get (style->font->line_height, 1.0);
}
static void