From owner-svn-ports-all@freebsd.org Wed Mar 6 10:52:16 2019 Return-Path: Delivered-To: svn-ports-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id E1D58150C590; Wed, 6 Mar 2019 10:52:15 +0000 (UTC) (envelope-from madpilot@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) server-signature RSA-PSS (4096 bits) client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 930B08776D; Wed, 6 Mar 2019 10:52:15 +0000 (UTC) (envelope-from madpilot@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 8108B26DE; Wed, 6 Mar 2019 10:52:15 +0000 (UTC) (envelope-from madpilot@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id x26AqFM1063172; Wed, 6 Mar 2019 10:52:15 GMT (envelope-from madpilot@FreeBSD.org) Received: (from madpilot@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id x26AqF2Y063170; Wed, 6 Mar 2019 10:52:15 GMT (envelope-from madpilot@FreeBSD.org) Message-Id: <201903061052.x26AqF2Y063170@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: madpilot set sender to madpilot@FreeBSD.org using -f From: Guido Falsi Date: Wed, 6 Mar 2019 10:52:15 +0000 (UTC) To: ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org Subject: svn commit: r494787 - in head/misc/xfce4-weather-plugin: . files X-SVN-Group: ports-head X-SVN-Commit-Author: madpilot X-SVN-Commit-Paths: in head/misc/xfce4-weather-plugin: . files X-SVN-Commit-Revision: 494787 X-SVN-Commit-Repository: ports MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Rspamd-Queue-Id: 930B08776D X-Spamd-Bar: -- Authentication-Results: mx1.freebsd.org X-Spamd-Result: default: False [-2.95 / 15.00]; local_wl_from(0.00)[FreeBSD.org]; NEURAL_HAM_MEDIUM(-1.00)[-1.000,0]; NEURAL_HAM_SHORT(-0.95)[-0.946,0]; ASN(0.00)[asn:11403, ipnet:2610:1c1:1::/48, country:US]; NEURAL_HAM_LONG(-1.00)[-1.000,0] X-BeenThere: svn-ports-all@freebsd.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: SVN commit messages for the ports tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 06 Mar 2019 10:52:16 -0000 Author: madpilot Date: Wed Mar 6 10:52:14 2019 New Revision: 494787 URL: https://svnweb.freebsd.org/changeset/ports/494787 Log: Import patch from upstream bug report for xfce4-weather-plugin to adapt to new upstream weather service API interface. Previous API version is deprecated and expired by upstream. While here, remove unneeded USES=intlhack. PR: 236166 Submitted by: Olivier Duchateau Obtained from: https://bugzilla.xfce.org/show_bug.cgi?id=14972 MFH: 2019Q1 Added: head/misc/xfce4-weather-plugin/files/ head/misc/xfce4-weather-plugin/files/patch-new_sunrise_API (contents, props changed) Modified: head/misc/xfce4-weather-plugin/Makefile Modified: head/misc/xfce4-weather-plugin/Makefile ============================================================================== --- head/misc/xfce4-weather-plugin/Makefile Wed Mar 6 10:16:17 2019 (r494786) +++ head/misc/xfce4-weather-plugin/Makefile Wed Mar 6 10:52:14 2019 (r494787) @@ -3,6 +3,7 @@ PORTNAME= xfce4-weather-plugin PORTVERSION= 0.9.0 +PORTREVISION= 1 CATEGORIES= misc xfce geography MASTER_SITES= XFCE/src/panel-plugins/${PORTNAME}/${PORTVERSION:R} DIST_SUBDIR= xfce4 @@ -18,7 +19,7 @@ LIB_DEPENDS= libsoup-2.4.so:devel/libsoup \ libfreetype.so:print/freetype2 USES= gettext-tools gmake gnome libtool pkgconfig tar:bzip2 xfce:gtk3 -USE_GNOME= cairo glib20 gtk30 intlhack intltool libxml2 +USE_GNOME= cairo glib20 gtk30 intltool libxml2 USE_XFCE= panel USE_LDCONFIG= yes Added: head/misc/xfce4-weather-plugin/files/patch-new_sunrise_API ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/misc/xfce4-weather-plugin/files/patch-new_sunrise_API Wed Mar 6 10:52:14 2019 (r494787) @@ -0,0 +1,673 @@ +From cc20f088a694613bc2d7551070208dfb9221f9d7 Mon Sep 17 00:00:00 2001 +From: Olivier Duchateau +Date: Sat, 2 Mar 2019 18:57:09 +0100 +Subject: [PATCH] Use the latest sunrise API (2.0) + +--- + panel-plugin/weather-data.c | 12 +-- + panel-plugin/weather-data.h | 2 +- + panel-plugin/weather-parsers.c | 185 +++++++++++++++++---------------- + panel-plugin/weather-summary.c | 20 ++-- + panel-plugin/weather.c | 103 +++++++++++------- + panel-plugin/weather.h | 3 + + 6 files changed, 184 insertions(+), 141 deletions(-) + +diff --git a/panel-plugin/weather-data.c b/panel-plugin/weather-data.c +index cbc7da5..008a60c 100644 +--- panel-plugin/weather-data.c ++++ panel-plugin/weather-data.c +@@ -105,25 +105,25 @@ double_to_string(const gdouble val, + + + gchar * +-format_date(const time_t date_t, ++format_date(time_t date_t, + gchar *format, + gboolean local) + { + struct tm *tm; +- time_t t = date_t; + gchar buf[40]; + size_t size; + ++ if (format == NULL) ++ format = "%Y-%m-%d %H:%M:%S"; ++ + if (G_LIKELY(local)) +- tm = localtime(&t); ++ tm = localtime(&date_t); + else +- tm = gmtime(&t); ++ tm = gmtime(&date_t); + + /* A year <= 1970 means date has not been set */ + if (G_UNLIKELY(tm == NULL) || tm->tm_year <= 70) + return g_strdup("-"); +- if (format == NULL) +- format = "%Y-%m-%d %H:%M:%S"; + size = strftime(buf, 40, format, tm); + return (size ? g_strdup(buf) : g_strdup("-")); + } +diff --git a/panel-plugin/weather-data.h b/panel-plugin/weather-data.h +index 73f5195..63be6aa 100644 +--- panel-plugin/weather-data.h ++++ panel-plugin/weather-data.h +@@ -103,7 +103,7 @@ gdouble string_to_double(const gchar *str, + gchar *double_to_string(gdouble val, + const gchar *format); + +-gchar *format_date(const time_t t, ++gchar *format_date(time_t t, + gchar *format, + gboolean local); + +diff --git a/panel-plugin/weather-parsers.c b/panel-plugin/weather-parsers.c +index d23df2c..ef6f269 100644 +--- panel-plugin/weather-parsers.c ++++ panel-plugin/weather-parsers.c +@@ -35,6 +35,9 @@ + #include + #include + ++#include ++#include ++ + + #define DATA(node) \ + ((gchar *) xmlNodeListGetString(node->doc, node->children, 1)) +@@ -71,6 +74,28 @@ my_timegm(struct tm *tm) + } + + ++/* ++ * Remove offset of timezone, in order to keep previous ++ * date format (before the new API, 2.x). ++ */ ++static gchar * ++remove_timezone_offset(gchar *date) ++{ ++ GRegex *re = NULL; ++ const gchar *pattern = "[+-][0-9]{2}:[0-9]{2}"; ++ gchar *res; ++ ++ re = g_regex_new(pattern, 0, 0, NULL); ++ if (re != NULL && g_regex_match(re, date, 0, NULL)) { ++ res = g_regex_replace(re, date, -1, 0, "Z", 0, NULL); ++ } else { ++ res = date; ++ } ++ g_regex_unref(re); ++ return res; ++} ++ ++ + xml_time * + get_timeslice(xml_weather *wd, + const time_t start_t, +@@ -128,9 +153,10 @@ parse_timestring(const gchar *ts, + time_t t; + struct tm tm; + +- memset(&t, 0, sizeof(time_t)); +- if (G_UNLIKELY(ts == NULL)) ++ if (G_UNLIKELY(ts == NULL)) { ++ memset(&t, 0, sizeof(time_t)); + return t; ++ } + + /* standard format */ + if (format == NULL) +@@ -141,15 +167,22 @@ parse_timestring(const gchar *ts, + memset(&tm, 0, sizeof(struct tm)); + tm.tm_isdst = -1; + +- if (G_UNLIKELY(strptime(ts, format, &tm) == NULL)) +- return t; +- +- if (local) +- t = mktime(&tm); +- else +- t = my_timegm(&tm); ++ if (strptime(ts, format, &tm) != NULL) { ++ if (local) ++ t = mktime(&tm); ++ else ++ t = my_timegm(&tm); + +- return t; ++ if (t < 0) { ++ memset(&t, 0, sizeof(time_t)); ++ return t; ++ } else { ++ return t; ++ } ++ } else { ++ memset(&t, 0, sizeof(time_t)); ++ return t; ++ } + } + + +@@ -365,83 +398,14 @@ parse_weather(xmlNode *cur_node, + } + + +-static void +-parse_astro_location(xmlNode *cur_node, +- xml_astro *astro) +-{ +- xmlNode *child_node; +- gchar *sunrise, *sunset, *moonrise, *moonset; +- gchar *never_rises, *never_sets; +- +- for (child_node = cur_node->children; child_node; +- child_node = child_node->next) { +- if (NODE_IS_TYPE(child_node, "sun")) { +- never_rises = PROP(child_node, "never_rise"); +- if (never_rises && +- (!strcmp(never_rises, "true") || +- !strcmp(never_rises, "1"))) +- astro->sun_never_rises = TRUE; +- else +- astro->sun_never_rises = FALSE; +- xmlFree(never_rises); +- +- never_sets = PROP(child_node, "never_set"); +- if (never_sets && +- (!strcmp(never_sets, "true") || +- !strcmp(never_sets, "1"))) +- astro->sun_never_sets = TRUE; +- else +- astro->sun_never_sets = FALSE; +- xmlFree(never_sets); +- +- sunrise = PROP(child_node, "rise"); +- astro->sunrise = parse_timestring(sunrise, NULL, FALSE); +- xmlFree(sunrise); +- +- sunset = PROP(child_node, "set"); +- astro->sunset = parse_timestring(sunset, NULL, FALSE); +- xmlFree(sunset); +- } +- +- if (NODE_IS_TYPE(child_node, "moon")) { +- never_rises = PROP(child_node, "never_rise"); +- if (never_rises && +- (!strcmp(never_rises, "true") || +- !strcmp(never_rises, "1"))) +- astro->moon_never_rises = TRUE; +- else +- astro->moon_never_rises = FALSE; +- xmlFree(never_rises); +- +- never_sets = PROP(child_node, "never_set"); +- if (never_sets && +- (!strcmp(never_sets, "true") || +- !strcmp(never_sets, "1"))) +- astro->moon_never_sets = TRUE; +- else +- astro->moon_never_sets = FALSE; +- xmlFree(never_sets); +- +- moonrise = PROP(child_node, "rise"); +- astro->moonrise = parse_timestring(moonrise, NULL, FALSE); +- xmlFree(moonrise); +- +- moonset = PROP(child_node, "set"); +- astro->moonset = parse_timestring(moonset, NULL, FALSE); +- xmlFree(moonset); +- +- astro->moon_phase = PROP(child_node, "phase"); +- } +- } +-} +- +- + static xml_astro * + parse_astro_time(xmlNode *cur_node) + { + xmlNode *child_node; + xml_astro *astro; +- gchar *date; ++ gchar *date, *sunrise, *sunset, *moonrise, *moonset; ++ gboolean sun_rises = FALSE, sun_sets = FALSE; ++ gboolean moon_rises = FALSE, moon_sets = FALSE; + + astro = g_slice_new0(xml_astro); + if (G_UNLIKELY(astro == NULL)) +@@ -452,15 +416,61 @@ parse_astro_time(xmlNode *cur_node) + xmlFree(date); + + for (child_node = cur_node->children; child_node; +- child_node = child_node->next) +- if (NODE_IS_TYPE(child_node, "location")) +- parse_astro_location(child_node, astro); ++ child_node = child_node->next) { ++ if (child_node->type == XML_ELEMENT_NODE) { ++ if (NODE_IS_TYPE(child_node, "sunrise")) { ++ sunrise = remove_timezone_offset(PROP(child_node, "time")); ++ astro->sunrise = parse_timestring(sunrise, NULL, FALSE); ++ xmlFree(sunrise); ++ sun_rises = TRUE; ++ } ++ ++ if (NODE_IS_TYPE(child_node, "moonset")) { ++ moonset = remove_timezone_offset(PROP(child_node, "time")); ++ astro->moonset = parse_timestring(moonset, NULL, FALSE); ++ xmlFree(moonset); ++ moon_sets = TRUE; ++ } ++ ++ if (NODE_IS_TYPE(child_node, "sunset")) { ++ sunset = remove_timezone_offset(PROP(child_node, "time")); ++ astro->sunset = parse_timestring(sunset, NULL, FALSE); ++ xmlFree(sunset); ++ sun_sets = TRUE; ++ } ++ ++ if (NODE_IS_TYPE(child_node, "moonrise")) { ++ moonrise = remove_timezone_offset(PROP(child_node, "time")); ++ astro->moonrise = parse_timestring(moonrise, NULL, FALSE); ++ xmlFree(moonrise); ++ moon_rises = TRUE; ++ } ++ } ++ } ++ ++ if (sun_rises) ++ astro->sun_never_rises = FALSE; ++ else ++ astro->sun_never_rises = TRUE; ++ if (sun_sets) ++ astro->sun_never_sets = FALSE; ++ else ++ astro->sun_never_sets = TRUE; ++ ++ if (moon_rises) ++ astro->moon_never_rises = FALSE; ++ else ++ astro->moon_never_rises = TRUE; ++ if (moon_sets) ++ astro->moon_never_sets = FALSE; ++ else ++ astro->moon_never_sets = TRUE; + return astro; + } + + + /* +- * Look at https://api.met.no/weatherapi/sunrise/1.1/schema for information ++ * Look at https://api.met.no/weatherapi/sunrise/2.0/schema for information + * of elements and attributes to expect. + */ + gboolean +@@ -475,7 +485,8 @@ parse_astrodata(xmlNode *cur_node, + return FALSE; + + g_assert(cur_node != NULL); +- if (G_UNLIKELY(cur_node == NULL || !NODE_IS_TYPE(cur_node, "astrodata"))) ++ if (G_UNLIKELY(cur_node == NULL || ++ !NODE_IS_TYPE(cur_node, "location"))) + return FALSE; + + for (child_node = cur_node->children; child_node; +diff --git a/panel-plugin/weather-summary.c b/panel-plugin/weather-summary.c +index bd9b05b..44d1874 100644 +--- panel-plugin/weather-summary.c ++++ panel-plugin/weather-summary.c +@@ -417,12 +417,12 @@ create_summary_tab(plugin_data *data) + value = g_strdup(_("\tSunset:\t\tThe sun never sets today.\n")); + APPEND_TEXT_ITEM_REAL(value); + } else { +- sunrise = format_date(data->current_astro->sunrise, NULL, TRUE); ++ sunrise = format_date(data->current_astro->sunrise, NULL, FALSE); + value = g_strdup_printf(_("\tSunrise:\t\t%s\n"), sunrise); + g_free(sunrise); + APPEND_TEXT_ITEM_REAL(value); + +- sunset = format_date(data->current_astro->sunset, NULL, TRUE); ++ sunset = format_date(data->current_astro->sunset, NULL, FALSE); + value = g_strdup_printf(_("\tSunset:\t\t%s\n\n"), sunset); + g_free(sunset); + APPEND_TEXT_ITEM_REAL(value); +@@ -445,12 +445,12 @@ create_summary_tab(plugin_data *data) + g_strdup(_("\tMoonset:\tThe moon never sets today.\n")); + APPEND_TEXT_ITEM_REAL(value); + } else { +- moonrise = format_date(data->current_astro->moonrise, NULL, TRUE); ++ moonrise = format_date(data->current_astro->moonrise, NULL, FALSE); + value = g_strdup_printf(_("\tMoonrise:\t%s\n"), moonrise); + g_free(moonrise); + APPEND_TEXT_ITEM_REAL(value); + +- moonset = format_date(data->current_astro->moonset, NULL, TRUE); ++ moonset = format_date(data->current_astro->moonset, NULL, FALSE); + value = g_strdup_printf(_("\tMoonset:\t%s\n"), moonset); + g_free(moonset); + APPEND_TEXT_ITEM_REAL(value); +@@ -699,13 +699,13 @@ forecast_day_header_tooltip_text(xml_astro *astro) + "Sunset: The sun never sets this day." + "\n")); + else { +- sunrise = format_date(astro->sunrise, NULL, TRUE); ++ sunrise = format_date(astro->sunrise, NULL, FALSE); + g_string_append_printf(text, _("" + "Sunrise: %s" + "\n"), sunrise); + g_free(sunrise); + +- sunset = format_date(astro->sunset, NULL, TRUE); ++ sunset = format_date(astro->sunset, NULL, FALSE); + g_string_append_printf(text, _("" + "Sunset: %s" + "\n\n"), sunset); +@@ -732,13 +732,13 @@ forecast_day_header_tooltip_text(xml_astro *astro) + "Moonset: The moon never sets this day." + "\n")); + else { +- moonrise = format_date(astro->moonrise, NULL, TRUE); ++ moonrise = format_date(astro->moonrise, NULL, FALSE); + g_string_append_printf(text, _("" + "Moonrise: %s" + "\n"), moonrise); + g_free(moonrise); + +- moonset = format_date(astro->moonset, NULL, TRUE); ++ moonset = format_date(astro->moonset, NULL, FALSE); + g_string_append_printf(text, _("" + "Moonset: %s" + ""), moonset); +@@ -1084,10 +1084,10 @@ update_summary_subtitle(plugin_data *data) + time(&now_t); + #ifdef HAVE_UPOWER_GLIB + if (data->upower_on_battery) +- date_format = "%Y-%m-%d %H:%M %z (%Z)"; ++ date_format = "%Y-%m-%d %H:%M:%S (%Z)"; + else + #endif +- date_format = "%Y-%m-%d %H:%M:%S %z (%Z)"; ++ date_format = "%Y-%m-%d %H:%M:%S (%Z)"; + date = format_date(now_t, date_format, TRUE); + title = g_strdup_printf("%s\n%s", data->location_name, date); + g_free(date); +diff --git a/panel-plugin/weather.c b/panel-plugin/weather.c +index 752de48..c398381 100644 +--- panel-plugin/weather.c ++++ panel-plugin/weather.c +@@ -26,6 +26,9 @@ + #include + #include + ++#include ++#include ++ + #include "weather-parsers.h" + #include "weather-data.h" + #include "weather.h" +@@ -47,12 +50,6 @@ + #define CONN_RETRY_INTERVAL_SMALL (10) + #define CONN_RETRY_INTERVAL_LARGE (10 * 60) + +-/* met.no sunrise API returns data for up to 30 days in the future and +- will return an error page if too many days are requested. Let's +- play it safe and request fewer than that, since we can only get a +- 10 days forecast too. */ +-#define ASTRODATA_MAX_DAYS 25 +- + /* power saving update interval in seconds used as a precaution to + deal with suspend/resume events etc., when nothing needs to be + updated earlier: */ +@@ -81,6 +78,7 @@ + g_free(locname); \ + g_free(lat); \ + g_free(lon); \ ++ g_free(offset); \ + if (keyfile) \ + g_key_file_free(keyfile); + +@@ -269,6 +267,19 @@ update_timezone(plugin_data *data) + } + + ++void ++update_offset(plugin_data *data) ++{ ++ GDateTime *dt; ++ ++ dt = g_date_time_new_now_local(); ++ if (G_LIKELY(data->offset)) ++ g_free(data->offset); ++ ++ data->offset = g_date_time_format(dt, "%:z"); ++} ++ ++ + void + update_icon(plugin_data *data) + { +@@ -481,7 +492,7 @@ cb_astro_update(SoupSession *session, + { + plugin_data *data = user_data; + xmlDoc *doc; +- xmlNode *root_node; ++ xmlNode *root_node, *child_node; + time_t now_t; + gboolean parsing_error = TRUE; + +@@ -492,13 +503,19 @@ cb_astro_update(SoupSession *session, + doc = get_xml_document(msg); + if (G_LIKELY(doc)) { + root_node = xmlDocGetRootElement(doc); +- if (G_LIKELY(root_node)) +- if (parse_astrodata(root_node, data->astrodata)) { +- /* schedule next update */ +- data->astro_update->attempt = 0; +- data->astro_update->last = now_t; +- parsing_error = FALSE; ++ if (G_LIKELY(root_node)) { ++ for (child_node = root_node->children; child_node; ++ child_node = child_node->next) { ++ if (child_node->type == XML_ELEMENT_NODE) { ++ if (parse_astrodata(child_node, data->astrodata)) { ++ /* schedule next update */ ++ data->astro_update->attempt = 0; ++ data->astro_update->last = now_t; ++ parsing_error = FALSE; ++ } ++ } + } ++ } + xmlFreeDoc(doc); + } + if (parsing_error) +@@ -580,8 +597,8 @@ update_handler(plugin_data *data) + { + gchar *url; + gboolean night_time; +- time_t now_t, end_t; +- struct tm now_tm, end_tm; ++ time_t now_t; ++ struct tm now_tm; + + g_assert(data != NULL); + if (G_UNLIKELY(data == NULL)) +@@ -616,26 +633,22 @@ update_handler(plugin_data *data) + data->astro_update->next = time_calc_hour(now_tm, 1); + data->astro_update->started = TRUE; + +- /* calculate date range for request */ +- end_t = time_calc_day(now_tm, ASTRODATA_MAX_DAYS); +- end_tm = *localtime(&end_t); +- + /* build url */ +- url = g_strdup_printf("https://api.met.no/weatherapi/sunrise/1.1/?" +- "lat=%s;lon=%s;" +- "from=%04d-%02d-%02d;" +- "to=%04d-%02d-%02d", ++ url = g_strdup_printf("https://api.met.no/weatherapi" ++ "/sunrise/2.0/?lat=%s&lon=%s&" ++ "date=%04d-%02d-%02d&" ++ "offset=%s&days=%u", + data->lat, data->lon, + now_tm.tm_year + 1900, + now_tm.tm_mon + 1, + now_tm.tm_mday, +- end_tm.tm_year + 1900, +- end_tm.tm_mon + 1, +- end_tm.tm_mday); ++ data->offset, ++ data->forecast_days); + + /* start receive thread */ + g_message(_("getting %s"), url); +- weather_http_queue_request(data->session, url, cb_astro_update, data); ++ weather_http_queue_request(data->session, url, ++ cb_astro_update, data); + g_free(url); + } + +@@ -647,10 +660,10 @@ update_handler(plugin_data *data) + data->weather_update->started = TRUE; + + /* build url */ +- url = +- g_strdup_printf("https://api.met.no/weatherapi" +- "/locationforecastlts/1.3/?lat=%s;lon=%s;msl=%d", +- data->lat, data->lon, data->msl); ++ url = g_strdup_printf("https://api.met.no/weatherapi" ++ "/locationforecastlts/1.3/?lat=%s&lon=%s&" ++ "msl=%d", ++ data->lat, data->lon, data->msl); + + /* start receive thread */ + g_message(_("getting %s"), url); +@@ -707,7 +720,7 @@ schedule_next_wakeup(plugin_data *data) + + next_day_t = day_at_midnight(now_t, 1); + diff = difftime(next_day_t, now_t); +- data->next_wakeup_reason = "current astro data update"; ++ data->next_wakeup_reason = "current astro data update"; + SCHEDULE_WAKEUP_COMPARE(data->astro_update->next, + "astro data download"); + SCHEDULE_WAKEUP_COMPARE(data->weather_update->next, +@@ -853,6 +866,12 @@ xfceweather_read_config(XfcePanelPlugin *plugin, + data->timezone = g_strdup(value); + } + ++ value = xfce_rc_read_entry(rc, "offset", NULL); ++ if (value) { ++ g_free(data->offset); ++ data->offset = g_strdup(value); ++ } ++ + value = xfce_rc_read_entry(rc, "geonames_username", NULL); + if (value) { + g_free(data->geonames_username); +@@ -975,6 +994,8 @@ xfceweather_write_config(XfcePanelPlugin *plugin, + + xfce_rc_write_entry(rc, "timezone", data->timezone); + ++ xfce_rc_write_entry(rc, "offset", data->offset); ++ + if (data->geonames_username) + xfce_rc_write_entry(rc, "geonames_username", data->geonames_username); + +@@ -1076,6 +1097,7 @@ write_cache_file(plugin_data *data) + CACHE_APPEND("location_name=%s\n", data->location_name); + CACHE_APPEND("lat=%s\n", data->lat); + CACHE_APPEND("lon=%s\n", data->lon); ++ CACHE_APPEND("offset=%s\n", data->offset); + g_string_append_printf(out, "msl=%d\n", data->msl); + g_string_append_printf(out, "timeslices=%d\n", wd->timeslices->len); + if (G_LIKELY(data->weather_update)) { +@@ -1190,7 +1212,7 @@ read_cache_file(plugin_data *data) + xml_location *loc = NULL; + xml_astro *astro = NULL; + time_t now_t = time(NULL), cache_date_t; +- gchar *file, *locname = NULL, *lat = NULL, *lon = NULL, *group = NULL; ++ gchar *file, *locname = NULL, *lat = NULL, *lon = NULL, *group = NULL, *offset = NULL; + gchar *timestring; + gint msl, num_timeslices = 0, i, j; + +@@ -1225,7 +1247,8 @@ read_cache_file(plugin_data *data) + locname = g_key_file_get_string(keyfile, group, "location_name", NULL); + lat = g_key_file_get_string(keyfile, group, "lat", NULL); + lon = g_key_file_get_string(keyfile, group, "lon", NULL); +- if (locname == NULL || lat == NULL || lon == NULL) { ++ offset = g_key_file_get_string(keyfile, group, "offset", NULL); ++ if (locname == NULL || lat == NULL || lon == NULL || offset == NULL) { + CACHE_FREE_VARS(); + weather_debug("Required values are missing in the cache file, " + "reading cache file aborted."); +@@ -1236,7 +1259,8 @@ read_cache_file(plugin_data *data) + num_timeslices = g_key_file_get_integer(keyfile, group, + "timeslices", &err); + if (err || strcmp(lat, data->lat) || strcmp(lon, data->lon) || +- msl != data->msl || num_timeslices < 1) { ++ strcmp(offset, data->offset) || msl != data->msl || ++ num_timeslices < 1) { + CACHE_FREE_VARS(); + weather_debug("The required values are not present in the cache file " + "or do not match the current plugin data. Reading " +@@ -1404,6 +1428,9 @@ update_weatherdata_with_reset(plugin_data *data) + /* set location timezone */ + update_timezone(data); + ++ /* set the offset of timezone */ ++ update_offset(data); ++ + /* clear update times */ + init_update_infos(data); + +@@ -1709,9 +1736,9 @@ weather_get_tooltip_text(const plugin_data *data) + sunval = g_strdup(_("The sun never sets today.")); + } else { + sunrise = format_date(data->current_astro->sunrise, +- "%H:%M:%S", TRUE); ++ "%H:%M:%S", FALSE); + sunset = format_date(data->current_astro->sunset, +- "%H:%M:%S", TRUE); ++ "%H:%M:%S", FALSE); + sunval = + g_strdup_printf(_("The sun rises at %s and sets at %s."), + sunrise, sunset); +@@ -1999,6 +2026,7 @@ xfceweather_free(XfcePanelPlugin *plugin, + g_free(data->location_name); + g_free(data->scrollbox_font); + g_free(data->timezone); ++ g_free(data->offset); + g_free(data->timezone_initial); + g_free(data->geonames_username); + +@@ -2170,6 +2198,7 @@ weather_construct(XfcePanelPlugin *plugin) + + xfceweather_read_config(plugin, data); + update_timezone(data); ++ update_offset(data); + read_cache_file(data); + update_current_conditions(data, TRUE); + scrollbox_set_visible(data); +diff --git a/panel-plugin/weather.h b/panel-plugin/weather.h +index b1849a9..31ab9fb 100644 +--- panel-plugin/weather.h ++++ panel-plugin/weather.h +@@ -114,6 +114,7 @@ typedef struct { + gchar *lon; + gint msl; + gchar *timezone; ++ gchar *offset; + gchar *timezone_initial; + gint cache_file_max_age; + gboolean night_time; +@@ -144,6 +145,8 @@ gchar *get_cache_directory(void); + + void update_timezone(plugin_data *data); + ++void update_offset(plugin_data *data); ++ + void update_icon(plugin_data *data); + + void update_scrollbox(plugin_data *data, +-- +2.20.1 +