diff --git a/configure.ac.in b/configure.ac.in index 04f466a..d1bb58e 100644 --- a/configure.ac.in +++ b/configure.ac.in @@ -59,7 +59,7 @@ dnl *********************************** XDT_CHECK_PACKAGE([GTK], [gtk+-2.0], [2.6.0]) XDT_CHECK_PACKAGE([GTHREAD], [gthread-2.0], [2.6.0]) XDT_CHECK_PACKAGE([LIBXFCE4UTIL], [libxfce4util-1.0], [4.3.90.2]) -XDT_CHECK_PACKAGE([LIBXFCEGUI4], [libxfcegui4-1.0], [4.3.90.2]) +XDT_CHECK_PACKAGE([LIBXFCE4UI], [libxfce4ui-1], [4.7.0]) XDT_CHECK_PACKAGE([LIBXFCE4PANEL], [libxfce4panel-1.0], [4.3.99.1]) XDT_CHECK_PACKAGE([LIBXML], [libxml-2.0], [2.4.0]) diff --git a/panel-plugin/Makefile.am b/panel-plugin/Makefile.am index 50fc962..ed06da1 100644 --- a/panel-plugin/Makefile.am +++ b/panel-plugin/Makefile.am @@ -33,7 +33,7 @@ xfce4_weather_plugin_SOURCES = \ xfce4_weather_plugin_CFLAGS = \ $(LIBXFCE4PANEL_CFLAGS) \ - $(LIBXFCEGUI4_CFLAGS) \ + $(LIBXFCE4UI_CFLAGS) \ $(LIBXFCE4UTIL_CFLAGS) \ $(GTK_CFLAGS) \ $(LIBXML_CFLAGS) @@ -41,7 +41,7 @@ xfce4_weather_plugin_CFLAGS = \ xfce4_weather_plugin_LDADD = \ $(LIBXFCE4PANEL_LIBS) \ $(LIBXFCE4UTIL_LIBS) \ - $(LIBXFCEGUI4_LIBS) \ + $(LIBXFCE4UI_LIBS) \ $(GTK_LIBS) \ $(LIBXML_LIBS) \ $(LIBRESOLV) diff --git a/panel-plugin/weather-config.c b/panel-plugin/weather-config.c index 3023e11..e38e822 100644 --- a/panel-plugin/weather-config.c +++ b/panel-plugin/weather-config.c @@ -20,7 +20,7 @@ #endif #include -#include +#include #include "weather-parsers.h" #include "weather-data.h" @@ -173,14 +173,20 @@ apply_options (xfceweather_dialog *dialog) else data->unit = METRIC; - if (data->location_code) - g_free (data->location_code); + if (data->lat) + g_free (data->lat); + + if (data->lon) + g_free (data->lon); if (data->location_name) g_free (data->location_name); - data->location_code = - g_strdup (gtk_entry_get_text (GTK_ENTRY (dialog->txt_loc_code))); + data->lat = + g_strdup (gtk_entry_get_text (GTK_ENTRY (dialog->txt_lat))); + + data->lon = + g_strdup (gtk_entry_get_text (GTK_ENTRY (dialog->txt_lon))); data->location_name = g_strdup (gtk_label_get_text (GTK_LABEL (dialog->txt_loc_name))); @@ -279,19 +285,21 @@ option_i (datas opt) return -1; } -static void auto_locate_cb(const gchar *loc_name, const gchar *loc_code, gpointer user_data) +static void auto_locate_cb(const gchar *loc_name, const gchar *lat, const gchar *lon, gpointer user_data) { xfceweather_dialog *dialog = (xfceweather_dialog *) user_data; - if (loc_code && loc_name) { - gtk_entry_set_text (GTK_ENTRY (dialog->txt_loc_code), loc_code); + if (lat && lon && loc_name) { + gtk_entry_set_text (GTK_ENTRY (dialog->txt_lat), lat); + gtk_entry_set_text (GTK_ENTRY (dialog->txt_lon), lon); gtk_label_set_text (GTK_LABEL (dialog->txt_loc_name), loc_name); gtk_widget_set_sensitive(dialog->txt_loc_name, TRUE); #if GTK_CHECK_VERSION(2,12,0) gtk_widget_set_tooltip_text(dialog->txt_loc_name,loc_name); #endif } else { - gtk_entry_set_text (GTK_ENTRY (dialog->txt_loc_code), ""); + gtk_entry_set_text (GTK_ENTRY (dialog->txt_lat), ""); + gtk_entry_set_text (GTK_ENTRY (dialog->txt_lon), ""); gtk_label_set_text (GTK_LABEL (dialog->txt_loc_name), _("Unset")); gtk_widget_set_sensitive(dialog->txt_loc_name, TRUE); } @@ -317,7 +325,8 @@ cb_findlocation (GtkButton *button, dialog->wd->proxy_port); if (run_search_dialog (sdialog)) { - gtk_entry_set_text (GTK_ENTRY (dialog->txt_loc_code), sdialog->result); + gtk_entry_set_text (GTK_ENTRY (dialog->txt_lat), sdialog->result_lat); + gtk_entry_set_text (GTK_ENTRY (dialog->txt_lon), sdialog->result_lon); gtk_label_set_text (GTK_LABEL (dialog->txt_loc_name), sdialog->result_name); gtk_widget_set_sensitive(dialog->txt_loc_name, TRUE); #if GTK_CHECK_VERSION(2,12,0) @@ -377,7 +386,8 @@ create_config_dialog (xfceweather_data *data, label = gtk_label_new (_("Location:")); - dialog->txt_loc_code = gtk_entry_new (); + dialog->txt_lat = gtk_entry_new (); + dialog->txt_lon = gtk_entry_new (); dialog->txt_loc_name = gtk_label_new (""); gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); @@ -386,28 +396,23 @@ create_config_dialog (xfceweather_data *data, #if GTK_CHECK_VERSION(2,12,0) gtk_label_set_ellipsize (GTK_LABEL(dialog->txt_loc_name), PANGO_ELLIPSIZE_END); #endif - if (dialog->wd->location_code != NULL) - gtk_entry_set_text (GTK_ENTRY (dialog->txt_loc_code), - dialog->wd->location_code); + if (dialog->wd->lat != NULL) + gtk_entry_set_text (GTK_ENTRY (dialog->txt_lat), + dialog->wd->lat); + if (dialog->wd->lon != NULL) + gtk_entry_set_text (GTK_ENTRY (dialog->txt_lon), + dialog->wd->lon); if (dialog->wd->location_name != NULL) gtk_label_set_text (GTK_LABEL (dialog->txt_loc_name), dialog->wd->location_name); - else if (dialog->wd->weatherdata && - get_data (dialog->wd->weatherdata, DNAM) != NULL && - strlen (get_data (dialog->wd->weatherdata, DNAM)) > 1) - gtk_label_set_text (GTK_LABEL (dialog->txt_loc_name), - get_data (dialog->wd->weatherdata, DNAM)); - else - gtk_label_set_text (GTK_LABEL (dialog->txt_loc_name), - dialog->wd->location_code); #if GTK_CHECK_VERSION(2,12,0) gtk_widget_set_tooltip_text(dialog->txt_loc_name, gtk_label_get_text(GTK_LABEL(dialog->txt_loc_name))); #endif - if (dialog->wd->location_code == NULL) { + if (dialog->wd->lat == NULL || dialog->wd->lon == NULL) { start_auto_locate(dialog); } gtk_size_group_add_widget (sg, label); diff --git a/panel-plugin/weather-config.h b/panel-plugin/weather-config.h index 90a8318..b5b3f16 100644 --- a/panel-plugin/weather-config.h +++ b/panel-plugin/weather-config.h @@ -31,7 +31,8 @@ typedef struct { GtkWidget *dialog; GtkWidget *opt_unit; - GtkWidget *txt_loc_code; + GtkWidget *txt_lat; + GtkWidget *txt_lon; GtkWidget *txt_loc_name; GtkWidget *txt_proxy_host; GtkWidget *txt_proxy_port; diff --git a/panel-plugin/weather-search.c b/panel-plugin/weather-search.c index c43ad15..2b7398e 100644 --- a/panel-plugin/weather-search.c +++ b/panel-plugin/weather-search.c @@ -21,7 +21,7 @@ #include -#include +#include #include "weather-parsers.h" #include "weather-data.h" @@ -36,13 +36,14 @@ static void append_result (GtkListStore *mdl, - gchar *id, + gchar *lat, + gchar *lon, gchar *city) { GtkTreeIter iter; gtk_list_store_append (mdl, &iter); - gtk_list_store_set (mdl, &iter, 0, city, 1, id, -1); + gtk_list_store_set (mdl, &iter, 0, city, 1, lat, lon, -1); } @@ -79,7 +80,7 @@ cb_searchdone (gboolean succeed, search_dialog *dialog = (search_dialog *) user_data; xmlDoc *doc; xmlNode *cur_node; - gchar *id, *city; + gchar *lat, *lon, *city; gint found = 0; GtkTreeIter iter; GtkTreeSelection *selection; @@ -106,24 +107,29 @@ cb_searchdone (gboolean succeed, { for (cur_node = cur_node->children; cur_node; cur_node = cur_node->next) { - if (NODE_IS_TYPE (cur_node, "loc")) + if (NODE_IS_TYPE (cur_node, "place")) { - id = (gchar *) xmlGetProp (cur_node, (const xmlChar *) "id"); - - if (!id) - continue; - - city = DATA (cur_node); + lat = (gchar *) xmlGetProp (cur_node, (const xmlChar *) "lat"); + if (!lat) + continue; + lon = (gchar *) xmlGetProp (cur_node, (const xmlChar *) "lon"); + if (!lon) { + g_free(lat); + continue; + } + city = (gchar *) xmlGetProp (cur_node, (const xmlChar *) "display_name"); if (!city) { - g_free (id); + g_free (lat); + g_free (lon); continue; } - append_result (dialog->result_mdl, id, city); + append_result (dialog->result_mdl, lat, lon, city); found++; - g_free (id); + g_free (lat); + g_free (lon); g_free (city); } } @@ -177,11 +183,11 @@ search_cb (GtkWidget *widget, gtk_widget_set_sensitive(dialog->find_button, FALSE); gtk_dialog_set_response_sensitive(GTK_DIALOG(dialog->dialog), GTK_RESPONSE_ACCEPT, FALSE); - url = g_strdup_printf ("/search/search?where=%s", sane_str); + url = g_strdup_printf ("/search?q=%s&format=xml", sane_str); g_free (sane_str); gtk_tree_view_column_set_title(dialog->column, _("Searching...")); - weather_http_receive_data ("xoap.weather.com", url, + weather_http_receive_data ("nominatim.openstreetmap.org", url, dialog->proxy_host, dialog->proxy_port, cb_searchdone, dialog); @@ -269,7 +275,7 @@ create_search_dialog (GtkWindow *parent, GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_add (GTK_CONTAINER (frame), scroll); - dialog->result_mdl = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING); + dialog->result_mdl = gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); dialog->result_list = gtk_tree_view_new_with_model (GTK_TREE_MODEL (dialog->result_mdl)); dialog->column = gtk_tree_view_column_new_with_attributes (_("Results"), renderer, "text", 0, NULL); gtk_tree_view_append_column (GTK_TREE_VIEW (dialog->result_list), dialog->column); @@ -301,7 +307,13 @@ run_search_dialog (search_dialog *dialog) { gtk_tree_model_get_value (GTK_TREE_MODEL (dialog->result_mdl), &iter, 1, &value); - dialog->result = g_strdup (g_value_get_string (&value)); + dialog->result_lat = g_strdup (g_value_get_string (&value)); + + g_value_unset (&value); + + gtk_tree_model_get_value (GTK_TREE_MODEL (dialog->result_mdl), + &iter, 2, &value); + dialog->result_lon = g_strdup (g_value_get_string (&value)); g_value_unset (&value); @@ -321,7 +333,8 @@ run_search_dialog (search_dialog *dialog) void free_search_dialog (search_dialog * dialog) { - g_free (dialog->result); + g_free (dialog->result_lat); + g_free (dialog->result_lon); g_free (dialog->result_name); g_free (dialog->last_search); @@ -333,7 +346,7 @@ free_search_dialog (search_dialog * dialog) typedef struct { const gchar *proxy_host; gint proxy_port; - void (*cb)(const gchar *loc_name, const gchar *loc_code, gpointer user_data); + void (*cb)(const gchar *loc_name, const gchar *lat, const gchar *lon, gpointer user_data); gpointer user_data; } geolocation_data; @@ -347,10 +360,10 @@ cb_geo_searchdone (gboolean succeed, geolocation_data *data = (geolocation_data *) user_data; xmlDoc *doc; xmlNode *cur_node; - gchar *id, *city; + gchar *lat, *lon, *city; if (!succeed || received == NULL) { - data->cb(NULL, NULL, data->user_data); + data->cb(NULL, NULL, NULL, data->user_data); g_free(data); return; } @@ -364,7 +377,7 @@ cb_geo_searchdone (gboolean succeed, g_free (received); if (!doc) { - data->cb(NULL, NULL, data->user_data); + data->cb(NULL, NULL, NULL, data->user_data); g_free(data); return; } @@ -375,23 +388,29 @@ cb_geo_searchdone (gboolean succeed, { for (cur_node = cur_node->children; cur_node; cur_node = cur_node->next) { - if (NODE_IS_TYPE (cur_node, "loc")) + if (NODE_IS_TYPE (cur_node, "place")) { - id = (gchar *) xmlGetProp (cur_node, (const xmlChar *) "id"); + lat = (gchar *) xmlGetProp (cur_node, (const xmlChar *) "lat"); + if (!lat) + continue; + lon = (gchar *) xmlGetProp (cur_node, (const xmlChar *) "lon"); + if (!lon) { + g_free(lat); + continue; + } - if (!id) - continue; - - city = DATA (cur_node); + city = (gchar *) xmlGetProp (cur_node, (const xmlChar *) "display_name"); if (!city) { - g_free (id); + g_free(lat); + g_free(lon); continue; } - data->cb(city, id, data->user_data); - g_free (id); + data->cb(city, lat, lon, data->user_data); + g_free (lat); + g_free (lon); g_free (city); break; } @@ -418,7 +437,7 @@ cb_geolocation (gboolean succeed, gchar *p; if (!succeed || received == NULL) { - data->cb(NULL, NULL, data->user_data); + data->cb(NULL, NULL, NULL, data->user_data); g_free(data); return; } @@ -439,7 +458,7 @@ cb_geolocation (gboolean succeed, g_free (received); if (!doc) { - data->cb(NULL, NULL, data->user_data); + data->cb(NULL, NULL, NULL, data->user_data); g_free(data); return; } @@ -496,17 +515,17 @@ cb_geolocation (gboolean succeed, gchar *url, *sane_str; if ((sane_str = sanitize_str (full_loc)) == NULL) { - data->cb(NULL, NULL, data->user_data); + data->cb(NULL, NULL, NULL, data->user_data); g_free(data); g_free(full_loc); return; } g_free(full_loc); - url = g_strdup_printf ("/search/search?where=%s", sane_str); + url = g_strdup_printf ("/search?q=%s&format=xml", sane_str); g_free (sane_str); - weather_http_receive_data ("xoap.weather.com", url, + weather_http_receive_data ("nominatim.openstreetmap.org", url, data->proxy_host, data->proxy_port, cb_geo_searchdone, data); g_free(url); @@ -517,7 +536,7 @@ cb_geolocation (gboolean succeed, void weather_search_by_ip( const gchar *proxy_host, gint proxy_port, - void (*gui_cb)(const gchar *loc_name, const gchar *loc_code, gpointer user_data), + void (*gui_cb)(const gchar *loc_name, const gchar *lat, const gchar *lon, gpointer user_data), gpointer user_data) { geolocation_data *data; diff --git a/panel-plugin/weather-search.h b/panel-plugin/weather-search.h index 9473e1b..83c40da 100644 --- a/panel-plugin/weather-search.h +++ b/panel-plugin/weather-search.h @@ -33,7 +33,8 @@ typedef struct GtkListStore *result_mdl; GtkTreeViewColumn *column; - gchar *result; + gchar *result_lat; + gchar *result_lon; gchar *result_name; gchar *proxy_host; @@ -48,7 +49,7 @@ search_dialog *create_search_dialog (GtkWindow *, gchar *, gint); gboolean run_search_dialog (search_dialog * dialog); void weather_search_by_ip(const gchar *proxy_host, gint proxy_port, - void (*gui_cb)(const gchar *loc_name, const gchar *loc_code, gpointer user_data), + void (*gui_cb)(const gchar *loc_name, const gchar *lat, const gchar *lon, gpointer user_data), gpointer user_data); void free_search_dialog (search_dialog * dialog); diff --git a/panel-plugin/weather-summary.c b/panel-plugin/weather-summary.c index 36eeb14..b584c7d 100644 --- a/panel-plugin/weather-summary.c +++ b/panel-plugin/weather-summary.c @@ -19,7 +19,7 @@ #include #endif -#include +#include #include "weather-parsers.h" #include "weather-data.h" diff --git a/panel-plugin/weather.c b/panel-plugin/weather.c index cd341aa..678536e 100644 --- a/panel-plugin/weather.c +++ b/panel-plugin/weather.c @@ -23,7 +23,7 @@ #include #include -#include +#include #include "weather-parsers.h" #include "weather-data.h" @@ -368,7 +368,7 @@ update_weatherdata (xfceweather_data *data) { gchar *url; - if (!data->location_code) + if (!data->lat || !data->lon) { gtk_scrollbox_clear (GTK_SCROLLBOX (data->scrollbox)); set_icon_error (data); @@ -377,13 +377,11 @@ update_weatherdata (xfceweather_data *data) } /* build url */ - url = g_strdup_printf ("/weather/local/%s?cc=*&dayf=%d&unit=%c&link=xoap&prod=xoap&par=%s&key=%s", - data->location_code, XML_WEATHER_DAYF_N, - data->unit == METRIC ? 'm' : 'i', - PARTNER_ID, LICENSE_KEY); + url = g_strdup_printf ("/weatherapi/locationforecastlts/1.1/?lat=%s;lon=%s", + data->lat, data->lon); /* start receive thread */ - weather_http_receive_data ("xoap.weather.com", url, data->proxy_host, + weather_http_receive_data ("api.yr.no", url, data->proxy_host, data->proxy_port, cb_update, data); /* cleanup */ @@ -442,14 +440,24 @@ xfceweather_read_config (XfcePanelPlugin *plugin, if (!rc) return; - value = xfce_rc_read_entry (rc, "loc_code", NULL); + value = xfce_rc_read_entry (rc, "lat", NULL); if (value) { - if (data->location_code) - g_free (data->location_code); + if (data->lat) + g_free (data->lat); - data->location_code = g_strdup (value); + data->lat = g_strdup (value); + } + + value = xfce_rc_read_entry (rc, "lon", NULL); + + if (value) + { + if (data->lon) + g_free (data->lon); + + data->lon = g_strdup (value); } value = xfce_rc_read_entry (rc, "loc_name", NULL); @@ -547,8 +555,11 @@ xfceweather_write_config (XfcePanelPlugin *plugin, xfce_rc_write_bool_entry (rc, "celcius", (data->unit == METRIC)); - if (data->location_code) - xfce_rc_write_entry (rc, "loc_code", data->location_code); + if (data->lat) + xfce_rc_write_entry (rc, "lat", data->lat); + + if (data->lon) + xfce_rc_write_entry (rc, "lon", data->lon); if (data->location_name) xfce_rc_write_entry (rc, "loc_name", data->location_name); @@ -898,7 +909,8 @@ xfceweather_free (XfcePanelPlugin *plugin, #endif /* Free chars */ - g_free (data->location_code); + g_free (data->lat); + g_free (data->lon); g_free (data->location_name); g_free (data->proxy_host); diff --git a/panel-plugin/weather.h b/panel-plugin/weather.h index 4837208..81b666e 100644 --- a/panel-plugin/weather.h +++ b/panel-plugin/weather.h @@ -49,7 +49,8 @@ typedef struct GtkOrientation orientation; gint updatetimeout; - gchar *location_code; + gchar *lat; + gchar *lon; gchar *location_name; units unit;