[Xfce4-commits] <xfce4-weather-plugin:master> * Make summary work
Colin Leroy
noreply at xfce.org
Wed Nov 16 22:34:08 CET 2011
Updating branch refs/heads/master
to caff57be41f6eca3e1e075811a5cda220028d5c0 (commit)
from fa62c838ea0cbb589dfddf2b28d50a85eeee711d (commit)
commit caff57be41f6eca3e1e075811a5cda220028d5c0
Author: Colin Leroy <colin at colino.net>
Date: Wed Nov 16 21:28:27 2011 +0100
* Make summary work
panel-plugin/weather-config.c | 6 ++-
panel-plugin/weather-data.c | 33 +++++++---
panel-plugin/weather-data.h | 6 ++-
panel-plugin/weather-parsers.c | 73 +++++++++++++----------
panel-plugin/weather-parsers.h | 8 +-
panel-plugin/weather-summary.c | 124 ++++++++------------------------------
panel-plugin/weather-translate.c | 5 +-
panel-plugin/weather-translate.h | 2 +-
panel-plugin/weather.c | 12 +++-
9 files changed, 118 insertions(+), 151 deletions(-)
diff --git a/panel-plugin/weather-config.c b/panel-plugin/weather-config.c
index 6027b26..59ed6ba 100644
--- a/panel-plugin/weather-config.c
+++ b/panel-plugin/weather-config.c
@@ -37,9 +37,13 @@ static const labeloption labeloptions[OPTIONS_N] = {
{N_("Temperature (T)"), TEMPERATURE},
{N_("Atmosphere pressure (P)"), PRESSURE},
{N_("Wind speed (WS)"), WIND_SPEED},
+ {N_("Wind speed - Beaufort scale (WB)"), WIND_BEAUFORT},
{N_("Wind direction (WD)"), WIND_DIRECTION},
+ {N_("Wind direction in degrees (WD)"), WIND_DIRECTION_DEG},
{N_("Humidity (H)"), HUMIDITY},
- {N_("Cloudiness (C)"), CLOUDINESS},
+ {N_("Low cloudiness (CL)"), CLOUDINESS_LOW},
+ {N_("Medium cloudiness (CM)"), CLOUDINESS_MED},
+ {N_("High cloudiness (CH)"), CLOUDINESS_HIGH},
{N_("Fog (F)"), FOG},
{N_("Precipitations (R)"), PRECIPITATIONS},
};
diff --git a/panel-plugin/weather-data.c b/panel-plugin/weather-data.c
index 64d0768..5c17a8d 100644
--- a/panel-plugin/weather-data.c
+++ b/panel-plugin/weather-data.c
@@ -27,6 +27,11 @@
#define CHK_NULL(s) ((s) ? (s):"")
+static gboolean need_interval(datas type)
+{
+ return type == PRECIPITATIONS || type == SYMBOL;
+}
+
const gchar *
get_data (xml_weather *data, datas type)
{
@@ -36,7 +41,7 @@ get_data (xml_weather *data, datas type)
if (data == NULL)
return "";
- timeslice = get_current_timeslice(data);
+ timeslice = get_current_timeslice(data, need_interval(type));
if (timeslice == NULL)
return "";
@@ -49,12 +54,20 @@ get_data (xml_weather *data, datas type)
return CHK_NULL(loc->pressure_value);
case WIND_SPEED:
return CHK_NULL( loc->wind_speed_mps);
+ case WIND_BEAUFORT:
+ return CHK_NULL( loc->wind_speed_beaufort);
case WIND_DIRECTION:
return CHK_NULL(loc->wind_dir_name);
+ case WIND_DIRECTION_DEG:
+ return CHK_NULL(loc->wind_dir_deg);
case HUMIDITY:
return CHK_NULL(loc->humidity_value);
- case CLOUDINESS:
- return CHK_NULL(loc->cloudiness_percent[CLOUDINESS_LOW]);
+ case CLOUDINESS_LOW:
+ return CHK_NULL(loc->cloudiness_percent[CLOUD_LOW]);
+ case CLOUDINESS_MED:
+ return CHK_NULL(loc->cloudiness_percent[CLOUD_MED]);
+ case CLOUDINESS_HIGH:
+ return CHK_NULL(loc->cloudiness_percent[CLOUD_HIGH]);
case FOG:
return CHK_NULL(loc->fog_percent);
case PRECIPITATIONS:
@@ -74,7 +87,7 @@ get_unit (xml_weather *data, units unit, datas type)
if (data == NULL)
return "";
- timeslice = get_current_timeslice(data);
+ timeslice = get_current_timeslice(data, need_interval(type));
if (timeslice == NULL)
return "";
@@ -87,17 +100,19 @@ get_unit (xml_weather *data, units unit, datas type)
return CHK_NULL(loc->pressure_unit);
case WIND_SPEED:
return "m/s";
- case WIND_DIRECTION:
- return "";
+ case WIND_DIRECTION_DEG:
+ return "°";
case HUMIDITY:
- return "%";
- case CLOUDINESS:
- return "%";
+ case CLOUDINESS_LOW:
+ case CLOUDINESS_MED:
+ case CLOUDINESS_HIGH:
case FOG:
return "%";
case PRECIPITATIONS:
return "mm";
case SYMBOL:
+ case WIND_BEAUFORT:
+ case WIND_DIRECTION:
return "";
}
return "";
diff --git a/panel-plugin/weather-data.h b/panel-plugin/weather-data.h
index 1d0b79a..5e80763 100644
--- a/panel-plugin/weather-data.h
+++ b/panel-plugin/weather-data.h
@@ -24,9 +24,13 @@ typedef enum {
TEMPERATURE,
PRESSURE,
WIND_SPEED,
+ WIND_BEAUFORT,
WIND_DIRECTION,
+ WIND_DIRECTION_DEG,
HUMIDITY,
- CLOUDINESS,
+ CLOUDINESS_LOW,
+ CLOUDINESS_MED,
+ CLOUDINESS_HIGH,
FOG,
PRECIPITATIONS,
SYMBOL
diff --git a/panel-plugin/weather-parsers.c b/panel-plugin/weather-parsers.c
index d7e90ec..18ef180 100644
--- a/panel-plugin/weather-parsers.c
+++ b/panel-plugin/weather-parsers.c
@@ -92,6 +92,8 @@ void parse_time (xmlNode * cur_node, xml_weather * data) {
struct tm start_t, end_t;
time_t start_ts, end_ts;
time_t cur_ts;
+ xml_time *timeslice;
+ xmlNode *child_node;
if (xmlStrcasecmp(datatype, "forecast")) {
xmlFree(datatype);
@@ -120,31 +122,19 @@ void parse_time (xmlNode * cur_node, xml_weather * data) {
start_ts = my_timegm(&start_t);
end_ts = my_timegm(&end_t);
- /* time elements with end == start are the ones with temperatures etc.
- * They seem to be for each three hours (6 after 4 days).
- */
- if (end_ts == start_ts && start_ts > time(NULL) + 4 * 24 * 3600)
- start_ts -= 6 * 3600;
- else if (end_ts == start_ts)
- start_ts -= 3 * 3600;
-
- /* split per-hour */
- for (cur_ts = start_ts; cur_ts < end_ts; cur_ts += 3600) {
- xml_time *timeslice = get_timeslice(data, cur_ts, cur_ts + 3600);
- xmlNode *child_node;
-
- if (!timeslice) {
- g_warning("no timeslice");
- return;
- }
- for (child_node = cur_node->children; child_node;
- child_node = child_node->next) {
- if (NODE_IS_TYPE (child_node, "location")) {
- if (timeslice->location == NULL)
- timeslice->location =
- g_slice_new0(xml_location);
- parse_location(child_node, timeslice->location);
- }
+ timeslice = get_timeslice(data, start_ts, end_ts);
+
+ if (!timeslice) {
+ g_warning("no timeslice");
+ return;
+ }
+ for (child_node = cur_node->children; child_node;
+ child_node = child_node->next) {
+ if (NODE_IS_TYPE (child_node, "location")) {
+ if (timeslice->location == NULL)
+ timeslice->location =
+ g_slice_new0(xml_location);
+ parse_location(child_node, timeslice->location);
}
}
}
@@ -168,16 +158,35 @@ xml_time *get_timeslice(xml_weather *data, time_t start, time_t end)
return data->timeslice[data->num_timeslices - 1];
}
-xml_time *get_current_timeslice(xml_weather *data)
+xml_time *get_current_timeslice(xml_weather *data, gboolean interval)
{
time_t now = time(NULL);
+ int closest = -1;
+ int min_found = 7 * 24 * 3600;
int i;
for (i = 0; i < data->num_timeslices; i++) {
+ if (interval !=
+ (data->timeslice[i]->start != data->timeslice[i]->end))
+ continue;
if (data->timeslice[i]->start <= now
&& data->timeslice[i]->end >= now)
return data->timeslice[i];
+ /* we also search for the closest before */
+ if (data->timeslice[i]->end < now
+ && data->timeslice[i]->end - now < min_found) {
+ min_found = data->timeslice[i]->end - now;
+ closest = i;
+ }
+ /* and after */
+ if (data->timeslice[i]->start > now
+ && data->timeslice[i]->start - now < min_found) {
+ min_found = data->timeslice[i]->start - now;
+ closest = i;
+ }
}
+ if (closest != -1)
+ return data->timeslice[closest];
return NULL;
}
@@ -223,16 +232,16 @@ void parse_location (xmlNode * cur_node, xml_location *loc)
loc->fog_percent = PROP(child_node, "percent");
}
if (NODE_IS_TYPE (child_node, "lowClouds")) {
- g_free(loc->cloudiness_percent[CLOUDINESS_LOW]);
- loc->cloudiness_percent[CLOUDINESS_LOW] = PROP(child_node, "percent");
+ g_free(loc->cloudiness_percent[CLOUD_LOW]);
+ loc->cloudiness_percent[CLOUD_LOW] = PROP(child_node, "percent");
}
if (NODE_IS_TYPE (child_node, "mediumClouds")) {
- g_free(loc->cloudiness_percent[CLOUDINESS_MED]);
- loc->cloudiness_percent[CLOUDINESS_MED] = PROP(child_node, "percent");
+ g_free(loc->cloudiness_percent[CLOUD_MED]);
+ loc->cloudiness_percent[CLOUD_MED] = PROP(child_node, "percent");
}
if (NODE_IS_TYPE (child_node, "highClouds")) {
- g_free(loc->cloudiness_percent[CLOUDINESS_HIGH]);
- loc->cloudiness_percent[CLOUDINESS_HIGH] = PROP(child_node, "percent");
+ g_free(loc->cloudiness_percent[CLOUD_HIGH]);
+ loc->cloudiness_percent[CLOUD_HIGH] = PROP(child_node, "percent");
}
if (NODE_IS_TYPE (child_node, "precipitation")) {
g_free(loc->precipitation_unit);
diff --git a/panel-plugin/weather-parsers.h b/panel-plugin/weather-parsers.h
index 3b56da0..ccfd5cf 100644
--- a/panel-plugin/weather-parsers.h
+++ b/panel-plugin/weather-parsers.h
@@ -30,9 +30,9 @@ G_BEGIN_DECLS
enum
{
- CLOUDINESS_LOW = 0,
- CLOUDINESS_MED,
- CLOUDINESS_HIGH,
+ CLOUD_LOW = 0,
+ CLOUD_MED,
+ CLOUD_HIGH,
NUM_CLOUDINESS
};
@@ -85,7 +85,7 @@ void parse_time (xmlNode * cur_node, xml_weather * data);
void parse_location (xmlNode * cur_node, xml_location *location);
xml_time *get_timeslice(xml_weather *data, time_t start, time_t end);
-xml_time *get_current_timeslice(xml_weather *data);
+xml_time *get_current_timeslice(xml_weather *data, gboolean interval);
void xml_weather_free (xml_weather * data);
diff --git a/panel-plugin/weather-summary.c b/panel-plugin/weather-summary.c
index 1703525..bcfe690 100644
--- a/panel-plugin/weather-summary.c
+++ b/panel-plugin/weather-summary.c
@@ -44,7 +44,7 @@ static gboolean lnk_clicked (GtkTextTag *tag, GObject *obj,
#define APPEND_TEXT_ITEM(text, item) value = g_strdup_printf("\t%s%s%s %s\n",\
text, text?": ":"", \
get_data(data->weatherdata, item),\
- get_unit(data->unit, item));\
+ get_unit(data->weatherdata, data->unit, item));\
APPEND_TEXT_ITEM_REAL(value);
#define APPEND_LINK_ITEM(prefix, text, url, lnk_tag) \
gtk_text_buffer_insert(GTK_TEXT_BUFFER(buffer), \
@@ -230,12 +230,14 @@ create_summary_tab (xfceweather_data *data)
{
GtkTextBuffer *buffer;
GtkTextIter iter;
- GtkTextTag *btag, *ltag0, *ltag1, *ltag2, *ltag3, *ltag4;
- gchar *value, *date, *wind, *sun_val, *vis;
+ GtkTextTag *btag, *ltag1;
+ gchar *value, *wind, *sun_val, *vis;
GtkWidget *view, *frame, *scrolled;
GdkColor lnk_color;
GtkAdjustment *adj;
GtkWidget *weather_channel_icon;
+ gchar *start;
+ xml_time *timeslice;
view = gtk_text_view_new ();
gtk_text_view_set_editable (GTK_TEXT_VIEW (view), FALSE);
@@ -258,132 +260,58 @@ create_summary_tab (xfceweather_data *data)
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"), data->location_name);
APPEND_BTEXT (value);
g_free (value);
-#if 0
- date = translate_lsup (get_data (data->weatherdata, LSUP));
- value = g_strdup_printf (_("Observation station located in %s\nLast update: %s.\n"),
- get_data (data->weatherdata, OBST), date ? date : get_data (data->weatherdata, LSUP));
- g_free (date);
+
+ timeslice = get_current_timeslice(data->weatherdata, FALSE);
+ value = g_strdup_printf (_("Coordinates: lat %s lon %s\nData applies to: %s.\n"),
+ data->lat, data->lon, ctime(×lice->start));
APPEND_TEXT_ITEM_REAL (value);
/* Temperature */
APPEND_BTEXT (_("\nTemperature\n"));
- APPEND_TEXT_ITEM (_("Temperature"), TEMP);
- APPEND_TEXT_ITEM (_("Windchill"), FLIK);
-
- /* special case for TRANS because of translate_desc */
- value = g_strdup_printf ("\t%s: %s\n", _("Description"),
- translate_desc (get_data (data->weatherdata, TRANS)));
- APPEND_TEXT_ITEM_REAL (value);
- APPEND_TEXT_ITEM (_("Dew point"), DEWP);
+ APPEND_TEXT_ITEM (_("Temperature"), TEMPERATURE);
/* Wind */
APPEND_BTEXT (_("\nWind\n"));
- wind = translate_wind_speed (get_data (data->weatherdata, WIND_SPEED), data->unit);
- value = g_strdup_printf ("\t%s: %s\n", _("Speed"), wind);
+ wind = translate_wind_speed (data->weatherdata, get_data (data->weatherdata, WIND_SPEED), data->unit);
+ value = g_strdup_printf ("\t%s: %s (%s on the Beaufort scale)\n", _("Speed"), wind,
+ get_data (data->weatherdata, WIND_BEAUFORT));
g_free (wind);
APPEND_TEXT_ITEM_REAL (value);
wind = translate_wind_direction (get_data (data->weatherdata, WIND_DIRECTION));
- value = g_strdup_printf ("\t%s: %s\n", _("Direction"),
- wind ? wind : get_data (data->weatherdata, WIND_DIRECTION));
+ value = g_strdup_printf ("\t%s: %s (%s%s)\n", _("Direction"),
+ wind ? wind : get_data (data->weatherdata, WIND_DIRECTION),
+ get_data (data->weatherdata, WIND_DIRECTION_DEG),
+ get_unit (data->weatherdata, data->unit, WIND_DIRECTION_DEG));
g_free (wind);
APPEND_TEXT_ITEM_REAL (value);
- wind = translate_wind_speed (get_data (data->weatherdata, WIND_GUST), data->unit);
- value = g_strdup_printf ("\t%s: %s\n", _("Gusts"), wind);
- g_free (wind);
- APPEND_TEXT_ITEM_REAL (value);
-
- /* UV */
- APPEND_BTEXT (_("\nUV\n"));
- APPEND_TEXT_ITEM (_("Index"), UV_INDEX);
- value = g_strdup_printf ("\t%s: %s\n", _("Risk"),
- translate_risk (get_data (data->weatherdata, UV_TRANS)));
- APPEND_TEXT_ITEM_REAL (value);
-
/* Atmospheric pressure */
APPEND_BTEXT (_("\nAtmospheric pressure\n"));
- APPEND_TEXT_ITEM (_("Pressure"), BAR_R);
-
- value = g_strdup_printf ("\t%s: %s\n", _("State"),
- translate_bard (get_data (data->weatherdata, BAR_D)));
- APPEND_TEXT_ITEM_REAL (value);
-
- /* Sun */
- APPEND_BTEXT (_("\nSun\n"));
- sun_val = translate_time (get_data (data->weatherdata, SUNR));
- value = g_strdup_printf ("\t%s: %s\n",
- _("Rise"), sun_val ? sun_val : get_data (data->weatherdata, SUNR));
- g_free (sun_val);
- APPEND_TEXT_ITEM_REAL (value);
-
- sun_val = translate_time (get_data (data->weatherdata, SUNS));
- value = g_strdup_printf ("\t%s: %s\n",
- _("Set"), sun_val ? sun_val : get_data (data->weatherdata, SUNS));
- g_free (sun_val);
- APPEND_TEXT_ITEM_REAL (value);
+ APPEND_TEXT_ITEM (_("Pressure"), PRESSURE);
/* Other */
APPEND_BTEXT (_("\nOther\n"));
- APPEND_TEXT_ITEM (_("Humidity"), HMID);
- vis = translate_visibility (get_data (data->weatherdata, VIS), data->unit);
- value = g_strdup_printf ("\t%s: %s\n", _("Visibility"), vis);
- g_free (vis);
- APPEND_TEXT_ITEM_REAL (value);
+ APPEND_TEXT_ITEM (_("Humidity"), HUMIDITY);
+ APPEND_TEXT_ITEM (_("Low clouds"), CLOUDINESS_LOW);
+ APPEND_TEXT_ITEM (_("Medium clouds"), CLOUDINESS_MED);
+ APPEND_TEXT_ITEM (_("High clouds"), CLOUDINESS_HIGH);
+ APPEND_TEXT_ITEM (_("Fog"), FOG);
- 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_BTEXT (_("\nData from The Norwegian Meteorological Institute\n"));
+ APPEND_LINK_ITEM ("\t", "Thanks to met.no", "http://met.no/", ltag1);
- APPEND_LINK_ITEM ("\t", get_data (data->weatherdata, LNK1_TXT), get_data (data->weatherdata, LNK1), ltag1);
- APPEND_LINK_ITEM ("\t", get_data (data->weatherdata, LNK2_TXT), get_data (data->weatherdata, LNK2), ltag2);
- APPEND_LINK_ITEM ("\t", get_data (data->weatherdata, LNK3_TXT), get_data (data->weatherdata, LNK3), ltag3);
- APPEND_LINK_ITEM ("\t", get_data (data->weatherdata, LNK4_TXT), get_data (data->weatherdata, LNK4), ltag4);
-#endif
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);
-#if 0
- weather_channel_icon = weather_summary_get_logo(data);
-
- 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);
- }
-#endif
+
if (hand_cursor == NULL)
hand_cursor = gdk_cursor_new(GDK_HAND2);
if (text_cursor == NULL)
diff --git a/panel-plugin/weather-translate.c b/panel-plugin/weather-translate.c
index 7afb3e2..4649c46 100644
--- a/panel-plugin/weather-translate.c
+++ b/panel-plugin/weather-translate.c
@@ -438,7 +438,8 @@ translate_wind_direction (const gchar *wdir)
/* calm or a number */
gchar *
-translate_wind_speed (const gchar *wspeed,
+translate_wind_speed (xml_weather *data,
+ const gchar *wspeed,
units unit)
{
gchar *wspeed_loc;
@@ -449,7 +450,7 @@ translate_wind_speed (const gchar *wspeed,
wspeed_loc = g_strdup (_("N/A"));
else
wspeed_loc =
- g_strdup_printf ("%s %s", wspeed, get_unit (/* FIXME */NULL, unit, WIND_SPEED));
+ g_strdup_printf ("%s %s", wspeed, get_unit (data, unit, WIND_SPEED));
return wspeed_loc;
}
diff --git a/panel-plugin/weather-translate.h b/panel-plugin/weather-translate.h
index e9e170f..7ef4674 100644
--- a/panel-plugin/weather-translate.h
+++ b/panel-plugin/weather-translate.h
@@ -36,7 +36,7 @@ gchar *translate_day (const gchar *);
gchar *translate_wind_direction (const gchar *);
-gchar *translate_wind_speed (const gchar *, units);
+gchar *translate_wind_speed (xml_weather *data, const gchar *, units);
gchar *translate_time (const gchar *);
diff --git a/panel-plugin/weather.c b/panel-plugin/weather.c
index 2e12f45..497bf7b 100644
--- a/panel-plugin/weather.c
+++ b/panel-plugin/weather.c
@@ -121,8 +121,14 @@ make_label (xml_weather *weatherdata,
case HUMIDITY:
lbl = _("H");
break;
- case CLOUDINESS:
- lbl = _("C");
+ case CLOUDINESS_LOW:
+ lbl = _("CL");
+ break;
+ case CLOUDINESS_MED:
+ lbl = _("CM");
+ break;
+ case CLOUDINESS_HIGH:
+ lbl = _("CH");
break;
case FOG:
lbl = _("F");
@@ -155,7 +161,7 @@ make_label (xml_weather *weatherdata,
value = translate_wind_direction (rawvalue);
break;
case WIND_SPEED:
- value = translate_wind_speed (rawvalue, unit);
+ value = translate_wind_speed (weatherdata, rawvalue, unit);
break;
default:
value = NULL;
More information about the Xfce4-commits
mailing list