#include <cspi/spi-private.h>
+static void
+svalue_set_from_float (Accessibility_SValue *sval, float newValue)
+{
+ switch (sval->_d)
+ {
+ case Accessibility_SHORTVAL:
+ sval->_u.val_short = CLAMP (newValue, G_MINSHORT, G_MAXSHORT);
+ break;
+ case Accessibility_USHORTVAL:
+ sval->_u.val_ushort = CLAMP (newValue, 0, G_MAXUSHORT);
+ break;
+ case Accessibility_LONGVAL:
+ sval->_u.val_long = CLAMP (newValue, G_MINLONG, G_MAXLONG);
+ break;
+ case Accessibility_ULONGVAL:
+ sval->_u.val_ulong = CLAMP (newValue, 0, G_MAXULONG);
+ break;
+ case Accessibility_FLOATVAL:
+ sval->_u.val_float = newValue;
+ break;
+ case Accessibility_DOUBLEVAL:
+ sval->_u.val_double = newValue;
+ break;
+ }
+}
+
+
+static float
+svalue_to_float (Accessibility_SValue *sval)
+{
+ float retval = 0.0;
+ switch (sval->_d)
+ {
+ case Accessibility_SHORTVAL:
+ retval = sval->_u.val_short;
+ break;
+ case Accessibility_USHORTVAL:
+ retval = sval->_u.val_ushort;
+ break;
+ case Accessibility_LONGVAL:
+ retval = sval->_u.val_long;
+ break;
+ case Accessibility_ULONGVAL:
+ retval = sval->_u.val_ulong;
+ break;
+ case Accessibility_FLOATVAL:
+ retval = sval->_u.val_float;
+ break;
+ case Accessibility_DOUBLEVAL:
+ retval = sval->_u.val_double;
+ break;
+ }
+
+ return retval;
+}
+
+
/**
* AccessibleValue_ref:
* @obj: a pointer to the #AccessibleValue implementor on which to operate.
float
AccessibleValue_getMinimumValue (AccessibleValue *obj)
{
- float retval;
+ Accessibility_SValue sval;
cspi_return_val_if_fail (obj != NULL, 0.0);
- retval =
+ sval =
Accessibility_Value__get_minimumValue (CSPI_OBJREF (obj), cspi_ev ());
-
+
cspi_return_val_if_ev ("getMinimumValue", 0.0);
- return retval;
+ return svalue_to_float (&sval);
}
/**
float
AccessibleValue_getCurrentValue (AccessibleValue *obj)
{
- float retval;
+ Accessibility_SValue sval;
cspi_return_val_if_fail (obj != NULL, 0.0);
- retval =
+ sval =
Accessibility_Value__get_currentValue (CSPI_OBJREF (obj), cspi_ev ());
cspi_return_val_if_ev ("getCurrentValue", 0.0);
- return retval;
+ return svalue_to_float (&sval);
}
/**
float
AccessibleValue_getMaximumValue (AccessibleValue *obj)
{
- float retval;
+ Accessibility_SValue sval;
cspi_return_val_if_fail (obj != NULL, 0.0);
- retval =
+ sval =
Accessibility_Value__get_maximumValue (CSPI_OBJREF (obj), cspi_ev ());
cspi_return_val_if_ev ("getMaximumValue", 0.0);
- return retval;
+ return svalue_to_float (&sval);
}
/**
AccessibleValue_setCurrentValue (AccessibleValue *obj,
float newValue)
{
+ Accessibility_SValue sval;
cspi_return_val_if_fail (obj != NULL, FALSE);
+ /* erk, this is ugly */
+ sval = Accessibility_Value__get_currentValue (
+ CSPI_OBJREF (obj), cspi_ev ());
+
+ svalue_set_from_float (&sval, newValue);
+
Accessibility_Value__set_currentValue (
- CSPI_OBJREF (obj), (CORBA_float) newValue, cspi_ev ());
+ CSPI_OBJREF (obj), &sval, cspi_ev ());
cspi_return_val_if_ev ("setCurrentValue", FALSE);
/* Static function declarations */
+static Accessibility_SValue
+gvalue_to_svalue (GValue *gvalue);
static void
spi_value_class_init (SpiValueClass *klass);
static void
spi_value_init (SpiValue *value);
-static CORBA_float
+static Accessibility_SValue
impl__get_minimumValue (PortableServer_Servant _servant,
- CORBA_Environment * ev);
-static CORBA_float
+ CORBA_Environment * ev);
+static Accessibility_SValue
impl__get_maximumValue (PortableServer_Servant _servant,
- CORBA_Environment * ev);
-static CORBA_float
+ CORBA_Environment * ev);
+static Accessibility_SValue
impl__get_currentValue (PortableServer_Servant _servant,
- CORBA_Environment * ev);
+ CORBA_Environment * ev);
static void
-impl__set_currentValue (PortableServer_Servant _servant,
- const CORBA_float value,
- CORBA_Environment * ev);
+impl__set_currentValue (PortableServer_Servant _servant,
+ const Accessibility_SValue * value,
+ CORBA_Environment * ev);
BONOBO_TYPE_FUNC_FULL (SpiValue,
return ATK_VALUE (object->atko);
}
+static Accessibility_SValue
+gvalue_to_svalue (GValue *gvalue)
+{
+ Accessibility_SValue sval;
+ if (G_VALUE_HOLDS_DOUBLE (gvalue))
+ {
+ sval._d = Accessibility_DOUBLEVAL;
+ sval._u.val_double = g_value_get_double (gvalue);
+ }
+ else if (G_VALUE_HOLDS_FLOAT (gvalue))
+ {
+ sval._d = Accessibility_FLOATVAL;
+ sval._u.val_float = g_value_get_float (gvalue);
+ }
+ else if (G_VALUE_HOLDS_ULONG (gvalue))
+ {
+ sval._d = Accessibility_ULONGVAL;
+ sval._u.val_ulong = g_value_get_ulong (gvalue);
+ }
+ else if (G_VALUE_HOLDS_LONG (gvalue))
+ {
+ sval._d = Accessibility_LONGVAL;
+ sval._u.val_long = g_value_get_long (gvalue);
+ }
+ else if (G_VALUE_HOLDS_UINT (gvalue))
+ {
+ sval._d = Accessibility_USHORTVAL;
+ sval._u.val_ushort = CLAMP (g_value_get_uint (gvalue), 0, G_MAXUSHORT);
+ }
+ else if (G_VALUE_HOLDS_INT (gvalue))
+ {
+ sval._d = Accessibility_SHORTVAL;
+ sval._u.val_short = CLAMP (g_value_get_int (gvalue), G_MINSHORT, G_MAXSHORT);
+ }
+ else
+ {
+ sval._d = Accessibility_SHORTVAL;
+ sval._u.val_short = 0;
+ }
+ return sval;
+}
+
+static void
+gvalue_set_from_svalue (GValue *gvalue, Accessibility_SValue *sval)
+{
+ switch (sval->_d)
+ {
+ case Accessibility_DOUBLEVAL:
+ g_value_init (gvalue, G_TYPE_DOUBLE);
+ g_value_set_double (gvalue, sval->_u.val_double);
+ break;
+ case Accessibility_FLOATVAL:
+ g_value_init (gvalue, G_TYPE_FLOAT);
+ g_value_set_float (gvalue, sval->_u.val_float);
+ break;
+ case Accessibility_ULONGVAL:
+ g_value_init (gvalue, G_TYPE_ULONG);
+ g_value_set_ulong (gvalue, sval->_u.val_ulong);
+ break;
+ case Accessibility_LONGVAL:
+ g_value_init (gvalue, G_TYPE_LONG);
+ g_value_set_long (gvalue, sval->_u.val_long);
+ break;
+ case Accessibility_USHORTVAL:
+ g_value_init (gvalue, G_TYPE_UINT);
+ g_value_set_uint (gvalue, sval->_u.val_ushort);
+ break;
+ case Accessibility_SHORTVAL:
+ g_value_init (gvalue, G_TYPE_INT);
+ g_value_set_int (gvalue, sval->_u.val_short);
+ break;
+ default:
+ g_value_init (gvalue, G_TYPE_INT);
+ g_value_set_int (gvalue, 0);
+ }
+}
-static CORBA_float
+static Accessibility_SValue
impl__get_minimumValue (PortableServer_Servant servant,
CORBA_Environment *ev)
{
GValue gvalue = {0, };
AtkValue *value = get_value_from_servant (servant);
- g_return_val_if_fail (value != NULL, 0.0);
-
- /*
- * FIXME: ahem, there's no guarantee that
- * atk_value_get_minimum_value returns a float.
- * What we really need is a generic value API here
- */
+ g_return_val_if_fail (value != NULL, gvalue_to_svalue (&gvalue));
g_value_init (&gvalue, G_TYPE_DOUBLE);
atk_value_get_minimum_value (value, &gvalue);
- return (CORBA_float) g_value_get_double (&gvalue);
+ return gvalue_to_svalue (&gvalue);
}
-static CORBA_float
+static Accessibility_SValue
impl__get_maximumValue (PortableServer_Servant servant,
CORBA_Environment *ev)
{
GValue gvalue = {0, };
AtkValue *value = get_value_from_servant (servant);
- g_return_val_if_fail (value != NULL, 0.0);
+ g_return_val_if_fail (value != NULL, gvalue_to_svalue (&gvalue));
g_value_init (&gvalue, G_TYPE_DOUBLE);
atk_value_get_maximum_value (value, &gvalue);
- return (CORBA_float) g_value_get_double (&gvalue);
+ return gvalue_to_svalue (&gvalue);
}
-static CORBA_float
+static Accessibility_SValue
impl__get_currentValue (PortableServer_Servant servant,
CORBA_Environment *ev)
{
GValue gvalue = {0, };
AtkValue *value = get_value_from_servant (servant);
- g_return_val_if_fail (value != NULL, 0.0);
+ g_return_val_if_fail (value != NULL, gvalue_to_svalue (&gvalue));
g_value_init (&gvalue, G_TYPE_DOUBLE);
atk_value_get_current_value (value, &gvalue);
- return (CORBA_float) g_value_get_double (&gvalue);
+ return gvalue_to_svalue (&gvalue);
}
static void
impl__set_currentValue (PortableServer_Servant servant,
- const CORBA_float value,
+ const Accessibility_SValue *value,
CORBA_Environment *ev)
{
GValue gvalue = {0, };
g_return_if_fail (avalue != NULL);
- g_value_init (&gvalue, G_TYPE_DOUBLE);
- g_value_set_double (&gvalue, (gdouble) value);
+ gvalue_set_from_svalue (&gvalue, value);
atk_value_set_current_value (avalue, &gvalue);
}