3
#include "debug_print.h"
5
gint IconSizeSmall = 0;
7
gchar *make_label(struct xml_weather *weatherdata, enum datas opt, enum units unit, gint size)
9
gchar *str, *lbl, *txtsize;
13
case VIS: lbl = "V"; break;
14
case UV_INDEX: lbl = "U"; break;
15
case WIND_DIRECTION: lbl = "WD"; break;
16
case BAR_D: lbl = "P"; break;
17
case BAR_R: lbl = "P"; break;
18
case FLIK: lbl = "F"; break;
19
case TEMP: lbl = "T"; break;
20
case DEWP: lbl = "D"; break;
21
case HMID: lbl = "H"; break;
22
case WIND_SPEED:lbl = "WS"; break;
23
case WIND_GUST: lbl = "WG"; break;
28
case 2: txtsize = "medium"; break;
29
case 3: txtsize = "medium"; break;
30
default: txtsize="x-small"; break;
35
str = g_strdup_printf("<span size=\"%s\">%s: %s %s</span>", txtsize,
36
lbl, get_data(weatherdata, opt), get_unit(unit, opt));
40
// -1 error 0 no update needed 1 success
41
gint update_weatherdata(struct xfceweather_data *data, gboolean force)
43
xmlNode *cur_node = NULL;
45
struct xml_weather *weather = NULL;
48
/*gchar *fullfilename = xfce_resource_save_location(XFCE_RESOURCE_CACHE,
50
gchar *fullfilename, *filename;
52
if (!data->location_code)
55
filename = g_strdup_printf("weather_%s_%c.xml",
56
data->location_code, data->unit == METRIC ? 'm' : 'i');
58
fullfilename = g_strdup_printf("%s%s%s", xfce_get_userdir(), G_DIR_SEPARATOR_S,
68
if (force || (stat(fullfilename, &attrs) == -1) ||
69
((time(NULL) - attrs.st_mtime) > (UPDATE_TIME)))
71
gchar *url = g_strdup_printf("/weather/local/%s?cc=*&dayf=%d&unit=%c",
72
data->location_code, XML_WEATHER_DAYF_N,
73
data->unit == METRIC ? 'm' : 'i');
76
ret = http_get_file(url, "xoap.weather.com", fullfilename);
86
else if (data->weatherdata)
90
doc = xmlParseFile(fullfilename);
98
cur_node = xmlDocGetRootElement(doc);
101
weather = parse_weather(cur_node);
108
if (data->weatherdata)
109
xml_weather_free(data->weatherdata);
111
data->weatherdata = weather;
118
void update_plugin (struct xfceweather_data *data, gboolean force)
121
GdkPixbuf *icon = NULL;
122
GtkIconSize iconsize;
126
gtk_scrollbox_clear(GTK_SCROLLBOX(data->scrollbox));
128
if (update_weatherdata(data, force) == -1)
130
GdkPixbuf *icon = get_icon(data->iconimage, "25", data->iconsize);
131
gtk_image_set_from_pixbuf(GTK_IMAGE(data->iconimage), icon);
133
if (data->weatherdata)
135
xml_weather_free(data->weatherdata);
136
data->weatherdata = NULL;
139
add_tooltip(data->tooltipbox, "Cannot update weather data");
148
for (i = 0; i < data->labels->len; i++)
153
opt = g_array_index(data->labels, enum datas, i);
155
str = make_label(data->weatherdata, opt, data->unit,
160
gtk_scrollbox_set_label(GTK_SCROLLBOX(data->scrollbox), -1,
169
gtk_scrollbox_enablecb(GTK_SCROLLBOX(data->scrollbox), TRUE);
173
icon = get_icon(data->iconimage, get_data(data->weatherdata, WICON), data->iconsize);
175
gtk_image_set_from_pixbuf(GTK_IMAGE(data->iconimage), icon);
177
add_tooltip(data->tooltipbox, get_data(data->weatherdata, TRANS));
180
GArray *labels_clear (GArray *array)
182
if (!array || array->len > 0)
185
g_array_free(array, TRUE);
187
array = g_array_new(FALSE, TRUE, sizeof(enum datas));
193
void xfceweather_read_config (Control *control, xmlNodePtr node)
196
struct xfceweather_data *data = (struct xfceweather_data *)control->data;
200
if (!node || !node->children)
203
node = node->children;
205
if (!xmlStrEqual (node->name, (const xmlChar *) XFCEWEATHER_ROOT))
208
value = xmlGetProp (node, (const xmlChar *) "loc_code");
213
if (data->location_code)
214
g_free(data->location_code);
216
data->location_code = g_strdup(value);
220
value = xmlGetProp (node, (const xmlChar *) "celsius");
224
if (atoi(value) == 1)
225
data->unit = IMPERIAL;
231
data->labels = labels_clear(data->labels);
233
for (node = node->children; node; node = node->next) {
234
if (node->type != XML_ELEMENT_NODE)
237
if (NODE_IS_TYPE(node, "label_")) { // label_ because the values of the
238
// previous plugin are invalid in this version
241
gint val = atoi(value);
242
g_array_append_val(data->labels, val);
250
update_plugin(data, FALSE);
253
void xfceweather_write_config (Control *control,
256
xmlNodePtr root, node;
260
struct xfceweather_data *data = (struct xfceweather_data *)control->data;
262
root = xmlNewTextChild (parent, NULL, XFCEWEATHER_ROOT, NULL);
264
value = g_strdup_printf("%d", data->unit == IMPERIAL ? 1 : 0);
265
xmlSetProp (root, "celsius", value);
268
if (data->location_code)
269
xmlSetProp (root, "loc_code", data->location_code);
271
for (i = 0; i < data->labels->len; i++)
273
enum datas opt = g_array_index (data->labels, enum datas, i);
274
value = g_strdup_printf("%d", opt);
276
node = xmlNewTextChild(root, NULL, "label_", value);
281
gboolean update_cb(struct xfceweather_data *data)
283
update_plugin(data, FALSE);
288
void real_update_config(struct xfceweather_data *data, gboolean force)
290
if (data->updatetimeout)
291
g_source_remove(data->updatetimeout);
293
update_plugin(data, force);
295
data->updatetimeout = gtk_timeout_add(UPDATE_TIME * 1000, (GSourceFunc)update_cb, data);
299
void update_config(struct xfceweather_data *data)
301
real_update_config(data, FALSE);
304
void close_summary(GtkWidget *widget, gpointer *user_data)
306
struct xfceweather_data *data = (struct xfceweather_data *)user_data;
310
data->summary_window = NULL;
314
gboolean cb_click(GtkWidget *widget, GdkEventButton *event, gpointer user_data)
316
struct xfceweather_data *data = (struct xfceweather_data *)user_data;
318
if (event->button == 1)
321
if (data->summary_window != NULL)
324
gtk_window_present(GTK_WINDOW(data->summary_window));
328
data->summary_window = create_summary_window(data->weatherdata,
330
g_signal_connect(data->summary_window, "destroy",
331
G_CALLBACK(close_summary), (gpointer)data);
333
gtk_widget_show_all(data->summary_window);
336
else if (event->button == 2)
337
real_update_config(data, TRUE);
343
void xfceweather_create_options(Control *control, GtkContainer *container,
346
struct xfceweather_data *data = (struct xfceweather_data *)control->data;
347
struct xfceweather_dialog *dialog = create_config_dialog(data, container, done);
349
set_callback_config_dialog(dialog, update_config);
353
gboolean xfceweather_create_control(Control *control)
355
struct xfceweather_data *data = g_new0(struct xfceweather_data, 1);
357
GtkWidget *box, *vbox, *vbox2;
361
IconSizeSmall = gtk_icon_size_register("iconsize_small", 20, 20);
363
path = g_strdup_printf("%s%s%s%s", THEMESDIR, G_DIR_SEPARATOR_S,
364
DEFAULT_W_THEME, G_DIR_SEPARATOR_S);
365
register_icons(path);
368
data->scrollbox = gtk_scrollbox_new();
370
data->iconimage = gtk_image_new_from_pixbuf(get_icon(control->base, "25", IconSizeSmall));
371
gtk_misc_set_alignment(GTK_MISC(data->iconimage), 0.5, 1);
374
data->labels = g_array_new(FALSE, TRUE, sizeof(enum datas));
377
vbox = gtk_vbox_new(FALSE, 0);
379
gtk_box_pack_start(GTK_BOX(vbox), data->iconimage, TRUE, FALSE, 0);
380
gtk_box_pack_start(GTK_BOX(vbox), data->scrollbox, TRUE, TRUE, 0);
382
data->tooltipbox = gtk_event_box_new();
383
gtk_container_add(GTK_CONTAINER(data->tooltipbox), vbox);
385
vbox2 = gtk_vbox_new(FALSE, 0);
386
gtk_box_pack_start(GTK_BOX(vbox2), data->tooltipbox, FALSE, FALSE, 0);
388
gtk_container_add(GTK_CONTAINER(control->base), vbox2);
389
g_signal_connect(data->tooltipbox, "button-press-event", G_CALLBACK(cb_click), (gpointer *)data);
391
gtk_widget_show_all(vbox2);
394
g_array_append_val(data->labels, lbl);
396
g_array_append_val(data->labels, lbl);
398
control->data = data;
399
control->with_popup = FALSE;
401
gtk_scrollbox_set_label(GTK_SCROLLBOX(data->scrollbox), -1, "1");
402
gtk_scrollbox_clear(GTK_SCROLLBOX(data->scrollbox));
404
data->updatetimeout = gtk_timeout_add(UPDATE_TIME * 1000, (GSourceFunc)update_cb, data);
412
void xfceweather_free(Control *control)
414
struct xfceweather_data *data = (struct xfceweather_data *)control->data;
416
if (data->weatherdata)
417
xml_weather_free(data->weatherdata);
421
g_free(data->location_code);
423
free_get_data_buffer();
425
g_array_free(data->labels, TRUE);
430
void xfceweather_attach_callback (Control *control, const gchar *signal, GCallback cb,
433
struct xfceweather_data *datae = (struct xfceweather_data*) control->data;
435
g_signal_connect(datae->tooltipbox, signal, cb, data);
438
void xfceweather_set_size(Control *control, gint size)
440
struct xfceweather_data *data = (struct xfceweather_data *)control->data;
446
case 0: data->iconsize = IconSizeSmall; break;
447
case 1: data->iconsize = GTK_ICON_SIZE_LARGE_TOOLBAR; break;
448
case 2: data->iconsize = GTK_ICON_SIZE_DND; break;
449
case 3: data->iconsize = GTK_ICON_SIZE_DIALOG; break;
452
update_plugin(data, FALSE);
456
xfce_control_class_init (ControlClass * cc)
458
cc->name = "weather";
459
cc->caption = "Weather Update";
461
cc->create_control = (CreateControlFunc) xfceweather_create_control;
462
cc->attach_callback = xfceweather_attach_callback;
463
cc->read_config = xfceweather_read_config;
464
cc->write_config = xfceweather_write_config;
466
cc->create_options = xfceweather_create_options;
467
cc->free = xfceweather_free;
468
cc->set_size = xfceweather_set_size;
471
XFCE_PLUGIN_CHECK_INIT