Author: juha
Date: 2008-02-07 20:51:01 +0000 (Thu, 07 Feb 2008)
New Revision: 26600

Modified:
   xfcalendar/trunk/configure.in.in
   xfcalendar/trunk/src/appointment.c
   xfcalendar/trunk/src/appointment.h
   xfcalendar/trunk/src/day-view.c
   xfcalendar/trunk/src/day-view.h
   xfcalendar/trunk/src/event-list.c
   xfcalendar/trunk/src/event-list.h
   xfcalendar/trunk/src/mainbox.c
   xfcalendar/trunk/src/reminder.c
   xfcalendar/trunk/src/tray_icon.c
Log:
1) Fixing BUG 3835 - No visual confirmation of setting
   now it works similarly than Orage 4.4 but correctly
2) Fixed error in day view when showing reserved time for
   appointments crossing day change.


Modified: xfcalendar/trunk/configure.in.in
===================================================================
--- xfcalendar/trunk/configure.in.in    2008-02-07 08:04:21 UTC (rev 26599)
+++ xfcalendar/trunk/configure.in.in    2008-02-07 20:51:01 UTC (rev 26600)
@@ -9,7 +9,7 @@
 dnl
 
 dnl Version information
-m4_define([orage_version], [4.5.12.3-svn])
+m4_define([orage_version], [4.5.12.4-svn])
 
 m4_define([gtk_minimum_version], [2.6.0])
 m4_define([xfce_minimum_version], [4.4.0])

Modified: xfcalendar/trunk/src/appointment.c
===================================================================
--- xfcalendar/trunk/src/appointment.c  2008-02-07 08:04:21 UTC (rev 26599)
+++ xfcalendar/trunk/src/appointment.c  2008-02-07 20:51:01 UTC (rev 26600)
@@ -670,6 +670,10 @@
 
 static void app_free_memory(appt_win *apptw)
 {
+    /* remove myself from event list appointment monitoring list */
+    if (apptw->el)
+        ((el_win *)apptw->el)->apptw_list = 
+                g_list_remove(((el_win *)apptw->el)->apptw_list, apptw);
     gtk_widget_destroy(apptw->Window);
     gtk_object_destroy(GTK_OBJECT(apptw->Tooltips));
     g_free(apptw->xf_uid);
@@ -1044,11 +1048,8 @@
         if (ok) {
             apptw->appointment_new = FALSE;
             mark_appointment_unchanged(apptw);
-        /* FIXME: Removed since it fails if event_list window has been removed.
-         * We should check that it really still exists, before calling this.
             if (apptw->el != NULL)
                 refresh_el_win((el_win *)apptw->el);
-        */
             orage_mark_appointments();
         }
     }
@@ -1108,11 +1109,8 @@
             xfical_file_close(TRUE);
         }
 
-        /* FIXME: This fails if event_list window has been removed.
-         * We should check that it really still exists, before calling this.
         if (apptw->el != NULL)
             refresh_el_win((el_win *)apptw->el);
-        */
         orage_mark_appointments();
 
         app_free_memory(apptw);
@@ -1135,7 +1133,8 @@
     gint x, y;
     appt_win *apptw2;
 
-    apptw2 = create_appt_win("COPY", apptw->xf_uid, apptw->el);
+    /* do not keep track of appointments created here */
+    apptw2 = create_appt_win("COPY", apptw->xf_uid);
     gtk_window_get_position(GTK_WINDOW(apptw->Window), &x, &y);
     gtk_window_move(GTK_WINDOW(apptw2->Window), x+20, y+20);
 }
@@ -2343,7 +2342,7 @@
     }
 }
 
-appt_win *create_appt_win(char *action, char *par, el_win *event_list)
+appt_win *create_appt_win(char *action, char *par)
 {
     appt_win *apptw;
     GdkWindow *window;
@@ -2353,7 +2352,7 @@
     apptw->xf_uid = NULL;
     apptw->par = NULL;
     apptw->appt = NULL;
-    apptw->el = event_list;    /* Keep track of the parent, if any */
+    apptw->el = NULL;
     apptw->appointment_changed = FALSE;
     apptw->Tooltips = gtk_tooltips_new();
     apptw->accel_group = gtk_accel_group_new();
@@ -2395,6 +2394,7 @@
     }
     else { /* failed to get data */
         app_free_memory(apptw);
+        apptw = NULL;
     }
 
     return(apptw);

