Reverted Value interface since the new union was more complicated than necessary.
authorbillh <billh@e2bd861d-eb25-0410-b326-f6ed22b6b98c>
Wed, 12 Dec 2001 00:28:53 +0000 (00:28 +0000)
committerbillh <billh@e2bd861d-eb25-0410-b326-f6ed22b6b98c>
Wed, 12 Dec 2001 00:28:53 +0000 (00:28 +0000)
Changed API for roles, notably change Accessible_getRole to return an enum, and
Accessible_getRoleName to return a (reliable) string.
Changed signatures of AccessibleValue to use doubles in place of floats.
PLEASE NOTE these modification represent API changes to to at-spi/cspi.

git-svn-id: http://svn.gnome.org/svn/at-spi/trunk@181 e2bd861d-eb25-0410-b326-f6ed22b6b98c

13 files changed:
ChangeLog
cspi/spi-roletypes.h
cspi/spi.h
cspi/spi_accessible.c
cspi/spi_value.c
docs/reference/cspi/tmpl/spi_registry.sgml
idl/Accessibility_Accessible.idl
idl/Accessibility_Role.idl
idl/Accessibility_Value.idl
libspi/accessible.c
libspi/value.c
test/simple-at.c
test/test-simple.c

index 0b0bba2..f60d21b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,7 +1,40 @@
-2001-12-11  Bill Haneman <bill.haneman@sun.com>
+2001-12-12  Bill Haneman <bill.haneman@sun.com>
+
+       * idl/Accessibility_Value.idl:
+       Revert use of union back to CORBA_double, since the double type is
+       more efficient and can contain the other types without loss of
+       precision.
+
+       * idl/Accessibility_Accessible.idl:
+       Added method Accessibility:Accessible:getRoleName, to complement
+       Accessibility:Accessible:getRole.
+
+       * cspi/spi_accessible.c:
+       * cspi/spi.h:
+       Added C binding for above, Accessible_getRoleName (), and changed
+       signature of Accessible_getRole () to return an AccessibleRole.
+
+       * cspi/spi-roletypes.h:
+       Changed AccessibleRole_getName to return a char * instead of a
+       const char *.  This method is now at least temporarily deprecated 
+       in favor of asking Accessibles for their RoleNames directly.
 
+       * libspi/value.c:
+       Revert to match Accessibility_Value.idl;
+
+       * cspi/spi_value.c:
+       * cspi/spi.h:
+       Change signature of AccessibleValue methods to use double rather
+       than float.
+
+       * cspi/spi.h:
+       * cspi/spi_accessible.c:
+       Changed Accessible_getRole to return an AccessibleRole enum rather
+       than a UTF-8 string.  The UTF-8 string can still be obtained via
+       AccessibleRole_getName ().
+       
        * test/test-simple.c:
-       Add test_action.
+       Add test_action.  Small fixup to match API change to Accessible_getRole.
 
        * libspi/action.c:
        Bugfix for get_action_from_servant ().
index 76b75be..d83ba90 100644 (file)
@@ -146,7 +146,7 @@ typedef enum
   SPI_ROLE_LAST_DEFINED
 } AccessibleRole;
 
-const char* AccessibleRole_getName (AccessibleRole role);
+char* AccessibleRole_getName (AccessibleRole role);
 
 #ifdef  __cplusplus
 }
index 574e669..20ca00d 100644 (file)
@@ -197,7 +197,8 @@ Accessible *         Accessible_getChildAtIndex  (Accessible *obj,
                                                  long int    childIndex);
 long                 Accessible_getIndexInParent (Accessible *obj);
 AccessibleRelation **Accessible_getRelationSet   (Accessible *obj);
-const char *         Accessible_getRole          (Accessible *obj);
+AccessibleRole       Accessible_getRole          (Accessible *obj);
+char *               Accessible_getRoleName      (Accessible *obj);
 AccessibleStateSet * Accessible_getStateSet      (Accessible *obj);
 
 /* Interface query methods */
