[Goodies-commits] r7533 - in xfce4-weather-plugin/trunk: . panel-plugin

Colin Leroy colin at xfce.org
Thu Jun 11 22:31:03 CEST 2009


Author: colin
Date: 2009-06-11 20:31:02 +0000 (Thu, 11 Jun 2009)
New Revision: 7533

Modified:
   xfce4-weather-plugin/trunk/ChangeLog
   xfce4-weather-plugin/trunk/panel-plugin/weather-data.c
   xfce4-weather-plugin/trunk/panel-plugin/weather-data.h
   xfce4-weather-plugin/trunk/panel-plugin/weather-parsers.c
   xfce4-weather-plugin/trunk/panel-plugin/weather-parsers.h
   xfce4-weather-plugin/trunk/panel-plugin/weather-summary.c
   xfce4-weather-plugin/trunk/panel-plugin/weather.c
   xfce4-weather-plugin/trunk/panel-plugin/weather.h
Log:
2009-06-11	Colin Leroy <colin at colino.net>

	* panel-plugin/*: Comply better with weather.com's XOAP license:
	https://registration.weather.com/common/eula/xmloap.html
	That'll avoid problems the day they cut service to wrongly formed
	URLs. The drawback is to have to put their links and logo...



Modified: xfce4-weather-plugin/trunk/ChangeLog
===================================================================
--- xfce4-weather-plugin/trunk/ChangeLog	2009-06-11 20:26:28 UTC (rev 7532)
+++ xfce4-weather-plugin/trunk/ChangeLog	2009-06-11 20:31:02 UTC (rev 7533)
@@ -1,5 +1,12 @@
 2009-06-11	Colin Leroy <colin at colino.net>
 
+	* panel-plugin/*: Comply better with weather.com's XOAP license:
+	https://registration.weather.com/common/eula/xmloap.html
+	That'll avoid problems the day they cut service to wrongly formed
+	URLs. The drawback is to have to put their links and logo...
+
+2009-06-11	Colin Leroy <colin at colino.net>
+
 	* panel-plugin/weather-http.c: Fix HTTP request (Host: and other
 	parameters are only valid in HTTP/1.1)
 

Modified: xfce4-weather-plugin/trunk/panel-plugin/weather-data.c
===================================================================
--- xfce4-weather-plugin/trunk/panel-plugin/weather-data.c	2009-06-11 20:26:28 UTC (rev 7532)
+++ xfce4-weather-plugin/trunk/panel-plugin/weather-data.c	2009-06-11 20:31:02 UTC (rev 7533)
@@ -30,6 +30,7 @@
 #define DATAS_CC    0x0100
 #define DATAS_LOC   0x0200
 #define DATAS_DAYF  0x0300
+#define DATAS_LNK   0x0400
 #define KILL_RING_S 5
 
 #define EMPTY_STRING g_strdup("-")
@@ -262,8 +263,51 @@
   return CHK_NULL (str);
 }
 
+static gchar *
+get_data_lnk (xml_lnk   *data,
+              lnks       type)
+{
+  gchar *str = NULL;
 
+  if (!data)
+    {
+      DBG ("get_data_lnk: xml-lnk not present");
+      return EMPTY_STRING;
+    }
 
+  switch (type)
+    {
+    case LNK1:
+      str = data->lnk[0];
+      break;
+    case LNK2:
+      str = data->lnk[1];
+      break;
+    case LNK3:
+      str = data->lnk[2];
+      break;
+    case LNK4:
+      str = data->lnk[3];
+      break;
+    case LNK1_TXT:
+      str = data->lnk_txt[0];
+      break;
+    case LNK2_TXT:
+      str = data->lnk_txt[1];
+      break;
+    case LNK3_TXT:
+      str = data->lnk_txt[2];
+      break;
+    case LNK4_TXT:
+      str = data->lnk_txt[3];
+      break;
+    }
+
+  return CHK_NULL (str);
+}
+
+
+
 const gchar *
 get_data (xml_weather *data,
          datas         type)
@@ -284,6 +328,9 @@
         case DATAS_LOC:
           str = get_data_loc (data->loc, type);
           break;
+        case DATAS_LNK:
+          str = get_data_lnk (data->lnk, type);
+          break;
         default:
           str = EMPTY_STRING;
         }

Modified: xfce4-weather-plugin/trunk/panel-plugin/weather-data.h
===================================================================
--- xfce4-weather-plugin/trunk/panel-plugin/weather-data.h	2009-06-11 20:26:28 UTC (rev 7532)
+++ xfce4-weather-plugin/trunk/panel-plugin/weather-data.h	2009-06-11 20:31:02 UTC (rev 7533)
@@ -104,6 +104,19 @@
 
 typedef enum
 {
+  LNK1          = 0x0400,
+  LNK2          = 0x0401,
+  LNK3          = 0x0402,
+  LNK4          = 0x0403,
+  LNK1_TXT      = 0x0404,
+  LNK2_TXT      = 0x0405,
+  LNK3_TXT      = 0x0406,
+  LNK4_TXT      = 0x0407
+}
+lnks;
+
+typedef enum
+{
   METRIC,
   IMPERIAL
 }

Modified: xfce4-weather-plugin/trunk/panel-plugin/weather-parsers.c
===================================================================
--- xfce4-weather-plugin/trunk/panel-plugin/weather-parsers.c	2009-06-11 20:26:28 UTC (rev 7532)
+++ xfce4-weather-plugin/trunk/panel-plugin/weather-parsers.c	2009-06-11 20:31:02 UTC (rev 7533)
@@ -50,6 +50,8 @@
         ret->cc = parse_cc (cur_node);
       else if (NODE_IS_TYPE (cur_node, "loc"))
         ret->loc = parse_loc (cur_node);
+      else if (NODE_IS_TYPE (cur_node, "lnks"))
+        ret->lnk = parse_lnk (cur_node);
       else if (NODE_IS_TYPE (cur_node, "dayf"))
         {
           for (child_node = cur_node->children; child_node;
@@ -98,8 +100,39 @@
   return ret;
 }
 
+xml_lnk *
+parse_lnk (xmlNode *cur_node)
+{
+  xml_lnk *ret;
+  int i = 0;
+  if ((ret = panel_slice_new0 (xml_lnk)) == NULL)
+    return NULL;
 
 
+  for (cur_node = cur_node->children; cur_node; cur_node = cur_node->next)
+    {
+      if (cur_node->type != XML_ELEMENT_NODE)
+        continue;
+
+      if (NODE_IS_TYPE (cur_node, "link")) {
+        xmlNode *l_node;
+        if (i < 4) {
+	  for (l_node = cur_node->children; l_node; l_node = l_node->next) {
+              if (NODE_IS_TYPE (l_node, "l"))
+		ret->lnk[i] = DATA(l_node);
+	      else if (NODE_IS_TYPE (l_node, "t"))
+		ret->lnk_txt[i] = DATA(l_node);
+	  }
+	}
+	i++;
+      }
+    }
+
+  return ret;
+}
+
+
+
 static xml_uv *
 parse_uv (xmlNode *cur_node)
 {
@@ -367,8 +400,17 @@
   panel_slice_free (xml_loc, data);
 }
 
+static void
+xml_lnk_free (xml_lnk *data)
+{
+  int i;
+  for (i = 0; i < 4; i++) {
+    g_free (data->lnk[i]);
+    g_free (data->lnk_txt[i]);
+  }
+  panel_slice_free (xml_lnk, data);
+}
 
-
 static void
 xml_part_free (xml_part *data)
 {
@@ -421,6 +463,9 @@
   if (data->loc)
     xml_loc_free (data->loc);
 
+  if (data->lnk)
+    xml_lnk_free (data->lnk);
+
   if (data->dayf)
     {
       for (i = 0; i < XML_WEATHER_DAYF_N; i++)

Modified: xfce4-weather-plugin/trunk/panel-plugin/weather-parsers.h
===================================================================
--- xfce4-weather-plugin/trunk/panel-plugin/weather-parsers.h	2009-06-11 20:26:28 UTC (rev 7532)
+++ xfce4-weather-plugin/trunk/panel-plugin/weather-parsers.h	2009-06-11 20:31:02 UTC (rev 7533)
@@ -28,7 +28,8 @@
 #define DATA(node) (gchar *) xmlNodeListGetString(node->doc, node->children, 1)
 #define NODE_IS_TYPE(node, type) xmlStrEqual (node->name, (const xmlChar *) type)
 #define XML_WEATHER_DAYF_N 5
-  typedef struct
+
+typedef struct
 {
   gchar *dnam;
   gchar *sunr;
@@ -38,6 +39,13 @@
 
 typedef struct
 {
+  gchar *lnk[4];
+  gchar *lnk_txt[4];
+}
+xml_lnk;
+
+typedef struct
+{
   gchar *i;
   gchar *t;
 }
@@ -105,6 +113,7 @@
 typedef struct
 {
   xml_loc *loc;
+  xml_lnk *lnk;
   xml_cc *cc;
   xml_dayf *dayf[XML_WEATHER_DAYF_N];
 }
@@ -115,6 +124,8 @@
 
 xml_loc *parse_loc (xmlNode * cur_node);
 
+xml_lnk *parse_lnk (xmlNode * cur_node);
+
 xml_cc *parse_cc (xmlNode * cur_node);
 
 xml_dayf *parse_dayf (xmlNode * cur_node);

Modified: xfce4-weather-plugin/trunk/panel-plugin/weather-summary.c
===================================================================
--- xfce4-weather-plugin/trunk/panel-plugin/weather-summary.c	2009-06-11 20:26:28 UTC (rev 7532)
+++ xfce4-weather-plugin/trunk/panel-plugin/weather-summary.c	2009-06-11 20:31:02 UTC (rev 7533)
@@ -32,6 +32,9 @@
 #include "weather-icon.h"
 
 
+static gboolean lnk_clicked (GtkTextTag *tag, GObject *obj,
+			     GdkEvent *event, GtkTextIter *iter,
+			     GtkWidget *textview);
 
 #define BORDER                           8
 #define APPEND_BTEXT(text)               gtk_text_buffer_insert_with_tags(GTK_TEXT_BUFFER(buffer),\
@@ -39,30 +42,148 @@
 #define APPEND_TEXT_ITEM_REAL(text)      gtk_text_buffer_insert(GTK_TEXT_BUFFER(buffer), \
                                                                 &iter, text, -1);\
                                          g_free (value);
-#define APPEND_TEXT_ITEM(text, item)     value = g_strdup_printf("\t%s: %s %s\n",\
-                                                                 text,\
+#define APPEND_TEXT_ITEM(text, item)     value = g_strdup_printf("\t%s%s%s %s\n",\
+                                                                 text, text?": ":"", \
                                                                  get_data(data, item),\
                                                                  get_unit(unit, item));\
                                          APPEND_TEXT_ITEM_REAL(value);
+#define APPEND_LINK_ITEM(prefix, text, url, lnk_tag) \
+					 gtk_text_buffer_insert(GTK_TEXT_BUFFER(buffer), \
+                                                                &iter, prefix, -1);\
+					 gtk_text_buffer_insert_with_tags(GTK_TEXT_BUFFER(buffer), \
+                                                                &iter, text, -1, lnk_tag, NULL);\
+					 gtk_text_buffer_insert(GTK_TEXT_BUFFER(buffer), \
+                                                                &iter, "\n", -1);\
+					 g_object_set_data_full(G_OBJECT(lnk_tag), "url", g_strdup(url), g_free); \
+					 g_signal_connect(G_OBJECT(lnk_tag), "event", \
+						G_CALLBACK(lnk_clicked), NULL); 
 
 
 
 static GtkTooltips *tooltips = NULL;
 
+static gboolean lnk_clicked (GtkTextTag *tag, GObject *obj,
+			     GdkEvent *event, GtkTextIter *iter,
+			     GtkWidget *textview)
+{
+  if (event->type == GDK_BUTTON_RELEASE) {
+    const gchar *url = g_object_get_data(G_OBJECT(tag), "url");
+    gchar *str = g_strdup_printf("exo-open %s", url);
 
+    xfce_exec(str, FALSE, FALSE, NULL);
+    g_free(str);
+  } else if (event->type == GDK_LEAVE_NOTIFY) {
+     gdk_window_set_cursor(gtk_text_view_get_window(GTK_TEXT_VIEW(obj),
+				GTK_TEXT_WINDOW_TEXT), NULL);
+  } 
+  return FALSE;
+}
 
+static gboolean
+icon_clicked (GtkWidget      *widget,
+              GdkEventButton *event,
+              gpointer        user_data)
+{
+  return lnk_clicked(user_data, NULL, (GdkEvent *)(event), NULL, NULL);
+}
+
+static GdkCursor *hand_cursor = NULL;
+static GdkCursor *text_cursor = NULL;
+static gboolean on_icon = FALSE;
+static gboolean view_motion_notify(GtkWidget *widget,
+				   GdkEventMotion *event,
+				   GtkWidget *view)
+{
+  GtkTextBuffer *buffer;
+
+  buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view));
+
+  if (event->x != -1 && event->y != -1) {
+    gint bx, by;
+    GtkTextIter iter;
+    GSList *tags;
+    GSList *cur;
+
+    gtk_text_view_window_to_buffer_coords(GTK_TEXT_VIEW(view), 
+    						GTK_TEXT_WINDOW_WIDGET,
+    						event->x, event->y, &bx, &by);
+    gtk_text_view_get_iter_at_location(GTK_TEXT_VIEW(view),
+    						&iter, bx, by);
+    tags = gtk_text_iter_get_tags(&iter);
+    for (cur = tags; cur != NULL; cur = cur->next) {
+      GtkTextTag *tag = cur->data;
+      if (g_object_get_data(G_OBJECT(tag), "url")) {
+        gdk_window_set_cursor(gtk_text_view_get_window(GTK_TEXT_VIEW(view),
+				   GTK_TEXT_WINDOW_TEXT), hand_cursor);
+        return FALSE;
+      }
+    }
+  }
+  if (!on_icon)
+    gdk_window_set_cursor(gtk_text_view_get_window(GTK_TEXT_VIEW(view),
+			     GTK_TEXT_WINDOW_TEXT), text_cursor);
+  return FALSE;
+}
+
+static gboolean icon_motion_notify(GtkWidget *widget,
+				   GdkEventMotion *event,
+				   GtkWidget *view)
+{
+  on_icon = TRUE;
+  gdk_window_set_cursor(gtk_text_view_get_window(GTK_TEXT_VIEW(view),
+			     GTK_TEXT_WINDOW_TEXT), hand_cursor);
+  return FALSE;
+}
+
+static gboolean view_leave_notify(GtkWidget *widget,
+				   GdkEventMotion *event,
+				   GtkWidget *view)
+{
+  on_icon = FALSE;
+  gdk_window_set_cursor(gtk_text_view_get_window(GTK_TEXT_VIEW(view),
+			     GTK_TEXT_WINDOW_TEXT), text_cursor);
+  return FALSE;
+}
+
+static GtkWidget *weather_channel_evt = NULL;
+static void view_scrolled_cb (GtkAdjustment *adj, GtkWidget *view)
+{
+  if (weather_channel_evt) {
+    gint x, y, x1, y1;
+    x1 = view->allocation.width - 61 - 5;
+    y1 = view->requisition.height - 61 - 5;
+    gtk_text_view_buffer_to_window_coords(
+			GTK_TEXT_VIEW(view),
+			GTK_TEXT_WINDOW_TEXT, x1, y1, &x, &y);
+    gtk_text_view_move_child(GTK_TEXT_VIEW(view), 
+			weather_channel_evt, x, y);
+  }
+}
+
+static void view_size_allocate_cb	(GtkWidget	*widget,
+					 GtkAllocation	*allocation,
+					 gpointer	 data)
+{
+  view_scrolled_cb(NULL, GTK_WIDGET(data));
+}
+
+
 static GtkWidget *
 create_summary_tab (xml_weather *data,
                     units        unit)
 {
   GtkTextBuffer *buffer;
   GtkTextIter    iter;
-  GtkTextTag    *btag;
+  GtkTextTag    *btag, *ltag0, *ltag1, *ltag2, *ltag3, *ltag4;
   gchar         *value, *date, *wind, *sun_val, *vis;
   GtkWidget     *view, *frame, *scrolled;
+  GdkColor       lnk_color;
+  GtkAdjustment *adj;
+  GtkWidget     *weather_channel_icon;
 
   view = gtk_text_view_new ();
   gtk_text_view_set_editable (GTK_TEXT_VIEW (view), FALSE);
+  gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (view), FALSE);
   frame = gtk_frame_new (NULL);
   scrolled = gtk_scrolled_window_new (NULL, NULL);
 
@@ -80,6 +201,13 @@
     gtk_text_buffer_create_tag (buffer, NULL, "weight", PANGO_WEIGHT_BOLD,
                                 NULL);
 
+  gdk_color_parse("#0000ff", &lnk_color);
+  ltag0 = gtk_text_buffer_create_tag(buffer, "lnk0", "foreground-gdk", &lnk_color, NULL);
+  ltag1 = gtk_text_buffer_create_tag(buffer, "lnk1", "foreground-gdk", &lnk_color, NULL);
+  ltag2 = gtk_text_buffer_create_tag(buffer, "lnk2", "foreground-gdk", &lnk_color, NULL);
+  ltag3 = gtk_text_buffer_create_tag(buffer, "lnk3", "foreground-gdk", &lnk_color, NULL);
+  ltag4 = gtk_text_buffer_create_tag(buffer, "lnk4", "foreground-gdk", &lnk_color, NULL);
+
   /* head */
   value = g_strdup_printf (_("Weather report for: %s.\n\n"), get_data (data, DNAM));
   APPEND_BTEXT (value);
