Process to eventlogger callbacks in idle to better handle multiple events.
authorArtem Garmash <artemgarmash@gmail.com>
Sat, 24 Oct 2009 16:29:53 +0000 (19:29 +0300)
committerArtem Garmash <artem.garmash@nokia.com>
Sun, 27 Jun 2010 19:13:39 +0000 (22:13 +0300)
src/el-home-applet.c

index 8b4ec0f..5835938 100644 (file)
@@ -63,6 +63,10 @@ struct _ELHomeAppletPrivate
         guint unread_count;
 
         const gchar *current_font;
+
+        guint idle_id;
+        /* new or updated event id */
+        gint  new_event_id;
 };
 
 HD_DEFINE_PLUGIN_MODULE (ELHomeApplet, el_home_applet, HD_TYPE_HOME_PLUGIN_ITEM);
@@ -213,6 +217,10 @@ dispose (GObject *self)
 {
         ELHomeAppletPrivate *priv = EL_HOME_APPLET(self)->priv;
 
+        if (priv->idle_id){
+                g_source_remove (priv->idle_id);
+                priv->idle_id = 0;
+        }
         if (priv->eventlogger){
                 g_object_unref (priv->eventlogger);
                 priv->eventlogger = NULL;
@@ -413,47 +421,53 @@ mark_as_read (ELHomeApplet *self)
         }
 }
 
-static void
-new_event_cb (RTComEl      *backend,
-              gint          event_id,
-              const gchar  *local_uid,
-              const gchar  *remote_uid,
-              const gchar  *remote_ebook_uid,
-              const gchar  *group_uid,
-              const gchar  *service,
-              ELHomeApplet *self)
+static gboolean
+read_new_event (ELHomeApplet *self)
 {
         ELHomeAppletPrivate *priv = self->priv;
-        RTComElIter *it = NULL;
 
-        it = make_query (priv->eventlogger, event_id);
-        if (it){
-                if (rtcom_el_iter_first (it)){
-                        show_event (self, it);
-                        priv->unread_count++;
-                        update_unread_label (self);
+        if (priv->new_event_id >= 0){
+                RTComElIter *it = NULL;
+                it = make_query (priv->eventlogger, priv->new_event_id);
+                if (it){
+                        if (rtcom_el_iter_first (it))
+                                show_event (self, it);
+                        g_object_unref (it);
                 }
-                g_object_unref (it);
+                priv->unread_count = query_unread_events (priv->eventlogger);
+                update_unread_label (self);
         }
+        priv->new_event_id = -1;
+        priv->idle_id = 0;
+
+        return FALSE;
 }
 
 static void
-event_updated_cb (RTComEl      *backend,
-                  gint          event_id,
-                  const gchar  *local_uid,
-                  const gchar  *remote_uid,
-                  const gchar  *remote_ebook_uid,
-                  const gchar  *group_uid,
-                  const gchar  *service,
-                  ELHomeApplet *self)
+add_new_idle (ELHomeApplet *self)
 {
         ELHomeAppletPrivate *priv = self->priv;
 
-        if (event_id == priv->event_id)
-                read_event (self);
+        if (priv->idle_id)
+                g_source_remove (priv->idle_id);
+        priv->idle_id = g_idle_add ((GSourceFunc)read_new_event,
+                                    self);
+}
 
-        priv->unread_count = query_unread_events (priv->eventlogger);
-        update_unread_label (self);
+static void
+new_event_cb (RTComEl      *backend,
+              gint          event_id,
+              const gchar  *local_uid,
+              const gchar  *remote_uid,
+              const gchar  *remote_ebook_uid,
+              const gchar  *group_uid,
+              const gchar  *service,
+              ELHomeApplet *self)
+{
+        ELHomeAppletPrivate *priv = self->priv;
+
+        priv->new_event_id = event_id;
+        add_new_idle (self);
 }
 
 static gboolean
@@ -608,7 +622,7 @@ el_home_applet_init (ELHomeApplet *self)
                           self);
         g_signal_connect (priv->eventlogger,
                           "event-updated",
-                          G_CALLBACK (event_updated_cb),
+                          G_CALLBACK (new_event_cb),
                           self);
 
         read_event (self);