@@ -688,11 +689,11 @@ AccessibleText_setSelection (AccessibleText *obj,
 
 void       AccessibleValue_ref             (AccessibleValue *obj);
 void       AccessibleValue_unref           (AccessibleValue *obj);
-float      AccessibleValue_getMinimumValue (AccessibleValue *obj);
-float      AccessibleValue_getCurrentValue (AccessibleValue *obj);
-float      AccessibleValue_getMaximumValue (AccessibleValue *obj);
+double     AccessibleValue_getMinimumValue (AccessibleValue *obj);
+double     AccessibleValue_getCurrentValue (AccessibleValue *obj);
+double     AccessibleValue_getMaximumValue (AccessibleValue *obj);
 SPIBoolean AccessibleValue_setCurrentValue (AccessibleValue *obj,
-                                           float            newValue);
+                                           double           newValue);
 
 /* Misc methods */
 void SPI_freeString (char *s);
index e8c1f9c..f84bc65 100644 (file)
@@ -82,24 +82,21 @@ static const char *role_names [] =
  * @role: an #AccessibleRole object to query.
  *
  * Get a localizeable string that indicates the name of an #AccessibleRole.
+ * Currently broken, do not use.
  *
  * Returns: a localizable string name for an #AccessibleRole enumerated type.
  **/
-const char *
+char *
 AccessibleRole_getName (AccessibleRole role)
 {
   if (role < MAX_ROLES)
     {
-      return role_names [(int) role];
+      return g_strdup (role_names [(int) role]);
     }
   else
     {
-      return "";
+      return g_strdup ("");
     }
-  /*
-   * TODO: replace with implementation linked to ATK, which
-   *  now supports Role/Name mapping
-   */
 }
 
 /**
@@ -321,21 +318,48 @@ Accessible_getRelationSet (Accessible *obj)
  * @obj: a pointer to the #Accessible object on which to operate.
  *
  * Get the UI role of an #Accessible object.
+ * A UTF-8 string describing this role can be obtained via Accessible_getRoleName ().
  *
- * Returns: a UTF-8 string indicating the UI role of the #Accessible object.
+ * Returns: the #AccessibleRole of the object.
  *
  **/
-const char *
+AccessibleRole
 Accessible_getRole (Accessible *obj)
 {
-  const char *retval;
+  AccessibleRole retval;
 
-  cspi_return_val_if_fail (obj != NULL, NULL);
+  cspi_return_val_if_fail (obj != NULL, SPI_ROLE_INVALID);
+
+  retval = 
+    Accessibility_Accessible_getRole (CSPI_OBJREF (obj), cspi_ev ());
+
+  cspi_return_val_if_ev ("getRole", SPI_ROLE_INVALID); 
+
+  return retval;
+}
+
+/**
+ * Accessible_getRoleName:
+ * @obj: a pointer to the #Accessible object on which to operate.
+ *
+ * Get a UTF-8 string describing the role this object plays in the UI.
+ * This method will return useful values for roles that fall outside the
+ * enumeration used in Accessible_getRole ().
+ *
+ * Returns: a UTF-8 string specifying the role of this #Accessible object.
+ *
+ **/
+char *
+Accessible_getRoleName (Accessible *obj)
+{
+  char *retval;
+
+  cspi_return_val_if_fail (obj != NULL, CORBA_string_dup ("invalid"));
 
-  retval = AccessibleRole_getName (
-    Accessibility_Accessible_getRole (CSPI_OBJREF (obj), cspi_ev ()));
+  retval = 
+    Accessibility_Accessible_getRoleName (CSPI_OBJREF (obj), cspi_ev ());
 
-  cspi_return_val_if_ev ("getRole", NULL); 
+  cspi_return_val_if_ev ("getRoleName", CORBA_string_dup ("invalid")); 
 
   return retval;
 }
index 13a1f84..9e35db6 100644 (file)
@@ -1,62 +1,5 @@
 #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.
