From 667f56dcaffbbdf9c29b5f0d17fa1293d9d464bc Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 12 Jul 2010 16:26:04 -0500 Subject: Trying to build the first gschema file. --- data/org.ayatana.indicator.datetime.gschema | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 data/org.ayatana.indicator.datetime.gschema diff --git a/data/org.ayatana.indicator.datetime.gschema b/data/org.ayatana.indicator.datetime.gschema new file mode 100644 index 0000000..f51cda3 --- /dev/null +++ b/data/org.ayatana.indicator.datetime.gschema @@ -0,0 +1,9 @@ + + + + %l:%M %p + The format string passed to strftime + The format of the time and/or date that is visible on the panel when using the indicator. For most users this will be a set of predefined values as determined by the configuration utility, but advanced users can change it to anything strftime can accept. Look at the man page on strftime for more information. + + + -- cgit v1.2.3 From 89692e244aab0cf3f3dba3bb489c026be8b386e1 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 12 Jul 2010 16:55:18 -0500 Subject: Bringing in the gesttings love. --- configure.ac | 10 +++++++++- data/Makefile.am | 4 ++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 9bf0a3c..460aadc 100644 --- a/configure.ac +++ b/configure.ac @@ -35,14 +35,22 @@ PKG_PROG_PKG_CONFIG INDICATOR_REQUIRED_VERSION=0.3.0 DBUSMENUGLIB_REQUIRED_VERSION=0.1.1 DBUSMENUGTK_REQUIRED_VERSION=0.1.1 +GIO_REQUIRED_VERSION=2.25.0 PKG_CHECK_MODULES(INDICATOR, indicator >= $INDICATOR_REQUIRED_VERSION dbusmenu-glib >= $DBUSMENUGLIB_REQUIRED_VERSION - dbusmenu-gtk >= $DBUSMENUGTK_REQUIRED_VERSION) + dbusmenu-gtk >= $DBUSMENUGTK_REQUIRED_VERSION + gio-2.0 >= $GIO_REQUIRED_VERSION) AC_SUBST(INDICATOR_CFLAGS) AC_SUBST(INDICATOR_LIBS) +########################### +# Grab the GSettings Macros +########################### + +GLIB_GSETTINGS + ########################### # Check to see if we're local ########################### diff --git a/data/Makefile.am b/data/Makefile.am index b19cee4..be4c97d 100644 --- a/data/Makefile.am +++ b/data/Makefile.am @@ -1,5 +1,9 @@ #SUBDIRS = icons +gsettings_SCHEMAS = \ + org.ayatana.indicator.datetime.gschema +@GSETTINGS_RULES@ + dbus_servicesdir = $(DBUSSERVICEDIR) dbus_services_DATA = indicator-datetime.service -- cgit v1.2.3 From 3ef7359d1f7b8db5d46a53ec6f35fc738724ac87 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 12 Jul 2010 16:59:55 -0500 Subject: Renaming file --- data/Makefile.am | 2 +- data/org.ayatana.indicator.datetime.gschema | 9 --------- data/org.ayatana.indicator.datetime.gschema.xml | 9 +++++++++ 3 files changed, 10 insertions(+), 10 deletions(-) delete mode 100644 data/org.ayatana.indicator.datetime.gschema create mode 100644 data/org.ayatana.indicator.datetime.gschema.xml diff --git a/data/Makefile.am b/data/Makefile.am index be4c97d..2e6900c 100644 --- a/data/Makefile.am +++ b/data/Makefile.am @@ -1,7 +1,7 @@ #SUBDIRS = icons gsettings_SCHEMAS = \ - org.ayatana.indicator.datetime.gschema + org.ayatana.indicator.datetime.gschema.xml @GSETTINGS_RULES@ dbus_servicesdir = $(DBUSSERVICEDIR) diff --git a/data/org.ayatana.indicator.datetime.gschema b/data/org.ayatana.indicator.datetime.gschema deleted file mode 100644 index f51cda3..0000000 --- a/data/org.ayatana.indicator.datetime.gschema +++ /dev/null @@ -1,9 +0,0 @@ - - - - %l:%M %p - The format string passed to strftime - The format of the time and/or date that is visible on the panel when using the indicator. For most users this will be a set of predefined values as determined by the configuration utility, but advanced users can change it to anything strftime can accept. Look at the man page on strftime for more information. - - - diff --git a/data/org.ayatana.indicator.datetime.gschema.xml b/data/org.ayatana.indicator.datetime.gschema.xml new file mode 100644 index 0000000..f51cda3 --- /dev/null +++ b/data/org.ayatana.indicator.datetime.gschema.xml @@ -0,0 +1,9 @@ + + + + %l:%M %p + The format string passed to strftime + The format of the time and/or date that is visible on the panel when using the indicator. For most users this will be a set of predefined values as determined by the configuration utility, but advanced users can change it to anything strftime can accept. Look at the man page on strftime for more information. + + + -- cgit v1.2.3 From 4f6a98808a8ba52193f25fb3683436c0a043ffa5 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 12 Jul 2010 17:07:50 -0500 Subject: Getting the schema to validate. --- data/org.ayatana.indicator.datetime.gschema.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/data/org.ayatana.indicator.datetime.gschema.xml b/data/org.ayatana.indicator.datetime.gschema.xml index f51cda3..5833d63 100644 --- a/data/org.ayatana.indicator.datetime.gschema.xml +++ b/data/org.ayatana.indicator.datetime.gschema.xml @@ -1,7 +1,7 @@ - - - %l:%M %p + + + "%l:%M %p" The format string passed to strftime The format of the time and/or date that is visible on the panel when using the indicator. For most users this will be a set of predefined values as determined by the configuration utility, but advanced users can change it to anything strftime can accept. Look at the man page on strftime for more information. -- cgit v1.2.3 From a173af9719ee3183c360c9e2416c1e16e9e68397 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 12 Jul 2010 20:28:37 -0500 Subject: Setting up basic property stuff and making a husk of a first property. --- src/indicator-datetime.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/src/indicator-datetime.c b/src/indicator-datetime.c index 6b32f1a..deef2f5 100644 --- a/src/indicator-datetime.c +++ b/src/indicator-datetime.c @@ -70,6 +70,17 @@ struct _IndicatorDatetimePrivate { DbusmenuGtkMenu * menu; }; +/* Enum for the properties so that they can be quickly + found and looked up. */ +enum { + PROP_0, + PROP_TIME_FORMAT +}; + +#define PROP_TIME_FORMAT_S "time-format" + +#define SETTING_TIME_FORMAT_S "indicator-time-format" + #define INDICATOR_DATETIME_GET_PRIVATE(o) \ (G_TYPE_INSTANCE_GET_PRIVATE ((o), INDICATOR_DATETIME_TYPE, IndicatorDatetimePrivate)) @@ -77,6 +88,8 @@ GType indicator_datetime_get_type (void); static void indicator_datetime_class_init (IndicatorDatetimeClass *klass); static void indicator_datetime_init (IndicatorDatetime *self); +static void set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); +static void get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void indicator_datetime_dispose (GObject *object); static void indicator_datetime_finalize (GObject *object); static GtkLabel * get_label (IndicatorObject * io); @@ -98,11 +111,27 @@ indicator_datetime_class_init (IndicatorDatetimeClass *klass) object_class->dispose = indicator_datetime_dispose; object_class->finalize = indicator_datetime_finalize; + object_class->set_property = set_property; + object_class->get_property = get_property; + IndicatorObjectClass * io_class = INDICATOR_OBJECT_CLASS(klass); io_class->get_label = get_label; io_class->get_menu = get_menu; + /** + IndicatorDatetime:time-format: + + The format that is used to show the time on the panel. + */ + g_object_class_install_property (object_class, + PROP_TIME_FORMAT, + g_param_spec_string(PROP_TIME_FORMAT_S, + "The format that is used to show the time on the panel.", + "A format string in the form used to pass to strftime to make a string for displaying on the panel.", + "%l:%M %p", + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + return; } @@ -167,6 +196,20 @@ indicator_datetime_finalize (GObject *object) return; } +static void +set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) +{ + + return; +} + +static void +get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) +{ + + return; +} + /* Looks at the size of the label, if it grew beyond what we thought was the max, make sure it doesn't shrink again. */ static gboolean -- cgit v1.2.3 From 72de11ccac28b0bad7485a5501bc87329560f39b Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 12 Jul 2010 20:35:50 -0500 Subject: Setting up a 'time_format' variable and pulling it into a property. --- src/indicator-datetime.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/indicator-datetime.c b/src/indicator-datetime.c index deef2f5..847cb8e 100644 --- a/src/indicator-datetime.c +++ b/src/indicator-datetime.c @@ -63,6 +63,8 @@ struct _IndicatorDatetimePrivate { GtkLabel * label; guint timer; + gchar * time_format; + guint idle_measure; gint max_width; @@ -146,6 +148,8 @@ indicator_datetime_init (IndicatorDatetime *self) self->priv->idle_measure = 0; self->priv->max_width = 0; + self->priv->time_format = NULL; + self->priv->sm = NULL; self->priv->menu = NULL; @@ -191,6 +195,12 @@ indicator_datetime_dispose (GObject *object) static void indicator_datetime_finalize (GObject *object) { + IndicatorDatetime * self = INDICATOR_DATETIME(object); + + if (self->priv->time_format != NULL) { + g_free(self->priv->time_format); + self->priv->time_format = NULL; + } G_OBJECT_CLASS (indicator_datetime_parent_class)->finalize (object); return; @@ -199,6 +209,16 @@ indicator_datetime_finalize (GObject *object) static void set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { + g_return_if_fail(prop_id == PROP_TIME_FORMAT); + IndicatorDatetime * self = INDICATOR_DATETIME(object); + + if (self->priv->time_format != NULL) { + g_free(self->priv->time_format); + self->priv->time_format = NULL; + } + + self->priv->time_format = g_value_dup_string(value); + g_debug("Changing time format to '%s'", self->priv->time_format); return; } @@ -206,6 +226,10 @@ set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec static void get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { + g_return_if_fail(prop_id == PROP_TIME_FORMAT); + IndicatorDatetime * self = INDICATOR_DATETIME(object); + + g_value_set_string(value, self->priv->time_format); return; } -- cgit v1.2.3 From 5c0172d8d390f7f5ff1d8475ef7aea40106f58ea Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 12 Jul 2010 20:42:55 -0500 Subject: Moving the default format into a define and using our new variable. --- src/indicator-datetime.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/indicator-datetime.c b/src/indicator-datetime.c index 847cb8e..854bf4d 100644 --- a/src/indicator-datetime.c +++ b/src/indicator-datetime.c @@ -83,6 +83,8 @@ enum { #define SETTING_TIME_FORMAT_S "indicator-time-format" +#define DEFAULT_TIME_FORMAT "%l:%M %p" + #define INDICATOR_DATETIME_GET_PRIVATE(o) \ (G_TYPE_INSTANCE_GET_PRIVATE ((o), INDICATOR_DATETIME_TYPE, IndicatorDatetimePrivate)) @@ -131,7 +133,7 @@ indicator_datetime_class_init (IndicatorDatetimeClass *klass) g_param_spec_string(PROP_TIME_FORMAT_S, "The format that is used to show the time on the panel.", "A format string in the form used to pass to strftime to make a string for displaying on the panel.", - "%l:%M %p", + DEFAULT_TIME_FORMAT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); return; @@ -148,7 +150,7 @@ indicator_datetime_init (IndicatorDatetime *self) self->priv->idle_measure = 0; self->priv->max_width = 0; - self->priv->time_format = NULL; + self->priv->time_format = g_strdup(DEFAULT_TIME_FORMAT); self->priv->sm = NULL; self->priv->menu = NULL; @@ -276,7 +278,7 @@ update_label (IndicatorDatetime * io) return; } - strftime(longstr, 128, "%l:%M %p", ltime); + strftime(longstr, 128, self->priv->time_format, ltime); gchar * utf8 = g_locale_to_utf8(longstr, -1, NULL, NULL, NULL); gtk_label_set_label(self->priv->label, utf8); -- cgit v1.2.3 From a994c55bc39f419ce752d02a60bc01d5659aad62 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 12 Jul 2010 20:56:23 -0500 Subject: Going into the gsettings world. --- src/indicator-datetime.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/indicator-datetime.c b/src/indicator-datetime.c index 854bf4d..4779313 100644 --- a/src/indicator-datetime.c +++ b/src/indicator-datetime.c @@ -27,6 +27,7 @@ with this program. If not, see . #include #include #include +#include /* Indicator Stuff */ #include @@ -70,6 +71,8 @@ struct _IndicatorDatetimePrivate { IndicatorServiceManager * sm; DbusmenuGtkMenu * menu; + + GSettings * settings; }; /* Enum for the properties so that they can be quickly @@ -81,6 +84,7 @@ enum { #define PROP_TIME_FORMAT_S "time-format" +#define SETTING_INTERFACE "org.ayatana.indicator.datetime" #define SETTING_TIME_FORMAT_S "indicator-time-format" #define DEFAULT_TIME_FORMAT "%l:%M %p" @@ -155,6 +159,17 @@ indicator_datetime_init (IndicatorDatetime *self) self->priv->sm = NULL; self->priv->menu = NULL; + self->priv->settings = g_settings_new(SETTING_INTERFACE); + if (self->priv->settings != NULL) { + g_settings_bind(self->priv->settings, + SETTING_TIME_FORMAT_S, + self, + PROP_TIME_FORMAT_S, + G_SETTINGS_BIND_DEFAULT); + } else { + g_warning("Unable to get settings for '" SETTING_INTERFACE "'"); + } + self->priv->sm = indicator_service_manager_new_version(SERVICE_NAME, SERVICE_VERSION); return; @@ -190,6 +205,11 @@ indicator_datetime_dispose (GObject *object) self->priv->sm = NULL; } + if (self->priv->settings != NULL) { + g_object_unref(G_OBJECT(self->priv->settings)); + self->priv->settings = NULL; + } + G_OBJECT_CLASS (indicator_datetime_parent_class)->dispose (object); return; } -- cgit v1.2.3 From ae7834726aff9bedbd0bcec14c167d6b7d292bbc Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 14 Jul 2010 11:37:01 -0500 Subject: Ignoring the tramp stamp --- .bzrignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.bzrignore b/.bzrignore index 6504595..79f4fe1 100644 --- a/.bzrignore +++ b/.bzrignore @@ -6,3 +6,4 @@ src/indicator-datetime-service po/indicator-datetime.pot indicator-datetime-[0-9].[0-9].[0-9].tar.gz data/indicator-datetime.service +data/org.ayatana.indicator.datetime.gschema.valid -- cgit v1.2.3 From 3575d726899cdb7ce8f928fe2f873c925c8cb9e3 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 15 Jul 2010 15:02:17 -0500 Subject: I swear, there were somethings I didn't change! Getting some final settings that make sense. --- data/org.ayatana.indicator.datetime.gschema.xml | 56 ++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 2 deletions(-) diff --git a/data/org.ayatana.indicator.datetime.gschema.xml b/data/org.ayatana.indicator.datetime.gschema.xml index 5833d63..c794d83 100644 --- a/data/org.ayatana.indicator.datetime.gschema.xml +++ b/data/org.ayatana.indicator.datetime.gschema.xml @@ -1,9 +1,61 @@ + + + + + + - + + 'locale-default' + What the time format should be + + Controls the time format that is displayed in the indicator. For almost + all users this should be the default for their locale. If you think the + setting is wrong for your locale please join or talk to the translation + team for your langauge. If you just want something different you can + adjust this to be either 12 or 24 time. Or, you can use a custom format + string and set the custom-time-format setting. + + + + false + Show the number of seconds in the indicator + + Makes the datetime indicator show the number of seconds in the indicator. + It's important to note that this will cause additional battery drain as + the time will update 60 times as often, so it is not recommended. Also, + this setting will be ignored if the time-format value is set to custom. + + + + false + Show the day of the week in the indicator + + Puts the day of the week on the panel along with the time and/or date + depending on settings. This setting will be ignored if the time-format + value is set to custom. + + + + false + Show the month and date in the indicator + + Puts the month and the date in the panel along with the time and/or day + of the week depending on settings. This setting will be ignored if the + time-format value is set to custom. + + + "%l:%M %p" The format string passed to strftime - The format of the time and/or date that is visible on the panel when using the indicator. For most users this will be a set of predefined values as determined by the configuration utility, but advanced users can change it to anything strftime can accept. Look at the man page on strftime for more information. + + The format of the time and/or date that is visible on the panel when using + the indicator. For most users this will be a set of predefined values as + determined by the configuration utility, but advanced users can change it + to anything strftime can accept. Look at the man page on strftime for + more information. + -- cgit v1.2.3 From c3563f869fcf33736919e95acc159c08b3f9faa1 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 15 Jul 2010 15:18:49 -0500 Subject: Getting defines for all the new settings and making things compile again. --- src/indicator-datetime.c | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/src/indicator-datetime.c b/src/indicator-datetime.c index 4779313..f7449c9 100644 --- a/src/indicator-datetime.c +++ b/src/indicator-datetime.c @@ -84,10 +84,23 @@ enum { #define PROP_TIME_FORMAT_S "time-format" -#define SETTING_INTERFACE "org.ayatana.indicator.datetime" -#define SETTING_TIME_FORMAT_S "indicator-time-format" +#define SETTINGS_INTERFACE "org.ayatana.indicator.datetime" +#define SETTINGS_TIME_FORMAT "time-format" +#define SETTINGS_SHOW_SECONDS "show-seconds" +#define SETTINGS_SHOW_DAY "show-day" +#define SETTINGS_SHOW_DATE "show-date" +#define SETTINGS_CUSTOM_TIME_FORMAT_S "custom-time-format" -#define DEFAULT_TIME_FORMAT "%l:%M %p" +enum { + SETTINGS_TIME_LOCALE = 0, + SETTINGS_TIME_12_HOUR = 1, + SETTINGS_TIME_24_HOUR = 2, + SETTINGS_TIME_CUSTOM = 3 +}; + +#define DEFAULT_TIME_12_FORMAT "%l:%M %p" +#define DEFAULT_TIME_24_FORMAT "%H:%M" +#define DEFAULT_TIME_FORMAT DEFAULT_TIME_12_FORMAT #define INDICATOR_DATETIME_GET_PRIVATE(o) \ (G_TYPE_INSTANCE_GET_PRIVATE ((o), INDICATOR_DATETIME_TYPE, IndicatorDatetimePrivate)) @@ -159,15 +172,15 @@ indicator_datetime_init (IndicatorDatetime *self) self->priv->sm = NULL; self->priv->menu = NULL; - self->priv->settings = g_settings_new(SETTING_INTERFACE); + self->priv->settings = g_settings_new(SETTINGS_INTERFACE); if (self->priv->settings != NULL) { g_settings_bind(self->priv->settings, - SETTING_TIME_FORMAT_S, + SETTINGS_CUSTOM_TIME_FORMAT_S, self, PROP_TIME_FORMAT_S, G_SETTINGS_BIND_DEFAULT); } else { - g_warning("Unable to get settings for '" SETTING_INTERFACE "'"); + g_warning("Unable to get settings for '" SETTINGS_INTERFACE "'"); } self->priv->sm = indicator_service_manager_new_version(SERVICE_NAME, SERVICE_VERSION); -- cgit v1.2.3 From a5fe313e98d9b8df5ab952fb0fecb7449f9d8524 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 15 Jul 2010 15:24:45 -0500 Subject: Turning the time format string into custom time format. --- src/indicator-datetime.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/indicator-datetime.c b/src/indicator-datetime.c index f7449c9..c4fc933 100644 --- a/src/indicator-datetime.c +++ b/src/indicator-datetime.c @@ -79,10 +79,12 @@ struct _IndicatorDatetimePrivate { found and looked up. */ enum { PROP_0, - PROP_TIME_FORMAT + PROP_TIME_FORMAT, + PROP_CUSTOM_TIME_FORMAT }; #define PROP_TIME_FORMAT_S "time-format" +#define PROP_CUSTOM_TIME_FORMAT_S "time-format" #define SETTINGS_INTERFACE "org.ayatana.indicator.datetime" #define SETTINGS_TIME_FORMAT "time-format" @@ -141,13 +143,13 @@ indicator_datetime_class_init (IndicatorDatetimeClass *klass) io_class->get_menu = get_menu; /** - IndicatorDatetime:time-format: + IndicatorDatetime:custom-time-format: The format that is used to show the time on the panel. */ g_object_class_install_property (object_class, - PROP_TIME_FORMAT, - g_param_spec_string(PROP_TIME_FORMAT_S, + PROP_CUSTOM_TIME_FORMAT, + g_param_spec_string(PROP_CUSTOM_TIME_FORMAT_S, "The format that is used to show the time on the panel.", "A format string in the form used to pass to strftime to make a string for displaying on the panel.", DEFAULT_TIME_FORMAT, @@ -177,7 +179,7 @@ indicator_datetime_init (IndicatorDatetime *self) g_settings_bind(self->priv->settings, SETTINGS_CUSTOM_TIME_FORMAT_S, self, - PROP_TIME_FORMAT_S, + PROP_CUSTOM_TIME_FORMAT_S, G_SETTINGS_BIND_DEFAULT); } else { g_warning("Unable to get settings for '" SETTINGS_INTERFACE "'"); @@ -244,7 +246,7 @@ indicator_datetime_finalize (GObject *object) static void set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { - g_return_if_fail(prop_id == PROP_TIME_FORMAT); + g_return_if_fail(prop_id == PROP_CUSTOM_TIME_FORMAT); IndicatorDatetime * self = INDICATOR_DATETIME(object); if (self->priv->time_format != NULL) { @@ -261,7 +263,7 @@ set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec static void get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { - g_return_if_fail(prop_id == PROP_TIME_FORMAT); + g_return_if_fail(prop_id == PROP_CUSTOM_TIME_FORMAT); IndicatorDatetime * self = INDICATOR_DATETIME(object); g_value_set_string(value, self->priv->time_format); -- cgit v1.2.3 From 6d7a5eeb4c4d91ae4490b27d13c6bad39098486d Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 15 Jul 2010 15:41:56 -0500 Subject: Whoa, we got lots of properties now. --- src/indicator-datetime.c | 45 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 38 insertions(+), 7 deletions(-) diff --git a/src/indicator-datetime.c b/src/indicator-datetime.c index c4fc933..500f091 100644 --- a/src/indicator-datetime.c +++ b/src/indicator-datetime.c @@ -80,11 +80,17 @@ struct _IndicatorDatetimePrivate { enum { PROP_0, PROP_TIME_FORMAT, + PROP_SHOW_SECONDS, + PROP_SHOW_DAY, + PROP_SHOW_DATE, PROP_CUSTOM_TIME_FORMAT }; -#define PROP_TIME_FORMAT_S "time-format" -#define PROP_CUSTOM_TIME_FORMAT_S "time-format" +#define PROP_TIME_FORMAT_S "time-format" +#define PROP_SHOW_SECONDS_S "show-seconds" +#define PROP_SHOW_DAY_S "show-day" +#define PROP_SHOW_DATE_S "show-date" +#define PROP_CUSTOM_TIME_FORMAT_S "custom-time-format" #define SETTINGS_INTERFACE "org.ayatana.indicator.datetime" #define SETTINGS_TIME_FORMAT "time-format" @@ -142,11 +148,36 @@ indicator_datetime_class_init (IndicatorDatetimeClass *klass) io_class->get_label = get_label; io_class->get_menu = get_menu; - /** - IndicatorDatetime:custom-time-format: - - The format that is used to show the time on the panel. - */ + g_object_class_install_property (object_class, + PROP_TIME_FORMAT, + g_param_spec_int(PROP_TIME_FORMAT_S, + "A choice of which format should be used on the panel", + "Chooses between letting the locale choose the time, 12-hour time, 24-time or using the custom string passed to strftime().", + SETTINGS_TIME_LOCALE, /* min */ + SETTINGS_TIME_CUSTOM, /* max */ + SETTINGS_TIME_LOCALE, /* default */ + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (object_class, + PROP_SHOW_SECONDS, + g_param_spec_boolean(PROP_SHOW_SECONDS_S, + "Whether to show seconds in the indicator.", + "Shows seconds along with the time in the indicator. Also effects refresh interval.", + FALSE, /* default */ + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (object_class, + PROP_SHOW_DAY, + g_param_spec_boolean(PROP_SHOW_DAY_S, + "Whether to show the day of the week in the indicator.", + "Shows the day of the week along with the time in the indicator.", + FALSE, /* default */ + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (object_class, + PROP_SHOW_DATE, + g_param_spec_boolean(PROP_SHOW_DATE_S, + "Whether to show the day and month in the indicator.", + "Shows the day and month along with the time in the indicator.", + FALSE, /* default */ + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (object_class, PROP_CUSTOM_TIME_FORMAT, g_param_spec_string(PROP_CUSTOM_TIME_FORMAT_S, -- cgit v1.2.3 From 8fb0d0bf48f4cdc374683ed207df16c02a0fa756 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 15 Jul 2010 15:46:02 -0500 Subject: Binding the properties into the settings database. --- src/indicator-datetime.c | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/src/indicator-datetime.c b/src/indicator-datetime.c index 500f091..de0edb7 100644 --- a/src/indicator-datetime.c +++ b/src/indicator-datetime.c @@ -93,10 +93,10 @@ enum { #define PROP_CUSTOM_TIME_FORMAT_S "custom-time-format" #define SETTINGS_INTERFACE "org.ayatana.indicator.datetime" -#define SETTINGS_TIME_FORMAT "time-format" -#define SETTINGS_SHOW_SECONDS "show-seconds" -#define SETTINGS_SHOW_DAY "show-day" -#define SETTINGS_SHOW_DATE "show-date" +#define SETTINGS_TIME_FORMAT_S "time-format" +#define SETTINGS_SHOW_SECONDS_S "show-seconds" +#define SETTINGS_SHOW_DAY_S "show-day" +#define SETTINGS_SHOW_DATE_S "show-date" #define SETTINGS_CUSTOM_TIME_FORMAT_S "custom-time-format" enum { @@ -207,6 +207,26 @@ indicator_datetime_init (IndicatorDatetime *self) self->priv->settings = g_settings_new(SETTINGS_INTERFACE); if (self->priv->settings != NULL) { + g_settings_bind(self->priv->settings, + SETTINGS_TIME_FORMAT_S, + self, + PROP_TIME_FORMAT_S, + G_SETTINGS_BIND_DEFAULT); + g_settings_bind(self->priv->settings, + SETTINGS_SHOW_SECONDS_S, + self, + PROP_SHOW_SECONDS_S, + G_SETTINGS_BIND_DEFAULT); + g_settings_bind(self->priv->settings, + SETTINGS_SHOW_DAY_S, + self, + PROP_SHOW_DAY_S, + G_SETTINGS_BIND_DEFAULT); + g_settings_bind(self->priv->settings, + SETTINGS_SHOW_DATE_S, + self, + PROP_SHOW_DATE_S, + G_SETTINGS_BIND_DEFAULT); g_settings_bind(self->priv->settings, SETTINGS_CUSTOM_TIME_FORMAT_S, self, -- cgit v1.2.3 From 533863c215051dd84213daa03f7aa214f64d11cd Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 15 Jul 2010 16:12:12 -0500 Subject: Moving all these properties into the private structure. --- src/indicator-datetime.c | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/src/indicator-datetime.c b/src/indicator-datetime.c index de0edb7..52785bb 100644 --- a/src/indicator-datetime.c +++ b/src/indicator-datetime.c @@ -64,7 +64,13 @@ struct _IndicatorDatetimePrivate { GtkLabel * label; guint timer; - gchar * time_format; + gchar * time_string; + + gint time_mode; + gboolean show_seconds; + gboolean show_date; + gboolean show_day; + gchar * custom_string; guint idle_measure; gint max_width; @@ -200,7 +206,13 @@ indicator_datetime_init (IndicatorDatetime *self) self->priv->idle_measure = 0; self->priv->max_width = 0; - self->priv->time_format = g_strdup(DEFAULT_TIME_FORMAT); + self->priv->time_string = g_strdup(DEFAULT_TIME_FORMAT); + + self->priv->time_mode = SETTINGS_TIME_LOCALE; + self->priv->show_seconds = FALSE; + self->priv->show_date = FALSE; + self->priv->show_day = FALSE; + self->priv->custom_string = g_strdup(DEFAULT_TIME_FORMAT); self->priv->sm = NULL; self->priv->menu = NULL; @@ -285,9 +297,14 @@ indicator_datetime_finalize (GObject *object) { IndicatorDatetime * self = INDICATOR_DATETIME(object); - if (self->priv->time_format != NULL) { - g_free(self->priv->time_format); - self->priv->time_format = NULL; + if (self->priv->time_string != NULL) { + g_free(self->priv->time_string); + self->priv->time_string = NULL; + } + + if (self->priv->custom_string != NULL) { + g_free(self->priv->custom_string); + self->priv->custom_string = NULL; } G_OBJECT_CLASS (indicator_datetime_parent_class)->finalize (object); -- cgit v1.2.3 From 4de10d0ced1994599c040223fcd5012886f3d872 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 15 Jul 2010 16:13:18 -0500 Subject: Clearing set and get property as we're going to have to start from scratch there. --- src/indicator-datetime.c | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/src/indicator-datetime.c b/src/indicator-datetime.c index 52785bb..13d22e3 100644 --- a/src/indicator-datetime.c +++ b/src/indicator-datetime.c @@ -314,28 +314,12 @@ indicator_datetime_finalize (GObject *object) static void set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { - g_return_if_fail(prop_id == PROP_CUSTOM_TIME_FORMAT); - IndicatorDatetime * self = INDICATOR_DATETIME(object); - - if (self->priv->time_format != NULL) { - g_free(self->priv->time_format); - self->priv->time_format = NULL; - } - - self->priv->time_format = g_value_dup_string(value); - g_debug("Changing time format to '%s'", self->priv->time_format); - return; } static void get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { - g_return_if_fail(prop_id == PROP_CUSTOM_TIME_FORMAT); - IndicatorDatetime * self = INDICATOR_DATETIME(object); - - g_value_set_string(value, self->priv->time_format); - return; } @@ -381,7 +365,7 @@ update_label (IndicatorDatetime * io) return; } - strftime(longstr, 128, self->priv->time_format, ltime); + strftime(longstr, 128, self->priv->time_string, ltime); gchar * utf8 = g_locale_to_utf8(longstr, -1, NULL, NULL, NULL); gtk_label_set_label(self->priv->label, utf8); -- cgit v1.2.3 From 56197266a0a3e82b91138988411d5280c96e4569 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 15 Jul 2010 23:18:47 -0500 Subject: Adding a mapping function to pull in the enum value. --- src/indicator-datetime.c | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/indicator-datetime.c b/src/indicator-datetime.c index 13d22e3..eb8394f 100644 --- a/src/indicator-datetime.c +++ b/src/indicator-datetime.c @@ -129,6 +129,8 @@ static void indicator_datetime_dispose (GObject *object); static void indicator_datetime_finalize (GObject *object); static GtkLabel * get_label (IndicatorObject * io); static GtkMenu * get_menu (IndicatorObject * io); +static GVariant * bind_enum_set (const GValue * value, const GVariantType * type, gpointer user_data); +static gboolean bind_enum_get (GValue * value, GVariant * variant, gpointer user_data); /* Indicator Module Config */ INDICATOR_SET_VERSION @@ -219,11 +221,14 @@ indicator_datetime_init (IndicatorDatetime *self) self->priv->settings = g_settings_new(SETTINGS_INTERFACE); if (self->priv->settings != NULL) { - g_settings_bind(self->priv->settings, + g_settings_bind_with_mapping(self->priv->settings, SETTINGS_TIME_FORMAT_S, self, PROP_TIME_FORMAT_S, - G_SETTINGS_BIND_DEFAULT); + G_SETTINGS_BIND_DEFAULT, + bind_enum_get, + bind_enum_set, + NULL, NULL); /* Userdata and destroy func */ g_settings_bind(self->priv->settings, SETTINGS_SHOW_SECONDS_S, self, @@ -311,6 +316,20 @@ indicator_datetime_finalize (GObject *object) return; } +static GVariant * +bind_enum_set (const GValue * value, const GVariantType * type, gpointer user_data) +{ + + return NULL; +} + +static gboolean +bind_enum_get (GValue * value, GVariant * variant, gpointer user_data) +{ + + return FALSE; +} + static void set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { -- cgit v1.2.3 From 189a8a9f03912c6a5da2fa040bca71115be925ee Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 15 Jul 2010 23:28:31 -0500 Subject: Fleshing out the set and get enum functions. --- src/indicator-datetime.c | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/src/indicator-datetime.c b/src/indicator-datetime.c index eb8394f..97d559c 100644 --- a/src/indicator-datetime.c +++ b/src/indicator-datetime.c @@ -316,18 +316,45 @@ indicator_datetime_finalize (GObject *object) return; } +/* Turns the int value into a string GVariant */ static GVariant * bind_enum_set (const GValue * value, const GVariantType * type, gpointer user_data) { - - return NULL; + switch (g_value_get_int(value)) { + case SETTINGS_TIME_LOCALE: + return g_variant_new_string("locale-default"); + case SETTINGS_TIME_12_HOUR: + return g_variant_new_string("12-hour"); + case SETTINGS_TIME_24_HOUR: + return g_variant_new_string("24-hour"); + case SETTINGS_TIME_CUSTOM: + return g_variant_new_string("custom"); + default: + return NULL; + } } +/* Turns a string GVariant into an int value */ static gboolean bind_enum_get (GValue * value, GVariant * variant, gpointer user_data) { + const gchar * str = g_variant_get_string(variant, NULL); + gint output = 0; + + if (g_strcmp0(str, "locale-default") == 0) { + output = SETTINGS_TIME_LOCALE; + } else if (g_strcmp0(str, "12-hour") == 0) { + output = SETTINGS_TIME_12_HOUR; + } else if (g_strcmp0(str, "24-hour") == 0) { + output = SETTINGS_TIME_24_HOUR; + } else if (g_strcmp0(str, "custom") == 0) { + output = SETTINGS_TIME_CUSTOM; + } else { + return FALSE; + } - return FALSE; + g_value_set_int(value, output); + return TRUE; } static void -- cgit v1.2.3 From d0f7773e9d902204b567a319e1a14ecf2d3d4199 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 15 Jul 2010 23:35:06 -0500 Subject: Getting some guts into get --- src/indicator-datetime.c | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/src/indicator-datetime.c b/src/indicator-datetime.c index 97d559c..5c785f9 100644 --- a/src/indicator-datetime.c +++ b/src/indicator-datetime.c @@ -357,15 +357,56 @@ bind_enum_get (GValue * value, GVariant * variant, gpointer user_data) return TRUE; } +/* Sets a property on the object */ static void set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { + switch(prop_id) { + case PROP_TIME_FORMAT: + break; + case PROP_SHOW_SECONDS: + break; + case PROP_SHOW_DAY: + break; + case PROP_SHOW_DATE: + break; + case PROP_CUSTOM_TIME_FORMAT: + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); + return; + } + return; } +/* Gets a property from the object */ static void get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { + IndicatorDatetime * self = INDICATOR_DATETIME(object); + + switch(prop_id) { + case PROP_TIME_FORMAT: + g_value_set_int(value, self->priv->time_mode); + break; + case PROP_SHOW_SECONDS: + g_value_set_boolean(value, self->priv->show_seconds); + break; + case PROP_SHOW_DAY: + g_value_set_boolean(value, self->priv->show_day); + break; + case PROP_SHOW_DATE: + g_value_set_boolean(value, self->priv->show_date); + break; + case PROP_CUSTOM_TIME_FORMAT: + g_value_set_string(value, self->priv->custom_string); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); + return; + } + return; } -- cgit v1.2.3 From 4da93424d08120d6eb46515d3de65928e4a90b14 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 15 Jul 2010 23:42:44 -0500 Subject: Filling out set too. --- src/indicator-datetime.c | 43 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 2 deletions(-) diff --git a/src/indicator-datetime.c b/src/indicator-datetime.c index 5c785f9..334ecd8 100644 --- a/src/indicator-datetime.c +++ b/src/indicator-datetime.c @@ -361,22 +361,61 @@ bind_enum_get (GValue * value, GVariant * variant, gpointer user_data) static void set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { + IndicatorDatetime * self = INDICATOR_DATETIME(object); + gboolean update = FALSE; + switch(prop_id) { - case PROP_TIME_FORMAT: + case PROP_TIME_FORMAT: { + gint newval = g_value_get_int(value); + if (newval != self->priv->time_mode) { + update = TRUE; + self->priv->time_mode = newval; + } break; + } case PROP_SHOW_SECONDS: + if (g_value_get_boolean(value) != self->priv->show_seconds) { + self->priv->show_seconds = !self->priv->show_seconds; + update = TRUE; + } break; case PROP_SHOW_DAY: + if (g_value_get_boolean(value) != self->priv->show_day) { + self->priv->show_day = !self->priv->show_day; + update = TRUE; + } break; case PROP_SHOW_DATE: + if (g_value_get_boolean(value) != self->priv->show_date) { + self->priv->show_date = !self->priv->show_date; + update = TRUE; + } break; - case PROP_CUSTOM_TIME_FORMAT: + case PROP_CUSTOM_TIME_FORMAT: { + const gchar * newstr = g_value_get_string(value); + if (g_strcmp0(newstr, self->priv->custom_string) != 0) { + if (self->priv->custom_string != NULL) { + g_free(self->priv->custom_string); + self->priv->custom_string = NULL; + } + self->priv->custom_string = g_strdup(newstr); + if (self->priv->time_mode == SETTINGS_TIME_CUSTOM) { + update = TRUE; + } + } break; + } default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); return; } + if (!update) { + return; + } + + g_debug("Updating format string"); + return; } -- cgit v1.2.3 From b197777ca10de554d7ab4fc6bfa60c89de13139a Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 16 Jul 2010 00:10:47 -0500 Subject: Gets us somewhere of coming up with a time string. Wow, complex. --- src/indicator-datetime.c | 78 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 77 insertions(+), 1 deletion(-) diff --git a/src/indicator-datetime.c b/src/indicator-datetime.c index 334ecd8..5bbfd48 100644 --- a/src/indicator-datetime.c +++ b/src/indicator-datetime.c @@ -131,6 +131,7 @@ static GtkLabel * get_label (IndicatorObject * io); static GtkMenu * get_menu (IndicatorObject * io); static GVariant * bind_enum_set (const GValue * value, const GVariantType * type, gpointer user_data); static gboolean bind_enum_get (GValue * value, GVariant * variant, gpointer user_data); +static gchar * generate_format_string (IndicatorDatetime * self); /* Indicator Module Config */ INDICATOR_SET_VERSION @@ -414,7 +415,24 @@ set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec return; } - g_debug("Updating format string"); + /* Get the new format string */ + gchar * newformat = generate_format_string(self); + + /* check to ensure the format really changed */ + if (g_strcmp0(self->priv->time_string, newformat) == 0) { + g_free(newformat); + return; + } + + /* Okay now process the change */ + if (self->priv->time_string != NULL) { + g_free(self->priv->time_string); + self->priv->time_string = NULL; + } + self->priv->time_string = newformat; + + /* And update everything */ + /* TODO: Update everything */ return; } @@ -580,6 +598,64 @@ style_changed (GtkWidget * widget, GtkStyle * oldstyle, gpointer data) return; } +/* Tries to figure out what our format string should be. Lots + of translator comments in here. */ +static gchar * +generate_format_string (IndicatorDatetime * self) +{ + if (self->priv->time_mode == SETTINGS_TIME_CUSTOM) { + return g_strdup(self->priv->custom_string); + } + + gboolean twelvehour = TRUE; + + if (self->priv->time_mode == SETTINGS_TIME_LOCALE) { + /* TRANSLATORS: This string is used to determine the default + clock style for your locale. If it is the string '12' then + the default will be a 12-hour clock using AM/PM string. If + it is '24' then it will be a 24-hour clock. Users may over + ride this setting so it's still important to translate the + other strings no matter how this is set. */ + const gchar * locale_default = _("12"); + + if (g_strcmp0(locale_default, "24") == 0) { + twelvehour = FALSE; + } + } else if (self->priv->time_mode == SETTINGS_TIME_24_HOUR) { + twelvehour = FALSE; + } + + const gchar * time_string = NULL; + if (twelvehour) { + if (self->priv->show_seconds) { + /* TRANSLATORS: A format string for the strftime function for + a clock showing 12-hour time with seconds. */ + time_string = _("%l:%M:%S %p"); + } else { + /* TRANSLATORS: A format string for the strftime function for + a clock showing 12-hour time. */ + time_string = _(DEFAULT_TIME_12_FORMAT); + } + } else { + if (self->priv->show_seconds) { + /* TRANSLATORS: A format string for the strftime function for + a clock showing 24-hour time with seconds. */ + time_string = _("%H:%M:%S"); + } else { + /* TRANSLATORS: A format string for the strftime function for + a clock showing 24-hour time. */ + time_string = _(DEFAULT_TIME_24_FORMAT); + } + } + + /* Checkpoint, let's not fail */ + g_return_val_if_fail(time_string != NULL, g_strdup(DEFAULT_TIME_FORMAT)); + + /* TODO: Date */ + + return g_strdup(time_string); +} + /* Grabs the label. Creates it if it doesn't exist already */ static GtkLabel * -- cgit v1.2.3 From 929dd21b5b07e5700ddcd1f83e2a21e1f8611cb4 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 16 Jul 2010 09:40:50 -0500 Subject: Adding in an update on changing the format string. --- src/indicator-datetime.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/indicator-datetime.c b/src/indicator-datetime.c index 5bbfd48..c0a682d 100644 --- a/src/indicator-datetime.c +++ b/src/indicator-datetime.c @@ -132,6 +132,8 @@ static GtkMenu * get_menu (IndicatorObject * io); static GVariant * bind_enum_set (const GValue * value, const GVariantType * type, gpointer user_data); static gboolean bind_enum_get (GValue * value, GVariant * variant, gpointer user_data); static gchar * generate_format_string (IndicatorDatetime * self); +static void update_label (IndicatorDatetime * io); +static void guess_label_size (IndicatorDatetime * self); /* Indicator Module Config */ INDICATOR_SET_VERSION @@ -432,7 +434,8 @@ set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec self->priv->time_string = newformat; /* And update everything */ - /* TODO: Update everything */ + update_label(self); + guess_label_size(self); return; } -- cgit v1.2.3 From fc454b3d1547e9ece9aa1c9296870f7c8c568aca Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 16 Jul 2010 11:26:31 -0500 Subject: Setting the properties only changes things if we're not in custom mode. --- src/indicator-datetime.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/indicator-datetime.c b/src/indicator-datetime.c index c0a682d..1867fda 100644 --- a/src/indicator-datetime.c +++ b/src/indicator-datetime.c @@ -379,19 +379,25 @@ set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec case PROP_SHOW_SECONDS: if (g_value_get_boolean(value) != self->priv->show_seconds) { self->priv->show_seconds = !self->priv->show_seconds; - update = TRUE; + if (self->priv->time_mode != SETTINGS_TIME_CUSTOM) { + update = TRUE; + } } break; case PROP_SHOW_DAY: if (g_value_get_boolean(value) != self->priv->show_day) { self->priv->show_day = !self->priv->show_day; - update = TRUE; + if (self->priv->time_mode != SETTINGS_TIME_CUSTOM) { + update = TRUE; + } } break; case PROP_SHOW_DATE: if (g_value_get_boolean(value) != self->priv->show_date) { self->priv->show_date = !self->priv->show_date; - update = TRUE; + if (self->priv->time_mode != SETTINGS_TIME_CUSTOM) { + update = TRUE; + } } break; case PROP_CUSTOM_TIME_FORMAT: { -- cgit v1.2.3 From 6ce780af71142b0de7bb5560cd0a5fb701938c5a Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 16 Jul 2010 11:50:35 -0500 Subject: Building up the date string. --- src/indicator-datetime.c | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/src/indicator-datetime.c b/src/indicator-datetime.c index 1867fda..f0681b1 100644 --- a/src/indicator-datetime.c +++ b/src/indicator-datetime.c @@ -660,9 +660,34 @@ generate_format_string (IndicatorDatetime * self) /* Checkpoint, let's not fail */ g_return_val_if_fail(time_string != NULL, g_strdup(DEFAULT_TIME_FORMAT)); - /* TODO: Date */ + /* If there's no date or day let's just leave now and + not worry about the rest of this code */ + if (!self->priv->show_date && !self->priv->show_day) { + return g_strdup(time_string); + } + + const gchar * date_string = NULL; + if (self->priv->show_date && self->priv->show_day) { + /* TRANSLATORS: This is a format string passed to strftime to represent + the day of the week, the month and the day of the month. */ + date_string = _("%a %b %e"); + } else if (self->priv->show_date) { + /* TRANSLATORS: This is a format string passed to strftime to represent + the month and the day of the month. */ + date_string = _("%b %e"); + } else if (self->priv->show_day) { + /* TRANSLATORS: This is a format string passed to strftime to represent + the day of the week. */ + date_string = _("%a"); + } + + /* Check point, we should have a date string */ + g_return_val_if_fail(date_string != NULL, g_strdup(time_string)); - return g_strdup(time_string); + /* TRANSLATORS: This is a format string passed to strftime to combine the + date and the time. The value of "%s, %s" would result in a string like + this in US English 12-hour time: 'Fri Jul 16, 11:50 AM' */ + return g_strdup_printf(_("%s, %s"), date_string, time_string); } /* Grabs the label. Creates it if it doesn't -- cgit v1.2.3 From 62067c9b17c53a186681325e503a7df9f145c37c Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 16 Jul 2010 13:03:36 -0500 Subject: A big ass table of the strftime() format strings and what they effect, now we can calculate the max length. --- src/indicator-datetime.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/src/indicator-datetime.c b/src/indicator-datetime.c index f0681b1..171ee2f 100644 --- a/src/indicator-datetime.c +++ b/src/indicator-datetime.c @@ -563,6 +563,65 @@ measure_string (GtkStyle * style, PangoContext * context, const gchar * string) return width; } +/* Format for the table of strftime() modifiers to what + we need to check when determining the length */ +typedef struct _strftime_type_t strftime_type_t; +struct _strftime_type_t { + char character; + gint mask; +}; + +enum { + STRFTIME_MASK_NONE = 0, /* Hours or minutes as we always test those */ + STRFTIME_MASK_SECONDS = 1 << 0, /* Seconds count */ + STRFTIME_MASK_AMPM = 1 << 1, /* AM/PM counts */ + STRFTIME_MASK_WEEK = 1 << 2, /* Day of the week maters (Sat, Sun, etc.) */ + STRFTIME_MASK_DAY = 1 << 3, /* Day of the month counts (Feb 1st) */ + STRFTIME_MASK_MONTH = 1 << 4, /* Which month matters */ + STRFTIME_MASK_YEAR = 1 << 5, /* Which year matters */ + /* Last entry, combines all previous */ + STRFTIME_MASK_ALL = (STRFTIME_MASK_SECONDS | STRFTIME_MASK_AMPM | STRFTIME_MASK_WEEK | STRFTIME_MASK_DAY | STRFTIME_MASK_MONTH | STRFTIME_MASK_YEAR) +}; + +/* A table taken from the man page of strftime to what the different + characters can effect. These are worst case in that we need to + test the length based on all these things to ensure that we have + a reasonable string lenght measurement. */ +const static strftime_type_t strftime_type[] = { + {'a', STRFTIME_MASK_WEEK}, + {'A', STRFTIME_MASK_WEEK}, + {'b', STRFTIME_MASK_MONTH}, + {'B', STRFTIME_MASK_MONTH}, + {'c', STRFTIME_MASK_ALL}, /* We don't know, so we have to assume all */ + {'C', STRFTIME_MASK_YEAR}, + {'d', STRFTIME_MASK_MONTH}, + {'D', STRFTIME_MASK_MONTH | STRFTIME_MASK_YEAR | STRFTIME_MASK_DAY}, + {'e', STRFTIME_MASK_DAY}, + {'F', STRFTIME_MASK_MONTH | STRFTIME_MASK_YEAR | STRFTIME_MASK_DAY}, + {'G', STRFTIME_MASK_YEAR}, + {'g', STRFTIME_MASK_YEAR}, + {'h', STRFTIME_MASK_MONTH}, + {'j', STRFTIME_MASK_DAY}, + {'m', STRFTIME_MASK_MONTH}, + {'p', STRFTIME_MASK_AMPM}, + {'P', STRFTIME_MASK_AMPM}, + {'r', STRFTIME_MASK_AMPM}, + {'s', STRFTIME_MASK_SECONDS}, + {'S', STRFTIME_MASK_SECONDS}, + {'T', STRFTIME_MASK_SECONDS}, + {'u', STRFTIME_MASK_WEEK}, + {'U', STRFTIME_MASK_DAY | STRFTIME_MASK_MONTH}, + {'V', STRFTIME_MASK_DAY | STRFTIME_MASK_MONTH}, + {'w', STRFTIME_MASK_DAY}, + {'W', STRFTIME_MASK_DAY | STRFTIME_MASK_MONTH}, + {'x', STRFTIME_MASK_YEAR | STRFTIME_MASK_MONTH | STRFTIME_MASK_DAY | STRFTIME_MASK_WEEK}, + {'X', STRFTIME_MASK_SECONDS}, + {'y', STRFTIME_MASK_YEAR}, + {'Y', STRFTIME_MASK_YEAR}, + /* Last one */ + {0, 0} +}; + #define FAT_NUMBER 8 /* Try to get a good guess at what a maximum width of the entire -- cgit v1.2.3 From c51a8c3c5e510b05bdc8f71cd8099927ce2c7c53 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 16 Jul 2010 13:17:36 -0500 Subject: Generating the bitmask of posibilities from the format string. --- src/indicator-datetime.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/src/indicator-datetime.c b/src/indicator-datetime.c index 171ee2f..9a29324 100644 --- a/src/indicator-datetime.c +++ b/src/indicator-datetime.c @@ -624,6 +624,43 @@ const static strftime_type_t strftime_type[] = { #define FAT_NUMBER 8 +/* Looks through the characters in the format string to + ensure that we can figure out which of the things we + need to check in determining the length. */ +static gint +generate_strftime_bitmask (IndicatorDatetime * self) +{ + gint retval = 0; + glong strlength = g_utf8_strlen(self->priv->time_string, 0); + gint i; + + for (i = 0; i < strlength; i++) { + if (self->priv->time_string[i] == '%' && i + 1 < strlength) { + gchar evalchar = self->priv->time_string[i + 1]; + + /* If we're using alternate formats we need to skip those characters */ + if (evalchar == 'E' || evalchar == 'O') { + if (i + 2 < strlength) { + evalchar = self->priv->time_string[i + 2]; + } else { + continue; + } + } + + /* Let's look at that character in the table */ + int j; + for (j = 0; strftime_type[j].character != 0; j++) { + if (strftime_type[j].character == evalchar) { + retval |= strftime_type[j].mask; + break; + } + } + } + } + + return retval; +} + /* Try to get a good guess at what a maximum width of the entire string would be. */ static void -- cgit v1.2.3 From d231f790295d72b462ae56fcfaa211a11aeac838 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 16 Jul 2010 14:23:01 -0500 Subject: Starting to build up our new measuring algorithm. Now with just AM/PM in it. --- src/indicator-datetime.c | 49 ++++++++++++++++++++++++++++++++---------------- 1 file changed, 33 insertions(+), 16 deletions(-) diff --git a/src/indicator-datetime.c b/src/indicator-datetime.c index 9a29324..2afe597 100644 --- a/src/indicator-datetime.c +++ b/src/indicator-datetime.c @@ -661,6 +661,29 @@ generate_strftime_bitmask (IndicatorDatetime * self) return retval; } +/* Build an array up of all the time values that we want to check + for length to ensure we're in a good place */ +static void +build_timeval_array (GArray * timevals, gint mask) +{ + struct tm mytm = {0}; + + /* Sun 12/28/8888 00:00 */ + mytm.tm_hour = 0; + mytm.tm_mday = 28; + mytm.tm_mon = 11; + mytm.tm_year = 8888 - 1900; + mytm.tm_wday = 0; + mytm.tm_yday = 363; + g_array_append_val(timevals, mytm); + + /* Sun 12/28/8888 12:00 */ + mytm.tm_hour = 12; + g_array_append_val(timevals, mytm); + + return; +} + /* Try to get a good guess at what a maximum width of the entire string would be. */ static void @@ -668,24 +691,18 @@ guess_label_size (IndicatorDatetime * self) { GtkStyle * style = gtk_widget_get_style(GTK_WIDGET(self->priv->label)); PangoContext * context = gtk_widget_get_pango_context(GTK_WIDGET(self->priv->label)); + gint * max_width = &(self->priv->max_width); + gint posibilitymask = generate_strftime_bitmask(self); - /* TRANSLATORS: This string is used for measuring the size of - the font used for showing the time and is not shown to the - user anywhere. */ - gchar * am_str = g_strdup_printf(_("%d%d:%d%d AM"), FAT_NUMBER, FAT_NUMBER, FAT_NUMBER, FAT_NUMBER); - gint am_width = measure_string(style, context, am_str); - g_free(am_str); - - /* TRANSLATORS: This string is used for measuring the size of - the font used for showing the time and is not shown to the - user anywhere. */ - gchar * pm_str = g_strdup_printf(_("%d%d:%d%d PM"), FAT_NUMBER, FAT_NUMBER, FAT_NUMBER, FAT_NUMBER); - gint pm_width = measure_string(style, context, pm_str); - g_free(pm_str); - - self->priv->max_width = MAX(am_width, pm_width); - gtk_widget_set_size_request(GTK_WIDGET(self->priv->label), self->priv->max_width, -1); + /* Build the array of possibilities that we want to test */ + GArray * timevals = g_array_new(FALSE, TRUE, sizeof(struct tm)); + build_timeval_array(timevals, posibilitymask); + /* TODO: Check 'em all */ + + g_array_free(timevals, TRUE); + + gtk_widget_set_size_request(GTK_WIDGET(self->priv->label), self->priv->max_width, -1); g_debug("Guessing max time width: %d", self->priv->max_width); return; -- cgit v1.2.3 From 621f199bb54a6da98a33885b383589cdd6187766 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 16 Jul 2010 14:45:39 -0500 Subject: Bring in the measuring tape. --- src/indicator-datetime.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/indicator-datetime.c b/src/indicator-datetime.c index 2afe597..adce0b2 100644 --- a/src/indicator-datetime.c +++ b/src/indicator-datetime.c @@ -698,7 +698,19 @@ guess_label_size (IndicatorDatetime * self) GArray * timevals = g_array_new(FALSE, TRUE, sizeof(struct tm)); build_timeval_array(timevals, posibilitymask); - /* TODO: Check 'em all */ + gint check_time; + for (check_time = 0; check_time < timevals->len; check_time++) { + gchar longstr[128]; + strftime(longstr, 128, self->priv->time_string, &(g_array_index(timevals, struct tm, check_time))); + + gchar * utf8 = g_locale_to_utf8(longstr, -1, NULL, NULL, NULL); + gint length = measure_string(style, context, utf8); + g_free(utf8); + + if (length > *max_width) { + *max_width = length; + } + } g_array_free(timevals, TRUE); -- cgit v1.2.3 From f0a6d9725e8ef657f65f178faa264d0f47d8c2bd Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 16 Jul 2010 15:02:02 -0500 Subject: Making the posibility of huge arrays testing length of month names and weekday names, and posibily both. --- src/indicator-datetime.c | 46 +++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/src/indicator-datetime.c b/src/indicator-datetime.c index adce0b2..ddb826c 100644 --- a/src/indicator-datetime.c +++ b/src/indicator-datetime.c @@ -677,9 +677,49 @@ build_timeval_array (GArray * timevals, gint mask) mytm.tm_yday = 363; g_array_append_val(timevals, mytm); - /* Sun 12/28/8888 12:00 */ - mytm.tm_hour = 12; - g_array_append_val(timevals, mytm); + if (mask & STRFTIME_MASK_AMPM) { + /* Sun 12/28/8888 12:00 */ + mytm.tm_hour = 12; + g_array_append_val(timevals, mytm); + } + + /* NOTE: Ignoring year 8888 should handle it */ + + if (mask & STRFTIME_MASK_MONTH) { + gint oldlen = timevals->len; + gint i, j; + for (i = 0; i < oldlen; i++) { + for (j = 0; j < 11; j++) { + struct tm localval = g_array_index(timevals, struct tm, i); + localval.tm_mon = j; + /* Not sure if I need to adjust yday & wday, hope not */ + g_array_append_val(timevals, localval); + } + } + } + + /* Doing these together as it seems like just slightly more + coverage on the numerical days, but worth it. */ + if (mask & (STRFTIME_MASK_WEEK | STRFTIME_MASK_DAY)) { + gint oldlen = timevals->len; + gint i, j; + for (i = 0; i < oldlen; i++) { + for (j = 22; j < 28; j++) { + struct tm localval = g_array_index(timevals, struct tm, i); + + gint diff = 28 - j; + + localval.tm_mday = j; + localval.tm_wday = localval.tm_wday - diff; + if (localval.tm_wday < 0) { + localval.tm_wday += 7; + } + localval.tm_yday = localval.tm_yday - diff; + + g_array_append_val(timevals, localval); + } + } + } return; } -- cgit v1.2.3 From 81b745b7309fa958e96e3df8d683b77cf2f2dac4 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 16 Jul 2010 15:04:14 -0500 Subject: Debug message to check posibilities. --- src/indicator-datetime.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/indicator-datetime.c b/src/indicator-datetime.c index ddb826c..b68a6ea 100644 --- a/src/indicator-datetime.c +++ b/src/indicator-datetime.c @@ -738,6 +738,7 @@ guess_label_size (IndicatorDatetime * self) GArray * timevals = g_array_new(FALSE, TRUE, sizeof(struct tm)); build_timeval_array(timevals, posibilitymask); + g_debug("Checking against %d posible times", timevals->len); gint check_time; for (check_time = 0; check_time < timevals->len; check_time++) { gchar longstr[128]; -- cgit v1.2.3 From bf3973945daef188061f2b6a4486206baaacc49d Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 16 Jul 2010 15:10:58 -0500 Subject: Ah, dumb bug --- src/indicator-datetime.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/indicator-datetime.c b/src/indicator-datetime.c index b68a6ea..5d7502f 100644 --- a/src/indicator-datetime.c +++ b/src/indicator-datetime.c @@ -631,8 +631,9 @@ static gint generate_strftime_bitmask (IndicatorDatetime * self) { gint retval = 0; - glong strlength = g_utf8_strlen(self->priv->time_string, 0); + glong strlength = g_utf8_strlen(self->priv->time_string, -1); gint i; + g_debug("Evaluating bitmask for '%s'", self->priv->time_string); for (i = 0; i < strlength; i++) { if (self->priv->time_string[i] == '%' && i + 1 < strlength) { -- cgit v1.2.3 From f5de0401fe3757957c033043d0cfcab6457cce3f Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 16 Jul 2010 16:21:51 -0500 Subject: Don't check the size of a label we don't have. --- src/indicator-datetime.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/indicator-datetime.c b/src/indicator-datetime.c index 5d7502f..bef53b4 100644 --- a/src/indicator-datetime.c +++ b/src/indicator-datetime.c @@ -730,6 +730,9 @@ build_timeval_array (GArray * timevals, gint mask) static void guess_label_size (IndicatorDatetime * self) { + /* This is during startup. */ + if (self->priv->label == NULL) return; + GtkStyle * style = gtk_widget_get_style(GTK_WIDGET(self->priv->label)); PangoContext * context = gtk_widget_get_pango_context(GTK_WIDGET(self->priv->label)); gint * max_width = &(self->priv->max_width); -- cgit v1.2.3 From 648b7cc189f25359c124161e61536a121f7bc9a9 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 16 Jul 2010 16:38:50 -0500 Subject: Adding a level of indirection to encapsulate the setting up of the timer func --- src/indicator-datetime.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/indicator-datetime.c b/src/indicator-datetime.c index bef53b4..983a76f 100644 --- a/src/indicator-datetime.c +++ b/src/indicator-datetime.c @@ -134,6 +134,7 @@ static gboolean bind_enum_get (GValue * value, GVariant * variant, g static gchar * generate_format_string (IndicatorDatetime * self); static void update_label (IndicatorDatetime * io); static void guess_label_size (IndicatorDatetime * self); +static void setup_timer (IndicatorDatetime * self); /* Indicator Module Config */ INDICATOR_SET_VERSION @@ -533,21 +534,28 @@ update_label (IndicatorDatetime * io) /* Runs every minute and updates the time */ gboolean -minute_timer_func (gpointer user_data) +timer_func (gpointer user_data) { IndicatorDatetime * self = INDICATOR_DATETIME(user_data); + self->priv->timer = 0; + setup_timer(self); if (self->priv->label != NULL) { update_label(self); - return TRUE; - } else { - self->priv->timer = 0; return FALSE; } return FALSE; } +/* Configure the timer to run the next time through */ +static void +setup_timer (IndicatorDatetime * self) +{ + self->priv->timer = g_timeout_add_seconds(60, timer_func, self); + return; +} + /* Does a quick meausre of how big the string is in pixels with a Pango layout */ static gint @@ -878,7 +886,7 @@ get_label (IndicatorObject * io) } if (self->priv->timer == 0) { - self->priv->timer = g_timeout_add_seconds(60, minute_timer_func, self); + setup_timer(self); } return self->priv->label; -- cgit v1.2.3 From 98978e04d0b663af6db11271172d9ea62c1f0f1f Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 16 Jul 2010 16:41:20 -0500 Subject: Protecting the timer from setting up more than one and having it setup when the properties change. --- src/indicator-datetime.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/indicator-datetime.c b/src/indicator-datetime.c index 983a76f..7f8b58d 100644 --- a/src/indicator-datetime.c +++ b/src/indicator-datetime.c @@ -382,6 +382,7 @@ set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec self->priv->show_seconds = !self->priv->show_seconds; if (self->priv->time_mode != SETTINGS_TIME_CUSTOM) { update = TRUE; + setup_timer(self); } } break; @@ -411,6 +412,7 @@ set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec self->priv->custom_string = g_strdup(newstr); if (self->priv->time_mode == SETTINGS_TIME_CUSTOM) { update = TRUE; + setup_timer(self); } } break; @@ -552,6 +554,11 @@ timer_func (gpointer user_data) static void setup_timer (IndicatorDatetime * self) { + if (self->priv->timer != 0) { + g_source_remove(self->priv->timer); + self->priv->timer = 0; + } + self->priv->timer = g_timeout_add_seconds(60, timer_func, self); return; } -- cgit v1.2.3 From e4773774abeb21f9b04c1d7a0ff8dee395719f0b Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 16 Jul 2010 16:46:56 -0500 Subject: Starting to smartly choose when to update the time. --- src/indicator-datetime.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/indicator-datetime.c b/src/indicator-datetime.c index 7f8b58d..c351e3d 100644 --- a/src/indicator-datetime.c +++ b/src/indicator-datetime.c @@ -558,8 +558,20 @@ setup_timer (IndicatorDatetime * self) g_source_remove(self->priv->timer); self->priv->timer = 0; } + + if (self->priv->show_seconds) { + self->priv->timer = g_timeout_add_seconds(1, timer_func, self); + } else { + time_t t; + struct tm *ltime; + + t = time(NULL); + ltime = localtime(&t); + + /* Plus 2 so we're just after the minute, don't want to be early. */ + self->priv->timer = g_timeout_add_seconds(60 - ltime->tm_sec + 2, timer_func, self); + } - self->priv->timer = g_timeout_add_seconds(60, timer_func, self); return; } -- cgit v1.2.3 From 7f0199e5ada294c7e3d2cb972d1158ed59ae38b1 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 16 Jul 2010 16:51:20 -0500 Subject: Making it so that ltime can be a parameter. --- src/indicator-datetime.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/indicator-datetime.c b/src/indicator-datetime.c index c351e3d..7a6f941 100644 --- a/src/indicator-datetime.c +++ b/src/indicator-datetime.c @@ -134,7 +134,7 @@ static gboolean bind_enum_get (GValue * value, GVariant * variant, g static gchar * generate_format_string (IndicatorDatetime * self); static void update_label (IndicatorDatetime * io); static void guess_label_size (IndicatorDatetime * self); -static void setup_timer (IndicatorDatetime * self); +static void setup_timer (IndicatorDatetime * self, struct tm * ltime); /* Indicator Module Config */ INDICATOR_SET_VERSION @@ -382,7 +382,7 @@ set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec self->priv->show_seconds = !self->priv->show_seconds; if (self->priv->time_mode != SETTINGS_TIME_CUSTOM) { update = TRUE; - setup_timer(self); + setup_timer(self, NULL); } } break; @@ -412,7 +412,7 @@ set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec self->priv->custom_string = g_strdup(newstr); if (self->priv->time_mode == SETTINGS_TIME_CUSTOM) { update = TRUE; - setup_timer(self); + setup_timer(self, NULL); } } break; @@ -540,7 +540,7 @@ timer_func (gpointer user_data) { IndicatorDatetime * self = INDICATOR_DATETIME(user_data); self->priv->timer = 0; - setup_timer(self); + setup_timer(self, NULL); if (self->priv->label != NULL) { update_label(self); @@ -552,7 +552,7 @@ timer_func (gpointer user_data) /* Configure the timer to run the next time through */ static void -setup_timer (IndicatorDatetime * self) +setup_timer (IndicatorDatetime * self, struct tm * ltime) { if (self->priv->timer != 0) { g_source_remove(self->priv->timer); @@ -562,11 +562,11 @@ setup_timer (IndicatorDatetime * self) if (self->priv->show_seconds) { self->priv->timer = g_timeout_add_seconds(1, timer_func, self); } else { - time_t t; - struct tm *ltime; - - t = time(NULL); - ltime = localtime(&t); + if (ltime == NULL) { + time_t t; + t = time(NULL); + ltime = localtime(&t); + } /* Plus 2 so we're just after the minute, don't want to be early. */ self->priv->timer = g_timeout_add_seconds(60 - ltime->tm_sec + 2, timer_func, self); @@ -905,7 +905,7 @@ get_label (IndicatorObject * io) } if (self->priv->timer == 0) { - setup_timer(self); + setup_timer(self, NULL); } return self->priv->label; -- cgit v1.2.3 From 2dd110402933ffb4d3ce5ea76540c4af44522188 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 16 Jul 2010 16:52:21 -0500 Subject: Making it so that update_label can return struct tm --- src/indicator-datetime.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/indicator-datetime.c b/src/indicator-datetime.c index 7a6f941..b7b8a2d 100644 --- a/src/indicator-datetime.c +++ b/src/indicator-datetime.c @@ -132,7 +132,7 @@ static GtkMenu * get_menu (IndicatorObject * io); static GVariant * bind_enum_set (const GValue * value, const GVariantType * type, gpointer user_data); static gboolean bind_enum_get (GValue * value, GVariant * variant, gpointer user_data); static gchar * generate_format_string (IndicatorDatetime * self); -static void update_label (IndicatorDatetime * io); +static struct tm * update_label (IndicatorDatetime * io); static void guess_label_size (IndicatorDatetime * self); static void setup_timer (IndicatorDatetime * self, struct tm * ltime); @@ -502,12 +502,12 @@ idle_measure (gpointer data) } /* Updates the label to be the current time. */ -static void +static struct tm * update_label (IndicatorDatetime * io) { IndicatorDatetime * self = INDICATOR_DATETIME(io); - if (self->priv->label == NULL) return; + if (self->priv->label == NULL) return NULL; gchar longstr[128]; time_t t; @@ -518,7 +518,7 @@ update_label (IndicatorDatetime * io) if (ltime == NULL) { g_debug("Error getting local time"); gtk_label_set_label(self->priv->label, _("Error getting time")); - return; + return NULL; } strftime(longstr, 128, self->priv->time_string, ltime); @@ -531,7 +531,7 @@ update_label (IndicatorDatetime * io) self->priv->idle_measure = g_idle_add(idle_measure, io); } - return; + return ltime; } /* Runs every minute and updates the time */ -- cgit v1.2.3 From e4a111094e82dec901da137273d79e2f1945d0ca Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 16 Jul 2010 16:54:15 -0500 Subject: In the timer function we're recycling the pointer to struct tm --- src/indicator-datetime.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/indicator-datetime.c b/src/indicator-datetime.c index b7b8a2d..7034fb8 100644 --- a/src/indicator-datetime.c +++ b/src/indicator-datetime.c @@ -540,13 +540,8 @@ timer_func (gpointer user_data) { IndicatorDatetime * self = INDICATOR_DATETIME(user_data); self->priv->timer = 0; - setup_timer(self, NULL); - - if (self->priv->label != NULL) { - update_label(self); - return FALSE; - } - + struct tm * ltime = update_label(self); + setup_timer(self, ltime); return FALSE; } -- cgit v1.2.3