Modified: xfcalendar/trunk/src/appointment.h
===================================================================
--- xfcalendar/trunk/src/appointment.h  2008-02-07 08:04:21 UTC (rev 26599)
+++ xfcalendar/trunk/src/appointment.h  2008-02-07 20:51:01 UTC (rev 26600)
@@ -25,7 +25,6 @@
 #define __APPOINTMENT_H__
 
 #include "ical-code.h"
-#include "event-list.h"
 
 typedef struct _appt_win
 {
@@ -173,7 +172,7 @@
     xfical_appt *appt;
     gchar *xf_uid;
     gchar *par;
-    el_win *el; 
+    void  *el;          /* used to refresh calling event list */
     gboolean appointment_add;       /* are we adding app */
     gboolean appointment_changed;   /* has this app been modified now */
     gboolean appointment_new;       /* is this new = no uid yet */
@@ -181,6 +180,6 @@
      * add == TRUE && new == FALSE */
 } appt_win;
 
-appt_win *create_appt_win(char *action, char *par, el_win *el);
+appt_win *create_appt_win(char *action, char *par);
 
 #endif /* !__APPOINTMENT_H__ */

Modified: xfcalendar/trunk/src/day-view.c
===================================================================
--- xfcalendar/trunk/src/day-view.c     2008-02-07 08:04:21 UTC (rev 26599)
+++ xfcalendar/trunk/src/day-view.c     2008-02-07 20:51:01 UTC (rev 26600)
@@ -144,7 +144,7 @@
     s_date = (char *)gtk_button_get_label(GTK_BUTTON(dw->StartDate_button));
     strcpy(a_day, orage_i18_date_to_icaltime(s_date));
 
-    create_appt_win("NEW", a_day, NULL);
+    create_appt_win("NEW", a_day);
 }
 
 static void on_File_newApp_activate_cb(GtkMenuItem *mi, gpointer user_data)
@@ -378,7 +378,7 @@
 
     if (event->type==GDK_2BUTTON_PRESS) {
         uid = g_object_get_data(G_OBJECT(widget), "UID");
-        create_appt_win("UPDATE", uid, NULL);
+        create_appt_win("UPDATE", uid);
     }
 }
 
@@ -395,14 +395,17 @@
     tm_start = orage_icaltime_to_tm_time(appt->starttimecur, FALSE);
     tm_end   = orage_icaltime_to_tm_time(appt->endtimecur, FALSE);
     tm_first = orage_icaltime_to_tm_time(a_day, FALSE);
+    start_col = orage_days_between(&tm_first, &tm_start)+1;
+    end_col   = orage_days_between(&tm_first, &tm_end)+1;
 