@@ -90,19 +33,19 @@ AccessibleValue_unref (AccessibleValue *obj)
  * Returns: the minimum allowed value for this object.
  *
  **/
-float
+double
 AccessibleValue_getMinimumValue (AccessibleValue *obj)
 {
-  Accessibility_SValue sval;
+  double retval;
 
   cspi_return_val_if_fail (obj != NULL, 0.0);
 
-  sval = 
+  retval = 
     Accessibility_Value__get_minimumValue (CSPI_OBJREF (obj), cspi_ev ());
   
   cspi_return_val_if_ev ("getMinimumValue", 0.0);
 
-  return svalue_to_float (&sval);
+  return retval;
 }
 
 /**
@@ -113,19 +56,19 @@ AccessibleValue_getMinimumValue (AccessibleValue *obj)
  *
  * Returns: the current value for this object.
  **/
-float
+double
 AccessibleValue_getCurrentValue (AccessibleValue *obj)
 {
-  Accessibility_SValue sval;
+  double retval;
 
   cspi_return_val_if_fail (obj != NULL, 0.0);
 
-  sval =
+  retval =
     Accessibility_Value__get_currentValue (CSPI_OBJREF (obj), cspi_ev ());
 
   cspi_return_val_if_ev ("getCurrentValue", 0.0);
 
-  return svalue_to_float (&sval);
+  return retval;
 }
 
 /**
@@ -136,19 +79,18 @@ AccessibleValue_getCurrentValue (AccessibleValue *obj)
  *
  * Returns: the maximum allowed value for this object.
  **/
-float
+double
 AccessibleValue_getMaximumValue (AccessibleValue *obj)
 {
-  Accessibility_SValue sval;
-
+  double retval;       
   cspi_return_val_if_fail (obj != NULL, 0.0);
 
-  sval =
+  retval =
     Accessibility_Value__get_maximumValue (CSPI_OBJREF (obj), cspi_ev ());
 
   cspi_return_val_if_ev ("getMaximumValue", 0.0);
 
-  return svalue_to_float (&sval);
+  return retval;
 }
 
 /**
@@ -163,19 +105,12 @@ AccessibleValue_getMaximumValue (AccessibleValue *obj)
  **/
 SPIBoolean
 AccessibleValue_setCurrentValue (AccessibleValue *obj,
-                                 float newValue)
+                                 double 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), &sval, cspi_ev ());
+    CSPI_OBJREF (obj), newValue, cspi_ev ());
 
   cspi_return_val_if_ev ("setCurrentValue", FALSE);
 
index 7c74b06..4daa02e 100644 (file)
@@ -139,6 +139,7 @@ Registry queries
 @modmask: 
 @eventmask: 
 @sync_type: 
+@Returns: 
 
 
 <!-- ##### FUNCTION deregisterAccessibleKeystrokeListener ##### -->
@@ -148,6 +149,7 @@ Registry queries
 
 @listener: 
 @modmask: 
+@Returns: 
 
 
 <!-- ##### FUNCTION AccessibleKeystrokeListener_removeCallback ##### -->
@@ -178,6 +180,7 @@ Registry queries
 
 @keyval: 
 @synth_type: 
+@Returns: 
 
 
 <!-- ##### FUNCTION generateMouseEvent ##### -->
@@ -188,5 +191,6 @@ Registry queries
 @x: 
 @y: 
 @name: 
+@Returns: 
 
 
index 6aed266..d3e7e40 100644 (file)
@@ -110,6 +110,14 @@ module Accessibility {
     Role               getRole ();
 
     /**
+     * getRoleName:
+     * Get a string indicating the type of UI role played by this object.
+     *
+     * Returns: a UTF-8 string indicating the type of UI role played by this object.
+     **/
+    string             getRoleName ();
+
+    /**
      * getState:
      *
      * Get the current state of the object as a @StateSet.
index 8977c2c..f7844dd 100644 (file)
@@ -200,6 +200,11 @@ module Accessibility {
   ROLE_VIEWPORT,
   /* A top level window with no title or border */
   ROLE_WINDOW,
+  /* 
+   * means that the role for this item is known, but not included in the 
+   * core enumeration 
+   */
+  ROLE_EXTENDED,
   /* not a valid role, used for finding end of enumeration. */
   ROLE_LAST_DEFINED
   };
