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(+) (limited to 'src') 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(+) (limited to 'src') 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(-) (limited to 'src') 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(+) (limited to 'src') 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 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(-) (limited to 'src') 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(-) (limited to 'src') 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(-) (limited to 'src') 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(-) (limited to 'src') 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(-) (limited to 'src') 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(-) (limited to 'src') 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(-) (limited to 'src') 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(-) (limited to 'src') 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(+) (limited to 'src') 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(-) (limited to 'src') 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(-) (limited to 'src') 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(-) (limited to 'src') 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(-) (limited to 'src') 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(-) (limited to 'src') 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(+) (limited to 'src') 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(+) (limited to 'src') 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(-) (limited to 'src') 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(-) (limited to 'src') 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(-) (limited to 'src') 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(+) (limited to 'src') 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(-) (limited to 'src') 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(+) (limited to 'src') 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(-) (limited to 'src') 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(+) (limited to 'src') 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(-) (limited to 'src') 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(-) (limited to 'src') 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(-) (limited to 'src') 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(-) (limited to 'src') 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 From f1e5569348a935def97ed99708864aa6b8096d5e Mon Sep 17 00:00:00 2001 From: David Barth Date: Thu, 22 Jul 2010 21:13:36 +0200 Subject: add a calendar widget to the menu --- src/Makefile.am | 2 + src/calendar-menu-item.c | 100 +++++++++++++++++++++++++++++++++++++++++++++++ src/calendar-menu-item.h | 59 ++++++++++++++++++++++++++++ src/datetime-service.c | 3 +- src/dbus-shared.h | 2 + src/indicator-datetime.c | 34 ++++++++++++++++ 6 files changed, 199 insertions(+), 1 deletion(-) create mode 100644 src/calendar-menu-item.c create mode 100644 src/calendar-menu-item.h (limited to 'src') diff --git a/src/Makefile.am b/src/Makefile.am index fe3db2e..330f09d 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -2,6 +2,8 @@ libexec_PROGRAMS = indicator-datetime-service indicator_datetime_service_SOURCES = \ + calendar-menu-item.c \ + calendar-menu-item.h \ datetime-service.c \ dbus-shared.h indicator_datetime_service_CFLAGS = \ diff --git a/src/calendar-menu-item.c b/src/calendar-menu-item.c new file mode 100644 index 0000000..c2ceec3 --- /dev/null +++ b/src/calendar-menu-item.c @@ -0,0 +1,100 @@ +/* +Calendar menu item dbusmenu "transport" for the corresponding IDO widget. + +Copyright 2010 Canonical Ltd. + +Authors: + David Barth + +This program is free software: you can redistribute it and/or modify it +under the terms of the GNU General Public License version 3, as published +by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranties of +MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR +PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program. If not, see . +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include "calendar-menu-item.h" + +#include "dbus-shared.h" + +#include +#include +#include + +enum { + LAST_SIGNAL +}; + +/* static guint signals[LAST_SIGNAL] = { }; */ + +typedef struct _CalendarMenuItemPrivate CalendarMenuItemPrivate; +struct _CalendarMenuItemPrivate +{ + void * placeholder; +}; + +#define CALENDAR_MENU_ITEM_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), CALENDAR_MENU_ITEM_TYPE, CalendarMenuItemPrivate)) + +/* Prototypes */ +static void calendar_menu_item_class_init (CalendarMenuItemClass *klass); +static void calendar_menu_item_init (CalendarMenuItem *self); +static void calendar_menu_item_dispose (GObject *object); +static void calendar_menu_item_finalize (GObject *object); + +G_DEFINE_TYPE (CalendarMenuItem, calendar_menu_item, DBUSMENU_TYPE_MENUITEM); + +static void +calendar_menu_item_class_init (CalendarMenuItemClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + g_type_class_add_private (klass, sizeof (CalendarMenuItemPrivate)); + + object_class->dispose = calendar_menu_item_dispose; + object_class->finalize = calendar_menu_item_finalize; + + return; +} + +static void +calendar_menu_item_init (CalendarMenuItem *self) +{ + return; +} + +static void +calendar_menu_item_dispose (GObject *object) +{ + G_OBJECT_CLASS (calendar_menu_item_parent_class)->dispose (object); +} + +static void +calendar_menu_item_finalize (GObject *object) +{ + G_OBJECT_CLASS (calendar_menu_item_parent_class)->finalize (object); + + return; +} + +CalendarMenuItem * +calendar_menu_item_new () +{ + CalendarMenuItem * self = g_object_new(CALENDAR_MENU_ITEM_TYPE, NULL); + + dbusmenu_menuitem_property_set(DBUSMENU_MENUITEM(self), DBUSMENU_MENUITEM_PROP_TYPE, DBUSMENU_CALENDAR_MENUITEM_TYPE); + + return self; +} + diff --git a/src/calendar-menu-item.h b/src/calendar-menu-item.h new file mode 100644 index 0000000..7a56f96 --- /dev/null +++ b/src/calendar-menu-item.h @@ -0,0 +1,59 @@ +/* +Calendar menu item dbusmenu "transport" for the corresponding IDO widget. + +Copyright 2010 Canonical Ltd. + +Authors: + David Barth + +This program is free software: you can redistribute it and/or modify it +under the terms of the GNU General Public License version 3, as published +by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranties of +MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR +PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program. If not, see . +*/ + +#ifndef __CALENDAR_MENU_ITEM_H__ +#define __CALENDAR_MENU_ITEM_H__ + +#include +#include + +#include + +G_BEGIN_DECLS + +#define CALENDAR_MENU_ITEM_TYPE (calendar_menu_item_get_type ()) +#define CALENDAR_MENU_ITEM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CALENDAR_MENU_ITEM_TYPE, CalendarMenuItem)) +#define CALENDAR_MENU_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CALENDAR_MENU_ITEM_TYPE, CalendarMenuItemClass)) +#define IS_CALENDAR_MENU_ITEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CALENDAR_MENU_ITEM_TYPE)) +#define IS_CALENDAR_MENU_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CALENDAR_MENU_ITEM_TYPE)) +#define CALENDAR_MENU_ITEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CALENDAR_MENU_ITEM_TYPE, CalendarMenuItemClass)) + +#define CALENDAR_MENU_ITEM_SIGNAL_ACTIVATE "activate" +#define CALENDAR_MENUITEM_PROP_TEXT "text" + +typedef struct _CalendarMenuItem CalendarMenuItem; +typedef struct _CalendarMenuItemClass CalendarMenuItemClass; + +struct _CalendarMenuItemClass { + DbusmenuMenuitemClass parent_class; +}; + +struct _CalendarMenuItem { + DbusmenuMenuitem parent; +}; + +GType calendar_menu_item_get_type (void); +CalendarMenuItem * calendar_menu_item_new (); + +G_END_DECLS + +#endif /* __CALENDAR_MENU_ITEM_H__ */ + diff --git a/src/datetime-service.c b/src/datetime-service.c index 2137065..5c7b76f 100644 --- a/src/datetime-service.c +++ b/src/datetime-service.c @@ -141,7 +141,8 @@ build_menus (DbusmenuMenuitem * root) if (calendar == NULL) { calendar = dbusmenu_menuitem_new(); - dbusmenu_menuitem_property_set (calendar, DBUSMENU_MENUITEM_PROP_LABEL, _("Open Calendar")); + /* dbusmenu_menuitem_property_set (calendar, DBUSMENU_MENUITEM_PROP_LABEL, _("Open Calendar")); */ + dbusmenu_menuitem_property_set (calendar, DBUSMENU_MENUITEM_PROP_TYPE, DBUSMENU_CALENDAR_MENUITEM_TYPE); /* insensitive until we check for available apps */ dbusmenu_menuitem_property_set_bool(calendar, DBUSMENU_MENUITEM_PROP_ENABLED, FALSE); g_signal_connect (G_OBJECT(calendar), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, diff --git a/src/dbus-shared.h b/src/dbus-shared.h index aa6d933..d943cb0 100644 --- a/src/dbus-shared.h +++ b/src/dbus-shared.h @@ -27,3 +27,5 @@ with this program. If not, see . #define MENU_OBJ "/org/ayatana/indicator/datetime/menu" +#define DBUSMENU_CALENDAR_MENUITEM_TYPE "x-canonical-calendar-item" + diff --git a/src/indicator-datetime.c b/src/indicator-datetime.c index 7034fb8..e1f6571 100644 --- a/src/indicator-datetime.c +++ b/src/indicator-datetime.c @@ -36,6 +36,7 @@ with this program. If not, see . /* DBusMenu */ #include +#include #include "dbus-shared.h" @@ -78,6 +79,8 @@ struct _IndicatorDatetimePrivate { IndicatorServiceManager * sm; DbusmenuGtkMenu * menu; + IdoCalendarMenuItem *ido_calendar; + GSettings * settings; }; @@ -882,6 +885,32 @@ generate_format_string (IndicatorDatetime * self) return g_strdup_printf(_("%s, %s"), date_string, time_string); } +static gboolean +new_calendar_item (DbusmenuMenuitem * newitem, + DbusmenuMenuitem * parent, + DbusmenuClient * client) +{ + g_return_val_if_fail(DBUSMENU_IS_MENUITEM(newitem), FALSE); + g_return_val_if_fail(DBUSMENU_IS_GTKCLIENT(client), FALSE); + /* Note: not checking parent, it's reasonable for it to be NULL */ + + IndicatorObject *io = g_object_get_data (G_OBJECT (client), "indicator"); + if (io == NULL) { + g_warning ("found no indicator to attach the caledar to"); + return FALSE; + } + + IndicatorDatetime *self = INDICATOR_DATETIME(io); + self->priv = INDICATOR_DATETIME_GET_PRIVATE(self); + + IdoCalendarMenuItem *ido = IDO_CALENDAR_MENU_ITEM (ido_calendar_menu_item_new ()); + self->priv->ido_calendar = ido; + + dbusmenu_gtkclient_newitem_base(DBUSMENU_GTKCLIENT(client), newitem, GTK_MENU_ITEM(ido), parent); + + return TRUE; +} + /* Grabs the label. Creates it if it doesn't exist already */ static GtkLabel * @@ -915,5 +944,10 @@ get_menu (IndicatorObject * io) self->priv->menu = dbusmenu_gtkmenu_new(SERVICE_NAME, MENU_OBJ); } + DbusmenuGtkClient *client = dbusmenu_gtkmenu_get_client(self->priv->menu); + g_object_set_data (G_OBJECT (client), "indicator", io); + + dbusmenu_client_add_type_handler(DBUSMENU_CLIENT(client), DBUSMENU_CALENDAR_MENUITEM_TYPE, new_calendar_item); + return GTK_MENU(self->priv->menu); } -- cgit v1.2.3 From 2564f8526c2508be8847024f5aad6324db4fb256 Mon Sep 17 00:00:00 2001 From: David Barth Date: Thu, 22 Jul 2010 21:14:47 +0200 Subject: updates the label for changing settings --- src/datetime-service.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'src') diff --git a/src/datetime-service.c b/src/datetime-service.c index 5c7b76f..57dcc5e 100644 --- a/src/datetime-service.c +++ b/src/datetime-service.c @@ -141,7 +141,6 @@ build_menus (DbusmenuMenuitem * root) if (calendar == NULL) { calendar = dbusmenu_menuitem_new(); - /* dbusmenu_menuitem_property_set (calendar, DBUSMENU_MENUITEM_PROP_LABEL, _("Open Calendar")); */ dbusmenu_menuitem_property_set (calendar, DBUSMENU_MENUITEM_PROP_TYPE, DBUSMENU_CALENDAR_MENUITEM_TYPE); /* insensitive until we check for available apps */ dbusmenu_menuitem_property_set_bool(calendar, DBUSMENU_MENUITEM_PROP_ENABLED, FALSE); @@ -157,7 +156,7 @@ build_menus (DbusmenuMenuitem * root) dbusmenu_menuitem_child_append(root, separator); settings = dbusmenu_menuitem_new(); - dbusmenu_menuitem_property_set (settings, DBUSMENU_MENUITEM_PROP_LABEL, _("Set Time and Date...")); + dbusmenu_menuitem_property_set (settings, DBUSMENU_MENUITEM_PROP_LABEL, _("Time & Date Settings...")); /* insensitive until we check for available apps */ dbusmenu_menuitem_property_set_bool(settings, DBUSMENU_MENUITEM_PROP_ENABLED, FALSE); g_signal_connect(G_OBJECT(settings), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(activate_cb), "time-admin"); -- cgit v1.2.3