a11y: provide a way to ensure clutter accessibility

If gtk_init is called after clutter_init, it can override clutter
AtkUtil implementation. In that situation, we can't say that
the accessibility is enabled, as the root object would be wrong.

In order to provide a way to prevent this:

* clutter_get_accessibility_enabled returns true of false
  depending on the current AtkUtil implemented
* cally_accessibility_init always override AtkUtil implementation.
This commit is contained in:
Alejandro Piñeiro 2014-09-02 18:22:41 +02:00
parent fe208bff29
commit 281a57a6a3
3 changed files with 17 additions and 10 deletions

View File

@ -438,3 +438,15 @@ cally_util_stage_removed_cb (ClutterStageManager *stage_manager,
g_signal_handlers_disconnect_by_func (stage, cally_key_snooper_cb, NULL); g_signal_handlers_disconnect_by_func (stage, cally_key_snooper_cb, NULL);
} }
void
_cally_util_override_atk_util (void)
{
AtkUtilClass *atk_class = ATK_UTIL_CLASS (g_type_class_ref (ATK_TYPE_UTIL));
atk_class->add_key_event_listener = cally_util_add_key_event_listener;
atk_class->remove_key_event_listener = cally_util_remove_key_event_listener;
atk_class->get_root = cally_util_get_root;
atk_class->get_toolkit_name = cally_util_get_toolkit_name;
atk_class->get_toolkit_version = cally_util_get_toolkit_version;
}

View File

@ -77,6 +77,8 @@ struct _CallyUtilClass
CLUTTER_AVAILABLE_IN_1_4 CLUTTER_AVAILABLE_IN_1_4
GType cally_util_get_type (void) G_GNUC_CONST; GType cally_util_get_type (void) G_GNUC_CONST;
void _cally_util_override_atk_util (void);
G_END_DECLS G_END_DECLS
#endif /* __CALLY_UTIL_H__ */ #endif /* __CALLY_UTIL_H__ */

View File

@ -53,8 +53,6 @@
#include "clutter-debug.h" #include "clutter-debug.h"
#include "clutter-private.h" #include "clutter-private.h"
static int cally_initialized = FALSE;
/* factories initialization*/ /* factories initialization*/
CALLY_ACCESSIBLE_FACTORY (CALLY_TYPE_ACTOR, cally_actor, cally_actor_new) CALLY_ACCESSIBLE_FACTORY (CALLY_TYPE_ACTOR, cally_actor, cally_actor_new)
CALLY_ACCESSIBLE_FACTORY (CALLY_TYPE_GROUP, cally_group, cally_group_new) CALLY_ACCESSIBLE_FACTORY (CALLY_TYPE_GROUP, cally_group, cally_group_new)
@ -77,11 +75,6 @@ CALLY_ACCESSIBLE_FACTORY (CALLY_TYPE_CLONE, cally_clone, cally_clone_new)
gboolean gboolean
cally_accessibility_init (void) cally_accessibility_init (void)
{ {
if (cally_initialized)
return TRUE;
cally_initialized = TRUE;
/* setting the factories */ /* setting the factories */
CALLY_ACTOR_SET_FACTORY (CLUTTER_TYPE_ACTOR, cally_actor); CALLY_ACTOR_SET_FACTORY (CLUTTER_TYPE_ACTOR, cally_actor);
CALLY_ACTOR_SET_FACTORY (CLUTTER_TYPE_GROUP, cally_group); CALLY_ACTOR_SET_FACTORY (CLUTTER_TYPE_GROUP, cally_group);
@ -92,11 +85,11 @@ cally_accessibility_init (void)
CALLY_ACTOR_SET_FACTORY (CLUTTER_TYPE_CLONE, cally_clone); CALLY_ACTOR_SET_FACTORY (CLUTTER_TYPE_CLONE, cally_clone);
/* Initialize the CallyUtility class */ /* Initialize the CallyUtility class */
g_type_class_unref (g_type_class_ref (CALLY_TYPE_UTIL)); _cally_util_override_atk_util ();
CLUTTER_NOTE (MISC, "Clutter Accessibility initialized"); CLUTTER_NOTE (MISC, "Clutter Accessibility initialized");
return cally_initialized; return TRUE;
} }
/** /**
@ -111,5 +104,5 @@ cally_accessibility_init (void)
*/ */
gboolean cally_get_cally_initialized (void) gboolean cally_get_cally_initialized (void)
{ {
return cally_initialized; return !g_strcmp0 (atk_get_toolkit_name (), "clutter");
} }