projects
/
platform
/
core
/
uifw
/
at-spi2-atk.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
atk-adaptor: plug some refcount leaks
[platform/core/uifw/at-spi2-atk.git]
/
atk-adaptor
/
accessible-register.c
diff --git
a/atk-adaptor/accessible-register.c
b/atk-adaptor/accessible-register.c
index
97ada1d
..
7ca416f
100644
(file)
--- a/
atk-adaptor/accessible-register.c
+++ b/
atk-adaptor/accessible-register.c
@@
-47,16
+47,18
@@
*
*/
*
*/
-#define SPI_ATK_PATH_PREFIX_LENGTH 2
2
-#define SPI_ATK_OBJECT_PATH_PREFIX "/org/a
t_spi/accessible
"
-#define SPI_ATK_OBJECT_PATH_
DESKTOP SPI_ATK_OBJECT_PATH_PREFIX "/desktop
"
+#define SPI_ATK_PATH_PREFIX_LENGTH 2
7
+#define SPI_ATK_OBJECT_PATH_PREFIX "/org/a
11y/atspi/accessible/
"
+#define SPI_ATK_OBJECT_PATH_
ROOT "root
"
-#define SPI_ATK_OBJECT_REFERENCE_TEMPLATE SPI_ATK_OBJECT_PATH_PREFIX "
/
%d"
+#define SPI_ATK_OBJECT_REFERENCE_TEMPLATE SPI_ATK_OBJECT_PATH_PREFIX "%d"
#define SPI_DBUS_ID "spi-dbus-id"
SpiRegister *spi_global_register = NULL;
#define SPI_DBUS_ID "spi-dbus-id"
SpiRegister *spi_global_register = NULL;
+static const gchar * spi_register_root_path = SPI_ATK_OBJECT_PATH_PREFIX SPI_ATK_OBJECT_PATH_ROOT;
+
enum
{
OBJECT_REGISTERED,
enum
{
OBJECT_REGISTERED,
@@
-70,9
+72,6
@@
static guint register_signals[LAST_SIGNAL] = { 0 };
static void
spi_register_finalize (GObject * object);
static void
spi_register_finalize (GObject * object);
-static void
-spi_register_dispose (GObject * object);
-
/*---------------------------------------------------------------------------*/
G_DEFINE_TYPE (SpiRegister, spi_register, G_TYPE_OBJECT)
/*---------------------------------------------------------------------------*/
G_DEFINE_TYPE (SpiRegister, spi_register, G_TYPE_OBJECT)
@@
-84,7
+83,6
@@
static void spi_register_class_init (SpiRegisterClass * klass)
spi_register_parent_class = g_type_class_ref (G_TYPE_OBJECT);
object_class->finalize = spi_register_finalize;
spi_register_parent_class = g_type_class_ref (G_TYPE_OBJECT);
object_class->finalize = spi_register_finalize;
- object_class->dispose = spi_register_dispose;
register_signals [OBJECT_REGISTERED] =
g_signal_new ("object-registered",
register_signals [OBJECT_REGISTERED] =
g_signal_new ("object-registered",
@@
-119,21
+117,28
@@
spi_register_init (SpiRegister * reg)
}
static void
}
static void
-
spi_register_finalize (GObject * object
)
+
deregister_object (gpointer data, GObject * gobj
)
{
{
- SpiRegister *reg = SPI_REGISTER (
object
);
+ SpiRegister *reg = SPI_REGISTER (
data
);
- g_free (reg->ref2ptr);
+ spi_register_deregister_object (reg, gobj, FALSE);
+}
- G_OBJECT_CLASS (spi_register_parent_class)->finalize (object);
+static void
+spi_register_remove_weak_ref (gpointer key, gpointer val, gpointer reg)
+{
+ g_object_weak_unref (val, deregister_object, reg);
}
static void
}
static void
-spi_register_
dispos
e (GObject * object)
+spi_register_
finaliz
e (GObject * object)
{
SpiRegister *reg = SPI_REGISTER (object);
{
SpiRegister *reg = SPI_REGISTER (object);
- G_OBJECT_CLASS (spi_register_parent_class)->dispose (object);
+ g_hash_table_foreach (reg->ref2ptr, spi_register_remove_weak_ref, reg);
+ g_hash_table_unref (reg->ref2ptr);
+
+ G_OBJECT_CLASS (spi_register_parent_class)->finalize (object);
}
/*---------------------------------------------------------------------------*/
}
/*---------------------------------------------------------------------------*/
@@
-184,10
+189,9
@@
ref_to_path (guint ref)
* Removes the AtkObject from the reference lookup tables, meaning
* it is no longer exposed over D-Bus.
*/
* Removes the AtkObject from the reference lookup tables, meaning
* it is no longer exposed over D-Bus.
*/
-
static
void
-
deregister_object (gpointer data, GObject * gobj
)
+void
+
spi_register_deregister_object (SpiRegister *reg, GObject *gobj, gboolean unref
)
{
{
- SpiRegister *reg = SPI_REGISTER (data);
guint ref;
ref = object_to_ref (gobj);
guint ref;
ref = object_to_ref (gobj);
@@
-197,6
+201,8
@@
deregister_object (gpointer data, GObject * gobj)
register_signals [OBJECT_DEREGISTERED],
0,
gobj);
register_signals [OBJECT_DEREGISTERED],
0,
gobj);
+ if (unref)
+ g_object_weak_unref (gobj, deregister_object, reg);
g_hash_table_remove (reg->ref2ptr, GINT_TO_POINTER (ref));
#ifdef SPI_ATK_DEBUG
g_hash_table_remove (reg->ref2ptr, GINT_TO_POINTER (ref));
#ifdef SPI_ATK_DEBUG
@@
-243,14
+249,12
@@
spi_register_path_to_object (SpiRegister * reg, const char *path)
!= 0)
return NULL;
!= 0)
return NULL;
- path += SPI_ATK_PATH_PREFIX_LENGTH;
/* Skip over the prefix */
+ path += SPI_ATK_PATH_PREFIX_LENGTH; /* Skip over the prefix */
- if (!g_strcmp0 (SPI_ATK_OBJECT_PATH_DESKTOP, path))
- return G_OBJECT (atk_get_root ());
- if (path[0] != '/')
- return NULL;
+ /* Map the root path to the root object. */
+ if (!g_strcmp0 (SPI_ATK_OBJECT_PATH_ROOT, path))
+ return G_OBJECT (spi_global_app_data->root);
- path++;
index = atoi (path);
data = g_hash_table_lookup (reg->ref2ptr, GINT_TO_POINTER (index));
if (data)
index = atoi (path);
data = g_hash_table_lookup (reg->ref2ptr, GINT_TO_POINTER (index));
if (data)
@@
-279,6
+283,10
@@
spi_register_object_to_path (SpiRegister * reg, GObject * gobj)
if (gobj == NULL)
return NULL;
if (gobj == NULL)
return NULL;
+ /* Map the root object to the root path. */
+ if ((void *)gobj == (void *)spi_global_app_data->root)
+ return g_strdup (spi_register_root_path);
+
ref = object_to_ref (gobj);
if (!ref)
{
ref = object_to_ref (gobj);
if (!ref)
{
@@
-304,9
+312,9
@@
spi_register_object_to_ref (GObject * gobj)
* within any particular application.
*/
gchar *
* within any particular application.
*/
gchar *
-spi_register_
desktop
_object_path ()
+spi_register_
root
_object_path ()
{
{
- return g_strdup (SPI_ATK_OBJECT_PATH_PREFIX SPI_ATK_OBJECT_PATH_
DESKTOP
);
+ return g_strdup (SPI_ATK_OBJECT_PATH_PREFIX SPI_ATK_OBJECT_PATH_
ROOT
);
}
/*END------------------------------------------------------------------------*/
}
/*END------------------------------------------------------------------------*/