--- xfdesktop-4.4.1/src/main.c 2008-07-06 21:13:58.000000000 +0200 +++ xfdesktop-4.4.1-tofe/src/main.c 2008-03-03 23:36:10.000000000 +0100 @@ -346,7 +346,27 @@ nscreens = gdk_display_get_n_screens(gdpy); desktops = g_new(GtkWidget *, nscreens); for(i = 0; i < nscreens; i++) { - desktops[i] = xfce_desktop_new(gdk_display_get_screen(gdpy, i)); + GdkScreen *screen = gdk_display_get_screen(gdpy, i); + + if( screen == NULL ) + { + screen = gdk_display_get_default_screen(gdpy); + } + + if (screen != NULL) + { + /* check if we can use ARGB visual for this screen */ + GdkColormap *colormap = gdk_screen_get_rgba_colormap (screen); + if (G_LIKELY (colormap != NULL)) + { + /* use ARGB visual for all windows on this screen, required + * for real transparency with a compositing manager. + */ + gdk_screen_set_default_colormap (screen, colormap); + } + } + + desktops[i] = xfce_desktop_new(screen); gtk_widget_add_events(desktops[i], GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_SCROLL_MASK); g_signal_connect(G_OBJECT(desktops[i]), "scroll-event", --- xfdesktop-4.4.1/src/xfce-backdrop.c 2008-07-06 21:14:17.000000000 +0200 +++ xfdesktop-4.4.1-tofe/src/xfce-backdrop.c 2008-03-09 14:22:17.000000000 +0100 @@ -118,11 +118,14 @@ GdkPixbuf *pix; guint32 rgba; - pix = gdk_pixbuf_new(GDK_COLORSPACE_RGB, FALSE, 8, width, height); + pix = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, width, height); rgba = (((color->red & 0xff00) << 8) | ((color->green & 0xff00)) | ((color->blue & 0xff00) >> 8)) << 8; + if( rgba != 0 ) // if the background is not black, then set alpha to 255 (opaque) + rgba |= 0xff; + gdk_pixbuf_fill(pix, rgba); return pix; --- xfdesktop-4.4.1/src/xfce-desktop.c 2007-01-25 21:53:23.000000000 +0100 +++ xfdesktop-4.4.1-tofe/src/xfce-desktop.c 2008-03-09 14:24:16.000000000 +0100 @@ -60,6 +60,7 @@ #include #include #include +#include #ifdef ENABLE_DESKTOP_ICONS #include "xfdesktop-icon-view.h" @@ -118,6 +119,37 @@ /* private functions */ +static xfce_desktop_set_background(GdkWindow *groot, GdkPixmap *pmap) +{ +#if 0 + gdk_window_set_back_pixmap(groot, pmap, FALSE); +#else + cairo_t *cr = gdk_cairo_create(groot); +#if 1 + cairo_set_source_rgba (cr, 0.0, 1.0, 0.0, 0.0); /* transparent */ + /* draw the background */ + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_paint (cr); +#else + if(XFCE_DESKTOP(desktop)->priv->nbackdrops == 1) + { + XfceBackdrop *backdrop = XFCE_DESKTOP(desktop)->priv->backdrops[0]; + /* create/get the composited backdrop pixmap */ + GdkPixbuf *pix = xfce_backdrop_get_pixbuf(backdrop); + if(pix) + { + gdk_cairo_set_source_pixbuf(cr, pix, 0.0, 0.0); + /* draw the background */ + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_paint (cr); + } + } +#endif + + cairo_destroy(cr); +#endif +} + #ifdef ENABLE_DESKTOP_ICONS static gdouble xfce_desktop_ensure_system_font_size(XfceDesktop *desktop) @@ -298,7 +330,7 @@ gdk_atom_intern("PIXMAP", FALSE), 32, GDK_PROP_MODE_REPLACE, (guchar *)&xid, 1); /* and set the root window's BG pixmap, because aterm is somewhat lame. */ - gdk_window_set_back_pixmap(groot, pmap, FALSE); + xfce_desktop_set_background(groot, pmap); /* there really should be a standard for this crap... */ gdk_error_trap_pop(); @@ -382,8 +414,7 @@ w, h, -1); set_real_root_window_pixmap(desktop->priv->gscreen, desktop->priv->bg_pixmap); - gdk_window_set_back_pixmap(GTK_WIDGET(desktop)->window, - desktop->priv->bg_pixmap, FALSE); + xfce_desktop_set_background(GTK_WIDGET(desktop)->window, desktop->priv->bg_pixmap); /* special case for 1 backdrop to handle xinerama stretching properly. * this is broken if it ever becomes possible to change the number of @@ -536,6 +567,12 @@ desktop->priv->icons_use_system_font = TRUE; #endif + /* Tell GTK+ that we want to draw the windows background ourself. + * If we don't do this then GTK+ will clear the window to the + * opaque theme default color, which isn't what we want. + */ + gtk_widget_set_app_paintable(GTK_WIDGET(desktop), TRUE); + gtk_window_set_type_hint(GTK_WINDOW(desktop), GDK_WINDOW_TYPE_HINT_DESKTOP); gtk_window_set_accept_focus(GTK_WINDOW(desktop), FALSE); } @@ -613,8 +650,8 @@ sw, sh, -1); set_real_root_window_pixmap(desktop->priv->gscreen, desktop->priv->bg_pixmap); - gdk_window_set_back_pixmap(GTK_WIDGET(desktop)->window, - desktop->priv->bg_pixmap, FALSE); + + xfce_desktop_set_background(GTK_WIDGET(desktop)->window, desktop->priv->bg_pixmap); /* doing this here is a little wasteful, but easier */ if(desktop->priv->xinerama_stretch) @@ -666,7 +703,7 @@ gdk_property_delete(groot, gdk_atom_intern("NAUTILUS_DESKTOP_WINDOW_ID", FALSE)); gdk_property_delete(groot, gdk_atom_intern("_XROOTPMAP_ID", FALSE)); gdk_property_delete(groot, gdk_atom_intern("ESETROOT_PMAP_ID", FALSE)); - gdk_window_set_back_pixmap(groot, NULL, FALSE); + xfce_desktop_set_background(groot, NULL); if(desktop->priv->backdrops) { for(i = 0; i < desktop->priv->nbackdrops; i++) { @@ -706,9 +743,26 @@ desktop = XFCE_DESKTOP(w); + cairo_t *cr = gdk_cairo_create(GTK_WIDGET(desktop)->window); + if(XFCE_DESKTOP(desktop)->priv->nbackdrops == 1) + { + XfceBackdrop *backdrop = XFCE_DESKTOP(desktop)->priv->backdrops[0]; + /* create/get the composited backdrop pixmap */ + GdkPixbuf *pix = xfce_backdrop_get_pixbuf(backdrop); + if(pix) + { + gdk_cairo_set_source_pixbuf(cr, pix, 0.0, 0.0); + /* draw the background */ + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_paint (cr); + } + } + cairo_destroy(cr); + +/* gdk_window_clear_area(w->window, evt->area.x, evt->area.y, evt->area.width, evt->area.height); - +*/ children = gtk_container_get_children(GTK_CONTAINER(w)); for(l = children; l; l = l->next) { gtk_container_propagate_expose(GTK_CONTAINER(w), @@ -737,7 +791,7 @@ { XfceDesktop *desktop = XFCE_DESKTOP(w); - gdk_window_set_back_pixmap(w->window, desktop->priv->bg_pixmap, FALSE); + xfce_desktop_set_background(w->window, desktop->priv->bg_pixmap); gtk_widget_queue_draw(w); } --- xfdesktop-4.4.1/src/xfdesktop-icon-view.c 2007-03-11 14:43:58.000000000 +0100 +++ xfdesktop-4.4.1-tofe/src/xfdesktop-icon-view.c 2008-03-09 14:21:55.000000000 +0100 @@ -1536,6 +1536,7 @@ GdkRectangle *area = user_data, extents, dummy; if(!xfdesktop_icon_get_extents(icon, &extents) + || ((area = &extents) == NULL) || gdk_rectangle_intersect(area, &extents, &dummy)) { XfdesktopIconView *icon_view = g_object_get_data(G_OBJECT(icon),