[Xfce4-commits] [xfce/xfwm4] 19/32: tabwin: complete GTK3 port, add CSS support
noreply at xfce.org
noreply at xfce.org
Tue Dec 5 09:22:05 CET 2017
This is an automated email from the git hooks/post-receive script.
o l i v i e r p u s h e d a c o m m i t t o b r a n c h m a s t e r
in repository xfce/xfwm4.
commit 2c6edfb5de6f53ac08cf86e71ca7c1028e52760f
Author: Viktor Odintsev <zakhams at gmail.com>
Date: Mon Jul 3 22:25:19 2017 +0300
tabwin: complete GTK3 port, add CSS support
---
src/tabwin.c | 344 ++++++++++++++++++++++-------------------------------------
1 file changed, 126 insertions(+), 218 deletions(-)
diff --git a/src/tabwin.c b/src/tabwin.c
index d2bccf2..5530aef 100644
--- a/src/tabwin.c
+++ b/src/tabwin.c
@@ -40,26 +40,10 @@
#define WIN_ICON_BORDER 5
#endif
-#ifndef WIN_BORDER_WIDTH
-#define WIN_BORDER_WIDTH 1
-#endif
-
#ifndef WIN_MAX_RATIO
#define WIN_MAX_RATIO 0.80
#endif
-#ifndef WIN_ALPHA
-#define WIN_ALPHA 0.85
-#endif
-
-#ifndef WIN_BORDER_ALPHA
-#define WIN_BORDER_ALPHA 0.5
-#endif
-
-#ifndef WIN_BORDER_RADIUS
-#define WIN_BORDER_RADIUS 10
-#endif
-
#include <math.h>
#include <glib.h>
#include <gdk/gdk.h>
@@ -74,6 +58,16 @@
#include "settings.h"
#include "compositor.h"
+#define XFWM_TABWIN_NAME "xfwm-tabwin"
+
+static const gchar *xfwm_tabwin_default_css =
+"#" XFWM_TABWIN_NAME " {"
+" padding: 4px;"
+" border-radius: 10px;"
+" border: 1px solid @theme_selected_bg_color;"
+" background-color: @theme_bg_color;"
+"}";
+
static void tabwin_widget_class_init (TabwinWidgetClass *klass);
static GType
@@ -97,143 +91,90 @@ tabwin_widget_get_type (void)
NULL,
};
- type = g_type_register_static (GTK_TYPE_WINDOW, "Xfwm4TabwinWidget", &info, 0);
+ type = g_type_register_static (GTK_TYPE_WINDOW, "XfwmTabwinWidget", &info, 0);
}
return type;
}
-static GdkColor *
-get_color (GtkWidget *win, GtkStateType state_type)
-{
- GtkStyle *style;
-
- g_return_val_if_fail (win != NULL, NULL);
- g_return_val_if_fail (GTK_IS_WIDGET (win), NULL);
- g_return_val_if_fail (gtk_widget_get_realized (win), NULL);
-
- style = gtk_rc_get_style (win);
- if (!style)
- {
- style = gtk_widget_get_style (win);
- }
- if (!style)
- {
- style = gtk_widget_get_default_style ();
- }
-
- return (&style->bg[state_type]);
-}
-
static gboolean
-tabwin_expose (GtkWidget *tabwin_widget, GdkEventExpose *event, gpointer data)
+tabwin_draw (GtkWidget *tabwin_widget, cairo_t *cr, gpointer data)
{
- GdkScreen *screen;
- cairo_t *cr;
- GdkColor *bg_normal = get_color (tabwin_widget, GTK_STATE_NORMAL);
- GdkColor *bg_selected = get_color (tabwin_widget, GTK_STATE_SELECTED);
- gint border_width = WIN_BORDER_WIDTH;
- gdouble border_alpha = WIN_BORDER_ALPHA;
- gdouble alpha = WIN_ALPHA;
- gint border_radius = WIN_BORDER_RADIUS;
- gdouble degrees = G_PI / 180.0;
- GtkAllocation allocation;
- gdouble width;
- gdouble height;
+ GtkAllocation allocation;
+ GtkStyleContext *ctx;
+ GdkScreen *screen;
+ GdkRGBA *bg_color = NULL;
+ GdkRGBA *border_color = NULL;
+ GtkBorder border = {0, };
gtk_widget_get_allocation (tabwin_widget, &allocation);
- width = allocation.width;
- height = allocation.height;
-
- screen = gtk_widget_get_screen (GTK_WIDGET(tabwin_widget));
- cr = gdk_cairo_create (gtk_widget_get_window (tabwin_widget));
- if (G_UNLIKELY (cr == NULL))
- return FALSE;
-
- gtk_widget_style_get (GTK_WIDGET (tabwin_widget),
- "border-width", &border_width,
- "border-alpha", &border_alpha,
- "alpha", &alpha,
- "border-radius", &border_radius,
- NULL);
- cairo_set_line_width (cr, border_width);
+ ctx = gtk_widget_get_style_context (tabwin_widget);
+ screen = gtk_widget_get_screen (tabwin_widget);
if (gdk_screen_is_composited (screen))
{
- cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR);
- gdk_cairo_region (cr, event->region);
- cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 0.0);
- cairo_fill_preserve (cr);
- cairo_clip (cr);
- cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
-
- /* Draw a filled rounded rectangle with an outline */
- cairo_arc (cr, width - border_radius - 0.5,
- border_radius + 0.5,
- border_radius,
- -90 * degrees,
- 0 * degrees);
- cairo_arc (cr, width - border_radius - 0.5,
- height - border_radius - 0.5,
- border_radius,
- 0 * degrees,
- 90 * degrees);
- cairo_arc (cr, border_radius + 0.5,
- height - border_radius - 0.5,
- border_radius,
- 90 * degrees,
- 180 * degrees);
- cairo_arc (cr, border_radius + 0.5,
- border_radius + 0.5,
- border_radius,
- 180 * degrees,
- 270 * degrees);
- cairo_close_path(cr);
- cairo_set_source_rgba (cr, bg_normal->red / 65535.0,
- bg_normal->green / 65535.0,
- bg_normal->blue / 65535.0,
- alpha);
- cairo_fill_preserve (cr);
- cairo_set_source_rgba (cr, bg_selected->red / 65535.0,
- bg_selected->green / 65535.0,
- bg_selected->blue / 65535.0,
- border_alpha);
- cairo_stroke (cr);
+ gtk_render_background (ctx, cr, 0, 0, allocation.width, allocation.height);
+ gtk_render_frame (ctx, cr, 0, 0, allocation.width, allocation.height);
}
else
{
- cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
- cairo_rectangle (cr, 0, 0, width, height);
- gdk_cairo_set_source_color (cr, bg_normal);
- cairo_fill_preserve (cr);
- gdk_cairo_set_source_color (cr, bg_selected);
- cairo_stroke (cr);
+ gtk_style_context_get (ctx, GTK_STATE_FLAG_NORMAL,
+ GTK_STYLE_PROPERTY_BACKGROUND_COLOR, &bg_color,
+ GTK_STYLE_PROPERTY_BORDER_COLOR, &border_color,
+ NULL);
+ gtk_style_context_get_border (ctx, GTK_STATE_FLAG_NORMAL, &border);
+
+ if (border_color != NULL)
+ {
+ border_color->alpha = 1;
+ cairo_rectangle (cr, 0, 0, allocation.width, allocation.height);
+ gdk_cairo_set_source_rgba (cr, border_color);
+ cairo_fill (cr);
+ gdk_rgba_free (border_color);
+ }
+
+ if (bg_color != NULL)
+ {
+ bg_color->alpha = 1;
+ cairo_rectangle (cr, border.left, border.top,
+ allocation.width - border.left - border.right,
+ allocation.height - border.top - border.bottom);
+ gdk_cairo_set_source_rgba (cr, bg_color);
+ cairo_fill (cr);
+ gdk_rgba_free (bg_color);
+ }
}
- cairo_destroy (cr);
return FALSE;
}
-static gboolean
-paint_selected (GtkWidget *w, GdkEventExpose *event, gpointer user_data)
+static void
+apply_default_theme (TabwinWidget *tabwin_widget)
{
- TabwinWidget *tabwin_widget = user_data;
+ GtkSettings *settings;
+ gchar *theme;
+ GtkCssProvider *provider;
+ gchar *css;
- g_return_val_if_fail (GTK_IS_WIDGET(w), FALSE);
- TRACE ("entering paint_selected");
+ settings = gtk_settings_get_default ();
- if (w == tabwin_widget->hovered)
- {
- gtk_widget_set_state (w, GTK_STATE_ACTIVE);
- }
- else
- {
- gtk_widget_set_state (w, GTK_STATE_SELECTED);
- }
+ g_object_get (settings, "gtk-theme-name", &theme, NULL);
+ g_return_if_fail (theme != NULL);
- gtk_button_set_relief (GTK_BUTTON (w), GTK_RELIEF_NORMAL);
+ provider = gtk_css_provider_get_named (theme, NULL);
+ g_return_if_fail (provider != NULL);
- return FALSE;
+ css = gtk_css_provider_to_string (provider);
+ if (g_strrstr (css, "#" XFWM_TABWIN_NAME) == NULL)
+ {
+ /* apply default css style */
+ provider = gtk_css_provider_new ();
+ gtk_css_provider_load_from_data (provider, xfwm_tabwin_default_css, -1, NULL);
+ gtk_style_context_add_provider (gtk_widget_get_style_context (GTK_WIDGET (tabwin_widget)),
+ GTK_STYLE_PROVIDER (provider),
+ GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
+ g_object_unref (provider);
+ }
}
/* Efficiency is definitely *not* the goal here! */
@@ -297,16 +238,12 @@ tabwinSetSelected (TabwinWidget *tabwin_widget, GtkWidget *w, GtkWidget *l)
g_return_if_fail (GTK_IS_WIDGET(w));
TRACE ("entering tabwinSetSelected");
- if (tabwin_widget->selected && tabwin_widget->selected_callback)
+ if (tabwin_widget->selected)
{
- g_signal_handler_disconnect (tabwin_widget->selected, tabwin_widget->selected_callback);
+ gtk_widget_unset_state_flags (tabwin_widget->selected, GTK_STATE_FLAG_ACTIVE);
}
tabwin_widget->selected = w;
- tabwin_widget->selected_callback = g_signal_connect (G_OBJECT (tabwin_widget->selected),
- "expose-event",
- G_CALLBACK (paint_selected),
- tabwin_widget);
-
+ gtk_widget_set_state_flags (w, GTK_STATE_FLAG_ACTIVE, FALSE);
c = g_object_get_data (G_OBJECT (tabwin_widget->selected), "client-ptr-val");
if (c != NULL)
@@ -340,7 +277,6 @@ tabwinSelectWidget (Tabwin *tabwin)
for (widgets = tabwin_widget->widgets; widgets; widgets = g_list_next (widgets))
{
window_button = GTK_WIDGET (widgets->data);
- gtk_button_set_relief (GTK_BUTTON (window_button), GTK_RELIEF_NONE);
buttonbox = GTK_WIDGET (gtk_container_get_children (GTK_CONTAINER (window_button))[0].data );
buttonlabel = GTK_WIDGET (g_list_nth_data (gtk_container_get_children (GTK_CONTAINER(buttonbox)), 1) );
gtk_label_set_text (GTK_LABEL (buttonlabel), "");
@@ -365,23 +301,18 @@ tabwinSelectWidget (Tabwin *tabwin)
}
static GtkWidget *
-createWindowIcon (GdkPixbuf *icon_pixbuf)
+createWindowIcon (GdkScreen *screen, GdkPixbuf *icon_pixbuf, gint size)
{
- GtkWidget *icon;
+ GtkIconTheme *icon_theme;
TRACE ("entering createWindowIcon");
- icon = gtk_image_new ();
- if (icon_pixbuf)
+ if (icon_pixbuf == NULL)
{
- gtk_image_set_from_pixbuf (GTK_IMAGE (icon), icon_pixbuf);
+ icon_theme = gtk_icon_theme_get_for_screen (screen);
+ icon_pixbuf = gtk_icon_theme_load_icon (icon_theme, "xfwm4-default", size, 0, NULL);
}
- else
- {
- gtk_image_set_from_stock (GTK_IMAGE (icon), "gtk-missing-image", GTK_ICON_SIZE_DIALOG);
- }
-
- return icon;
+ return gtk_image_new_from_pixbuf (icon_pixbuf);
}
static int
@@ -435,11 +366,6 @@ cb_window_button_enter (GtkWidget *widget, GdkEvent *event, gpointer user_data)
* select it */
if (c != NULL)
{
- if (gtk_widget_is_focus (widget))
- {
- gtk_widget_set_state (widget, GTK_STATE_ACTIVE);
- }
-
/* we don't update the labels on mouse over for this mode */
if (c->screen_info->params->cycle_tabwin_mode == OVERFLOW_COLUMN_GRID)
{
@@ -472,7 +398,6 @@ cb_window_button_leave (GtkWidget *widget, GdkEvent *event, gpointer user_data)
/* don't do anything if we have the focus */
if (gtk_widget_is_focus (widget))
{
- gtk_widget_set_state (widget, GTK_STATE_SELECTED);
return FALSE;
}
@@ -525,7 +450,11 @@ createWindowlist (ScreenInfo *screen_info, TabwinWidget *tabwin_widget)
tabwin_widget->widgets = NULL;
size_request = tabwin->icon_size + tabwin->label_height + 2 * WIN_ICON_BORDER;
- windowlist = gtk_table_new (tabwin->grid_rows, tabwin->grid_cols, FALSE);
+ windowlist = gtk_grid_new ();
+ gtk_grid_set_row_homogeneous (GTK_GRID (windowlist), TRUE);
+ gtk_grid_set_row_spacing (GTK_GRID (windowlist), 4);
+ gtk_grid_set_column_homogeneous (GTK_GRID (windowlist), TRUE);
+ gtk_grid_set_column_spacing (GTK_GRID (windowlist), 4);
/* pack the client icons */
icon_list = tabwin->icon_list;
@@ -545,15 +474,17 @@ createWindowlist (ScreenInfo *screen_info, TabwinWidget *tabwin_widget)
G_CALLBACK (cb_window_button_leave), tabwin_widget);
gtk_widget_add_events (window_button, GDK_ENTER_NOTIFY_MASK);
- icon = createWindowIcon (icon_pixbuf);
+ icon = createWindowIcon (screen_info->gscr, icon_pixbuf, tabwin->icon_size);
if (screen_info->params->cycle_tabwin_mode == STANDARD_ICON_GRID)
{
gtk_widget_set_size_request (GTK_WIDGET (window_button), size_request, size_request);
- buttonbox = gtk_vbox_new (FALSE, 0);
+ buttonbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
buttonlabel = gtk_label_new ("");
- gtk_misc_set_alignment (GTK_MISC (buttonlabel), 0.5, 1.0);
+ gtk_label_set_xalign (GTK_LABEL (buttonlabel), 0.5);
+ gtk_label_set_yalign (GTK_LABEL (buttonlabel), 1.0);
- gtk_misc_set_alignment (GTK_MISC (icon), 0.5, 1.0);
+ gtk_widget_set_halign (icon, GTK_ALIGN_CENTER);
+ gtk_widget_set_valign (icon, GTK_ALIGN_END);
gtk_box_pack_start (GTK_BOX (buttonbox), icon, TRUE, TRUE, 0);
}
else
@@ -570,11 +501,13 @@ createWindowlist (ScreenInfo *screen_info, TabwinWidget *tabwin_widget)
gtk_widget_set_size_request (GTK_WIDGET (window_button),
label_width, tabwin->icon_size + 8);
}
- buttonbox = gtk_hbox_new (FALSE, 6);
+ buttonbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
buttonlabel = gtk_label_new (c->name);
- gtk_misc_set_alignment (GTK_MISC (buttonlabel), 0, 0.5);
+ gtk_label_set_xalign (GTK_LABEL (buttonlabel), 0);
+ gtk_label_set_yalign (GTK_LABEL (buttonlabel), 0.5);
- gtk_misc_set_alignment (GTK_MISC (icon), 0.5, 0.5);
+ gtk_widget_set_halign (icon, GTK_ALIGN_CENTER);
+ gtk_widget_set_valign (icon, GTK_ALIGN_CENTER);
gtk_box_pack_start (GTK_BOX (buttonbox), icon, FALSE, FALSE, 0);
}
gtk_container_add (GTK_CONTAINER (window_button), buttonbox);
@@ -585,17 +518,15 @@ createWindowlist (ScreenInfo *screen_info, TabwinWidget *tabwin_widget)
if (screen_info->params->cycle_tabwin_mode == STANDARD_ICON_GRID)
{
- gtk_table_attach (GTK_TABLE (windowlist), GTK_WIDGET (window_button),
- packpos % tabwin->grid_cols, packpos % tabwin->grid_cols + 1,
- packpos / tabwin->grid_cols, packpos / tabwin->grid_cols + 1,
- GTK_FILL, GTK_FILL, 2, 2);
+ gtk_grid_attach (GTK_GRID (windowlist), GTK_WIDGET (window_button),
+ packpos % tabwin->grid_cols, packpos / tabwin->grid_cols,
+ 1, 1);
}
else
{
- gtk_table_attach (GTK_TABLE (windowlist), GTK_WIDGET (window_button),
- packpos / tabwin->grid_rows, packpos / tabwin->grid_rows + 1,
- packpos % tabwin->grid_rows, packpos % tabwin->grid_rows + 1,
- GTK_FILL, GTK_FILL, 2, 2);
+ gtk_grid_attach (GTK_GRID (windowlist), GTK_WIDGET (window_button),
+ packpos / tabwin->grid_rows, packpos % tabwin->grid_rows,
+ 1, 1);
}
tabwin_widget->widgets = g_list_append (tabwin_widget->widgets, window_button);
@@ -666,34 +597,6 @@ tabwin_widget_class_init (TabwinWidgetClass *klass)
16, 48,
LISTVIEW_WIN_ICON_SIZE,
G_PARAM_READABLE));
- gtk_widget_class_install_style_property (widget_class,
- g_param_spec_int ("border-width",
- "border width",
- "the width of the colored border",
- 0, 8,
- WIN_BORDER_WIDTH,
- G_PARAM_READABLE));
- gtk_widget_class_install_style_property (widget_class,
- g_param_spec_int ("border-radius",
- "border radius",
- "the border radius of the window",
- 0, 20,
- WIN_BORDER_RADIUS,
- G_PARAM_READABLE));
- gtk_widget_class_install_style_property (widget_class,
- g_param_spec_double ("border-alpha",
- "border alpha",
- "the alpha of the colored border",
- 0.0, 1.0,
- WIN_BORDER_ALPHA,
- G_PARAM_READABLE));
- gtk_widget_class_install_style_property (widget_class,
- g_param_spec_double ("alpha",
- "alpha",
- "the alpha of the window",
- 0.0, 1.0,
- WIN_ALPHA,
- G_PARAM_READABLE));
}
static void
@@ -817,10 +720,13 @@ tabwinCreateWidget (Tabwin *tabwin, ScreenInfo *screen_info, gint monitor_num)
{
TabwinWidget *tabwin_widget;
GdkScreen *screen;
+ GdkVisual *visual;
+ GtkStyleContext *ctx;
GtkWidget *vbox;
GtkWidget *windowlist;
GdkRectangle monitor;
- gint border_radius = WIN_BORDER_RADIUS;
+ gint border_radius = 0;
+ GtkBorder border, padding;
TRACE ("entering tabwinCreateWidget for monitor %i", monitor_num);
@@ -834,14 +740,17 @@ tabwinCreateWidget (Tabwin *tabwin, ScreenInfo *screen_info, gint monitor_num)
tabwin_widget->height = -1;
gtk_window_set_screen (GTK_WINDOW (tabwin_widget), screen_info->gscr);
- gtk_widget_set_name (GTK_WIDGET (tabwin_widget), "xfwm4-tabwin");
+ gtk_widget_set_name (GTK_WIDGET (tabwin_widget), XFWM_TABWIN_NAME);
+ apply_default_theme (tabwin_widget);
- /* Check for compositing and set colormap for it */
+ /* Check for compositing and set visual for it */
screen = gtk_widget_get_screen (GTK_WIDGET (tabwin_widget));
- if(gdk_screen_is_composited (screen)) {
- GdkColormap *cmap = gdk_screen_get_rgba_colormap (screen);
- if(cmap)
- gtk_widget_set_colormap (GTK_WIDGET (tabwin_widget), cmap);
+ if (gdk_screen_is_composited (screen)) {
+ visual = gdk_screen_get_rgba_visual (screen);
+ if (visual)
+ {
+ gtk_widget_set_visual (GTK_WIDGET (tabwin_widget), visual);
+ }
}
gtk_widget_set_app_paintable (GTK_WIDGET (tabwin_widget), TRUE);
gtk_widget_realize (GTK_WIDGET (tabwin_widget));
@@ -850,14 +759,22 @@ tabwinCreateWidget (Tabwin *tabwin, ScreenInfo *screen_info, gint monitor_num)
{
computeTabwinData (screen_info, tabwin_widget);
}
- gtk_widget_style_get (GTK_WIDGET(tabwin_widget), "border-radius", &border_radius, NULL);
- gtk_container_set_border_width (GTK_CONTAINER (tabwin_widget), border_radius + 4);
+ ctx = gtk_widget_get_style_context (GTK_WIDGET (tabwin_widget));
+ gtk_style_context_get (ctx, GTK_STATE_FLAG_NORMAL,
+ GTK_STYLE_PROPERTY_BORDER_RADIUS, &border_radius,
+ NULL);
+ gtk_style_context_get_border (ctx, GTK_STATE_FLAG_NORMAL, &border);
+ gtk_style_context_get_padding (ctx, GTK_STATE_FLAG_NORMAL, &padding);
+ gtk_container_set_border_width (GTK_CONTAINER (tabwin_widget),
+ border_radius +
+ MAX (border.left, MAX (border.top, (MAX (border.right, border.bottom)))) +
+ MAX (padding.left, MAX (padding.top, (MAX (padding.right, padding.bottom)))));
gtk_window_set_position (GTK_WINDOW (tabwin_widget), GTK_WIN_POS_NONE);
xfwm_get_monitor_geometry (screen_info->gscr, tabwin_widget->monitor_num, &monitor);
gtk_window_move (GTK_WINDOW (tabwin_widget), monitor.x + monitor.width / 2,
monitor.y + monitor.height / 2);
- vbox = gtk_vbox_new (FALSE, 3);
+ vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 3);
gtk_container_add (GTK_CONTAINER (tabwin_widget), vbox);
if (screen_info->params->cycle_tabwin_mode == STANDARD_ICON_GRID)
@@ -877,8 +794,8 @@ tabwinCreateWidget (Tabwin *tabwin, ScreenInfo *screen_info, gint monitor_num)
G_CALLBACK (tabwinConfigure),
(gpointer) tabwin_widget);
- g_signal_connect (tabwin_widget, "expose-event",
- G_CALLBACK (tabwin_expose),
+ g_signal_connect (tabwin_widget, "draw",
+ G_CALLBACK (tabwin_draw),
(gpointer) tabwin_widget);
gtk_widget_show_all (GTK_WIDGET (tabwin_widget));
@@ -901,7 +818,6 @@ tabwinChange2Selected (Tabwin *tabwin, GList *selected)
for (widgets = tabwin_widget->widgets; widgets; widgets = g_list_next (widgets))
{
window_button = GTK_WIDGET (widgets->data);
- gtk_button_set_relief (GTK_BUTTON (window_button), GTK_RELIEF_NONE);
buttonbox = GTK_WIDGET (gtk_container_get_children (GTK_CONTAINER (window_button))[0].data );
buttonlabel = GTK_WIDGET (g_list_nth_data (gtk_container_get_children (GTK_CONTAINER (buttonbox)), 1) );
@@ -923,14 +839,6 @@ tabwinChange2Selected (Tabwin *tabwin, GList *selected)
tabwinSetSelected (tabwin_widget, window_button, buttonlabel);
gtk_widget_queue_draw (GTK_WIDGET (tabwin_widget));
}
- else if (window_button == tabwin_widget->hovered)
- {
- gtk_widget_set_state (window_button, GTK_STATE_PRELIGHT);
- }
- else
- {
- gtk_widget_set_state (window_button, GTK_STATE_NORMAL);
- }
}
}
}
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the Xfce4-commits
mailing list