39
42
#define APPEND_TEXT_ITEM_REAL(text) gtk_text_buffer_insert(GTK_TEXT_BUFFER(buffer), \
42
#define APPEND_TEXT_ITEM(text, item) value = g_strdup_printf("\t%s: %s %s\n",\
45
#define APPEND_TEXT_ITEM(text, item) value = g_strdup_printf("\t%s%s%s %s\n",\
44
47
get_data(data, item),\
45
48
get_unit(unit, item));\
46
49
APPEND_TEXT_ITEM_REAL(value);
50
#define APPEND_LINK_ITEM(prefix, text, url, lnk_tag) \
51
gtk_text_buffer_insert(GTK_TEXT_BUFFER(buffer), \
53
gtk_text_buffer_insert_with_tags(GTK_TEXT_BUFFER(buffer), \
54
&iter, text, -1, lnk_tag, NULL);\
55
gtk_text_buffer_insert(GTK_TEXT_BUFFER(buffer), \
57
g_object_set_data_full(G_OBJECT(lnk_tag), "url", g_strdup(url), g_free); \
58
g_signal_connect(G_OBJECT(lnk_tag), "event", \
59
G_CALLBACK(lnk_clicked), NULL);
50
63
static GtkTooltips *tooltips = NULL;
65
static gboolean lnk_clicked (GtkTextTag *tag, GObject *obj,
66
GdkEvent *event, GtkTextIter *iter,
69
if (event->type == GDK_BUTTON_RELEASE) {
70
const gchar *url = g_object_get_data(G_OBJECT(tag), "url");
71
gchar *str = g_strdup_printf("exo-open --launch WebBrowser %s", url);
73
g_spawn_command_line_async(str, NULL);
75
} else if (event->type == GDK_LEAVE_NOTIFY) {
76
gdk_window_set_cursor(gtk_text_view_get_window(GTK_TEXT_VIEW(obj),
77
GTK_TEXT_WINDOW_TEXT), NULL);
83
icon_clicked (GtkWidget *widget,
84
GdkEventButton *event,
87
return lnk_clicked(user_data, NULL, (GdkEvent *)(event), NULL, NULL);
90
static GdkCursor *hand_cursor = NULL;
91
static GdkCursor *text_cursor = NULL;
92
static gboolean on_icon = FALSE;
93
static gboolean view_motion_notify(GtkWidget *widget,
94
GdkEventMotion *event,
97
GtkTextBuffer *buffer;
99
buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view));
101
if (event->x != -1 && event->y != -1) {
107
gtk_text_view_window_to_buffer_coords(GTK_TEXT_VIEW(view),
108
GTK_TEXT_WINDOW_WIDGET,
109
event->x, event->y, &bx, &by);
110
gtk_text_view_get_iter_at_location(GTK_TEXT_VIEW(view),
112
tags = gtk_text_iter_get_tags(&iter);
113
for (cur = tags; cur != NULL; cur = cur->next) {
114
GtkTextTag *tag = cur->data;
115
if (g_object_get_data(G_OBJECT(tag), "url")) {
116
gdk_window_set_cursor(gtk_text_view_get_window(GTK_TEXT_VIEW(view),
117
GTK_TEXT_WINDOW_TEXT), hand_cursor);
123
gdk_window_set_cursor(gtk_text_view_get_window(GTK_TEXT_VIEW(view),
124
GTK_TEXT_WINDOW_TEXT), text_cursor);
128
static gboolean icon_motion_notify(GtkWidget *widget,
129
GdkEventMotion *event,
133
gdk_window_set_cursor(gtk_text_view_get_window(GTK_TEXT_VIEW(view),
134
GTK_TEXT_WINDOW_TEXT), hand_cursor);
138
static gboolean view_leave_notify(GtkWidget *widget,
139
GdkEventMotion *event,
143
gdk_window_set_cursor(gtk_text_view_get_window(GTK_TEXT_VIEW(view),
144
GTK_TEXT_WINDOW_TEXT), text_cursor);
148
static GtkWidget *weather_channel_evt = NULL;
149
static void view_scrolled_cb (GtkAdjustment *adj, GtkWidget *view)
151
if (weather_channel_evt) {
153
x1 = view->allocation.width - 61 - 5;
154
y1 = view->requisition.height - 61 - 5;
155
gtk_text_view_buffer_to_window_coords(
157
GTK_TEXT_WINDOW_TEXT, x1, y1, &x, &y);
158
gtk_text_view_move_child(GTK_TEXT_VIEW(view),
159
weather_channel_evt, x, y);
163
static void view_size_allocate_cb (GtkWidget *widget,
164
GtkAllocation *allocation,
167
view_scrolled_cb(NULL, GTK_WIDGET(data));
54
171
static GtkWidget *
58
175
GtkTextBuffer *buffer;
177
GtkTextTag *btag, *ltag0, *ltag1, *ltag2, *ltag3, *ltag4;
61
178
gchar *value, *date, *wind, *sun_val, *vis;
62
179
GtkWidget *view, *frame, *scrolled;
182
GtkWidget *weather_channel_icon;
64
184
view = gtk_text_view_new ();
65
185
gtk_text_view_set_editable (GTK_TEXT_VIEW (view), FALSE);
186
gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (view), FALSE);
66
187
frame = gtk_frame_new (NULL);
67
188
scrolled = gtk_scrolled_window_new (NULL, NULL);
80
201
gtk_text_buffer_create_tag (buffer, NULL, "weight", PANGO_WEIGHT_BOLD,
204
gdk_color_parse("#0000ff", &lnk_color);
205
ltag0 = gtk_text_buffer_create_tag(buffer, "lnk0", "foreground-gdk", &lnk_color, NULL);
206
ltag1 = gtk_text_buffer_create_tag(buffer, "lnk1", "foreground-gdk", &lnk_color, NULL);
207
ltag2 = gtk_text_buffer_create_tag(buffer, "lnk2", "foreground-gdk", &lnk_color, NULL);
208
ltag3 = gtk_text_buffer_create_tag(buffer, "lnk3", "foreground-gdk", &lnk_color, NULL);
209
ltag4 = gtk_text_buffer_create_tag(buffer, "lnk4", "foreground-gdk", &lnk_color, NULL);
84
212
value = g_strdup_printf (_("Weather report for: %s.\n\n"), get_data (data, DNAM));
85
213
APPEND_BTEXT (value);
158
286
APPEND_TEXT_ITEM_REAL (value);
288
APPEND_BTEXT (_("\nMore on weather.com\n"));
289
value = g_strdup_printf("http://www.weather.com/?par=xoap&site=wx_logo&cm_ven=bd_oap&cm_cat=%s&cm_pla=HomePage&cm_ite=Logo",
291
g_object_set_data_full(G_OBJECT(ltag0), "url", value, g_free);
293
APPEND_LINK_ITEM ("\t", get_data (data, LNK1_TXT), get_data (data, LNK1), ltag1);
294
APPEND_LINK_ITEM ("\t", get_data (data, LNK2_TXT), get_data (data, LNK2), ltag2);
295
APPEND_LINK_ITEM ("\t", get_data (data, LNK3_TXT), get_data (data, LNK3), ltag3);
296
APPEND_LINK_ITEM ("\t", get_data (data, LNK4_TXT), get_data (data, LNK4), ltag4);
298
g_signal_connect(G_OBJECT(view), "motion-notify-event",
299
G_CALLBACK(view_motion_notify), view);
300
g_signal_connect(G_OBJECT(view), "leave-notify-event",
301
G_CALLBACK(view_leave_notify), view);
303
weather_channel_icon = gtk_image_new_from_pixbuf(get_icon("weather_channel", -1));
304
if (weather_channel_icon) {
305
weather_channel_evt = gtk_event_box_new();
306
gtk_container_add(GTK_CONTAINER(weather_channel_evt), weather_channel_icon);
307
gtk_text_view_add_child_in_window(GTK_TEXT_VIEW(view), weather_channel_evt,
308
GTK_TEXT_WINDOW_TEXT, 0, 0);
309
gtk_widget_show_all(weather_channel_evt);
310
adj = gtk_scrolled_window_get_vadjustment(
311
GTK_SCROLLED_WINDOW(scrolled));
312
g_signal_connect(G_OBJECT(adj), "value-changed",
313
G_CALLBACK(view_scrolled_cb), view);
314
g_signal_connect(G_OBJECT(view), "size_allocate",
315
G_CALLBACK(view_size_allocate_cb),
317
g_signal_connect(G_OBJECT(weather_channel_evt), "button-release-event",
318
G_CALLBACK(icon_clicked),
320
g_signal_connect(G_OBJECT(weather_channel_evt), "enter-notify-event",
321
G_CALLBACK(icon_motion_notify), view);
322
g_signal_connect(G_OBJECT(weather_channel_evt), "visibility-notify-event",
323
G_CALLBACK(icon_motion_notify), view);
324
g_signal_connect(G_OBJECT(weather_channel_evt), "motion-notify-event",
325
G_CALLBACK(icon_motion_notify), view);
326
g_signal_connect(G_OBJECT(weather_channel_evt), "leave-notify-event",
327
G_CALLBACK(view_leave_notify), view);
329
if (hand_cursor == NULL)
330
hand_cursor = gdk_cursor_new(GDK_HAND2);
331
if (text_cursor == NULL)
332
text_cursor = gdk_cursor_new(GDK_XTERM);
165
338
static GtkWidget *
166
339
make_forecast (xml_dayf *weatherdata,
399
583
notebook = gtk_notebook_new ();
400
584
gtk_container_set_border_width (GTK_CONTAINER (notebook), BORDER);
401
585
gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
402
create_summary_tab (data, unit),
403
gtk_label_new (_("Summary")));
404
gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
405
586
create_forecast_tab (data, unit),
406
587
gtk_label_new (_("Forecast")));
588
gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
589
create_summary_tab (data, unit),
590
gtk_label_new (_("Details")));
408
592
gtk_box_pack_start (GTK_BOX (vbox), notebook, TRUE, TRUE, 0);
410
594
g_signal_connect (G_OBJECT (window), "response",
411
G_CALLBACK (gtk_widget_destroy), window);
595
G_CALLBACK (summary_dialog_response), window);
413
597
gtk_window_set_default_size (GTK_WINDOW (window), 500, 400);