|
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 - downloadIndex: ┃ T s ┃
Length: 12028 (0x2efc) Types: TextFile Names: »sxTitle.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─ ⟦526ad3590⟧ »EUUGD11/gnu-31mar87/X.V10.R4.tar.Z« └─⟦2109abc41⟧ └─ ⟦this⟧ »./X.V10R4/Toolkit/Sx/code/sxTitle.c«
/* * $Source: /u1/Sx.new/code/RCS/sxTitle.c,v $ * $Header: sxTitle.c,v 1.1 86/12/03 16:11:04 swick Exp $ */ #ifndef lint static char *rcsid_sxTitle_c = "$Header: sxTitle.c,v 1.1 86/12/03 16:11:04 swick Exp $"; #endif lint /* * sxTitle.c -- * * This file implements title windows using the facilities of the X * window package and the Sx dispatcher. Titles are rectangular * windows that display up to three pieces of text: one on the * left, one in the center, and one on the right. They are * "output-only" windows: keystrokes and mouse actions have no * impact on them. * * Copyright (C) 1986 Regents of the University of California. * 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. The University of California * makes no representations about the suitability of this * software for any purpose. It is provided "as is" without * express or implied warranty. */ #ifndef lint static char rcsid[] = "$Header: sxTitle.c,v 1.1 86/12/03 16:11:04 swick Exp $ SPRITE (Berkeley)"; #endif not lint #include <sys/types.h> #include <X/Xlib.h> #include "sprite.h" #include "mem.h" #include "sx.h" #include "sxInt.h" #include "string.h" /* * For each title there is one structure of the type defined below, * which is used to hold information about the title. */ typedef struct Title { Window w; /* Window corresponding to title. */ int width, height; /* Dimensions of w, in pixels. */ FontInfo *fontPtr; /* How to draw text. */ int foreground, background; /* Colors to use for display. */ char *leftText; /* String to display left-justified in * title (space is dynamically allocated). */ int leftChars; /* Number of non-null chars. in leftText. */ char *centerText; /* String to display in center. */ int centerChars; /* Number of non-null chars. in centerText. */ int centerWidth; /* Width of centerText in pixels. */ char *rightText; /* String to display on right. */ int rightChars; /* Number of non-null chars. in rightText. */ int rightWidth; /* Width of rightText in pixels. */ } Title; static Boolean init = FALSE; /* * Margins to use at edges of text: */ #define MARGIN 2 /* * The assoc table used below maps from X window ids to Title structures. */ static XAssocTable *titleTable = NULL; extern XAssocTable *XCreateAssocTable(); /* * Forward references: */ extern void TitleInit(); extern void TitleDestroyProc(); extern void TitleExposeProc(); extern void TitleRedisplay(); \f /* *---------------------------------------------------------------------- * * Sx_TitleMake -- * * This procedure turns an ordinary window into a title window. * If the window is already a title window, then its parameters * are changed. * * Results: * None. * * Side effects: * From now on, this window is a title window. The given strings * will be displayed in the window, in the given font and colors. * *---------------------------------------------------------------------- */ void Sx_TitleMake(window, fontPtr, foreground, background, leftText, centerText, rightText) Window window; /* Window that is to become a title * window. If this isn't already a * title window, then it shouldn't * be mapped. If it's already a title * window, its parameters will be * changed and the window will be * redisplayed if it's mapped. */ FontInfo *fontPtr; /* Font in which to display text. If * NULL, a default font is used. */ int foreground; /* Color in which to display text. */ int background; /* Color for background of title. */ char *leftText; /* Text to display left-justified in * window. If NULL, no left-justified * text is displayed. */ char *centerText; /* Text to display in center of window, * or NULL. */ char *rightText; /* Text to display right-justified in * window, or NULL. */ { register Title *titlePtr; if (!init) { TitleInit(); } if (fontPtr == NULL) { fontPtr = Sx_GetDefaultFont(); } /* * See if this window is already a title window. If so, then * prepare it for re-allocation. If not, then make a new Title * structure. */ titlePtr = (Title *) XLookUpAssoc(titleTable, window); if (titlePtr != NULL) { if (titlePtr->leftText != NULL) { Mem_Free(titlePtr->leftText); } if (titlePtr->centerText != NULL) { Mem_Free(titlePtr->centerText); } if (titlePtr->rightText != NULL) { Mem_Free(titlePtr->rightText); } } else { titlePtr = (Title *) Mem_Alloc(sizeof(Title)); titlePtr->w = window; titlePtr->width = titlePtr->height = 0; (void) Sx_HandlerCreate(window, ExposeWindow, TitleExposeProc, (ClientData) titlePtr); (void) Sx_HandlerCreate(window, SX_DESTROYED, TitleDestroyProc, (ClientData) titlePtr); (void) Sx_HandlerCreate(window, KeyPressed|KeyReleased |ButtonPressed|ButtonReleased|EnterWindow|LeaveWindow, Sx_NullProc, (ClientData) NULL); XMakeAssoc(titleTable, window, (caddr_t) titlePtr); } /* * Initialize the contents of the title. */ titlePtr->fontPtr = fontPtr; titlePtr->foreground = foreground; titlePtr->background = background; if (leftText != NULL) { titlePtr->leftChars = String_Length(leftText); titlePtr->leftText = Mem_Alloc(titlePtr->leftChars + 1); (void) String_Copy(leftText, titlePtr->leftText); } else { titlePtr->leftText = NULL; titlePtr->leftChars = 0; } if (centerText != NULL) { titlePtr->centerChars = String_Length(centerText); titlePtr->centerText = Mem_Alloc(titlePtr->centerChars + 1); (void) String_Copy(centerText, titlePtr->centerText); titlePtr->centerWidth = XStringWidth(centerText, fontPtr, 0, 0); } else { titlePtr->centerText = NULL; titlePtr->centerChars = titlePtr->centerWidth = 0; } if (rightText != NULL) { titlePtr->rightChars = String_Length(rightText); titlePtr->rightText = Mem_Alloc(titlePtr->rightChars + 1); (void) String_Copy(rightText, titlePtr->rightText); titlePtr->rightWidth = XStringWidth(rightText, fontPtr, 0, 0); } else { titlePtr->rightText = NULL; titlePtr->rightChars = titlePtr->rightWidth = 0; } if ((titlePtr->width > 0) && (titlePtr->height > 0)) { TitleRedisplay(titlePtr); } } \f /* *---------------------------------------------------------------------- * * Sx_TitleCreate -- * * This procedure is like Sx_TitleMake except that it creates the * title window and also packs it into a parent. * * Results: * The return value is a pointer to a newly-created title window, * that will appear on "side" of "parent" and have its geometry * managed by the Sx packer. * * Side effects: * The given strings will be displayed in the window, in the given * font and colors. * *---------------------------------------------------------------------- */ Window Sx_TitleCreate(parent, side, size, border, fontPtr, foreground, background, leftText, centerText, rightText) Window parent; /* Parent window in which to create * the new title window. */ Sx_Side side; /* Side of parent on which to create * the new title (normally SX_TOP or * SX_BOTTOM). */ int size; /* Size of new window perpendicular to * length of side. */ int border; /* Width of border for new window. */ FontInfo *fontPtr; /* Font in which to display text. If * NULL, a default font is used. */ int foreground; /* Color in which to display text. */ int background; /* Color for background of title. */ char *leftText; /* Text to display left-justified in * window. If NULL, no left-justified * text is displayed. */ char *centerText; /* Text to display in center of window, * or NULL. */ char *rightText; /* Text to display right-justified in * window, or NULL. */ { Window w; Pixmap borderPixmap; if ((foreground == BlackPixel) || (border == 0)) { borderPixmap = BlackPixmap; } else if (foreground == WhitePixel) { borderPixmap = WhitePixmap; } else { borderPixmap = XMakeTile(foreground); if (borderPixmap == NULL) { Sx_Panic("Sx_TitleCreate: couldn't create border pixmap."); } } w = Sx_CreatePacked(parent, side, size, border, (Window) 0, (Window) 0, borderPixmap, WhitePixmap); if ((borderPixmap != BlackPixmap) && (borderPixmap != WhitePixmap)) { XFreePixmap(borderPixmap); } Sx_TitleMake(w, fontPtr, foreground, background, leftText, centerText, rightText); return w; } \f /* *---------------------------------------------------------------------- * * TitleDestroyProc -- * * Called by the Sx dispatcher whenever a title window is * destroyed. * * Results: * None. * * Side effects: * The additional data structures associated with the title * are deleted. * *---------------------------------------------------------------------- */ static void TitleDestroyProc(titlePtr) register Title *titlePtr; /* Internal info about title. */ { XDeleteAssoc(titleTable, titlePtr->w); if (titlePtr->leftText != NULL) { Mem_Free(titlePtr->leftText); } if (titlePtr->centerText != NULL) { Mem_Free(titlePtr->centerText); } if (titlePtr->rightText != NULL) { Mem_Free(titlePtr->rightText); } Mem_Free((char *) titlePtr); } \f /* *---------------------------------------------------------------------- * * TitleInit -- * * This procedure is called once only to initialize shared * variables for the module. * * Results: * None. * * Side effects: * Random initializations are performed. See the code. * *---------------------------------------------------------------------- */ static void TitleInit() { titleTable = XCreateAssocTable(8); if (titleTable == NULL) { Sx_Panic("Sx_TitleMake: couldn't initialize cursors and/or hash table."); } init = TRUE; } \f /* *---------------------------------------------------------------------- * * TitleRedisplay -- * * Redraw the information in a title window. * * Results: * None. * * Side effects: * The title gets redrawn. * *---------------------------------------------------------------------- */ static void TitleRedisplay(titlePtr) register Title *titlePtr; /* Button to redisplay. */ { int y; XPixSet(titlePtr->w, 0, 0, titlePtr->width, titlePtr->height, titlePtr->background); y = (titlePtr->height - titlePtr->fontPtr->height)/2; if (titlePtr->leftText != NULL) { XText(titlePtr->w, MARGIN, y, titlePtr->leftText, titlePtr->leftChars, titlePtr->fontPtr->id, titlePtr->foreground, titlePtr->background); } if (titlePtr->centerText != NULL) { XText(titlePtr->w, (titlePtr->width - titlePtr->centerWidth)/2, y, titlePtr->centerText, titlePtr->centerChars, titlePtr->fontPtr->id, titlePtr->foreground, titlePtr->background); } if (titlePtr->rightText != NULL) { XText(titlePtr->w, titlePtr->width - titlePtr->rightWidth - MARGIN, y, titlePtr->rightText, titlePtr->rightChars, titlePtr->fontPtr->id, titlePtr->foreground, titlePtr->background); } } \f /* *---------------------------------------------------------------------- * * TitleExposeProc -- * * This procedure is invoked automatically by the Sx_ dispatcher * whenever an expose event occurs for a title window. * * Results: * None. * * Side effects: * The title window gets redisplayed. * *---------------------------------------------------------------------- */ /* ARGSUSED */ static void TitleExposeProc(titlePtr, eventPtr) Title *titlePtr; /* Button for which it happened. */ XExposeEvent *eventPtr; /* Describes what happened. */ { if (eventPtr->subwindow != 0) { return; } titlePtr->width = eventPtr->width; titlePtr->height = eventPtr->height; TitleRedisplay(titlePtr); }