-    col = orage_days_between(&tm_first, &tm_start)+1;
-    if (col < 1) {
+    if (start_col < 1) {
         col = 1;
         row = 0;
     }
-    else 
+    else {
+        col = start_col;
         row = tm_start.tm_hour;
+    }
 
     /* then add the appointment */
     text = g_strdup(appt->title ? appt->title : _("Unknown"));
@@ -474,12 +477,10 @@
         /*
          * same_date = !strncmp(start_ical_time, end_ical_time, 8);
          * */
-        start_col = orage_days_between(&tm_first, &tm_start)+1;
         if (start_col < 1)
             first_col = 1;
         else
             first_col = start_col;
-        end_col   = orage_days_between(&tm_first, &tm_end)+1;
         if (end_col > days)
             last_col = days;
         else
@@ -562,6 +563,7 @@
     height = dw->StartDate_button_req.height;
     width = dw->StartDate_button_req.width;
 
+    /* first clear the structure */
     for (col = 1; col <  days+1; col++) {
         dw->header[col] = NULL;
         for (row = 0; row < 24; row++) {
@@ -570,11 +572,14 @@
             dw->line[row][col] = build_line(dw, 0, 0, 3, height, NULL);
         }
     }
+
     app_data(dw);
+
     for (col = 1; col < days+1; col++) {
         hb = gtk_hbox_new(FALSE, 0);
         marker = build_line(dw, 0, 0, 2, height, NULL);
         gtk_box_pack_start(GTK_BOX(hb), marker, FALSE, FALSE, 0);
+        /* check if we have full day events and put them to header */
         if (dw->header[col]) {
             gtk_box_pack_start(GTK_BOX(hb), dw->header[col], TRUE, TRUE, 0);
             gtk_widget_set_size_request(hb, width, -1);
@@ -586,6 +591,8 @@
         }
         gtk_table_attach(GTK_TABLE(dw->dtable_h), hb, col, col+1, 1, 2
                  , (GTK_FILL), (0), 0, 0);
+
+        /* check rows */
         for (row = 0; row < 24; row++) {
             hb = gtk_hbox_new(FALSE, 0);
             if (row == 0)
@@ -691,45 +698,59 @@
         dw->line_color.blue = 230 * (65535/255);
     }
     gdk_colormap_alloc_color(pic1_cmap, &dw->line_color, FALSE, TRUE);
+
+    if (!gdk_color_parse("red", &dw->fg_sunday)) {
+        g_warning("color parse failed: red\n");
+        dw->fg_sunday.red = 255 * (65535/255);
+        dw->fg_sunday.green = 10 * (65535/255);
+        dw->fg_sunday.blue = 10 * (65535/255);
+    }
+    gdk_colormap_alloc_color(pic1_cmap, &dw->fg_sunday, FALSE, TRUE);
+
+    if (!gdk_color_parse("gold", &dw->bg_today)) {
+        g_warning("color parse failed: gold\n");
+        dw->bg_today.red = 255 * (65535/255);
+        dw->bg_today.green = 215 * (65535/255);
+        dw->bg_today.blue = 115 * (65535/255);
+    }
+    gdk_colormap_alloc_color(pic1_cmap, &dw->bg_today, FALSE, TRUE);
 }
 
+static void fill_hour(day_win *dw, gint col, gint row, char *text)
+{
+    GtkWidget *name, *ev;
+
+    ev = gtk_event_box_new();
+    name = gtk_label_new(text);
+    gtk_container_add(GTK_CONTAINER(ev), name);
+    if ((row % 2) == 1)
+        gtk_widget_modify_bg(ev, GTK_STATE_NORMAL, &dw->bg1);
+    gtk_widget_set_size_request(ev, dw->hour_req.width
+            , dw->StartDate_button_req.height);
+    if (text)
+        gtk_table_attach(GTK_TABLE(dw->dtable), ev, col, col+1, row, row+1
+             , (GTK_FILL), (0), 0, 0);
+    else  /* special, needed for header table full day events */
+        gtk_table_attach(GTK_TABLE(dw->dtable_h), ev, col, col+1, row, row+1
+             , (GTK_FILL), (0), 0, 0);
+}
+
 static void build_day_view_table(day_win *dw)
 {
     gint days;   /* number of days to show */
     int year, month, day;
     gint i, sunday;
-    GtkWidget *name, *label, *ev;
+    GtkWidget *label, *button;
     char text[5+1], *date, *today;
     struct tm tm_date;
     guint monthdays[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
     GtkWidget *vp;
-    GdkColor fg, bg;
-    GdkColormap *pic1_cmap;
-
-    pic1_cmap = gdk_colormap_get_system();
-    if (!gdk_color_parse("red", &fg)) {
-        g_warning("color parse failed: red\n");
-        fg.red = 255 * (65535/255);
-        fg.green = 10 * (65535/255);
-        fg.blue = 10 * (65535/255);
-    }
-    gdk_colormap_alloc_color(pic1_cmap, &fg, FALSE, TRUE);
-    if (!gdk_color_parse("gold", &bg)) {
-        g_warning("color parse failed: gold\n");
-        bg.red = 255 * (65535/255);
-        bg.green = 215 * (65535/255);
-        bg.blue = 115 * (65535/255);
-    }
-    gdk_colormap_alloc_color(pic1_cmap, &bg, FALSE, TRUE);
-
+    
     days = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(dw->day_spin));
     tm_date = orage_i18_date_to_tm_date(
             gtk_button_get_label(GTK_BUTTON(dw->StartDate_button)));
-    sunday = tm_date.tm_wday; /* 0 = Sunday */
-    if (sunday)
-        sunday = 7-sunday;
-    
-    /* header of day table = days columns */
+
+    /****** header of day table = days columns ******/
     dw->scroll_win_h = gtk_scrolled_window_new(NULL, NULL);
     gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(dw->scroll_win_h)
             , GTK_POLICY_AUTOMATIC, GTK_POLICY_NEVER);
@@ -741,35 +762,38 @@
     /*
     gtk_container_add(GTK_CONTAINER(dw->scroll_win_h), dw->day_view_vbox);
     */
+    /* row 1= day header buttons 
+     * row 2= full day events after the buttons */
     dw->dtable_h = gtk_table_new(2, days+2, FALSE);
     gtk_box_pack_start(GTK_BOX(dw->day_view_vbox), dw->dtable_h
             , FALSE, FALSE, 0);
+
+    sunday = tm_date.tm_wday; /* 0 = Sunday */
+    if (sunday) /* index to next sunday */
+        sunday = 7-sunday;
     year = tm_date.tm_year + 1900;
     month = tm_date.tm_mon;
     day = tm_date.tm_mday;
     if (((tm_date.tm_year%4) == 0) && (((tm_date.tm_year%100) != 0) 
             || ((tm_date.tm_year%400) == 0)))
         ++monthdays[1];
-    name = gtk_label_new(" ");
-    gtk_widget_set_size_request(name, dw->hour_req.width, -1);
-    gtk_table_attach(GTK_TABLE(dw->dtable_h), name, 0, 1, 0, 1
-             , (GTK_FILL), (0), 0, 0);
+    fill_hour(dw, 0, 0, NULL);
     today = g_strdup(orage_localdate_i18());
     for (i = 1; i <  days+1; i++) {
         date = orage_tm_date_to_i18_date(&tm_date);
-        name = gtk_button_new();
-        gtk_button_set_label(GTK_BUTTON(name), date);
+        button = gtk_button_new();
+        gtk_button_set_label(GTK_BUTTON(button), date);
         if (strcmp(today, date) == 0) {
-            gtk_widget_modify_bg(name, GTK_STATE_NORMAL, &bg);
+            gtk_widget_modify_bg(button, GTK_STATE_NORMAL, &dw->bg_today);
         }
         if ((i-1)%7 == sunday) {
-            label = gtk_bin_get_child(GTK_BIN(name));
-            gtk_widget_modify_fg(label, GTK_STATE_NORMAL, &fg);
+            label = gtk_bin_get_child(GTK_BIN(button));
+            gtk_widget_modify_fg(label, GTK_STATE_NORMAL, &dw->fg_sunday);
         }
-        gtk_widget_set_size_request(name, dw->StartDate_button_req.width, -1);
-        g_signal_connect((gpointer)name, "clicked"
+        gtk_widget_set_size_request(button, dw->StartDate_button_req.width, 
-1);
+        g_signal_connect((gpointer)button, "clicked"
                 , G_CALLBACK(header_button_clicked_cb), dw);
-        gtk_table_attach(GTK_TABLE(dw->dtable_h), name, i, i+1, 0, 1
+        gtk_table_attach(GTK_TABLE(dw->dtable_h), button, i, i+1, 0, 1
                 , (GTK_FILL), (0), 0, 0);
 
         if (++tm_date.tm_mday == (monthdays[tm_date.tm_mon]+1)) {
@@ -781,12 +805,9 @@
         }
     }
     g_free(today);
-    name = gtk_label_new(" ");
-    gtk_widget_set_size_request(name, dw->hour_req.width, -1);
-    gtk_table_attach(GTK_TABLE(dw->dtable_h), name, days+1, days+2, 0, 1
-             , (GTK_FILL), (0), 0, 0);
+    fill_hour(dw, days+1, 0, NULL);
 
-    /* body of day table */
+    /****** body of day table ******/
     dw->scroll_win = gtk_scrolled_window_new(NULL, NULL);
     gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(dw->scroll_win)
             , GTK_SHADOW_NONE);
@@ -804,25 +825,10 @@
 
     /* hours column = hour rows */
     for (i = 0; i < 24; i++) {
-        ev = gtk_event_box_new();
         g_sprintf(text, "%02d", i);
-        name = gtk_label_new(text);
-        gtk_container_add(GTK_CONTAINER(ev), name);
-        if ((i % 2) == 1)
-            gtk_widget_modify_bg(ev, GTK_STATE_NORMAL, &dw->bg1);
-        gtk_widget_set_size_request(ev, dw->hour_req.width
-                , dw->StartDate_button_req.height);
-        gtk_table_attach(GTK_TABLE(dw->dtable), ev, 0, 1, i, i+1
-             , (GTK_FILL), (0), 0, 0);
-        ev = gtk_event_box_new();
-        name = gtk_label_new(text);
-        gtk_container_add(GTK_CONTAINER(ev), name);
-        if ((i % 2) == 1)
-            gtk_widget_modify_bg(ev, GTK_STATE_NORMAL, &dw->bg1);
-        gtk_widget_set_size_request(ev, dw->hour_req.width
-                , dw->StartDate_button_req.height);
-        gtk_table_attach(GTK_TABLE(dw->dtable), ev, days+1, days+2, i, i+1
-             , (GTK_FILL), (0), 0, 0);
+        /* ev is needed for background colour */
+        fill_hour(dw, 0, i, text);
+        fill_hour(dw, days+1, i, text);
     }
     fill_days(dw, days);
 }

Modified: xfcalendar/trunk/src/day-view.h
===================================================================
--- xfcalendar/trunk/src/day-view.h     2008-02-07 08:04:21 UTC (rev 26599)
+++ xfcalendar/trunk/src/day-view.h     2008-02-07 20:51:01 UTC (rev 26600)
@@ -71,7 +71,7 @@
     guint upd_timer;
     gdouble scroll_pos; /* remember the scroll position */
 
-    GdkColor bg1, bg2, line_color;
+    GdkColor bg1, bg2, line_color, bg_today, fg_sunday;
 } day_win;
 
 day_win *create_day_win(char *start_date);

