This is StrokeMain.c in view mode; [Download] [Up]
/*
* $RCSfile: StrokeMain.c,v $
*
* Copyright (C) 1992 by Adobe Systems Incorporated.
* All rights reserved.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation for any purpose and without fee is hereby granted,
* provided that the above copyright notices appear in all copies and that
* both those copyright notices and this permission notice appear in
* supporting documentation and that the name of Adobe Systems
* Incorporated not be used in advertising or publicity pertaining to
* distribution of the software without specific, written prior
* permission. If any portion of this software is changed, it cannot be
* marketed under Adobe's trademarks and/or copyrights unless Adobe, in
* its sole discretion, approves by a prior writing the quality of the
* resulting implementation.
*
* ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
* ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
* ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
* IMPLIED WARRANTIES OF MERCHANTABILITY FITNESS FOR A PARTICULAR PURPOSE AND
* NON-INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
* TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
* NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
* PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
*
* PostScript, Display PostScript, and Adobe are trademarks of Adobe Systems
* Incorporated registered in the U.S.A. and other countries.
*
* Author: Adobe Systems Incorporated
*/
/***************************************************************
**
** INCLUDE FILES
**
***************************************************************/
#include "Stroke.h"
/***************************************************************
**
** DATA DECLARATIONS
**
***************************************************************/
/*
** Global pointers to the application name and data block
*/
AppDataType AppData;
static Widget WidgetArray [MAX_WIDGETS]; /* Place to keep all */
/* widget IDs */
static void initApplication(), refreshWindow(), createProc(),
quitApp(), traceProc(), drawProc();
/*
** Global resource management data
*/
static MrmHierarchy SMrmHierarchy; /* MRM database hierarchy ID */
static MrmType *DummyClass; /* and class variable. */
static char *DbFilenameVec [] = /* Mrm.heirarchy file list. */
{
"Stroke.uid"
};
/* Names and addresses for Mrm to bind */
static MrmRegisterArg RegList [] =
{
{"refreshWindow" , (caddr_t) refreshWindow },
{"createProc" , (caddr_t) createProc },
{"quitApp" , (caddr_t) quitApp },
{"traceProc" , (caddr_t) traceProc },
{"drawProc" , (caddr_t) drawProc },
};
static XrmOptionDescRec CommandLineOptions[] = {
{
"-trace", ".trace", XrmoptionNoArg, (XtPointer)"true"
},
};
static XtResource ApplicationResources[] = {
{
"trace",
"Trace",
XtRBoolean,
sizeof(Boolean),
XtOffset (AppDataTypePtr, traceToggle),
XtRImmediate,
(XtPointer)False
},
};
static String FallbackResources[] = {
NULL
};
/***************************************************************
**
** FUNCTION: main
**
** DESCRIPTION: OS transfer point. The main routine does all
** the one-time setup and then goes into its dispatching
** loop.
**
** PARAMETERS: argc command line argument count
** argv array of pointers to command line args.
**
** RETURN: None.
**
***************************************************************/
unsigned int main (argc, argv)
unsigned int argc;
char *argv [];
{
Widget TopLevelShell, MainWindowWidget;
XtAppContext appContext;
/*
** Initialize MRM before initializing the X Toolkit.
*/
MrmInitialize ();
TopLevelShell = XtVaAppInitialize (
&appContext,
"Stroke",
(XrmOptionDescList) CommandLineOptions,
(Cardinal)XtNumber(CommandLineOptions),
&argc,
argv,
(String *)FallbackResources,
XmNallowShellResize, True,
XmNmwmFunctions, MWM_FUNC_ALL |
MWM_FUNC_RESIZE |
MWM_FUNC_MAXIMIZE |
MWM_FUNC_CLOSE,
XmNmwmDecorations, MWM_DECOR_ALL |
MWM_DECOR_MAXIMIZE |
MWM_DECOR_RESIZEH,
NULL
);
if (!XDPSExtensionPresent(XtDisplay(TopLevelShell)))
{
fprintf (stderr, "%s: DPS extension not in server\n", argv [0]);
exit (1);
}
XtVaGetApplicationResources (
TopLevelShell,
(XtPointer)&AppData,
(XtResourceList) ApplicationResources,
(Cardinal) XtNumber(ApplicationResources),
NULL
);
/*
** Open the UID files (the output of the UIL compiler)
*/
if (MrmOpenHierarchy (XtNumber(DbFilenameVec), DbFilenameVec, NULL,
&SMrmHierarchy) != MrmSUCCESS)
{
fprintf (stderr, "Can't open heirarchy\n");
exit (1);
}
/*
** Perform onetime initialization of application data structures.
*/
initApplication ();
/*
** Register the items MRM needs to bind for us.
*/
MrmRegisterNames (RegList, XtNumber(RegList));
/*
** Get the main window for the application.
*/
if (MrmFetchWidget (SMrmHierarchy, "MainWindow", TopLevelShell,
&MainWindowWidget, &DummyClass) != MrmSUCCESS)
{
fprintf (stderr, "Can't fetch main window\n");
exit (1);
}
/*
** Manage the main window and option box and realize everything.
** The interface comes up on the display now.
*/
XtManageChild (MainWindowWidget);
XtRealizeWidget (TopLevelShell);
/*
** Do all the post-realization DPSX processing here
*/
initDPSContext (XtDisplay(TopLevelShell));
/*
** Sit around forever waiting to process X-events.
** From here on, we only execute our callback routines.
*/
while (1) {
XEvent event;
XtAppNextEvent(appContext, &event);
if (!XDPSDispatchEvent(&event)) (void) XtDispatchEvent(&event);
}
}
/***************************************************************
**
** FUNCTION: initApplication
**
** DESCRIPTION: One-time initialization of application data
** structures.
**
** PARAMETERS: None.
**
** RETURN: None.
**
***************************************************************/
static void initApplication ()
{
/*
** Initialize line type toggle buttons
*/
AppData.horizontalT = False;
AppData.verticalT = False;
AppData.diagonalT = False;
AppData.arcT = False;
/*
** Initialize line width value
*/
AppData.lineWidth = 0.0;
} /* end initApplication () */
/***************************************************************
**
** FUNCTION: refreshWindow
**
** DESCRIPTION: Callback routine to handle expose events.
** Causes the window to be refreshed.
**
** PARAMETERS: w callback widget ID
** clientData callback client data
** callData callback Motif data structure
**
** RETURN: None.
**
***************************************************************/
static void refreshWindow (w, clientData, callData)
Widget w;
XtPointer clientData, callData;
{
Dimension height;
XEvent event;
/*
** Pseudo Exposure event compression for the Drawing Area Widget
*/
if (XPending(XtDisplay(w)) > 0) {
XPeekEvent(XtDisplay(w), &event);
if (event.type == Expose && event.xany.window == XtWindow(w)) return;
}
XtVaGetValues(w, XtNheight, &height, NULL);
if (w == AppData.window0) {
XDPSSetContextGState(AppData.dpsCtxt, AppData.gs0);
} else XDPSSetContextGState(AppData.dpsCtxt, AppData.gs1);
PSsetlinewidth (AppData.lineWidth);
PSerasepage();
if (AppData.horizontalT) makeHorizLines();
if (AppData.verticalT) makeVertLines();
if (AppData.arcT) makeArcs ();
if (AppData.diagonalT) makeDiagLines();
} /* end refreshWindow () */
/***************************************************************
**
** FUNCTION: createProc
**
** DESCRIPTION: Callback routine for widget creation.
** Saves the widget id in an array.
**
** PARAMETERS: w callback widget ID
** clientData callback client data
** callData callback Motif data structure
**
** RETURN: None.
**
***************************************************************/
static void createProc (w, clientData, callData)
Widget w;
XtPointer clientData, callData;
{
int widgetNum = *(int *) clientData;
/*
** Save widget ID
*/
WidgetArray [widgetNum] = w;
/*
** Save widget ID in application data structure
*/
switch (widgetNum)
{
case cMainDrawArea0:
AppData.window0 = w;
break;
case cMainDrawArea1:
AppData.window1 = w;
break;
case cTraceToggle:
/*
** If trace turned on by command line, set button
*/
XmToggleButtonGadgetSetState (w, AppData.traceToggle, False);
break;
} /* end switch */
} /* end createProc () */
/***************************************************************
**
** FUNCTION: quitApp
**
** DESCRIPTION: Callback routine for "quit" command menu
** selection. Exits from the application.
**
** PARAMETERS: w callback widget ID
** clientData callback client data
** callData callback Motif data structure
**
** RETURN: Returns to OS.
**
***************************************************************/
static void quitApp (w, clientData, callData)
Widget w;
XtPointer clientData, callData;
{
XtDestroyApplicationContext(XtWidgetToApplicationContext(w));
exit (0);
} /* end quitApp () */
/***************************************************************
**
** FUNCTION: traceProc
**
** DESCRIPTION: Callback routine for the trace toggle button.
**
** PARAMETERS: w callback widget ID
** clientData callback client data
** callData callback Motif data structure
**
** RETURN: None.
**
***************************************************************/
static void traceProc (w, clientData, callData)
Widget w;
XtPointer clientData, callData;
{
XmToggleButtonCallbackStruct *toggle =
(XmToggleButtonCallbackStruct *) callData;
/*
** Change the state of the toggle button
*/
XDPSChainTextContext (AppData.dpsCtxt, toggle->set);
} /* end traceProc () */
/***************************************************************
**
** FUNCTION: drawProc
**
** DESCRIPTION: Callback routine for draw button pushed.
** Reads the toggle states and line width
** scale value. If necessary, calls drawIt ()
** to redraw the lines and display the times.
**
** PARAMETERS: w callback widget ID
** clientData callback client data
** callData callback Motif data structure
**
** RETURN: None.
**
***************************************************************/
static void drawProc (w, clientData, callData)
Widget w;
XtPointer clientData, callData;
{
int temp;
/*
** Get the state of the toggle buttons
*/
AppData.horizontalT = XmToggleButtonGetState (WidgetArray [cTypeButton0]);
AppData.diagonalT = XmToggleButtonGetState (WidgetArray [cTypeButton1]);
AppData.verticalT = XmToggleButtonGetState (WidgetArray [cTypeButton2]);
AppData.arcT = XmToggleButtonGetState (WidgetArray [cTypeButton3]);
/*
** Read the scale value for line width
*/
XmScaleGetValue(WidgetArray [cWidthScale], &temp);
AppData.lineWidth = (float) temp / 100;
/*
** See if there are any lines to draw
*/
if (AppData.horizontalT || AppData.diagonalT ||
AppData.verticalT || AppData.arcT) {
drawIt ();
} else {
setTimingValue (cTimingText0, 0);
setTimingValue (cTimingText1, 0);
}
} /* end drawProc () */
/***************************************************************
**
** FUNCTION: setTimingValue
**
** DESCRIPTION: Routine to set timing value in options box.
**
** PARAMETERS: num index in WidgetArray of XmText widget
** iTime timing value
**
** RETURN: None.
**
***************************************************************/
void setTimingValue (num, iTime)
int num;
int iTime;
{
char cTime [15];
if (iTime == 0) cTime [0] = '\0';
else sprintf (cTime, "%d", iTime);
XtVaSetValues (WidgetArray [num],
XmNlabelString, XmStringCreateSimple(cTime),
NULL);
} /* end setTimingValue () */
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.