This is HelloMain.c in view mode; [Download] [Up]
/* * $RCSfile: HelloMain.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 <stdio.h> #include <Xm/Xm.h> #include <Xm/MwmUtil.h> #include <Mrm/MrmAppl.h> /* Motif Toolkit and MRM */ #include <DPS/dpsXclient.h> #include <DPS/dpsXshare.h> #include <DPS/psops.h> #include "HelloWraps.h" /*************************************************************** ** ** CONSTANT DEFINITIONS ** ***************************************************************/ /* ** These numbers are matched with corresponding numbers in Hello.uil */ #define cMainDrawArea 1 #define cTraceToggle 2 #define cWriteTextToggle 3 /*************************************************************** ** ** TYPE DECLARATIONS ** ***************************************************************/ typedef struct { Widget widget; /* drawing area widget ID */ DPSContext dpsCtxt; /* drawing DPS context */ String message; /* message to display */ Boolean trace; /* Send PostScript trace to stdout */ Boolean writeText; /* Toggle state to write the text */ } AppDataType, *AppDataTypePtr; /*************************************************************** ** ** FUNCTION DECLARATIONS ** ***************************************************************/ void createProc(), resizeWindow(), refreshWindow(), quitApp(), traceProc(), writeProc(); void initDPSContext(); /*************************************************************** ** ** DATA DECLARATIONS ** ***************************************************************/ /* ** Global data block */ AppDataType AppData; /* ** Global resource management data */ static MrmHierarchy SMrmHierarchy; /* MRM database hierarchy ID */ static MrmType *DummyClass; static char *DbFilenameVec [] = /* Mrm.hierarchy file list. */ { "Hello.uid" }; /* Names and addresses for Mrm to bind */ static MrmRegisterArg RegList [] = { {"refreshWindow" , (caddr_t) refreshWindow }, {"resizeWindow" , (caddr_t) resizeWindow }, {"createProc" , (caddr_t) createProc }, {"quitApp" , (caddr_t) quitApp }, {"traceProc" , (caddr_t) traceProc }, {"writeProc" , (caddr_t) writeProc } }; static XrmOptionDescRec CommandLineOptions[] = { { "-trace", /* turn PostScript tracing on */ ".trace", /* resource specifier for tracing */ XrmoptionNoArg, (XtPointer) "true" }, { "-message", /* message to display */ ".message", /* message resource specifier */ XrmoptionSepArg, /* -message <string> */ (XtPointer) NULL /* message to display */ }, { "-write", /* write text option */ ".writeText", /* resource specifier for write text */ XrmoptionNoArg, (XtPointer) "false" } }; static XtResource Resources[] = { { "trace", "Trace", XtRBoolean, sizeof(Boolean), XtOffset(AppDataTypePtr,trace), XtRImmediate, (XtPointer)False }, { "message", "Message", XtRString, sizeof(String), XtOffset(AppDataTypePtr,message), XtRString, (XtPointer)"Resource File Not Found" }, { "writeText", "WriteText", XtRBoolean, sizeof(Boolean), XtOffset(AppDataTypePtr,writeText), XtRImmediate, (XtPointer)True } }; static String FallbackResources[] = { "Hello.mMainForm.height: 400", "Hello.mMainForm.width: 900", 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; { XtAppContext appContext; Widget appShellWidget; Widget mainWindowWidget; /* ** Initialize MRM before initializing the X Toolkit. */ MrmInitialize (); /* ** Initialize the X Toolkit. Get back an application level shell widget. */ appShellWidget = XtAppInitialize (&appContext, "Hello", (XrmOptionDescRec *)CommandLineOptions, XtNumber(CommandLineOptions), &argc, argv, (String *)FallbackResources, (ArgList)NULL, 0); XtGetApplicationResources ( appShellWidget, (XtPointer)&AppData, Resources, XtNumber(Resources), (ArgList)NULL, 0); /* ** Verify that the DPS extension is present in the X server. */ if (!XDPSExtensionPresent (XtDisplay(appShellWidget))) { fprintf (stderr, "%s: DPS extension not in server\n", argv[0]); exit (1); } /* ** Open the UID files (the output of the UIL compiler) */ if (MrmOpenHierarchy (XtNumber(DbFilenameVec), DbFilenameVec, (MrmOsOpenParamPtr *) NULL, &SMrmHierarchy) != MrmSUCCESS) { fprintf (stderr, "Can't open hierarchy\n"); exit (1); } /* ** Register the items MRM needs to bind for us. */ MrmRegisterNames (RegList, XtNumber(RegList)); /* ** Get the main window for the application. */ if (MrmFetchWidget (SMrmHierarchy, "MainWindow", appShellWidget, &mainWindowWidget, &DummyClass) != MrmSUCCESS) { fprintf (stderr, "Can't fetch main window\n"); exit (1); } /* ** Manage and realize the main window. ** The interface comes up on the display now. */ XtManageChild (mainWindowWidget); XtRealizeWidget (appShellWidget); /* ** Do all the post-realization DPSX processing here */ initDPSContext (appShellWidget); /* ** Sit around forever waiting to process X and DPS events. ** From here on, we only execute our callback routines. */ while (1) { XEvent event; XtAppNextEvent(appContext, &event); if (!XDPSDispatchEvent(&event)) (void) XtDispatchEvent(&event); } } /*************************************************************** ** ** 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. ** ***************************************************************/ void refreshWindow (w, clientData, callData) Widget w; XtPointer clientData, callData; { register Display *dpy = XtDisplay(w); register Window window = XtWindow(w); XEvent event; /* ** Pseudo Exposure event compression for the Drawing Area Widget */ if (XPending(dpy) > 0) { XPeekEvent(dpy, &event); if (event.type == Expose && event.xany.window == window) return; } /* ** Redraw if text is being shown */ PSerasepage (); if (AppData.writeText) PSWDisplayText (AppData.message); } /* end refreshWindow () */ /*************************************************************** ** ** FUNCTION: resizeWindow ** ** DESCRIPTION: Callback routine to handle resize events. ** ** PARAMETERS: w callback widget ID ** clientData callback client data ** callData callback Motif data structure ** ** RETURN: None. ** ***************************************************************/ void resizeWindow (w, clientData, callData) Widget w; XtPointer clientData, callData; { if (!XtIsRealized(w)) return; PSinitclip(); PSinitviewclip(); } /* end resizeWindow () */ /*************************************************************** ** ** FUNCTION: createProc ** ** DESCRIPTION: Callback routine for widget creation. ** ** PARAMETERS: w callback widget ID ** clientData callback client data ** callData callback Motif data structure ** ** RETURN: None. ** ***************************************************************/ void createProc (w, clientData, callData) Widget w; XtPointer clientData, callData; { int widgetNum = *(int *) clientData; switch (widgetNum) { case cMainDrawArea: /* ** Save widget ID in application data structure */ AppData.widget = w; break; case cTraceToggle: /* ** If trace turned on by command line, set button */ if (AppData.trace) XtVaSetValues (w, XmNset, True, NULL); break; case cWriteTextToggle: /* ** If write text turned on by resource */ if (AppData.writeText) XtVaSetValues (w, XmNset, True, NULL); break; } /* end switch */ } /* end createProc () */ /*************************************************************** ** ** FUNCTION: quitApp ** ** DESCRIPTION: Callback routine for "quit" command menu ** selection. The space allocated in the DPS ** server is freed. The X display is closed. ** Exits from the application. ** ** PARAMETERS: w callback widget ID ** clientData callback client data ** callData callback Motif data structure ** ** RETURN: Returns to OS. ** ***************************************************************/ void quitApp (w, clientData, callData) Widget w; XtPointer clientData, callData; { if (AppData.dpsCtxt != NULL) XDPSDestroySharedContext (AppData.dpsCtxt); /* ** Close the X display and free all X resources. */ XtDestroyApplicationContext(XtWidgetToApplicationContext(w)); /* ** Exit the application. */ 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. ** ***************************************************************/ void traceProc (w, clientData, callData) Widget w; XtPointer clientData, callData; { XmToggleButtonCallbackStruct *toggle = (XmToggleButtonCallbackStruct *)callData; /* ** Change the state of the toggle flag */ AppData.trace = toggle->set; /* ** Chain text context for trace option if trace is on */ XDPSChainTextContext (AppData.dpsCtxt, AppData.trace); } /* end traceProc () */ /*************************************************************** ** ** FUNCTION: writeProc ** ** DESCRIPTION: Callback routine for the write push button. ** ** PARAMETERS: w callback widget ID ** clientData callback client data ** callData callback Motif data structure ** ** RETURN: None. ** ***************************************************************/ void writeProc (w, clientData, callData) Widget w; XtPointer clientData, callData; { XmToggleButtonCallbackStruct *toggle = (XmToggleButtonCallbackStruct *)callData; AppData.writeText = toggle->set; /* ** Draw the text to the draw area window */ PSerasepage (); if (AppData.writeText) PSWDisplayText (AppData.message); } /* end writeProc () */ /*************************************************************** ** ** FUNCTION: initDPSContext ** ** DESCRIPTION: Post-Realization initialization of DPS context and such. ** ** PARAMETERS: None. ** ** RETURN: None. ** ***************************************************************/ void initDPSContext (shell) Widget shell; { XSetWindowAttributes attr; Dimension height, width; /* ** Create the shared DPS context in which rendering will occur */ AppData.dpsCtxt = XDPSGetSharedContext (XtDisplay(shell)); if (AppData.dpsCtxt == NULL) { printf ("Couldn't create a Display PostScript context.\n"); exit (1); } /* ** Set the default DPS context */ DPSSetContext (AppData.dpsCtxt); (void) XDPSSetEventDelivery(XtDisplay(shell), dps_event_pass_through); XtVaGetValues ( AppData.widget, XmNwidth, &width, XmNheight, &height, NULL ); if (XDPSSetContextDrawable(AppData.dpsCtxt, XtWindow(AppData.widget), height) != dps_status_success) { printf ("Couldn't set Display PostScript context drawable.\n"); exit (1); } /* ** Change DPS origin to center of window and keep it there */ PSsetXoffset(width/2, height/2); attr.bit_gravity = CenterGravity; XChangeWindowAttributes(XtDisplay(shell), XtWindow(AppData.widget), CWBitGravity, &attr); PSinitclip(); PSinitviewclip(); /* ** Create text context for trace option and chain it if trace is on */ XDPSChainTextContext (AppData.dpsCtxt, AppData.trace); } /* end initDPSContext () */
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.