From a58047257bb1d0e7c7844a5d10955fbe9748d81d Mon Sep 17 00:00:00 2001 From: Florian Brosch Date: Thu, 12 Oct 2017 23:51:57 +0200 Subject: [PATCH] weather: Use -night icons only for fold-results when it makes sense. --- src/gcal-weather-service.c | 110 ++++++++++++++++++++++++++----------- 1 file changed, 79 insertions(+), 31 deletions(-) diff --git a/src/gcal-weather-service.c b/src/gcal-weather-service.c index d76f97cc..0d622b30 100644 --- a/src/gcal-weather-service.c +++ b/src/gcal-weather-service.c @@ -28,6 +28,18 @@ G_BEGIN_DECLS + +/** + * Internal structure used to manage known + * weather icons. + */ +typedef struct +{ + gchar *name; + gboolean night_support; +} GcalWeatherIconInfo; + + /* GcalWeatherService: * * @time_zone: The current time zone @@ -137,9 +149,11 @@ static void gcal_weather_service_set_check_interval (GcalWeatherService static gssize get_normalized_icon_name_len (const gchar *str); -static gchar* get_normalized_icon_name (GWeatherInfo *gwi); +static gchar* get_normalized_icon_name (GWeatherInfo *gwi, + gboolean is_night_icon); -static gint get_icon_name_sortkey (const gchar *icon_name); +static gint get_icon_name_sortkey (const gchar *icon_name, + gboolean *supports_night_icon); static void gcal_weather_service_timer_stop (GcalWeatherService *self); @@ -155,6 +169,7 @@ static inline gboolean get_gweather_temperature (GWeatherInfo gdouble *temp); static gboolean compute_weather_info_data (GSList *samples, + gboolean is_today, gchar **icon_name, gchar **temperature); @@ -387,14 +402,19 @@ get_normalized_icon_name_len (const gchar *str) * Returns: (transfer full): A normalized icon name. */ static gchar* -get_normalized_icon_name (GWeatherInfo* wi) +get_normalized_icon_name (GWeatherInfo* wi, + gboolean is_night_icon) { - const gchar pfx[] = "-symbolic"; - const gsize pfx_size = G_N_ELEMENTS (pfx) - 1; + const gchar night_pfx[] = "-night"; + const gsize night_pfx_size = G_N_ELEMENTS (night_pfx) - 1; + + const gchar sym_pfx[] = "-symbolic"; + const gsize sym_pfx_size = G_N_ELEMENTS (sym_pfx) - 1; const gchar *str; /* unowned */ gssize normalized_size; gchar *buffer = NULL; /* owned */ + gchar *bufpos = NULL; /* unowned */ gsize buffer_size; g_return_val_if_fail (wi != NULL, NULL); @@ -405,12 +425,25 @@ get_normalized_icon_name (GWeatherInfo* wi) normalized_size = get_normalized_icon_name_len (str); g_return_val_if_fail (normalized_size >= 0, NULL); - - buffer_size = normalized_size + pfx_size + 1; - buffer = g_malloc (buffer_size); - memcpy (buffer, str, normalized_size); - memcpy (buffer + normalized_size, pfx, pfx_size); + if (is_night_icon) + buffer_size = normalized_size + night_pfx_size + sym_pfx_size + 1; + else + buffer_size = normalized_size + sym_pfx_size + 1; + + buffer = g_malloc (buffer_size); + bufpos = buffer; + + memcpy (bufpos, str, normalized_size); + bufpos = bufpos + normalized_size; + + if (is_night_icon) + { + memcpy (bufpos, night_pfx, night_pfx_size); + bufpos = bufpos + night_pfx_size; + } + + memcpy (bufpos, sym_pfx, sym_pfx_size); buffer[buffer_size - 1] = '\0'; return buffer; @@ -426,7 +459,8 @@ get_normalized_icon_name (GWeatherInfo* wi) * The lower the key, the better the weather. */ static gint -get_icon_name_sortkey (const gchar *icon_name) +get_icon_name_sortkey (const gchar *icon_name, + gboolean *supports_night_icon) { /* Note that we can't use gweathers condition * field as it is not necessarily holds valid values. @@ -437,27 +471,33 @@ get_icon_name_sortkey (const gchar *icon_name) gssize normalized_name_len; - const gchar* icons[] = - { "weather-clear", - "weather-few-clouds", - "weather-overcast", - "weather-fog", - "weather-showers-scattered", - "weather-showers", - "weather-snow", - "weather-storm", - "weather-severe-alert" + const GcalWeatherIconInfo icons[] = + { {"weather-clear", FALSE}, + {"weather-few-clouds", FALSE}, + {"weather-overcast", FALSE}, + {"weather-fog", FALSE}, + {"weather-showers-scattered", FALSE}, + {"weather-showers", FALSE}, + {"weather-snow", FALSE}, + {"weather-storm", FALSE}, + {"weather-severe-alert", FALSE} }; g_return_val_if_fail (icon_name != NULL, -1); + g_return_val_if_fail (supports_night_icon != NULL, -1); + + *supports_night_icon = FALSE; normalized_name_len = get_normalized_icon_name_len (icon_name); g_return_val_if_fail (normalized_name_len >= 0, -1); for (int i = 0; i < G_N_ELEMENTS (icons); i++) { - if (icons[i][normalized_name_len] == '\0' && strncmp (icon_name, icons[i], normalized_name_len) == 0) - return i; + if (icons[i].name[normalized_name_len] == '\0' && strncmp (icon_name, icons[i].name, normalized_name_len) == 0) + { + *supports_night_icon = icons[i].night_support; + return i; + } } g_warning ("Unknown weather icon '%s'", icon_name); @@ -596,14 +636,17 @@ get_gweather_temperature (GWeatherInfo *gwi, * Returns: %TRUE if there is a valid icon name and temperature. */ static gboolean -compute_weather_info_data (GSList *samples, - gchar **icon_name, - gchar **temperature) +compute_weather_info_data (GSList *samples, + gboolean is_today, + gchar **icon_name, + gchar **temperature) { + gboolean phenomenon_supports_night_icon = FALSE; gint phenomenon_val = -1; GWeatherInfo *phenomenon_gwi = NULL; /* unowned */ gdouble temp_val = NAN; GWeatherInfo *temp_gwi = NULL; /* unowned */ + gboolean has_daytime = FALSE; GSList *iter; /* unowned */ /* Note: I checked three different gweather consumers @@ -623,7 +666,8 @@ compute_weather_info_data (GSList *samples, { GWeatherInfo *gwi; /* unowned */ const gchar *icon_name; /* unowned */ - gint phenomenon = -1; + gint phenomenon = -1; + gboolean supports_night_icon; gdouble temp; gboolean valid_temp; @@ -631,12 +675,13 @@ compute_weather_info_data (GSList *samples, icon_name = gweather_info_get_icon_name (gwi); if (icon_name != NULL) - phenomenon = get_icon_name_sortkey (icon_name); + phenomenon = get_icon_name_sortkey (icon_name, &supports_night_icon); valid_temp = get_gweather_temperature (gwi, &temp); - if (icon_name != NULL && (phenomenon_gwi == NULL || phenomenon > phenomenon_val)) + if (phenomenon >= 0 && (phenomenon_gwi == NULL || phenomenon > phenomenon_val)) { + phenomenon_supports_night_icon = supports_night_icon; phenomenon_val = phenomenon; phenomenon_gwi = gwi; } @@ -646,11 +691,14 @@ compute_weather_info_data (GSList *samples, temp_val = temp; temp_gwi = gwi; } + + if (gweather_info_is_daytime (gwi)) + has_daytime = TRUE; } if (phenomenon_gwi != NULL && temp_gwi != NULL) { - *icon_name = get_normalized_icon_name (phenomenon_gwi); + *icon_name = get_normalized_icon_name (phenomenon_gwi, is_today && !has_daytime && phenomenon_supports_night_icon); *temperature = gweather_info_get_temp (temp_gwi); return TRUE; } @@ -744,7 +792,7 @@ preprocess_gweather_reports (GcalWeatherService *self, g_autofree gchar *icon_name; g_autofree gchar *temperature; - if (compute_weather_info_data (days[i], &icon_name, &temperature)) + if (compute_weather_info_data (days[i], i == 0, &icon_name, &temperature)) { GcalWeatherInfo* gcwi; /* owned */