@@ -157,11 +285,56 @@
   g_free (vis);
   APPEND_TEXT_ITEM_REAL (value);
 
+  APPEND_BTEXT (_("\nMore on weather.com\n"));
+  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",
+  		PARTNER_ID);
+  g_object_set_data_full(G_OBJECT(ltag0), "url", value, g_free);
+
+  APPEND_LINK_ITEM ("\t", get_data (data, LNK1_TXT), get_data (data, LNK1), ltag1);
+  APPEND_LINK_ITEM ("\t", get_data (data, LNK2_TXT), get_data (data, LNK2), ltag2);
+  APPEND_LINK_ITEM ("\t", get_data (data, LNK3_TXT), get_data (data, LNK3), ltag3);
+  APPEND_LINK_ITEM ("\t", get_data (data, LNK4_TXT), get_data (data, LNK4), ltag4);
+
+  g_signal_connect(G_OBJECT(view), "motion-notify-event",
+		   G_CALLBACK(view_motion_notify), view);
+  g_signal_connect(G_OBJECT(view), "leave-notify-event",
+		   G_CALLBACK(view_leave_notify), view);
+		   
+  weather_channel_icon = gtk_image_new_from_pixbuf(get_icon("weather_channel", -1));
+  if (weather_channel_icon) {
+    weather_channel_evt = gtk_event_box_new();
+    gtk_container_add(GTK_CONTAINER(weather_channel_evt), weather_channel_icon);
+    gtk_text_view_add_child_in_window(GTK_TEXT_VIEW(view), weather_channel_evt, 
+                                      GTK_TEXT_WINDOW_TEXT, 0, 0);
+    gtk_widget_show_all(weather_channel_evt);
+    adj = gtk_scrolled_window_get_vadjustment(
+	    GTK_SCROLLED_WINDOW(scrolled));
+    g_signal_connect(G_OBJECT(adj), "value-changed",
+		     G_CALLBACK(view_scrolled_cb), view);
+    g_signal_connect(G_OBJECT(view), "size_allocate",
+		     G_CALLBACK(view_size_allocate_cb),
+		     view);
+    g_signal_connect(G_OBJECT(weather_channel_evt), "button-release-event",
+		     G_CALLBACK(icon_clicked),
+		     ltag0);
+    g_signal_connect(G_OBJECT(weather_channel_evt), "enter-notify-event",
+		     G_CALLBACK(icon_motion_notify), view);
+    g_signal_connect(G_OBJECT(weather_channel_evt), "visibility-notify-event",
+		     G_CALLBACK(icon_motion_notify), view);
+    g_signal_connect(G_OBJECT(weather_channel_evt), "motion-notify-event",
+		     G_CALLBACK(icon_motion_notify), view);
+    g_signal_connect(G_OBJECT(weather_channel_evt), "leave-notify-event",
+		     G_CALLBACK(view_leave_notify), view);
+  }
+  if (hand_cursor == NULL)
+    hand_cursor = gdk_cursor_new(GDK_HAND2);
+  if (text_cursor == NULL)
+    text_cursor = gdk_cursor_new(GDK_XTERM);
+
+
   return frame;
 }
 
