~ubuntu-branches/ubuntu/natty/xfce4-weather-plugin/natty-proposed

« back to all changes in this revision

Viewing changes to panel-plugin/weather-summary.c

  • Committer: Bazaar Package Importer
  • Author(s): Yves-Alexis Perez
  • Date: 2009-06-24 08:37:55 UTC
  • mfrom: (0.2.1 upstream) (2.1.15 karmic)
  • Revision ID: james.westby@ubuntu.com-20090624083755-b8dhv7muoebp7au9
Tags: 0.7.0-1
* New upstream release.
* debian/control:
  - update standards version to 3.8.2.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*  $Id: weather-summary.c 2782 2007-05-26 20:04:05Z nick $
 
1
/*  $Id: weather-summary.c 7584 2009-06-16 06:35:39Z colin $
2
2
 *
3
3
 *  Copyright (c) 2003-2007 Xfce Development Team
4
4
 *
32
32
#include "weather-icon.h"
33
33
 
34
34
 
 
35
static gboolean lnk_clicked (GtkTextTag *tag, GObject *obj,
 
36
                             GdkEvent *event, GtkTextIter *iter,
 
37
                             GtkWidget *textview);
35
38
 
36
39
#define BORDER                           8
37
40
#define APPEND_BTEXT(text)               gtk_text_buffer_insert_with_tags(GTK_TEXT_BUFFER(buffer),\
39
42
#define APPEND_TEXT_ITEM_REAL(text)      gtk_text_buffer_insert(GTK_TEXT_BUFFER(buffer), \
40
43
                                                                &iter, text, -1);\
41
44
                                         g_free (value);
42
 
#define APPEND_TEXT_ITEM(text, item)     value = g_strdup_printf("\t%s: %s %s\n",\
43
 
                                                                 text,\
 
45
#define APPEND_TEXT_ITEM(text, item)     value = g_strdup_printf("\t%s%s%s %s\n",\
 
46
                                                                 text, text?": ":"", \
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), \
 
52
                                                                &iter, prefix, -1);\
 
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), \
 
56
                                                                &iter, "\n", -1);\
 
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); 
47
60
 
48
61
 
49
62
 
50
63
static GtkTooltips *tooltips = NULL;
51
64
 
 
65
static gboolean lnk_clicked (GtkTextTag *tag, GObject *obj,
 
66
                             GdkEvent *event, GtkTextIter *iter,
 
67
                             GtkWidget *textview)
 
68
{
 
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);
 
72
 
 
73
    g_spawn_command_line_async(str, NULL);
 
74
    g_free(str);
 
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);
 
78
  } 
 
79
  return FALSE;
 
80
}
 
81
 
 
82
static gboolean
 
83
icon_clicked (GtkWidget      *widget,
 
84
              GdkEventButton *event,
 
85
              gpointer        user_data)
 
86
{
 
87
  return lnk_clicked(user_data, NULL, (GdkEvent *)(event), NULL, NULL);
 
88
}
 
89
 
 
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,
 
95
                                   GtkWidget *view)
 
96
{
 
97
  GtkTextBuffer *buffer;
 
98
 
 
99
  buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view));
 
100
 
 
101
  if (event->x != -1 && event->y != -1) {
 
102
    gint bx, by;
 
103
    GtkTextIter iter;
 
104
    GSList *tags;
 
105
    GSList *cur;
 
106
 
 
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),
 
111
                                                &iter, bx, by);
 
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);
 
118
        return FALSE;
 
119
      }
 
120
    }
 
121
  }
 
122
  if (!on_icon)
 
123
    gdk_window_set_cursor(gtk_text_view_get_window(GTK_TEXT_VIEW(view),
 
124
                             GTK_TEXT_WINDOW_TEXT), text_cursor);
 
125
  return FALSE;
 
126
}
 
127
 
 
128
static gboolean icon_motion_notify(GtkWidget *widget,
 
129
                                   GdkEventMotion *event,
 
130
                                   GtkWidget *view)
 
131
{
 
132
  on_icon = TRUE;
 
133
  gdk_window_set_cursor(gtk_text_view_get_window(GTK_TEXT_VIEW(view),
 
134
                             GTK_TEXT_WINDOW_TEXT), hand_cursor);
 
135
  return FALSE;
 
136
}
 
137
 
 
138
static gboolean view_leave_notify(GtkWidget *widget,
 
139
                                   GdkEventMotion *event,
 
140
                                   GtkWidget *view)
 
141
{
 
142
  on_icon = FALSE;
 
143
  gdk_window_set_cursor(gtk_text_view_get_window(GTK_TEXT_VIEW(view),
 
144
                             GTK_TEXT_WINDOW_TEXT), text_cursor);
 
145
  return FALSE;
 
146
}
 
147
 
 
148
static GtkWidget *weather_channel_evt = NULL;
 
149
static void view_scrolled_cb (GtkAdjustment *adj, GtkWidget *view)
 
150
{
 
151
  if (weather_channel_evt) {
 
152
    gint x, y, x1, y1;
 
153
    x1 = view->allocation.width - 61 - 5;
 
154
    y1 = view->requisition.height - 61 - 5;
 
155
    gtk_text_view_buffer_to_window_coords(
 
156
                        GTK_TEXT_VIEW(view),
 
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);
 
160
  }
 
161
}
 
162
 
 
163
static void view_size_allocate_cb       (GtkWidget      *widget,
 
164
                                         GtkAllocation  *allocation,
 
165
                                         gpointer        data)
 
166
{
 
167
  view_scrolled_cb(NULL, GTK_WIDGET(data));
 
168
}
52
169
 
53
170
 
54
171
static GtkWidget *
57
174
{
58
175
  GtkTextBuffer *buffer;
59
176
  GtkTextIter    iter;
60
 
  GtkTextTag    *btag;
 
177
  GtkTextTag    *btag, *ltag0, *ltag1, *ltag2, *ltag3, *ltag4;
61
178
  gchar         *value, *date, *wind, *sun_val, *vis;
62
179
  GtkWidget     *view, *frame, *scrolled;
 
180
  GdkColor       lnk_color;
 
181
  GtkAdjustment *adj;
 
182
  GtkWidget     *weather_channel_icon;
63
183
 
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);
68
189
 
80
201
    gtk_text_buffer_create_tag (buffer, NULL, "weight", PANGO_WEIGHT_BOLD,
81
202
                                NULL);
82
203
 
 
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);
 
210
 
83
211
  /* head */
