|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T b
Length: 4279 (0x10b7) Types: TextFile Names: »button.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987 └─⟦this⟧ »EUUGD18/X/Xmille/control/button.c«
/* * button.c */ # include <X11/Xlib.h> # include <X11/Xutil.h> # include "control.h" extern Display *dpy; struct button { Button button; int width, height; int x, y; GC gc; long backcolor; int borderwidth; int npoints; XPoint *points; char *text; }; struct perwindow { struct button *b; Window wd; int (*notify)(); int state; }; static XContext assocContext; static XContext perwindowContext; static int nextButton; Button CcreateButton (text, width, gc, font, backcolor, borderwidth) char *text; int width; GC gc; XFontStruct *font; long backcolor; int borderwidth; { char *malloc (); struct button *b; int round, off; int hround; int twidth; int height; if (!assocContext) assocContext = XUniqueContext(); b = (struct button *) malloc (sizeof (struct button)); b->button = nextButton; XSaveContext (dpy, assocContext, nextButton++, (char *) b); height = font->ascent + font->descent; twidth = XTextWidth (font, text, strlen(text)); if (width <= 0) b->width = twidth + font->max_bounds.width * 2; else b->width = width; b->height = height * 2; b->x = b->width / 2 - twidth / 2; b->y = height + font->descent/*/2*/; b->text = text; b->gc = gc; b->backcolor = backcolor; b->borderwidth = borderwidth; b->npoints = 9; b->points = (XPoint *) malloc (sizeof (XPoint) * 9); round = b->height / 8; off = borderwidth; b->points[0].x = round; b->points[0].y = 0; b->points[1].x = (b->width - off) - round; b->points[1].y = 0; b->points[2].x = (b->width - off); b->points[2].y = round; b->points[3].x = (b->width - off); b->points[3].y = (b->height - off) - round; b->points[4].x = (b->width - off) - round; b->points[4].y = (b->height - off); b->points[5].x = round; b->points[5].y = (b->height - off); b->points[6].x = 0; b->points[6].y = (b->height - off) - round; b->points[7].x = 0; b->points[7].y = round; b->points[8].x = round; b->points[8].y = 0; return b->button; } Window CmapButton (parent, x, y, button, notify) Window parent; int x, y; Button button; int (*notify)(); { struct button *b; struct perwindow *p; Window w; if( XFindContext (dpy, assocContext, button, &b) ) return 0; w = XCreateSimpleWindow (dpy, parent, x, y, b->width, b->height, 0, 0, b->backcolor); if (!w) return 0; XMapWindow (dpy, w); if (!perwindowContext) perwindowContext = XUniqueContext(); p = (struct perwindow *) malloc (sizeof (struct perwindow)); XSaveContext (dpy, perwindowContext, w, (char *) p); p->b = b; p->wd = w; p->notify = notify; p->state = 0; buttonOff (w, b, p); return w; } CunmapButton (w) Window w; { struct button *b; struct perwindow *p; if( XFindContext (dpy, perwindowContext, w, &p) ) return 0; XDeleteContext (dpy, perwindowContext, w); free (p); XDestroyWindow (dpy, w); return 1; } CmanageButton (rep) XAnyEvent *rep; { struct perwindow *p; struct button *b; XMotionEvent *me; Window w; w = rep->window; if( XFindContext (dpy, perwindowContext, w, &p) ) return 0; b = p->b; switch (rep->type) { case Expose: if (p->state) buttonOn (w, b, p); else buttonOff (w, b, p); break; case ButtonPress: buttonOn (w, b, p); p->state = 1; break; case ButtonRelease: if (p->state) p->notify (w); p->state = 0; break; case MotionNotify: me = (XMotionEvent *) rep; if (me->x < 0 || me->x > b->width || me->y < 0 || me->y > b->height) if (p->state) { buttonOff (w, b, p); p->state = 0; } break; case LeaveNotify: if (p->state) { buttonOff (w, b, p); p->state = 0; } break; } } CredrawButton (w) Window w; { struct perwindow *p; struct button *b; if( XFindContext (dpy, perwindowContext, w, &p) ) return 0; b = p->b; buttonOff (w, b, p); } static buttonOn (w, b) Window w; struct button *b; { XFillPolygon (dpy, w, b->gc, b->points, b->npoints, Complex, CoordModeOrigin); buttonText (w, b, b->gc); } static buttonOff (w, b) Window w; struct button *b; { XClearArea (dpy, w, 0, 0, b->width, b->height, False); XDrawLines (dpy, w, b->gc, b->points, b->npoints, CoordModeOrigin); buttonText (w, b, b->gc); } static buttonText (w, b, gc) Window w; struct button *b; GC gc; { XDrawImageString (dpy, w, gc, b->x, b->y, b->text, strlen (b->text)); }