v03i021: Ardent Window Manager, Patchlevel 9, Part05/12
Mike Wexler
mikew at wyse.wyse.com
Tue Feb 21 08:24:15 AEST 1989
Submitted-by: kmw at ardent (Ken Wallich)
Posting-number: Volume 3, Issue 21
Archive-name: awm2/part05
#! /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 5 (of 12)."
# Contents: Pause.c awm.h menus/track_menu.c
# Wrapped by mikew at wyse on Fri Feb 17 10:50:23 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'Pause.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'Pause.c'\"
else
echo shar: Extracting \"'Pause.c'\" \(3003 characters\)
sed "s/^X//" >'Pause.c' <<'END_OF_FILE'
X
X
X
X#ifndef lint
Xstatic char *rcsid_Pause_c = "$Header: /usr/graph2/X11.3/contrib/windowmgrs/awm/RCS/Pause.c,v 1.2 89/02/07 21:23:15 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 -- M. Gancarz, DEC Ultrix Engineering Group
X * 001 -- Loretta Guarino Reid, DEC Ultrix Engineering Group,
X * Western Software Lab. Convert to X11.
X * 002 -- Jordan Hubbard, Ardent Computer
X * Changes for awm.
X */
X
X#include "awm.h"
X
X/*ARGSUSED*/
XBoolean Pause(window, mask, button, x, y)
XWindow window; /* Event window. */
Xint mask; /* Button/key mask. */
Xint button; /* Button event detail. */
Xint x, y; /* Event mouse position. */
X{
X Entry("Pause")
X
X XGrabServer(dpy);
X Leave(FALSE)
X}
X
X/*ARGSUSED*/
XBoolean Continue(window, mask, button, x, y)
XWindow window; /* Event window. */
Xint mask; /* Button/key mask. */
Xint button; /* Button event detail. */
Xint x, y; /* Event mouse position. */
X{
X Entry("Continue")
X
X XUngrabServer(dpy);
X Leave(FALSE)
X}
END_OF_FILE
if test 3003 -ne `wc -c <'Pause.c'`; then
echo shar: \"'Pause.c'\" unpacked with wrong size!
fi
# end of 'Pause.c'
fi
if test -f 'awm.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'awm.h'\"
else
echo shar: Extracting \"'awm.h'\" \(22317 characters\)
sed "s/^X//" >'awm.h' <<'END_OF_FILE'
X#ifndef lint
Xstatic char *rcsid_awm_h = "$Header: /usr/graph2/X11.3/contrib/windowmgrs/awm/RCS/awm.h,v 1.2 89/02/07 21:24:27 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 -- M. Gancarz, DEC Ultrix Engineering Group
X * 001 -- R. Kittell, DEC Storage A/D May 19, 1986
X * Added global vars for warp options.
X * 002 -- Loretta Guarino Reid, DEC Ultrix Engineering Group,
X * Western Software Lab, Port to X11
X * 003 -- Jordan Hubbard, Ardent Computer
X * Many additional declarations for awm.
X * 1.3 -- Support for WM_STATE (Mike Wexler)
X */
X
X#ifndef AWM_INCLUDE
X#define AWM_INCLUDE
X#include <errno.h>
X#include <stdio.h>
X#include <X11/Intrinsic.h>
X#include <X11/Xatom.h>
X
X#include "menus/rtlmenu.h"
X#include "support.h"
X
X#define MIN(x, y) ((x) <= (y) ? (x) : (y))
X#define MAX(x, y) ((x) >= (y) ? (x) : (y))
X#define VOLUME_PERCENTAGE(x) ((x)*14)
X#define ModMask 0xFF
X#define ButtonMask(b) (((b)==Button1) ? Button1Mask : \
X (((b)==Button2) ? Button2Mask : Button3Mask))
X
X#define DEF_DELTA 1
X#define DEF_FUNC GXcopy
X#define DEF_ICON_BORDER_WIDTH 2
X#define DEF_ICON_PAD 4
X#define DEF_POP_BORDER_WIDTH 2
X#define DEF_POP_PAD 4
X#define DEF_MENU_BORDER_WIDTH 2
X#define DEF_MENU_PAD 4
X#define DEF_GADGET_PAD 3
X#define DEF_GADGET_BORDER 1
X#define DEF_TITLE_PAD 2
X#define DEF_VOLUME 4
X#define DEF_PUSH 5
X#define DEF_BCONTEXT_WIDTH 0
X#define DEF_RAISE_DELAY 100 /* milliseconds */
X#define DEF_MAX_COLORS 0 /* 0 means take as many as we can */
X#ifndef DEF_BCONTEXT_CURSOR
X#define DEF_BCONTEXT_CURSOR XC_plus
X#endif DEF_BCONTEXT_CURSOR
X#ifndef DEF_TITLE_CURSOR
X#define DEF_TITLE_CURSOR XC_left_ptr
X#endif DEF_TITLE_CURSOR
X#ifndef NAME
X#define NAME "awm"
X#endif NAME
X#ifndef CLASS
X#define CLASS "Wm"
X#endif CLASS
X#ifndef DEF_FONT
X#define DEF_FONT "fixed"
X#endif DEF_FONT
X#ifndef DEF_TITLE_FONT
X#define DEF_TITLE_FONT "8x13"
X#endif DEF_TITLE_FONT
X#ifndef DEF_ICON_FONT
X#define DEF_ICON_FONT "8x13"
X#endif DEF_ICON_FONT
X#ifndef DEF_POPUP_FONT
X#define DEF_POPUP_FONT "9x15"
X#endif DEF_POPUP_FONT
X#ifndef DEF_GADGET_FONT
X#define DEF_GADGET_FONT "fixed"
X#endif DEF_GADGET_FONT
X#ifndef DEF_MENU_FONT
X#define DEF_MENU_FONT "8x13"
X#endif DEF_MENU_FONT
X#ifndef DEF_BOLD_FONT
X#define DEF_BOLD_FONT "8x13bold"
X#endif DEF_BOLD_FONT
X#define DEF_MENU_DELTA 20
X#ifndef DEF_NAME
X#define DEF_NAME "NoName" /* for clients w/no name */
X#endif
X
X#define INIT_PTEXT {'0', '0', '0', 'x', '0', '0', '0'}
X
X#ifndef TEMPFILE
X#define TEMPFILE "/tmp/awm.XXXXXX"
X#endif TEMPFILE
X
X#define CURSOR_WIDTH 16
X#define CURSOR_HEIGHT 16
X
X#define MAX_ZAP_VECTORS 8
X#define MAX_BOX_VECTORS 20
X
X#define DRAW_WIDTH 0 /* use fastest hardware draw */
X#define DRAW_VALUE 0xfd
X#define DRAW_FUNC GXxor
X#define DRAW_PLANES 1
X
X#define NOCOLOR -1
X
X/*
X * The first BITS_USED bits of the mask are used to define the most generic
X * types. All other bits are free for storing peripheral information.
X * For now, we use the extra bits to specify which gadget(s) are bound
X * to an action. MAX_GADGETS depends on BITS_USED to determine the maximum
X * number of gadgets possible. If you add a new context type, be sure to
X * increment BITS_USED.
X */
X#define ROOT 0x1
X#define WINDOW 0x2
X#define ICON 0x4
X#define TITLE 0x8
X#define BORDER 0x10
X#define GADGET 0x20
X
X#define BITS_USED 6
X
X/* Window states */
X#define ST_WINDOW 0x1
X#define ST_ICON 0x2
X#define ST_PLACED 0x4
X#define ST_DECORATED 0x8
X
X#define DECORATED(a) (a && (a->state & ST_DECORATED))
X
X/* Window attributes */
X#define AT_NONE 0x0
X#define AT_TITLE 0x1
X#define AT_GADGETS 0x2
X#define AT_RAISE 0x4
X#define AT_BORDER 0x8
X#define AT_INPUT 0x10
X#define AT_ICONLABEL 0x20
X
X/*
X * Gadgets aren't the sort of embellishments that one uses in quantitity
X * (unless one is designing a truly odd interface), so we keep the information
X * in an array instead of using the usual linked list. MAX_GADGETS is a derived
X * macro (see BITS_USED) that is used to determine the size of the
X * Array.
X *
X */
X#define MAX_GADGETS ((sizeof(int) * 8) - BITS_USED)
X
X#ifndef FAILURE
X#define FAILURE 0
X#endif FAILURE
X
X#define NAME_LEN 256L /* Maximum length string names */
X#define EVENTMASK (ButtonPressMask | ButtonReleaseMask)
X
X
X#define DrawBox() XDrawSegments(dpy, RootWindow(dpy, scr),DrawGC,box,num_vectors)
X#define DrawZap() XDrawSegments(dpy, RootWindow(dpy, scr),DrawGC,zap,num_vectors)
X
X#define gray_width 16
X#define gray_height 16
Xextern char gray_bits[];
X
X#define solid_width 16
X#define solid_height 16
Xextern char solid_bits[];
X
X#define xlogo32_width 32
X#define xlogo32_height 32
Xextern char xlogo32_bits[];
X
X/*
X * All one needs to know about an awm managed window.. (so far...)
X */
X#ifdef WMSTATE
X#define WithdrawState 0
X#define NormalState 1
X#define IconicState 3
X
Xtypedef struct {
X int state;
X Window icon;
X} WM_STATE;
X
Xextern Atom wm_state_atom;
X#endif /* WMSTATE */
X
X
Xtypedef struct _awminfo {
X Window title, client, frame, icon; /* Associated windows */
X Window *gadgets; /* associated gadgets */
X char *name; /* The formatted window name */
X Boolean own; /* Do we own the icon window? */
X Pixmap back, bold, iconPixmap; /* background, bold and icon pix */
X Pixmap BC_back, BC_bold; /* BC back and bold pixmaps */
X#ifdef RAINBOW
X /* Per window versions of the globals colours */
X Pixmap grayPixmap, solidPixmap;
X Pixmap iBackPixmap;
X Pixel foreColor, backColor;
X Pixel iBorder;
X Pixel iBackground, iForeground;
X Pixel iTextForeground, iTextBackground;
X#endif
X unsigned int border_width; /* original border width */
X int state; /* The state of the window */
X int attrs; /* Window "attributes" */
X GC winGC; /* GC at proper depth for window */
X#ifdef WMSTATE
X WM_STATE wm_state;
X#endif /* WMSTATE */
X} AwmInfo, *AwmInfoPtr;
X
X/*
X * This whole section has changed substantially. Basically, since all the
X * variables have vanished into the resource manager, the keyword table
X * only needs to keep track of function pointers, boolean pointers and
X * "special" keywords like menu and gagdet. Since some things are still
X * modifiable from menus (only booleans, currently, though this will change),
X * we keep these in the keyword table even though
X * they're no longer directly modifable from the .awmrc
X */
X
X/*
X * Keyword table entry.
X */
Xtypedef struct _keyword {
X char *name;
X int type;
X Boolean *bptr;
X Boolean (*fptr)();
X} Keyword;
X
X/*
X * Keyword table type entry.
X */
X#define IsFunction 1
X#define IsMenuMap 2
X#define IsMenu 3
X#define IsDownFunction 4
X#define IsParser 5
X#define IsQuitFunction 6
X#define IsGadget 7
X#define IsBoolean 8
X#define IsAction 9
X
X/*
X * Button/key binding type.
X */
Xtypedef struct _binding {
X struct _binding *next;
X int context;
X unsigned int mask;
X int button;
X Boolean (*func)();
X char *menuname;
X RTLMenu menu;
X} Binding;
X
X/*
X * Key expression type.
X */
Xtypedef struct _keyexpr {
X char *name;
X int mask;
X} KeyExpr;
X
X/*
X * Context expression type.
X */
Xtypedef struct _contexpr {
X char *name;
X int mask;
X} ContExpr;
X
X/*
X * Button modifier type.
X */
Xtypedef struct _buttonmodifier {
X char *name;
X int mask;
X} ButtonModifier;
X
X/*
X * Gravity expression type.
X */
Xtypedef struct _gravityexpr {
X char *name;
X int mask;
X} GravityExpr;
X
X/*
X * Button modifier mask definitions.
X * bits 13 and 14 unused in key masks, according to X.h
X * steal bit 15, since we don't use AnyModifier
X */
X
X#define DeltaMotion (1<<13)
X#define ButtonUp (1<<14)
X#define ButtonDown AnyModifier
X#define ButtonMods DeltaMotion+ButtonUp+ButtonDown
X
X/*
X * Button and mask redefinitions, for X11
X */
X#define LeftMask Button1Mask
X#define MiddleMask Button2Mask
X#define RightMask Button3Mask
X#define LeftButton Button1
X#define MiddleButton Button2
X#define RightButton Button3
X
X/*
X * Declaration specific information for gadgets. This defines only gadget
X * types, not the actual gadgets. The pixmap member is only used if a pixmap
X * is being displayed. Gravity and offset are purely optional.
X */
X
X#define NoGadgetGravity 0
X#define LeftGadgetGravity 1
X#define RightGadgetGravity 2
X#define CenterGadgetGravity 3
X
Xtypedef struct _gadgetdecl { /* Declaration (type) information */
X unsigned char *name; /* Either text label or pixmap file name */
X unsigned char *data; /* If pixmap file, this is the data from it */
X char *forecolor; /* foreground color for pixmap */
X char *backcolor; /* background color for pixmap */
X XFontStruct *fontInfo; /* font for text */
X int high, wide; /* width and height of pixmap or text */
X int gravity; /* stick to the left or right? */
X int offset; /* offset from previous item */
X} GadgetDecl;
X
X/*
X * MenuInfo data type.
X */
Xtypedef struct _menuinfo {
X char *name; /* Name of this menu. */
X char *pixmapname; /* Name of label pixmap (opt) */
X RTLMenu menu; /* RTL menu handle for destroy */
X struct _actionline *line; /* Linked list of menu items. */
X} MenuInfo;
X
X/*
X * Action Line data type.
X */
Xtypedef struct _actionline {
X struct _actionline *next; /* Pointer to next line. */
X char *name; /* Name of this line. */
X char *pixmapname; /* Name of the backing pixmap (opt) */
X int type; /* IsShellCommand, IsText, IsTextNL... */
X RTLMenuItem item; /* RTL item handle */
X char *text; /* Text string to be acted upon. */
X Boolean (*func)(); /* Window manager function to be invoked. */
X} ActionLine;
X
X/*
X * ActionLine->type definitions.
X */
X#define IsShellCommand 1
X#define IsText 2
X#define IsTextNL 3
X#define IsUwmFunction 4
X#define IsMenuFunction 5
X#define IsImmFunction 6 /* Immediate (context-less) function. */
X#define IsVar 7 /* we're setting a boolean variable */
X
X/*
X * Menu Link data type. Used by the parser when creating a linked list
X * of menus.
X */
Xtypedef struct _menulink {
X struct _menulink *next; /* Pointer to next MenuLink. */
X struct _menuinfo *menu; /* Pointer to the menu in this link. */
X} MenuLink;
X
X/*
X * External variable definitions.
X */
Xextern int errno;
Xextern Window Pop; /* Pop-up dimension display window. */
Xextern Window Frozen; /* Contains window id of "gridded" window. */
Xextern XFontStruct *IFontInfo; /* Icon text font information. */
Xextern XFontStruct *PFontInfo; /* Pop-up text font information. */
Xextern XFontStruct *TFontInfo; /* Title text font information. */
Xextern XFontStruct *TFontBoldInfo;/* Title text (bold) font information. */
Xextern XFontStruct *GFontInfo; /* Gadget box text font */
Xextern XFontStruct *MFontInfo; /* Menu font */
Xextern XFontStruct *MBoldFontInfo;/* Menu bold font */
Xextern Pixmap GrayPixmap; /* Gray pixmap. */
Xextern Pixmap SolidPixmap;
Xextern Pixmap IBackPixmap; /* Icon window background pixmap. */
Xextern Pixmap IDefPixmap; /* Icon pixmap for twm style icons */
Xextern char *BForeground; /* Border Context (pixmap) foreground pixel */
Xextern char *BBackground; /* Border Context (pixmap) background pixel */
Xextern char *WBorder; /* Window border pixel */
Xextern char *TTextForeground; /* Title text foreground pixel */
Xextern char *TTextBackground; /* Title text background pixel */
Xextern char *TForeground; /* Title (pixmap) foreground pixel */
Xextern char *TBackground; /* Title (pixmap) background pixel */
Xextern char *Foreground; /* default forground color (text) */
Xextern char *Background; /* default background color (text) */
Xextern Pixel IBorder; /* Icon window border pixel. */
Xextern Pixel ITextForeground; /* Icon window text forground color. */
Xextern Pixel ITextBackground; /* Icon window text background color. */
Xextern Pixel IForeground; /* Icon pixmap foreground color */
Xextern Pixel IBackground; /* Icon pixmap background color */
Xextern Pixel PForeground; /* Pop-up window forground color. */
Xextern Pixel PBackground; /* Pop-up window background color. */
Xextern Pixel PBorder; /* Pop-Up Window border pixel. */
Xextern Pixel ForeColor; /* default foreground color */
Xextern Pixel BackColor; /* default background color */
Xextern Pixel MBorder; /* Menu border color */
Xextern Pixel MForeground; /* Menu foreground color */
Xextern Pixel MBackground; /* Menu background color */
Xextern Cursor ArrowCrossCursor; /* Arrow cross cursor. */
Xextern Cursor TextCursor; /* Text cursor used in icon windows. */
Xextern Cursor IconCursor; /* Icon Cursor. */
Xextern Cursor LeftButtonCursor; /* Left button main cursor. */
Xextern Cursor MiddleButtonCursor;/* Middle button main cursor. */
Xextern Cursor RightButtonCursor;/* Right button main cursor. */
Xextern Cursor TargetCursor; /* Target (select-a-window) cursor. */
Xextern Cursor TitleCursor; /* Title bar cursor */
Xextern Cursor FrameCursor; /* Frame cursor */
Xextern Cursor GumbyCursor; /* Used in icons if not type-in */
Xextern unsigned int GadgetBorder; /* Width of gadget borders */
Xextern int ScreenWidth; /* Display screen width. */
Xextern int ScreenHeight; /* Display screen height. */
Xextern int TitleHeight; /* Height in pixels of title bar(s) */
Xextern int titleHeight; /* Derived height of title bar(s) */
Xextern int gadgetHeight; /* Height of highest gadget */
Xextern int NameOffset; /* Offset for window name */
Xextern int IBorderWidth; /* Icon window border width. */
Xextern int PWidth; /* Pop-up window width (including borders). */
Xextern int PHeight; /* Pop-up window height (including borders). */
Xextern unsigned int PBorderWidth; /* Pop-up window border width. */
Xextern int PPadding; /* Pop-up window padding. */
Xextern int Delta; /* Mouse movement slop. */
Xextern int HIconPad; /* Icon horizontal padding. */
Xextern int VIconPad; /* Icon vertical padding. */
Xextern int Pushval; /* Number of pixels to push window by. */
Xextern int BContext; /* Width of border context area in pixels */
Xextern int RaiseDelay; /* Delay in milliseconds before autoraising windows */
Xextern int Volume; /* Audible alarm volume. */
Xextern int NumGadgets; /* Number of gadgets used */
Xextern int GadgetPad; /* Padding between gadgets */
Xextern int TitlePad; /* Title text padding */
Xextern int status; /* Routine return status. */
Xextern int MPad; /* menu padding */
Xextern int MDelta; /* Menu subitem delta */
Xextern int MBorderWidth; /* Menu border width */
Xextern int MItemBorder; /* Menu item border width */
Xextern unsigned int BCursor; /* Border context cursor */
Xextern unsigned int TCursor; /* Title context cursor */
Xextern MenuLink *Menus; /* Linked list of menus. */
Xextern GC IconGC; /* graphics context for icon */
Xextern GC PopGC; /* graphics context for pop */
Xextern GC DrawGC; /* graphics context for zap */
X
Xextern Boolean Autoraise; /* Raise window on input focus? */
Xextern Boolean Autoselect; /* Warp mouse to default menu selection? */
Xextern Boolean Borders; /* Display border context areas? */
Xextern Boolean ConstrainResize; /* Don't resize until pointer leaves window */
Xextern Boolean Freeze; /* Freeze server during move/resize? */
Xextern Boolean Grid; /* Should the m/r box contain a 9 seg. grid. */
Xextern Boolean Hilite; /* Should we highlight titles on focus? */
Xextern Boolean BorderHilite; /* Should we highlight borders on focus? */
Xextern Boolean FrameFocus; /* Should frame be considered part of window */
Xextern Boolean ShowName; /* Display names in title bars */
Xextern Boolean NWindow; /* Normalize windows? */
Xextern Boolean NIcon; /* Normalize icons? */
Xextern Boolean RootResizeBox; /* Should resize box obscure window? */
Xextern Boolean InstallColormap; /* Install colormap for clients? */
Xextern Boolean Push; /* Relative=TRUE, Absolute=FALSE. */
Xextern Boolean ResizeRelative; /* Relative=TRUE, Absolute=FALSE. */
Xextern Boolean Reverse; /* Reverse video? */
Xextern Boolean SaveUnder; /* Save unders? */
Xextern Boolean Snatched; /* We're in the middle of an no-highlight/raise op */
Xextern Boolean Titles; /* Title bars on windows? */
Xextern Boolean IconLabels; /* Labels on pixmap icons? (twm style) */
Xextern Boolean ILabelTop; /* label top of icon? */
Xextern Boolean PushDown; /* Down=TRUE, Up=FALSE */
Xextern Boolean UseGadgets; /* Gadget boxes in title bars? */
Xextern Boolean Wall; /* Don't allow windows past edges of screen */
Xextern Boolean WarpOnRaise; /* Warp to upper right corner on raise. */
Xextern Boolean WarpOnIconify; /* Warp to icon center on iconify. */
Xextern Boolean WarpOnDeIconify; /* Warp to upper right corner on de-iconify. */
Xextern Boolean Zap; /* Should the the zap effect be used. */
Xextern Boolean FocusSetByUser; /* True if f.focus called */
Xextern Boolean FocusSetByWM; /* True if awm set the focus */
X
Xextern char PText[]; /* Pop-up window dummy text. */
Xextern int PTextSize; /* Pop-up window dummy text size. */
X
Xextern int Lineno; /* Line count for parser. */
Xextern Boolean Startup_File_Error; /* Startup file error flag. */
Xextern char Startup_File[]; /* Startup file name. */
Xextern char *IFontName; /* Icon font name. */
Xextern char *PFontName; /* Pop-up font name. */
Xextern char *TFontName; /* Title font name. */
Xextern char *GFontName; /* Gadget font name */
Xextern char *TFontBoldName; /* Bold Title font name. */
Xextern char *TBoldPixmapName; /* Title (highlighted) pixmap file */
Xextern char *TBackPixmapData; /* Bitmap data file title background */
Xextern char *TBoldPixmapData; /* ditto, except highlighted */
Xextern char *BBackPixmapData; /* Border Context area background pixmap data */
Xextern char *BBoldPixmapData; /* Border Context bold pixmap data */
Xextern char *awmPath; /* Pathlist for pixmap files */
Xextern char **Argv; /* Pointer to command line parameters. */
Xextern char **Environ; /* Pointer to environment. */
X
Xextern char *DefaultBindings[]; /* Default bindings string array. */
Xextern Keyword KeywordTable[]; /* Keyword lookup table. */
Xextern Binding *Blist; /* Button/key bindings list. */
Xextern KeyExpr KeyExprTbl[]; /* Key expression table. */
Xextern ContExpr ContExprTbl[]; /* Context expression table. */
Xextern ButtonModifier ButtModTbl[];/* Button modifier table. */
Xextern GravityExpr GravityExprTbl[]; /* Gravity expression table. */
X
Xextern GadgetDecl **Gadgets; /* Gadgets declared. See gram.y */
Xextern int scr;
Xextern Display *dpy; /* Display info pointer. */
X
X#ifdef PROFIL
Xint ptrap();
X#endif
X
X/*
X * External routine typing.
X */
Xextern Boolean Beep();
Xextern Boolean CircleDown();
Xextern Boolean CircleUp();
Xextern Boolean Continue();
Xextern Boolean Focus();
Xextern Boolean UnFocus();
Xextern Boolean GetButton();
Xextern Boolean Iconify();
Xextern Boolean Lower();
Xextern Boolean DoMenu();
Xextern Boolean DoAction();
Xextern Boolean Lock();
Xextern Boolean Move();
Xextern Boolean MoveOpaque();
Xextern Boolean Neaten();
Xextern Boolean NewIconify();
Xextern Boolean Pause();
Xextern Boolean ShoveDown();
Xextern Boolean ShoveLeft();
Xextern Boolean ShoveRight();
Xextern Boolean ShoveUp();
Xextern Boolean Quit();
Xextern Boolean Raise();
Xextern Boolean Redraw();
Xextern Boolean Refresh();
Xextern Boolean ResetBindings();
Xextern Boolean ResetMenus();
Xextern Boolean ResetGadgets();
Xextern Boolean Resize();
Xextern Boolean Restart();
Xextern Boolean FDecorate();
Xextern Boolean FNoDecorate();
Xextern Boolean DestroyClient();
Xextern Boolean GetBoolRes();
Xextern Boolean ConfigureWindow();
Xextern int StoreCursors();
Xextern int StoreBox();
Xextern int StoreTitleBox();
Xextern int StoreGridBox();
Xextern int StoreTitleGridBox();
Xextern int StoreZap();
Xextern int Error();
Xextern int XError();
Xextern int GetIntRes();
Xextern Window Reparent(), Decorate();
Xextern unsigned char *expand_metachars();
Xextern char *stash();
Xextern char *GetIconName();
Xextern char *expand_from_path();
Xextern char *GetStringRes();
Xextern char *GetPixmapDataRes();
Xextern Pixmap GetPixmapRes();
Xextern Pixel GetColorRes();
Xextern Pixel GetPixel();
Xextern XFontStruct *GetFontRes();
Xextern Drawable GetPixmapFromCache();
Xextern AwmInfoPtr GetAwmInfo();
Xextern AwmInfoPtr RegisterWindow();
Xextern AwmInfoPtr IsTitled();
Xextern AwmInfoPtr IsGadgetWin();
X
Xextern void Init_Titles(), Init_Frames();
Xextern void NoDecorate();
Xextern void PaintTitle();
Xextern void SetBorderPixmaps();
Xextern void FreePixmapFromCache();
X
X#ifdef NEATEN
X#define DEFAULT_ABS_MIN 64
X#define SEPARATION 2
X#define DEF_PRIMARY_PLACEMENT "Top"
X#define DEF_SECONDARY_PLACEMENT "Left"
X
Xextern int AbsMinWidth;
Xextern int AbsMinHeight;
Xextern Boolean RetainSize;
Xextern Boolean KeepOpen;
Xextern Boolean Fill;
Xextern Boolean UsePriorities;
Xextern Boolean FixTopOfStack;
Xextern char *PrimaryIconPlacement;
Xextern char *SecondaryIconPlacement;
X#endif NEATEN
X#endif AWM_INCLUDE
END_OF_FILE
if test 22317 -ne `wc -c <'awm.h'`; then
echo shar: \"'awm.h'\" unpacked with wrong size!
fi
# end of 'awm.h'
fi
if test -f 'menus/track_menu.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'menus/track_menu.c'\"
else
echo shar: Extracting \"'menus/track_menu.c'\" \(26567 characters\)
sed "s/^X//" >'menus/track_menu.c' <<'END_OF_FILE'
X
X#ifndef lint
X static char sccs_id[] = "@(#)track_menu.c 2.1 12/16/87 Siemens Corporate Research and Support, Inc.";
X#endif
X
X
X#include "X11/copyright.h"
X
X/*
X RTL Menu Package Version 1.0
X by Joe Camaratta and Mike Berman, Siemens RTL, Princeton NJ, 1987
X
X track_menu.c: bring up menus and track the mouse
X */
X
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
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/*
X * The menu package will break if you don't define this, but
X * it's there in case you want to see just how and where the
X * "eventstack" stuff is used and, if necessary, replace it.
X */
X#define SAVE_EVENTS
X
X
X#include <stdio.h>
X#include "X11/Xlib.h"
X#include "X11/cursorfont.h"
X#include "arrow_icon.h"
X#include "null_icon.h"
X#include "menu.h"
X#include "menu.def.h"
X#include "menu.ext.h"
X#include "dbug.h"
X#ifdef SAVE_EVENTS
X#include "eventstack.h"
X#endif
X
X#define MIN(x,y) (((x) <= (y))? x:y)
X#define MAX(x,y) (((x) >= (y))? x:y)
X
X#define CLICK_TIME 290 /* in milliseconds */
X
X#define CursorLockMask (ButtonReleaseMask | ExposureMask)
X
X/* Event macros */
X
X#define EventGetXCoord(rep) ((rep).xmotion.x)
X#define EventGetYCoord(rep) ((rep).xmotion.y)
X#define EventType(rep) ((rep).type)
X#define EventXWindow(rep) ((rep).xcrossing.window)
X#define EventXTime(rep) ((rep).xcrossing.time)
X#define EventXMode(rep) ((rep).xcrossing.mode)
X#define EventXRootX(rep) ((rep).xcrossing.x_root)
X#define EventXRootY(rep) ((rep).xcrossing.y_root)
X#define EventXDetail(rep) ((rep).xcrossing.detail)
X#define EventMWindow(rep) ((rep).xmotion.window)
X#define EventMTime(rep) ((rep).xmotion.time)
X#define EventButton(rep) ((rep).xbutton.button)
X#define EventBWindow(rep) ((rep).xbutton.window)
X#define EventBTime(rep) ((rep).xbutton.time)
X#define EventEX(rep) ((rep).xexpose.x)
X#define EventEY(rep) ((rep).xexpose.y)
X#define EventEWidth(rep) ((rep).xexpose.width)
X#define EventEHeight(rep) ((rep).xexpose.height)
X#define PointerEvent(rep) \
X ((EventType(rep) == ButtonPress) || \
X (EventType(rep) == ButtonRelease) || \
X (EventType(rep) == MotionNotify) || \
X (EventType(rep) == EnterNotify) || \
X (EventType(rep) == LeaveNotify) || \
X (EventType(rep) == FocusIn) || \
X (EventType(rep) == FocusOut))
X#define KeyEvent(rep) \
X ((EventType(rep) == KeyPress) || (EventType(rep) == KeyRelease))
X/* Possible states for the state machine */
Xtypedef enum
X{
X Initial, /* Inside a submenu, but not any item */
X CheckTrigger, /* Inside an item that has submenu, checking for pullright */
X Leaf, /* Inside an item with no submenu */
X Exit, /* Preparing to exit */
X LevelControl /* Not in any submenu, waiting to enter something */
X } State;
X
XState InitialState(), CheckTriggerState(), LeafState(), LevelControlState(),
X GetItemState();
XBoolean EventNotSignificant(), PushSubmenu();
X
Xvoid OutputEvent(), GetNextSignificantEvent(), PopSubmenu(),
X Highlight(), Unhighlight(), DisplayInitialMenus(), LockCursor(),
X TossExtraMoves(), UnlockCursor();
X
Xvoid ProcessExposeEvents();
X
Xvoid SaveTest();
X
XMenuItem *MenuGetItem();
XMenu *MenuGetMenu();
X
X/* global state variables */
X
Xstatic MenuItem *current_item;
Xstatic Menu *current_menu;
Xstatic Window root_window;
Xextern Display *dpy;
Xextern int scr;
Xstatic int level; /* submenu level */
Xstatic Time button_time; /* time button press invoked */
Xstatic Cursor wait_cursor = None; /* empty cursor for lock state */
Xstatic Boolean click_allowed;
Xstatic Boolean lock_event_mask, unlock_event_mask;
X
Xextern Boolean Autoselect;
Xextern int MDelta;
X
X#ifdef SAVE_EVENTS
Xstatic struct Ev_q *ev_save = 0;
X#endif
X
X
XMenuItem *TrackMenu(root_menu, root_x, root_y,
X init_button, root, buttime)
XMenu *root_menu; /* Pointer to root menu requested to pop up */
Xint root_x, root_y; /* Position to start menu */
Xint init_button; /* The # of button used to pop up menu */
XWindow root; /* Window label for parent of menu */
XTime buttime; /* timestamp for button (or 0, if CLICK == 0) */
X{
X State CurrentState = LevelControl;
X XEvent Event_Reply;
X int open_x;
X Boolean selected = FALSE;
X MenuItem *selected_item;
X
X Entry("TrackMenu")
X
X /* Initialize globals */
X
X button_time = buttime;
X root_window = root;
X level = 0;
X current_menu = root_menu;
X click_allowed = (TestOptionFlag(current_menu, clickokay))? TRUE : FALSE;
X unlock_event_mask = (TestOptionFlag(current_menu, savebits))?
X MenuEventMask : (MenuEventMask | ExposureMask);
X lock_event_mask = (TestOptionFlag(current_menu, savebits))?
X CursorLockMask : (CursorLockMask | ExposureMask);
X
X /* If not already done, set up the null cursor for lock state */
X if (wait_cursor == None)
X {
X Pixmap wc_pixmap;
X XColor fg, bg;
X
X wc_pixmap = XCreateBitmapFromData (dpy, root_window,
X null_icon_bits,
X null_icon_width, null_icon_height);
X wait_cursor = XCreatePixmapCursor (dpy, wc_pixmap, wc_pixmap,
X &fg, &bg, 1, 1);
X }
X
X
X /* Block all other action by grabbing the server */
X /* XGrabServer (dpy); */
X /* Don't think we need to grab the server... so for now, we won't */
X
X#ifdef SAVE_EVENTS
X /* Get the present state, so it can be restored later */
X /* Any events on the queue when we start get saved now, restored later */
X SaveEvents (dpy, &ev_save, ~(unsigned long) ButtonReleaseMask);
X#endif
X
X LockCursor(root_window);
X if (!(current_item =
X Display_Menu(current_menu, NULLMENU, root_x, root_y)))
X {
X CurrentState = Exit;
X }
X /*
X * First item is a label and autoselect is on, so we want
X * to push on to the first "real" item.
X */
X if (ItemIsDeaf(current_item) && Autoselect)
X current_item = current_item->nextItem;
X LockCursor(ItemWindow(current_item));
X open_x = root_x;
X
X /* Push to appropriate previous item, if any */
X while (MenuHasInitialItem(current_menu) && (CurrentState != Exit))
X {
X current_item = GetInitialItem(current_menu);
X ClearInitialItem(current_menu);
X
X /* if the initial item can't be selected, take first in list */
X if (ItemIsNull(current_item) || ItemIsDisabled(current_item))
X {
X current_item = MenuItems(current_menu);
X break;
X }
X else if (ItemIsLeaf(current_item)) /* then we're done */
X break;
X else
X {
X open_x += ItemGetArrowPosition(current_item);
X if (!ItemIsDeaf(current_item))
X Highlight(current_item);
X TossExtraMoves(ItemWindow(current_item));
X (void)PushSubmenu(open_x);
X }
X }
X ProcessExposeEvents();
X if (CurrentState != Exit)
X CurrentState = (ItemIsLeaf(current_item)) ? Leaf : CheckTrigger;
X if (!ItemIsDeaf(current_item))
X Highlight(current_item);
X XSync (dpy, 0); /* get release click, if it's in queue */
X#ifdef SAVE_EVENTS
X DisposeEvents(dpy, (PointerMotionMask | EnterWindowMask |
X LeaveWindowMask | ExposureMask));
X#endif
X LockCursor(ItemWindow(current_item));
X PlacePointer(current_menu,current_item);
X UnlockCursor();
X
X /* State Machine */
X
X while (CurrentState != Exit)
X {
X GetNextSignificantEvent(&Event_Reply, init_button);
X switch (CurrentState)
X {
X case LevelControl:
X CurrentState = LevelControlState(Event_Reply);
X break;
X case Initial:
X CurrentState = InitialState(Event_Reply);
X break;
X case CheckTrigger:
X CurrentState = CheckTriggerState(Event_Reply);
X break;
X case Leaf:
X CurrentState = LeafState(Event_Reply, &selected);
X break;
X default:
X Retch("(RTLmenu) YOW! Unknown State! (%d)\n",
X CurrentState);
X CurrentState = Exit;
X break;
X }
X }
X /* Clean up and exit */
X
X selected_item = (selected)? current_item : NULLITEM;
X while (level)
X {
X if (selected)
X SetInitialItem(current_menu, current_item);
X PopSubmenu();
X }
X if (selected)
X {
X SetInitialItem(current_menu, current_item);
X }
X
X Undisplay_Menu(current_menu);
X UnlockCursor();
X XUngrabPointer(dpy, CurrentTime);
X
X /* Throw out any left over events from menu world */
X /* if (TestOptionFlag(current_menu, savebits)) {
X XSync(dpy,1);
X XUngrabServer(dpy, CurrentTime); add this if grab added!
X }
X else
X XSync(dpy,0);*/
X
X /* Push back any events that were lying around when menus started */
X
X XFlush(dpy);
X#ifdef SAVE_EVENTS
X DisposeEvents(dpy, (PointerMotionMask | EnterWindowMask |
X LeaveWindowMask | ExposureMask));
X RestoreEvents(dpy, &ev_save);
X#endif
X Leave(selected_item)
X}
X
X/* Used for debugging */
X
Xvoid OutputEvent(Event_Reply)
XXEvent Event_Reply;
X{
X Entry("OutputEvent")
X
X switch (EventType(Event_Reply))
X {
X case ButtonPress:
X case ButtonRelease:
X DBUG_5("RTLmenu","Button Press/Release, button %d on window %d at time %d\n",
X EventButton(Event_Reply), EventBWindow(Event_Reply),
X EventBTime(Event_Reply));
X break;
X case MotionNotify:
X DBUG_5("RTLmenu","Motion Notify on window %d at time %d, x=%d\n",
X EventMWindow(Event_Reply), EventMTime(Event_Reply),
X EventGetXCoord(Event_Reply));
X break;
X case EnterNotify:
X DBUG_4("RTLmenu","Enter Notify on window %d at time %d\n",
X EventXWindow(Event_Reply), EventXTime(Event_Reply));
X break;
X case LeaveNotify:
X DBUG_4("RTLmenu","Leave Notify on window %d at time %d\n",
X EventXWindow(Event_Reply), EventXTime(Event_Reply));
X break;
X default:
X DBUG_3("RTLmenu","Unexpected event type %d\n", EventType(Event_Reply));
X break;
X }
X Leave_void
X}
X
Xstatic Boolean locked = FALSE;
X
X/* Lock the cursor: make it disappear, and ignore events it generates. */
X/* Optionally, confine it to a single window. */
X/* (Using "None" for confine_window doesn't confine it. ) */
Xvoid LockCursor(confine_window)
XWindow confine_window;
X{
X int result;
X
X Entry("LockCursor")
X
X locked = TRUE;
X result = XGrabPointer(dpy,
X RootWindow(dpy, MenuScreen(current_menu)),
X True, lock_event_mask, GrabModeSync,
X GrabModeAsync, confine_window,
X wait_cursor, CurrentTime);
X DBUG_3("RTLmenu","Lock Cursor grab = %d\n",result);
X Leave_void
X}
X
X/* Unlock (and unconfine) the cursor. If cursor lock is not set, */
X/* this does nothing. */
X
Xvoid UnlockCursor()
X{
X int result;
X
X Entry("UnlockCursor")
X
X if (locked)
X {
X locked = FALSE;
X result = XGrabPointer(dpy,
X RootWindow(dpy, MenuScreen(current_menu)),
X True, unlock_event_mask,
X GrabModeAsync, GrabModeAsync, None,
X MenuCursor(current_menu), CurrentTime);
X DBUG_3("RTLmenu","Unlock Cursor grab = %d\n",result);
X }
X Leave_void
X}
X
X/* Keep getting the X events, until finding one that may be interesting */
X/* to the operation of the state machine. */
X
Xvoid GetNextSignificantEvent(Event_Reply,init_button)
XXEvent *Event_Reply;
Xint init_button; /* the button that initiated the menu */
X{
X XEvent Next_Event_Reply;
X Boolean InsignificantEvent = True;
X
X Entry("GetNextSignificantEvent")
X
X /* Loop as long as any of a number of "insignificant" events */
X /* are found; when the event no longer matches one of the tests, */
X /* it is assumed to be "significant" and returned.*/
X do
X {
X XNextEvent(dpy, Event_Reply);
X DBUG_EXECUTE("RTLmenu", OutputEvent(*Event_Reply));
X
X /* If this event is an "enter", check whether there is a */
X /* "leave" for the same window already in the queue, */
X /* immediately following it; if so, throw them both out */
X /* and get the next event */
X /* NOTE: might try to look further ahead, but this is */
X /* tricky because other events might intervene. */
X
X if ((EventType(*Event_Reply) == EnterNotify) &&
X (EventXMode(*Event_Reply) == NotifyNormal) &&
X (QLength(dpy) > 0) &&
X (MenuGetMenu(current_menu, EventXWindow(*Event_Reply))
X != current_menu))
X {
X XPeekEvent(dpy, &Next_Event_Reply);
X if ((EventType(Next_Event_Reply) == LeaveNotify) &&
X (EventXMode(Next_Event_Reply) == NotifyNormal) &&
X (EventXWindow(Next_Event_Reply) == EventXWindow(*Event_Reply)))
X {
X DBUG_2("RTLmenu","TOSS: Enter/leave pair.\n");
X XNextEvent(dpy, Event_Reply);
X XNextEvent(dpy, Event_Reply);
X }
X }
X#ifdef SAVE_EVENTS
X if (EventNotSignificant(*Event_Reply, init_button))
X {
X if (!(PointerEvent(*Event_Reply) || KeyEvent(*Event_Reply)
X || EventType(*Event_Reply) == Expose))
X {
X /* might be significant elsewhere -- save it for later */
X AddEventToStore(&ev_save, *Event_Reply);
X }
X }
X else
X#else
X if (!EventNotSignificant(*Event_Reply, init_button))
X#endif
X InsignificantEvent = FALSE;
X }
X while (InsignificantEvent);
X
X DBUG_2("RTLmenu","--->");
X Leave_void
X}
X
X/* Check whether the event matches one of the events considered */
X/* "not significant".*/
XBoolean EventNotSignificant(Event_Reply, init_button)
XXEvent Event_Reply;
Xint init_button;
X{
X Entry("EventNotSignificant")
X
X /* Insignificant if not in following list */
X Leave(!((EventType(Event_Reply) == ButtonRelease) ||
X (EventType(Event_Reply) == ButtonPress) ||
X (EventType(Event_Reply) == MotionNotify) ||
X (EventType(Event_Reply) == EnterNotify) ||
X (EventType(Event_Reply) == Expose) ||
X (EventType(Event_Reply) == LeaveNotify))
X ||
X /* Insignificant if leave or enter is not "Normal" */
X (((EventType(Event_Reply) == LeaveNotify) ||
X (EventType(Event_Reply) == EnterNotify)) &&
X (EventXMode(Event_Reply) != NotifyNormal))
X ||
X /* Insignificant if hit button other than initial one */
X ((EventType(Event_Reply) == ButtonRelease) &&
X (EventButton(Event_Reply) != init_button))
X ||
X /* Insignificant if tail end of a click -- and clicks allowed */
X (click_allowed &&
X (EventType(Event_Reply) == ButtonRelease) &&
X (EventBTime(Event_Reply) - button_time < CLICK_TIME))
X )
X}
X
XState LevelControlState(rep)
XXEvent rep;
X{
X State next_state;
X Menu *entered_menu;
X MenuItem *entered_item;
X
X Entry("LevelControlState")
X switch (EventType(rep))
X {
X case MotionNotify:
X case LeaveNotify:
X next_state = LevelControl; /* loop back to this state */
X break;
X case EnterNotify:
X /* Decide whether we've entered a menu window or item window */
X entered_menu = MenuGetMenu(current_menu, EventXWindow(rep));
X entered_item = MenuGetItem(current_menu,EventXWindow(rep));
X
X if ((MenuIsNull(entered_menu)) && (ItemIsNull(entered_item)))
X /* Must be some other window; carry on */
X next_state = LevelControl;
X else if (!ItemIsNull(entered_item) &&
X MenuIsDisplayed(ItemMenu(entered_item)))
X {
X /* we entered an item, but not a window. This should only happen */
X /* when we stayed in the parent of the current submenu. So, */
X /* Pop that submenu and get to the item. */
X if (level)
X {
X LockCursor(ItemWindow(entered_item));
X PopSubmenu();
X ProcessExposeEvents();
X UnlockCursor();
X current_item = entered_item;
X Highlight(current_item);
X next_state = GetItemState(rep);
X }
X else
X {
X Retch("(RTLmenu) Tried to pop the root menu...\n");
X next_state = Exit;
X }
X }
X
X else if (!MenuIsNull(entered_menu)&&
X MenuIsDisplayed(entered_menu))
X {
X /* entered a menu that is displayed */
X while ((current_menu != entered_menu) && level)
X /* drop down the menu that was entered */
X PopSubmenu();
X ProcessExposeEvents();
X UnlockCursor();
X if (current_menu == entered_menu)
X next_state = Initial;
X else
X {
X next_state = Exit;
X Retch("(RTLmenu) Couldn't find the menu I entered!!\n");
X }
X }
X else
X next_state = LevelControl;
X break;
X case ButtonRelease:
X next_state = Exit;
X break;
X default:
X Retch("RTLmenu","YOW! Unexpected event! (%d)\n", rep.type);
X next_state = Exit;
X break;
X }
X Leave(next_state)
X}
X
X/* Figure out the status of the item we've just entered */
XState GetItemState(rep)
XXEvent rep;
X{
X int open_x;
X State next_state;
X
X Entry("GetItemState")
X if (ItemIsNull(current_item))
X {
X Retch("(RTLmenu) null current item!");
X next_state = Exit;
X }
X else if (MenuIsNull(current_menu))
X {
X Retch("(RTLmenu) null current menu!");
X next_state = Exit;
X }
X else if (ItemIsLeaf(current_item))
X {
X if (MenuHasInitialItem(current_menu))
X ClearInitialItem(current_menu);
X next_state = Leaf;
X }
X else if (EventGetXCoord(rep) >= (int)(ItemGetArrowPosition(current_item) - 4))
X {
X /* entered item in "auto pop-up zone", i.e., over pull-right arrow. */
X LockCursor(ItemWindow(current_item));
X TossExtraMoves(ItemWindow(current_item));
X if (PushSubmenu(EventXRootX(rep)))
X {
X LockCursor(ItemWindow(current_item));
X PlacePointer(current_menu, current_item);
X next_state = Initial;
X ProcessExposeEvents();
X }
X else
X next_state = CheckTrigger;
X UnlockCursor();
X }
X else if (MenuHasInitialItem(current_menu))
X {
X /* Entered menu has initial item -- move to it */
X DBUG_2("RTLmenu","Pushing for initial item.");
X current_item = GetInitialItem(current_menu);
X open_x = ItemGetArrowPosition(current_item) +
X EventXRootX(rep);
X ClearInitialItem(current_menu);
X LockCursor(ItemWindow(current_item));
X if (PushSubmenu(open_x))
X {
X ProcessExposeEvents();
X LockCursor(ItemWindow(current_item));
X PlacePointer(current_menu, current_item);
X next_state = Initial;
X }
X UnlockCursor();
X }
X else /* parent pull */
X next_state = CheckTrigger;
X Leave(next_state)
X}
X
XState InitialState( rep)
XXEvent rep;
X{
X State next_state;
X
X Entry("Initial")
X switch (EventType(rep))
X {
X case EnterNotify:
X if (MenuIsNull(current_menu))
X {
X Retch("(RTLmenu) null current menu!?!?");
X next_state = Exit;
X }
X else if (EventXDetail(rep) == NotifyInferior)
X next_state = Initial;
X else
X {
X current_item = MenuGetItem(current_menu, EventXWindow(rep));
X if (ItemIsNull(current_item))
X {
X /* Retch("(RTLmenu) Window entered not an item!\n"); */
X next_state = Initial;
X }
X else
X {
X Highlight(current_item);
X next_state = GetItemState(rep);
X }
X }
X break;
X case LeaveNotify:
X /* Decide whether we're actually leaving */
X /* this menu for another submenu or the root, */
X /* or going into an item. */
X next_state = (EventXDetail(rep) == NotifyInferior)?
X Initial : LevelControl;
X break;
X case ButtonRelease:
X next_state = Exit;
X break;
X case MotionNotify:
X next_state = Initial;
X break;
X default:
X Retch("(RTLmenu) YOW! Unexpected event! (%d)\n", rep.type);
X next_state = Exit;
X break;
X }
X Leave(next_state)
X}
X
X#define NotSet -1
X/* Look to see if pull-right is requested */
XState CheckTriggerState(rep)
XXEvent rep;
X{
X State next_state = CheckTrigger;
X static int Trigger = NotSet;
X static int OldX, NewX, childX, button;
X
X Entry("CheckTrigger")
X if (MenuIsNull(current_menu) || ItemIsNull(current_item))
X {
X Retch("(RTLmenu) Null menu or item...");
X next_state = Exit;
X goto exit;
X }
X if (Trigger == NotSet) /* set it */
X {
X Trigger = MIN(EventGetXCoord(rep) + MenuDelta(current_menu),
X ItemGetArrowPosition(current_item));
X NewX = NotSet;
X }
X switch (EventType(rep))
X {
X case LeaveNotify:
X next_state = Initial;
X Unhighlight(MenuGetItem(current_menu, EventXWindow(rep)));
X Trigger = NotSet;
X break;
X case ButtonRelease:
X next_state = Exit;
X Trigger = NotSet;
X break;
X
X case ButtonPress:
X button = rep.xbutton.button;
X while (TRUE) {
X XNextEvent(dpy, &rep);
X if (rep.type == ButtonRelease &&
X rep.xbutton.button == button)
X break;
X }
X next_state = CheckTrigger;
X childX = TestOptionFlag(current_menu, fixedchild) ?
X (MenuX(current_menu) + ItemGetArrowPosition(current_item)) :
X EventXRootX(rep);
X Trigger = NotSet;
X if (PushSubmenu(childX))
X {
X next_state = LevelControl;
X ProcessExposeEvents();
X LockCursor(ItemWindow(current_item));
X PlacePointer(current_menu, current_item);
X }
X UnlockCursor();
X break;
X
X case MotionNotify:
X next_state = CheckTrigger;
X OldX = NewX;
X NewX = EventGetXCoord(rep);
X if (NewX >= Trigger)
X {
X LockCursor(ItemWindow(current_item));
X childX = TestOptionFlag(current_menu, fixedchild)?
X (MenuX(current_menu) + ItemGetArrowPosition(current_item)):
X EventXRootX(rep);
X Trigger = NotSet;
X if (PushSubmenu(childX))
X {
X next_state = LevelControl;
X ProcessExposeEvents();
X LockCursor(ItemWindow(current_item));
X PlacePointer(current_menu, current_item);
X }
X UnlockCursor();
X }
X else if (NewX < OldX) /* reverse motion */
X Trigger = MIN(Trigger, NewX + MenuDelta(current_menu));
X break;
X
X default:
X Retch("(RTLmenu) YOW! Unexpected event!\n");
X next_state = Exit;
X break;
X }
X exit:
X Leave(next_state)
X}
X
XState LeafState(rep,selected)
XXEvent rep;
XBoolean *selected;
X{
X State next_state;
X
X Entry("LeafState")
X switch(EventType(rep))
X {
X case LeaveNotify:
X Unhighlight(MenuGetItem(current_menu, EventXWindow(rep)));
X next_state = Initial;
X break;
X
X case ButtonRelease:
X *selected = TRUE;
X next_state = Exit;
X break;
X
X case ButtonPress:
X case EnterNotify:
X case MotionNotify: /* if events set right, this never happens */
X next_state = Leaf;
X break;
X
X default:
X Retch("(RTLMenu) YOW! Unexpected event! (%d)\n",
X rep.type);
X next_state = Exit;
X break;
X }
X Leave(next_state)
X}
X
XBoolean PushSubmenu(x)
Xint x;
X{
X int y;
X Boolean pushed;
X MenuItem *new_current_item;
X
X Entry("PushSubmenu")
X
X if (ItemIsNull(current_item))
X {
X Retch("(RTLMenu) Can't push from null item.\n");
X pushed = FALSE;
X }
X else if (MenuIsNull(ItemSubmenu(current_item)))
X {
X Retch("(RTLmenu) Null submenu.\n");
X pushed = FALSE;
X }
X else if (ItemIsNull(MenuItems(ItemSubmenu(current_item))))
X /* submenu has no items -- don't push, but not an error */
X pushed = FALSE;
X else
X {
X y = ItemGetMiddleY(current_item);
X ++level;
X
X if (new_current_item =
X Display_Menu(ItemSubmenu(current_item), current_menu, x, y))
X {
X XFlush(dpy);
X current_menu = ItemSubmenu(current_item);
X current_item = new_current_item;
X if (ItemIsDeaf(current_item) && Autoselect)
X current_item = current_item->nextItem;
X pushed = TRUE;
X }
X else
X {
X Retch("(RTLmenu) Display_Menu failed!\n");
X pushed = FALSE;
X }
X }
X Leave(pushed)
X}
X
Xvoid PopSubmenu()
X{
X Menu *parent;
X MenuItem *item;
X
X Entry("PopSubmenu")
X --level;
X parent = current_menu->parentMenu;
X Undisplay_Menu(current_menu);
X current_menu = parent;
X if (!MenuIsNull(current_menu))
X {
X item = MenuItemHighlighted(current_menu);
X if (!ItemIsNull(item))
X {
X current_item = item;
X }
X }
X
X Leave_void
X}
X
Xvoid Highlight(item)
XMenuItem *item;
X{
X MenuItem *old_highlight;
X
X Entry("Highlight")
X
X old_highlight = MenuItemHighlighted(current_menu);
X if ((item != old_highlight) && /* else, already highlighted */
X (!ItemIsNull(item)))
X {
X if (!ItemIsNull(old_highlight) && !ItemIsDeaf(item))
X Unhighlight(old_highlight);
X SetHighlightItem(ItemMenu(item), item);
X Draw_Item(ItemMenu(item), item);
X }
X Leave_void
X}
X
Xvoid Unhighlight(item)
XMenuItem *item;
X{
X Entry("Unhighlight")
X if (!ItemIsNull(item))
X {
X if (MenuItemHighlighted(current_menu) == item)
X {
X ResetHighlightItem(ItemMenu(item));
X Draw_Item(ItemMenu(item), item);
X }
X }
X Leave_void
X}
X
Xvoid TossExtraMoves(window)
XWindow window;
X{
X XEvent ev;
X
X Entry("TossExtraMoves")
X while (XCheckTypedWindowEvent(dpy, window, MotionNotify, &ev))
X DBUG_2("RTLmenu","Tossing extra motion.\n");
X Leave_void
X}
X
X
Xvoid ProcessExposeEvents()
X{
X MenuItem *item;
X XEvent ev;
X
X Entry("ProcessExposeEvents")
X
X XSync(dpy,0);
X while (XCheckTypedEvent(dpy, Expose, &ev))
X {
X item = MenuGetItem(current_menu, EventXWindow(ev));
X if (!ItemIsNull(item))
X Draw_Item(ItemMenu(item), item);
X }
X Leave_void
X}
END_OF_FILE
if test 26567 -ne `wc -c <'menus/track_menu.c'`; then
echo shar: \"'menus/track_menu.c'\" unpacked with wrong size!
fi
# end of 'menus/track_menu.c'
fi
echo shar: End of archive 5 \(of 12\).
cp /dev/null ark5isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked all 12 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
--
Mike Wexler(wyse!mikew) Phone: (408)433-1000 x1330
Moderator of comp.sources.x
More information about the Comp.sources.x
mailing list