84
212
  value = g_strdup_printf (_("Weather report for: %s.\n\n"), get_data (data, DNAM));
85
213
  APPEND_BTEXT (value);
157
285
  g_free (vis);
158
286
  APPEND_TEXT_ITEM_REAL (value);
159
287
 
 
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",
 
290
                PARTNER_ID);
 
291
  g_object_set_data_full(G_OBJECT(ltag0), "url", value, g_free);
 
292
 
 
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);
 
297
 
 
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);
 
302
                   
 
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),
 
316
                     view);
 
317
    g_signal_connect(G_OBJECT(weather_channel_evt), "button-release-event",
 
318
                     G_CALLBACK(icon_clicked),
 
319
                     ltag0);
 
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);
 
328
  }
 
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);
 
333
 
 
334
 
160
335
  return frame;
161
336
}
162
337
 
163
 
 
164
 
 
165
338
static GtkWidget *
166
339
make_forecast (xml_dayf *weatherdata,
167
340
               units     unit)
361
534
  return widg;
362
535
}
363
536
 
364
 
 
 
537
static void
 
538
summary_dialog_response (GtkWidget          *dlg,
 
539
                         gint                response,
 
540
                         GtkWidget          *window)
 
541
{
 
542
        if (response == GTK_RESPONSE_ACCEPT)
 
543
                gtk_widget_destroy(window);
 
544
        else if (response == GTK_RESPONSE_HELP)
 
545
                g_spawn_command_line_async ("exo-open --launch WebBrowser " PLUGIN_WEBSITE, NULL);
 
546
}
365
547
 
366
548
GtkWidget *
367
549
create_summary_window (xml_weather *data,
374
556
  window = xfce_titled_dialog_new_with_buttons (_("Weather Update"),
375
557
                                                NULL,
376
558
                                                GTK_DIALOG_NO_SEPARATOR,
377
 
                                                GTK_STOCK_OK,
 
559
                                                GTK_STOCK_ABOUT, 
 
560
                                                GTK_RESPONSE_HELP,
 
561
                                                GTK_STOCK_CLOSE,
378
562
                                                GTK_RESPONSE_ACCEPT, NULL);
379
563
 
380
564
  title = g_strdup_printf (_("Weather report for: %s"), get_data (data, DNAM));
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")));
407
591
 
408
592
  gtk_box_pack_start (GTK_BOX (vbox), notebook, TRUE, TRUE, 0);
409
593
 
410
594
  g_signal_connect (G_OBJECT (window), "response",
411
 
                    G_CALLBACK (gtk_widget_destroy), window);
 
595
                    G_CALLBACK (summary_dialog_response), window);
412
596
 
413
597
  gtk_window_set_default_size (GTK_WINDOW (window), 500, 400);
414
598