369
368
StWidget *self = ST_WIDGET (actor);
370
369
StThemeNode *theme_node;
371
370
ClutterActorBox allocation;
373
373
theme_node = st_widget_get_theme_node (self);
375
375
clutter_actor_get_allocation_box (actor, &allocation);
377
st_theme_node_paint (theme_node, &allocation, clutter_actor_get_paint_opacity (actor));
377
opacity = clutter_actor_get_paint_opacity (actor);
379
if (self->priv->transition_animation)
380
st_theme_node_transition_paint (self->priv->transition_animation,
384
st_theme_node_paint (theme_node, &allocation, opacity);
1218
1204
actor->priv = priv = ST_WIDGET_GET_PRIVATE (actor);
1219
1205
priv->is_stylable = TRUE;
1206
priv->transition_animation = NULL;
1221
1208
/* connect style changed */
1222
1209
g_signal_connect (actor, "notify::name", G_CALLBACK (st_widget_name_notify), NULL);
1213
on_transition_completed (StThemeNodeTransition *transition,
1216
st_widget_remove_transition (widget);
1226
1220
st_widget_recompute_style (StWidget *widget,
1227
1221
StThemeNode *old_theme_node)
1229
1223
StThemeNode *new_theme_node = st_widget_get_theme_node (widget);
1224
int transition_duration;
1231
1226
if (!old_theme_node ||
1232
1227
!st_theme_node_geometry_equal (old_theme_node, new_theme_node))
1233
1228
clutter_actor_queue_relayout ((ClutterActor *) widget);
1230
transition_duration = st_theme_node_get_transition_duration (new_theme_node);
1232
if (transition_duration > 0)
1234
if (widget->priv->transition_animation != NULL)
1236
st_theme_node_transition_update (widget->priv->transition_animation,
1239
else if (old_theme_node)
1241
widget->priv->transition_animation =
1242
st_theme_node_transition_new (old_theme_node,
1244
transition_duration);
1246
g_signal_connect (widget->priv->transition_animation, "completed",
1247
G_CALLBACK (on_transition_completed), widget);
1248
g_signal_connect_swapped (widget->priv->transition_animation,
1250
G_CALLBACK (clutter_actor_queue_redraw),
1254
else if (widget->priv->transition_animation)
1256
st_widget_remove_transition (widget);
1235
1259
g_signal_emit (widget, signals[STYLE_CHANGED], 0);
1236
1260
widget->priv->is_style_dirty = FALSE;
1560
1584
ClutterDeviceManager *device_manager;
1561
1585
ClutterInputDevice *pointer;
1562
ClutterActor *actor;
1586
ClutterActor *pointer_actor;
1564
1588
device_manager = clutter_device_manager_get_default ();
1565
1589
pointer = clutter_device_manager_get_core_device (device_manager,
1566
1590
CLUTTER_POINTER_DEVICE);
1567
actor = clutter_input_device_get_pointer_actor (pointer);
1569
while (actor && actor != (ClutterActor *)widget)
1570
actor = clutter_actor_get_parent (actor);
1572
st_widget_set_hover (widget, actor == (ClutterActor *)widget);
1591
pointer_actor = clutter_input_device_get_pointer_actor (pointer);
1592
st_widget_set_hover (widget, _st_actor_contains (CLUTTER_ACTOR (widget), pointer_actor));
1589
1609
return widget->priv->hover;
1613
append_actor_text (GString *desc,
1614
ClutterActor *actor)
1616
if (CLUTTER_IS_TEXT (actor))
1618
g_string_append_printf (desc, " (\"%s\")",
1619
clutter_text_get_text (CLUTTER_TEXT (actor)));
1622
else if (ST_IS_LABEL (actor))
1624
g_string_append_printf (desc, " (\"%s\")",
1625
st_label_get_text (ST_LABEL (actor)));
1633
* st_describe_actor:
1634
* @actor: a #ClutterActor
1636
* Creates a string describing @actor, for use in debugging. This
1637
* includes the class name and actor name (if any), plus if @actor
1638
* is an #StWidget, its style class and pseudo class names.
1640
* Return value: the debug name.
1643
st_describe_actor (ClutterActor *actor)
1650
return g_strdup ("[null]");
1652
desc = g_string_new (NULL);
1653
g_string_append_printf (desc, "[%p %s", actor,
1654
G_OBJECT_TYPE_NAME (actor));
1656
if (ST_IS_WIDGET (actor))
1658
const char *style_class = st_widget_get_style_class_name (ST_WIDGET (actor));
1659
const char *pseudo_class = st_widget_get_style_pseudo_class (ST_WIDGET (actor));
1664
classes = g_strsplit (style_class, ",", -1);
1665
for (i = 0; classes[i]; i++)
1667
g_strchug (classes[i]);
1668
g_string_append_printf (desc, ".%s", classes[i]);
1670
g_strfreev (classes);
1675
classes = g_strsplit (pseudo_class, ",", -1);
1676
for (i = 0; classes[i]; i++)
1678
g_strchug (classes[i]);
1679
g_string_append_printf (desc, ":%s", classes[i]);
1681
g_strfreev (classes);
1685
name = clutter_actor_get_name (actor);
1687
g_string_append_printf (desc, " \"%s\"", name);
1689
if (!append_actor_text (desc, actor) && CLUTTER_IS_CONTAINER (actor))
1691
GList *children, *l;
1693
/* Do a limited search of @actor's children looking for a label */
1694
children = clutter_container_get_children (CLUTTER_CONTAINER (actor));
1695
for (l = children, i = 0; l && i < 20; l = l->next, i++)
1697
if (append_actor_text (desc, l->data))
1699
else if (CLUTTER_IS_CONTAINER (l->data))
1700
children = g_list_concat (children, clutter_container_get_children (l->data));
1702
g_list_free (children);
1705
g_string_append_c (desc, ']');
1707
return g_string_free (desc, FALSE);
1711
* st_set_slow_down_factor:
1713
* @factor: new slow-down factor
1715
* Set a global factor applied to all animation durations
1718
st_set_slow_down_factor (gfloat factor)
1720
st_slow_down_factor = factor;
1724
* st_get_slow_down_factor:
1726
* Returns: the global factor applied to all animation durations
1729
st_get_slow_down_factor ()
1731
return st_slow_down_factor;