aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarco Trevisan (Treviño) <mail@3v1n0.net>2010-12-23 00:22:36 +0100
committerMarco Trevisan (Treviño) <mail@3v1n0.net>2010-12-23 00:22:36 +0100
commit0a7a68160740fdacc7a62b7c201c21f2845a4518 (patch)
treec41eb753d6689acf3648acba61c8d3171496a4dd
parent803f8f9c0a81d34c9d94c7b27e3b78fb0a6ecab3 (diff)
downloadayatana-indicator-datetime-0a7a68160740fdacc7a62b7c201c21f2845a4518.tar.gz
ayatana-indicator-datetime-0a7a68160740fdacc7a62b7c201c21f2845a4518.tar.bz2
ayatana-indicator-datetime-0a7a68160740fdacc7a62b7c201c21f2845a4518.zip
Check if the custom time format string shows seconds
If it happens, update the label each second, not only every minute. So now you can also put any custom string showing seconds, getting correctly updated.
-rw-r--r--src/indicator-datetime.c47
1 files changed, 27 insertions, 20 deletions
diff --git a/src/indicator-datetime.c b/src/indicator-datetime.c
index acdc340..75b857d 100644
--- a/src/indicator-datetime.c
+++ b/src/indicator-datetime.c
@@ -75,6 +75,7 @@ struct _IndicatorDatetimePrivate {
gboolean show_date;
gboolean show_day;
gchar * custom_string;
+ gboolean custom_show_seconds;
guint idle_measure;
gint max_width;
@@ -126,6 +127,18 @@ enum {
#define INDICATOR_DATETIME_GET_PRIVATE(o) \
(G_TYPE_INSTANCE_GET_PRIVATE ((o), INDICATOR_DATETIME_TYPE, IndicatorDatetimePrivate))
+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)
+};
+
GType indicator_datetime_get_type (void);
static void indicator_datetime_class_init (IndicatorDatetimeClass *klass);
@@ -143,6 +156,7 @@ static struct tm * update_label (IndicatorDatetime * io);
static void guess_label_size (IndicatorDatetime * self);
static void setup_timer (IndicatorDatetime * self, struct tm * ltime);
static void update_time (DBusGProxy * proxy, gpointer user_data);
+static gint generate_strftime_bitmask (const char *time_str);
/* Indicator Module Config */
INDICATOR_SET_VERSION
@@ -225,6 +239,7 @@ indicator_datetime_init (IndicatorDatetime *self)
self->priv->show_date = FALSE;
self->priv->show_day = FALSE;
self->priv->custom_string = g_strdup(DEFAULT_TIME_FORMAT);
+ self->priv->custom_show_seconds = FALSE;
self->priv->time_string = generate_format_string(self);
@@ -404,6 +419,7 @@ set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec
if (newval != self->priv->time_mode) {
update = TRUE;
self->priv->time_mode = newval;
+ setup_timer(self, NULL);
}
break;
}
@@ -440,6 +456,8 @@ set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec
self->priv->custom_string = NULL;
}
self->priv->custom_string = g_strdup(newstr);
+ gint time_mask = generate_strftime_bitmask(newstr);
+ self->priv->custom_show_seconds = (time_mask & STRFTIME_MASK_SECONDS);
if (self->priv->time_mode == SETTINGS_TIME_CUSTOM) {
update = TRUE;
setup_timer(self, NULL);
@@ -595,7 +613,8 @@ setup_timer (IndicatorDatetime * self, struct tm * ltime)
self->priv->timer = 0;
}
- if (self->priv->show_seconds) {
+ if (self->priv->show_seconds ||
+ (self->priv->time_mode == SETTINGS_TIME_CUSTOM && self->priv->custom_show_seconds)) {
self->priv->timer = g_timeout_add_seconds(1, timer_func, self);
} else {
if (ltime == NULL) {
@@ -634,18 +653,6 @@ struct _strftime_type_t {
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
@@ -691,21 +698,21 @@ const static strftime_type_t strftime_type[] = {
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)
+generate_strftime_bitmask (const char *time_str)
{
gint retval = 0;
- glong strlength = g_utf8_strlen(self->priv->time_string, -1);
+ glong strlength = g_utf8_strlen(time_str, -1);
gint i;
- g_debug("Evaluating bitmask for '%s'", self->priv->time_string);
+ g_debug("Evaluating bitmask for '%s'", time_str);
for (i = 0; i < strlength; i++) {
- if (self->priv->time_string[i] == '%' && i + 1 < strlength) {
- gchar evalchar = self->priv->time_string[i + 1];
+ if (time_str[i] == '%' && i + 1 < strlength) {
+ gchar evalchar = time_str[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];
+ evalchar = time_str[i + 2];
} else {
continue;
}
@@ -799,7 +806,7 @@ 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);
+ gint posibilitymask = generate_strftime_bitmask(self->priv->time_string);
/* Build the array of possibilities that we want to test */
GArray * timevals = g_array_new(FALSE, TRUE, sizeof(struct tm));