Modified: xfcalendar/trunk/src/event-list.c
===================================================================
--- xfcalendar/trunk/src/event-list.c   2008-02-07 08:04:21 UTC (rev 26599)
+++ xfcalendar/trunk/src/event-list.c   2008-02-07 20:51:01 UTC (rev 26600)
@@ -82,6 +82,19 @@
     { "STRING", 0, DRAG_TARGET_STRING }
 };
 
+static void do_appt_win(char *mode, char *uid, el_win *el)
+{
+    appt_win *apptw;
+
+    apptw = create_appt_win(mode, uid);
+    if (apptw) {
+        /* we started this, so keep track of it */
+        el->apptw_list = g_list_prepend(el->apptw_list, apptw);
+        /* inform the appointment that we are interested in it */
+        apptw->el = el; 
+    }
+};
+
 static void start_appt_win(char *mode,  el_win *el
         , GtkTreeModel *model, GtkTreeIter *iter, GtkTreePath *path)
 {
@@ -99,7 +112,7 @@
         }
         g_free(flags);
 #endif
-        create_appt_win(mode, uid, el);
+        do_appt_win(mode, uid, el);
         g_free(uid);
     }
 }
@@ -551,7 +564,7 @@
     app_data(el, a_day, NULL);
 }
 
-void journal_data(el_win *el)
+static void journal_data(el_win *el)
 {
     char      a_day[9];  /* yyyymmdd */
 
@@ -692,10 +705,27 @@
 
 static void close_window(el_win *el)
 {
+    appt_win *apptw;
+    GList *apptw_list;
+
     gtk_window_get_size(GTK_WINDOW(el->Window)
             , &g_par.el_size_x, &g_par.el_size_y);
     write_parameters();
 
+    /* need to clean the apointment list and inform all appointments that
+     * we are not interested anymore (= should not get updated) */
+    apptw_list = el->apptw_list;
+    for (apptw_list = g_list_first(apptw_list);
+         apptw_list != NULL;
+         apptw_list = g_list_next(apptw_list)) {
+        apptw = (appt_win *)apptw_list->data;
+        if (apptw) /* appointment window is still alive */
+            apptw->el = NULL; /* not interested anymore */
+        else
+            orage_message(10, "close_window: not null appt window");
+    }
+    g_list_free(el->apptw_list);
+
     gtk_widget_destroy(el->Window); /* destroy the eventlist window */
     gtk_object_destroy(GTK_OBJECT(el->Tooltips));
     g_free(el);
@@ -793,8 +823,7 @@
 
     title = (char *)gtk_window_get_title(GTK_WINDOW(el->Window));
     strcpy(a_day, orage_i18_date_to_icaltime(title));
-
-    create_appt_win("NEW", a_day, el);
+    do_appt_win("NEW", a_day, el);
 }
 
 static void on_File_newApp_activate_cb(GtkMenuItem *mi, gpointer user_data)
@@ -1238,6 +1267,7 @@
     el->today = FALSE;
     el->days = 0;
     el->time_now[0] = 0;
+    el->apptw_list = NULL;
     el->Tooltips = gtk_tooltips_new();
     el->accel_group = gtk_accel_group_new();
 

Modified: xfcalendar/trunk/src/event-list.h
===================================================================
--- xfcalendar/trunk/src/event-list.h   2008-02-07 08:04:21 UTC (rev 26599)
+++ xfcalendar/trunk/src/event-list.h   2008-02-07 20:51:01 UTC (rev 26600)
@@ -92,6 +92,7 @@
     el_page  page;        /* appointment page to show */
     char     time_now[6]; /* hh:mm */
     char     date_now[XFICAL_APPT_TIME_FORMAT_LEN]; /* yyyymmddThhmmss */
+    GList    *apptw_list; /* keep track of appointments being updated */
 } el_win; /* event list window */
 
 el_win* create_el_win(char *start_date);

