[gnome-builder/wip/chergert/headerbar] build-result: add timeout source to notify running-time



commit 179696d7a28238fc13bd51fbe9be06602ca54959
Author: Christian Hergert <chergert redhat com>
Date:   Thu Jun 23 17:47:29 2016 -0700

    build-result: add timeout source to notify running-time
    
    There are a couple of places we need this, so it would be nice to have the
    notification source in a single place rather than require consumers to
    bring their own polling.

 libide/buildsystem/ide-build-result.c |   58 +++++++++++++++++++++++++++++----
 1 files changed, 51 insertions(+), 7 deletions(-)
---
diff --git a/libide/buildsystem/ide-build-result.c b/libide/buildsystem/ide-build-result.c
index e7521b4..b065ffe 100644
--- a/libide/buildsystem/ide-build-result.c
+++ b/libide/buildsystem/ide-build-result.c
@@ -51,6 +51,7 @@ typedef struct
 
   GTimer           *timer;
   gchar            *mode;
+  GSource          *running_time_source;
 
   guint             running : 1;
 } IdeBuildResultPrivate;
@@ -68,6 +69,7 @@ enum {
   PROP_0,
   PROP_MODE,
   PROP_RUNNING,
+  PROP_RUNNING_TIME,
   LAST_PROP
 };
 
@@ -476,6 +478,8 @@ ide_build_result_finalize (GObject *object)
   IdeBuildResult *self = (IdeBuildResult *)object;
   IdeBuildResultPrivate *priv = ide_build_result_get_instance_private (self);
 
+  g_clear_pointer (&priv->running_time_source, g_source_destroy);
+
   g_clear_object (&priv->addins);
 
   g_clear_object (&priv->stderr_reader);
@@ -504,12 +508,16 @@ ide_build_result_get_property (GObject    *object,
 
   switch (prop_id)
     {
+    case PROP_MODE:
+      g_value_take_string (value, ide_build_result_get_mode (self));
+      break;
+
     case PROP_RUNNING:
       g_value_set_boolean (value, ide_build_result_get_running (self));
       break;
 
-    case PROP_MODE:
-      g_value_take_string (value, ide_build_result_get_mode (self));
+    case PROP_RUNNING_TIME:
+      g_value_set_int64 (value, ide_build_result_get_running_time (self));
       break;
 
     default:
@@ -527,14 +535,14 @@ ide_build_result_set_property (GObject      *object,
 
   switch (prop_id)
     {
-    case PROP_RUNNING:
-      ide_build_result_set_running (self, g_value_get_boolean (value));
-      break;
-
     case PROP_MODE:
       ide_build_result_set_mode (self, g_value_get_string (value));
       break;
 
+    case PROP_RUNNING:
+      ide_build_result_set_running (self, g_value_get_boolean (value));
+      break;
+
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
     }
@@ -564,6 +572,15 @@ ide_build_result_class_init (IdeBuildResultClass *klass)
                           FALSE,
                           (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY));
 
+  properties [PROP_RUNNING_TIME] =
+    g_param_spec_int64 ("running-time",
+                        "Running Time",
+                        "Duration of the build operation",
+                        0,
+                        G_MAXINT64,
+                        0,
+                        (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY));
+
   g_object_class_install_properties (object_class, LAST_PROP, properties);
 
   signals [DIAGNOSTIC] =
@@ -654,6 +671,18 @@ ide_build_result_get_running (IdeBuildResult *self)
   return priv->running;
 }
 
+static gboolean
+ide_build_result_do_notify_running_time (gpointer user_data)
+{
+  IdeBuildResult *self = user_data;
+
+  g_assert (IDE_IS_BUILD_RESULT (self));
+
+  g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_RUNNING_TIME]);
+
+  return G_SOURCE_CONTINUE;
+}
+
 void
 ide_build_result_set_running (IdeBuildResult *self,
                               gboolean        running)
@@ -668,9 +697,24 @@ ide_build_result_set_running (IdeBuildResult *self,
   if (priv->running != running)
     {
       priv->running = running;
+
       if (!running)
-        g_timer_stop (priv->timer);
+        {
+          g_timer_stop (priv->timer);
+          g_clear_pointer (&priv->running_time_source, g_source_destroy);
+        }
+      else
+        {
+          priv->running_time_source = g_timeout_source_new_seconds (1);
+          g_source_set_name (priv->running_time_source, "[ide] build result running-time notify");
+          g_source_set_callback (priv->running_time_source,
+                                 ide_build_result_do_notify_running_time,
+                                 self, NULL);
+          g_source_attach (priv->running_time_source, NULL);
+        }
+
       ide_object_notify_in_main (self, properties [PROP_RUNNING]);
+      ide_object_notify_in_main (self, properties [PROP_RUNNING_TIME]);
     }
   g_mutex_unlock (&priv->mutex);
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]