Fix for bug-in-hiding, was managing bonobo object lifecycle
authorbillh <billh@e2bd861d-eb25-0410-b326-f6ed22b6b98c>
Thu, 16 Aug 2001 14:52:20 +0000 (14:52 +0000)
committerbillh <billh@e2bd861d-eb25-0410-b326-f6ed22b6b98c>
Thu, 16 Aug 2001 14:52:20 +0000 (14:52 +0000)
for events but not CORBA object refs!

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

ChangeLog
libspi/listener.c
libspi/registry.c
registryd/registry.c

index 4978fdc..00a2017 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
        * libspi/accessible.c :
        Added implementations for Accessible:get_parent(),
        Accessible:getChildCount(), and Accessible:getChildAtIndex().
+       * libspi/registry.c :
+       * libspi/listener.c :
+       Replaced calls to Accessibility_Accessible_ref() and
+       Accessibility_Accessible_unref() with 
+       calls to bonobo_object_dup_ref() and 
+       bonobo_object_release_unref(), so that the CORBA object
+       is dup-ed and released when relayed, as well as the bonobo object.
 
 2001-08-15  Mark McLoughlin <mark@skynet.ie>
 
index d87aefe..8ab2c80 100644 (file)
@@ -88,7 +88,7 @@ impl_notify_event (PortableServer_Servant     servant,
            ? "yes" : "no");
 
 #endif
-  Accessibility_Accessible_unref(e->target, ev);
+  bonobo_object_release_unref (e->target, ev);
 
 }
 
index ff794f8..34542cd 100644 (file)
@@ -68,6 +68,7 @@ typedef struct {
 typedef struct {
   Accessibility_EventListener listener;
   guint event_type_hash;
+  EventTypeMajor event_type_major;
 } ListenerStruct;
 
 /* static function prototypes */
@@ -129,6 +130,21 @@ compare_object_hash (gconstpointer p1, gconstpointer p2)
   return ((diff < 0) ? -1 : ((diff > 0) ? 1 : 0));
 }
 
+static gboolean
+toolkit_listener (GSignalInvocationHint *signal_hint, guint n_param_value,
+                  const GValue *param_values, gpointer data)
+{
+  ;
+  return FALSE;
+}
+
+static void
+register_with_toolkit (EventTypeStruct *etype)
+{
+  guint listener_id =
+  atk_add_global_event_listener (toolkit_listener, g_strconcat (etype->minor, etype->detail, NULL));
+}
+
 static gint
 compare_listener_hash (gconstpointer p1, gconstpointer p2)
 {
@@ -227,10 +243,7 @@ impl_accessibility_registry_register_global_event_listener
   /**
    *  TODO:
    *
-   *  distinguish between event types
    *  register with app toolkits only for requested event types
-   *  maintain list of requested types and number of listeners
-   *  find non-strcmp method of matching event types to listeners
    *
    **/
 
@@ -239,10 +252,12 @@ impl_accessibility_registry_register_global_event_listener
   ListenerStruct *ls = g_malloc (sizeof (ListenerStruct));
 
   EventTypeStruct etype;
+
+  /* parse, check major event type and add listener accordingly */
   parse_event_type (&etype, event_name);
   ls->event_type_hash = etype.hash;
+  ls->event_type_major = etype.major;
 
-  /* parse, check major event type and add listener accordingly */
   switch (etype.major)
     {
     case (ETYPE_FOCUS) :
@@ -251,8 +266,13 @@ impl_accessibility_registry_register_global_event_listener
         g_list_append (registry->focus_listeners, ls);
       break;
     case (ETYPE_WINDOW) :
+      /* Support for Window Manager Events is not yet implemented */
       break;
     case (ETYPE_TOOLKIT) :
+      ls->listener = CORBA_Object_duplicate (listener, ev);
+      registry->toolkit_listeners =
+        g_list_append (registry->toolkit_listeners, ls);
+      register_with_toolkit (&etype);
       break;
     default:
       break;
@@ -270,12 +290,25 @@ impl_accessibility_registry_deregister_global_event_listener_all
 {
   Registry *registry = REGISTRY (bonobo_object_from_servant (servant));
   GList *list = g_list_find_custom (registry->focus_listeners, listener, compare_object_hash);
+
+  /*
+   * TODO : de-register with toolkit if the last instance of a listener
+   *        to a particular toolkit event type has been deregistered.
+   */
+
   while (list)
     {
       fprintf (stderr, "deregistering listener\n");
       registry->focus_listeners = g_list_delete_link (registry->focus_listeners, list);
       list = g_list_find_custom (registry->focus_listeners, listener, compare_object_hash);
     }
+  list = g_list_find_custom (registry->toolkit_listeners, listener, compare_object_hash);
+  while (list)
+    {
+      fprintf (stderr, "deregistering listener\n");
+      registry->toolkit_listeners = g_list_delete_link (registry->toolkit_listeners, list);
+      list = g_list_find_custom (registry->toolkit_listeners, listener, compare_object_hash);
+    }
 }
 
 /*
@@ -292,14 +325,32 @@ impl_accessibility_registry_deregister_global_event_listener
   ListenerStruct ls;
   EventTypeStruct etype;
   GList *list;
+  GList **listeners;
+
   parse_event_type (&etype, event_name);
+  switch (etype.major)
+    {
+    case (ETYPE_FOCUS) :
+      listeners = &registry->focus_listeners;
+      break;
+    case (ETYPE_WINDOW) :
+      /* Support for Window Manager Events is not yet implemented */
+      break;
+    case (ETYPE_TOOLKIT) :
+      listeners = &registry->toolkit_listeners;
+      break;
+    default:
+      break;
+    }
+
   ls.event_type_hash = etype.hash;
-  list = g_list_find_custom (registry->focus_listeners, &ls, compare_listener_hash);
+  list = g_list_find_custom (*listeners, &ls, compare_listener_hash);
 
-  if (list)
+  while (list)
     {
       fprintf (stderr, "deregistering listener\n");
-      registry->applications = g_list_delete_link (registry->focus_listeners, list);
+      *listeners = g_list_delete_link (*listeners, list);
+      list = g_list_find_custom (*listeners, &ls, compare_listener_hash);
     }
 }
 