Modified: xfcalendar/trunk/src/mainbox.c
===================================================================
--- xfcalendar/trunk/src/mainbox.c      2008-02-07 08:04:21 UTC (rev 26599)
+++ xfcalendar/trunk/src/mainbox.c      2008-02-07 20:51:01 UTC (rev 26600)
@@ -83,7 +83,7 @@
     t = orage_localtime();
     g_snprintf(cur_date, 9, "%04d%02d%02d", t->tm_year+1900
             , t->tm_mon+1, t->tm_mday);
-    create_appt_win("NEW", cur_date, NULL);  
+    create_appt_win("NEW", cur_date);  
 }
 
 static void mFile_interface_activate_cb(GtkMenuItem *menuitem
@@ -345,7 +345,7 @@
 #endif
     if (event->type==GDK_2BUTTON_PRESS) {
         uid = g_object_get_data(G_OBJECT(widget), "UID");
-        create_appt_win("UPDATE", uid, NULL);
+        create_appt_win("UPDATE", uid);
     }
 }
 

Modified: xfcalendar/trunk/src/reminder.c
===================================================================
--- xfcalendar/trunk/src/reminder.c     2008-02-07 08:04:21 UTC (rev 26599)
+++ xfcalendar/trunk/src/reminder.c     2008-02-07 20:51:01 UTC (rev 26600)
@@ -361,7 +361,7 @@
     alarm->notify_refresh = TRUE;
     create_notify_reminder(alarm);
     */