index aa18fce..9c24e7a 100644 (file)
 
 module Accessibility {
 
-  enum ValueType {
-         SHORTVAL, 
-         USHORTVAL,
-         LONGVAL,
-         ULONGVAL,
-         FLOATVAL,
-         DOUBLEVAL
-  };
-
-  union SValue switch (ValueType) {
-         case Accessibility::SHORTVAL:  short val_short;
-         case Accessibility::USHORTVAL: unsigned short val_ushort;
-         case Accessibility::LONGVAL:   long val_long;
-         case Accessibility::ULONGVAL:  unsigned long val_ulong;
-         case Accessibility::FLOATVAL:  float val_float;
-         case Accessibility::DOUBLEVAL: double val_double;
-  };
-
   interface Value : Bonobo::Unknown {
-    readonly attribute SValue minimumValue;
-    readonly attribute SValue maximumValue;
-    readonly attribute SValue minimumIncrement;
-    attribute SValue currentValue;
+    readonly attribute double minimumValue;
+    readonly attribute double maximumValue;
+    readonly attribute double minimumIncrement;
+    attribute double currentValue;
   };
 };
index 1148cb0..1d0eb0e 100644 (file)
 /* Our parent Gtk object type  */
 #define PARENT_TYPE SPI_TYPE_BASE
 
