Merge branch 'wip/baedert/for-master' into 'master'

Wip/baedert/for master

Closes #3593

See merge request GNOME/gtk!3086
This commit is contained in:
Matthias Clasen 2021-01-17 14:20:13 +00:00
commit 00883016af
8 changed files with 138 additions and 131 deletions

View File

@ -1554,7 +1554,7 @@ rounded_inner_rect_contains_rect (const GskRoundedRect *rounded,
MAX (rounded->corner[GSK_CORNER_BOTTOM_LEFT].height,
rounded->corner[GSK_CORNER_BOTTOM_RIGHT].height);
return graphene_rect_contains_rect (&inner, rect);
return _graphene_rect_contains_rect (&inner, rect);
}
/* Current clip is NOT rounded but new one is definitely! */
@ -1644,8 +1644,8 @@ render_clipped_child (GskGLRenderer *self,
/* well fuck */
const float scale_x = builder->scale_x;
const float scale_y = builder->scale_y;
const GskRoundedRect scaled_clip = GSK_ROUNDED_RECT_INIT (clip->origin.x * scale_x,
clip->origin.y * scale_y,
const GskRoundedRect scaled_clip = GSK_ROUNDED_RECT_INIT ((builder->dx + clip->origin.x) * scale_x,
(builder->dy + clip->origin.y) * scale_y,
clip->size.width * scale_x,
clip->size.height * scale_y);
gboolean is_offscreen;
@ -1746,7 +1746,6 @@ render_rounded_clip_node (GskGLRenderer *self,
}
else
{
GskRoundedRect scaled_clip;
gboolean is_offscreen;
TextureRegion region;
/* NOTE: We are *not* transforming the clip by the current modelview here.
@ -1755,19 +1754,7 @@ render_rounded_clip_node (GskGLRenderer *self,
*
* We do, however, apply the scale factor to the child clip of course.
*/
scaled_clip.bounds.origin.x = clip->bounds.origin.x * scale_x;
scaled_clip.bounds.origin.y = clip->bounds.origin.y * scale_y;
scaled_clip.bounds.size.width = clip->bounds.size.width * scale_x;
scaled_clip.bounds.size.height = clip->bounds.size.height * scale_y;
/* Increase corner radius size by scale factor */
for (i = 0; i < 4; i ++)
{
scaled_clip.corner[i].width = clip->corner[i].width * scale_x;
scaled_clip.corner[i].height = clip->corner[i].height * scale_y;
}
ops_push_clip (builder, &scaled_clip);
ops_push_clip (builder, &transformed_clip);
if (!add_offscreen_ops (self, builder, &node->bounds,
child,
&region, &is_offscreen,
@ -1779,7 +1766,8 @@ render_rounded_clip_node (GskGLRenderer *self,
ops_set_program (builder, &self->programs->blit_program);
ops_set_texture (builder, region.texture_id);
load_offscreen_vertex_data (ops_draw (builder, NULL), node, builder);
load_vertex_data_with_region (ops_draw (builder, NULL), &node->bounds, builder,
&region, is_offscreen);
}
}
@ -3830,9 +3818,9 @@ add_offscreen_ops (GskGLRenderer *self,
gboolean *is_offscreen,
guint flags)
{
float width, height;
const float dx = builder->dx;
const float dy = builder->dy;
float width, height;
float scale_x;
float scale_y;
int render_target;
@ -3931,8 +3919,8 @@ add_offscreen_ops (GskGLRenderer *self,
render_target);
}
viewport = GRAPHENE_RECT_INIT (bounds->origin.x * scale_x,
bounds->origin.y * scale_y,
viewport = GRAPHENE_RECT_INIT ((bounds->origin.x + dx) * scale_x,
(bounds->origin.y + dy) * scale_y,
width, height);
init_projection_matrix (&item_proj, &viewport);
@ -3945,8 +3933,8 @@ add_offscreen_ops (GskGLRenderer *self,
if (flags & RESET_CLIP)
ops_push_clip (builder, &GSK_ROUNDED_RECT_INIT_FROM_RECT (viewport));
builder->dx = 0;
builder->dy = 0;
builder->dx = dx;
builder->dy = dy;
prev_opacity = ops_set_opacity (builder, 1.0);

View File

@ -496,12 +496,12 @@ gtk_accessible_update_relation_value (GtkAccessible *self,
GtkAccessibleRelation relations[],
const GValue values[])
{
GtkATContext *context;
g_return_if_fail (GTK_IS_ACCESSIBLE (self));
g_return_if_fail (n_relations > 0);
GtkATContext *context = gtk_accessible_get_at_context (self);
if (context == NULL)
return;
context = gtk_accessible_get_at_context (self);
for (int i = 0; i < n_relations; i++)
{
@ -520,13 +520,15 @@ gtk_accessible_update_relation_value (GtkAccessible *self,
break;
}
gtk_at_context_set_accessible_relation (context, relation, real_value);
if (context)
gtk_at_context_set_accessible_relation (context, relation, real_value);
if (real_value != NULL)
gtk_accessible_value_unref (real_value);
}
gtk_at_context_update (context);
if (context)
gtk_at_context_update (context);
}
/**

View File

@ -260,7 +260,7 @@ typedef struct
char *domain;
GHashTable *objects;
GSList *delayed_properties;
GSList *signals;
GPtrArray *signals;
GSList *bindings;
char *filename;
char *resource_prefix;
@ -375,8 +375,8 @@ gtk_builder_finalize (GObject *object)
#endif
g_hash_table_destroy (priv->objects);
g_slist_free_full (priv->signals, (GDestroyNotify)_free_signal_info);
if (priv->signals)
g_ptr_array_free (priv->signals, TRUE);
G_OBJECT_CLASS (gtk_builder_parent_class)->finalize (object);
}
@ -527,19 +527,21 @@ static void
gtk_builder_get_parameters (GtkBuilder *builder,
GType object_type,
const char *object_name,
GSList *properties,
GPtrArray *properties,
GParamFlags filter_flags,
ObjectProperties *parameters,
ObjectProperties *filtered_parameters)
{
GtkBuilderPrivate *priv = gtk_builder_get_instance_private (builder);
GSList *l;
DelayedProperty *property;
GError *error = NULL;
for (l = properties; l; l = l->next)
if (!properties)
return;
for (guint i = 0; i < properties->len; i++)
{
PropertyInfo *prop = (PropertyInfo*)l->data;
PropertyInfo *prop = g_ptr_array_index (properties, i);
const char *property_name = g_intern_string (prop->pspec->name);
GValue property_value = G_VALUE_INIT;
@ -1018,12 +1020,14 @@ _gtk_builder_add (GtkBuilder *builder,
void
_gtk_builder_add_signals (GtkBuilder *builder,
GSList *signals)
GPtrArray *signals)
{
GtkBuilderPrivate *priv = gtk_builder_get_instance_private (builder);
priv->signals = g_slist_concat (priv->signals,
g_slist_copy (signals));
if (G_UNLIKELY (!priv->signals))
priv->signals = g_ptr_array_new_with_free_func ((GDestroyNotify)_free_signal_info);
g_ptr_array_extend_and_steal (priv->signals, signals);
}
static gboolean
@ -1851,18 +1855,17 @@ gtk_builder_connect_signals (GtkBuilder *builder,
GError **error)
{
GtkBuilderPrivate *priv = gtk_builder_get_instance_private (builder);
GSList *l;
GObject *object;
GObject *connect_object;
gboolean result = FALSE;
gboolean result = TRUE;
if (!priv->signals)
if (!priv->signals ||
priv->signals->len == 0)
return TRUE;
priv->signals = g_slist_reverse (priv->signals);
for (l = priv->signals; l; l = l->next)
for (guint i = 0; i < priv->signals->len; i++)
{
SignalInfo *signal = (SignalInfo*)l->data;
SignalInfo *signal = g_ptr_array_index (priv->signals, i);
GClosure *closure;
g_assert (signal != NULL);
@ -1895,7 +1898,10 @@ gtk_builder_connect_signals (GtkBuilder *builder,
error);
if (closure == NULL)
break;
{
result = false;
break;
}
g_signal_connect_closure_by_id (object,
signal->id,
@ -1903,10 +1909,8 @@ gtk_builder_connect_signals (GtkBuilder *builder,
closure,
signal->flags & G_CONNECT_AFTER ? TRUE : FALSE);
}
if (l == NULL)
result = TRUE;
g_slist_free_full (priv->signals, (GDestroyNotify)_free_signal_info);
g_ptr_array_free (priv->signals, TRUE);
priv->signals = NULL;
return result;

View File

@ -32,7 +32,8 @@
#include <string.h>
typedef struct {
typedef struct
{
const GtkBuildableParser *last_parser;
gpointer last_user_data;
int last_depth;
@ -41,9 +42,8 @@ typedef struct {
static void
pop_subparser_stack (GtkBuildableParseContext *context)
{
GtkBuildableParserStack *stack =
&g_array_index (context->subparser_stack, GtkBuildableParserStack,
context->subparser_stack->len - 1);
GtkBuildableParserStack *stack = &g_array_index (context->subparser_stack, GtkBuildableParserStack,
context->subparser_stack->len - 1);
context->awaiting_pop = TRUE;
context->held_user_data = context->user_data;
@ -57,15 +57,17 @@ pop_subparser_stack (GtkBuildableParseContext *context)
static void
possibly_finish_subparser (GtkBuildableParseContext *context)
{
if (context->subparser_stack->len > 0)
{
GtkBuildableParserStack *stack =
&g_array_index (context->subparser_stack, GtkBuildableParserStack,
context->subparser_stack->len - 1);
GtkBuildableParserStack *stack;
if (stack->last_depth == context->tag_stack->len)
pop_subparser_stack (context);
}
if (!context->subparser_stack ||
context->subparser_stack->len == 0)
return;
stack = &g_array_index (context->subparser_stack, GtkBuildableParserStack,
context->subparser_stack->len - 1);
if (stack->last_depth == context->tag_stack->len)
pop_subparser_stack (context);
}
static void
@ -128,6 +130,9 @@ proxy_error (GMarkupParseContext *gm_context,
/* report the error all the way up to free all the user-data */
if (!context->subparser_stack)
return;
while (context->subparser_stack->len > 0)
{
pop_subparser_stack (context);
@ -157,7 +162,7 @@ gtk_buildable_parse_context_init (GtkBuildableParseContext *context,
context->parser = parser;
context->user_data = user_data;
context->subparser_stack = g_array_new (FALSE, FALSE, sizeof (GtkBuildableParserStack));
context->subparser_stack = NULL;
context->tag_stack = g_ptr_array_new ();
context->held_user_data = NULL;
context->awaiting_pop = FALSE;
@ -166,7 +171,9 @@ gtk_buildable_parse_context_init (GtkBuildableParseContext *context,
static void
gtk_buildable_parse_context_free (GtkBuildableParseContext *context)
{
g_array_unref (context->subparser_stack);
if (context->subparser_stack)
g_array_unref (context->subparser_stack);
g_ptr_array_unref (context->tag_stack);
}
@ -245,6 +252,9 @@ gtk_buildable_parse_context_push (GtkBuildableParseContext *context,
context->parser = parser;
context->user_data = user_data;
if (!context->subparser_stack)
context->subparser_stack = g_array_new (FALSE, FALSE, sizeof (GtkBuildableParserStack));
g_array_append_val (context->subparser_stack, stack);
}
@ -461,8 +471,6 @@ builder_construct (ParserData *data,
if (object_info->object && object_info->applied_properties)
return object_info->object;
object_info->properties = g_slist_reverse (object_info->properties);
if (object_info->object == NULL)
{
object = _gtk_builder_construct (data->builder, object_info, error);
@ -789,19 +797,21 @@ free_object_info (ObjectInfo *info)
{
/* Do not free the signal items, which GtkBuilder takes ownership of */
g_type_class_unref (info->oclass);
g_slist_free (info->signals);
g_slist_free_full (info->properties, (GDestroyNotify)free_property_info);
if (info->signals)
g_ptr_array_free (info->signals, TRUE);
if (info->properties)
g_ptr_array_free (info->properties, TRUE);
g_free (info->constructor);
g_free (info->id);
g_slice_free (ObjectInfo, info);
}
static void
parse_child (ParserData *data,
const char *element_name,
parse_child (ParserData *data,
const char *element_name,
const char **names,
const char **values,
GError **error)
GError **error)
{
ObjectInfo* object_info;
@ -1697,7 +1707,6 @@ parse_custom (GtkBuildableParseContext *context,
ObjectInfo* object_info = (ObjectInfo*)parent_info;
if (!object_info->object)
{
object_info->properties = g_slist_reverse (object_info->properties);
object_info->object = _gtk_builder_construct (data->builder,
object_info,
error);
@ -1875,7 +1884,10 @@ end_element (GtkBuildableParseContext *context,
g_string_assign (prop_info->text, translated);
}
object_info->properties = g_slist_prepend (object_info->properties, prop_info);
if (G_UNLIKELY (!object_info->properties))
object_info->properties = g_ptr_array_new_with_free_func ((GDestroyNotify)free_property_info);
g_ptr_array_add (object_info->properties, prop_info);
}
else
g_assert_not_reached ();
@ -1943,8 +1955,13 @@ end_element (GtkBuildableParseContext *context,
if (GTK_IS_BUILDABLE (object_info->object) &&
GTK_BUILDABLE_GET_IFACE (object_info->object)->parser_finished)
data->finalizers = g_slist_prepend (data->finalizers, object_info->object);
_gtk_builder_add_signals (data->builder, object_info->signals);
g_ptr_array_add (data->finalizers, object_info->object);
if (object_info->signals)
{
_gtk_builder_add_signals (data->builder, object_info->signals);
object_info->signals = NULL;
}
free_object_info (object_info);
}
@ -1962,7 +1979,11 @@ end_element (GtkBuildableParseContext *context,
ObjectInfo *object_info = (ObjectInfo*)state_peek_info (data, CommonInfo);
g_assert (object_info != NULL);
signal_info->object_name = g_strdup (object_info->id);
object_info->signals = g_slist_prepend (object_info->signals, signal_info);
if (G_UNLIKELY (!object_info->signals))
object_info->signals = g_ptr_array_new ();
g_ptr_array_add (object_info->signals, signal_info);
}
else if (strcmp (element_name, "constant") == 0 ||
strcmp (element_name, "closure") == 0 ||
@ -2154,6 +2175,7 @@ _gtk_builder_parser_parse_buffer (GtkBuilder *builder,
data.object_ids = g_hash_table_new_full (g_str_hash, g_str_equal,
(GDestroyNotify)g_free, NULL);
data.stack = g_ptr_array_new ();
data.finalizers = g_ptr_array_new ();
if (requested_objs)
{
@ -2193,10 +2215,9 @@ _gtk_builder_parser_parse_buffer (GtkBuilder *builder,
}
/* Common parser_finished, for all created objects */
data.finalizers = g_slist_reverse (data.finalizers);
for (l = data.finalizers; l; l = l->next)
for (guint i = 0; i < data.finalizers->len; i++)
{
GtkBuildable *buildable = (GtkBuildable*)l->data;
GtkBuildable *buildable = g_ptr_array_index (data.finalizers, i);
gtk_buildable_parser_finished (GTK_BUILDABLE (buildable), builder);
if (_gtk_builder_lookup_failed (builder, error))
@ -2206,10 +2227,10 @@ _gtk_builder_parser_parse_buffer (GtkBuilder *builder,
out:
g_slist_free_full (data.custom_finalizers, (GDestroyNotify)free_subparser);
g_slist_free (data.finalizers);
g_free (data.domain);
g_hash_table_destroy (data.object_ids);
g_ptr_array_free (data.stack, TRUE);
g_ptr_array_free (data.finalizers, TRUE);
gtk_buildable_parse_context_free (&data.ctx);
/* restore the original domain */

View File

@ -46,9 +46,11 @@ typedef struct {
GObjectClass *oclass;
char *id;
char *constructor;
GSList *properties;
GSList *signals;
GPtrArray *properties;
GPtrArray *signals;
GSList *bindings;
GObject *object;
CommonInfo *parent;
gboolean applied_properties;
@ -177,7 +179,7 @@ typedef struct {
SubParser *subparser;
GtkBuildableParseContext ctx;
const char *filename;
GSList *finalizers;
GPtrArray *finalizers;
GSList *custom_finalizers;
const char **requested_objects; /* NULL if all the objects are requested */
@ -218,7 +220,7 @@ void _gtk_builder_add_object (GtkBuilder *builder,
void _gtk_builder_add (GtkBuilder *builder,
ChildInfo *child_info);
void _gtk_builder_add_signals (GtkBuilder *builder,
GSList *signals);
GPtrArray *signals);
gboolean _gtk_builder_finish (GtkBuilder *builder,
GError **error);
void _free_signal_info (SignalInfo *info,

View File

@ -1165,12 +1165,6 @@ gtk_label_get_preferred_size (GtkWidget *widget,
/* Normal desired width */
*minimum_size = smallest_rect.width;
*natural_size = widest_rect.width;
if (minimum_baseline)
*minimum_baseline = -1;
if (natural_baseline)
*natural_baseline = -1;
}
else /* GTK_ORIENTATION_VERTICAL */
{
@ -1178,19 +1172,15 @@ gtk_label_get_preferred_size (GtkWidget *widget,
{
*minimum_size = smallest_rect.height;
*natural_size = widest_rect.height;
if (minimum_baseline)
*minimum_baseline = smallest_baseline;
if (natural_baseline)
*natural_baseline = widest_baseline;
*minimum_baseline = smallest_baseline;
*natural_baseline = widest_baseline;
}
else
{
*minimum_size = widest_rect.height;
*natural_size = smallest_rect.height;
if (minimum_baseline)
*minimum_baseline = widest_baseline;
if (natural_baseline)
*natural_baseline = smallest_baseline;
*minimum_baseline = widest_baseline;
*natural_baseline = smallest_baseline;
}
}
}
@ -1223,45 +1213,38 @@ get_layout_location (GtkLabel *self,
int *yp)
{
GtkWidget *widget = GTK_WIDGET (self);
int layout_width, layout_height, x, y;
float xalign, yalign;
const int widget_width = gtk_widget_get_width (widget);
const int widget_height = gtk_widget_get_height (widget);
PangoRectangle logical;
int baseline, layout_baseline, baseline_offset;
int widget_width, widget_height;
float xalign;
int baseline;
int x, y;
g_assert (xp);
g_assert (yp);
xalign = self->xalign;
yalign = self->yalign;
if (_gtk_widget_get_direction (widget) != GTK_TEXT_DIR_LTR)
xalign = 1.0 - xalign;
pango_layout_get_pixel_extents (self->layout, NULL, &logical);
layout_width = logical.width;
layout_height = logical.height;
widget_width = gtk_widget_get_width (widget);
widget_height = gtk_widget_get_height (widget);
x = floor ((xalign * (widget_width - logical.width)) - logical.x);
baseline = gtk_widget_get_allocated_baseline (widget);
x = floor ((xalign * (widget_width - layout_width)) - logical.x);
baseline_offset = 0;
if (baseline != -1)
{
layout_baseline = pango_layout_get_baseline (self->layout) / PANGO_SCALE;
baseline_offset = baseline - layout_baseline;
yalign = 0.0; /* Can't support yalign while baseline aligning */
int layout_baseline = pango_layout_get_baseline (self->layout) / PANGO_SCALE;
/* yalign is 0 because we can't support yalign while baseline aligning */
y = baseline - layout_baseline;
}
else
{
y = floor ((widget_height - logical.height) * self->yalign);
}
y = floor ((widget_height - layout_height) * yalign) + baseline_offset;
if (xp)
*xp = x;
if (yp)
*yp = y;
*xp = x;
*yp = y;
}
static void
@ -3500,7 +3483,10 @@ no_uline:
/* Extract the text to display */
if (!pango_parse_markup (new_text, -1, '_',
do_mnemonics ? &attrs : NULL, &text, NULL, &error))
goto error_set;
{
g_free (new_text);
goto error_set;
}
if (do_mnemonics)
{
@ -4978,11 +4964,17 @@ gtk_label_get_layout_offsets (GtkLabel *self,
int *x,
int *y)
{
int local_x, local_y;
g_return_if_fail (GTK_IS_LABEL (self));
gtk_label_ensure_layout (self);
get_layout_location (self, &local_x, &local_y);
get_layout_location (self, x, y);
if (x)
*x = local_x;
if (y)
*y = local_y;
}
/**

View File

@ -33,8 +33,8 @@ G_BEGIN_DECLS
/**
* GtkShortcutFunc:
* @widget: The widget passed to the activation
* @args: The arguments passed to the activation
* @user_data: The user data provided when activating the action
* @args: (nullable): The arguments passed to the activation
* @user_data: (nullable): The user data provided when activating the action
*
* Prototype for shortcuts based on user callbacks.
*/

View File

@ -4185,7 +4185,7 @@ void
gtk_widget_class_add_binding (GtkWidgetClass *widget_class,
guint keyval,
GdkModifierType mods,
GtkShortcutFunc func,
GtkShortcutFunc callback,
const char *format_string,
...)
{
@ -4194,7 +4194,7 @@ gtk_widget_class_add_binding (GtkWidgetClass *widget_class,
g_return_if_fail (GTK_IS_WIDGET_CLASS (widget_class));
shortcut = gtk_shortcut_new (gtk_keyval_trigger_new (keyval, mods),
gtk_callback_action_new (func, NULL, NULL));
gtk_callback_action_new (callback, NULL, NULL));
if (format_string)
{
va_list args;
@ -9123,14 +9123,12 @@ GtkAlign
gtk_widget_get_halign (GtkWidget *widget)
{
GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
GtkAlign align;
g_return_val_if_fail (GTK_IS_WIDGET (widget), GTK_ALIGN_FILL);
align = priv->halign;
if (align == GTK_ALIGN_BASELINE)
if (priv->halign == GTK_ALIGN_BASELINE)
return GTK_ALIGN_FILL;
return align;
return priv->halign;
}
/**