-    create_appt_win("UPDATE", alarm->uid, NULL);
+    create_appt_win("UPDATE", alarm->uid);
 }
 #endif
 
@@ -531,7 +531,7 @@
 {
     alarm_struct *alarm = (alarm_struct *)user_data;
 
-    create_appt_win("UPDATE", alarm->uid, NULL);
+    create_appt_win("UPDATE", alarm->uid);
 }
 
 static void create_orage_reminder(alarm_struct *alarm)

Modified: xfcalendar/trunk/src/tray_icon.c
===================================================================
--- xfcalendar/trunk/src/tray_icon.c    2008-02-07 08:04:21 UTC (rev 26599)
+++ xfcalendar/trunk/src/tray_icon.c    2008-02-07 20:51:01 UTC (rev 26600)
@@ -75,7 +75,7 @@
     t = orage_localtime();
     g_snprintf(cur_date, 9, "%04d%02d%02d", t->tm_year+1900
                , t->tm_mon+1, t->tm_mday);
-    create_appt_win("NEW", cur_date, NULL);  
+    create_appt_win("NEW", cur_date);  
 }
 
 void on_about_activate(GtkMenuItem *menuitem, gpointer user_data)

_______________________________________________
Xfce4-commits mailing list
Xfce4-commits@xfce.org
http://foo-projects.org/mailman/listinfo/xfce4-commits

Reply via email to