+static Accessibility_Role
+spi_role_from_atk_role (AtkRole role)
+{
+  Accessibility_Role spi_role;
+
+  /* TODO: finish and/or make efficient! */
+  switch (role)
+  {
+    case ATK_ROLE_INVALID:
+      spi_role = Accessibility_ROLE_INVALID;
+      break;
+    case ATK_ROLE_ACCEL_LABEL:
+    case ATK_ROLE_ALERT:
+    case ATK_ROLE_ANIMATION: 
+    case ATK_ROLE_ARROW: 
+    case ATK_ROLE_CALENDAR: 
+    case ATK_ROLE_CANVAS:
+    case ATK_ROLE_CHECK_BOX:
+    case ATK_ROLE_CHECK_MENU_ITEM:
+    case ATK_ROLE_COLOR_CHOOSER:
+    case ATK_ROLE_COLUMN_HEADER:
+    case ATK_ROLE_COMBO_BOX:
+    case ATK_ROLE_DATE_EDITOR:
+    case ATK_ROLE_DESKTOP_ICON:
+    case ATK_ROLE_DESKTOP_FRAME:
+    case ATK_ROLE_DIAL:
+    case ATK_ROLE_DIALOG:
+    case ATK_ROLE_DIRECTORY_PANE:
+    case ATK_ROLE_DRAWING_AREA:
+    case ATK_ROLE_FILE_CHOOSER:
+    case ATK_ROLE_FILLER:
+    case ATK_ROLE_FONT_CHOOSER:
+    case ATK_ROLE_FRAME:
+    case ATK_ROLE_GLASS_PANE: 
+    case ATK_ROLE_HTML_CONTAINER: 
+    case ATK_ROLE_ICON: 
+    case ATK_ROLE_IMAGE:
+    case ATK_ROLE_INTERNAL_FRAME:
+    case ATK_ROLE_LABEL:
+    case ATK_ROLE_LAYERED_PANE:
+    case ATK_ROLE_LIST:
+    case ATK_ROLE_LIST_ITEM:
+    case ATK_ROLE_MENU:
+    case ATK_ROLE_MENU_BAR:
+    case ATK_ROLE_MENU_ITEM:
+    case ATK_ROLE_OPTION_PANE:
+    case ATK_ROLE_PAGE_TAB:
+    case ATK_ROLE_PAGE_TAB_LIST:
+    case ATK_ROLE_PANEL:
+    case ATK_ROLE_PASSWORD_TEXT:
+    case ATK_ROLE_POPUP_MENU:
+    case ATK_ROLE_PROGRESS_BAR:
+    case ATK_ROLE_PUSH_BUTTON:
+    case ATK_ROLE_RADIO_BUTTON:
+    case ATK_ROLE_RADIO_MENU_ITEM:
+    case ATK_ROLE_ROOT_PANE:
+    case ATK_ROLE_ROW_HEADER:
+    case ATK_ROLE_SCROLL_BAR:
+    case ATK_ROLE_SCROLL_PANE:
+    case ATK_ROLE_SEPARATOR:
+    case ATK_ROLE_SLIDER:
+    case ATK_ROLE_SPLIT_PANE:
+    case ATK_ROLE_SPIN_BUTTON:
+    case ATK_ROLE_STATUSBAR:
+    case ATK_ROLE_TABLE:
+    case ATK_ROLE_TABLE_CELL:
+    case ATK_ROLE_TABLE_COLUMN_HEADER:
+    case ATK_ROLE_TABLE_ROW_HEADER:
+    case ATK_ROLE_TEAR_OFF_MENU_ITEM:
+    case ATK_ROLE_TERMINAL:
+    case ATK_ROLE_TEXT:
+    case ATK_ROLE_TOGGLE_BUTTON:
+    case ATK_ROLE_TOOL_BAR:
+    case ATK_ROLE_TOOL_TIP:
+    case ATK_ROLE_TREE:
+    case ATK_ROLE_TREE_TABLE:
+    case ATK_ROLE_UNKNOWN:
+    case ATK_ROLE_VIEWPORT:
+    case ATK_ROLE_WINDOW:
+    case ATK_ROLE_LAST_DEFINED:
+    default:
+      spi_role = Accessibility_ROLE_EXTENDED;      
+  }
+  return spi_role;
+}
+
 static AtkObject *
 get_accessible_from_servant (PortableServer_Servant servant)
 {
@@ -256,11 +342,29 @@ impl_accessibility_accessible_get_role (PortableServer_Servant servant,
   g_return_val_if_fail (object != NULL, 0);
 
   role = atk_object_get_role (object);
-  retval = role; /* FIXME: relies on ability to cast these back and forth */
+  retval = spi_role_from_atk_role (role);
 
   return retval;
 }
 
+/*
+ * CORBA Accessibility::Accessible::getRole method implementation
+ */
+static CORBA_char *
+impl_accessibility_accessible_get_role_name (PortableServer_Servant servant,
+                                            CORBA_Environment     *ev)
+{
+  AtkRole            role;
+  Accessibility_Role retval;
+  AtkObject         *object = get_accessible_from_servant (servant);
+
+  g_return_val_if_fail (object != NULL, 0);
+
+  role = atk_object_get_role (object);
+
+  return CORBA_string_dup (atk_role_get_name (role));
+}
+
 static void
 spi_accessible_class_init (SpiAccessibleClass *klass)
 {
@@ -279,6 +383,7 @@ spi_accessible_class_init (SpiAccessibleClass *klass)
         epv->getRelationSet = impl_accessibility_accessible_get_relation_set;
         epv->getState = impl_accessibility_accessible_get_state;
         epv->getRole = impl_accessibility_accessible_get_role;
+        epv->getRoleName = impl_accessibility_accessible_get_role_name;
 }
 
 static void
index fcd0a20..e576486 100644 (file)
 
 /* Static function declarations */
 
-static Accessibility_SValue
-gvalue_to_svalue (GValue *gvalue);
+static double
+get_double_from_gvalue (GValue *gvalue);
+static void
+gvalue_set_from_double (GValue *gvalue, double value);
 static void
 spi_value_class_init (SpiValueClass *klass);
 static void
 spi_value_init (SpiValue *value);
-static Accessibility_SValue
+static double
 impl__get_minimumValue (PortableServer_Servant _servant,
                        CORBA_Environment *    ev);
-static Accessibility_SValue
+static double
 impl__get_maximumValue (PortableServer_Servant _servant,
                        CORBA_Environment *    ev);
-static Accessibility_SValue
+static double
 impl__get_currentValue (PortableServer_Servant _servant,
                        CORBA_Environment *    ev);
 static void 
-impl__set_currentValue (PortableServer_Servant       _servant,
-                       const Accessibility_SValue * value,
-                       CORBA_Environment *          ev);
+impl__set_currentValue (PortableServer_Servant _servant,
+                       const CORBA_double     value,
+                       CORBA_Environment *    ev);
 
 
 BONOBO_TYPE_FUNC_FULL (SpiValue,
@@ -100,142 +102,149 @@ get_value_from_servant (PortableServer_Servant servant)
   return ATK_VALUE (object->atko);
 }
 
-static Accessibility_SValue
-gvalue_to_svalue (GValue *gvalue)
+static double
+get_double_from_gvalue (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);
-  }
+  double       retval = 0;
+  if (G_TYPE_IS_FUNDAMENTAL (G_VALUE_TYPE (gvalue)))
+    {
+      switch (gvalue->g_type)
+        {
+         case G_TYPE_DOUBLE:
+            retval = g_value_get_double (gvalue);
+           break;
+         case G_TYPE_FLOAT:
+            retval = g_value_get_float (gvalue);
+           break;
+         case G_TYPE_ULONG:
+            retval = g_value_get_ulong (gvalue);
+           break;
+         case G_TYPE_LONG:
+            retval = g_value_get_long (gvalue);
+           break;
+         case G_TYPE_UINT:
+            retval = g_value_get_uint (gvalue);
+           break;
+         case G_TYPE_INT:
+            retval = g_value_get_int (gvalue);
+           break;
+         case G_TYPE_UCHAR:
+            retval = g_value_get_uchar (gvalue);
+           break;
+         case G_TYPE_CHAR:
+            retval = g_value_get_char (gvalue);
+           break;
+         case G_TYPE_BOOLEAN:
+            retval = g_value_get_boolean (gvalue);
+           break;
+        }
+    }
   else
