X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmodest-signal-mgr.c;h=ad681ba313014ddc559ea12cd191dd5f885d74be;hp=b5f05b3477b9f5a5e1ab4dc2a57bec80836e09cb;hb=HEAD;hpb=962a3c1f9bcaafc1e281af544240d8bc8450239b diff --git a/src/modest-signal-mgr.c b/src/modest-signal-mgr.c index b5f05b3..ad681ba 100644 --- a/src/modest-signal-mgr.c +++ b/src/modest-signal-mgr.c @@ -28,25 +28,31 @@ */ #include "modest-signal-mgr.h" +#include typedef struct { guint handler_id; + gchar *signal_name; GObject *obj; } SignalHandler; GSList * -modest_signal_mgr_connect (GSList *lst, GObject *instance, const gchar *detail, - GCallback handler, gpointer data) +modest_signal_mgr_connect (GSList *lst, + GObject *instance, + const gchar *signal_name, + GCallback handler, + gpointer data) { SignalHandler *sighandler; g_return_val_if_fail (instance, lst); - g_return_val_if_fail (detail, lst); + g_return_val_if_fail (signal_name, lst); g_return_val_if_fail (handler, lst); sighandler = g_new (SignalHandler, 1); - sighandler->obj = g_object_ref (instance); - sighandler->handler_id = g_signal_connect (instance, detail, handler, data); + sighandler->obj = g_object_ref (instance); + sighandler->handler_id = g_signal_connect (instance, signal_name, handler, data); + sighandler->signal_name = g_strdup (signal_name); return g_slist_prepend (lst, (gpointer)sighandler); } @@ -59,13 +65,85 @@ modest_signal_mgr_disconnect_all_and_destroy (GSList *lst) for (cursor = lst; cursor; cursor = g_slist_next(cursor)) { SignalHandler *handler; handler = (SignalHandler*)cursor->data; - if (g_signal_handler_is_connected (handler->obj, handler->handler_id)) { - //g_debug ("disconnecting %d", handler->handler_id); - g_signal_handler_disconnect (handler->obj, handler->handler_id); + if (handler && handler->obj && G_IS_OBJECT(handler->obj)) { + if (g_signal_handler_is_connected (handler->obj, handler->handler_id)) { + g_signal_handler_disconnect (handler->obj, handler->handler_id); + } + g_object_unref (handler->obj); + g_free (handler->signal_name); + handler->obj = NULL; } - - g_object_unref (handler->obj); g_free (handler); } g_slist_free (lst); } + +static gboolean +obj_in_a_signal_handler (gconstpointer a, + gconstpointer b) +{ + SignalHandler *handler, *list_item_handler; + + list_item_handler = (SignalHandler *) a; + handler = (SignalHandler *) b; + + if (list_item_handler->obj == handler->obj && + !strcmp (list_item_handler->signal_name, handler->signal_name)) + return FALSE; + else + return TRUE; +} + +GSList * +modest_signal_mgr_disconnect (GSList *list, + GObject *instance, + const gchar *signal_name) +{ + GSList *item = NULL; + SignalHandler *signal_handler = NULL, *tmp = NULL; + + tmp = g_new (SignalHandler, 1); + tmp->obj = instance; + tmp->signal_name = g_strdup (signal_name); + + /* Find the element */ + item = g_slist_find_custom (list, tmp, obj_in_a_signal_handler); + g_return_val_if_fail (item != NULL, list); + + /* Disconnect the signal */ + signal_handler = (SignalHandler *) item->data; + g_signal_handler_disconnect (signal_handler->obj, signal_handler->handler_id); + + /* Free the handlers */ + g_object_unref (signal_handler->obj); + g_free (signal_handler->signal_name); + g_free (signal_handler); + g_free (tmp->signal_name); + g_free (tmp); + + /* Remove item from list */ + return g_slist_delete_link (list, item); +} + +gboolean +modest_signal_mgr_is_connected (GSList *list, + GObject *instance, + const gchar *signal_name) +{ + GSList *item = NULL; + SignalHandler *tmp = NULL; + + /* Build the helper object */ + tmp = g_new (SignalHandler, 1); + tmp->obj = instance; + tmp->signal_name = g_strdup (signal_name); + + /* Find the element */ + item = g_slist_find_custom (list, tmp, obj_in_a_signal_handler); + + /* Free the handlers */ + g_free (tmp->signal_name); + g_free (tmp); + + return (item != NULL) ? TRUE : FALSE; +}