@@ -398,7 +449,7 @@ impl_registry_notify_event (PortableServer_Servant servant,
     default:
       break;
     }
-  Accessibility_Accessible_unref (e->target, ev);
+  bonobo_object_release_unref (e->target, ev);
 }
 
 static void
@@ -427,7 +478,7 @@ registry_notify_listeners ( GList *listeners,
           fprintf(stderr, "notifying listener #%d\n", n);
           fprintf(stderr, "event name %s\n", Accessibility_Accessible__get_name(e->target, ev));
 #endif
-          Accessibility_Accessible_ref (e->target, ev);
+          bonobo_object_dup_ref ( e->target, ev);
           Accessibility_EventListener_notifyEvent ((Accessibility_EventListener) ls->listener,
                                                    e,
                                                    ev);
index ff794f8..34542cd 100644 (file)
@@ -68,6 +68,7 @@ typedef struct {
 typedef struct {
   Accessibility_EventListener listener;
   guint event_type_hash;
+  EventTypeMajor event_type_major;
 } ListenerStruct;
 
 /* static function prototypes */
@@ -129,6 +130,21 @@ compare_object_hash (gconstpointer p1, gconstpointer p2)
   return ((diff < 0) ? -1 : ((diff > 0) ? 1 : 0));
 }
 
+static gboolean
+toolkit_listener (GSignalInvocationHint *signal_hint, guint n_param_value,
+                  const GValue *param_values, gpointer data)
+{
+  ;
+  return FALSE;
+}
+
+static void
+register_with_toolkit (EventTypeStruct *etype)
+{
+  guint listener_id =
+  atk_add_global_event_listener (toolkit_listener, g_strconcat (etype->minor, etype->detail, NULL));
+}
+
 static gint
 compare_listener_hash (gconstpointer p1, gconstpointer p2)
 {
@@ -227,10 +243,7 @@ impl_accessibility_registry_register_global_event_listener
   /**
    *  TODO:
    *
-   *  distinguish between event types
    *  register with app toolkits only for requested event types
-   *  maintain list of requested types and number of listeners
-   *  find non-strcmp method of matching event types to listeners
    *
    **/
 
@@ -239,10 +252,12 @@ impl_accessibility_registry_register_global_event_listener
   ListenerStruct *ls = g_malloc (sizeof (ListenerStruct));
 
   EventTypeStruct etype;
+
+  /* parse, check major event type and add listener accordingly */
   parse_event_type (&etype, event_name);
   ls->event_type_hash = etype.hash;
+  ls->event_type_major = etype.major;
 
-  /* parse, check major event type and add listener accordingly */
   switch (etype.major)
     {
     case (ETYPE_FOCUS) :
@@ -251,8 +266,13 @@ impl_accessibility_registry_register_global_event_listener
         g_list_append (registry->focus_listeners, ls);
       break;
     case (ETYPE_WINDOW) :
+      /* Support for Window Manager Events is not yet implemented */
       break;
     case (ETYPE_TOOLKIT) :
+      ls->listener = CORBA_Object_duplicate (listener, ev);
+      registry->toolkit_listeners =
+        g_list_append (registry->toolkit_listeners, ls);
+      register_with_toolkit (&etype);
       break;
     default:
       break;
@@ -270,12 +290,25 @@ impl_accessibility_registry_deregister_global_event_listener_all
 {
   Registry *registry = REGISTRY (bonobo_object_from_servant (servant));
   GList *list = g_list_find_custom (registry->focus_listeners, listener, compare_object_hash);
+
+  /*
+   * TODO : de-register with toolkit if the last instance of a listener
+   *        to a particular toolkit event type has been deregistered.
+   */
+
   while (list)
     {
       fprintf (stderr, "deregistering listener\n");
       registry->focus_listeners = g_list_delete_link (registry->focus_listeners, list);
       list = g_list_find_custom (registry->focus_listeners, listener, compare_object_hash);
     }
+  list = g_list_find_custom (registry->toolkit_listeners, listener, compare_object_hash);
+  while (list)
+    {
+      fprintf (stderr, "deregistering listener\n");
+      registry->toolkit_listeners = g_list_delete_link (registry->toolkit_listeners, list);
+      list = g_list_find_custom (registry->toolkit_listeners, listener, compare_object_hash);
+    }
 }
 
 /*
@@ -292,14 +325,32 @@ impl_accessibility_registry_deregister_global_event_listener
   ListenerStruct ls;
   EventTypeStruct etype;
   GList *list;
+  GList **listeners;
+
   parse_event_type (&etype, event_name);
+  switch (etype.major)
+    {
+    case (ETYPE_FOCUS) :
+      listeners = &registry->focus_listeners;
+      break;
+    case (ETYPE_WINDOW) :
+      /* Support for Window Manager Events is not yet implemented */
+      break;
+    case (ETYPE_TOOLKIT) :
+      listeners = &registry->toolkit_listeners;
+      break;
+    default:
+      break;
+    }
+
   ls.event_type_hash = etype.hash;
-  list = g_list_find_custom (registry->focus_listeners, &ls, compare_listener_hash);
+  list = g_list_find_custom (*listeners, &ls, compare_listener_hash);
 
-  if (list)
+  while (list)
     {
       fprintf (stderr, "deregistering listener\n");
-      registry->applications = g_list_delete_link (registry->focus_listeners, list);
+      *listeners = g_list_delete_link (*listeners, list);
+      list = g_list_find_custom (*listeners, &ls, compare_listener_hash);
     }
 }
 
@@ -398,7 +449,7 @@ impl_registry_notify_event (PortableServer_Servant servant,
     default:
       break;
     }
-  Accessibility_Accessible_unref (e->target, ev);
+  bonobo_object_release_unref (e->target, ev);
 }
 
 static void
@@ -427,7 +478,7 @@ registry_notify_listeners ( GList *listeners,
           fprintf(stderr, "notifying listener #%d\n", n);
           fprintf(stderr, "event name %s\n", Accessibility_Accessible__get_name(e->target, ev));
 #endif
-          Accessibility_Accessible_ref (e->target, ev);
+          bonobo_object_dup_ref ( e->target, ev);
           Accessibility_EventListener_notifyEvent ((Accessibility_EventListener) ls->listener,
                                                    e,
                                                    ev);