-  {
-      sval._d = Accessibility_SHORTVAL;
-      sval._u.val_short = 0;
-  }
-  return sval;
-}
+    {
+      g_warning ("SpiValue requested from a non-fundamental type\n");      
+    }
+  return retval;
+}  
 
 static void
-gvalue_set_from_svalue (GValue *gvalue, Accessibility_SValue *sval)
+gvalue_set_from_double (GValue *gvalue, double value)
 {
-  switch (sval->_d)
+  if (G_TYPE_IS_FUNDAMENTAL (G_VALUE_TYPE (gvalue)))
     {
-      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);
+      switch (gvalue->g_type)
+        {
+         case G_TYPE_DOUBLE:
+            g_value_set_double (gvalue, value);
+           break;
+         case G_TYPE_FLOAT:
+            g_value_set_float (gvalue, value);
+           break;
+         case G_TYPE_ULONG:
+            g_value_set_ulong (gvalue, value);
+           break;
+         case G_TYPE_LONG:
+            g_value_set_long (gvalue, value);
+           break;
+         case G_TYPE_UINT:
+            g_value_set_uint (gvalue, value);
+           break;
+         case G_TYPE_INT:
+            g_value_set_int (gvalue, value);
+           break;
+         case G_TYPE_UCHAR:
+            g_value_set_uchar (gvalue, value);
+           break;
+         case G_TYPE_CHAR:
+            g_value_set_char (gvalue, value);
+           break;
+         case G_TYPE_BOOLEAN:
+            g_value_set_boolean (gvalue, ((fabs (value) > 0.5) ? 1 : 0));
+           break;
+        }
+    }
+  else
+    {
+      g_warning ("SpiValue change requested for a non-fundamental type\n");        
     }
 }
 
