[atomix] Use more GLib functions for timing and time formatting



commit 30dceda652b468a88a5a8d27121a9a022ea6f0ba
Author: Robert Roth <robert roth off gmail com>
Date:   Tue Mar 31 05:28:36 2015 +0300

    Use more GLib functions for timing and time formatting

 src/clock.c |   79 +++++++++++++++++++++++++++++++++++-----------------------
 src/clock.h |   10 +++----
 src/main.c  |   10 +++----
 3 files changed, 56 insertions(+), 43 deletions(-)
---
diff --git a/src/clock.c b/src/clock.c
index d51deec..895508a 100644
--- a/src/clock.c
+++ b/src/clock.c
@@ -16,9 +16,6 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  */
 
-#include <time.h>
-#include <gtk/gtk.h>
-#include <string.h>
 #include "clock.h"
 
 static void clock_class_init (ClockClass *klass);
@@ -55,8 +52,9 @@ GType clock_get_type (void)
 static void clock_destroy (GtkWidget *object)
 {
   g_return_if_fail (object != NULL);
+  Clock *clock = CLOCK (object);
+  clock_stop (clock);
 
-  clock_stop (CLOCK (object));
   GTK_WIDGET_CLASS (parent_class)->destroy (object);
 }
 
@@ -71,26 +69,24 @@ static void clock_class_init (ClockClass *klass)
 static void clock_init (Clock *clock)
 {
   clock->timer_id = -1;
-  clock->update_interval = 1;
-  clock->seconds = time (NULL);
-  clock->stopped = 0;
+  clock->timer = NULL;
 }
 
 static void clock_gen_str (Clock *clock)
 {
-  gchar timestr[64];
-  time_t secs;
+  gchar *timestr;
+  gint secs = 0;
+  GDateTime *dtm;
 
-  secs = time (NULL) - clock->seconds;
+  if (clock->timer)
+    secs = g_timer_elapsed (clock->timer, NULL);
 
-  clock->tm->tm_hour = secs / 3600;
-  secs -= clock->tm->tm_hour * 3600;
-  clock->tm->tm_min = secs / 60;
-  clock->tm->tm_sec = secs - clock->tm->tm_min * 60;
+  dtm = g_date_time_new_from_unix_utc (secs);
+  timestr = g_date_time_format (dtm, clock->fmt);
+  g_date_time_unref (dtm);
 
-  strftime (timestr, 64, clock->fmt, clock->tm);
   gtk_label_set_text (GTK_LABEL (clock), timestr);
-  gtk_widget_set_halign (GTK_WIDGET (clock), GTK_ALIGN_START);
+  g_free (timestr);
 }
 
 static gint clock_timer_callback (gpointer data)
@@ -107,9 +103,6 @@ GtkWidget *clock_new ()
   Clock *clock = CLOCK (g_object_new (TYPE_CLOCK, NULL));
 
   clock->fmt = g_strdup ("%H:%M:%S");
-  clock->tm = g_new (struct tm, 1);
-  memset (clock->tm, 0, sizeof (struct tm));
-  clock->update_interval = 1;
 
   clock_gen_str (clock);
 
@@ -125,39 +118,63 @@ void clock_set_format (Clock *clock, const gchar *fmt)
   clock->fmt = g_strdup (fmt);
 }
 
-void clock_set_seconds (Clock *clock, time_t seconds)
+void clock_reset (Clock *clock)
 {
   g_return_if_fail (clock != NULL);
 
-  clock->seconds = time (NULL) - seconds;
-
-  if (clock->timer_id == -1)
-    clock->stopped = seconds;
+  if (clock->timer)
+    g_timer_start (clock->timer);
 
   clock_gen_str (clock);
 }
 
