* 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>
? "yes" : "no");
#endif
- Accessibility_Accessible_unref(e->target, ev);
+ bonobo_object_release_unref (e->target, ev);
}
typedef struct {
Accessibility_EventListener listener;
guint event_type_hash;
+ EventTypeMajor event_type_major;
} ListenerStruct;
/* static function prototypes */
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)
{
/**
* 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
*
**/
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) :
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;
{
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);
+ }
}
/*
ListenerStruct ls;
EventTypeStruct etype;
GList *list;
+ GList **listeners;
+
parse_event_type (&etype, event_name);
+ switch (etype.major)
+ {
+ case (ETYPE_FOCUS) :
+ listeners = ®istry->focus_listeners;
+ break;
+ case (ETYPE_WINDOW) :
+ /* Support for Window Manager Events is not yet implemented */
+ break;
+ case (ETYPE_TOOLKIT) :
+ listeners = ®istry->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);
}
}
default:
break;
}
- Accessibility_Accessible_unref (e->target, ev);
+ bonobo_object_release_unref (e->target, ev);
}
static void
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);
typedef struct {
Accessibility_EventListener listener;
guint event_type_hash;
+ EventTypeMajor event_type_major;
} ListenerStruct;
/* static function prototypes */
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)
{
/**
* 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
*
**/
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) :
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;
{
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);
+ }
}
/*
ListenerStruct ls;
EventTypeStruct etype;
GList *list;
+ GList **listeners;
+
parse_event_type (&etype, event_name);
+ switch (etype.major)
+ {
+ case (ETYPE_FOCUS) :
+ listeners = ®istry->focus_listeners;
+ break;
+ case (ETYPE_WINDOW) :
+ /* Support for Window Manager Events is not yet implemented */
+ break;
+ case (ETYPE_TOOLKIT) :
+ listeners = ®istry->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);
}
}
default:
break;
}
- Accessibility_Accessible_unref (e->target, ev);
+ bonobo_object_release_unref (e->target, ev);
}
static void
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);