X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=atk%2Fatkcomponent.c;h=fc63c9d55056788a0e718123decd0ea9f12ca8d3;hb=7a46a450bfe9f8aae82b7c10e25ae13bd5cb3a9a;hp=b67ec1370a0c2d49dd54d6f713e5580b34df59cf;hpb=59c9d3c27c3bcdf995b712db8699f916aeabb01f;p=platform%2Fupstream%2Fatk.git diff --git a/atk/atkcomponent.c b/atk/atkcomponent.c index b67ec13..fc63c9d 100755 --- a/atk/atkcomponent.c +++ b/atk/atkcomponent.c @@ -17,9 +17,36 @@ * Boston, MA 02111-1307, USA. */ +#include "config.h" #include "atkcomponent.h" +/** + * SECTION:atkcomponent + * @Short_description: The ATK interface provided by UI components + * which occupy a physical area on the screen. + * which the user can activate/interact with. + * @Title:AtkComponent + * + * #AtkComponent should be implemented by most if not all UI elements + * with an actual on-screen presence, i.e. components which can be + * said to have a screen-coordinate bounding box. Virtually all + * widgets will need to have #AtkComponent implementations provided + * for their corresponding #AtkObject class. In short, only UI + * elements which are *not* GUI elements will omit this ATK interface. + * + * A possible exception might be textual information with a + * transparent background, in which case text glyph bounding box + * information is provided by #AtkText. + */ + +enum { + BOUNDS_CHANGED, + LAST_SIGNAL +}; + +static void atk_component_base_init (AtkComponentIface *class); + static gboolean atk_component_real_contains (AtkComponent *component, gint x, gint y, @@ -39,6 +66,8 @@ static void atk_component_real_get_size (AtkComponent *comp gint *width, gint *height); +static guint atk_component_signals[LAST_SIGNAL] = { 0 }; + GType atk_component_get_type (void) { @@ -48,7 +77,7 @@ atk_component_get_type (void) static const GTypeInfo tinfo = { sizeof (AtkComponentIface), - (GBaseInitFunc) NULL, + (GBaseInitFunc) atk_component_base_init, (GBaseFinalizeFunc) NULL, }; @@ -59,6 +88,42 @@ atk_component_get_type (void) return type; } +static void +atk_component_base_init (AtkComponentIface *class) +{ + static gboolean initialized = FALSE; + + if (! initialized) + { + class->ref_accessible_at_point = atk_component_real_ref_accessible_at_point; + class->contains = atk_component_real_contains; + class->get_position = atk_component_real_get_position; + class->get_size = atk_component_real_get_size; + + + /** + * AtkComponent::bounds-changed: + * @atkcomponent: the object which received the signal. + * @arg1: The AtkRectangle giving the new position and size. + * + * The 'bounds-changed" signal is emitted when the bposition or + * size of the component changes. + */ + atk_component_signals[BOUNDS_CHANGED] = + g_signal_new ("bounds_changed", + ATK_TYPE_COMPONENT, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (AtkComponentIface, bounds_changed), + (GSignalAccumulator) NULL, NULL, + g_cclosure_marshal_VOID__BOXED, + G_TYPE_NONE, 1, + ATK_TYPE_RECTANGLE | G_SIGNAL_TYPE_STATIC_SCOPE); + + initialized = TRUE; + } +} + + /** * atk_component_add_focus_handler: * @component: The #AtkComponent to attach the @handler to @@ -68,7 +133,11 @@ atk_component_get_type (void) * when this object receives focus events (in or out). If the handler is * already added it is not added again * - * Returns: a handler id which can be used in atk_component_remove_focus_handler + * Deprecated: This method is deprecated since ATK version 2.9.4. If + * you need to track when an object gains or lose the focus, use + * state-changed:focused notification instead. + * + * Returns: a handler id which can be used in atk_component_remove_focus_handler() * or zero if the handler was already added. **/ guint @@ -95,6 +164,11 @@ atk_component_add_focus_handler (AtkComponent *component, * Remove the handler specified by @handler_id from the list of * functions to be executed when this object receives focus events * (in or out). + * + * Deprecated: This method is deprecated since ATK version 2.9.4. If + * you need to track when an object gains or lose the focus, use + * state-changed:focused notification instead. + * **/ void atk_component_remove_focus_handler (AtkComponent *component, @@ -119,6 +193,10 @@ atk_component_remove_focus_handler (AtkComponent *component, * * Checks whether the specified point is within the extent of the @component. * + * Toolkit implementor note: ATK provides a default implementation for + * this virtual method. In general there are little reason to + * re-implement it. + * * Returns: %TRUE or %FALSE indicating whether the specified point is within * the extent of the @component or not **/ @@ -136,12 +214,7 @@ atk_component_contains (AtkComponent *component, if (iface->contains) return (iface->contains) (component, x, y, coord_type); else - { - /* - * if this method is not overridden use the default implementation. - */ - return atk_component_real_contains (component, x, y, coord_type); - } + return FALSE; } /** @@ -155,7 +228,8 @@ atk_component_contains (AtkComponent *component, * Gets a reference to the accessible child, if one exists, at the * coordinate point specified by @x and @y. * - * Returns: a reference to the accessible child, if one exists + * Returns: (nullable) (transfer full): a reference to the accessible + * child, if one exists **/ AtkObject* atk_component_ref_accessible_at_point (AtkComponent *component, @@ -171,12 +245,7 @@ atk_component_ref_accessible_at_point (AtkComponent *component, if (iface->ref_accessible_at_point) return (iface->ref_accessible_at_point) (component, x, y, coord_type); else - { - /* - * if this method is not overridden use the default implementation. - */ - return atk_component_real_ref_accessible_at_point (component, x, y, coord_type); - } + return NULL; } /** @@ -239,6 +308,8 @@ atk_component_get_extents (AtkComponent *component, * * Gets the position of @component in the form of * a point specifying @component's top-left corner. + * + * Deprecated: Since 2.12. Use atk_component_get_extents() instead. **/ void atk_component_get_position (AtkComponent *component, @@ -265,13 +336,6 @@ atk_component_get_position (AtkComponent *component, if (iface->get_position) (iface->get_position) (component, real_x, real_y, coord_type); - else - { - /* - * if this method is not overridden use the default implementation. - */ - atk_component_real_get_position (component, real_x, real_y, coord_type); - } } /** @@ -281,6 +345,8 @@ atk_component_get_position (AtkComponent *component, * @height: address of #gint to put height of @component * * Gets the size of the @component in terms of width and height. + * + * Deprecated: Since 2.12. Use atk_component_get_extents() instead. **/ void atk_component_get_size (AtkComponent *component, @@ -302,20 +368,84 @@ atk_component_get_size (AtkComponent *component, else real_height = &local_height; - iface = ATK_COMPONENT_GET_IFACE (component); g_return_if_fail (ATK_IS_COMPONENT (component)); iface = ATK_COMPONENT_GET_IFACE (component); if (iface->get_size) (iface->get_size) (component, real_width, real_height); +} + +/** + * atk_component_get_layer: + * @component: an #AtkComponent + * + * Gets the layer of the component. + * + * Returns: an #AtkLayer which is the layer of the component + **/ +AtkLayer +atk_component_get_layer (AtkComponent *component) +{ + AtkComponentIface *iface; + + g_return_val_if_fail (ATK_IS_COMPONENT (component), ATK_LAYER_INVALID); + + iface = ATK_COMPONENT_GET_IFACE (component); + if (iface->get_layer) + return (iface->get_layer) (component); else - { - /* - * if this method is not overridden use the default implementation. - */ - atk_component_real_get_size (component, real_width, real_height); - } + return ATK_LAYER_WIDGET; +} + +/** + * atk_component_get_mdi_zorder: + * @component: an #AtkComponent + * + * Gets the zorder of the component. The value G_MININT will be returned + * if the layer of the component is not ATK_LAYER_MDI or ATK_LAYER_WINDOW. + * + * Returns: a gint which is the zorder of the component, i.e. the depth at + * which the component is shown in relation to other components in the same + * container. + **/ +gint +atk_component_get_mdi_zorder (AtkComponent *component) +{ + AtkComponentIface *iface; + + g_return_val_if_fail (ATK_IS_COMPONENT (component), G_MININT); + + iface = ATK_COMPONENT_GET_IFACE (component); + if (iface->get_mdi_zorder) + return (iface->get_mdi_zorder) (component); + else + return G_MININT; +} + +/** + * atk_component_get_alpha: + * @component: an #AtkComponent + * + * Returns the alpha value (i.e. the opacity) for this + * @component, on a scale from 0 (fully transparent) to 1.0 + * (fully opaque). + * + * Returns: An alpha value from 0 to 1.0, inclusive. + * Since: 1.12 + **/ +gdouble +atk_component_get_alpha (AtkComponent *component) +{ + AtkComponentIface *iface; + + g_return_val_if_fail (ATK_IS_COMPONENT (component), G_MININT); + + iface = ATK_COMPONENT_GET_IFACE (component); + if (iface->get_alpha) + return (iface->get_alpha) (component); + else + return (gdouble) 1.0; } /** @@ -506,3 +636,25 @@ atk_component_real_get_size (AtkComponent *component, atk_component_get_extents (component, &x, &y, width, height, coord_type); } + +static AtkRectangle * +atk_rectangle_copy (const AtkRectangle *rectangle) +{ + AtkRectangle *result = g_new (AtkRectangle, 1); + *result = *rectangle; + + return result; +} + +GType +atk_rectangle_get_type (void) +{ + static GType our_type = 0; + + if (our_type == 0) + our_type = g_boxed_type_register_static ("AtkRectangle", + (GBoxedCopyFunc)atk_rectangle_copy, + (GBoxedFreeFunc)g_free); + return our_type; +} +