diff --git a/src/shell-util.c b/src/shell-util.c index d5aec138b..0ff9d1221 100644 --- a/src/shell-util.c +++ b/src/shell-util.c @@ -440,6 +440,61 @@ shell_util_set_hidden_from_pick (ClutterActor *actor, } } +/** + * shell_util_get_transformed_allocation: + * @actor: a #ClutterActor + * @box: (out): location to store returned box in stage coordinates + * + * This function is similar to a combination of clutter_actor_get_transformed_position(), + * and clutter_actor_get_transformed_size(), but unlike + * clutter_actor_get_transformed_size(), it always returns a transform + * of the current allocation, while clutter_actor_get_transformed_size() returns + * bad values (the transform of the requested size) if a relayout has been + * queued. + * + * This function is more convenient to use than + * clutter_actor_get_abs_allocation_vertices() if no transformation is in effect + * and also works around limitations in the GJS binding of arrays. + */ +void +shell_util_get_transformed_allocation (ClutterActor *actor, + ClutterActorBox *box) +{ + /* Code adapted from clutter-actor.c: + * Copyright 2006, 2007, 2008 OpenedHand Ltd + */ + ClutterVertex v[4]; + gfloat x_min, x_max, y_min, y_max; + gint i; + + g_return_if_fail (CLUTTER_IS_ACTOR (actor)); + + clutter_actor_get_abs_allocation_vertices (actor, v); + + x_min = x_max = v[0].x; + y_min = y_max = v[0].y; + + for (i = 1; i < G_N_ELEMENTS (v); ++i) + { + if (v[i].x < x_min) + x_min = v[i].x; + + if (v[i].x > x_max) + x_max = v[i].x; + + if (v[i].y < y_min) + y_min = v[i].y; + + if (v[i].y > y_max) + y_max = v[i].y; + } + + box->x1 = x_min; + box->y1 = y_min; + box->x2 = x_max; + box->y2 = y_max; +} + /** * shell_util_format_date: * @format: a strftime-style string format, as parsed by diff --git a/src/shell-util.h b/src/shell-util.h index e4914c380..7da5476ba 100644 --- a/src/shell-util.h +++ b/src/shell-util.h @@ -13,6 +13,9 @@ GIcon *shell_util_get_icon_for_uri (const char *text_uri); GIcon *shell_util_icon_from_string (const char *string, GError **error); void shell_util_set_hidden_from_pick (ClutterActor *actor, gboolean hidden); +void shell_util_get_transformed_allocation (ClutterActor *actor, + ClutterActorBox *box); + char *shell_util_format_date (const char *format, gint64 time_ms);