+static void start_timer (Clock *clock)
+{
+  if (clock->timer_id != -1)
+    return;
+
+  clock->timer_id = g_timeout_add_seconds (1, clock_timer_callback, clock);
+}
+
+void clock_resume (Clock *clock)
+{
+  g_return_if_fail (clock != NULL);
+
+  if (clock->timer != NULL)
+    g_timer_continue (clock->timer);
+
+  start_timer (clock);
+}
+
 void clock_start (Clock *clock)
 {
   g_return_if_fail (clock != NULL);
 
-  if (clock->timer_id != -1)
-    return;
+  if (clock->timer)
+    g_timer_destroy (clock->timer);
+
+  clock->timer = g_timer_new ();
 
-  clock_set_seconds (clock, clock->stopped);
-  clock->timer_id = g_timeout_add (1000 * clock->update_interval,
-                                    clock_timer_callback, clock);
+  start_timer (clock);
 }
 
 void clock_stop (Clock *clock)
 {
   g_return_if_fail (clock != NULL);
 
+  if (clock->timer)
+    g_timer_stop (clock->timer);
+
   if (clock->timer_id == -1)
     return;
 
-  clock->stopped = time (NULL) - clock->seconds;
-
   g_source_remove (clock->timer_id);
   clock->timer_id = -1;
 }
+
+gint clock_get_elapsed (Clock *clock)
+{
+  if (clock->timer)
+    return g_timer_elapsed (clock->timer, NULL);
+  return 0;
+}
diff --git a/src/clock.h b/src/clock.h
index 61b4d63..5a24d85 100644
--- a/src/clock.h
+++ b/src/clock.h
@@ -19,7 +19,6 @@
 #ifndef _ATOMIX_CLOCK_H_
 #define _ATOMIX_CLOCK_H_
 
-#include <time.h>
 #include <gtk/gtk.h>
 
 G_BEGIN_DECLS
@@ -30,12 +29,9 @@ G_BEGIN_DECLS
 typedef struct
 {
   GtkLabel widget;
+  GTimer *timer;
   gint timer_id;
-  gint update_interval;
-  time_t seconds;
-  time_t stopped;
   gchar *fmt;
-  struct tm *tm;
 } Clock;
 
 typedef struct
@@ -46,9 +42,11 @@ typedef struct
 GType clock_get_type (void);
 GtkWidget *clock_new (void);
 void clock_set_format (Clock *, const gchar *);
-void clock_set_seconds (Clock *, time_t);
+void clock_reset (Clock *);
 void clock_set_update_interval (Clock *, gint);
 void clock_start (Clock *);
+void clock_resume (Clock *);
+gint clock_get_elapsed (Clock *);
 void clock_stop (Clock *);
 
 G_END_DECLS
diff --git a/src/main.c b/src/main.c
index 948138b..af03752 100644
--- a/src/main.c
+++ b/src/main.c
@@ -232,7 +232,7 @@ static void controller_handle_action (GameAction action)
     case GAME_STATE_PAUSED:
       if (action == GAME_ACTION_CONTINUE)
        {
-         clock_start (CLOCK(app->clock));
+         clock_resume (CLOCK(app->clock));
          board_gtk_show ();
          app->state = (undo_exists())?GAME_STATE_RUNNING:GAME_STATE_RUNNING_UNMOVED;
        }
@@ -318,7 +318,7 @@ static void setup_level (void)
   goal_view_render (app->goal);
 
   /* init clock */
-  clock_set_seconds (CLOCK(app->clock), 0);
+  clock_reset (CLOCK(app->clock));
   clock_start (CLOCK(app->clock));
 
   g_object_unref (env_pf);
@@ -399,7 +399,7 @@ static void game_init ()
   app->level_no = 0;
   app->score = 0;
   clock_set_format (CLOCK(app->clock), "%M:%S");
-  clock_set_seconds (CLOCK(app->clock), 0);
+  clock_reset (CLOCK(app->clock));
 
   /* init the board */
   board_gtk_init (app->theme, GTK_FIXED (app->fi_matrix));
@@ -422,9 +422,7 @@ void game_level_finished (void)
 
 static void calculate_score (void)
 {
-  gint seconds;
-
-  seconds = time (NULL) - CLOCK(app->clock)->seconds;
+  gint seconds = clock_get_elapsed (CLOCK (app->clock));
 
   if (seconds > 300)
     return;


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