diff -up gnome-panel-2.21.91/applets/clock/clock-location-tile.h.localtime gnome-panel-2.21.91/applets/clock/clock-location-tile.h --- gnome-panel-2.21.91/applets/clock/clock-location-tile.h.localtime 2008-02-11 16:15:51.000000000 -0500 +++ gnome-panel-2.21.91/applets/clock/clock-location-tile.h 2008-02-17 19:26:15.000000000 -0500 @@ -28,7 +28,7 @@ typedef struct void (* tile_pressed) (ClockLocationTile *tile); void (* timezone_set) (ClockLocationTile *tile); void (* weather_updated) (ClockLocationTile *tile, GdkPixbuf *weather_icon, const char *temperature); - char *(* need_formatted_time) (ClockLocationTile *tile); + int (* need_clock_format) (ClockLocationTile *tile); } ClockLocationTileClass; GType clock_location_tile_get_type (void); @@ -40,7 +40,8 @@ ClockLocation *clock_location_tile_get_l void weather_info_setup_tooltip (WeatherInfo *info, GtkTooltip *tip); -void clock_location_tile_refresh (ClockLocationTile *this); +void clock_location_tile_refresh (ClockLocationTile *this, + gboolean force_refresh); G_END_DECLS #endif /* __CLOCK_H__ */ diff -up gnome-panel-2.21.91/applets/clock/clock.c.localtime gnome-panel-2.21.91/applets/clock/clock.c --- gnome-panel-2.21.91/applets/clock/clock.c.localtime 2008-02-11 16:15:51.000000000 -0500 +++ gnome-panel-2.21.91/applets/clock/clock.c 2008-02-17 19:25:23.000000000 -0500 @@ -508,7 +508,7 @@ update_location_tiles (ClockData *cd) ClockLocationTile *tile; tile = CLOCK_LOCATION_TILE (l->data); - clock_location_tile_refresh (tile); + clock_location_tile_refresh (tile, FALSE); } } @@ -1084,12 +1084,12 @@ location_tile_weather_updated_cb (ClockL gtk_label_set_text (GTK_LABEL (cd->panel_temperature_label), temperature); } -static char * -location_tile_need_formatted_time_cb (ClockLocationTile *tile, gpointer data) +static ClockFormat +location_tile_need_clock_format_cb(ClockLocationTile *tile, gpointer data) { ClockData *cd = data; - return format_time (cd); + return cd->format; } static void @@ -1133,8 +1133,10 @@ create_cities_section (ClockData *cd) G_CALLBACK (location_tile_timezone_set_cb), cd); g_signal_connect (city, "weather-updated", G_CALLBACK (location_tile_weather_updated_cb), cd); - g_signal_connect (city, "need-formatted-time", - G_CALLBACK (location_tile_need_formatted_time_cb), cd); + g_signal_connect (city, "need-clock-format", + G_CALLBACK (location_tile_need_clock_format_cb), cd); + + clock_location_tile_refresh (city, TRUE); gtk_box_pack_start (GTK_BOX (cd->cities_section), GTK_WIDGET (city), diff -up gnome-panel-2.21.91/applets/clock/clock-location-tile.c.localtime gnome-panel-2.21.91/applets/clock/clock-location-tile.c --- gnome-panel-2.21.91/applets/clock/clock-location-tile.c.localtime 2008-02-11 16:15:51.000000000 -0500 +++ gnome-panel-2.21.91/applets/clock/clock-location-tile.c 2008-02-17 19:26:03.000000000 -0500 @@ -11,6 +11,7 @@ #include "clock-face.h" #include "clock-location-tile.h" #include "clock-location.h" +#include "clock-utils.h" #include "clock-marshallers.h" #include "set-timezone.h" @@ -20,7 +21,7 @@ enum { TILE_PRESSED, TIMEZONE_SET, WEATHER_UPDATED, - NEED_FORMATTED_TIME, + NEED_CLOCK_FORMAT, LAST_SIGNAL }; @@ -122,14 +123,15 @@ clock_location_tile_class_init (ClockLoc G_TYPE_NONE, 2, G_TYPE_OBJECT, G_TYPE_STRING); - signals[NEED_FORMATTED_TIME] = g_signal_new ("need-formatted-time", - G_TYPE_FROM_CLASS (g_obj_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (ClockLocationTileClass, need_formatted_time), - NULL, - NULL, - _clock_marshal_STRING__VOID, - G_TYPE_STRING, 0); + + signals[NEED_CLOCK_FORMAT] = g_signal_new ("need-clock-format", + G_TYPE_FROM_CLASS (g_obj_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ClockLocationTileClass, need_clock_format), + NULL, + NULL, + _clock_marshal_INT__VOID, + G_TYPE_INT, 0); } static void @@ -310,7 +312,7 @@ clock_location_tile_fill (ClockLocationT gtk_container_add (GTK_CONTAINER (priv->box), alignment); gtk_container_add (GTK_CONTAINER (this), priv->box); - clock_location_tile_refresh (this); + clock_location_tile_refresh (this, TRUE); } static gboolean @@ -378,13 +380,72 @@ emit_weather_updated (ClockLocationTile g_signal_emit (this, signals[WEATHER_UPDATED], 0, weather_icon, temperature); } +static char * +format_time (struct tm *now, + char *tzname, + ClockFormat clock_format, + long offset) +{ + char buf[256]; + char *format; + time_t local_t; + struct tm local_now; + char *utf8; + char *tmp; + long hours, minutes; + + time (&local_t); + localtime_r (&local_t, &local_now); + + if (local_now.tm_wday != now->tm_wday) { + if (clock_format == CLOCK_FORMAT_12) { + format = _("%l:%M %p (%A)"); + } + else { + format = _("%H:%M (%A)"); + } + } + else { + if (clock_format == CLOCK_FORMAT_12) { + format = _("%l:%M %p"); + } + else { + format = _("%H:%M"); + } + } + + if (strftime (buf, sizeof (buf), format, now) <= 0) { + strcpy (buf, "???"); + } + + hours = offset / 3600; + minutes = labs (offset % 3600) / 60; + + if (hours != 0 && minutes != 0) { + tmp = g_strdup_printf ("%s %s %+ld:%ld", buf, tzname, hours, minutes); + } + else if (hours != 0) { + tmp = g_strdup_printf ("%s %s %+ld", buf, tzname, hours); + } + else { + tmp = g_strdup_printf ("%s %s", buf, tzname); + } + + utf8 = g_locale_to_utf8 (tmp, -1, NULL, NULL, NULL); + + g_free (tmp); + + return utf8; +} + void -clock_location_tile_refresh (ClockLocationTile *this) +clock_location_tile_refresh (ClockLocationTile *this, gboolean force_refresh) { ClockLocationTilePrivate *priv = PRIVATE (this); - gchar *tmp, *tmp2, *tzname; + gchar *tmp, *tzname; struct tm now; long offset, hours, minutes; + int format; g_return_if_fail (IS_CLOCK_LOCATION_TILE (this)); @@ -411,7 +472,7 @@ clock_location_tile_refresh (ClockLocati clock_face_refresh (CLOCK_FACE (priv->clock_face)); } - if (!clock_needs_label_refresh (this)) { + if (!force_refresh && !clock_needs_label_refresh (this)) { return; } @@ -426,26 +487,15 @@ clock_location_tile_refresh (ClockLocati gtk_label_set_markup (GTK_LABEL (priv->city_label), tmp); g_free (tmp); - tmp = NULL; - g_signal_emit (this, signals[NEED_FORMATTED_TIME], 0, &tmp); + g_signal_emit (this, signals[NEED_CLOCK_FORMAT], 0, &format); offset = - priv->last_offset; - hours = offset / 3600; - minutes = labs (offset % 3600) / 60; + tmp = format_time (&now, tzname, format, offset); - if (hours != 0 && minutes != 0) - tmp2 = g_strdup_printf ("%s %+ld:%ld", tmp ? tmp : "", hours, minutes); - else if (hours != 0) - tmp2 = g_strdup_printf ("%s %+ld", tmp ? tmp : "", hours); - else { - tmp2 = tmp; - tmp = NULL; - } + gtk_label_set_markup (GTK_LABEL (priv->time_label), tmp); - gtk_label_set_markup (GTK_LABEL (priv->time_label), tmp2); g_free (tmp); - g_free (tmp2); } void diff -up gnome-panel-2.21.91/applets/clock/clock-marshallers.list.localtime gnome-panel-2.21.91/applets/clock/clock-marshallers.list --- gnome-panel-2.21.91/applets/clock/clock-marshallers.list.localtime 2008-02-11 16:15:51.000000000 -0500 +++ gnome-panel-2.21.91/applets/clock/clock-marshallers.list 2008-02-17 19:25:23.000000000 -0500 @@ -3,4 +3,4 @@ VOID:OBJECT VOID:POINTER POINTER:VOID VOID:OBJECT,STRING -STRING:VOID +INT:VOID