jkh@ardent.UUCP (Jordan K. Hubbard) (06/16/88)
#! /bin/sh
# This is a shell archive. Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file". To overwrite existing
# files, type "sh file -c". You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g.. If this archive is complete, you
# will see the following message at the end:
# "End of archive 7 (of 17)."
# Contents: awm/Gadget.c awm/Icons.c awm/menus/rtlmenu.c
# Wrapped by jkh@ardent on Thu Jun 16 00:44:13 1988
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'awm/Gadget.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'awm/Gadget.c'\"
else
echo shar: Extracting \"'awm/Gadget.c'\" \(9143 characters\)
sed "s/^X//" >'awm/Gadget.c' <<'END_OF_FILE'
X#ident "%W% %G%"
X
X#ifndef lint
static char *rcsid_Gadget_c = "$Header: Gadget.c,v 1.1 88/06/15 15:26:00 jkh Exp $";
X#endif lint
X
X#include "X11/copyright.h"
X/*
X *
X * Copyright 1987, 1988 by Ardent Computer Corporation, Sunnyvale, Ca.
X *
X * Copyright 1987 by Jordan Hubbard.
X *
X *
X * All Rights Reserved
X *
X * Permission to use, copy, modify, and distribute this software and its
X * documentation for any purpose and without fee is hereby granted,
X * provided that the above copyright notice appear in all copies and that
X * both that copyright notice and this permission notice appear in
X * supporting documentation, and that the name of Ardent Computer
X * Corporation or Jordan Hubbard not be used in advertising or publicity
X * pertaining to distribution of the software without specific, written
X * prior permission.
X *
X */
X
X/*
X * MODIFICATION HISTORY
X *
X * 001 -- Jortan Hubbard, Ardent Computer.
X * Gadget boxes in title bars.
X *
X */
X
X#include "awm.h"
X#include "X11/Xutil.h"
X
extern XContext AwmContext;
X
AwmInfoPtr IsGadgetWin(w, gnum)
Window w;
int *gnum;
X{
X AwmInfoPtr awi;
X int i;
X
X Entry("IsGadgetWin")
X
X if (!XFindContext(dpy, w, AwmContext, &awi)) {
X Window *wp;
X
X if (!awi->gadgets)
X Leave((AwmInfoPtr)NULL)
X for (i = 0; i < NumGadgets; i++)
X if (awi->gadgets[i] == w) {
X if (gnum)
X *gnum = i;
X Leave(awi)
X }
X Leave((AwmInfoPtr)NULL)
X }
X}
X
Boolean FPutGadgets(w, mask, button, x, y)
Window w;
int mask, button, x, y;
X{
X Entry("FPutGadgets")
X
X if (w == RootWindow(dpy, scr))
X Leave(FALSE)
X PutGadgets(w);
X Leave(TRUE)
X}
X
X/*
X * This routine adds and gadgets onto title bar 'w' (though just
X * about any window would do, I suppose).
X */
int PutGadgets(w)
Window w;
X{
X int i, dir;
X int rx, lx, nx, ny;
X XWindowAttributes xwa;
X XSetWindowAttributes swa;
X unsigned long valuemask;
X GadgetDecl *gdec;
X AwmInfo *awi;
X char *cp;
X Boolean change = FALSE;
X Binding *bptr;
X Window tmp;
X
X Entry("PutGadgets")
X
X /* are there any gadgets declared? */
X if (NumGadgets < 1)
X Leave_void
X /* does this window have a title? */
X if (!(awi = IsTitled(w)))
X Leave_void
X else
X w = awi->title;
X /* if the window already has gadgets, this is a reshuffle */
X if (awi->gadgets)
X change = TRUE;
X else
X awi->gadgets = (Window *)malloc(sizeof(Window) * NumGadgets + 1);
X if (!awi->gadgets) {
X fprintf(stderr, "PutGadgets: Can't allocate memory for gadgets!\n");
X Leave(FALSE)
X }
X if (XGetWindowAttributes(dpy, w, &xwa) == BadWindow) {
X fprintf(stderr, "PutGadgets: Can't get attributes for title window %x\n",
X w);
X Leave_void
X }
X /* define some initial positioning information */
X dir = RightGadgetGravity;
X lx = 0;
X rx = xwa.width;
X valuemask = CWBackPixel | CWEventMask;
X swa.event_mask = (ButtonPressMask | ButtonReleaseMask | ExposureMask);
X for (i = 0; i < NumGadgets && Gadgets[i]; i++) {
X XGCValues gcv;
X
X gdec = Gadgets[i];
X
X /* Does gadget have its own gravity? */
X if (gdec->gravity != NoGadgetGravity)
X dir = gdec->gravity;
X ny = xwa.height - gdec->high;
X if (ny <= 0) {
X ny = 0;
X gdec->high = xwa.height;
X }
X else
X ny = (ny / 2) - 1;
X if (ny < 0)
X ny = 0;
X if (dir == LeftGadgetGravity) {
X nx = lx + gdec->offset;
X if (nx != 0 && nx == lx) /* not first time through, add pad */
X nx = lx + GadgetPad;
X if (nx < 0)
X nx = 0;
X lx = nx + gdec->wide;
X dir = RightGadgetGravity;
X }
X else if (dir == RightGadgetGravity) {
X nx = rx - gdec->wide - gdec->offset;
X if (!gdec->offset && rx != xwa.width)
X nx -= GadgetPad;
X if (nx > xwa.width)
X nx = xwa.width - gdec->wide - 1;
X rx = nx;
X dir = LeftGadgetGravity;
X }
X else /* Center Gravity */
X nx = ((xwa.width - gdec->wide) / 2) + gdec->offset;
X if (change == FALSE || !awi->gadgets[i]) {
X swa.background_pixel = gdec->backcolor;
X tmp = awi->gadgets[i] = XCreateWindow(dpy, w, nx, ny, gdec->wide,
X gdec->high, GadgetBorder,
X xwa.depth, xwa.class,
X xwa.visual, valuemask, &swa);
X if (!tmp) {
X fprintf(stderr, "PutGadgets: Unable to create gadget window #%d\n",
X i);
X Leave_void
X }
X if (gdec->data) {
X Pixmap pix;
X
X pix = XCreatePixmapFromBitmapData(dpy, tmp, gdec->data,
X gdec->wide, gdec->high,
X gdec->forecolor, gdec->backcolor,
X xwa.depth);
X if (!pix) {
X fprintf(stderr, "PutGadgets: Unable to create pixmap for #%d\n",
X i);
X fprintf(stderr, "Using grey...\n");
X pix = GrayPixmap;
X }
X XSetWindowBackgroundPixmap(dpy, tmp, pix);
X XFreePixmap(dpy, pix);
X }
X XMapWindow(dpy, tmp);
X XSaveContext(dpy, tmp, AwmContext, awi);
X }
X else
X XMoveWindow(dpy, awi->gadgets[i], nx, ny);
X }
X if (change == FALSE) /* make sure the window array is null terminated */
X awi->gadgets[i] = (Window)NULL;
X PaintGadgets(w);
X Leave_void
X}
X
int FreeGadget(n)
int n;
X{
X Entry("FreeGadget")
X
X if (Gadgets[n]->data)
X XFree(Gadgets[n]->data);
X if (Gadgets[n]->name)
X free(Gadgets[n]->name);
X /* They tell me that this is not necessary for read-only cells. True?
X if (Gadgets[n]->forecolor)
X XFreeColors(dpy, DefaultColormap(dpy, scr),
X &(Gadgets[n]->forecolor), 1, AllPlanes);
X if (Gadgets[n]->backcolor)
X XFreeColors(dpy, DefaultColormap(dpy, scr),
X &(Gadgets[n]->backcolor), 1, AllPlanes);
X */ /* color free's commented out */
X}
X
int CheckGadgets()
X{
X int i, status = 0;
X
X Entry("CheckGadgets")
X
X for (i = 0; i < NumGadgets; i++)
X if (!Gadgets[i]) {
X fprintf(stderr, "awm: Gadget #%d is not declared!\n",
X i);
X fprintf(stderr, "All gadgets from 0 to %d must be declared.\n",
X NumGadgets - 1);
X status = 1;
X }
X Leave(status)
X}
X
Boolean ResetGadgets()
X{
X int i;
X
X Entry("ResetGadgets")
X
X for (i = 0; i < NumGadgets; i++) {
X FreeGadget(i);
X free(Gadgets[i]);
X Gadgets[i] = 0;
X }
X NumGadgets = 0;
X}
X
Boolean FDestroyGadgets(w, mask, button, x, y)
Window w;
int mask, button, x, y;
X{
X Entry("FDestroyGadgets")
X
X if (w == RootWindow(dpy, scr))
X Leave(FALSE)
X DestroyGadgets(w);
X Leave(TRUE)
X}
X
int DestroyGadgets(w)
Window w;
X{
X int i;
X AwmInfoPtr awi;
X
X Entry("DestroyGadgets")
X
X if (!(awi = IsTitled(w)))
X Leave_void
X if (!awi->gadgets)
X Leave_void
X for (i = 0; i < NumGadgets && Gadgets[i]; i++) {
X XDeleteContext(dpy, awi->gadgets[i], AwmContext);
X XDestroyWindow(dpy, awi->gadgets[i]);
X }
X free(awi->gadgets);
X awi->gadgets = 0;
X Leave_void
X}
X
int PaintGadgets(w)
Window w;
X{
X int i, y, x = 0;
X AwmInfoPtr awi;
X GadgetDecl *gdec;
X
X Entry("PaintGadgets")
X
X if (!(awi = IsTitled(w)))
X Leave_void
X if (!awi->gadgets)
X Leave_void
X for (i = 0; i < NumGadgets && Gadgets[i]; i++) {
X gdec = Gadgets[i];
X if (!gdec->data) {
X XGCValues gcv;
X
X gcv.font = gdec->fontInfo->fid;
X gcv.foreground = gdec->forecolor;
X gcv.background = gdec->backcolor;
X XChangeGC(dpy, awi->winGC, (GCFont | GCForeground | GCBackground),
X &gcv);
X if (strlen(gdec->name) == 1) { /* it's a glyph (we think) */
X XFontStruct *real_font;
X XCharStruct char_info;
X int char_number, index, byte1, byte2;
X
X real_font = gdec->fontInfo;
X char_number = gdec->name[0];
X char_info = real_font->max_bounds;
X index = char_number;
X
X if (real_font->per_char) {
X if (!real_font->min_byte1 && !real_font->max_byte1) {
X if (char_number < real_font->min_char_or_byte2 ||
X char_number > real_font->max_char_or_byte2)
X index = real_font->default_char;
X index -= real_font->min_char_or_byte2;
X } else {
X byte2 = index & 0xff;
X byte1 = (index>>8) & 0xff;
X if (byte1 < real_font->min_byte1 ||
X byte1 > real_font->max_byte1 ||
X byte2 < real_font->min_char_or_byte2 ||
X byte2 > real_font->max_char_or_byte2) {
X byte2 = real_font->default_char & 0xff;
X byte1 = (real_font->default_char>>8)&0xff;
X }
X byte1 -= real_font->min_byte1;
X byte2 -= real_font->min_char_or_byte2;
X index = byte1 * (real_font->max_char_or_byte2 -
X real_font->min_char_or_byte2 + 1) +
X byte2;
X }
X char_info = real_font->per_char[index];
X }
X x = 0 - char_info.lbearing;
X y = char_info.ascent;
X }
X else {
X y = (gdec->high + (gdec->fontInfo->max_bounds.ascent -
X gdec->fontInfo->max_bounds.descent)) / 2;
X x = 0;
X }
X XDrawString(dpy, awi->gadgets[i], awi->winGC, x,
X y, gdec->name, strlen(gdec->name));
X }
X }
X Leave(0)
X}
END_OF_FILE
if test 9143 -ne `wc -c <'awm/Gadget.c'`; then
echo shar: \"'awm/Gadget.c'\" unpacked with wrong size!
fi
# end of 'awm/Gadget.c'
fi
if test -f 'awm/Icons.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'awm/Icons.c'\"
else
echo shar: Extracting \"'awm/Icons.c'\" \(10358 characters\)
sed "s/^X//" >'awm/Icons.c' <<'END_OF_FILE'
X#ident "%W% %G%"
X
X#ifndef lint
static char *rcsid_Iconify_c = "$Header: Iconify.c,v 1.1 88/06/15 15:24:56 jkh Exp $";
X#endif lint
X
X#include "X11/copyright.h"
X/*
X *
X * Copyright 1987, 1988 by Ardent Computer Corporation, Sunnyvale, Ca.
X *
X * Copyright 1987 by Jordan Hubbard.
X *
X *
X * All Rights Reserved
X *
X * Permission to use, copy, modify, and distribute this software and its
X * documentation for any purpose and without fee is hereby granted,
X * provided that the above copyright notice appear in all copies and that
X * both that copyright notice and this permission notice appear in
X * supporting documentation, and that the name of Ardent Computer
X * Corporation or Jordan Hubbard not be used in advertising or publicity
X * pertaining to distribution of the software without specific, written
X * prior permission.
X *
X */
X
X/*
X * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
X *
X * All Rights Reserved
X *
X * Permission to use, copy, modify, and distribute this software and its
X * documentation for any purpose and without fee is hereby granted,
X * provided that the above copyright notice appear in all copies and that
X * both that copyright notice and this permission notice appear in
X * supporting documentation, and that the name of Digital Equipment
X * Corporation not be used in advertising or publicity pertaining to
X * distribution of the software without specific, written prior permission.
X *
X *
X * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
X * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
X * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
X * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
X * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
X * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
X * SOFTWARE.
X */
X
X
X
X/*
X * MODIFICATION HISTORY
X *
X * 000 -- L. Guarino Reid, DEC Ultrix Engineering Group
X * 001 -- Jordan Hubbard, Ardent Computer
X * Many modifications for titled windows.
X */
X
X#include "awm.h"
X#include "X11/Xutil.h"
X
extern XContext AwmContext;
X
X/* the client should pass us a bitmap (single-plane pixmap with background=0
X * and foreground = 1). It is our responsibility to convert it to a pixmap
X * of the appropriate depth for a window tile and also color it with the
X * appropriate background and foreground pixels.
X *
X * we'll use the (global) IconGC for the fore/background pixels.
X */
X
static Pixmap MakePixmapFromBitmap( bitmap, clipmask, width_return, height_return )
Pixmap bitmap, clipmask;
unsigned int *width_return, *height_return;
X{
X Pixmap tile;
X Window junkW;
X int junk, width, height;
X GC iGC;
X XGCValues gcv;
X
X Entry("MakePixmapFromBitmap")
X
X if (!XGetGeometry( dpy, bitmap, &junkW, &junk, &junk,
X &width, &height, &junk, &junk )) {
X Warning( "client passed invalid pixmap for icon." );
X Leave( NULL )
X }
X tile = XCreatePixmap( dpy, RootWindow(dpy, scr), width, height,
X DefaultDepth(dpy, scr) );
X if (clipmask)
X XSetClipMask(dpy, IconGC, clipmask);
X gcv.foreground = ITextForeground;
X gcv.background = ITextBackground;
X iGC = XCreateGC(dpy, RootWindow(dpy, scr), (GCForeground | GCBackground),
X &gcv);
X XCopyPlane( dpy, bitmap, tile, iGC, 0, 0, width, height, 0, 0, 1 );
X XFreeGC(dpy, iGC);
X if (width_return)
X *width_return = width;
X if (height_return)
X *height_return = height;
X Leave(tile)
X}
X
char *GetIconName(window)
Window window;
X{
X char *name;
X Status status;
X long len, after;
X Atom a_type;
X int a_form;
X
X Entry("GetIconName")
X
X status = XGetWindowProperty(dpy, window, XA_WM_ICON_NAME, 0, 256,
X False, XA_STRING, &a_type, &a_form, &len, &after,
X &name);
X
X if (status != Success) {
X status = XGetWindowProperty(dpy, window, XA_WM_NAME, 0, NAME_LEN,
X False, XA_STRING, &a_type, &a_form, &len,
X &after, &name);
X if (status != Success)
X Leave((char *)NULL)
X }
X if (a_form == 0) /* we have no bananas */
X Leave((char *)NULL)
X if (a_form != 8) {
X Warning("Window has icon_name in wrong format");
X if (name)
X free(name);
X Leave((char *)NULL)
X }
X if (len > NAME_LEN) {
X Warning("Window has icon_name greater than maximum length");
X len = NAME_LEN;
X }
X if (!len)
X Leave((char *)NULL)
X name[len] = 0;
X Leave(name)
X}
X
Boolean IsIcon(icon, win)
Window icon;
Window *win;
X{
X AwmInfoPtr awi;
X
X Entry("IsIcon")
X
X if (win)
X *win = 0;
X awi = GetAwmInfo(icon);
X if (!awi)
X Leave(FALSE)
X if (awi->icon == icon) {
X if (win)
X *win = awi->client;
X Leave(TRUE)
X }
X else if (awi->client == icon || awi->frame == icon) {
X if (win)
X *win = awi->icon;
X Leave(FALSE)
X }
X Leave(FALSE)
X}
X
RemoveIcon(window)
Window window;
X{
X AwmInfoPtr awi;
X
X Entry("RemoveIcon")
X
X if ((awi = GetAwmInfo(window)) != NULL) {
X XDeleteContext(dpy, awi->icon, AwmContext);
X if (awi->own) {
X XDestroyWindow(dpy, awi->icon);
X if (awi->iconPixmap != IBackPixmap)
X XFreePixmap(dpy, awi->iconPixmap);
X }
X awi->icon = 0;
X awi->state = WINDOW;
X }
X Leave_void
X}
X
GetDefaultSize(window, icon_w, icon_h)
Window window;
int *icon_w, *icon_h;
X{
X char *name; /* Event window name. */
X
X Entry("GetDefaultSize")
X
X /*
X * Determine the size of the icon window.
X */
X name = GetIconName(window);
X *icon_h = IFontInfo->ascent + IFontInfo->descent;
X if (name) {
X *icon_w = XTextWidth(IFontInfo, name, strlen(name));
X if (*icon_w == 0)
X *icon_w = *icon_h;
X }
X else
X *icon_w = *icon_h;
X Leave_void
X}
X
Window MakeIcon(window, x, y, mousePositioned)
Window window; /* associated window. */
int x, y; /* Event mouse position. */
Boolean mousePositioned;
X{
X Window icon; /* icon window. */
X int icon_x, icon_y; /* Icon U. L. X and Y coordinates. */
X int icon_w, icon_h; /* Icon width and height. */
X int icon_bdr; /* Icon border width. */
X int mask; /* Icon event mask */
X int depth; /* for XGetGeometry */
X XSetWindowAttributes iconValues; /* for icon window creation */
X unsigned long iconValues_mask; /* for above */
X XWMHints *wmhints; /* see if icon position provided */
X XWMHints *XGetWMHints();
X Pixmap clip = 0;
X Window AddIcon();
X
X Entry("MakeIcon")
X
X iconValues.background_pixmap = IBackPixmap;
X mask = (ExposureMask | StructureNotifyMask | KeyPressMask);
X /*
X * Process window manager hints.
X */
X if (wmhints = XGetWMHints(dpy, window)) {
X if (wmhints->flags & IconWindowHint)
X Leave(AddIcon(window, wmhints->icon_window, FALSE,
X (StructureNotifyMask), (Pixmap)NULL))
X else if (wmhints->flags & IconPixmapHint) {
X if (wmhints->flags & IconMaskHint)
X clip = wmhints->icon_mask;
X iconValues.background_pixmap =
X MakePixmapFromBitmap(wmhints->icon_pixmap, clip,
X &icon_w, &icon_h );
X if (iconValues.background_pixmap)
X mask = (StructureNotifyMask);
X else {
X iconValues.background_pixmap = IBackPixmap;
X wmhints->flags &= ~IconPixmapHint;
X GetDefaultSize(window, &icon_w, &icon_h);
X }
X }
X else GetDefaultSize(window, &icon_w, &icon_h);
X }
X else GetDefaultSize(window, &icon_w, &icon_h);
X
X /*
X * Fix up sizes by padding.
X */
X if (!wmhints || !(wmhints->flags & (IconPixmapHint|IconWindowHint))) {
X icon_w += (HIconPad << 1);
X icon_h += (VIconPad << 1);
X }
X
X /*
X * Set the icon border attributes.
X */
X if (!wmhints || !(wmhints->flags & IconWindowHint)) {
X icon_bdr = IBorderWidth;
X iconValues.border_pixel = IBorder;
X }
X
X if (wmhints && (wmhints->flags & IconPositionHint)) {
X icon_x = wmhints->icon_x;
X icon_y = wmhints->icon_y;
X } else {
X if (mousePositioned) {
X /*
X * Determine the coordinates of the icon window;
X * normalize so that we don't lose the icon off the
X * edge of the screen.
X */
X icon_x = x - (icon_w >> 1) + 1;
X if (icon_x < 0) icon_x = 0;
X icon_y = y - (icon_h >> 1) + 1;
X if (icon_y < 0) icon_y = 0;
X if ((icon_x - 1 + icon_w + (icon_bdr << 1)) > ScreenWidth) {
X icon_x = ScreenWidth - icon_w - (icon_bdr << 1) + 1;
X }
X if ((icon_y - 1 + icon_h + (icon_bdr << 1)) > ScreenHeight) {
X icon_y = ScreenHeight - icon_h - (icon_bdr << 1) + 1;
X }
X }
X else {
X icon_x = x + (icon_w >> 1);
X icon_y = y + (icon_y >> 1);
X }
X
X }
X
X /*
X * Create the icon window.
X */
X iconValues_mask = CWBorderPixel | CWBackPixmap;
X /*
X * Here we assume that if they want save unders, they'll also want
X * backing store on the icons. Perhaps a dangerous assumption, but
X * one we have to make at this point.
X */
X if (SaveUnder) {
X iconValues.backing_store = WhenMapped;
X iconValues_mask |= CWBackingStore;
X }
X Leave(AddIcon(window,
X XCreateWindow(
X dpy, RootWindow(dpy, scr),
X icon_x, icon_y,
X icon_w, icon_h,
X icon_bdr, 0, CopyFromParent, CopyFromParent,
X iconValues_mask, &iconValues),
X TRUE, mask, iconValues.background_pixmap))
X
X}
X
Window AddIcon(window, icon, own, mask, background)
Window window, icon;
Boolean own;
int mask;
Pixmap background;
X{
X Binding *bptr;
X AwmInfoPtr awi;
X
X Entry("AddIcon")
X
X if (icon == NULL)
X Leave(NULL)
X /*
X * Use the text cursor whenever the mouse is in the icon window.
X */
X XDefineCursor(dpy, icon, TextCursor);
X
X /*
X * Select "key pressed", "window exposure" and "unmap window"
X * events for the icon window.
X */
X XSelectInput(dpy, icon, mask);
X /*
X * Handle any registered grabs for the icon window.
X */
X for (bptr = Blist; bptr; bptr = bptr->next)
X if (bptr->context & ICON)
X Grab(bptr->mask, icon);
X awi = GetAwmInfo(window);
X awi->icon = icon;
X awi->own = own;
X awi->iconPixmap = background;
X XSaveContext(dpy, icon, AwmContext, awi);
X Leave(icon)
X}
END_OF_FILE
if test 10358 -ne `wc -c <'awm/Icons.c'`; then
echo shar: \"'awm/Icons.c'\" unpacked with wrong size!
fi
# end of 'awm/Icons.c'
fi
if test -f 'awm/menus/rtlmenu.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'awm/menus/rtlmenu.c'\"
else
echo shar: Extracting \"'awm/menus/rtlmenu.c'\" \(9320 characters\)
sed "s/^X//" >'awm/menus/rtlmenu.c' <<'END_OF_FILE'
X#ident "%W% %G%"
X
X#ifndef lint
X static char sccs_id[] = "@(#)rtlmenu.c 2.1 12/16/87 Siemens Corporate Research and Support, Inc.";
X#endif
X
X
X/*
X RTL Menu Package Version 1.0
X by Joe Camaratta and Mike Berman, Siemens RTL, Princeton NJ, 1987
X
X rtlmenu.c: interface level for menu package
X */
X
X#include "X11/copyright.h"
X/*
X *
X * Copyright 1987, 1988 by Ardent Computer Corporation, Sunnyvale, Ca.
X *
X * Copyright 1987 by Jordan Hubbard.
X *
X *
X * All Rights Reserved
X *
X * Permission to use, copy, modify, and distribute this software and its
X * documentation for any purpose and without fee is hereby granted,
X * provided that the above copyright notice appear in all copies and that
X * both that copyright notice and this permission notice appear in
X * supporting documentation, and that the name of Ardent Computer
X * Corporation or Jordan Hubbard not be used in advertising or publicity
X * pertaining to distribution of the software without specific, written
X * prior permission.
X *
X */
X
X/*
X
X Copyright 1987 by
X Siemens Corporate Research and Support, Inc., Princeton, New Jersey
X
X Permission to use, copy, modify, and distribute this software
X and its documentation for any purpose and without fee is
X hereby granted, provided that the above copyright notice
X appear in all copies and that both that copyright notice and
X this permission notice appear in supporting documentation, and
X that the name of Siemens not be used in advertising or
X publicity pertaining to distribution of the software without
X specific, written prior permission. Siemens makes no
X representations about the suitability of this software for any
X purpose. It is provided "as is" without express or implied
X warranty.
X
X */
X
X#include <stdio.h>
X#include "X11/Xlib.h"
X
X#include "menu.h"
X#include "menu.def.h"
X#include "menu.ext.h"
X#include "rtlmenu.h"
X#include "dbug.h"
X
extern Display *dpy;
extern int scr;
X
static RTLPoint menu_pos;
static int initialized = 0;
X
void RTLMenu_Initialize (options_mask)
MenuOptionsMask options_mask;
X{
X Entry("RTLMenu_Initialize")
X
X if (initialized)
X return;
X initialized = 1;
X InitMenu ("uwm", options_mask);
X Leave_void
X}
X
X/* ------------------------------------------------------------ */
RTLMenu RTLMenu_Create()
X{
X Entry("RTLMenu_Create")
X /* Create a menu with no name, not in inverse video. */
X
X Leave((RTLMenu)NewMenu())
X}
X
X/* ------------------------------------------------------------ */
void RTLMenu_Destroy( menu )
RTLMenu menu;
X{
X Entry("RTLMenu_Destroy")
X DisposeMenu ((Menu*) menu);
X Leave_void
X}
X
X/* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ */
X
pointer RTLMenu_Data( menu, item )
X/*ARGSUSED*/
RTLMenu menu;
RTLMenuItem item;
X{
X Entry("RTLMenu_Data")
X Leave(ItemData((MenuItem*)item))
X}
X
X/* ------------------------------------------------------------ */
X
RTLMenu RTLMenu_Get_Submenu( menu, str )
RTLMenu menu;
char *str;
X{
X MenuItem *item = MenuItemByName ((Menu*) menu, str);
X
X Entry("RTLMenu_Get_Submenu")
X
X if (!ItemIsNull(item))
X Leave((RTLMenu)ItemSubmenu(item))
X Leave(0)
X}
X
X/* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ */
X
X/*ARGSUSED*/
static void RTLMenu_Client_Send( menu, item )
RTLMenu menu;
RTLMenuItem item;
X{
X Entry("RTLMenu_Client_Send")
X
X printf ("RTLMenu_Client_Send not yet implemented for X, string = \"%s\"\n",
X (char*) item);
X Leave_void
X}
X
X/* ------------------------------------------------------------ */
X
RTLMenuItem RTLMenu_Append_String( menu, str, strval )
RTLMenu menu;
char *str;
char *strval;
X{
X MenuItem *item = AddMenuItem((Menu*)menu, str);
X
X Entry("RTLMenu_Append_String")
X
X ItemCallback(item) = (Callback)RTLMenu_Client_Send;
X ItemData(item) = (pointer) strval;
X Leave((RTLMenuItem)item)
X}
X
X/* ------------------------------------------------------------ */
X
RTLMenuItem RTLMenu_Append_Callback( menu, backproc )
RTLMenu menu;
VoidFunc backproc;
X{
X MenuItem *item = AddMenuItem((Menu*)menu, "");
X
X Entry("RTLMenu_Append_Callback")
X
X ItemGenerator(item) = (Callback)backproc;
X
X Leave((RTLMenuItem)item)
X}
X
X/* ------------------------------------------------------------ */
X
RTLMenuItem RTLMenu_Append_Call( menu, str, pix, proc, ptrval )
RTLMenu menu;
char *str;
char *pix;
VoidFunc proc;
pointer ptrval;
X{
X MenuItem *item = AddMenuItem((Menu*)menu, str, pix);
X
X Entry("RTLMenu_Append_Call")
X
X ItemCallback(item) = proc;
X ItemData(item) = ptrval;
X
X Leave((RTLMenuItem)item)
X}
X
X/* ------------------------------------------------------------ */
X
RTLMenuItem RTLMenu_Append_Checkback( menu, str, pix, checkproc, proc, ptrval )
RTLMenu menu;
char *str; /* Menu string */
char *pix;
bool (*checkproc) (); /* Boolean function called when menu entry
X is about to be displayed. If true, then
X the item appears checked; if false, then
X it does not */
VoidFunc proc; /* function to be called when the item
X is selected */
pointer ptrval; /* data associated with this item */
X{
X MenuItem *item = AddMenuItem((Menu*)menu, str, pix);
X
X Entry("RTLMenu_Append_Checkback")
X
X ItemCallback(item) = proc;
X ItemData(item) = ptrval;
X ItemCheckproc(item) = checkproc;
X
X Leave((RTLMenuItem)item)
X}
X/* ------------------------------------------------------------ */
X
RTLMenuItem RTLMenu_Append_Submenu( menu, str, pix, submenu )
RTLMenu menu;
char *str;
char *pix;
RTLMenu submenu;
X{
X MenuItem *item = AddMenuItem((Menu*)menu, str, pix);
X
X Entry("RTLMenu_Append_Submenu")
X
X ItemSubmenu(item) = (Menu*)submenu;
X
X Leave((RTLMenuItem)item)
X}
X
X/* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ */
X
void RTLMenu_Replace_Data_Keyed_String( menu, data, str )
RTLMenu menu;
pointer data;
char *str;
X{
X MenuItem *item = MenuItemByName((Menu*) menu, str);
X
X Entry("RTLMenu_Replace_Keyed_String")
X
X if (!ItemIsNull(item))
X ItemData(item) = data;
X Leave_void
X}
X
X/* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ */
X
void RTLMenu_Activate_Entry( menu, item )
RTLMenu menu;
RTLMenuItem item;
X{
X Entry("RTLMenu_Activate_Entry")
X
X (void)SetItemDisable((Menu*)menu, (MenuItem*)item, FALSE);
X Leave_void
X}
X
X/* ------------------------------------------------------------ */
X
void RTLMenu_Inactivate_Entry( menu, item )
RTLMenu menu;
RTLMenuItem item;
X{
X Entry("RTLMenu_Inactivate_Entry")
X
X (void)SetItemDisable((Menu*)menu, (MenuItem*)item, TRUE);
X Leave_void
X}
X
void RTLMenu_Label_Entry( menu, item )
RTLMenu menu;
RTLMenuItem item;
X{
X Entry("RTLMenu_Label_Entry")
X
X (void)SetItemDeaf((Menu*)menu, (MenuItem*)item, TRUE);
X Leave_void
X}
X
X/* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ */
X
bool RTLMenu_Has_Data( menu, val )
RTLMenu menu;
pointer val;
X{
X MenuItem *item = MenuItemByData((Menu*)menu, val);
X Entry("RTLMenu_Has_Data")
X
X Leave(!ItemIsNull(item))
X}
X
X/* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ */
X
void RTLMenu_Delete_Entries( menu )
RTLMenu menu;
X{
X Entry("RTLMenu_Delete_Entries")
X
X while (DisposeItem((Menu*)menu, MenuItems((Menu*)menu)));
X Leave_void
X}
X
X/* ------------------------------------------------------------ */
X
void RTLMenu_Delete_String( menu, str )
RTLMenu menu;
char *str;
X{
X MenuItem *item = MenuItemByName((Menu*) menu, str);
X
X Entry("RTLMenu_Delete_String");
X
X if (!ItemIsNull(item))
X (void) DisposeItem ((Menu*)menu, item);
X Leave_void
X}
X
X/* ------------------------------------------------------------ */
X
void RTLMenu_Delete_Data( menu, val )
RTLMenu menu;
pointer val;
X{
X MenuItem *item = MenuItemByData((Menu*)menu, val);
X
X Entry("RTLMenu_Delete_Data");
X
X if (!ItemIsNull(item))
X (void) DisposeItem((Menu*)menu, item);
X Leave_void
X}
X
X/* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ */
X
X/*ARGSUSED*/
void RTLMenu_Box( menu )
RTLMenu menu;
X{
X /* Commented out */
X}
X
X/* ------------------------------------------------------------ */
X
X/*ARGSUSED*/
void RTLMenu_Enter( menu, butnum, buttime, base_window, pos )
RTLMenu menu;
int butnum;
Time buttime;
Window base_window;
RTLPoint pos;
X{
X MenuItem *selected;
X
X Entry("RTLMenu_Enter")
X
X menu_pos = pos;
X selected = TrackMenu ((Menu*) menu, menu_pos.x, menu_pos.y,
X butnum, base_window, buttime);
X if (!ItemIsNull(selected))
X (ItemCallback(selected)) (menu, selected, base_window);
X Leave_void
X}
X/* ------------------------------------------------------------ */
X
RTLPoint RTLMenu_Entry_Pos()
X{
X Entry("RTLMenu_Entry_Pos")
X /* menu_pos is a global static that gets set by the call to */
X /* XQueryPointer that is used by the TrackMenu call. */
X
X Leave(menu_pos)
X}
X
X
void RTLMenu_Generate_Items(menu, proc)
X/* apply VoidFunc proc to each item in the menu, with */
X/* arguments menu and menuItem */
RTLMenu menu;
VoidFunc proc;
X{
X MenuItem *item;
X
X Entry("RTLMenu_Generate_Items")
X
X for (item = MenuItems((Menu*)menu);
X !ItemIsNull(item); item = ItemNext(item))
X {
X (proc)((RTLMenu)menu, (RTLMenuItem)item);
X }
X Leave_void
X}
END_OF_FILE
if test 9320 -ne `wc -c <'awm/menus/rtlmenu.c'`; then
echo shar: \"'awm/menus/rtlmenu.c'\" unpacked with wrong size!
fi
# end of 'awm/menus/rtlmenu.c'
fi
echo shar: End of archive 7 \(of 17\).
cp /dev/null ark7isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked all 17 archives.
rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
echo You still need to unpack the following archives:
echo " " ${MISSING}
fi
## End of shell archive.
exit 0