|
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: L T
Length: 9856 (0x2680) Types: TextFile Names: »Label.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─⟦526ad3590⟧ »EUUGD11/gnu-31mar87/X.V10.R4.tar.Z« └─⟦2109abc41⟧ └─⟦this⟧ »./X.V10R4/Toolkit/DECToolkit/src/Label.c«
/* * $Source: /u1/X/DECToolkit/src/RCS/Label.c,v $ * $Header: Label.c,v 1.1 86/12/17 09:02:13 swick Exp $ */ #ifndef lint static char *rcsid_Label_c = "$Header: Label.c,v 1.1 86/12/17 09:02:13 swick Exp $"; #endif lint #ifndef lint static char *sccsid = "@(#)Label.c 1.10 12/11/86"; #endif lint /* * COPYRIGHT 1986 * DIGITAL EQUIPMENT CORPORATION * MAYNARD, MASSACHUSETTS * ALL RIGHTS RESERVED. * * THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE AND * SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION. * DIGITAL MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THIS SOFTWARE FOR * ANY PURPOSE. IT IS SUPPLIED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY. * * IF THE SOFTWARE IS MODIFIED IN A MANNER CREATING DERIVATIVE COPYRIGHT RIGHTS, * APPROPRIATE LEGENDS MAY BE PLACED ON THE DERIVATIVE WORK IN ADDITION TO THAT * SET FORTH ABOVE. * * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, provided * that the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting documentation, * and that the name of Digital Equipment Corporation not be used in advertising * or publicity pertaining to distribution of the software without specific, * written prior permission. */ /* File: Label.c */ #include <X/Xlib.h> #include <strings.h> #include "Toolkit.h" /* Private Definitions */ #define DEFAULT_LABEL "Label " #define DEFAULT_FONT "/usr/lib/Xfont/9x15.onx" #define myEvents ExposeWindow /*** *** Label data structure. ***/ typedef struct _LabelData { Window w; /* label window */ char *label; /* string in label */ FontInfo *font; /* font used */ int width, height, /* width and height in pixels of window */ lwidth; /* width in pixels of string in label */ int foregroundcolor; int justify; /* -1 = left justify string 0 = center string 1 = right justify string; */ } LabelData, *LabelPtr; static int initDone = 0; static TEntryType LabelEntry; static FontInfo *default_font; /*********************** private procedures *************************/ /*** *** On first create of label, find a unique entry type for labels. ***/ static Initialize() { LabelEntry = UniqueEntryType(); initDone = 1; default_font = XOpenFont(DEFAULT_FONT); } /*** *** finds the label data structure associated with the given window. ***/ static LabelPtr LabelPtrFromWindow(window) Window window; { LabelPtr result; if (FindEntry(window, LabelEntry, &result) == ERRNONE) return result; return 0; } /*** *** This routine performs the X call to put the text into the window. ***/ static PutLabelText (data) LabelPtr data; { int leftmargin, topmargin; switch (data->justify) { case -1: leftmargin = xMargin; break; case 0: default: leftmargin = (data->width - data->lwidth) / 2; break; case 1: leftmargin = data->width - (data->lwidth + xMargin); break; } topmargin = (data->height - data->font->height) / 2; XTextMask(data->w, leftmargin, topmargin, data->label, strlen(data->label), data->font->id, data->foregroundcolor); } /***************** Semi-public procedures ********************/ /*** *** routine to handle all events on the label window. ***/ static int HandleEvents(event) XExposeWindowEvent *event; { int returnCode, leftmargin, topmargin; LabelPtr ctx; ctx = LabelPtrFromWindow(event->window); if (!ctx) return(NOTHANDLED); returnCode = PROCESSED; switch (event->type) { case ResizeWindow: ctx->width = event->width; ctx->height = event->height; XClear(ctx->w); PutLabelText (ctx); break; case ExposeWindow: if (ctx->width != ((XExposeWindowEvent *) event)->width || ctx->height != ((XExposeWindowEvent *) event)->height) { ctx->width = ((XExposeWindowEvent *) event)->width; ctx->height = ((XExposeWindowEvent *) event)->height; XClear(ctx->w); } PutLabelText (ctx); break; default: returnCode = NOTHANDLED; } return returnCode; } /*** *** given a label and a string, this routine puts the new string into *** the label. NOTE: it does NOT resize the label. ***/ ChangeLabelText (ctx, string) LabelPtr ctx; /* window id of label tool */ char *string; /* new string to be displayed as label */ { if (ctx) { free(ctx->label); ctx->label = strcpy(Tmalloc(strlen(string) + 1), string); ctx->lwidth = XStringWidth(ctx->label, ctx->font, 0, 0); XClear (ctx->w); PutLabelText (ctx); } } ChangeLabelWidth(ctx, width) LabelPtr ctx; int width; { if (ctx) { if (width == 0) return; ctx->width = width; XChangeWindow(ctx->w, ctx->width, ctx->height); XClear(ctx->w); PutLabelText(ctx); } } ChangeLabelHeight(ctx, height) LabelPtr ctx; int height; { if (ctx) { if (height == 0) return; ctx->height = height; XChangeWindow(ctx->w, ctx->width, ctx->height); XClear(ctx->w); PutLabelText(ctx); } } ChangeLabelJustify(ctx, justify) LabelPtr ctx; int justify; { if (ctx) { ctx->justify = justify; XClear(ctx->w); PutLabelText(ctx); } } /************************* Public routines. *******************/ /*** *** Creates a label tool and returns window id ***/ Window TCreateLabel (pw, arglist) Window pw; /** parent window **/ Targ *arglist; { LabelPtr ctx; int x, y; /* offset of top, left of label in parent */ int borderWidth; if (!initDone) Initialize(); ctx = (LabelPtr) Tmalloc(sizeof(LabelData)); /*** *** assign defaults. ***/ ctx->label = strcpy(Tmalloc(strlen(DEFAULT_LABEL) +1), DEFAULT_LABEL); ctx->foregroundcolor = BlackPixel; ctx->justify = 0; ctx->font = default_font; ctx->width = 0; ctx->height = 0; borderWidth = 1; x = y = 0; /*** *** Parse input parameters. ***/ while (arglist->name) { switch (arglist->name) { case T_LABEL_STRING: ctx->label = strcpy(Tmalloc(strlen((char *) arglist->data) +1), (char *) arglist->data); break; case T_LABEL_FONTINFO: ctx->font = (FontInfo *) arglist->data; break; case T_LABEL_WIDTH: ctx->width = abs((int)arglist->data); break; case T_LABEL_HEIGHT: ctx->height = abs((int)arglist->data); break; case T_LABEL_JUSTIFY: ctx->justify = (int) arglist->data; break; case T_LABEL_BORDERWIDTH: borderWidth = (int) arglist->data; break; case T_LABEL_FOREGROUND_PIXEL: ctx->foregroundcolor = (int) arglist->data; break; } arglist++; } /*** *** finish up defaults. ***/ if (ctx->width == NULL) ctx->width = XStringWidth(ctx->label, ctx->font, 0, 0) + 2 * xMargin; if (ctx->height == NULL) ctx->height = ctx->font->height + 2 * yMargin; ctx->lwidth = XStringWidth(ctx->label, ctx->font, 0, 0); /*** *** create the window. ***/ ctx->w = XCreateWindow( pw, x, y, ctx->width, ctx->height, borderWidth, BlackPixmap, WhitePixmap); SaveEntry(ctx->w, LabelEntry , ctx); TSetXEventDispatch(ctx->w, HandleEvents, myEvents, 0); return (ctx->w); } /*** *** This routine lets the application change the attributes of the *** label tool. *** NOTE: currently you may only change the text withing the label. *** This does NOT cause the label to be resized. ***/ TSetLabelAttr(tw, arglist) Window tw; /* tool window */ Targ *arglist; { LabelPtr ctx; ctx = LabelPtrFromWindow(tw); while (arglist->name) { switch (arglist->name) { case T_LABEL_STRING: ChangeLabelText(ctx, (char *) arglist->data); break; case T_LABEL_FONTINFO: break; case T_LABEL_WIDTH: ChangeLabelWidth(ctx, abs((int)arglist->data)); break; case T_LABEL_HEIGHT: ChangeLabelHeight(ctx, abs((int)arglist->data)); break; case T_LABEL_JUSTIFY: ChangeLabelJustify(ctx, (int) arglist->data); break; case T_LABEL_BORDERWIDTH: break; case T_LABEL_FOREGROUND_PIXEL: break; } arglist++; } } /*** *** This routine lets the application get the attributes of the given *** label tool. ***/ TGetLabelAttr(tw, arglist) Window tw; /* tool window */ Targ *arglist; { WindowInfo info; LabelPtr ctx; ctx = LabelPtrFromWindow(tw); /*** *** Parse input parameters. ***/ while (arglist->name) { switch (arglist->name) { case T_LABEL_STRING: arglist->data = (caddr_t) ctx->label; break; case T_LABEL_FONTINFO: arglist->data = (caddr_t) ctx->font; break; case T_LABEL_WIDTH: arglist->data = (caddr_t) ctx->width; break; case T_LABEL_HEIGHT: arglist->data = (caddr_t) ctx->height; break; case T_LABEL_JUSTIFY: arglist->data = (caddr_t) ctx->justify; break; case T_LABEL_BORDERWIDTH: XQueryWindow(ctx->w, &info); arglist->data = (caddr_t) info.bdrwidth; break; case T_LABEL_FOREGROUND_PIXEL: arglist->data = (caddr_t) ctx->foregroundcolor; break; } arglist++; } } /*** *** Destroys the label tool associated with the window as well as the *** window itself ***/ TDestroyLabel (window) Window window; /* window id of label tool */ { LabelPtr ctx; ctx = LabelPtrFromWindow(window); if (ctx) { free(ctx->label); free(ctx); DeleteEntry(window, LabelEntry); TDestroyWindow(window); } XDestroyWindow (window); }