gtk2-ng/modules/other/gail/tests/testvalues.c
Daemonratte 782a2948b8 gail: update AtkValue test modules
Use a shared private compatibility helper in the GAIL test modules.

Exercise the modern AtkValue API when ATK 2.12 or newer is available while retaining the legacy test path for older ATK versions.

Initialize temporary GValues explicitly and keep the helper symbols private to the test modules.
2026-08-07 08:53:00 +02:00

195 lines
4.7 KiB
C

#include <string.h>
#include <atk/atk.h>
#include <gtk/gtk.h>
#include "testvalue.h"
static void _traverse_children (AtkObject *obj);
static void _add_handler (AtkObject *obj);
static void _check_values (AtkObject *obj);
static void _value_change_handler (AtkObject *obj,
AtkPropertyValues *values);
static guint id;
static void _value_change_handler (AtkObject *obj,
AtkPropertyValues *values)
{
const gchar *type_name = g_type_name (G_TYPE_FROM_INSTANCE (obj));
GValue val = { 0, };
GValue *value_back;
value_back = &val;
if (!ATK_IS_VALUE (obj)) {
return;
}
if (strcmp (values->property_name, "accessible-value") == 0) {
g_print ("_value_change_handler: Accessible Type: %s\n",
type_name ? type_name : "NULL");
if(G_VALUE_HOLDS_DOUBLE (&values->new_value))
{
g_print( "adjustment value changed : new value: %f\n",
g_value_get_double (&values->new_value));
}
g_print("Now calling the AtkValue interface functions\n");
gail_test_value_get_current_value (ATK_VALUE(obj), value_back);
g_return_if_fail (G_VALUE_HOLDS_DOUBLE (value_back));
g_print ("atk_value_get_current_value returns %f\n",
g_value_get_double (value_back) );
gail_test_value_get_maximum_value (ATK_VALUE (obj), value_back);
g_return_if_fail (G_VALUE_HOLDS_DOUBLE (value_back));
g_print ("atk_value_get_maximum returns %f\n",
g_value_get_double (value_back));
gail_test_value_get_minimum_value (ATK_VALUE (obj), value_back);
g_return_if_fail (G_VALUE_HOLDS_DOUBLE (value_back));
g_print ("atk_value_get_minimum returns %f\n",
g_value_get_double (value_back));
}
}
static void _traverse_children (AtkObject *obj)
{
gint n_children, i;
n_children = atk_object_get_n_accessible_children (obj);
for (i = 0; i < n_children; i++)
{
AtkObject *child;
child = atk_object_ref_accessible_child (obj, i);
_add_handler (child);
_traverse_children (child);
g_object_unref (G_OBJECT (child));
}
}
static void _add_handler (AtkObject *obj)
{
static GPtrArray *obj_array = NULL;
gboolean found = FALSE;
gint i;
/*
* We create a property handler for each object if one was not associated
* with it already.
*
* We add it to our array of objects which have property handlers; if an
* object is destroyed it remains in the array.
*/
if (obj_array == NULL)
obj_array = g_ptr_array_new ();
for (i = 0; i < obj_array->len; i++)
{
if (obj == g_ptr_array_index (obj_array, i))
{
found = TRUE;
break;
}
}
if (!found)
{
atk_object_connect_property_change_handler (obj,
(AtkPropertyChangeHandler*) _value_change_handler);
g_ptr_array_add (obj_array, obj);
}
}
static void _set_values (AtkObject *obj) {
GValue val = { 0, };
GValue *value_back;
static gint count = 0;
gdouble double_value;
value_back = &val;
if(ATK_IS_VALUE(obj)) {
/* Spin button also inherits the text interfaces from GailEntry.
* Check when spin button recieves focus.
*/
if(ATK_IS_TEXT(obj) && ATK_IS_EDITABLE_TEXT(obj)) {
if(count == 0) {
gint x;
gchar* text;
count++;
x = atk_text_get_character_count (ATK_TEXT (obj));
text = atk_text_get_text (ATK_TEXT (obj), 0, x);
g_print("Text : %s\n", text);
text = "5.7";
atk_editable_text_set_text_contents(ATK_EDITABLE_TEXT(obj),text);
g_print("Set text to %s\n",text);
gail_test_value_get_current_value(ATK_VALUE(obj), value_back);
g_return_if_fail (G_VALUE_HOLDS_DOUBLE (value_back));
g_print("atk_value_get_current_value returns %f\n",
g_value_get_double( value_back));
}
} else {
memset (value_back, 0, sizeof (GValue));
g_value_init (value_back, G_TYPE_DOUBLE);
g_value_set_double (value_back, 10.0);
if (gail_test_value_set_current_value (ATK_VALUE (obj), value_back))
{
double_value = g_value_get_double (value_back);
g_print("atk_value_set_current_value returns %f\n",
double_value);
}
}
}
}
static void _check_values (AtkObject *obj)
{
static gint calls = 0;
AtkRole role;
g_print ("Start of _check_values\n");
_set_values(obj);
_add_handler (obj);
if (++calls < 2)
{
/*
* Just do this on this on the first 2 objects visited
*/
atk_object_set_name (obj, "test123");
atk_object_set_description (obj, "test123");
}
role = atk_object_get_role (obj);
if (role == ATK_ROLE_FRAME || role == ATK_ROLE_DIALOG)
{
/*
* Add handlers to all children.
*/
_traverse_children (obj);
}
g_print ("End of _check_values\n");
}
static void
_create_event_watcher (void)
{
id = atk_add_focus_tracker (_check_values);
}
int
gtk_module_init(gint argc, char* argv[])
{
g_print("testvalues Module loaded\n");
_create_event_watcher();
return 0;
}