138
153
search_dialog *dialog = (search_dialog *) user_data;
139
154
gchar *sane_str, *url;
140
155
const gchar *str;
142
156
str = gtk_entry_get_text (GTK_ENTRY (dialog->search_entry));
144
158
if (strlen (str) == 0)
161
if (dialog->last_search && !strcmp(str, dialog->last_search)) {
162
GtkTreeSelection *selection;
163
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (dialog->result_list));
164
if (gtk_tree_selection_count_selected_rows(selection) == 1) {
165
gtk_dialog_response(GTK_DIALOG(dialog->dialog), GTK_RESPONSE_ACCEPT);
170
g_free(dialog->last_search);
171
dialog->last_search = g_strdup(str);
147
173
gtk_list_store_clear (GTK_LIST_STORE (dialog->result_mdl));
149
175
if ((sane_str = sanitize_str (str)) == NULL)
178
gtk_widget_set_sensitive(dialog->find_button, FALSE);
179
gtk_dialog_set_response_sensitive(GTK_DIALOG(dialog->dialog), GTK_RESPONSE_ACCEPT, FALSE);
152
181
url = g_strdup_printf ("/search/search?where=%s", sane_str);
153
182
g_free (sane_str);
184
gtk_tree_view_column_set_title(dialog->column, _("Searching..."));
155
185
weather_http_receive_data ("xoap.weather.com", url,
156
186
dialog->proxy_host, dialog->proxy_port,
157
187
cb_searchdone, dialog);
197
227
GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
198
228
GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL);
230
gtk_dialog_set_response_sensitive(GTK_DIALOG(dialog->dialog), GTK_RESPONSE_ACCEPT, FALSE);
200
232
gtk_window_set_icon_name (GTK_WINDOW (dialog->dialog), GTK_STOCK_FIND);
234
#if GTK_CHECK_VERSION(2,14,0)
235
dialog_vbox = gtk_dialog_get_content_area(GTK_DIALOG(dialog->dialog));
236
dialog_action = gtk_dialog_get_action_area(GTK_DIALOG(dialog->dialog));
238
dialog_vbox = GTK_DIALOG (dialog->dialog)->vbox;
239
dialog_action = GTK_DIALOG (dialog->dialog)->action_area;
202
242
vbox = gtk_vbox_new (FALSE, BORDER);
203
243
gtk_container_set_border_width (GTK_CONTAINER (vbox), 6);
204
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog->dialog)->vbox), vbox,
244
gtk_box_pack_start (GTK_BOX (dialog_vbox), vbox,
207
247
xfce_titled_dialog_set_subtitle (XFCE_TITLED_DIALOG (dialog->dialog),
208
248
_("Enter a city name or zip code"));
213
253
dialog->search_entry = gtk_entry_new ();
214
254
gtk_box_pack_start (GTK_BOX (hbox), dialog->search_entry, TRUE, TRUE, 0);
215
256
g_signal_connect (G_OBJECT (dialog->search_entry), "activate",
216
257
G_CALLBACK (search_cb), dialog);
218
button = gtk_button_new_from_stock (GTK_STOCK_FIND);
219
gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
220
g_signal_connect (G_OBJECT (button), "clicked",
259
dialog->find_button = gtk_button_new_from_stock (GTK_STOCK_FIND);
260
gtk_box_pack_start (GTK_BOX (hbox), dialog->find_button, TRUE, TRUE, 0);
261
g_signal_connect (G_OBJECT (dialog->find_button), "clicked",
221
262
G_CALLBACK (search_cb), dialog);
223
264
frame = gtk_frame_new (NULL);
232
273
dialog->result_mdl = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING);
233
274
dialog->result_list = gtk_tree_view_new_with_model (GTK_TREE_MODEL (dialog->result_mdl));
234
column = gtk_tree_view_column_new_with_attributes (_("Results"), renderer, "text", 0, NULL);
235
gtk_tree_view_append_column (GTK_TREE_VIEW (dialog->result_list), column);
275
dialog->column = gtk_tree_view_column_new_with_attributes (_("Results"), renderer, "text", 0, NULL);
276
gtk_tree_view_append_column (GTK_TREE_VIEW (dialog->result_list), dialog->column);
236
277
g_signal_connect (G_OBJECT (dialog->result_list), "row-activated",
237
278
G_CALLBACK (pass_search_results), dialog->dialog);
238
279
gtk_container_add (GTK_CONTAINER (scroll), dialog->result_list);
278
323
free_search_dialog (search_dialog * dialog)
280
325
g_free (dialog->result);
326
g_free (dialog->result_name);
327
g_free (dialog->last_search);
282
329
gtk_widget_destroy (dialog->dialog);
284
331
panel_slice_free (search_dialog, dialog);
335
const gchar *proxy_host;
337
void (*cb)(const gchar *loc_name, const gchar *loc_code, gpointer user_data);
343
cb_geo_searchdone (gboolean succeed,
347
geolocation_data *data = (geolocation_data *) user_data;
351
gboolean found = FALSE;
353
GtkTreeSelection *selection;
355
if (!succeed || received == NULL) {
356
data->cb(NULL, NULL, data->user_data);
361
if (g_utf8_validate(received, -1, NULL)) {
362
/* force parsing as UTF-8, the XML encoding header may lie */
363
doc = xmlReadMemory (received, strlen (received), NULL, "UTF-8", 0);
365
doc = xmlParseMemory (received, strlen(received));
370
data->cb(NULL, NULL, data->user_data);
375
cur_node = xmlDocGetRootElement (doc);
379
for (cur_node = cur_node->children; cur_node; cur_node = cur_node->next)
381
if (NODE_IS_TYPE (cur_node, "loc"))
383
id = (gchar *) xmlGetProp (cur_node, (const xmlChar *) "id");
388
city = DATA (cur_node);
396
data->cb(city, id, data->user_data);
409
cb_geolocation (gboolean succeed,
413
geolocation_data *data = (geolocation_data *) user_data;
416
gchar *city = NULL, *country = NULL;
417
gchar *country_code = NULL, *region = NULL;
418
gboolean found = FALSE;
420
if (!succeed || received == NULL) {
421
data->cb(NULL, NULL, data->user_data);
425
if (g_utf8_validate(received, -1, NULL)) {
426
/* force parsing as UTF-8, the XML encoding header may lie */
427
doc = xmlReadMemory (received, strlen (received), NULL, "UTF-8", 0);
429
doc = xmlParseMemory (received, strlen(received));
434
data->cb(NULL, NULL, data->user_data);
439
cur_node = xmlDocGetRootElement (doc);
443
for (cur_node = cur_node->children; cur_node; cur_node = cur_node->next)
445
if (NODE_IS_TYPE (cur_node, "City"))
447
city = DATA (cur_node);
449
if (NODE_IS_TYPE (cur_node, "CountryName"))
451
country = DATA (cur_node);
453
if (NODE_IS_TYPE (cur_node, "CountryCode"))
455
country_code = DATA (cur_node);
457
if (NODE_IS_TYPE (cur_node, "RegionName"))
459
region = DATA (cur_node);
464
if (country_code && region && !strcmp(country_code, "US")) {
469
g_free(country_code);
474
if (city && country) {
475
gchar *full_loc = g_strdup_printf("%s, %s", city, country);
476
gchar *url, *sane_str;
480
if ((sane_str = sanitize_str (full_loc)) == NULL) {
481
data->cb(NULL, NULL, data->user_data);
487
url = g_strdup_printf ("/search/search?where=%s", sane_str);
490
weather_http_receive_data ("xoap.weather.com", url,
491
data->proxy_host, data->proxy_port,
492
cb_geo_searchdone, data);
499
gboolean weather_search_by_ip(
500
const gchar *proxy_host, gint proxy_port,
501
void (*gui_cb)(const gchar *loc_name, const gchar *loc_code, gpointer user_data),
504
gchar *city = NULL, *country = NULL;
505
gchar *search = NULL;
506
geolocation_data *data;
511
data = g_new0(geolocation_data, 1);
513
data->user_data = user_data;
514
data->proxy_host = proxy_host;
515
data->proxy_port = proxy_port;
517
weather_http_receive_data ("ipinfodb.com", "/ip_query.php",
518
proxy_host, proxy_port,
519
cb_geolocation, data);