static Bool ChangeSensitive(Widget w) { CommandWidget cbw = (CommandWidget)w; if (XtIsRealized(w)) { if (XtIsSensitive(w)) { if (w->core.border_pixmap != XtUnspecifiedPixmap) XSetWindowBorderPixmap(XtDisplay(w), XtWindow(w), w->core.border_pixmap); else XSetWindowBorder(XtDisplay(w), XtWindow(w), w->core.border_pixel); } else { if (cbw->simple.insensitive_border == None) cbw->simple.insensitive_border = XmuCreateStippledPixmap(XtScreen(w), w->core.border_pixel, cbw->command.set ? cbw->label.foreground : w->core.background_pixel, w->core.depth); XSetWindowBorderPixmap(XtDisplay(w), XtWindow(w), cbw->simple.insensitive_border); } } return (False); }
static Bool ChangeSensitive(Widget w) { if (XtIsRealized(w)) { if (XtIsSensitive(w)) if (w->core.border_pixmap != XtUnspecifiedPixmap) XSetWindowBorderPixmap(XtDisplay(w), XtWindow(w), w->core.border_pixmap); else XSetWindowBorder(XtDisplay(w), XtWindow(w), w->core.border_pixel); else { if (((SimpleWidget)w)->simple.insensitive_border == None) ((SimpleWidget)w)->simple.insensitive_border = XmuCreateStippledPixmap(XtScreen(w), w->core.border_pixel, w->core.background_pixel, w->core.depth); XSetWindowBorderPixmap(XtDisplay(w), XtWindow(w), ((SimpleWidget)w)->simple.insensitive_border); } } return (False); }
/** * \brief emulates a double window border through the border pixmap mechanism */ void set_window_double_border(Display *dpy, Window win, int ibw, unsigned long inner_color, unsigned long outer_color) { XWindowAttributes wa; if (!XGetWindowAttributes(dpy, win, &wa)) return; int bw = wa.border_width; if (bw < 2 || ibw >= bw || ibw < 1) return; int width = wa.width; int height = wa.height; unsigned int depth = wa.depth; int full_width = width + 2 * bw; int full_height = height + 2 * bw; // the inner border is represented through the following pattern: // // ██ ██ // ██ ██ // ██ ██ // ██ ██ // ██ ██ // ██ ██ // ██ ██ // ██ ██ // ██ ██ // ██ ██ // ██ ██ // ██████████████████████████ ██ // // ██████████████████████████ ██ XRectangle rectangles[] = { { width, 0, ibw, height + ibw }, { full_width - ibw, 0, ibw, height + ibw }, { 0, height, width + ibw, ibw }, { 0, full_height - ibw, width + ibw, ibw }, { full_width - ibw, full_height - ibw, ibw, ibw } }; Pixmap pix = XCreatePixmap(dpy, win, full_width, full_height, depth); GC gc = XCreateGC(dpy, pix, 0, NULL); /* outer border */ XSetForeground(dpy, gc, outer_color); XFillRectangle(dpy, pix, gc, 0, 0, full_width, full_height); /* inner border */ XSetForeground(dpy, gc, inner_color); XFillRectangles(dpy, pix, gc, rectangles, LENGTH(rectangles)); XSetWindowBorderPixmap(dpy, win, pix); XFreeGC(dpy, gc); XFreePixmap(dpy, pix); }