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.
This commit is contained in:
Daemonratte 2026-08-06 13:57:34 +02:00
commit f2afa5c648
5 changed files with 122 additions and 17 deletions

View file

@ -12,6 +12,8 @@ module_LTLIBRARIES = \
libferret.la libferret.la
endif endif
noinst_HEADERS = testvalue.h
noinst_LTLIBRARIES = \ noinst_LTLIBRARIES = \
libtestaction.la \ libtestaction.la \
libtestbutton.la \ libtestbutton.la \

View file

@ -16,6 +16,7 @@
#include <strings.h> #include <strings.h>
#include "testlib.h" #include "testlib.h"
#include "testvalue.h"
typedef enum typedef enum
{ {
@ -1389,7 +1390,8 @@ _print_text_attributes (AtkText *aobject)
static gint static gint
_print_value (AtkValue *aobject) _print_value (AtkValue *aobject)
{ {
GValue *value_back, val; GValue val = { 0, };
GValue *value_back;
gint group_num; gint group_num;
TabNumber tab_n = VALUE; TabNumber tab_n = VALUE;
@ -1398,11 +1400,11 @@ _print_value (AtkValue *aobject)
group_num = _print_groupname(tab_n, VALUE_INTERFACE, group_num = _print_groupname(tab_n, VALUE_INTERFACE,
"Value Interface"); "Value Interface");
atk_value_get_current_value(aobject, value_back); gail_test_value_get_current_value(aobject, value_back);
_print_value_type(group_num, "Value", value_back); _print_value_type(group_num, "Value", value_back);
atk_value_get_minimum_value(aobject, value_back); gail_test_value_get_minimum_value(aobject, value_back);
_print_value_type(group_num, "Minimum Value", value_back); _print_value_type(group_num, "Minimum Value", value_back);
atk_value_get_maximum_value(aobject, value_back); gail_test_value_get_maximum_value(aobject, value_back);
_print_value_type(group_num, "Maximum Value", value_back); _print_value_type(group_num, "Maximum Value", value_back);
return(group_num); return(group_num);
} }

View file

@ -2,6 +2,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <gtk/gtk.h> #include <gtk/gtk.h>
#include <testlib.h> #include <testlib.h>
#include "testvalue.h"
static gint _test_paned (gpointer data); static gint _test_paned (gpointer data);
static void _check_paned (AtkObject *obj); static void _check_paned (AtkObject *obj);
@ -31,17 +32,17 @@ static void _property_change_handler (AtkObject *obj,
value = &val; value = &val;
memset (value, 0, sizeof (GValue)); memset (value, 0, sizeof (GValue));
atk_value_get_current_value (ATK_VALUE (obj), value); gail_test_value_get_current_value (ATK_VALUE (obj), value);
g_return_if_fail (G_VALUE_HOLDS_INT (value)); g_return_if_fail (G_VALUE_HOLDS_INT (value));
position = g_value_get_int (value); position = g_value_get_int (value);
g_print ("Position is %d previous position was %d\n", g_print ("Position is %d previous position was %d\n",
position, last_position); position, last_position);
last_position = position; last_position = position;
atk_value_get_minimum_value (ATK_VALUE (obj), value); gail_test_value_get_minimum_value (ATK_VALUE (obj), value);
g_return_if_fail (G_VALUE_HOLDS_INT (value)); g_return_if_fail (G_VALUE_HOLDS_INT (value));
position = g_value_get_int (value); position = g_value_get_int (value);
g_print ("Minimum Value is %d\n", position); g_print ("Minimum Value is %d\n", position);
atk_value_get_maximum_value (ATK_VALUE (obj), value); gail_test_value_get_maximum_value (ATK_VALUE (obj), value);
g_return_if_fail (G_VALUE_HOLDS_INT (value)); g_return_if_fail (G_VALUE_HOLDS_INT (value));
position = g_value_get_int (value); position = g_value_get_int (value);
g_print ("Maximum Value is %d\n", position); g_print ("Maximum Value is %d\n", position);
@ -61,14 +62,14 @@ static gint _test_paned (gpointer data)
value = &val; value = &val;
memset (value, 0, sizeof (GValue)); memset (value, 0, sizeof (GValue));
atk_value_get_current_value (ATK_VALUE (obj), value); gail_test_value_get_current_value (ATK_VALUE (obj), value);
g_return_val_if_fail (G_VALUE_HOLDS_INT (value), FALSE); g_return_val_if_fail (G_VALUE_HOLDS_INT (value), FALSE);
position = g_value_get_int (value); position = g_value_get_int (value);
g_print ("Position is : %d\n", position); g_print ("Position is : %d\n", position);
last_position = position; last_position = position;
position *= 2; position *= 2;
g_value_set_int (value, position); g_value_set_int (value, position);
atk_value_set_current_value (ATK_VALUE (obj), value); gail_test_value_set_current_value (ATK_VALUE (obj), value);
times++; times++;
} }
if (times < 4) if (times < 4)

View file

@ -0,0 +1,98 @@
#ifndef __GAIL_TEST_VALUE_H__
#define __GAIL_TEST_VALUE_H__
#include "config.h"
#include <atk/atk.h>
#ifdef HAVE_ATK_VALUE_2_12
static void
gail_test_value_store_number (AtkValue *value,
GValue *result,
gdouble number)
{
if (G_VALUE_TYPE (result) == 0)
g_value_init (result,
atk_object_get_role (ATK_OBJECT (value)) ==
ATK_ROLE_SPLIT_PANE ? G_TYPE_INT : G_TYPE_DOUBLE);
if (G_VALUE_HOLDS_INT (result))
g_value_set_int (result, (gint) number);
else
{
g_return_if_fail (G_VALUE_HOLDS_DOUBLE (result));
g_value_set_double (result, number);
}
}
static void
gail_test_value_get_current_value (AtkValue *value,
GValue *result)
{
gdouble number;
atk_value_get_value_and_text (value, &number, NULL);
gail_test_value_store_number (value, result, number);
}
static void
gail_test_value_get_limit (AtkValue *value,
GValue *result,
gboolean upper)
{
AtkRange *range;
gdouble number;
range = atk_value_get_range (value);
g_return_if_fail (range != NULL);
if (upper)
number = atk_range_get_upper_limit (range);
else
number = atk_range_get_lower_limit (range);
atk_range_free (range);
gail_test_value_store_number (value, result, number);
}
#define gail_test_value_get_minimum_value(value, result) \
gail_test_value_get_limit ((value), (result), FALSE)
#define gail_test_value_get_maximum_value(value, result) \
gail_test_value_get_limit ((value), (result), TRUE)
#define GAIL_TEST_VALUE_NUMBER(value) \
(G_VALUE_HOLDS_INT (value) \
? (gdouble) g_value_get_int (value) \
: g_value_get_double (value))
#define gail_test_value_set_current_value(value, new_value) \
(atk_value_set_value ((value), \
GAIL_TEST_VALUE_NUMBER (new_value)), \
TRUE)
#else
#define GAIL_TEST_VALUE_IFACE(value) \
ATK_VALUE_GET_IFACE (value)
#define gail_test_value_get_current_value(value, result) \
(GAIL_TEST_VALUE_IFACE (value)->get_current_value ( \
(value), (result)))
#define gail_test_value_get_minimum_value(value, result) \
(GAIL_TEST_VALUE_IFACE (value)->get_minimum_value ( \
(value), (result)))
#define gail_test_value_get_maximum_value(value, result) \
(GAIL_TEST_VALUE_IFACE (value)->get_maximum_value ( \
(value), (result)))
#define gail_test_value_set_current_value(value, new_value) \
(GAIL_TEST_VALUE_IFACE (value)->set_current_value ( \
(value), (new_value)))
#endif
#endif /* __GAIL_TEST_VALUE_H__ */

View file

@ -1,6 +1,7 @@
#include <string.h> #include <string.h>
#include <atk/atk.h> #include <atk/atk.h>
#include <gtk/gtk.h> #include <gtk/gtk.h>
#include "testvalue.h"
static void _traverse_children (AtkObject *obj); static void _traverse_children (AtkObject *obj);
static void _add_handler (AtkObject *obj); static void _add_handler (AtkObject *obj);
@ -14,8 +15,8 @@ static void _value_change_handler (AtkObject *obj,
AtkPropertyValues *values) AtkPropertyValues *values)
{ {
const gchar *type_name = g_type_name (G_TYPE_FROM_INSTANCE (obj)); const gchar *type_name = g_type_name (G_TYPE_FROM_INSTANCE (obj));
GValue *value_back, val; GValue val = { 0, };
GValue *value_back;
value_back = &val; value_back = &val;
if (!ATK_IS_VALUE (obj)) { if (!ATK_IS_VALUE (obj)) {
@ -33,17 +34,17 @@ static void _value_change_handler (AtkObject *obj,
g_print("Now calling the AtkValue interface functions\n"); g_print("Now calling the AtkValue interface functions\n");
atk_value_get_current_value (ATK_VALUE(obj), value_back); gail_test_value_get_current_value (ATK_VALUE(obj), value_back);
g_return_if_fail (G_VALUE_HOLDS_DOUBLE (value_back)); g_return_if_fail (G_VALUE_HOLDS_DOUBLE (value_back));
g_print ("atk_value_get_current_value returns %f\n", g_print ("atk_value_get_current_value returns %f\n",
g_value_get_double (value_back) ); g_value_get_double (value_back) );
atk_value_get_maximum_value (ATK_VALUE (obj), value_back); gail_test_value_get_maximum_value (ATK_VALUE (obj), value_back);
g_return_if_fail (G_VALUE_HOLDS_DOUBLE (value_back)); g_return_if_fail (G_VALUE_HOLDS_DOUBLE (value_back));
g_print ("atk_value_get_maximum returns %f\n", g_print ("atk_value_get_maximum returns %f\n",
g_value_get_double (value_back)); g_value_get_double (value_back));
atk_value_get_minimum_value (ATK_VALUE (obj), value_back); gail_test_value_get_minimum_value (ATK_VALUE (obj), value_back);
g_return_if_fail (G_VALUE_HOLDS_DOUBLE (value_back)); g_return_if_fail (G_VALUE_HOLDS_DOUBLE (value_back));
g_print ("atk_value_get_minimum returns %f\n", g_print ("atk_value_get_minimum returns %f\n",
g_value_get_double (value_back)); g_value_get_double (value_back));
@ -103,7 +104,8 @@ static void _add_handler (AtkObject *obj)
static void _set_values (AtkObject *obj) { static void _set_values (AtkObject *obj) {
GValue *value_back, val; GValue val = { 0, };
GValue *value_back;
static gint count = 0; static gint count = 0;
gdouble double_value; gdouble double_value;
@ -125,7 +127,7 @@ static void _set_values (AtkObject *obj) {
text = "5.7"; text = "5.7";
atk_editable_text_set_text_contents(ATK_EDITABLE_TEXT(obj),text); atk_editable_text_set_text_contents(ATK_EDITABLE_TEXT(obj),text);
g_print("Set text to %s\n",text); g_print("Set text to %s\n",text);
atk_value_get_current_value(ATK_VALUE(obj), value_back); gail_test_value_get_current_value(ATK_VALUE(obj), value_back);
g_return_if_fail (G_VALUE_HOLDS_DOUBLE (value_back)); g_return_if_fail (G_VALUE_HOLDS_DOUBLE (value_back));
g_print("atk_value_get_current_value returns %f\n", g_print("atk_value_get_current_value returns %f\n",
g_value_get_double( value_back)); g_value_get_double( value_back));
@ -134,7 +136,7 @@ static void _set_values (AtkObject *obj) {
memset (value_back, 0, sizeof (GValue)); memset (value_back, 0, sizeof (GValue));
g_value_init (value_back, G_TYPE_DOUBLE); g_value_init (value_back, G_TYPE_DOUBLE);
g_value_set_double (value_back, 10.0); g_value_set_double (value_back, 10.0);
if (atk_value_set_current_value (ATK_VALUE (obj), value_back)) if (gail_test_value_set_current_value (ATK_VALUE (obj), value_back))
{ {
double_value = g_value_get_double (value_back); double_value = g_value_get_double (value_back);
g_print("atk_value_set_current_value returns %f\n", g_print("atk_value_set_current_value returns %f\n",