static void fb_bg_changed(FbBg *bg) { ENTER; bg->pixmap = fb_bg_get_xrootpmap(bg); if (bg->pixmap != None) { XGCValues gcv; gcv.tile = bg->pixmap; XChangeGC(bg->dpy, bg->gc, GCTile, &gcv); DBG("changed\n"); } RET(); }
static void fb_bg_init (FbBg *bg) { XGCValues gcv; uint mask; ENTER; bg->dpy = GDK_DISPLAY(); bg->xroot = DefaultRootWindow(bg->dpy); bg->id = XInternAtom(bg->dpy, "_XROOTPMAP_ID", False); bg->pixmap = fb_bg_get_xrootpmap(bg); gcv.ts_x_origin = 0; gcv.ts_y_origin = 0; gcv.fill_style = FillTiled; mask = GCTileStipXOrigin | GCTileStipYOrigin | GCFillStyle; if (bg->pixmap != None) { gcv.tile = bg->pixmap; mask |= GCTile ; } bg->gc = XCreateGC (bg->dpy, bg->xroot, mask, &gcv) ; RET(); }
static void desk_draw_bg(pager_priv *pg, desk *d1) { Pixmap xpix; GdkPixmap *gpix; GdkPixbuf *p1, *p2; gint width, height, depth; FbBg *bg = pg->fbbg; GtkWidget *widget = d1->da; ENTER; if (d1->no) { desk *d0 = d1->pg->desks[0]; if (d0->gpix && d0->xpix != None && d0->da->allocation.width == widget->allocation.width && d0->da->allocation.height == widget->allocation.height) { gdk_draw_drawable(d1->gpix, widget->style->fg_gc[GTK_WIDGET_STATE (widget)], d0->gpix,0, 0, 0, 0, widget->allocation.width, widget->allocation.height); d1->xpix = d0->xpix; DBG("copy gpix from d0 to d%d\n", d1->no); RET(); } } xpix = fb_bg_get_xrootpmap(bg); d1->xpix = None; width = widget->allocation.width; height = widget->allocation.height; DBG("w %d h %d\n", width, height); if (width < 3 || height < 3) RET(); // create new pix xpix = fb_bg_get_xrootpmap(bg); if (xpix == None) RET(); depth = gdk_drawable_get_depth(widget->window); gpix = fb_bg_get_xroot_pix_for_area(bg, 0, 0, gdk_screen_width(), gdk_screen_height(), depth); if (!gpix) { ERR("fb_bg_get_xroot_pix_for_area failed\n"); RET(); } p1 = gdk_pixbuf_get_from_drawable(NULL, gpix, NULL, 0, 0, 0, 0, gdk_screen_width(), gdk_screen_height()); if (!p1) { ERR("gdk_pixbuf_get_from_drawable failed\n"); goto err_gpix; } p2 = gdk_pixbuf_scale_simple(p1, width, height, //GDK_INTERP_NEAREST //GDK_INTERP_TILES //GDK_INTERP_BILINEAR GDK_INTERP_HYPER ); if (!p2) { ERR("gdk_pixbuf_scale_simple failed\n"); goto err_p1; } gdk_draw_pixbuf(d1->gpix, widget->style->fg_gc[GTK_WIDGET_STATE (widget)], p2, 0, 0, 0, 0, width, height, GDK_RGB_DITHER_NONE, 0, 0); d1->xpix = xpix; g_object_unref(p2); err_p1: g_object_unref(p1); err_gpix: g_object_unref(gpix); RET(); }