static void make_eye(ModeInfo * mi, Drawable d, Eyes * e, int n, int full) { EyeScrInfo *ep = &eye_info[MI_SCREEN(mi)]; Display *display = MI_DISPLAY(mi); GC gc = ep->eyeGC; XRectangle *bbox = &e->bbox; XRectangle tmp1, tmp2; if (full) { /* draw the outer (eyelid) oval */ XSetForeground(display, gc, e->eyelid_pixel); TFillArc(display, d, gc, &e->transform, EYE_X(n) - EYE_HWIDTH - EYE_THICK, EYE_Y(n) - EYE_HHEIGHT - EYE_THICK, EYE_WIDTH + EYE_THICK * 2.0, EYE_HEIGHT + EYE_THICK * 2.0, 90 * 64, 360 * 64, &tmp1); /* draw the inner (eyeball) oval */ XSetForeground(display, gc, e->eyeball_pixel); TFillArc(display, d, gc, &e->transform, EYE_X(n) - EYE_HWIDTH, EYE_Y(n) - EYE_HHEIGHT, EYE_WIDTH, EYE_HEIGHT, 90 * 64, 360 * 64, &tmp2); join_rects(&tmp1, &tmp2, &tmp1); /* draw the pupil on top of the eyeball oval */ XSetForeground(display, gc, e->pupil_pixel); TFillArc(display, d, gc, &e->transform, e->pupil[n].x - BALL_WIDTH / 2.0, e->pupil[n].y - BALL_HEIGHT / 2.0, BALL_WIDTH, BALL_HEIGHT, 90 * 64, 360 * 64, &tmp2); join_rects(&tmp1, &tmp2, bbox); } else { /* undraw the pupil */ XSetForeground(display, gc, e->eyeball_pixel); TFillArc(display, d, gc, &e->transform, e->last_pupil[n].x - BALL_WIDTH / 2.0, e->last_pupil[n].y - BALL_HEIGHT / 2.0, BALL_WIDTH, BALL_HEIGHT, 90 * 64, 360 * 64, &tmp1); /* draw the pupil on top of the eyeball oval */ XSetForeground(display, gc, e->pupil_pixel); TFillArc(display, d, gc, &e->transform, e->pupil[n].x - BALL_WIDTH / 2.0, e->pupil[n].y - BALL_HEIGHT / 2.0, BALL_WIDTH, BALL_HEIGHT, 90 * 64, 360 * 64, &tmp2); join_rects(&tmp1, &tmp2, bbox); } }
void paint_jewel (ClockWidget w, Drawable d, GC gc) { if (JEWEL_SIZE(w) > 0.0) { TFillArc (XtDisplay (w), d, gc, &w->clock.t, JEWEL_X(w) - JEWEL_SIZE(w) / 2.0, JEWEL_Y(w) - JEWEL_SIZE(w) / 2.0, JEWEL_SIZE(w), JEWEL_SIZE(w), 0, 360 * 64); } }
static void eyeBall ( EyesWidget w, GC gc, int num) { Display *dpy = XtDisplay(w); Window win = XtWindow(w); TFillArc (dpy, win, gc, &w->eyes.t, w->eyes.pupil[num].x - BALL_WIDTH / 2.0, w->eyes.pupil[num].y - BALL_HEIGHT / 2.0, BALL_WIDTH, BALL_HEIGHT, 90 * 64, 360 * 64); }
static void eyeLiner ( EyesWidget w, Drawable d, GC outgc, GC centergc, int num) { Display *dpy = XtDisplay(w); TFillArc (dpy, d, outgc, &w->eyes.t, EYE_X(num) - EYE_HWIDTH - EYE_THICK, EYE_Y(num) - EYE_HHEIGHT - EYE_THICK, EYE_WIDTH + EYE_THICK * 2.0, EYE_HEIGHT + EYE_THICK * 2.0, 90 * 64, 360 * 64); if (centergc) { TFillArc (dpy, d, centergc, &w->eyes.t, EYE_X(num) - EYE_HWIDTH, EYE_Y(num) - EYE_HHEIGHT, EYE_WIDTH, EYE_HEIGHT, 90 * 64, 360 * 64); } }
static void Resize (Widget widget) { ClockWidget w = (ClockWidget) widget; XGCValues xgcv; Widget parent; XWindowChanges xwc; int face_width, face_height; int x, y; Pixmap shape_mask; if (!XtIsRealized((Widget) w)) return; /* * compute desired border size */ SetTransform (&w->clock.maskt, 0, w->core.width, w->core.height, 0, -1.0, 1.0, -1.0, 1.0); face_width = abs (Xwidth (BORDER_SIZE(w), BORDER_SIZE(w), &w->clock.maskt)); face_height = abs (Xheight (BORDER_SIZE(w), BORDER_SIZE(w), &w->clock.maskt)); /* * shape the windows and borders */ if (w->clock.shape_window) { SetTransform (&w->clock.t, face_width, w->core.width - face_width, w->core.height - face_height, face_height, -WINDOW_WIDTH(w)/2, WINDOW_WIDTH(w)/2, -WINDOW_HEIGHT(w)/2, WINDOW_HEIGHT(w)/2); /* * allocate a pixmap to draw shapes in */ if (w->clock.shape_mask && (w->clock.shape_width != w->core.width || w->clock.shape_height != w->core.height)) { XFreePixmap (XtDisplay (w), w->clock.shape_mask); w->clock.shape_mask = None; } if (!w->clock.shape_mask) { w->clock.shape_mask = XCreatePixmap (XtDisplay (w), XtWindow (w), w->core.width, w->core.height, 1); } shape_mask = w->clock.shape_mask; if (!w->clock.shapeGC) w->clock.shapeGC = XCreateGC (XtDisplay (w), shape_mask, 0, &xgcv); /* erase the pixmap */ XSetForeground (XtDisplay (w), w->clock.shapeGC, 0); XFillRectangle (XtDisplay (w), shape_mask, w->clock.shapeGC, 0, 0, w->core.width, w->core.height); XSetForeground (XtDisplay (w), w->clock.shapeGC, 1); /* * draw the bounding shape. Doing this first * eliminates extra exposure events. */ if (w->clock.border_size > 0.0 || !w->clock.transparent) { TFillArc (XtDisplay (w), shape_mask, w->clock.shapeGC, &w->clock.maskt, -1.0, -1.0, 2.0, 2.0, 0, 360 * 64); } if (w->clock.transparent) { if (w->clock.border_size > 0.0) { XSetForeground (XtDisplay (w), w->clock.shapeGC, 0); TFillArc (XtDisplay (w), shape_mask, w->clock.shapeGC, &w->clock.t, -WINDOW_WIDTH(w)/2, -WINDOW_HEIGHT(w)/2, WINDOW_WIDTH(w), WINDOW_HEIGHT(w), 0, 360 * 64); XSetForeground (XtDisplay (w), w->clock.shapeGC, 1); } paint_jewel (w, shape_mask, w->clock.shapeGC); paint_hands (w, shape_mask, w->clock.shapeGC, w->clock.shapeGC); } /* * Find the highest enclosing widget and shape it */ x = 0; y = 0; for (parent = (Widget) w; XtParent (parent); parent = XtParent (parent)) { x = x + parent->core.x + parent->core.border_width; y = y + parent->core.y + parent->core.border_width; } XShapeCombineMask (XtDisplay (parent), XtWindow (parent), ShapeBounding, x, y, shape_mask, ShapeSet); /* erase the pixmap */ XSetForeground (XtDisplay (w), w->clock.shapeGC, 0); XFillRectangle (XtDisplay (w), shape_mask, w->clock.shapeGC, 0, 0, w->core.width, w->core.height); XSetForeground (XtDisplay (w), w->clock.shapeGC, 1); /* * draw the clip shape */ if (w->clock.transparent) { paint_jewel (w, shape_mask, w->clock.shapeGC); paint_hands (w, shape_mask, w->clock.shapeGC, w->clock.shapeGC); } else { TFillArc (XtDisplay (w), shape_mask, w->clock.shapeGC, &w->clock.t, -WINDOW_WIDTH(w)/2, -WINDOW_HEIGHT(w)/2, WINDOW_WIDTH(w), WINDOW_HEIGHT(w), 0, 360 * 64); } XShapeCombineMask (XtDisplay (w), XtWindow (w), ShapeClip, 0, 0, shape_mask, ShapeSet); } else { /* * reconfigure the widget to split the availible * space between the window and the border */ if (face_width > face_height) xwc.border_width = face_height; else xwc.border_width = face_width; xwc.width = w->core.width - xwc.border_width * 2; xwc.height = w->core.height - xwc.border_width * 2; XConfigureWindow (XtDisplay (w), XtWindow (w), CWWidth|CWHeight|CWBorderWidth, &xwc); SetTransform (&w->clock.t, 0, xwc.width, xwc.height, 0, -WINDOW_WIDTH(w)/2, WINDOW_WIDTH(w)/2, -WINDOW_HEIGHT(w)/2, WINDOW_HEIGHT(w)/2); } }