-static Accessibility_SValue
+static double
 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, gvalue_to_svalue (&gvalue));
+  g_return_val_if_fail (value != NULL, 0.0);
 
-  g_value_init (&gvalue, G_TYPE_DOUBLE);
   atk_value_get_minimum_value (value, &gvalue);
 
-  return gvalue_to_svalue (&gvalue);
+  return get_double_from_gvalue (&gvalue);
 }
 
 
-static Accessibility_SValue
+static double
 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, gvalue_to_svalue (&gvalue));
+  g_return_val_if_fail (value != NULL, 0.0);
 
-  g_value_init (&gvalue, G_TYPE_DOUBLE);
   atk_value_get_maximum_value (value, &gvalue);
 
-  return gvalue_to_svalue (&gvalue);
+  return get_double_from_gvalue (&gvalue);
 }
 
 
-static Accessibility_SValue
+static double
 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, gvalue_to_svalue (&gvalue));
+  g_return_val_if_fail (value != NULL, 0.0);
 
-  g_value_init (&gvalue, G_TYPE_DOUBLE);
   atk_value_get_current_value (value, &gvalue);
 
-  return gvalue_to_svalue (&gvalue);
+  return get_double_from_gvalue (&gvalue);
 }
 
 
 static void 
 impl__set_currentValue (PortableServer_Servant servant,
-                       const Accessibility_SValue *value,
+                       const CORBA_double     value,
                        CORBA_Environment     *ev)
 {
-  GValue    gvalue = {0, };
+  GValue    gvalue = { 0, };
   AtkValue *avalue = get_value_from_servant (servant);
 
   g_return_if_fail (avalue != NULL);
 
-  gvalue_set_from_svalue (&gvalue, value);
+  atk_value_get_current_value (avalue, &gvalue);
+  gvalue_set_from_double (&gvalue, value);
 
   atk_value_set_current_value (avalue, &gvalue);
 }
index 1e6e511..54ca155 100644 (file)
@@ -183,7 +183,9 @@ report_focussed_accessible (Accessible *obj, SPIBoolean shutup_previous_speech)
     {
       if (festival_chatty)         
         {
-          _festival_say (Accessible_getRole (obj), "voice_don_diphone", shutup_previous_speech);
+         s = Accessible_getRoleName (obj);     
+          _festival_say (s, "voice_don_diphone", shutup_previous_speech);
+         SPI_freeString (s);
         }
       fprintf (stderr, "getting Name\n");
       s = Accessible_getName (obj);
index 59b41e2..eed9448 100644 (file)
@@ -455,10 +455,11 @@ validate_accessible (Accessible *accessible,
                     gboolean    has_parent,
                     gboolean    recurse_down)
 {
-       Accessible *tmp;
-       char       *name, *descr;
-       const char *role;
-       GString    *item_str = g_string_new ("");
+       Accessible    *tmp;
+       char          *name, *descr;
+       AccessibleRole role;
+       char          *role_name;
+       GString       *item_str = g_string_new ("");
 
        name = Accessible_getName (accessible);
        g_assert (name != NULL);
@@ -467,7 +468,10 @@ validate_accessible (Accessible *accessible,
        g_assert (descr != NULL);
 
        role = Accessible_getRole (accessible);
-       g_assert (role != NULL);
+       g_assert (role != SPI_ROLE_INVALID);
+       role_name = Accessible_getRoleName (accessible);
+       g_assert (role_name != NULL);
+       
 
        if (print_tree) {
                int i;
@@ -582,10 +586,11 @@ validate_accessible (Accessible *accessible,
 
        if (print_tree)
                fprintf (stderr, " ] '%s' (%s) - %s: %s\n",
-                        name, descr, role, item_str->str);
+                        name, descr, role_name, item_str->str);
 
        SPI_freeString (name);
        SPI_freeString (descr);
+       SPI_freeString (role_name);
        g_string_free (item_str, TRUE);
 
        validate_tree (accessible, has_parent, recurse_down);