[atomix] Use more GLib functions for timing and time formatting
- From: Robert Roth <robertroth src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [atomix] Use more GLib functions for timing and time formatting
- Date: Tue, 31 Mar 2015 02:28:51 +0000 (UTC)
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]