-
-
 static GtkWidget *
 make_forecast (xml_dayf *weatherdata,
                units     unit)
@@ -361,8 +534,6 @@
   return widg;
 }
 
-
-
 GtkWidget *
 create_summary_window (xml_weather *data,
                        units        unit)

Modified: xfce4-weather-plugin/trunk/panel-plugin/weather.c
===================================================================
--- xfce4-weather-plugin/trunk/panel-plugin/weather.c	2009-06-11 20:26:28 UTC (rev 7532)
+++ xfce4-weather-plugin/trunk/panel-plugin/weather.c	2009-06-11 20:31:02 UTC (rev 7533)
@@ -352,9 +352,10 @@
     }
 
   /* build url */
-  url = g_strdup_printf ("/weather/local/%s?cc=*&dayf=%d&unit=%c",
+  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');
+                         data->unit == METRIC ? 'm' : 'i',
+			 PARTNER_ID, LICENSE_KEY);
 
   /* start receive thread */
   weather_http_receive_data ("xoap.weather.com", url, data->proxy_host,

Modified: xfce4-weather-plugin/trunk/panel-plugin/weather.h
===================================================================
--- xfce4-weather-plugin/trunk/panel-plugin/weather.h	2009-06-11 20:26:28 UTC (rev 7532)
+++ xfce4-weather-plugin/trunk/panel-plugin/weather.h	2009-06-11 20:31:02 UTC (rev 7533)
@@ -22,6 +22,8 @@
 
 #include <libxfce4panel/xfce-panel-plugin.h>
 #include <libxfce4util/libxfce4util.h>
+#define PARTNER_ID       "1121946239"
+#define LICENSE_KEY      "3c4cd39ee5dec84f"
 
 G_BEGIN_DECLS
 
@@ -49,7 +51,6 @@
   gint             updatetimeout;
 
   gchar           *location_code;
-
   units            unit;
 
   xml_weather     *weatherdata;




More information about the Goodies-commits mailing list