mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-12-27 14:10:30 +00:00
Merge branch 'matthiasc/for-main' into 'main'
inspector: Fix some criticals See merge request GNOME/gtk!5104
This commit is contained in:
commit
6a6ef0f437
@ -31,7 +31,6 @@
|
||||
|
||||
#include "gtkbinlayout.h"
|
||||
#include "gtkbox.h"
|
||||
#include "gtkcssprovider.h"
|
||||
#include "gtkfontchooser.h"
|
||||
#include "gtkfontchooserdialog.h"
|
||||
#include "gtkfontchooserutils.h"
|
||||
@ -40,7 +39,6 @@
|
||||
#include "gtkmarshalers.h"
|
||||
#include "gtkprivate.h"
|
||||
#include "gtkseparator.h"
|
||||
#include "gtkstylecontext.h"
|
||||
#include "gtkwidgetprivate.h"
|
||||
|
||||
#include <string.h>
|
||||
@ -102,7 +100,6 @@ struct _GtkFontButton
|
||||
GtkFontFilterFunc font_filter;
|
||||
gpointer font_filter_data;
|
||||
GDestroyNotify font_filter_data_destroy;
|
||||
GtkCssProvider *provider;
|
||||
};
|
||||
|
||||
struct _GtkFontButtonClass
|
||||
@ -640,8 +637,6 @@ gtk_font_button_finalize (GObject *object)
|
||||
|
||||
g_free (font_button->preview_text);
|
||||
|
||||
g_clear_object (&font_button->provider);
|
||||
|
||||
gtk_widget_unparent (font_button->button);
|
||||
|
||||
G_OBJECT_CLASS (gtk_font_button_parent_class)->finalize (object);
|
||||
@ -1086,226 +1081,36 @@ dialog_destroy (GtkWidget *widget,
|
||||
font_button->font_dialog = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
add_css_variations (GString *s,
|
||||
const char *variations)
|
||||
{
|
||||
const char *p;
|
||||
const char *sep = "";
|
||||
|
||||
if (variations == NULL || variations[0] == '\0')
|
||||
{
|
||||
g_string_append (s, "normal");
|
||||
return;
|
||||
}
|
||||
|
||||
p = variations;
|
||||
while (p && *p)
|
||||
{
|
||||
const char *start;
|
||||
const char *end, *end2;
|
||||
double value;
|
||||
char name[5];
|
||||
|
||||
while (g_ascii_isspace (*p)) p++;
|
||||
|
||||
start = p;
|
||||
end = strchr (p, ',');
|
||||
if (end && (end - p < 6))
|
||||
goto skip;
|
||||
|
||||
name[0] = p[0];
|
||||
name[1] = p[1];
|
||||
name[2] = p[2];
|
||||
name[3] = p[3];
|
||||
name[4] = '\0';
|
||||
|
||||
p += 4;
|
||||
while (g_ascii_isspace (*p)) p++;
|
||||
if (*p == '=') p++;
|
||||
|
||||
if (p - start < 5)
|
||||
goto skip;
|
||||
|
||||
value = g_ascii_strtod (p, (char **) &end2);
|
||||
|
||||
while (end2 && g_ascii_isspace (*end2)) end2++;
|
||||
|
||||
if (end2 && (*end2 != ',' && *end2 != '\0'))
|
||||
goto skip;
|
||||
|
||||
g_string_append_printf (s, "%s\"%s\" %g", sep, name, value);
|
||||
sep = ", ";
|
||||
|
||||
skip:
|
||||
p = end ? end + 1 : NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static char *
|
||||
pango_font_description_to_css (PangoFontDescription *desc,
|
||||
const char *features,
|
||||
const char *language)
|
||||
{
|
||||
GString *s;
|
||||
PangoFontMask set;
|
||||
|
||||
s = g_string_new ("* { ");
|
||||
|
||||
set = pango_font_description_get_set_fields (desc);
|
||||
if (set & PANGO_FONT_MASK_FAMILY)
|
||||
{
|
||||
g_string_append (s, "font-family: \"");
|
||||
g_string_append (s, pango_font_description_get_family (desc));
|
||||
g_string_append (s, "\"; ");
|
||||
}
|
||||
if (set & PANGO_FONT_MASK_STYLE)
|
||||
{
|
||||
switch (pango_font_description_get_style (desc))
|
||||
{
|
||||
case PANGO_STYLE_NORMAL:
|
||||
g_string_append (s, "font-style: normal; ");
|
||||
break;
|
||||
case PANGO_STYLE_OBLIQUE:
|
||||
g_string_append (s, "font-style: oblique; ");
|
||||
break;
|
||||
case PANGO_STYLE_ITALIC:
|
||||
g_string_append (s, "font-style: italic; ");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (set & PANGO_FONT_MASK_VARIANT)
|
||||
{
|
||||
switch (pango_font_description_get_variant (desc))
|
||||
{
|
||||
case PANGO_VARIANT_NORMAL:
|
||||
g_string_append (s, "font-variant: normal; ");
|
||||
break;
|
||||
case PANGO_VARIANT_SMALL_CAPS:
|
||||
g_string_append (s, "font-variant: small-caps; ");
|
||||
break;
|
||||
case PANGO_VARIANT_ALL_SMALL_CAPS:
|
||||
g_string_append (s, "font-variant: all-small-caps; ");
|
||||
break;
|
||||
case PANGO_VARIANT_PETITE_CAPS:
|
||||
g_string_append (s, "font-variant: petite-caps; ");
|
||||
break;
|
||||
case PANGO_VARIANT_ALL_PETITE_CAPS:
|
||||
g_string_append (s, "font-variant: all-petite-caps; ");
|
||||
break;
|
||||
case PANGO_VARIANT_UNICASE:
|
||||
g_string_append (s, "font-variant: unicase; ");
|
||||
break;
|
||||
case PANGO_VARIANT_TITLE_CAPS:
|
||||
g_string_append (s, "font-variant: titling-caps; ");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (set & PANGO_FONT_MASK_WEIGHT)
|
||||
g_string_append_printf (s, "font-weight: %d; ", pango_font_description_get_weight (desc));
|
||||
|
||||
if (set & PANGO_FONT_MASK_STRETCH)
|
||||
{
|
||||
switch (pango_font_description_get_stretch (desc))
|
||||
{
|
||||
case PANGO_STRETCH_ULTRA_CONDENSED:
|
||||
g_string_append (s, "font-stretch: ultra-condensed; ");
|
||||
break;
|
||||
case PANGO_STRETCH_EXTRA_CONDENSED:
|
||||
g_string_append (s, "font-stretch: extra-condensed; ");
|
||||
break;
|
||||
case PANGO_STRETCH_CONDENSED:
|
||||
g_string_append (s, "font-stretch: condensed; ");
|
||||
break;
|
||||
case PANGO_STRETCH_SEMI_CONDENSED:
|
||||
g_string_append (s, "font-stretch: semi-condensed; ");
|
||||
break;
|
||||
case PANGO_STRETCH_NORMAL:
|
||||
g_string_append (s, "font-stretch: normal; ");
|
||||
break;
|
||||
case PANGO_STRETCH_SEMI_EXPANDED:
|
||||
g_string_append (s, "font-stretch: semi-expanded; ");
|
||||
break;
|
||||
case PANGO_STRETCH_EXPANDED:
|
||||
g_string_append (s, "font-stretch: expanded; ");
|
||||
break;
|
||||
case PANGO_STRETCH_EXTRA_EXPANDED:
|
||||
g_string_append (s, "font-stretch: extra-expanded; ");
|
||||
break;
|
||||
case PANGO_STRETCH_ULTRA_EXPANDED:
|
||||
g_string_append (s, "font-stretch: ultra-expanded; ");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (set & PANGO_FONT_MASK_SIZE)
|
||||
{
|
||||
g_string_append_printf (s, "font-size: %dpt; ", pango_font_description_get_size (desc) / PANGO_SCALE);
|
||||
}
|
||||
|
||||
if (set & PANGO_FONT_MASK_VARIATIONS)
|
||||
{
|
||||
const char *variations;
|
||||
|
||||
g_string_append (s, "font-variation-settings: ");
|
||||
variations = pango_font_description_get_variations (desc);
|
||||
add_css_variations (s, variations);
|
||||
g_string_append (s, "; ");
|
||||
}
|
||||
if (features)
|
||||
{
|
||||
g_string_append_printf (s, "font-feature-settings: %s;", features);
|
||||
}
|
||||
|
||||
g_string_append (s, "}");
|
||||
|
||||
return g_string_free (s, FALSE);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_font_button_label_use_font (GtkFontButton *font_button)
|
||||
{
|
||||
GtkStyleContext *context;
|
||||
|
||||
context = gtk_widget_get_style_context (font_button->font_label);
|
||||
|
||||
if (!font_button->use_font)
|
||||
{
|
||||
if (font_button->provider)
|
||||
{
|
||||
gtk_style_context_remove_provider (context, GTK_STYLE_PROVIDER (font_button->provider));
|
||||
g_clear_object (&font_button->provider);
|
||||
}
|
||||
}
|
||||
gtk_label_set_attributes (GTK_LABEL (font_button->font_label), NULL);
|
||||
else
|
||||
{
|
||||
PangoFontDescription *desc;
|
||||
char *data;
|
||||
|
||||
if (!font_button->provider)
|
||||
{
|
||||
font_button->provider = gtk_css_provider_new ();
|
||||
gtk_style_context_add_provider (context,
|
||||
GTK_STYLE_PROVIDER (font_button->provider),
|
||||
GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
|
||||
}
|
||||
PangoAttrList *attrs;
|
||||
|
||||
desc = pango_font_description_copy (font_button->font_desc);
|
||||
|
||||
if (!font_button->use_size)
|
||||
pango_font_description_unset_fields (desc, PANGO_FONT_MASK_SIZE);
|
||||
|
||||
data = pango_font_description_to_css (desc,
|
||||
font_button->font_features,
|
||||
pango_language_to_string (font_button->language));
|
||||
gtk_css_provider_load_from_data (font_button->provider, data, -1);
|
||||
attrs = pango_attr_list_new ();
|
||||
|
||||
g_free (data);
|
||||
/* Prevent font fallback */
|
||||
pango_attr_list_insert (attrs, pango_attr_fallback_new (FALSE));
|
||||
|
||||
/* Force current font and features */
|
||||
pango_attr_list_insert (attrs, pango_attr_font_desc_new (desc));
|
||||
if (font_button->font_features)
|
||||
pango_attr_list_insert (attrs, pango_attr_font_features_new (font_button->font_features));
|
||||
if (font_button->language)
|
||||
pango_attr_list_insert (attrs, pango_attr_language_new (font_button->language));
|
||||
|
||||
gtk_label_set_attributes (GTK_LABEL (font_button->font_label), attrs);
|
||||
|
||||
pango_attr_list_unref (attrs);
|
||||
pango_font_description_free (desc);
|
||||
}
|
||||
}
|
||||
|
@ -188,19 +188,25 @@ G_DEFINE_TYPE_WITH_PRIVATE (GtkInspectorCssNodeTree, gtk_inspector_css_node_tree
|
||||
static void
|
||||
gtk_inspector_css_node_tree_set_node (GtkInspectorCssNodeTree *cnt,
|
||||
GtkCssNode *node);
|
||||
static void
|
||||
gtk_inspector_css_node_tree_unset_node (GtkInspectorCssNodeTree *cnt);
|
||||
|
||||
static void
|
||||
selection_changed (GtkSelectionModel *model,
|
||||
GParamSpec *pspec,
|
||||
GtkInspectorCssNodeTree *cnt)
|
||||
{
|
||||
GtkTreeListRow *row;
|
||||
GtkCssNode *node;
|
||||
if (gtk_single_selection_get_selected (cnt->priv->selection_model) != GTK_INVALID_LIST_POSITION)
|
||||
{
|
||||
GtkTreeListRow *row;
|
||||
GtkCssNode *node;
|
||||
|
||||
row = gtk_single_selection_get_selected_item (cnt->priv->selection_model);
|
||||
node = gtk_tree_list_row_get_item (row);
|
||||
|
||||
gtk_inspector_css_node_tree_set_node (cnt, node);
|
||||
row = gtk_single_selection_get_selected_item (cnt->priv->selection_model);
|
||||
node = gtk_tree_list_row_get_item (row);
|
||||
gtk_inspector_css_node_tree_set_node (cnt, node);
|
||||
}
|
||||
else
|
||||
gtk_inspector_css_node_tree_unset_node (cnt);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -261,8 +267,6 @@ gtk_inspector_css_node_tree_finalize (GObject *object)
|
||||
|
||||
gtk_inspector_css_node_tree_unset_node (cnt);
|
||||
|
||||
g_object_unref (cnt->priv->prop_model);
|
||||
|
||||
G_OBJECT_CLASS (gtk_inspector_css_node_tree_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user