static AtkObject* _find_object (AtkObject *obj, AtkRole role) { /* * Find the first object which is a descendant of the specified object * which matches the specified role. * * This function returns a reference to the AtkObject which should be * removed when finished with the object. */ gint i; gint n_children; AtkObject *child; n_children = atk_object_get_n_accessible_children (obj); for (i = 0; i < n_children; i++) { AtkObject* found_obj; child = atk_object_ref_accessible_child (obj, i); if (atk_object_get_role (child) == role) { return child; } found_obj = _find_object (child, role); g_object_unref (child); if (found_obj) { return found_obj; } } return NULL; }
static BD_PG_OBJECT *_find_object_for_button(PG_DISPLAY_SET *s, BD_IG_BUTTON *button, int state, BOG_DATA *bog_data) { BD_PG_OBJECT *object = NULL; unsigned object_id = 0xffff; unsigned object_id_end = 0xffff; unsigned repeat = 0; switch (state) { case BTN_NORMAL: object_id = button->normal_start_object_id_ref; object_id_end = button->normal_end_object_id_ref; repeat = button->normal_repeat_flag; break; case BTN_SELECTED: object_id = button->selected_start_object_id_ref; object_id_end = button->selected_end_object_id_ref; repeat = button->selected_repeat_flag; break; case BTN_ACTIVATED: object_id = button->activated_start_object_id_ref; object_id_end = button->activated_end_object_id_ref; break; } if (bog_data) { if (bog_data->animate_indx >= 0) { int range = object_id_end - object_id; if (range > 0 && object_id < 0xffff && object_id_end < 0xffff) { GC_TRACE("animate button #%d: animate_indx %d, range %d, repeat %d\n", button->id, bog_data->animate_indx, range, repeat); object_id += bog_data->animate_indx % (range + 1); bog_data->animate_indx++; if (!repeat && bog_data->animate_indx > range) { /* terminate animation to the last object */ bog_data->animate_indx = -1; } } else { /* no animation for this button */ bog_data->animate_indx = -1; } } } if (!repeat && object_id_end < 0xfffe) { object_id = object_id_end; } object = _find_object(s, object_id); return object; }
static BD_PG_OBJECT *_find_object_for_button(PG_DISPLAY_SET *s, BD_IG_BUTTON *button, int state) { BD_PG_OBJECT *object = NULL; unsigned object_id = 0xffff; switch (state) { case BTN_NORMAL: object_id = button->normal_start_object_id_ref; break; case BTN_SELECTED: object_id = button->selected_start_object_id_ref; break; case BTN_ACTIVATED: object_id = button->activated_start_object_id_ref; break; } object = _find_object(s, object_id); return object; }