This repository has been archived on 2024-01-04. You can view files and clone it, but cannot push or open issues or pull requests.
ncsa-mosaic/libXmx/Xmx.c
Alan Dipert 29c82be0c2 init
2010-03-08 05:55:21 -05:00

2026 lines
58 KiB
C

/****************************************************************************
* NCSA Mosaic for the X Window System *
* Software Development Group *
* National Center for Supercomputing Applications *
* University of Illinois at Urbana-Champaign *
* 605 E. Springfield, Champaign IL 61820 *
* mosaic@ncsa.uiuc.edu *
* *
* Copyright (C) 1993, Board of Trustees of the University of Illinois *
* *
* NCSA Mosaic software, both binary and source (hereafter, Software) is *
* copyrighted by The Board of Trustees of the University of Illinois *
* (UI), and ownership remains with the UI. *
* *
* The UI grants you (hereafter, Licensee) a license to use the Software *
* for academic, research and internal business purposes only, without a *
* fee. Licensee may distribute the binary and source code (if released) *
* to third parties provided that the copyright notice and this statement *
* appears on all copies and that no charge is associated with such *
* copies. *
* *
* Licensee may make derivative works. However, if Licensee distributes *
* any derivative work based on or derived from the Software, then *
* Licensee will (1) notify NCSA regarding its distribution of the *
* derivative work, and (2) clearly notify users that such derivative *
* work is a modified version and not the original NCSA Mosaic *
* distributed by the UI. *
* *
* Any Licensee wishing to make commercial use of the Software should *
* contact the UI, c/o NCSA, to negotiate an appropriate license for such *
* commercial use. Commercial use includes (1) integration of all or *
* part of the source code into a product for sale or license by or on *
* behalf of Licensee to third parties, or (2) distribution of the binary *
* code or source code to third parties that need it to utilize a *
* commercial product sold or licensed by or on behalf of Licensee. *
* *
* UI MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THIS SOFTWARE FOR *
* ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED *
* WARRANTY. THE UI SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY THE *
* USERS OF THIS SOFTWARE. *
* *
* By using or copying this Software, Licensee agrees to abide by the *
* copyright law and all other applicable laws of the U.S. including, but *
* not limited to, export control laws, and the terms of this license. *
* UI shall have the right to terminate this license immediately by *
* written notice upon Licensee's breach of, or non-compliance with, any *
* of its terms. Licensee may be held legally responsible for any *
* copyright infringement that is caused or encouraged by Licensee's *
* failure to abide by the terms of this license. *
* *
* Comments and questions are welcome and can be sent to *
* mosaic-x@ncsa.uiuc.edu. *
****************************************************************************/
#include "../config.h"
#include "XmxP.h"
#if defined(ultrix) || defined(VMS) || defined(NeXT)
extern char *strdup ();
#endif
XmString xwt_str_array_to_xmstr(char *normal_string[], int numargs);
/*
void startbouncetimer();
void stopbouncetimer();
*/
/* Kludge for broken linux */
extern Pixmap dialogError, dialogInformation, dialogQuestion, dialogWarning;
/* ---------------------------- FILE VARIABLES ---------------------------- */
/* Variables accessed through Xmx.h as extern. */
int Xmx_n = 0;
Arg Xmx_wargs[XmxMaxNumArgs];
Widget Xmx_w;
int Xmx_uniqid = 0;
/* Counter for values returned from XmxMakeNewUniqid. */
static int Xmx_uniqid_counter = 0;
/* Flag for whether or not XmxSetUniqid has ever been called. */
static int Xmx_uniqid_has_been_set = 0;
/* --------------------------- UNIQID FUNCTIONS --------------------------- */
int
XmxMakeNewUniqid (void)
{
Xmx_uniqid_counter++;
return Xmx_uniqid_counter;
}
void
XmxSetUniqid (int uniqid)
{
Xmx_uniqid = uniqid;
Xmx_uniqid_has_been_set = 1;
return;
}
void
XmxZeroUniqid (void)
{
Xmx_uniqid = 0;
/* Do NOT reset Xmx_uniqid_has_been_set. */
return;
}
int
XmxExtractUniqid (int cd)
{
/* Pull the high 16 bits, if uniqid has been set. */
if (Xmx_uniqid_has_been_set)
return (cd >> 16);
else
return 0;
}
int
XmxExtractToken (int cd)
{
/* Pull the low 16 bits, if uniqid has been set. */
if (Xmx_uniqid_has_been_set)
return ((cd << 16) >> 16);
else
return cd;
}
/* This function should be called by every Xmx routine
when registering a callback or event handler. */
/* This is PRIVATE but accessible to Xmx2.c also. */
int
_XmxMakeClientData (int token)
{
if (Xmx_uniqid_has_been_set)
return ((Xmx_uniqid << 16) | token);
else
return token;
}
/* -------------------------- INTERNAL CALLBACKS -------------------------- */
/* Internal routine to unmanage file selection box on Cancel. */
static
XmxCallback (_XmxCancelCallback)
{
XtUnmanageChild (w);
return;
}
/* --------------------------- CALLBACK SUPPORT --------------------------- */
/* args do nothing */
void XmxAddCallback (Widget w, String name, XtCallbackProc cb, int cb_data)
{
XtAddCallback (w, name, cb, (XtPointer)_XmxMakeClientData (cb_data));
return;
}
/* ------------------------ EVENT HANDLER SUPPORT ------------------------- */
void
XmxAddEventHandler (Widget w, EventMask event_mask, XtEventHandler proc,
int client_data)
{
XtAddEventHandler
(w, event_mask, False, proc, (XtPointer)_XmxMakeClientData (client_data));
return;
}
void
XmxRemoveEventHandler (Widget w, EventMask event_mask, XtEventHandler proc,
int client_data)
{
XtRemoveEventHandler
(w, event_mask, False, proc, (XtPointer)_XmxMakeClientData (client_data));
return;
}
/* ------------------- (nonworking) CENTERING ROUTINES -------------------- */
#ifdef NONWORKING_CENTERING
/* Adapted from Dan Heller's post in comp.windows.x.motif;
assumes BulletinBoard with one (centered) child. */
static void
XmxCenteringResize
(CompositeWidget w, XConfigureEvent *event, String args[], int *num_args)
{
WidgetList children;
int width = event->width;
int height = event->height;
Dimension w_width, w_height;
/* get handle to BulletinBoard's children and marginal spacing */
XtVaGetValues (w,
XmNchildren, &children,
NULL);
XtVaGetValues (children[0],
XmNheight, &w_height,
XmNwidth, &w_width,
NULL);
XtVaSetValues (children[0],
XmNx, width/2 - w_width/2,
XmNy, height/2 - w_height/2,
NULL);
return;
}
#endif /* NONWORKING_CENTERING */
/* -------------------------- UTILITY FUNCTIONS --------------------------- */
/* resets args */
void XmxStartup (void)
{
Xmx_n = 0;
#ifdef MOTIF1_2
XmRepTypeInstallTearOffModelConverter();
#endif
return;
}
/* sets an arg */
void XmxSetArg (String arg, XtArgVal val)
{
XtSetArg (Xmx_wargs[Xmx_n], arg, val);
Xmx_n++;
return;
}
void XmxSetValues (Widget w)
{
XtSetValues (w, Xmx_wargs, Xmx_n);
Xmx_n = 0;
return;
}
/* args do nothing */
void XmxManageRemanage (Widget w)
{
#if 0
if (XtIsManaged (w))
XtUnmanageChild (w);
XtManageChild (w);
#endif
if (XtIsManaged (w))
if (XtIsShell(w))
XRaiseWindow (XtDisplay (w), XtWindow (w));
else
XMapRaised (XtDisplay (w), XtWindow (XtParent(w)));
else
XtManageChild (w);
return;
}
/* args do nothing */
void XmxSetSensitive (Widget w, int state)
{
assert (state == XmxSensitive || state == XmxUnsensitive);
XtSetSensitive (w, (state == XmxSensitive) ? True : False);
return;
}
/* ------------------------------------------------------------------------ */
/* ---------------- WIDGET CREATION AND HANDLING ROUTINES ----------------- */
/* ------------------------------------------------------------------------ */
/* ----------------------------- PUSHBUTTONS ------------------------------ */
/* args work */
Widget XmxMakePushButton (Widget parent, String name, XtCallbackProc cb,
int cb_data)
{
XmString xmstr = NULL;
if (name)
{
xmstr = XmStringCreateLtoR (name, XmSTRING_DEFAULT_CHARSET);
XmxSetArg (XmNlabelString, (XtArgVal)xmstr);
}
Xmx_w = XtCreateManagedWidget ("pushbutton", xmPushButtonWidgetClass,
parent, Xmx_wargs, Xmx_n);
XtAddCallback (Xmx_w, XmNactivateCallback, cb,
(XtPointer)_XmxMakeClientData (cb_data));
if (xmstr)
XmStringFree (xmstr);
Xmx_n = 0;
return Xmx_w;
}
/* args work */
Widget XmxMakeNamedPushButton (Widget parent, String name, String wname,
XtCallbackProc cb,
int cb_data)
{
XmString label;
if (name)
{
label = XmStringCreateLtoR (name, XmSTRING_DEFAULT_CHARSET);
XmxSetArg (XmNlabelString, (XtArgVal)label);
}
Xmx_w = XtCreateManagedWidget (wname, xmPushButtonWidgetClass,
parent, Xmx_wargs, Xmx_n);
XtAddCallback (Xmx_w, XmNactivateCallback, cb,
(XtPointer)_XmxMakeClientData (cb_data));
if (name)
XmStringFree (label);
Xmx_n = 0;
return Xmx_w;
}
/* args work */
Widget XmxMakeBlankButton (Widget parent, XtCallbackProc cb,
int cb_data)
{
Xmx_w = XtCreateManagedWidget ("blankbutton", xmPushButtonWidgetClass,
parent, Xmx_wargs, Xmx_n);
XtAddCallback (Xmx_w, XmNactivateCallback, cb,
(XtPointer)_XmxMakeClientData (cb_data));
Xmx_n = 0;
return Xmx_w;
}
/* ------------------------------- COMMAND -------------------------------- */
/* args work */
Widget XmxMakeCommand
(Widget parent, String prompt, XtCallbackProc cb, int cb_data)
{
XmString xmstr = XmxMakeXmstrFromString (prompt);
XmxSetArg (XmNpromptString, (XtArgVal)xmstr);
Xmx_w = XtCreateManagedWidget ("command", xmCommandWidgetClass, parent,
Xmx_wargs, Xmx_n);
XtAddCallback
(Xmx_w, XmNcommandEnteredCallback, cb,
(XtPointer)_XmxMakeClientData (cb_data));
XmStringFree (xmstr);
Xmx_n = 0;
return Xmx_w;
}
/* ---------------------------- SCROLLED LIST ----------------------------- */
/* args work */
Widget XmxMakeScrolledList
(Widget parent, XtCallbackProc cb, int cb_data)
{
Xmx_w = XmCreateScrolledList (parent, "scrolled_list", Xmx_wargs, Xmx_n);
XtManageChild (Xmx_w);
/* defaultAction gets triggered on double click and sends item
along with it... */
XtAddCallback (Xmx_w, XmNdefaultActionCallback, cb,
(XtPointer)_XmxMakeClientData (cb_data));
Xmx_n = 0;
return Xmx_w;
}
/* ----------------------------- DRAWING AREA ----------------------------- */
/* args work */
Widget XmxMakeDrawingArea (Widget parent, int width, int height)
{
XmxSetArg (XmNwidth, (XtArgVal)width);
XmxSetArg (XmNheight, (XtArgVal)height);
Xmx_w = XtCreateManagedWidget ("drawingarea", xmDrawingAreaWidgetClass,
parent, Xmx_wargs, Xmx_n);
Xmx_n = 0;
return Xmx_w;
}
/* ------------------------ TOGGLE BUTTONS & BOXES ------------------------ */
/* args work */
Widget XmxMakeRadioBox (Widget parent)
{
/* Could set XmxNspacing here to avoid having to play with
margins for each togglebutton. */
XmxSetArg (XmNspacing, (XtArgVal)0);
XmxSetArg (XmNentryClass, (XtArgVal)xmToggleButtonGadgetClass);
Xmx_w = XmCreateRadioBox (parent, "radiobox", Xmx_wargs, Xmx_n);
XtManageChild (Xmx_w);
Xmx_n = 0;
return Xmx_w;
}
/* args work */
Widget XmxMakeOptionBox (Widget parent)
{
XmxSetArg (XmNentryClass, (XtArgVal)xmToggleButtonGadgetClass);
XmxSetArg (XmNisHomogeneous, (XtArgVal)True);
Xmx_w = XtCreateManagedWidget ("optionbox", xmRowColumnWidgetClass,
parent, Xmx_wargs, Xmx_n);
Xmx_n = 0;
return Xmx_w;
}
/* args work */
Widget XmxMakeToggleButton (Widget parent, String name, XtCallbackProc cb,
int cb_data)
{
XmString label = XmStringCreateLtoR (name, XmSTRING_DEFAULT_CHARSET);
XmxSetArg (XmNlabelString, (XtArgVal)label);
XmxSetArg (XmNmarginHeight, (XtArgVal)0);
Xmx_w = XtCreateManagedWidget
("togglebutton", xmToggleButtonWidgetClass, parent, Xmx_wargs, Xmx_n);
/* Used to be XmNarmCallback --- probably not right. */
if (cb)
XtAddCallback (Xmx_w, XmNvalueChangedCallback, cb,
(XtPointer)_XmxMakeClientData (cb_data));
XmStringFree (label);
Xmx_n = 0;
return Xmx_w;
}
/* args work */
void XmxSetToggleButton (Widget button, int set_state)
{
assert (set_state == XmxSet || set_state == XmxUnset);
XmToggleButtonSetState
(button, (set_state == XmxSet) ? True : False, False);
Xmx_n = 0;
return;
}
/* -------------------------------- SCALES -------------------------------- */
/* args ignored if label is non-NULL, otherwise args work */
Widget XmxMakeScale (Widget parent, XtCallbackProc cb, int cb_data,
String label, int min, int max, int start, int dec_adj)
{
if (label)
{
Xmx_n = 0;
XmxMakeLabel (parent, label);
}
XmxSetArg (XmNminimum, (XtArgVal)min);
XmxSetArg (XmNmaximum, (XtArgVal)max);
XmxSetArg (XmNvalue, (XtArgVal)start);
XmxSetArg (XmNorientation, (XtArgVal)XmHORIZONTAL);
XmxSetArg (XmNprocessingDirection, (XtArgVal)XmMAX_ON_RIGHT);
if (dec_adj != XmxNotDisplayed)
{
XmxSetArg (XmNshowValue, (XtArgVal)True);
XmxSetArg (XmNdecimalPoints, (XtArgVal)dec_adj);
}
Xmx_w = XtCreateManagedWidget ("scale", xmScaleWidgetClass, parent,
Xmx_wargs, Xmx_n);
XtAddCallback
(Xmx_w, XmNvalueChangedCallback, cb,
(XtPointer)_XmxMakeClientData (cb_data));
XtAddCallback (Xmx_w, XmNdragCallback, cb,
(XtPointer)_XmxMakeClientData (cb_data));
Xmx_n = 0;
return Xmx_w;
}
/* args work */
void XmxAdjustScale (Widget scale, int val)
{
XmxSetArg (XmNvalue, (XtArgVal)val);
XtSetValues (scale, Xmx_wargs, Xmx_n);
Xmx_n = 0;
return;
}
/* args work */
Widget XmxMakeFrame (Widget parent, int shadow)
{
assert (shadow == XmxShadowIn || shadow == XmxShadowOut || shadow == XmxShadowEtchedIn || shadow == XmxShadowEtchedOut);
switch (shadow)
{
case XmxShadowIn:
XmxSetArg (XmNshadowType, (XtArgVal)XmSHADOW_IN); break;
case XmxShadowOut:
XmxSetArg (XmNshadowType, (XtArgVal)XmSHADOW_OUT); break;
case XmxShadowEtchedIn:
XmxSetArg (XmNshadowType, (XtArgVal)XmSHADOW_ETCHED_IN); break;
case XmxShadowEtchedOut:
XmxSetArg (XmNshadowType, (XtArgVal)XmSHADOW_ETCHED_OUT); break;
}
Xmx_w = XtCreateManagedWidget ("frame", xmFrameWidgetClass,
parent, Xmx_wargs, Xmx_n);
Xmx_n = 0;
return Xmx_w;
}
/* -------------------------------- FORMS --------------------------------- */
/* args work */
Widget XmxMakeForm (Widget parent)
{
Xmx_w = XtCreateManagedWidget ("form", xmFormWidgetClass, parent,
Xmx_wargs, Xmx_n);
Xmx_n = 0;
return Xmx_w;
}
/* args sent to w */
void XmxSetPositions (Widget w, int top, int bottom, int left, int right)
{
if (top != XmxNoPosition)
{
XmxSetArg (XmNtopAttachment, (XtArgVal)XmATTACH_POSITION);
XmxSetArg (XmNtopPosition, (XtArgVal)top);
}
if (bottom != XmxNoPosition)
{
XmxSetArg (XmNbottomAttachment, (XtArgVal)XmATTACH_POSITION);
XmxSetArg (XmNbottomPosition, (XtArgVal)bottom);
}
if (left != XmxNoPosition)
{
XmxSetArg (XmNleftAttachment, (XtArgVal)XmATTACH_POSITION);
XmxSetArg (XmNleftPosition, (XtArgVal)left);
}
if (right != XmxNoPosition)
{
XmxSetArg (XmNrightAttachment, (XtArgVal)XmATTACH_POSITION);
XmxSetArg (XmNrightPosition, (XtArgVal)right);
}
XmxSetValues (w);
Xmx_n = 0;
return;
}
/* args sent to w */
void XmxSetOffsets (Widget w, int top, int bottom, int left, int right)
{
if (top != XmxNoOffset)
XmxSetArg (XmNtopOffset, (XtArgVal)top);
if (bottom != XmxNoOffset)
XmxSetArg (XmNbottomOffset, (XtArgVal)bottom);
if (left != XmxNoOffset)
XmxSetArg (XmNleftOffset, (XtArgVal)left);
if (right != XmxNoOffset)
XmxSetArg (XmNrightOffset, (XtArgVal)right);
XmxSetValues (w);
Xmx_n = 0;
return;
}
/* args sent to w */
void XmxSetConstraints (Widget w,
int top, int bottom, int left, int right,
Widget topw, Widget botw, Widget lefw, Widget rigw)
{
if (top != XmATTACH_NONE)
{
XmxSetArg (XmNtopAttachment, (XtArgVal)top);
if (topw)
XmxSetArg (XmNtopWidget, (XtArgVal)topw);
}
if (bottom != XmATTACH_NONE)
{
XmxSetArg (XmNbottomAttachment, (XtArgVal)bottom);
if (botw)
XmxSetArg (XmNbottomWidget, (XtArgVal)botw);
}
if (left != XmATTACH_NONE)
{
XmxSetArg (XmNleftAttachment, (XtArgVal)left);
if (lefw)
XmxSetArg (XmNleftWidget, (XtArgVal)lefw);
}
if (right != XmATTACH_NONE)
{
XmxSetArg (XmNrightAttachment, (XtArgVal)right);
if (rigw)
XmxSetArg (XmNrightWidget, (XtArgVal)rigw);
}
XmxSetValues (w);
Xmx_n = 0;
return;
}
/* ------------------------------ ROWCOLUMNS ------------------------------ */
/* args work */
Widget XmxMakeVerticalRowColumn (Widget parent)
{
Xmx_w = XtCreateManagedWidget ("rowcolumn", xmRowColumnWidgetClass,
parent, Xmx_wargs, Xmx_n);
Xmx_n = 0;
return Xmx_w;
}
/* args work */
Widget XmxMakeHorizontalRowColumn (Widget parent)
{
XmxSetArg (XmNorientation, (XtArgVal)XmHORIZONTAL);
Xmx_w = XtCreateManagedWidget ("rowcolumn", xmRowColumnWidgetClass,
parent, Xmx_wargs, Xmx_n);
Xmx_n = 0;
return Xmx_w;
}
/* args work */
Widget XmxMakeNColumnRowColumn (Widget parent, int ncolumns)
{
XmxSetArg (XmNorientation, (XtArgVal)XmVERTICAL);
XmxSetArg (XmNpacking, (XtArgVal)XmPACK_COLUMN);
XmxSetArg (XmNnumColumns, (XtArgVal)ncolumns);
Xmx_w = XtCreateManagedWidget ("rowcolumn", xmRowColumnWidgetClass,
parent, Xmx_wargs, Xmx_n);
Xmx_n = 0;
return Xmx_w;
}
/* --------------------------- BULLETIN BOARDS ---------------------------- */
/* args work */
Widget XmxMakeVerticalBboard (Widget parent)
{
Xmx_w = XtCreateManagedWidget ("bboard", xmBulletinBoardWidgetClass,
parent, Xmx_wargs, Xmx_n);
Xmx_n = 0;
return Xmx_w;
}
/* args work */
Widget XmxMakeVerticalBboardWithFont (Widget parent, String fontname)
{
XFontStruct *_font;
XmFontList _fontlist;
_font = XLoadQueryFont (XtDisplay (parent), fontname);
if (_font != (XFontStruct *)NULL)
{
_fontlist = XmFontListCreate (_font, XmSTRING_DEFAULT_CHARSET);
XmxSetArg (XmNbuttonFontList, (XtArgVal)_fontlist);
XmxSetArg (XmNlabelFontList, (XtArgVal)_fontlist);
XmxSetArg (XmNtextFontList,(XtArgVal) _fontlist);
}
XmxSetArg (XmNmarginWidth, (XtArgVal)0);
XmxSetArg (XmNmarginHeight, (XtArgVal)0);
Xmx_w = XtCreateManagedWidget ("bboard", xmBulletinBoardWidgetClass,
parent, Xmx_wargs, Xmx_n);
Xmx_n = 0;
return Xmx_w;
}
/* args work */
Widget XmxMakeHorizontalBboard (Widget parent)
{
XmxSetArg (XmNorientation, (XtArgVal)XmHORIZONTAL);
Xmx_w = XtCreateManagedWidget ("bboard", xmBulletinBoardWidgetClass,
parent, Xmx_wargs, Xmx_n);
Xmx_n = 0;
return Xmx_w;
}
/* -------------------- (nonworking) CENTERING BBOARD --------------------- */
#ifdef NONWORKING_CENTERING
/* args work */
Widget XmxMakeCenteringBboard (Widget parent, XtAppContext app)
{
XtActionsRec rec;
Xmx_w = XtCreateManagedWidget
("bboard", xmBulletinBoardWidgetClass, parent, Xmx_wargs, Xmx_n);
/* Does this have to happen more than once? */
rec.string = "resize";
rec.proc = XmxCenteringResize;
XtAppAddActions (app, &rec, 1);
/* This does, for sure... */
XtOverrideTranslations
(Xmx_w, XtParseTranslationTable ("<Configure>: resize()"));
Xmx_n = 0;
return Xmx_w;
}
#endif /* NONWORKING_CENTERING */
/* -------------------------------- LABELS -------------------------------- */
/* args work */
void XmxAdjustLabelText (Widget label, String text)
{
XmString xmstr = XmStringCreateLtoR (text, XmSTRING_DEFAULT_CHARSET);
XmxSetArg (XmNlabelString, (XtArgVal)xmstr);
XtSetValues (label, Xmx_wargs, Xmx_n);
XmStringFree (xmstr);
Xmx_n = 0;
return;
}
/* args work */
Widget XmxMakeLabel (Widget parent, String name)
{
XmString xmstr = XmStringCreateLtoR (name, XmSTRING_DEFAULT_CHARSET);
XmxSetArg (XmNlabelString, (XtArgVal)xmstr);
Xmx_w = XtCreateManagedWidget ("label", xmLabelWidgetClass,
parent, Xmx_wargs, Xmx_n);
XmStringFree (xmstr);
Xmx_n = 0;
return Xmx_w;
}
/* args work */
Widget XmxMakeNamedLabel (Widget parent, String name, String wname)
{
XmString xmstr = XmStringCreateLtoR (name, XmSTRING_DEFAULT_CHARSET);
XmxSetArg (XmNlabelString, (XtArgVal)xmstr);
Xmx_w = XtCreateManagedWidget (wname, xmLabelWidgetClass,
parent, Xmx_wargs, Xmx_n);
XmStringFree (xmstr);
Xmx_n = 0;
return Xmx_w;
}
/* args work */
Widget XmxMakeBlankLabel (Widget parent)
{
Xmx_w = XtCreateManagedWidget ("label", xmLabelWidgetClass,
parent, Xmx_wargs, Xmx_n);
Xmx_n = 0;
return Xmx_w;
}
/* ------------------------------- DIALOGS -------------------------------- */
/* args work */
Widget XmxMakeErrorDialog (Widget parent, String name, String title)
{
XmString message = XmStringCreateLtoR (name, XmSTRING_DEFAULT_CHARSET);
XmString dialog = XmStringCreateLtoR (title, XmSTRING_DEFAULT_CHARSET);
XmxSetArg (XmNmessageString, (XtArgVal)message);
XmxSetArg (XmNdialogTitle, (XtArgVal)dialog);
XmxSetArg (XmNsymbolPixmap, (XtArgVal)dialogError);
Xmx_w = XmCreateErrorDialog (parent, "error", Xmx_wargs, Xmx_n);
XtUnmanageChild (XmMessageBoxGetChild (Xmx_w, XmDIALOG_CANCEL_BUTTON));
XtUnmanageChild (XmMessageBoxGetChild (Xmx_w, XmDIALOG_HELP_BUTTON));
XmStringFree (message);
XmStringFree (dialog);
Xmx_n = 0;
return Xmx_w;
}
/* args work */
Widget XmxMakeInfoDialog (Widget parent, String name, String title)
{
XmString message = XmStringCreateLtoR (name, XmSTRING_DEFAULT_CHARSET);
XmString dialog = XmStringCreateLtoR (title, XmSTRING_DEFAULT_CHARSET);
XmxSetArg (XmNmessageString, (XtArgVal)message);
XmxSetArg (XmNdialogTitle, (XtArgVal)dialog);
XmxSetArg (XmNsymbolPixmap, (XtArgVal)dialogInformation);
Xmx_w = XmCreateInformationDialog (parent, "infozoid", Xmx_wargs, Xmx_n);
XtUnmanageChild (XmMessageBoxGetChild (Xmx_w, XmDIALOG_CANCEL_BUTTON));
XtUnmanageChild (XmMessageBoxGetChild (Xmx_w, XmDIALOG_HELP_BUTTON));
XmStringFree (message);
XmStringFree (dialog);
Xmx_n = 0;
return Xmx_w;
}
/* args work */
Widget XmxMakeQuestionDialog (Widget parent, String question, String title,
XtCallbackProc cb, int yes_token, int no_token)
{
XmString message = XmStringCreateLtoR (question, XmSTRING_DEFAULT_CHARSET);
XmString dialog = XmStringCreateLtoR (title, XmSTRING_DEFAULT_CHARSET);
XmString ok = XmStringCreateLtoR ("Yes", XmSTRING_DEFAULT_CHARSET);
XmString cancel = XmStringCreateLtoR ("No", XmSTRING_DEFAULT_CHARSET);
XmxSetArg (XmNmessageString, (XtArgVal)message);
XmxSetArg (XmNdialogTitle, (XtArgVal)dialog);
XmxSetArg (XmNokLabelString, (XtArgVal)ok);
XmxSetArg (XmNcancelLabelString, (XtArgVal)cancel);
XmxSetArg (XmNsymbolPixmap, (XtArgVal)dialogQuestion);
Xmx_w = XmCreateQuestionDialog (parent, "question", Xmx_wargs, Xmx_n);
XtUnmanageChild (XmMessageBoxGetChild (Xmx_w, XmDIALOG_HELP_BUTTON));
XtAddCallback (Xmx_w, XmNcancelCallback, cb,
(XtPointer)_XmxMakeClientData (no_token));
XtAddCallback (Xmx_w, XmNokCallback, cb,
(XtPointer)_XmxMakeClientData (yes_token));
XmStringFree (message);
XmStringFree (dialog);
XmStringFree (ok);
XmStringFree (cancel);
Xmx_n = 0;
return Xmx_w;
}
/* ----------------------------- STRING UTILS ----------------------------- */
/* args do nothing */
XmString XmxMakeXmstrFromFile (String filename)
{
FILE *_f;
char _mstr[81];
XmString _xmstr;
_f = fopen (filename, "r");
assert (_f != (FILE *)NULL);
_xmstr = (XmString)NULL;
while (!feof (_f))
{
if (fgets (_mstr, 80, _f) == (char *)NULL)
break;
_mstr[strlen (_mstr)-1] = '\0';
if (_xmstr != (XmString)NULL)
_xmstr = XmStringConcat (_xmstr, XmStringSeparatorCreate ());
/* Used to be XmStringCreate; changed to standard call. */
_xmstr = XmStringConcat
(_xmstr, XmStringCreateLtoR (_mstr, XmSTRING_DEFAULT_CHARSET));
}
fclose (_f);
return _xmstr;
}
/* args do nothing */
XmString XmxMakeXmstrFromString (String mstr)
{
XmString _xmstr;
_xmstr = XmStringCreateLtoR (mstr, XmSTRING_DEFAULT_CHARSET);
return _xmstr;
}
/* args work */
Widget XmxMakeBboardDialog (Widget parent, String title)
{
XmString xmstr = XmStringCreateLtoR (title, XmSTRING_DEFAULT_CHARSET);
XmxSetArg (XmNdialogTitle, (XtArgVal)xmstr);
XmxSetArg (XmNautoUnmanage, (XtArgVal)False);
XmxSetArg (XmNmarginWidth, (XtArgVal)0);
XmxSetArg (XmNmarginHeight, (XtArgVal)0);
Xmx_w = XmCreateBulletinBoardDialog (parent, "bbdialog", Xmx_wargs, Xmx_n);
XmStringFree (xmstr);
Xmx_n = 0;
return Xmx_w;
}
/* args work */
Widget XmxMakeFormDialog (Widget parent, String title)
{
XmString xmstr = XmStringCreateLtoR (title, XmSTRING_DEFAULT_CHARSET);
XmxSetArg (XmNdialogTitle, (XtArgVal)xmstr);
XmxSetArg (XmNautoUnmanage, (XtArgVal)False);
Xmx_w = XmCreateFormDialog (parent, "formdialog", Xmx_wargs, Xmx_n);
XmStringFree (xmstr);
Xmx_n = 0;
return Xmx_w;
}
/* args work */
Widget XmxMakeFileSBDialog (Widget parent, String title, String selection_txt,
XtCallbackProc cb, int cb_data)
{
Widget _selection_label;
XmString dialog_title = XmStringCreateLtoR (title, XmSTRING_DEFAULT_CHARSET);
XmString label = XmStringCreateLtoR (selection_txt, XmSTRING_DEFAULT_CHARSET);
XmxSetArg (XmNdialogTitle, (XtArgVal)dialog_title);
/* Can't set width of box with XmNwidth here... why not? */
/* this will cause the dialog to only resize if needed. That
way it won't be growing and shrinking all the time... very annoying. - DXP */
XmxSetArg (XmNresizePolicy, (XtArgVal)XmRESIZE_GROW);
/* Create the FileSelectionBox with OK and Cancel buttons. */
Xmx_w = XmCreateFileSelectionDialog (parent, "fsb", Xmx_wargs, Xmx_n);
XtUnmanageChild (XmFileSelectionBoxGetChild (Xmx_w, XmDIALOG_HELP_BUTTON));
XtAddCallback (Xmx_w, XmNokCallback, cb,
(XtPointer)_XmxMakeClientData (cb_data));
XtAddCallback (Xmx_w, XmNcancelCallback,
(XtCallbackProc)_XmxCancelCallback, 0);
/* Set selection label to specified selection_txt. */
Xmx_n = 0;
_selection_label =
XmFileSelectionBoxGetChild (Xmx_w, XmDIALOG_SELECTION_LABEL);
XmxSetArg (XmNlabelString, (XtArgVal)label);
XtSetValues (_selection_label, Xmx_wargs, Xmx_n);
XmStringFree (dialog_title);
XmStringFree (label);
Xmx_n = 0;
return Xmx_w;
}
/* args work */
Widget XmxMakeHelpDialog (Widget parent, XmString xmstr, String title)
{
XmString dialog_title = XmStringCreateLtoR (title, XmSTRING_DEFAULT_CHARSET);
XmxSetArg (XmNmessageString, (XtArgVal)xmstr);
XmxSetArg (XmNdialogTitle, (XtArgVal)dialog_title);
Xmx_w = XmCreateMessageDialog (parent, "helpdialog", Xmx_wargs, Xmx_n);
XtUnmanageChild (XmMessageBoxGetChild (Xmx_w, XmDIALOG_CANCEL_BUTTON));
XtUnmanageChild (XmMessageBoxGetChild (Xmx_w, XmDIALOG_HELP_BUTTON));
XmStringFree (dialog_title);
Xmx_n = 0;
return Xmx_w;
}
/* Boy, this is a hack. */
static
XmxCallback(_XmxHelpTextCancelCallback)
{
/* This is highly dependent on the button being four layers
below the dialog shell... what a ridiculous hack. */
XtUnmanageChild (XtParent (XtParent (XtParent (XtParent (w)))));
return;
}
/* args work */
Widget XmxMakeHelpTextDialog
(Widget parent, String str, String title, Widget *text_w)
{
Widget _box, _outer_frame, _form;
Widget _scr_text, _sep, _buttons_form;
/* Create the dialog box. */
_box = XmxMakeFormDialog (parent, title);
/* Make it 3D. */
_outer_frame = XmxMakeFrame (_box, XmxShadowOut);
XmxSetConstraints
(_outer_frame, XmATTACH_FORM, XmATTACH_FORM, XmATTACH_FORM, XmATTACH_FORM,
NULL, NULL, NULL, NULL);
/* Put form inside that, then frame for text window. */
_form = XmxMakeForm (_outer_frame);
/* Make multiline non-editable text window, with scrollbars. */
XmxSetArg (XmNscrolledWindowMarginWidth, (XtArgVal)10);
XmxSetArg (XmNscrolledWindowMarginHeight, (XtArgVal)10);
XmxSetArg (XmNcursorPositionVisible, (XtArgVal)False);
XmxSetArg (XmNeditable, (XtArgVal)False);
XmxSetArg (XmNeditMode, (XtArgVal)XmMULTI_LINE_EDIT);
XmxSetArg (XmNrows, (XtArgVal)20);
XmxSetArg (XmNcolumns, (XtArgVal)60);
XmxSetArg (XmNwordWrap, (XtArgVal)True);
XmxSetArg (XmNscrollHorizontal, (XtArgVal)False);
_scr_text = XmxMakeScrolledText (_form);
XmTextSetString (_scr_text, str);
/* Separate the text window/frame and the OK button. */
XmxSetArg (XmNtopOffset, (XtArgVal)10);
_sep = XmxMakeHorizontalSeparator (_form);
/* Make an OK button. */
_buttons_form = XmxMakeFormAndOneButton
(_form, _XmxHelpTextCancelCallback, "OK", 0);
/* Constraints for _form. */
XmxSetConstraints
(XtParent (_scr_text), XmATTACH_FORM, XmATTACH_WIDGET, XmATTACH_FORM,
XmATTACH_FORM, NULL, _sep, NULL, NULL);
XmxSetConstraints
(_sep, XmATTACH_NONE, XmATTACH_WIDGET, XmATTACH_FORM, XmATTACH_FORM,
NULL, _buttons_form, NULL, NULL);
XmxSetConstraints
(_buttons_form, XmATTACH_NONE, XmATTACH_FORM, XmATTACH_FORM, XmATTACH_FORM,
NULL, NULL, NULL, NULL);
/* Return _scr_text in text_w argument. */
*text_w = _scr_text;
Xmx_w = _box;
Xmx_n = 0;
return Xmx_w;
}
/* args work */
void XmxAdjustHelpDialogText (Widget dialog, XmString message,
String title)
{
XmString dialog_title = XmStringCreateLtoR (title, XmSTRING_DEFAULT_CHARSET);
XmxSetArg (XmNdialogTitle, (XtArgVal)dialog_title);
XmxSetArg (XmNmessageString, (XtArgVal)message);
XtSetValues (dialog, Xmx_wargs, Xmx_n);
XmStringFree (dialog_title);
Xmx_n = 0;
return;
}
/* args work */
void XmxAdjustDialogTitle (Widget dialog, String title)
{
XmString dialog_title = XmStringCreateLtoR (title, XmSTRING_DEFAULT_CHARSET);
XmxSetArg (XmNdialogTitle, (XtArgVal)dialog_title);
XmxSetValues (dialog);
XmStringFree (dialog_title);
Xmx_n = 0;
return;
}
/* ------------------------------ SEPARATORS ------------------------------ */
/* args work */
Widget XmxMakeHorizontalSeparator (Widget parent)
{
Xmx_w = XmCreateSeparatorGadget (parent, "separator", Xmx_wargs, Xmx_n);
XtManageChild (Xmx_w);
Xmx_n = 0;
return Xmx_w;
}
/* args work */
Widget XmxMakeHorizontalSpacer (Widget parent)
{
XmString label = XmStringCreateLtoR (" ", XmSTRING_DEFAULT_CHARSET);
XmxSetArg (XmNlabelString, (XtArgVal)label);
Xmx_w = XtCreateManagedWidget ("label", xmLabelGadgetClass, parent,
Xmx_wargs, Xmx_n);
XmStringFree (label);
Xmx_n = 0;
return Xmx_w;
}
/* args do nothing */
Widget XmxMakeHorizontalBoundary (Widget parent)
{
/* To avoid confusion, nullify preloaded resources first. */
Xmx_n = 0;
XmxMakeHorizontalSpacer (parent);
XmxMakeHorizontalSeparator (parent);
XmxMakeHorizontalSpacer (parent);
Xmx_n = 0;
return Xmx_w;
}
/* ------------------------- TEXT & SCROLLED TEXT ------------------------- */
/* args work */
Widget XmxMakeScrolledText (Widget parent)
{
Xmx_w = XmCreateScrolledText (parent, "scrolledtext",
Xmx_wargs, Xmx_n);
XtManageChild (Xmx_w);
/* Remember this returns the Text Widget, NOT the ScrolledWindow Widget,
which is what needs to be tied into a form. Use XtParent to get the
actual ScrolledWindow. */
Xmx_n = 0;
return Xmx_w;
}
/* args work */
Widget XmxMakeText (Widget parent)
{
Xmx_w = XmCreateText (parent, "text", Xmx_wargs, Xmx_n);
XtManageChild (Xmx_w);
Xmx_n = 0;
return Xmx_w;
}
/* args work */
Widget XmxMakeTextField (Widget parent)
{
Xmx_w = XmCreateTextField (parent, "textfield", Xmx_wargs, Xmx_n);
XtManageChild (Xmx_w);
Xmx_n = 0;
return Xmx_w;
}
/* args do nothing */
void XmxTextSetString (Widget text, String str)
{
XmTextSetString (text, str);
XmTextShowPosition (text, 0);
return;
}
/* Insert a sting into a text widget -- BJS */
void XmxTextInsertString (Widget text, String str)
{
XmTextInsert(text, XmTextGetInsertionPosition(text), str);
XmTextShowPosition (text, 0);
return;
}
/* args do nothing */
String XmxTextGetString (Widget text)
{
return XmTextGetString (text);
}
/* args do nothing */
void XmxAddCallbackToText (Widget text, XtCallbackProc cb, int cb_data)
{
XtAddCallback (text, XmNactivateCallback, cb,
(XtPointer)_XmxMakeClientData (cb_data));
return;
}
#if 0
/* --------------------------- DRAWING VOLUMES ---------------------------- */
#ifdef __sgi
/* args work */
Widget
XmxMakeDrawingVolume
(Widget parent, int width, int height,
GLXconfig *glxConfig,
XtCallbackProc redraw_cb, XtCallbackProc resize_cb,
XtCallbackProc ginit_cb)
{
XmxSetArg (XmNwidth, (XtArgVal)width);
XmxSetArg (XmNheight, (XtArgVal)height);
XmxSetArg (GlxNglxConfig, (XtArgVal)glxConfig);
Xmx_w = GlxCreateMDraw (parent, "drawingvolume", Xmx_wargs, Xmx_n);
XtManageChild (Xmx_w);
XtAddCallback (Xmx_w, GlxNexposeCallback, redraw_cb,
(XtPointer)_XmxMakeClientData (0));
XtAddCallback (Xmx_w, GlxNresizeCallback, resize_cb,
(XtPointer)_XmxMakeClientData (0));
XtAddCallback (Xmx_w, GlxNginitCallback, ginit_cb,
(XtPointer)_XmxMakeClientData (0));
Xmx_n = 0;
return Xmx_w;
}
void XmxInstallColormaps (Widget toplevel, Widget glw)
{
Window windows[2];
windows[0] = XtWindow (glw);
windows[1] = XtWindow (toplevel);
XSetWMColormapWindows (XtDisplay (toplevel), XtWindow (toplevel),
windows, 2);
return;
}
void XmxInstallColormapsWithOverlay (Widget toplevel, Widget glw)
{
Window windows[5];
Window overlay, popup, underlay;
Arg args[5];
register int i=0;
i=0;
XtSetArg(args[i], GlxNoverlayWindow, &overlay); i++;
XtSetArg(args[i], GlxNpopupWindow, &popup); i++;
XtSetArg(args[i], GlxNunderlayWindow, &underlay); i++;
XtGetValues(glw, args, i);
i = 0;
if (overlay)
{
windows[i] = overlay;
i++;
}
if (popup)
{
windows[i] = popup;
i++;
}
if (underlay)
{
windows[i] = underlay;
i++;
}
windows[i] = XtWindow(glw); i++;
windows[i] = XtWindow(toplevel); i++;
XSetWMColormapWindows(XtDisplay(toplevel), XtWindow(toplevel), windows, i);
return;
}
void XmxWinset (Widget w)
{
GLXwinset (XtDisplay (w), XtWindow (w));
return;
}
#endif /* __sgi */
#ifdef _IBMR2
/* args work */
Widget
XmxMakeDrawingVolume
(Widget parent, int width, int height,
XtCallbackProc redraw_cb, XtCallbackProc resize_cb,
XtCallbackProc ginit_cb)
{
XmxSetArg (XmNwidth, (XtArgVal)width);
XmxSetArg (XmNheight, (XtArgVal)height);
Xmx_w = XtCreateWidget
("drawingvolume", glibWidgetClass, parent, Xmx_wargs, Xmx_n);
XtManageChild (Xmx_w);
XtAddCallback (Xmx_w, XglNexposeCallback, redraw_cb,
(XtPointer)_XmxMakeClientData (0));
XtAddCallback (Xmx_w, XglNresizeCallback, resize_cb,
(XtPointer)_XmxMakeClientData (0));
XtAddCallback (Xmx_w, XglNgconfigCallback, ginit_cb,
(XtPointer)_XmxMakeClientData (0));
Xmx_n = 0;
return Xmx_w;
}
void XmxInstallColormaps (Widget toplevel, Widget glw)
{
return;
}
void XmxWinset (Widget w)
{
GlWinsetWidget (w);
return;
}
#endif /* _IBMR2 */
#endif /* if 0 */
/* ----------------------------- BITMAP UTILS ----------------------------- */
/* args ignored and reset */
void XmxApplyBitmapToLabelWidget
(Widget label, String data, unsigned int width, unsigned int height)
{
Display *_disp;
Pixel _fg, _bg;
Pixmap _pix;
_disp = XtDisplay (label);
Xmx_n = 0;
XmxSetArg (XmNforeground, (XtArgVal)(&_fg));
XmxSetArg (XmNbackground, (XtArgVal)(&_bg));
XtGetValues (label, Xmx_wargs, Xmx_n);
Xmx_n = 0;
_pix = XCreatePixmapFromBitmapData
(_disp, DefaultRootWindow (_disp), data, width, height, _fg, _bg,
DefaultDepthOfScreen (DefaultScreenOfDisplay (_disp)));
XmxSetArg (XmNlabelPixmap, (XtArgVal)_pix);
XmxSetArg (XmNlabelType, (XtArgVal)XmPIXMAP);
XmxSetValues (label);
Xmx_n = 0;
return;
}
/* args ignored and reset */
Pixmap XmxCreatePixmapFromBitmap
(Widget label, String data, unsigned int width, unsigned int height)
{
Display *_disp;
Pixel _fg, _bg;
Pixmap _pix;
_disp = XtDisplay (label);
Xmx_n = 0;
XmxSetArg (XmNforeground, (XtArgVal)(&_fg));
XmxSetArg (XmNbackground, (XtArgVal)(&_bg));
XtGetValues (label, Xmx_wargs, Xmx_n);
Xmx_n = 0;
_pix = XCreatePixmapFromBitmapData
(_disp, DefaultRootWindow (_disp), data, width, height, _fg, _bg,
DefaultDepthOfScreen (DefaultScreenOfDisplay (_disp)));
return _pix;
}
/* args used */
void XmxApplyPixmapToLabelWidget
(Widget label, Pixmap pix)
{
XmxSetArg (XmNlabelPixmap, (XtArgVal)pix);
XmxSetArg (XmNlabelType, (XtArgVal)XmPIXMAP);
XmxSetValues (label);
Xmx_n = 0;
return;
}
/* ------------------------ DIALOG CONTROL BUTTONS ------------------------ */
/* args apply to form */
Widget XmxMakeFormAndOneButton (Widget parent, XtCallbackProc cb,
String name1, int cb_data1)
{
Widget _form, _button1;
XmxSetArg (XmNverticalSpacing, (XtArgVal)8);
XmxSetArg (XmNfractionBase, (XtArgVal)3);
_form = XmxMakeForm (parent);
_button1 = XmxMakePushButton (_form, name1, cb, cb_data1);
XmxSetConstraints
(_button1, XmATTACH_FORM, XmATTACH_FORM, XmATTACH_NONE, XmATTACH_NONE,
NULL, NULL, NULL, NULL);
XmxSetPositions (_button1, XmxNoPosition, XmxNoPosition, 1, 2);
XmxSetOffsets (_button1, XmxNoOffset, XmxNoOffset, 8, 8);
Xmx_n = 0;
Xmx_w = _form;
return Xmx_w;
}
/* args apply to form */
Widget XmxMakeFormAndTwoButtons
(Widget parent, XtCallbackProc cb,
String name1, String name2,
int cb_data1, int cb_data2)
{
Widget _form, _button1, _button2;
XmxSetArg (XmNverticalSpacing, (XtArgVal)8);
XmxSetArg (XmNfractionBase, (XtArgVal)2);
_form = XmxMakeForm (parent);
_button1 = XmxMakePushButton (_form, name1, cb, cb_data1);
_button2 = XmxMakePushButton (_form, name2, cb, cb_data2);
XmxSetConstraints
(_button1, XmATTACH_FORM, XmATTACH_FORM, XmATTACH_NONE, XmATTACH_NONE,
NULL, NULL, NULL, NULL);
XmxSetConstraints
(_button2, XmATTACH_FORM, XmATTACH_FORM, XmATTACH_NONE, XmATTACH_NONE,
NULL, NULL, NULL, NULL);
XmxSetPositions (_button1, XmxNoPosition, XmxNoPosition, 0, 1);
XmxSetPositions (_button2, XmxNoPosition, XmxNoPosition, 1, 2);
XmxSetOffsets (_button1, XmxNoOffset, XmxNoOffset, 8, 4);
XmxSetOffsets (_button2, XmxNoOffset, XmxNoOffset, 4, 8);
Xmx_n = 0;
Xmx_w = _form;
return Xmx_w;
}
/* args apply to form */
Widget XmxMakeFormAndTwoButtonsSqueezed
(Widget parent, XtCallbackProc cb,
String name1, String name2,
int cb_data1, int cb_data2)
{
Widget _form, _button1, _button2;
XmxSetArg (XmNverticalSpacing, (XtArgVal)8);
XmxSetArg (XmNfractionBase, (XtArgVal)5);
_form = XmxMakeForm (parent);
_button1 = XmxMakePushButton (_form, name1, cb, cb_data1);
_button2 = XmxMakePushButton (_form, name2, cb, cb_data2);
XmxSetConstraints
(_button1, XmATTACH_FORM, XmATTACH_FORM, XmATTACH_NONE, XmATTACH_NONE,
NULL, NULL, NULL, NULL);
XmxSetConstraints
(_button2, XmATTACH_FORM, XmATTACH_FORM, XmATTACH_NONE, XmATTACH_NONE,
NULL, NULL, NULL, NULL);
XmxSetPositions (_button1, XmxNoPosition, XmxNoPosition, 1, 2);
XmxSetPositions (_button2, XmxNoPosition, XmxNoPosition, 3, 4);
XmxSetOffsets (_button1, XmxNoOffset, XmxNoOffset, 8, 4);
XmxSetOffsets (_button2, XmxNoOffset, XmxNoOffset, 4, 8);
Xmx_n = 0;
Xmx_w = _form;
return Xmx_w;
}
/* args apply to form */
Widget XmxMakeFormAndThreeButtonsSqueezed
(Widget parent, XtCallbackProc cb,
String name1, String name2, String name3,
int cb_data1, int cb_data2, int cb_data3)
{
Widget _form, _button1, _button2, _button3;
XmxSetArg (XmNverticalSpacing, (XtArgVal)8);
XmxSetArg (XmNfractionBase, (XtArgVal)7);
_form = XmxMakeForm (parent);
_button1 = XmxMakePushButton (_form, name1, cb, cb_data1);
_button2 = XmxMakePushButton (_form, name2, cb, cb_data2);
_button3 = XmxMakePushButton (_form, name3, cb, cb_data3);
XmxSetConstraints
(_button1, XmATTACH_FORM, XmATTACH_FORM, XmATTACH_NONE, XmATTACH_NONE,
NULL, NULL, NULL, NULL);
XmxSetConstraints
(_button2, XmATTACH_FORM, XmATTACH_FORM, XmATTACH_NONE, XmATTACH_NONE,
NULL, NULL, NULL, NULL);
XmxSetConstraints
(_button3, XmATTACH_FORM, XmATTACH_FORM, XmATTACH_NONE, XmATTACH_NONE,
NULL, NULL, NULL, NULL);
XmxSetPositions (_button1, XmxNoPosition, XmxNoPosition, 1, 2);
XmxSetPositions (_button2, XmxNoPosition, XmxNoPosition, 3, 4);
XmxSetPositions (_button3, XmxNoPosition, XmxNoPosition, 5, 6);
XmxSetOffsets (_button1, XmxNoOffset, XmxNoOffset, 8, 4);
XmxSetOffsets (_button2, XmxNoOffset, XmxNoOffset, 4, 4);
XmxSetOffsets (_button3, XmxNoOffset, XmxNoOffset, 4, 8);
Xmx_n = 0;
Xmx_w = _form;
return Xmx_w;
}
/* args apply to form */
Widget XmxMakeFormAndThreeButtons
(Widget parent, XtCallbackProc cb,
String name1, String name2, String name3,
int cb_data1, int cb_data2, int cb_data3)
{
Widget _form, _button1, _button2, _button3;
XmxSetArg (XmNverticalSpacing, (XtArgVal)8);
XmxSetArg (XmNfractionBase, (XtArgVal)3);
_form = XmxMakeForm (parent);
_button1 = XmxMakePushButton (_form, name1, cb, cb_data1);
_button2 = XmxMakePushButton (_form, name2, cb, cb_data2);
_button3 = XmxMakePushButton (_form, name3, cb, cb_data3);
XmxSetConstraints
(_button1, XmATTACH_FORM, XmATTACH_FORM, XmATTACH_NONE, XmATTACH_NONE,
NULL, NULL, NULL, NULL);
XmxSetConstraints
(_button2, XmATTACH_FORM, XmATTACH_FORM, XmATTACH_NONE, XmATTACH_NONE,
NULL, NULL, NULL, NULL);
XmxSetConstraints
(_button3, XmATTACH_FORM, XmATTACH_FORM, XmATTACH_NONE, XmATTACH_NONE,
NULL, NULL, NULL, NULL);
XmxSetPositions (_button1, XmxNoPosition, XmxNoPosition, 0, 1);
XmxSetPositions (_button2, XmxNoPosition, XmxNoPosition, 1, 2);
XmxSetPositions (_button3, XmxNoPosition, XmxNoPosition, 2, 3);
XmxSetOffsets (_button1, XmxNoOffset, XmxNoOffset, 8, 4);
XmxSetOffsets (_button2, XmxNoOffset, XmxNoOffset, 4, 4);
XmxSetOffsets (_button3, XmxNoOffset, XmxNoOffset, 4, 8);
Xmx_n = 0;
Xmx_w = _form;
return Xmx_w;
}
/* args apply to form */
Widget XmxMakeFormAndFourButtons
(Widget parent, XtCallbackProc cb,
String name1, String name2, String name3, String name4,
int cb_data1, int cb_data2, int cb_data3, int cb_data4)
{
Widget _form, _button1, _button2, _button3, _button4;
XmxSetArg (XmNverticalSpacing, (XtArgVal)8);
XmxSetArg (XmNfractionBase, (XtArgVal)4);
_form = XmxMakeForm (parent);
_button1 = XmxMakePushButton (_form, name1, cb, cb_data1);
_button2 = XmxMakePushButton (_form, name2, cb, cb_data2);
_button3 = XmxMakePushButton (_form, name3, cb, cb_data3);
_button4 = XmxMakePushButton (_form, name4, cb, cb_data4);
XmxSetConstraints
(_button1, XmATTACH_FORM, XmATTACH_FORM, XmATTACH_NONE, XmATTACH_NONE,
NULL, NULL, NULL, NULL);
XmxSetConstraints
(_button2, XmATTACH_FORM, XmATTACH_FORM, XmATTACH_NONE, XmATTACH_NONE,
NULL, NULL, NULL, NULL);
XmxSetConstraints
(_button3, XmATTACH_FORM, XmATTACH_FORM, XmATTACH_NONE, XmATTACH_NONE,
NULL, NULL, NULL, NULL);
XmxSetConstraints
(_button4, XmATTACH_FORM, XmATTACH_FORM, XmATTACH_NONE, XmATTACH_NONE,
NULL, NULL, NULL, NULL);
XmxSetPositions (_button1, XmxNoPosition, XmxNoPosition, 0, 1);
XmxSetPositions (_button2, XmxNoPosition, XmxNoPosition, 1, 2);
XmxSetPositions (_button3, XmxNoPosition, XmxNoPosition, 2, 3);
XmxSetPositions (_button4, XmxNoPosition, XmxNoPosition, 3, 4);
XmxSetOffsets (_button1, XmxNoOffset, XmxNoOffset, 8, 4);
XmxSetOffsets (_button2, XmxNoOffset, XmxNoOffset, 4, 4);
XmxSetOffsets (_button3, XmxNoOffset, XmxNoOffset, 4, 4);
XmxSetOffsets (_button4, XmxNoOffset, XmxNoOffset, 4, 8);
Xmx_n = 0;
Xmx_w = _form;
return Xmx_w;
}
/* args apply to form */
Widget XmxMakeFormAndFiveButtons
(Widget parent, XtCallbackProc cb,
String name1, String name2, String name3, String name4, String name5,
int cb_data1, int cb_data2, int cb_data3, int cb_data4, int cb_data5)
{
Widget _form, _button1, _button2, _button3, _button4, _button5;
XmxSetArg (XmNverticalSpacing, (XtArgVal)8);
XmxSetArg (XmNfractionBase, (XtArgVal)5);
_form = XmxMakeForm (parent);
_button1 = XmxMakePushButton (_form, name1, cb, cb_data1);
_button2 = XmxMakePushButton (_form, name2, cb, cb_data2);
_button3 = XmxMakePushButton (_form, name3, cb, cb_data3);
_button4 = XmxMakePushButton (_form, name4, cb, cb_data4);
_button5 = XmxMakePushButton (_form, name5, cb, cb_data5);
XmxSetConstraints
(_button1, XmATTACH_FORM, XmATTACH_FORM, XmATTACH_NONE, XmATTACH_NONE,
NULL, NULL, NULL, NULL);
XmxSetConstraints
(_button2, XmATTACH_FORM, XmATTACH_FORM, XmATTACH_NONE, XmATTACH_NONE,
NULL, NULL, NULL, NULL);
XmxSetConstraints
(_button3, XmATTACH_FORM, XmATTACH_FORM, XmATTACH_NONE, XmATTACH_NONE,
NULL, NULL, NULL, NULL);
XmxSetConstraints
(_button4, XmATTACH_FORM, XmATTACH_FORM, XmATTACH_NONE, XmATTACH_NONE,
NULL, NULL, NULL, NULL);
XmxSetConstraints
(_button5, XmATTACH_FORM, XmATTACH_FORM, XmATTACH_NONE, XmATTACH_NONE,
NULL, NULL, NULL, NULL);
XmxSetPositions (_button1, XmxNoPosition, XmxNoPosition, 0, 1);
XmxSetPositions (_button2, XmxNoPosition, XmxNoPosition, 1, 2);
XmxSetPositions (_button3, XmxNoPosition, XmxNoPosition, 2, 3);
XmxSetPositions (_button4, XmxNoPosition, XmxNoPosition, 3, 4);
XmxSetPositions (_button5, XmxNoPosition, XmxNoPosition, 4, 5);
XmxSetOffsets (_button1, XmxNoOffset, XmxNoOffset, 8, 4);
XmxSetOffsets (_button2, XmxNoOffset, XmxNoOffset, 4, 4);
XmxSetOffsets (_button3, XmxNoOffset, XmxNoOffset, 4, 4);
XmxSetOffsets (_button4, XmxNoOffset, XmxNoOffset, 4, 4);
XmxSetOffsets (_button5, XmxNoOffset, XmxNoOffset, 4, 8);
Xmx_n = 0;
Xmx_w = _form;
return Xmx_w;
}
static void _XmxYesOrNoResponse (Widget w, int *answer, XmAnyCallbackStruct *cbs)
{
if (cbs->reason == XmCR_OK)
*answer = 1;
else if (cbs->reason == XmCR_CANCEL)
*answer = 0;
}
int XmxModalYesOrNo (Widget parent, XtAppContext app,
char *questionstr, char *yesstr, char *nostr)
{
Widget dialog;
XmString question, yes, no, title;
int answer = -1;
/* startbouncetimer();*/
question = XmStringCreateLtoR (questionstr, XmSTRING_DEFAULT_CHARSET);
yes = XmStringCreateLtoR (yesstr, XmSTRING_DEFAULT_CHARSET);
no = XmStringCreateLtoR (nostr, XmSTRING_DEFAULT_CHARSET);
title = XmStringCreateLtoR ("Prompt", XmSTRING_DEFAULT_CHARSET);
XmxSetArg (XmNdialogTitle, (XtArgVal)title);
XmxSetArg (XmNdialogStyle, XmDIALOG_FULL_APPLICATION_MODAL);
XmxSetArg (XmNmessageString, (XtArgVal)question);
XmxSetArg (XmNokLabelString, (XtArgVal)yes);
XmxSetArg (XmNcancelLabelString, (XtArgVal)no);
XmxSetArg (XmNsymbolPixmap, (XtArgVal)dialogQuestion);
dialog = XmCreateQuestionDialog (parent, "question_dialog", Xmx_wargs, Xmx_n);
Xmx_n = 0;
XtUnmanageChild (XmMessageBoxGetChild (dialog, XmDIALOG_HELP_BUTTON));
XtAddCallback (dialog, XmNokCallback,
(XtCallbackProc)_XmxYesOrNoResponse, &answer);
XtAddCallback (dialog, XmNcancelCallback,
(XtCallbackProc)_XmxYesOrNoResponse, &answer);
XtManageChild (dialog);
while (answer == -1)
{
XtAppProcessEvent (app, XtIMAll);
XSync (XtDisplay (dialog), 0);
}
XtUnmanageChild (dialog);
XSync (XtDisplay (dialog), 0);
XmUpdateDisplay (dialog);
XmStringFree (question);
XmStringFree (yes);
XmStringFree (no);
XmStringFree (title);
XtDestroyWidget (dialog);
/* stopbouncetimer();*/
return answer;
}
/* ------------------------------------------------------------------------ */
#define XMX_NO_ANSWER "-*-no answer, dammit, but Xmx rules, yo yo yo-*-"
/*SWP -- 7/6/95*/
static void _XmxActivate (Widget w, char **answer,
XmSelectionBoxCallbackStruct *cbs)
{
*answer = XMX_NO_ANSWER;
}
static void _XmxPromptForStringResponse (Widget w, char **answer,
XmSelectionBoxCallbackStruct *cbs)
{
if (!XmStringGetLtoR (cbs->value, XmSTRING_DEFAULT_CHARSET, answer))
*answer = XMX_NO_ANSWER;
}
static void _XmxPromptForStringCancel (Widget w, char **answer,
XmSelectionBoxCallbackStruct *cbs)
{
*answer = XMX_NO_ANSWER;
}
/*SWP -- 7/4/95*/
void XmxMakeInfoDialogWait (Widget parent, XtAppContext app,
char *infostr, char *titlestr, char *yesstr)
{
Widget dialog;
XmString info, yes, title;
char *answer = NULL;
info = XmStringCreateLtoR (infostr, XmSTRING_DEFAULT_CHARSET);
yes = XmStringCreateLtoR (yesstr, XmSTRING_DEFAULT_CHARSET);
title = XmStringCreateLtoR (titlestr, XmSTRING_DEFAULT_CHARSET);
XmxSetArg (XmNdialogTitle, (XtArgVal)title);
XmxSetArg (XmNdialogStyle, XmDIALOG_FULL_APPLICATION_MODAL);
XmxSetArg (XmNmessageString, (XtArgVal)info);
XmxSetArg (XmNokLabelString, (XtArgVal)yes);
XmxSetArg (XmNsymbolPixmap, (XtArgVal)dialogInformation);
dialog = XmCreateInformationDialog (parent, "information_dialog", Xmx_wargs, Xmx_n);
Xmx_n = 0;
XtUnmanageChild (XmMessageBoxGetChild (dialog, XmDIALOG_HELP_BUTTON));
XtUnmanageChild (XmMessageBoxGetChild (dialog, XmDIALOG_CANCEL_BUTTON));
XtAddCallback (dialog, XmNokCallback,
(XtCallbackProc)_XmxActivate, &answer);
XtManageChild (dialog);
while (answer == NULL)
{
XtAppProcessEvent (app, XtIMAll);
XSync (XtDisplay (dialog), 0);
}
XtUnmanageChild (dialog);
XSync (XtDisplay (dialog), 0);
XmUpdateDisplay (dialog);
XmStringFree (info);
XmStringFree (yes);
XmStringFree (title);
XtDestroyWidget (dialog);
return;
}
/*SWP -- 4/15/96*/
void XmxMakeErrorDialogWait (Widget parent, XtAppContext app,
char *infostr, char *titlestr, char *yesstr)
{
Widget dialog;
XmString info, yes, title;
char *answer = NULL;
info = XmStringCreateLtoR (infostr, XmSTRING_DEFAULT_CHARSET);
yes = XmStringCreateLtoR (yesstr, XmSTRING_DEFAULT_CHARSET);
title = XmStringCreateLtoR (titlestr, XmSTRING_DEFAULT_CHARSET);
XmxSetArg (XmNdialogTitle, (XtArgVal)title);
XmxSetArg (XmNdialogStyle, XmDIALOG_FULL_APPLICATION_MODAL);
XmxSetArg (XmNmessageString, (XtArgVal)info);
XmxSetArg (XmNokLabelString, (XtArgVal)yes);
XmxSetArg (XmNsymbolPixmap, (XtArgVal)dialogError);
dialog = XmCreateInformationDialog (parent, "information_dialog", Xmx_wargs, Xmx_n);
Xmx_n = 0;
XtUnmanageChild (XmMessageBoxGetChild (dialog, XmDIALOG_HELP_BUTTON));
XtUnmanageChild (XmMessageBoxGetChild (dialog, XmDIALOG_CANCEL_BUTTON));
XtAddCallback (dialog, XmNokCallback,
(XtCallbackProc)_XmxActivate, &answer);
XtManageChild (dialog);
while (answer == NULL)
{
XtAppProcessEvent (app, XtIMAll);
XSync (XtDisplay (dialog), 0);
}
XtUnmanageChild (dialog);
XSync (XtDisplay (dialog), 0);
XmUpdateDisplay (dialog);
XmStringFree (info);
XmStringFree (yes);
XmStringFree (title);
XtDestroyWidget (dialog);
return;
}
char *XmxModalPromptForString (Widget parent, XtAppContext app,
char *questionstr, char *yesstr, char *nostr)
{
Widget dialog;
XmString question, yes, no, title;
char *answer = NULL;
/* startbouncetimer();*/
question = XmStringCreateLtoR (questionstr, XmSTRING_DEFAULT_CHARSET);
yes = XmStringCreateLtoR (yesstr, XmSTRING_DEFAULT_CHARSET);
no = XmStringCreateLtoR (nostr, XmSTRING_DEFAULT_CHARSET);
title = XmStringCreateLtoR ("Prompt", XmSTRING_DEFAULT_CHARSET);
XmxSetArg (XmNdialogTitle, (XtArgVal)title);
XmxSetArg (XmNdialogStyle, XmDIALOG_FULL_APPLICATION_MODAL);
XmxSetArg (XmNselectionLabelString, (XtArgVal)question);
XmxSetArg (XmNokLabelString, (XtArgVal)yes);
XmxSetArg (XmNcancelLabelString, (XtArgVal)no);
dialog = XmCreatePromptDialog (parent, "question_dialog", Xmx_wargs, Xmx_n);
Xmx_n = 0;
XtUnmanageChild (XmSelectionBoxGetChild (dialog, XmDIALOG_HELP_BUTTON));
XtAddCallback (dialog, XmNokCallback,
(XtCallbackProc)_XmxPromptForStringResponse, &answer);
XtAddCallback (dialog, XmNcancelCallback,
(XtCallbackProc)_XmxPromptForStringCancel, &answer);
XtManageChild (dialog);
while (answer == NULL)
{
XtAppProcessEvent (app, XtIMAll);
XSync (XtDisplay (dialog), 0);
}
XtUnmanageChild (dialog);
XSync (XtDisplay (dialog), 0);
XmUpdateDisplay (dialog);
XmStringFree (question);
XmStringFree (yes);
XmStringFree (no);
XmStringFree (title);
XtDestroyWidget (dialog);
/* stopbouncetimer();*/
if (!answer || strcmp (answer, XMX_NO_ANSWER) == 0)
return NULL;
else
return answer;
}
/* ------------------------------------------------------------------------ */
#define XMX_NO_ANSWER "-*-no answer, dammit, but Xmx rules, yo yo yo-*-"
static char *_passwd = NULL;
static void _XmxPromptForPasswordResponse (Widget w, char **answer,
XmSelectionBoxCallbackStruct *cbs)
{
if (!XmStringGetLtoR (cbs->value, XmSTRING_DEFAULT_CHARSET, answer))
*answer = XMX_NO_ANSWER;
}
static void _XmxPromptForPasswordCancel (Widget w, char **answer,
XmSelectionBoxCallbackStruct *cbs)
{
*answer = XMX_NO_ANSWER;
}
static void _XmxPromptForPasswordVerify (Widget text_w, XtPointer unused,
XmTextVerifyCallbackStruct *cbs)
{
char *new;
int len;
if (cbs->reason != XmCR_MODIFYING_TEXT_VALUE)
{
return;
}
if (cbs->text->ptr == NULL)
{ /* backspace */
cbs->doit = True;
if (_passwd && *_passwd)
{
int start;
char *tptr;
len = strlen(_passwd);
/* Find the start of the delete */
if (cbs->startPos < len)
{
start = cbs->startPos;
}
else
{
start = len - 1;
}
/* Move up stuff after the delete */
if (cbs->endPos > len)
{
tptr = &(_passwd[len]);
}
else
{
tptr = &(_passwd[cbs->endPos]);
}
_passwd[start] ='\0';
strcat(_passwd, tptr);
}
}
else if (cbs->text->length >= 1)
{
int i;
if (_passwd == NULL)
{
_passwd = XtMalloc (cbs->text->length + 1);
strncpy(_passwd, cbs->text->ptr, cbs->text->length);
_passwd[cbs->text->length] = '\0';
}
else
{
char *tptr;
char tchar;
int start;
len = strlen(_passwd);
/* Find the start of the delete */
if (cbs->startPos < len)
{
start = cbs->startPos;
}
else
{
start = len;
}
tptr = &(_passwd[start]);
tchar = *tptr;
*tptr = '\0';
new = XtMalloc (len + cbs->text->length + 1);
strcpy(new, _passwd);
strncat(new, cbs->text->ptr, cbs->text->length);
new[start + cbs->text->length] = '\0';
*tptr = tchar;
strcat(new, tptr);
XtFree(_passwd);
_passwd = new;
}
cbs->doit = True;
/* make a '*' show up instead of what they typed */
for (i=0; i < cbs->text->length; i++)
{
cbs->text->ptr[i] = '*';
}
}
}
char *XmxModalPromptForPassword (Widget parent, XtAppContext app,
char *questionstr, char *yesstr, char *nostr)
{
Widget dialog;
XmString question, yes, no, title;
char *answer = NULL;
/* startbouncetimer();*/
_passwd = NULL;
question = XmStringCreateLtoR (questionstr, XmSTRING_DEFAULT_CHARSET);
yes = XmStringCreateLtoR (yesstr, XmSTRING_DEFAULT_CHARSET);
no = XmStringCreateLtoR (nostr, XmSTRING_DEFAULT_CHARSET);
title = XmStringCreateLtoR ("Prompt", XmSTRING_DEFAULT_CHARSET);
XmxSetArg (XmNdialogTitle, (XtArgVal)title);
XmxSetArg (XmNdialogStyle, XmDIALOG_FULL_APPLICATION_MODAL);
XmxSetArg (XmNselectionLabelString, (XtArgVal)question);
XmxSetArg (XmNokLabelString, (XtArgVal)yes);
XmxSetArg (XmNcancelLabelString, (XtArgVal)no);
dialog = XmCreatePromptDialog (parent, "question_dialog", Xmx_wargs, Xmx_n);
Xmx_n = 0;
XtUnmanageChild (XmSelectionBoxGetChild (dialog, XmDIALOG_HELP_BUTTON));
XtAddCallback
(XmSelectionBoxGetChild (dialog, XmDIALOG_TEXT),
XmNmodifyVerifyCallback, (XtCallbackProc)_XmxPromptForPasswordVerify, 0);
XtAddCallback (dialog, XmNokCallback,
(XtCallbackProc)_XmxPromptForPasswordResponse, &answer);
XtAddCallback (dialog, XmNcancelCallback,
(XtCallbackProc)_XmxPromptForPasswordCancel, &answer);
XtManageChild (dialog);
while (answer == NULL)
{
XtAppProcessEvent (app, XtIMAll);
XSync (XtDisplay (dialog), 0);
}
XtUnmanageChild (dialog);
XSync (XtDisplay (dialog), 0);
XmUpdateDisplay (dialog);
XmStringFree (question);
XmStringFree (yes);
XmStringFree (no);
XmStringFree (title);
XtDestroyWidget (dialog);
/* stopbouncetimer();*/
if (!answer || strcmp (answer, XMX_NO_ANSWER) == 0 ||
!_passwd || !(*_passwd))
return NULL;
else
return strdup (_passwd);
}