summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Gorse <mgorse@novell.com>2010-10-27 12:37:53 -0400
committerMike Gorse <mgorse@novell.com>2010-10-27 12:37:53 -0400
commit5544649ae7afb697e59ca8e9c2b8694f2a8dea39 (patch)
tree1b78b6e739ba180aa8de36a7b7f3af571a6adb2f
parent5ecfcf986fa6c0016d941c8bbcab4c14d21a0958 (diff)
downloadat-spi2-core-5544649ae7afb697e59ca8e9c2b8694f2a8dea39.tar.gz
Various bug fixes
-rw-r--r--atspi/Makefile.am2
-rw-r--r--atspi/atspi-accessible.c27
-rw-r--r--atspi/atspi-accessible.h11
-rw-r--r--atspi/atspi-application.c57
-rw-r--r--atspi/atspi-application.h57
-rw-r--r--atspi/atspi-misc.c64
-rw-r--r--atspi/atspi-registry.c9
7 files changed, 174 insertions, 53 deletions
diff --git a/atspi/Makefile.am b/atspi/Makefile.am
index ecce49fc..83265fcf 100644
--- a/atspi/Makefile.am
+++ b/atspi/Makefile.am
@@ -15,6 +15,8 @@ libatspi_la_SOURCES = \
atspi.h \
atspi-accessible.c \
atspi-accessible.h \
+ atspi-application.c \
+ atspi-application.h \
atspi-constants.h \
atspi-event-types.h \
atspi-listener.c \
diff --git a/atspi/atspi-accessible.c b/atspi/atspi-accessible.c
index 2a9d0713..f9c6c310 100644
--- a/atspi/atspi-accessible.c
+++ b/atspi/atspi-accessible.c
@@ -31,8 +31,20 @@ atspi_accessible_init (AtspiAccessible *accessible)
}
static void
+atspi_accessible_finalize (AtspiAccessible *accessible)
+{
+ if (accessible->app)
+ g_object_unref (accessible->app);
+
+ g_free (accessible->path);
+}
+
+static void
atspi_accessible_class_init (AtspiAccessibleClass *klass)
{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ object_class->finalize = atspi_accessible_finalize;
}
/* TODO: Generate following from spec? */
static const char *role_names [] =
@@ -229,8 +241,8 @@ atspi_accessible_get_child_count (AtspiAccessible *obj, GError *error)
*
* Get the #AtspiAccessible child of an #AtspiAccessible object at a given index.
*
- * Returns: a pointer to the #AtspiAccessible child object at index
- * @child_index. or NULL on exception
+ * Returns: (transfer full): a pointer to the #AtspiAccessible child object at
+ * index @child_index. or NULL on exception
**/
AtspiAccessible *
atspi_accessible_get_child_at_index (AtspiAccessible *obj,
@@ -392,7 +404,8 @@ atspi_accessible_get_state_set (AtspiAccessible *obj)
* For typographic, textual, or textually-semantic attributes, see
* atspi_text_get_attributes instead.
*
- * Returns: The name-value-pair attributes assigned to this object.
+ * Returns: (transfer full): The name-value-pair attributes assigned to this
+ * object.
*/
GHashTable *
atspi_accessible_get_attributes (AtspiAccessible *obj, GError **error)
@@ -1191,7 +1204,10 @@ cspi_object_destroyed (AtspiAccessible *accessible)
e.type = "object:state-change:defunct";
e.source = accessible;
e.detail1 = 1;
+#if 0
+ g_warning ("atspi: TODO: Finish events");
atspi_dispatch_event (&e);
+#endif
g_free (accessible->path);
@@ -1202,12 +1218,15 @@ cspi_object_destroyed (AtspiAccessible *accessible)
}
AtspiAccessible *
-atspi_accessible_new ()
+atspi_accessible_new (AtspiApplication *app, const gchar *path)
{
AtspiAccessible *accessible;
accessible = g_object_new (ATSPI_TYPE_ACCESSIBLE, NULL);
g_return_val_if_fail (accessible != NULL, NULL);
+ accessible->app = g_object_ref (app);
+ accessible->path = g_strdup (path);
+
return accessible;
}
diff --git a/atspi/atspi-accessible.h b/atspi/atspi-accessible.h
index dce3d5c5..3c0cbd4e 100644
--- a/atspi/atspi-accessible.h
+++ b/atspi/atspi-accessible.h
@@ -27,6 +27,7 @@
#include "glib-object.h"
+#include "atspi-application.h"
#include "atspi-constants.h"
#include "atspi-stateset.h"
@@ -37,14 +38,6 @@
#define ATSPI_IS_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ATSPI_TYPE_ACCESSIBLE))
#define ATSPI_ACCESSIBLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), ATSPI_TYPE_ACCESSIBLE, AtspiAccessibleClass))
-typedef struct _AtspiApplication AtspiApplication;
-struct _AtspiApplication
-{
- GHashTable *hash;
- char *bus_name;
- struct _AtspiAccessible *root;
-};
-
typedef struct _AtspiAccessible AtspiAccessible;
struct _AtspiAccessible
{
@@ -70,7 +63,7 @@ struct _AtspiAccessibleClass
GType atspi_accessible_get_type (void);
AtspiAccessible *
-atspi_accessible_new ();
+atspi_accessible_new (AtspiApplication *app, const gchar *path);
gchar * atspi_role_get_name (AtspiRole role);
diff --git a/atspi/atspi-application.c b/atspi/atspi-application.c
new file mode 100644
index 00000000..c037c4b4
--- /dev/null
+++ b/atspi/atspi-application.c
@@ -0,0 +1,57 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
+ *
+ * Copyright 2001, 2002 Sun Microsystems Inc.,
+ * Copyright 2001, 2002 Ximian, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "atspi-private.h"
+
+G_DEFINE_TYPE (AtspiApplication, atspi_application, G_TYPE_OBJECT)
+
+static void
+atspi_application_init (AtspiApplication *application)
+{
+}
+
+static void
+atspi_application_finalize (AtspiApplication *application)
+{
+ if (application->bus_name)
+ g_free (application->bus_name);
+}
+
+static void
+atspi_application_class_init (AtspiApplicationClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ object_class->finalize = atspi_application_finalize;
+}
+
+AtspiApplication *
+_atspi_application_new (const gchar *bus_name)
+{
+ AtspiApplication *application;
+
+ application = g_object_new (ATSPI_TYPE_APPLICATION, NULL);
+ if (application)
+ application->bus_name = g_strdup (bus_name);
+ return application;
+}
diff --git a/atspi/atspi-application.h b/atspi/atspi-application.h
new file mode 100644
index 00000000..be3d4e1a
--- /dev/null
+++ b/atspi/atspi-application.h
@@ -0,0 +1,57 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
+ *
+ * Copyright 2002 Ximian, Inc.
+ * 2002 Sun Microsystems Inc.
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef _ATSPI_APPLICATION_H_
+#define _ATSPI_APPLICATION_H_
+
+#include "glib-object.h"
+
+#include "atspi-accessible.h"
+
+#define ATSPI_TYPE_APPLICATION (atspi_application_get_type ())
+#define ATSPI_APPLICATION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ATSPI_TYPE_APPLICATION, AtspiAccessible))
+#define ATSPI_APPLICATION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ATSPI_TYPE_APPLICATION, AtspiAccessibleClass))
+#define ATSPI_IS_APPLICATION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATSPI_TYPE_APPLICATION))
+#define ATSPI_IS_APPLICATION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ATSPI_TYPE_APPLICATION))
+#define ATSPI_APPLICATION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), ATSPI_TYPE_APPLICATION, AtspiAccessibleClass))
+
+typedef struct _AtspiApplication AtspiApplication;
+struct _AtspiApplication
+{
+ GObject parent;
+ GHashTable *hash;
+ char *bus_name;
+ struct _AtspiAccessible *root;
+};
+
+typedef struct _AtspiApplicationClass AtspiApplicationClass;
+struct _AtspiApplicationClass
+{
+ GObjectClass parent_class;
+};
+
+AtspiApplication *
+_atspi_application_new (const char *bus_name);
+
+#endif /* _ATSPI_APPLICATION_H_ */
diff --git a/atspi/atspi-misc.c b/atspi/atspi-misc.c
index 874d533d..94aae8e8 100644
--- a/atspi/atspi-misc.c
+++ b/atspi/atspi-misc.c
@@ -99,9 +99,12 @@ get_live_refs (void)
return live_refs;
}
+/* TODO: Add an application parameter */
DBusConnection *
_atspi_bus ()
{
+ if (!bus)
+ atspi_init ();
return bus;
}
@@ -140,7 +143,7 @@ get_application (const char *bus_name)
bus_name_dup = g_strdup (bus_name);
if (!bus_name_dup) return NULL;
// TODO: change below to something that will send state-change:defunct notification if necessary */
- app = g_new (AtspiApplication, 1);
+ app = _atspi_application_new (bus_name);
if (!app) return NULL;
app->bus_name = bus_name_dup;
if (APP_IS_REGISTRY (app))
@@ -158,37 +161,29 @@ get_application (const char *bus_name)
static AtspiAccessible *
ref_accessible (const char *app_name, const char *path)
{
- int id;
- guint *id_val;
AtspiApplication *app = get_application (app_name);
AtspiAccessible *a;
if (!strcmp (path, "/org/a11y/atspi/accessible/root"))
- return g_object_ref (app->root);
-
- if (sscanf (path, "/org/a11y/atspi/accessible/%d", &id) != 1)
{
- return NULL;
+ if (!app->root)
+ {
+ app->root = atspi_accessible_new (app, atspi_path_root);
+ app->root->accessible_parent = atspi_get_desktop (0);
+ }
+ return g_object_ref (app->root);
}
- a = g_hash_table_lookup (app->hash, &id);
+ a = g_hash_table_lookup (app->hash, path);
if (a)
{
g_object_ref (a);
return a;
}
- id_val = g_new (guint, 1);
- if (!id_val) return NULL;
- *id_val = id;
- a = atspi_accessible_new ();
+ a = atspi_accessible_new (app, path);
if (!a)
- {
- g_free (id_val);
return NULL;
- }
- a->app = app;
- a->path = g_strdup_printf ("/org/a11y/atspi/accessible/%d", id);
- g_hash_table_insert (app->hash, id_val, a);
+ g_hash_table_insert (app->hash, a->path, a);
g_object_ref (a); /* for the hash */
return a;
}
@@ -233,13 +228,7 @@ handle_remove_accessible (DBusConnection *bus, DBusMessage *message, void *user_
a->accessible_parent->children = g_list_remove (a->accessible_parent->children, a);
g_object_unref (a);
}
- if (sscanf (a->path, "/org/a11y/atspi/accessible/%d", &id) == 1)
- {
- g_warning("atspi: FIX HASH REMOVE");
- g_hash_table_remove (app->hash, id);
- }
- else
- g_warning ("libspi: Strange path %s\n", a->path);
+ g_hash_table_remove (app->hash, app->bus_name);
g_object_unref (a); /* unref our own ref */
return DBUS_HANDLER_RESULT_HANDLED;
}
@@ -277,7 +266,10 @@ send_children_changed (AtspiAccessible *parent, AtspiAccessible *child, gboolean
e.type = (add? "object:children-changed:add": "object:children-changed:remove");
e.source = parent;
e.detail1 = g_list_index (parent->children, child);
+#if 0
+ g_warning ("atspi: TODO: Finish events");
atspi_dispatch_event (&e);
+#endif
}
static void
@@ -289,7 +281,7 @@ unref_object_and_descendants (AtspiAccessible *obj)
{
unref_object_and_descendants (l->data);
}
- g_object_unref_internal (obj, TRUE);
+ g_object_unref (obj);
}
static gboolean
@@ -322,8 +314,9 @@ get_reference_from_iter (DBusMessageIter *iter, const char **app_name, const cha
DBusMessageIter iter_struct;
dbus_message_iter_recurse (iter, &iter_struct);
- dbus_message_iter_get_basic (&iter_struct, &app_name);
- dbus_message_iter_get_basic (&iter_struct, &path);
+ dbus_message_iter_get_basic (&iter_struct, app_name);
+ dbus_message_iter_next (&iter_struct);
+ dbus_message_iter_get_basic (&iter_struct, path);
dbus_message_iter_next (iter);
}
@@ -347,6 +340,9 @@ add_accessible_from_iter (DBusMessageIter *iter)
get_reference_from_iter (&iter_struct, &app_name, &path);
accessible = ref_accessible (app_name, path);
+ /* Get application: TODO */
+ dbus_message_iter_next (&iter_struct);
+
/* get parent */
get_reference_from_iter (&iter_struct, &app_name, &path);
accessible->accessible_parent = ref_accessible (app_name, path);
@@ -378,6 +374,7 @@ add_accessible_from_iter (DBusMessageIter *iter)
g_warning ("Unknown interface %s", iface);
}
else accessible->interfaces |= (1 << n);
+ dbus_message_iter_next (&iter_array);
}
dbus_message_iter_next (&iter_struct);
@@ -426,9 +423,9 @@ add_accessibles (const char *app_name)
AtspiApplication *app = get_application (app_name);
/* TODO: Move this functionality into app initializer? */
dbus_error_init (&error);
- message = dbus_message_new_method_call (app_name, "/org/a11y/atspi/accessible/cache", atspi_interface_cache, "GetItems");
+ message = dbus_message_new_method_call (app_name, "/org/a11y/atspi/cache", atspi_interface_cache, "GetItems");
reply = _atspi_dbus_send_with_reply_and_block (message);
- if (!reply || strcmp (dbus_message_get_signature (reply), "a((so)(so)a(so)assusau)") != 0)
+ if (!reply || strcmp (dbus_message_get_signature (reply), "a((so)(so)(so)a(so)assusau)") != 0)
{
g_warning ("at-spi: Error in GetItems");
return;
@@ -461,13 +458,12 @@ ref_accessible_desktop (AtspiApplication *app)
g_object_ref (desktop);
return desktop;
}
- desktop = atspi_accessible_new ();
+ desktop = atspi_accessible_new (app, atspi_path_root);
if (!desktop)
{
return NULL;
}
- g_hash_table_insert (app->hash, 0, desktop);
- desktop->app = app;
+ g_hash_table_insert (app->hash, desktop->path, desktop);
g_object_ref (desktop); /* for the hash */
desktop->name = g_strdup ("main");
dbus_error_init (&error);
@@ -478,7 +474,7 @@ ref_accessible_desktop (AtspiApplication *app)
if (!message)
return;
reply = _atspi_dbus_send_with_reply_and_block (message);
- if (!reply || strcmp (dbus_message_get_signature (reply), "a(so") != 0)
+ if (!reply || strcmp (dbus_message_get_signature (reply), "a(so)") != 0)
{
g_error ("Couldn't get application list: %s", error.message);
if (reply)
diff --git a/atspi/atspi-registry.c b/atspi/atspi-registry.c
index 2e4763bc..3bf5b600 100644
--- a/atspi/atspi-registry.c
+++ b/atspi/atspi-registry.c
@@ -49,8 +49,8 @@ atspi_get_desktop_count ()
* Get the virtual desktop indicated by index @i.
* NOTE: currently multiple virtual desktops are not implemented.
*
- * Returns: a pointer to the 'i-th' virtual desktop's #AtspiAccessible
- * representation.
+ * Returns: (transfer full): a pointer to the 'i-th' virtual desktop's
+ * #AtspiAccessible representation.
**/
AtspiAccessible*
atspi_get_desktop (gint i)
@@ -61,7 +61,6 @@ atspi_get_desktop (gint i)
/**
* atspi_get_desktop_list:
- * @desktop_list: a pointer to an array of #Accessible references.
*
* Get the list of virtual desktops. On return, @list will point
* to a newly-created, NULL terminated array of virtual desktop
@@ -72,10 +71,8 @@ atspi_get_desktop (gint i)
* Not Yet Implemented : this implementation always returns a single
* #Accessible desktop.
*
- * Returns: an integer indicating how many virtual desktops have been
- * placed in the list pointed to by parameter @list.
+ * Returns: (transfer full): a #GArray of desktops.
**/
-/* TODO: Make this a garray */
GArray *
atspi_get_desktop_list ()
{