De-duplicate "actor contains actor" code

Add _st_actor_contains() in st-private for use within St, and
monkey-patch in a Clutter.Actor.contains() for use by javascript, and
then replace all the duplicate implementations with one or the other
of those.

https://bugzilla.gnome.org/show_bug.cgi?id=621197
This commit is contained in:
Dan Winship
2010-06-10 08:15:02 -04:00
parent e6a70e4676
commit a4befeba53
10 changed files with 38 additions and 81 deletions

View File

@ -11,6 +11,8 @@
#include "st-clickable.h"
#include "st-private.h"
G_DEFINE_TYPE (StClickable, st_clickable, ST_TYPE_BIN);
struct _StClickablePrivate {
@ -69,17 +71,6 @@ set_pressed (StClickable *self,
g_object_notify (G_OBJECT (self), "pressed");
}
static gboolean
st_clickable_contains (StClickable *self,
ClutterActor *actor)
{
while (actor != NULL && actor != (ClutterActor*)self)
{
actor = clutter_actor_get_parent (actor);
}
return actor != NULL;
}
static gboolean
st_clickable_enter_event (ClutterActor *actor,
ClutterCrossingEvent *event)
@ -130,7 +121,7 @@ st_clickable_button_press_event (ClutterActor *actor,
if (self->priv->held)
return TRUE;
if (!st_clickable_contains (self, event->source))
if (!_st_actor_contains (actor, event->source))
return FALSE;
self->priv->held = TRUE;
@ -157,7 +148,7 @@ st_clickable_button_release_event (ClutterActor *actor,
self->priv->held = FALSE;
clutter_ungrab_pointer ();
if (!st_clickable_contains (self, event->source))
if (!_st_actor_contains (actor, event->source))
return FALSE;
set_pressed (self, FALSE);

View File

@ -65,6 +65,7 @@
#include "st-texture-cache.h"
#include "st-marshal.h"
#include "st-clipboard.h"
#include "st-private.h"
#define HAS_FOCUS(actor) (clutter_actor_get_stage (actor) && clutter_stage_get_key_focus ((ClutterStage *) clutter_actor_get_stage (actor)) == actor)
@ -577,22 +578,13 @@ st_entry_key_focus_in (ClutterActor *actor)
clutter_actor_grab_key_focus (priv->entry);
}
static gboolean
actor_contains (ClutterActor *widget,
ClutterActor *other)
{
while (other != NULL && other != widget)
other = clutter_actor_get_parent (other);
return other != NULL;
}
static gboolean
st_entry_enter_event (ClutterActor *actor,
ClutterCrossingEvent *event)
{
StEntryPrivate *priv = ST_ENTRY_PRIV (actor);
if (actor_contains (actor, event->source)
if (_st_actor_contains (actor, event->source)
&& priv->hint && priv->hint_visible)
{
st_widget_set_hover (ST_WIDGET (actor), TRUE);
@ -605,7 +597,7 @@ static gboolean
st_entry_leave_event (ClutterActor *actor,
ClutterCrossingEvent *event)
{
if (!actor_contains (actor, event->related))
if (!_st_actor_contains (actor, event->related))
st_widget_set_hover (ST_WIDGET (actor), FALSE);
return CLUTTER_ACTOR_CLASS (st_entry_parent_class)->leave_event (actor, event);

View File

@ -310,3 +310,12 @@ _st_set_text_from_style (ClutterText *text,
pango_attr_list_unref (attribs);
}
gboolean
_st_actor_contains (ClutterActor *actor,
ClutterActor *child)
{
while (child != NULL && child != actor)
child = clutter_actor_get_parent (child);
return child != NULL;
}

View File

@ -72,4 +72,7 @@ void _st_allocate_fill (StWidget *parent,
void _st_set_text_from_style (ClutterText *text,
StThemeNode *theme_node);
gboolean _st_actor_contains (ClutterActor *actor,
ClutterActor *child);
#endif /* __ST_PRIVATE_H__ */

View File

@ -557,15 +557,6 @@ st_widget_get_theme_node (StWidget *widget)
return priv->theme_node;
}
static gboolean
actor_contains (ClutterActor *widget,
ClutterActor *other)
{
while (other != NULL && other != widget)
other = clutter_actor_get_parent (other);
return other != NULL;
}
static gboolean
st_widget_enter (ClutterActor *actor,
ClutterCrossingEvent *event)
@ -574,7 +565,7 @@ st_widget_enter (ClutterActor *actor,
if (priv->track_hover)
{
if (actor_contains (actor, event->source))
if (_st_actor_contains (actor, event->source))
st_widget_set_hover (ST_WIDGET (actor), TRUE);
else
{
@ -600,7 +591,7 @@ st_widget_leave (ClutterActor *actor,
if (priv->track_hover)
{
if (!actor_contains (actor, event->related))
if (!_st_actor_contains (actor, event->related))
st_widget_set_hover (ST_WIDGET (actor), FALSE);
}
@ -1589,17 +1580,13 @@ st_widget_sync_hover (StWidget *widget)
{
ClutterDeviceManager *device_manager;
ClutterInputDevice *pointer;
ClutterActor *actor;
ClutterActor *pointer_actor;
device_manager = clutter_device_manager_get_default ();
pointer = clutter_device_manager_get_core_device (device_manager,
CLUTTER_POINTER_DEVICE);
actor = clutter_input_device_get_pointer_actor (pointer);
while (actor && actor != (ClutterActor *)widget)
actor = clutter_actor_get_parent (actor);
st_widget_set_hover (widget, actor == (ClutterActor *)widget);
pointer_actor = clutter_input_device_get_pointer_actor (pointer);
st_widget_set_hover (widget, _st_actor_contains (CLUTTER_ACTOR (widget), pointer_actor));
}
/**