Updating branch refs/heads/master to bbedf98a21a4540a1a0bb7d5b1e5862cf7dd2878 (commit) from e278dfc3006b3f4bbba8c4d2c04a3269b358040d (commit)
commit bbedf98a21a4540a1a0bb7d5b1e5862cf7dd2878 Author: Harald Judt <h.j...@gmx.at> Date: Wed Jul 4 17:35:03 2012 +0200 Locale support, part 1: Duplicate strings. Values like temperature, wind speed etc. are returned as immutable strings. That's bad because those values are not printed in the format defined by the user's locale. As a first step, duplicate the strings in get_data() and free them in the calling functions. Remove usage of CHK_NULL from get_unit(), as it would create a memory leak. panel-plugin/weather-data.c | 14 ++++---- panel-plugin/weather-data.h | 2 +- panel-plugin/weather-summary.c | 79 ++++++++++++++++++++++++---------------- panel-plugin/weather.c | 26 +++++++++---- 4 files changed, 74 insertions(+), 47 deletions(-) diff --git a/panel-plugin/weather-data.c b/panel-plugin/weather-data.c index b9290cb..73a7929 100644 --- a/panel-plugin/weather-data.c +++ b/panel-plugin/weather-data.c @@ -25,7 +25,7 @@ #include "weather-data.h" #include "weather.h" -#define CHK_NULL(s) ((s) ? (s):"") +#define CHK_NULL(s) ((s) ? g_strdup(s):g_strdup("")) gboolean has_timeslice(xml_weather *data, time_t start, time_t end) { @@ -38,13 +38,13 @@ gboolean has_timeslice(xml_weather *data, time_t start, time_t end) return FALSE; } -const gchar * +gchar * get_data (xml_time *timeslice, datas type) { const xml_location *loc = NULL; if (timeslice == NULL) - return ""; + return g_strdup(""); loc = timeslice->location; @@ -60,9 +60,9 @@ get_data (xml_time *timeslice, datas type) case PRESSURE: return CHK_NULL(loc->pressure_value); case WIND_SPEED: - return CHK_NULL( loc->wind_speed_mps); + return CHK_NULL(loc->wind_speed_mps); case WIND_BEAUFORT: - return CHK_NULL( loc->wind_speed_beaufort); + return CHK_NULL(loc->wind_speed_beaufort); case WIND_DIRECTION: return CHK_NULL(loc->wind_dir_name); case WIND_DIRECTION_DEG: @@ -84,7 +84,7 @@ get_data (xml_time *timeslice, datas type) case SYMBOL: return CHK_NULL(loc->symbol); } - return ""; + return g_strdup(""); } const gchar * @@ -103,7 +103,7 @@ get_unit (xml_time *timeslice, units unit, datas type) case TEMPERATURE: return strcmp(loc->temperature_unit, "celcius") ? "°F":"°C"; case PRESSURE: - return CHK_NULL(loc->pressure_unit); + return (loc->pressure_unit) ? loc->pressure_unit : ""; case WIND_SPEED: return "m/s"; case WIND_DIRECTION_DEG: diff --git a/panel-plugin/weather-data.h b/panel-plugin/weather-data.h index 190d726..b43a3fb 100644 --- a/panel-plugin/weather-data.h +++ b/panel-plugin/weather-data.h @@ -52,7 +52,7 @@ typedef enum { NIGHT } daytime; -const gchar * +gchar * get_data (xml_time *timeslice, datas type); const gchar * get_unit (xml_time *timeslice, units unit, datas type); diff --git a/panel-plugin/weather-summary.c b/panel-plugin/weather-summary.c index d250edd..0466775 100644 --- a/panel-plugin/weather-summary.c +++ b/panel-plugin/weather-summary.c @@ -41,10 +41,14 @@ static gboolean lnk_clicked (GtkTextTag *tag, GObject *obj, #define APPEND_TEXT_ITEM_REAL(text) gtk_text_buffer_insert(GTK_TEXT_BUFFER(buffer), \ &iter, text, -1);\ g_free (value); -#define APPEND_TEXT_ITEM(text, item) value = g_strdup_printf("\t%s%s%s %s\n",\ - text, text?": ":"", \ - get_data(timeslice, item), \ - get_unit(timeslice, data->unit, item)); \ +#define APPEND_TEXT_ITEM(text, item) rawvalue = get_data(timeslice, item); \ + unit = get_unit(timeslice, data->unit, item); \ + value = g_strdup_printf("\t%s%s%s%s%s\n", \ + text, text ? ": " : "", \ + rawvalue, \ + strcmp(unit, "°") ? " " : "", \ + unit); \ + g_free (rawvalue);\ APPEND_TEXT_ITEM_REAL(value); #define APPEND_LINK_ITEM(prefix, text, url, lnk_tag) \ gtk_text_buffer_insert(GTK_TEXT_BUFFER(buffer), \ @@ -231,12 +235,12 @@ create_summary_tab (xfceweather_data *data) GtkTextBuffer *buffer; GtkTextIter iter; GtkTextTag *btag, *ltag1; - gchar *value, *wind, *sun_val, *vis; + gchar *value, *wind, *sun_val, *vis, *rawvalue; + const gchar *unit; GtkWidget *view, *frame, *scrolled; GdkColor lnk_color; GtkAdjustment *adj; GtkWidget *weather_channel_icon; - gchar *start; xml_time *timeslice; view = gtk_text_view_new (); @@ -270,17 +274,11 @@ create_summary_tab (xfceweather_data *data) timeslice = get_current_timeslice(data->weatherdata, FALSE); APPEND_BTEXT(_("Coordinates and Time\n")); - value = g_strdup_printf (_("\tAltitude: %s %s\n" - "\tLatitude: %s%s\n" - "\tLongitude: %s%s\n\n" - "\tData applies to time interval\n" - "\tfrom %s\tto %s"), - get_data(timeslice, ALTITUDE), - get_unit(timeslice, data->unit, ALTITUDE), - get_data(timeslice, LATITUDE), - get_unit(timeslice, data->unit, LATITUDE), - get_data(timeslice, LONGITUDE), - get_unit(timeslice, data->unit, LONGITUDE), + APPEND_TEXT_ITEM (_("Altitude"), ALTITUDE); + APPEND_TEXT_ITEM (_("Latitude"), LATITUDE); + APPEND_TEXT_ITEM (_("Longitude"), LONGITUDE); + + value = g_strdup_printf (_("\n\tData applies to time interval\n\tfrom %s\tto %s"), ctime(×lice->start), ctime(×lice->end)); APPEND_TEXT_ITEM_REAL (value); @@ -291,17 +289,23 @@ create_summary_tab (xfceweather_data *data) /* Wind */ APPEND_BTEXT (_("\nWind\n")); - wind = translate_wind_speed (timeslice, get_data (timeslice, WIND_SPEED), data->unit); - value = g_strdup_printf (_("\t%s: %s (%s on the Beaufort scale)\n"), _("Speed"), wind, - get_data (timeslice, WIND_BEAUFORT)); + rawvalue = get_data (timeslice, WIND_SPEED); + wind = translate_wind_speed (timeslice, rawvalue, data->unit); + g_free (rawvalue); + rawvalue = get_data (timeslice, WIND_BEAUFORT); + value = g_strdup_printf (_("\t%s: %s (%s on the Beaufort scale)\n"), _("Speed"), wind, rawvalue); + g_free (rawvalue); g_free (wind); APPEND_TEXT_ITEM_REAL (value); - wind = translate_wind_direction (get_data (timeslice, WIND_DIRECTION)); + rawvalue = get_data (timeslice, WIND_DIRECTION); + wind = translate_wind_direction (rawvalue); + g_free (rawvalue); + rawvalue = get_data (timeslice, WIND_DIRECTION_DEG); value = g_strdup_printf ("\t%s: %s (%s%s)\n", _("Direction"), - wind ? wind : get_data (timeslice, WIND_DIRECTION), - get_data (timeslice, WIND_DIRECTION_DEG), + wind, rawvalue, get_unit (timeslice, data->unit, WIND_DIRECTION_DEG)); + g_free (rawvalue); g_free (wind); APPEND_TEXT_ITEM_REAL (value); @@ -383,7 +387,7 @@ make_forecast (xfceweather_data *data, GdkColor lightbg = {0, 0xeaea, 0xeaea, 0xeaea}; GdkColor darkbg = {0, 0x6666, 0x6666, 0x6666}; gint num_days = 5, i, weekday, daytime; - gchar *dayname, *value; + gchar *dayname, *wind_speed, *value, *rawvalue; xml_time *fcdata; time_t now_t = time(NULL), fcday_t; struct tm tm_fcday; @@ -445,16 +449,20 @@ make_forecast (xfceweather_data *data, fcdata = make_forecast_data(data->weatherdata, i, daytime); if (fcdata != NULL) { if (fcdata->location != NULL) { - icon = get_icon(get_data(fcdata, SYMBOL), 48, (daytime == NIGHT)); + rawvalue = get_data(fcdata, SYMBOL); + icon = get_icon(rawvalue, 48, (daytime == NIGHT)); + g_free(rawvalue); image = gtk_image_new_from_pixbuf(icon); gtk_box_pack_start(GTK_BOX(forecast_box), GTK_WIDGET(image), TRUE, TRUE, 0); if (G_LIKELY (icon)) g_object_unref (G_OBJECT (icon)); + rawvalue = get_data(fcdata, SYMBOL); value = g_strdup_printf("%s", - translate_desc(get_data(fcdata, SYMBOL), + translate_desc(rawvalue, (daytime == NIGHT))); + g_free(rawvalue); label = gtk_label_new(NULL); gtk_label_set_markup(GTK_LABEL(label), value); gtk_widget_show(GTK_WIDGET(label)); @@ -462,19 +470,25 @@ make_forecast (xfceweather_data *data, TRUE, TRUE, 0); g_free(value); + rawvalue = get_data(fcdata, TEMPERATURE); value = g_strdup_printf("%s %s", - get_data(fcdata, TEMPERATURE), + rawvalue, get_unit(fcdata, data->unit, TEMPERATURE)); + g_free(rawvalue); label = gtk_label_new(value); gtk_widget_show(GTK_WIDGET(label)); gtk_box_pack_start(GTK_BOX(forecast_box), GTK_WIDGET(label), TRUE, TRUE, 0); g_free(value); + rawvalue = get_data(fcdata, WIND_DIRECTION); + wind_speed = get_data(fcdata, WIND_SPEED); value = g_strdup_printf("%s %s %s", - translate_wind_direction(get_data(fcdata, WIND_DIRECTION)), - get_data(fcdata, WIND_SPEED), + translate_wind_direction(rawvalue), + wind_speed, get_unit(fcdata, data->unit, WIND_SPEED)); + g_free(wind_speed); + g_free(rawvalue); label = gtk_label_new(value); gtk_widget_show(GTK_WIDGET(label)); gtk_box_pack_start(GTK_BOX(forecast_box), label, TRUE, TRUE, 0); @@ -521,7 +535,7 @@ GtkWidget * create_summary_window (xfceweather_data *data) { GtkWidget *window, *notebook, *vbox, *hbox, *label; - gchar *title; + gchar *title, *rawvalue; GdkPixbuf *icon; xml_time *timeslice; @@ -543,7 +557,10 @@ create_summary_window (xfceweather_data *data) 0); timeslice = get_current_timeslice(data->weatherdata, TRUE); - icon = get_icon (get_data (timeslice, SYMBOL), 48, is_night_time()); + + rawvalue = get_data (timeslice, SYMBOL); + icon = get_icon (rawvalue, 48, is_night_time()); + g_free (rawvalue); gtk_window_set_icon (GTK_WINDOW (window), icon); diff --git a/panel-plugin/weather.c b/panel-plugin/weather.c index 81ebfd7..833956a 100644 --- a/panel-plugin/weather.c +++ b/panel-plugin/weather.c @@ -100,10 +100,9 @@ make_label (xml_weather *weatherdata, GtkOrientation orientation, gboolean multiple_labels) { - - gchar *str, *value; + gchar *str, *value, *rawvalue; xml_time *timeslice; - const gchar *rawvalue, *lbl, *txtsize; + const gchar *lbl, *txtsize; switch (opt) { @@ -201,6 +200,7 @@ make_label (xml_weather *weatherdata, txtsize, rawvalue, get_unit (timeslice, unit, opt)); } } + g_free (rawvalue); return str; } @@ -316,7 +316,10 @@ set_icon_current (xfceweather_data *data) /* get data from current timeslice */ timeslice = get_current_timeslice(data->weatherdata, TRUE); nighttime = is_night_time(); - icon = get_icon (get_data (timeslice, SYMBOL), size, nighttime); + + str = get_data (timeslice, SYMBOL); + icon = get_icon (str, size, nighttime); + g_free (str); gtk_image_set_from_pixbuf (GTK_IMAGE (data->iconimage), icon); @@ -324,9 +327,11 @@ set_icon_current (xfceweather_data *data) g_object_unref (G_OBJECT (icon)); #if !GTK_CHECK_VERSION(2,12,0) + str = get_data (timeslice, SYMBOL); gtk_tooltips_set_tip (data->tooltips, data->tooltipbox, - translate_desc (get_data (timeslice, SYMBOL), nighttime), + translate_desc (str, nighttime), NULL); + g_free (str); #endif } @@ -796,7 +801,7 @@ static gboolean weather_get_tooltip_cb (GtkWidget *widget, xfceweather_data *data) { GdkPixbuf *icon; - gchar *markup_text; + gchar *markup_text, *rawvalue; xml_time *timeslice; gboolean nighttime; @@ -805,16 +810,21 @@ static gboolean weather_get_tooltip_cb (GtkWidget *widget, if (data->weatherdata == NULL) { gtk_tooltip_set_text (tooltip, _("Cannot update weather data")); } else { + rawvalue = get_data (timeslice, SYMBOL); markup_text = g_markup_printf_escaped( "<b>%s</b>\n" "%s", data->location_name, - translate_desc (get_data (timeslice, SYMBOL), nighttime) + translate_desc (rawvalue, nighttime) ); + g_free(rawvalue); gtk_tooltip_set_markup (tooltip, markup_text); g_free(markup_text); } - icon = get_icon (get_data (timeslice, SYMBOL), 32, nighttime); + + rawvalue = get_data (timeslice, SYMBOL); + icon = get_icon (rawvalue, 32, nighttime); + g_free (rawvalue); gtk_tooltip_set_icon (tooltip, icon); g_object_unref (G_OBJECT(icon)); _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org https://mail.xfce.org/mailman/listinfo/xfce4-commits