[Xfce4-commits] r28874 - libxfcegui4/trunk/libxfcegui4

Brian J. Tarricone bjt23 at cornell.edu
Fri Nov 21 18:07:21 CET 2008


What is the reason for this change?  That's a huge code change for what 
should be a one-line g_markup_escape_text().  Please revert; before RC1 
  is not the time for big changes like this without good reason.

	-brian

Nick Schermer wrote:
> Author: nick
> Date: 2008-11-21 11:55:01 +0000 (Fri, 21 Nov 2008)
> New Revision: 28874
> 
> Modified:
>    libxfcegui4/trunk/libxfcegui4/dialogs.c
> Log:
> * Move xfce_message_dialog_new_valist from libxfce4ui
>   to libxfcegui4. This should fix problems with 'wrong'
>   markup in the secondary text (caused by using
>   error->message).
> * Replace tabs with spaces.
> 
> 
> Modified: libxfcegui4/trunk/libxfcegui4/dialogs.c
> ===================================================================
> --- libxfcegui4/trunk/libxfcegui4/dialogs.c	2008-11-21 11:41:55 UTC (rev 28873)
> +++ libxfcegui4/trunk/libxfcegui4/dialogs.c	2008-11-21 11:55:01 UTC (rev 28874)
> @@ -44,6 +44,10 @@
>  #include <glib.h>
>  #include <gtk/gtk.h>
>  
> +#ifdef GDK_WINDOWING_X11
> +#include <gdk/gdkx.h>
> +#endif
> +
>  #include "dialogs.h"
>  #include "xfce-gtk-extensions.h"
>  
> @@ -80,12 +84,12 @@
>      GtkStyle *style;
>  
>      if (recursive > 0)
> -	return;
> +        return;
>  
>      ++recursive;
>      style = gtk_widget_get_style (widget);
>      gtk_widget_modify_bg (widget, GTK_STATE_NORMAL,
> -			  &style->bg[GTK_STATE_SELECTED]);
> +                          &style->bg[GTK_STATE_SELECTED]);
>      --recursive;
>  }
>  
> @@ -96,12 +100,12 @@
>      GtkStyle *style;
>  
>      if (recursive > 0)
> -	return;
> +        return;
>  
>      ++recursive;
>      style = gtk_widget_get_style (widget);
>      gtk_widget_modify_fg (widget, GTK_STATE_NORMAL,
> -			  &style->fg[GTK_STATE_SELECTED]);
> +                          &style->fg[GTK_STATE_SELECTED]);
>      --recursive;
>  }
>  
> @@ -140,17 +144,17 @@
>  
>      if (image)
>      {
> -	gtk_widget_show (image);
> -	gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, FALSE, 0);
> +        gtk_widget_show (image);
> +        gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, FALSE, 0);
>      }
>  
>      style = gtk_widget_get_style (eventbox);
>      gtk_widget_modify_bg (eventbox, GTK_STATE_NORMAL,
> -			  &style->bg[GTK_STATE_SELECTED]);
> +                          &style->bg[GTK_STATE_SELECTED]);
>  
>      markup =
> -	g_strconcat ("<span size=\"larger\" weight=\"bold\">", text,
> -		     "</span>", NULL);
> +        g_strconcat ("<span size=\"larger\" weight=\"bold\">", text,
> +                     "</span>", NULL);
>      label = gtk_label_new (markup);
>      g_free (markup);
>      gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
> @@ -159,12 +163,12 @@
>      
>      style = gtk_widget_get_style (label);
>      gtk_widget_modify_fg (label, GTK_STATE_NORMAL,
> -			  &style->fg[GTK_STATE_SELECTED]);
> +                          &style->fg[GTK_STATE_SELECTED]);
>  
>      g_signal_connect_after (G_OBJECT (eventbox), "style_set",
> -			    G_CALLBACK (private_cb_eventbox_style_set), NULL);
> +                            G_CALLBACK (private_cb_eventbox_style_set), NULL);
>      g_signal_connect_after (G_OBJECT (label), "style_set",
> -			    G_CALLBACK (private_cb_label_style_set), NULL);
> +                            G_CALLBACK (private_cb_label_style_set), NULL);
>  
>      return eventbox;
>  }
> @@ -192,7 +196,7 @@
>      GtkWidget *image = NULL;
>      
>      if (icon)
> -	image = gtk_image_new_from_pixbuf (icon);
> +        image = gtk_image_new_from_pixbuf (icon);
>  
>      return xfce_create_header_with_image (image, text);
>  }
> @@ -216,24 +220,29 @@
>  GtkWidget*
>  xfce_create_mixed_button (const gchar *stock, const gchar *text)
>  {
> -    GtkWidget *button, *align, *image, *hbox, *label;
> +    GtkWidget *button;
> +    GtkWidget *image;
>  
> -    button = gtk_button_new ();
> -    label = gtk_label_new_with_mnemonic (text);
> -    gtk_label_set_mnemonic_widget (GTK_LABEL (label), button);
> +    g_return_val_if_fail (stock != NULL || text != NULL, NULL);
>  
> -    image = gtk_image_new_from_stock (stock, GTK_ICON_SIZE_BUTTON);
> -    hbox = gtk_hbox_new (FALSE, 2);
> +    if (text != NULL)
> +    {
> +        /* create button */
> +        button = gtk_button_new_with_mnemonic (text);
>  
> -    align = gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
> +        if (stock != NULL)
> +        {
> +            /* create image widget */
> +            image = gtk_image_new_from_stock (stock, GTK_ICON_SIZE_BUTTON);
> +            gtk_button_set_image (GTK_BUTTON (button), image);
> +        }
> +    }
> +    else
> +    {
> +        /* fall back to a stock button */
> +        button = gtk_button_new_from_stock (stock);
> +    }
>  
> -    gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, FALSE, 0);
> -    gtk_box_pack_end (GTK_BOX (hbox), label, FALSE, FALSE, 0);
> -
> -    gtk_container_add (GTK_CONTAINER (button), align);
> -    gtk_container_add (GTK_CONTAINER (align), hbox);
> -    gtk_widget_show_all (align);
> -
>      return button;
>  }
>  
> @@ -274,8 +283,8 @@
>      GtkWidget *dlg;
>  
>      dlg = gtk_message_dialog_new (NULL,
> -				  GTK_DIALOG_MODAL,
> -				  type, GTK_BUTTONS_CLOSE, "%s", message);
> +                                  GTK_DIALOG_MODAL,
> +                                  type, GTK_BUTTONS_CLOSE, "%s", message);
>  
>      xfce_gtk_window_center_on_monitor_with_pointer (GTK_WINDOW (dlg));
>      gtk_dialog_run (GTK_DIALOG (dlg));
> @@ -475,186 +484,238 @@
>          return FALSE;
>  }
>  
> -static GtkWidget *
> -xfce_message_dialog_new_valist(GtkWindow *parent,
> -                               const gchar *title,
> -                               const gchar *icon_id,
> -                               const gchar *primary_text,
> -                               const gchar *secondary_text,
> -                               const gchar *first_button_type,
> -                               va_list args)
> +static GdkScreen *
> +xfce_gdk_screen_get_active (gint *monitor_return)
>  {
> -    GtkWidget *dialog, *label;
> -    GtkWidget *hbox, *align;
> -    GtkWidget *image;
> -    gchar *markup = NULL;
> -    gint default_response = G_MININT;
> +#ifdef GDK_WINDOWING_X11
> +    GdkScreen *screen;
> +    Window     child;
> +    Window     root;
> +    GSList    *displays;
> +    GSList    *lp;
> +    guint      xmask;
> +    gint       rootx, rooty;
> +    gint       winx, winy;
> +    gint       n;
>  
> -    /* create the dialog */
> -    dialog = gtk_dialog_new ();
> -
> -    gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
> -    gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
> -    gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);
> -
> -    /* set title if needed */
> -    if (title)
> -        gtk_window_set_title (GTK_WINDOW (dialog), title);
> -    else
> -        gtk_window_set_title (GTK_WINDOW (dialog), "");
> -
> -    /* add image */
> -    hbox = gtk_hbox_new (FALSE, 12);
> -
> -    if (icon_id)
> +    /* determine the list of active displays */
> +    displays = gdk_display_manager_list_displays (gdk_display_manager_get ());
> +    for (lp = displays; lp != NULL; lp = lp->next)
>      {
> -        image = gtk_image_new_from_stock (icon_id, GTK_ICON_SIZE_DIALOG);
> -        gtk_misc_set_alignment (GTK_MISC (image), 0, 0);
> -
> -        gtk_box_pack_start (GTK_BOX (hbox), image, TRUE, FALSE, 0);
> +        /* check all screens on this display */
> +        for (n = 0; n < gdk_display_get_n_screens (lp->data); ++n)
> +        {
> +            /* check if this screen contains the pointer */
> +            screen = gdk_display_get_screen (lp->data, n);
> +            if (XQueryPointer (GDK_SCREEN_XDISPLAY (screen),
> +                               GDK_DRAWABLE_XID (gdk_screen_get_root_window (screen)),
> +                               &root, &child, &rootx, &rooty, &winx, &winy, &xmask))
> +            {
> +                /* return the monitor number */
> +                if (monitor_return)
> +                    *monitor_return = gdk_screen_get_monitor_at_point (screen, rootx, rooty);
> +                
> +                /* yap, this screen contains the pointer, hence it's the active screen */
> +                goto out;
> +            }
> +        }
>      }
>  
> -    /* add the text */
> -    markup = NULL;
> +    /* fallback to the default screen */
> +    screen = gdk_screen_get_default ();
> +    
> +    /* no monitor was found */
> +    if (monitor_return)
> +        *monitor_return = 0;
>  
> -    if (primary_text && secondary_text)
> -    {
> -        markup = g_strdup_printf ("<span weight='bold' size='large'>%s</span>"
> -                                  "\n\n%s", primary_text, secondary_text);
> -    }
> -    else if (primary_text)
> -    {
> -        markup =
> -            g_strdup_printf ("<span weight='bold' size='large'>%s</span>",
> -                             primary_text);
> -    }
> -    else
> -    {
> -        markup = g_strdup (secondary_text);
> -    }
> +out:
> +    /* release the displays */
> +    g_slist_free (displays);
>  
> -    label = gtk_label_new (NULL);
> +    return screen;
> +#else
> +    /* dunno what to do on non-X11 window systems */
> +    return gdk_screen_get_default ();
> +#endif
> +}
>  
> -    gtk_label_set_markup (GTK_LABEL (label), markup);
> -    gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
> -    gtk_label_set_selectable (GTK_LABEL (label), TRUE);
> +static GdkScreen *
> +xfce_gtk_dialog_parse_parent (gpointer    parent,
> +                              GtkWindow **window_return)
> +{
> +    GdkScreen *screen = NULL;
> +    GtkWidget *window = NULL;
>  
> -    gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0);
> +    g_return_val_if_fail (parent == NULL || GDK_IS_SCREEN (parent) || GTK_IS_WIDGET (parent), NULL);
>  
> -    g_free (markup);
> -
> -    gtk_widget_show_all (hbox);
> -    gtk_box_pack_start (GTK_BOX ((GTK_DIALOG (dialog))->vbox), hbox,
> -                        FALSE, FALSE, 0);
> -
> -    align = gtk_alignment_new (0, 0, 0, 0);
> -    gtk_widget_set_size_request (align, 12, 12);
> -    gtk_widget_show (align);
> -    gtk_box_pack_start (GTK_BOX ((GTK_DIALOG (dialog))->vbox), align,
> -                        FALSE, FALSE, 0);
> -
> -    /* sizing according to GNOME HIG, 
> -     * except with a border of 8 instead of 12 */
> -    gtk_container_set_border_width (GTK_CONTAINER (dialog), 2);
> -    gtk_container_set_border_width (GTK_CONTAINER (hbox), 6);
> -
> -    /* add the buttons */
> -    if (first_button_type)
> +    /* determine the proper parent if one was set */
> +    if (parent != NULL)
>      {
> -        const gchar *text;
> -        gint response_id;
> +        if (GDK_IS_SCREEN (parent))
> +        {
> +            /* yep, that's a screen */
> +            screen = GDK_SCREEN (parent);
> +        }
> +        else if (GTK_IS_WIDGET (parent))
> +        {
> +            /* parent is a widget, so let's determine the toplevel window */
> +            window = gtk_widget_get_toplevel (GTK_WIDGET (parent));
> +            if (GTK_WIDGET_TOPLEVEL (window))
> +            {
> +                /* make sure the toplevel window is shown */
> +                gtk_widget_show_now (window);
> +            }
> +            else
> +            {
> +                /* no toplevel, not usable then */
> +                window = NULL;
> +            }
>  
> -        text = first_button_type;
> +            /* determine the screen for the widget */
> +            screen = gtk_widget_get_screen (GTK_WIDGET (parent));
> +        }
> +    }
>  
> -        while (text != NULL)
> -        {
> -            GtkWidget *button;
> +    /* use the active screen */
> +    if (screen == NULL)
> +        screen = xfce_gdk_screen_get_active (NULL);
>  
> -            if (strcmp (text, XFCE_CUSTOM_PIXBUF_BUTTON) == 0)
> -            {
> -                GdkPixbuf *icon, *scaled;
> -                GtkWidget *align, *image, *hbox, *label;
> -                gint w, h;
> +    /* return the window */
> +    if (G_LIKELY (window_return != NULL))
> +        *window_return = GTK_WINDOW (window);
>  
> -                text = va_arg (args, gchar *);
> -                icon = va_arg (args, GdkPixbuf *);
> -                default_response = response_id = va_arg (args, int);
> +    return screen;
> +}
>  
> -                button = gtk_button_new ();
> -                label = gtk_label_new_with_mnemonic (text);
> -                gtk_label_set_mnemonic_widget (GTK_LABEL (label), button);
> +static GtkWidget *
> +xfce_message_dialog_new_valist(GtkWindow *parent,
> +                               const gchar *title,
> +                               const gchar *icon_stock_id,
> +                               const gchar *primary_text,
> +                               const gchar *secondary_text,
> +                               const gchar *first_button_type,
> +                               va_list args)
> +{
> +    GtkWidget   *dialog;
> +    GtkWindow   *window;
> +    GdkScreen   *screen;
> +    gchar       *markup;
> +    GtkWidget   *image;
> +    GtkWidget   *button;
> +    const gchar *text = first_button_type;
> +    const gchar *label;
> +    const gchar *stock_id;
> +    gint         response;
> +    GdkPixbuf   *pixbuf, *scaled;
> +    gint         w, h;
>  
> -                gtk_icon_size_lookup (GTK_ICON_SIZE_BUTTON, &w, &h);
> +    g_return_val_if_fail (primary_text != NULL || secondary_text != NULL, NULL);
>  
> -                if ((gdk_pixbuf_get_width (icon) != w) &&
> -                    (gdk_pixbuf_get_height (icon) != h))
> -                {
> -                    scaled = gdk_pixbuf_scale_simple (icon, w, h,
> -                                                      GDK_INTERP_BILINEAR);
> +    /* parse the parent pointer */
> +    screen = xfce_gtk_dialog_parse_parent (parent, &window);
>  
> -                    g_object_unref (G_OBJECT (icon));
> -                    icon = scaled;
> -                }
> +    /* create the dialog */
> +    if (G_LIKELY (primary_text != NULL))
> +    {
> +        /* create dialog with large bold text */
> +        markup = g_strdup_printf ("<span weight='bold' size='large'>%s</span>", primary_text);
> +        dialog = gtk_message_dialog_new_with_markup (window,
> +                                                     GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL,
> +                                                     GTK_MESSAGE_OTHER, GTK_BUTTONS_NONE,
> +                                                     markup);
> +        g_free (markup);
> +        
> +        /* set secondary text */
> +        if (secondary_text != NULL)
> +            gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), secondary_text);
> +    }
> +    else
> +    {
> +        /* create dialog with normal seconday text */
> +        dialog = gtk_message_dialog_new (window,
> +                                         GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL,
> +                                         GTK_MESSAGE_OTHER, GTK_BUTTONS_NONE,
> +                                         secondary_text);
> +    }
>  
> -                image = gtk_image_new_from_pixbuf (icon);
> +    /* move the dialog to the appropriate screen and center it */
> +    if (G_UNLIKELY (window == NULL && screen != NULL))
> +    {
> +        gtk_window_set_screen (GTK_WINDOW (dialog), screen);
> +        gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER);
> +    }
>  
> -                hbox = gtk_hbox_new (FALSE, 2);
> -                align = gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
> +    /* set title */
> +    if (title != NULL)
> +        gtk_window_set_title (GTK_WINDOW (dialog), title);
>  
> -                gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, FALSE, 0);
> -                gtk_box_pack_end (GTK_BOX (hbox), label, FALSE, FALSE, 0);
> +    if (icon_stock_id != NULL)
> +    {
> +        /* set dialog and window icon */
> +        image = gtk_image_new_from_stock (icon_stock_id, GTK_ICON_SIZE_DIALOG);
> +        gtk_message_dialog_set_image (GTK_MESSAGE_DIALOG (dialog), image);
> +        gtk_widget_show (image);
> +        gtk_window_set_icon_name (GTK_WINDOW (dialog), icon_stock_id);
> +    }
>  
> -                gtk_container_add (GTK_CONTAINER (button), align);
> -                gtk_container_add (GTK_CONTAINER (align), hbox);
> -                gtk_widget_show_all (align);
> -            }
> -            else if (strcmp (text, XFCE_CUSTOM_STOCK_BUTTON) == 0)
> -            {
> -                gchar *icon_stock;
> +    /* add buttons */
> +    while (text != NULL)
> +    {
> +        if (strcmp (text, XFCE_CUSTOM_BUTTON) == 0)
> +        {
> +            /* get arguments */
> +            stock_id = va_arg (args, const gchar *);
> +            label = va_arg (args, const gchar *);
> +            response = va_arg (args, gint);
>  
> -                text = va_arg (args, gchar *);
> -                icon_stock = va_arg (args, gchar *);
> -                default_response = response_id = va_arg (args, int);
> +            /* add a mixed button to the dialog */
> +            button = xfce_create_mixed_button (stock_id, label);
> +            gtk_dialog_add_action_widget (GTK_DIALOG (dialog), button, response);
> +            gtk_widget_show (button);
> +        }
> +        else if (strcmp (text, XFCE_CUSTOM_PIXBUF_BUTTON) == 0)
> +        {
> +            /* get arguments */
> +            pixbuf = va_arg (args, GdkPixbuf *);
> +            label = va_arg (args, const gchar *);
> +            response = va_arg (args, gint);
>  
> -                button = xfce_create_mixed_button (icon_stock, text);
> -            }
> -            else if (strcmp (text, XFCE_CUSTOM_BUTTON) == 0)
> -            {
> -                text = va_arg (args, gchar *);
> -                default_response = response_id = va_arg (args, int);
> +            /* lookup real icons size for button icons */
> +            gtk_icon_size_lookup (GTK_ICON_SIZE_BUTTON, &w, &h);
>  
> -                button = gtk_button_new_with_label (text);
> -            }
> +            /* scale the pixbuf if needed */
> +            if (gdk_pixbuf_get_width (pixbuf) != w || gdk_pixbuf_get_height (pixbuf) != h)
> +                scaled = gdk_pixbuf_scale_simple (pixbuf, w, h, GDK_INTERP_BILINEAR);
>              else
> -            {
> -                default_response = response_id = va_arg (args, int);
> +                scaled = NULL;
>  
> -                button = gtk_button_new_from_stock (text);
> -            }
> +            /* create image */
> +            image = gtk_image_new_from_pixbuf (scaled ? scaled : pixbuf);
>  
> -            GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
> +            /* release scaled image */
> +            if (scaled != NULL)
> +                g_object_unref (G_OBJECT (scaled));
> +
> +            /* create button and add it to the dialog */
> +            button = gtk_button_new_with_label (label);
> +            gtk_button_set_image (GTK_BUTTON (button), image);
> +            gtk_dialog_add_action_widget (GTK_DIALOG (dialog), button, response);
>              gtk_widget_show (button);
> -            gtk_dialog_add_action_widget (GTK_DIALOG (dialog), button,
> -                                          response_id);
> +        }
> +        else /* stock button */
> +        {
> +            /* get arguments */
> +            stock_id = text;
> +            response = va_arg (args, gint);
>  
> -            text = va_arg (args, gchar *);
> +            /* add a stock button to the dialog */
> +            gtk_dialog_add_button (GTK_DIALOG (dialog), stock_id, response);
>          }
> +
> +        /* get the next argument */
> +        text = va_arg (args, const gchar *);
>      }
> -    
> -    if (default_response != G_MININT)
> -        gtk_dialog_set_default_response (GTK_DIALOG (dialog), default_response);
>  
> -    if (parent)
> -    {
> -        gtk_window_set_transient_for (GTK_WINDOW (dialog), parent);
> -        gtk_window_set_position (GTK_WINDOW (dialog),
> -                                 GTK_WIN_POS_CENTER_ON_PARENT);
> -    }
> -    else
> -    {
> -        xfce_gtk_window_center_on_monitor_with_pointer (GTK_WINDOW (dialog));
> -    }
> -    
>      return dialog;
>  }
>  
> @@ -794,21 +855,21 @@
>  exec_command (gchar * command)
>  {
>      gboolean success = TRUE;
> -    GError *error = NULL;	/* this must be NULL to prevent crash :( */
> +    GError *error = NULL;       /* this must be NULL to prevent crash :( */
>  
>      g_return_val_if_fail (command != NULL, FALSE);
>  
>      if (!g_spawn_command_line_async (command, &error))
>      {
> -	char *msg = g_strcompress (error->message);
> -	char *text =
> -	    g_strconcat ("Could not run command: ", command, ":\n", msg,
> -			 NULL);
> -	show_error (text);
> -	g_free (msg);
> -	g_free (text);
> -	g_error_free (error);
> -	success = FALSE;
> +        char *msg = g_strcompress (error->message);
> +        char *text =
> +            g_strconcat ("Could not run command: ", command, ":\n", msg,
> +                         NULL);
> +        show_error (text);
> +        g_free (msg);
> +        g_free (text);
> +        g_error_free (error);
> +        success = FALSE;
>      }
>      return success;
>  }
> @@ -818,29 +879,29 @@
>  {
>      gboolean success = TRUE;
>      gboolean retval;
> -    GError *error = NULL;	/* this must be NULL to prevent crash :( */
> +    GError *error = NULL;       /* this must be NULL to prevent crash :( */
>  
>      g_return_val_if_fail (argv != NULL, FALSE);
>  
>      if (envp == NULL)
>      {
> -	envp = environ;
> +        envp = environ;
>      }
>  
>      retval =
> -	g_spawn_async (NULL, argv, envp, G_SPAWN_SEARCH_PATH, NULL, NULL,
> -		       NULL, &error);
> +        g_spawn_async (NULL, argv, envp, G_SPAWN_SEARCH_PATH, NULL, NULL,
> +                       NULL, &error);
>      if (!retval)
>      {
> -	gchar *msg = g_strcompress (error->message);
> -	char *text =
> -	    g_strconcat ("Could not run command: ", argv[0], ":\n", msg,
> -			 NULL);
> -	g_error_free (error);
> -	g_free (msg);
> -	show_error (text);
> -	g_free (text);
> -	success = FALSE;
> +        gchar *msg = g_strcompress (error->message);
> +        char *text =
> +            g_strconcat ("Could not run command: ", argv[0], ":\n", msg,
> +                         NULL);
> +        g_error_free (error);
> +        g_free (msg);
> +        show_error (text);
> +        g_free (text);
> +        success = FALSE;
>      }
>  
>      return success;
> 
> _______________________________________________
> Xfce4-commits mailing list
> Xfce4-commits at xfce.org
> http://foo-projects.org/mailman/listinfo/xfce4-commits
> 



More information about the Xfce4-dev mailing list