void set_panel_background(Panel *p) { if (p->area.pix) XFreePixmap (server.dsp, p->area.pix); p->area.pix = XCreatePixmap (server.dsp, server.root_win, p->area.width, p->area.height, server.depth); int xoff=0, yoff=0; if (panel_horizontal && panel_position & BOTTOM) yoff = p->area.height-p->hidden_height; else if (!panel_horizontal && panel_position & RIGHT) xoff = p->area.width-p->hidden_width; if (server.real_transparency) { clear_pixmap(p->area.pix, 0, 0, p->area.width, p->area.height); } else { get_root_pixmap(); // copy background (server.root_pmap) in panel.area.pix Window dummy; int x, y; XTranslateCoordinates(server.dsp, p->main_win, server.root_win, 0, 0, &x, &y, &dummy); if (panel_autohide && p->is_hidden) { x -= xoff; y -= yoff; } XSetTSOrigin(server.dsp, server.gc, -x, -y); XFillRectangle(server.dsp, p->area.pix, server.gc, 0, 0, p->area.width, p->area.height); } // draw background panel cairo_surface_t *cs; cairo_t *c; cs = cairo_xlib_surface_create (server.dsp, p->area.pix, server.visual, p->area.width, p->area.height); c = cairo_create (cs); draw_background(&p->area, c); cairo_destroy (c); cairo_surface_destroy (cs); if (panel_autohide) { if (p->hidden_pixmap) XFreePixmap(server.dsp, p->hidden_pixmap); p->hidden_pixmap = XCreatePixmap(server.dsp, server.root_win, p->hidden_width, p->hidden_height, server.depth); XCopyArea(server.dsp, p->area.pix, p->hidden_pixmap, server.gc, xoff, yoff, p->hidden_width, p->hidden_height, 0, 0); } // redraw panel's object GSList *l0; Area *a; for (l0 = p->area.list; l0 ; l0 = l0->next) { a = l0->data; set_redraw(a); } // reset task 'state_pix' int i; Taskbar *tskbar; for (i=0 ; i < p->nb_desktop ; i++) { tskbar = &p->taskbar[i]; for (l0 = tskbar->area.list; l0 ; l0 = l0->next) { set_task_redraw((Task *)l0->data); } } }
void panel_clear_background(void *obj) { Panel *p = obj; clear_pixmap(p->area.pix, 0, 0, p->area.width, p->area.height); if (!server.real_transparency) { get_root_pixmap(); // copy background (server.root_pmap) in panel.area.pix Window dummy; int x, y; XTranslateCoordinates(server.display, p->main_win, server.root_win, 0, 0, &x, &y, &dummy); if (panel_autohide && p->is_hidden) { int xoff = 0, yoff = 0; if (panel_horizontal && panel_position & BOTTOM) yoff = p->area.height - p->hidden_height; else if (!panel_horizontal && panel_position & RIGHT) xoff = p->area.width - p->hidden_width; x -= xoff; y -= yoff; } XSetTSOrigin(server.display, server.gc, -x, -y); XFillRectangle(server.display, p->area.pix, server.gc, 0, 0, p->area.width, p->area.height); } }
void update_root_pixmap(Atom prop) { static Atom a_rootpix = None; int w = 0; int h = 0; XID dummy; Pixmap pix; if (a_rootpix == None) { a_rootpix = XInternAtom(dpy,"_XROOTPMAP_ID", False); } XSync(dpy, False); if (prop != 0) { pix = get_root_pixmap(prop); if (pix && !XGetGeometry( dpy, pix, &dummy, (int *)&dummy, (int *)&dummy, (unsigned int *)&w, (unsigned int *)&h, (unsigned int *)&dummy, (unsigned int *)&dummy)) { pix = None; } } else { pix = get_root_pixmap(a_rootpix); if (pix && !XGetGeometry( dpy, pix, &dummy, (int *)&dummy, (int *)&dummy, (unsigned int *)&w, (unsigned int *)&h, (unsigned int *)&dummy, (unsigned int *)&dummy)) { pix = None; } } root_pic.pixmap = pix; root_pic.width = w; root_pic.height = h; #if 0 fprintf(stderr,"Get New Root Pixmap: 0x%lx %i,%i\n", root_pic.pixmap, w, h); #endif }