v06i069: Motif Resource Interpreter, Part03/03
David E. Smyth
david at jpl-devvax.jpl.nasa.gov
Thu Apr 12 17:44:18 AEST 1990
Submitted-by: david at jpl-devvax.jpl.nasa.gov (David E. Smyth)
Posting-number: Volume 6, Issue 69
Archive-name: mri/part03
# to unbundle, "sh" this file -- DO NOT use csh
# SHAR archive format. Archive created Wed Apr 11 10:01:20 PDT 1990
echo x - MriReg.c
sed 's/^X//' > MriReg.c <<'+FUNKY+STUFF+'
X/*
X*******************************************************************************
X*
X* SCCS_data: %Z%%M% %I%(%G%)
X*
X* Module_name:
X*
X* MriReg.c
X*
X* Subsystem_group:
X*
X* Motif Resource Interpreter, Registration Routines
X*
X* Related_keywords:
X*
X* Widget, Callback, Class, Constructor, Registration
X*
X* Module_description:
X*
X* This module contains the functions used to register callback
X* functions, class names, and constructors with Mri.
X*
X* Since (for portability reasons) we can not assume runtime binding,
X* all widget classes or creation routines (constructors) must be
X* "registered" by the application BEFORE widget tree creation.
X*
X* Module_interface_summary:
X*
X*
X* Xt Widget/Object Class Registration Routine:
X*
X* MriRegisterObjectClass(
X* AppContext app, - application context
X* String name, - class name, case insensitive
X* WidgetClass class ) - class record pointer
X*
X*
X* Motif Widget/Object Constructor Registration Routine:
X*
X* MriRegisterConstructor(
X* AppContext app, - application context
X* String name, - constructor name, case insens.
X* (*Widget)() const ) - constructor function pointer
X*
X*
X* Standard callback registration routine (all the following callbacks)
X*
X* MriRegisterMriCallbacks (
X* AppContext app ) - application context
X*
X* MriRegisterCallback(
X* XtAppContext app, - application context
X* String name, - register name, case insensitive
X* Callback callback, - callback function pointer
X* ClientData closure ) - default client data
X*
X* Module_history:
X*
X* mm/dd/yy initials function action
X* -------- -------- -------- ---------------------------------------------
X* 02/26/90 MarBru All Created
X* 02/16/90 MarBru Create.. Limited creation to composite widgets/objects
X* 04/05/90 d.smyth Dynamic Creation, rename to Mri
X*
X* Design_notes:
X
X* For VMS, we could have used LIB$FIND_IMAGE_SYMBOL and use dynamic
X* (runtime) binding. But since most UNIX systems lack such capability,
X* we stick to the concept of "registration" routines.
X*
X*******************************************************************************
X*/
X/*
X*******************************************************************************
X* Include_files.
X*******************************************************************************
X*/
X
X/* -- Operating system includes */
X#include <stdio.h>
X#include <strings.h>
X#include <ctype.h>
X
X/* -- X Window System includes */
X#include <X11/IntrinsicP.h>
X#include <X11/StringDefs.h>
X#include <X11/CoreP.h>
X#include <XmP.h>
X
X/* -- Motif Resource Interpreter Includes */
X#include "Mri.h"
X#include "MriP.h"
X
X/*
X*******************************************************************************
X* Private_data_definitions.
X*******************************************************************************
X The following cache/registry of known callbacks, constructors, and
X classes, initially empty, is loaded by the application using
X MriRegisterCallback(), MriRegisterConstructor(), and
X MriRegisterObjectClass().
X Assuming small numbers of callbacks, the sequential search
X of such cache is (initially) considered acceptable.
X*/
X
X/* -- Named callback procedures cache, intially empty */
X
Xint callbacks_num = 0;
Xint callbacks_max = 0;
XCBCacheRec *callbacks_ptr = NULL;
X
X/* -- Named object classes cache, intially empty */
X
Xint classes_num = 0;
Xint classes_max = 0;
XClCacheRec *classes_ptr = NULL;
X
X/*
X*******************************************************************************
X* Public_function_declarations.
X*******************************************************************************
X*/
X/*
X -- Register Object Class
X*******************************************************************************
X This procedure adds object class name to our list of registered
X classes/constructors. So far very simplistic ... without checking for
X duplicate entries, no cache hashing scheme....no ties to app_context.
X*/
Xvoid MriRegisterObjectClass ( app, name, class )
XXtAppContext app; /* not used (yet), must be present */
XString name; /* class name, case insensitive */
XWidgetClass class; /* Xt object class pointer */
X{
X char cr_name[MAX_XRMSTRING];
X register char *s;
X register char *d;
X
X for ( d=cr_name, s=name; *s; s++)
X *d++ = (isupper(*s)) ? tolower (*s) : *s;
X *d = '\0';
X
X if (classes_num >= classes_max )
X {
X classes_max += ADD_CLASSES;
X classes_ptr = (ClCacheRec*) XtRealloc((char*)classes_ptr,
X sizeof(ClCacheRec) * classes_max);
X }
X classes_ptr[classes_num].quark = XrmStringToQuark ( cr_name );
X classes_ptr[classes_num].constructor = NULL;
X classes_ptr[classes_num].class = class;
X classes_num++;
X}
X
X/*
X -- Register constructor
X*******************************************************************************
X This procedure adds constructor procedure/name to our list of registered
X classes/constructors. So far very simplistic ... without checking for
X duplicate entries, no cache hashing scheme....no ties to app_context.
X
X Note the constructor is a "standard" widget creation routine
X Widget XmCreateXyyyZyyy ( parent, name, args, nargs )
X*/
Xvoid MriRegisterConstructor ( app, name, constructor )
XXtAppContext app; /* not used (yet), must be present */
XString name; /* constructor name, case insensitive */
XWidget (*constructor) (); /* pointer to a widget creation routine */
X{
X char cr_name[MAX_XRMSTRING];
X register char *s;
X register char *d;
X
X for ( d=cr_name, s=name; *s; s++)
X *d++ = (isupper(*s)) ? tolower (*s) : *s;
X *d = '\0';
X
X if (classes_num >= classes_max )
X {
X classes_max += ADD_CLASSES;
X classes_ptr = (ClCacheRec*) XtRealloc((char*)classes_ptr,
X sizeof(ClCacheRec) * classes_max);
X }
X classes_ptr[classes_num].quark = XrmStringToQuark ( cr_name );
X classes_ptr[classes_num].constructor = constructor;
X classes_ptr[classes_num].class = NULL;
X classes_num++;
X}
X
X/*
X -- Register callback
X*******************************************************************************
X This procedure adds callback procedure/name to our list of registered
X callbacks. So far very simplistic ... without checking for duplicate
X entries, no cache hashing scheme, no ties to app_context.
X*/
Xvoid MriRegisterCallback ( app, name, callback, closure )
XXtAppContext app; /* not used (yet), must be present */
XString name; /* callback name, case insensitive */
XXtCallbackProc callback; /* callback function pointer */
Xcaddr_t closure; /* default closure (client data) */
X{
X char cb_name[MAX_XRMSTRING];
X register char *s;
X register char *d;
X
X for ( d=cb_name, s=name; *s; s++)
X *d++ = (isupper(*s)) ? tolower (*s) : *s;
X *d = '\0';
X
X if (callbacks_num >= callbacks_max )
X {
X callbacks_max += ADD_CALLBACKS;
X callbacks_ptr = (CBCacheRec*) XtRealloc((char*)callbacks_ptr,
X sizeof(CBCacheRec) * callbacks_max);
X }
X callbacks_ptr[callbacks_num].quark = XrmStringToQuark ( cb_name );
X callbacks_ptr[callbacks_num].callback = callback;
X callbacks_ptr[callbacks_num].closure = closure;
X callbacks_num++;
X}
X
X/*
X -- MriRegisterXrmCallbacks
X*******************************************************************************
X*/
Xvoid MriRegisterMriCallbacks ( app )
XXtAppContext app;
X{
X#define REG( name, cb, cl ) MriRegisterCallback ( app, name, cb, cl )
X
X REG("CreateDynamicWidgetCB", MriCreateDynamicWidgetCB, NULL );
X REG("ManageNamedChildrenCB", MriManageNamedChildrenCB, NULL );
X REG("UnmanageNamedChildrenCB", MriUnmanageNamedChildrenCB, NULL );
X REG("SetResourceOnWidgetCB", MriSetResourceOnWidgetCB, NULL );
X REG("QuitApplicationCB", MriQuitApplicationCB, NULL );
X
X#undef REG
X}
+FUNKY+STUFF+
echo '-rw-r--r-- 1 david 8262 Apr 11 07:46 MriReg.c (as sent)'
chmod u=rw,g=r,o=r MriReg.c
ls -l MriReg.c
echo x - Application.c
sed 's/^X//' > Application.c <<'+FUNKY+STUFF+'
X#include <Xm/Xm.h>
X#include "Mri.h"
X
X/*
X -- Application Specific Information
X*******************************************************************************
X These data and functions must be declared and
X initialized. The functions may be null functions.
X*/
X
Xchar appName[] = "tot";
Xchar appClass[] = "Tot";
XXrmOptionDescRec appOptions[] = NULL;
XCardinal numOptions = 0;
X
Xvoid UserInitialization();
Xvoid RegisterApplicationCallbacks();
X
X/*
X -- UserInitialization()
X*******************************************************************************
X Allows the application to perform initialization, including
X manipulation of the argv. Note that it is generally alot
X easier to process the argument vector using application
X resources, if such initialization can safely be performed
X after the Xt toolkit is initialized. If an application wishes
X to take advantage of the Xt processing of argv based on the
X XrmOptionDescRec appOptions, the initialization code which
X uses argv information should be performed in the function
X RegisterApplicationCallbacks().
X*/
X
Xvoid
XUserInitialization( argc, argv )
X int *argc; /* note: this gets returned! */
X char *argv[];
X{
X}
X
X/*
X -- Register application specific callbacks
X*******************************************************************************
X Allows the application to register application specific
X callbacks. This function is called after the toolkit is
X initialized and the XrmOptionDescRec appOptions is processed,
X and before any widgets are created from the Xrm database.
X Note, therefore, that the argc, argv passed in have already
X been processed by XtInitialize: Xt arguments have been removed
X (like geometry specifications) as well as application arguments
X specified in the application's appOptions[]. Frequently,
X an application would choose to print a usage message if *argc
X is not zero, due to the existance of the unrecognized command
X line options.
X*/
X
Xvoid
XRegisterApplicationCallbacks( argc, argv, app )
X int *argc; /* note: this gets returned! */
X char *argv[];
X XtAppContext app;
X{
X static void pushCB();
X static void destroyCB();
X
X MriRegisterCallback ( app, "push", pushCB, NULL );
X MriRegisterCallback ( app, "destroy", destroyCB, NULL );
X}
X
X/*
X -- Push callback
X*******************************************************************************
X This callback is a state machine; the first invocation loads the text
X specified as client data into XmNlabelString resource of invoking widget;
X the next invocation exits the application.
X*/
Xstatic void
XpushCB ( w, client, call )
X Widget w;
X caddr_t client;
X caddr_t call;
X{
X static Boolean first = TRUE;
X
X if ( first )
X {
X static Arg arg;
X String text = ( client ) ? (String) client : "No text in Xrdb" ;
X XmString val = XmStringCreateLtoR(text,XmSTRING_DEFAULT_CHARSET);
X XtSetArg( arg, XmNlabelString, val );
X
X XtSetValues ( w, &arg, 1);
X
X first = FALSE;
X }
X else
X {
X exit();
X }
X}
X
X/*
X -- Quit callback
X*******************************************************************************
X Terminate application without saving anything. Assume user really
X means it!
X*/
Xstatic void
XquitCB ( w, client, call )
X Widget w;
X caddr_t client;
X caddr_t call;
X{
X exit();
X}
X
X/*
X -- Destroy callback
X*******************************************************************************
X destroy the widget.
X*/
Xstatic void
XdestroyCB ( w, client, call )
X Widget w;
X caddr_t client;
X caddr_t call;
X{
X XtDestroyWidget(w);
X}
X
+FUNKY+STUFF+
echo '-rw-r--r-- 1 david 3741 Apr 11 07:50 Application.c (as sent)'
chmod u=rw,g=r,o=r Application.c
ls -l Application.c
echo x - R_1
sed 's/^X//' > R_1 <<'+FUNKY+STUFF+'
X# HelloWorld - global resources
X#
X*fontList: -*-Times-Medium-R-Normal--14*
X#
X# shell
X#
XApp.managedChild_0: box,xmRowColumn
X#
X# box - the main container
X#
XApp.box.spacing: 2
XApp.box.background: red
XApp.box.marginWidth: 4
XApp.box.marginHeight: 4
XApp.box.entryAlignment: alignment_center
XApp.box.managedChild_0: label,xmlabel
XApp.box.managedChild_1: push,xmpushbutton
X#
X# label
X#
XApp.box.label.background: white
XApp.box.label.foreground: blue
XApp.box.label.labelString: Hello, WORLD !
XApp.box.label.fontList: -*-Times-Bold-R-Normal--14*
X#
X# push
X#
XApp.box.push.background: bluE
XApp.box.push.foreground: white
XApp.box.push.location: center
XApp.box.push.labelString: Push ME
XApp.box.push.activateCallback: SetResourceOnWidgetCB( \
X activateCallback, push(To Go...), this) ,\
X SetResourceOnWidgetCB( \
X fontList, *times-bold*240*, this)
+FUNKY+STUFF+
echo '-rw-r--r-- 1 david 886 Apr 4 16:48 R_1 (as sent)'
chmod u=rw,g=r,o=r R_1
ls -l R_1
echo x - R_2
sed 's/^X//' > R_2 <<'+FUNKY+STUFF+'
X#
X# HelloWorld
X# box main container
X# lbl1 headline label - hello world
X# box1 bulletin board for default button testing
X# btn1 default button
X# btn2 button controlling lbl2
X# btn3 button controlling lbl2
X# lbl2 footnote
X#
X# global resources
X#
X*fontList: -*-Helvetica-Medium-R-Normal--14*
X#
X# shell
X#
XTot.input: true
XTot.managedChild_0: box,xmRowColumn
X#
X# box - the main container
X#
XTot.box.layout: column
XTot.box.spacing: 8
XTot.box.background: red
XTot.box.marginWidth: 0
XTot.box.marginHeight: 0
XTot.box.entryAlignment: alignment_center
XTot.box.managedChild_0: lbl1,xmLabel
XTot.box.managedChild_1: box1,xmBulletinBoard
XTot.box.managedChild_2: btn2,xmPushButton
XTot.box.managedChild_3: btn3,xmPushButton
XTot.box.managedChild_4: lbl2,xmLabel
X#
X# lbl1
X#
XTot.box.lbl1.background: white
XTot.box.lbl1.foreground: blue
XTot.box.lbl1.labelString: Hello, WORLD !
X#
X# box1
X#
XTot.box.box1.marginWidth: 8
XTot.box.box1.marginHeight: 8
XTot.box.box1.managedChild_0: btn1,xmPushButton
X#
X# btn1
X#
XTot.box.box1.btn1.labelString: Push ME
XTot.box.box1.btn1.background: lightBlue
XTot.box.box1.btn1.foreground: red
XTot.box.box1.btn1.showAsDefault: 2
XTot.box.box1.btn1.xrmCreateCallback: SetResourceOnWidgetCB(defaultButton,this,box.box1)
XTot.box.box1.btn1.activateCallback: push(Push to EXIT !)
X#
X# btn2
X#
XTot.box.btn2.background: lightBlue
XTot.box.btn2.foreground: blue
XTot.box.btn2.labelString: Remove Footnote
XTot.box.btn2.activateCallback: UnmanageNamedChildrenCB(box.lbl2)
X#
X# btn3
X#
XTot.box.btn3.background: lightBlue
XTot.box.btn3.foreground: blue
XTot.box.btn3.labelString: Add Footnote
XTot.box.btn3.activateCallback: ManageNamedChildrenCB(box.lbl2)
X#
X# lbl2
X#
XTot.box.lbl2.background: white
XTot.box.lbl2.foreground: blue
XTot.box.lbl2.labelString: Ain't it WONDERFULL ?
X#
+FUNKY+STUFF+
echo '-rw-r--r-- 1 david 1919 Apr 4 14:30 R_2 (as sent)'
chmod u=rw,g=r,o=r R_2
ls -l R_2
echo x - R_3
sed 's/^X//' > R_3 <<'+FUNKY+STUFF+'
X#
X# TDS Output Tool "MacDraw" Style User Interface
X#
X# N.B. Many motif "XmCreate..." routines actually create a tree
X# of widgets, and the root of that tree is often different from
X# the "created" widget. For example, in this widget tree we have
X# an XmMenuBar widget named menuBar, supposedly with the children
X# fileMenu and helpMenu. However, this is really a fiction: since
X# the type (really, constructor) specified for the fileMenu is
X# XmPulldownMenu, what is really created is an XmMenuShell with
X# two children: fileMenu and helpMenu. If either child gets
X# mapped, then the XmMenuShell maps too. The name of this shell
X# widget really cannot be safely assumed. It happens to be popup_fileMenu
X# because the first menu pane it manages is named fileMenu. If
X# the name of the first shell managed changes, then the name of
X# the menu shell is different... Therefore, I've used wildcards
X# for the names of the menu panes. You can't use wild cards for
X# names passed to SetResourceOnWidgetCB(), so beware.
X#
X# Use the debug switch on the command line to dump the names of the
X# widgets as they are created. This is very useful for debugging the
X# resource file. E.g., App -D
X#
X# main Main Window
X
X# menuBar MenuBar
X# file File Cascade button
X# help Help Cascade button
X# popup_fileMenu Pulldown Menu Shell for all pulldowns (magic)
X# fileMenu Menu Pane - magically creates parent (popup_fileMenu)
X# helpMenu Menu Pane
X
X# work Form work area
X# c RoxCol, where all the controls go on the left
X# dataproc rowColumn for data type and processing buttons
X# chData RowCol for channel data buttons
X# chProc RowCol for channel processing buttons
X# frData RowCol for frame data buttons
X# frProc RowCol for frame processing buttons
X# sinks rowColumn on left below dataproc with buttons
X# picture scrolledWindow for display of data and proc flows
X# drawing drawingArea clipped by scrolledWindow (picture)
X
X##########
X# Main Window: a MenuBar and a Work
X##########
X
XTot.managedChild_0: main,xmMainWindow
X
X*main.managedChild_0: menuBar, XmMenuBar
X*main.managedChild_1: com, XmRowColumn
X*main.managedChild_2: work, XmForm
X
X##########
X# Menu Bar, Cascade Buttons, and Pull Down Menus
X##########
X
X*menuBar.xrmCreateCallback: SetResourceOnWidgetCB( menuBar, this, main )
X*menuBar.managedChild_0: file, XmCascadeButton
X*menuBar.unmanagedChild_1: fileMenu, XmPulldownMenu
X*menuBar.managedChild_2: help, XmCascadeButton
X*menuBar.unmanagedChild_3: helpMenu, XmPulldownMenu
X
X##########
X# File Cascade Button and PullDown Menu
X##########
X
X*file.labelString: File
X
X*fileMenu.xrmCreateCallback: SetResourceOnWidgetCB( subMenuId, this, \
X main.menuBar.file )
X*fileMenu.managedChild_0: load, XmPushButton
X*fileMenu.managedChild_1: sep1, XmSeparator
X*fileMenu.managedChild_2: save, XmPushButton
X*fileMenu.managedChild_3: saveAs, XmPushButton
X*fileMenu.managedChild_4: sep2, XmSeparator
X*fileMenu.managedChild_5: quit, XmPushButton
X
X*fileMenu.load.labelString: Load ...
X
X*fileMenu.save.labelString: Save
X
X*fileMenu.saveAs.labelString: Save As ...
X
X*fileMenu.quit.labelString: Quit !!
X*fileMenu.quit.activateCallback: QuitApplicationCB()
X
X##########
X# Help Cascade Button ane PullDown Menu
X##########
X
X*help.labelString: Help
X*help.xrmCreateCallback: SetResourceOnWidgetCB( menuHelpWidget, this, \
X main.menuBar )
X
X*helpMenu.xrmCreateCallback: SetResourceOnWidgetCB( subMenuId, this, \
X main.menuBar.help )
X*helpMenu.managedChild_0: TBD, XmLabel
X
X##########
X# Com: Common query params: comment, time
X##########
X
X*com.xrmCreateCallback: SetResourceOnWidgetCB( commandWindow, this, main )
X*com.orientation: HORIZONTAL
X*com.numColumns: 1
X*com.packing: PACK_COLUMN
X*com.managedChild_0: zero_button, XmPushButton
X*com.managedChild_1: one_button, XmPushButton
X*com.managedChild_2: two_button, XmPushButton
X*com.managedChild_3: three_button, XmPushButton
X*com.managedChild_4: four_button, XmPushButton
X*com.managedChild_5: five_button, XmPushButton
X
X##########
X# Work: Control Panel down Left Side, Scrollable Picture to the Right
X##########
X
X*work.xrmCreateCallback: SetResourceOnWidgetCB( workArea, this, main)
X*work.managedChild_0: ctrls, XmRowColumn
X*work.managedChild_1: picture, XmScrolledWindow
X
X*ctrls.managedChild_0: channel, XmRowColumn
X*ctrls.managedChild_1: frame, XmRowColumn
X*ctrls.managedChild_2: other, XmRowColumn
X
X*channel.orientation: HORIZONTAL
X*channel.packing: PACK_COLUMN
X*channel.managedChild_0: chData, XmRowColumn
X*channel.managedChild_1: chProc, XmRowColumn
X
X*frame.orientation: HORIZONTAL
X*frame.packing: PACK_COLUMN
X*frame.managedChild_0: frData, XmRowColumn
X*frame.managedChild_1: frProc, XmRowColumn
X
X*other.orientation: HORIZONTAL
X*other.packing: PACK_COLUMN
X*other.managedChild_0: sinkl, XmRowColumn
X*other.managedChild_1: sinkr, XmRowColumn
X
X*chData.managedChild_0: b0, XmPushButton
X*chData.managedChild_1: b1, XmPushButton
X*chData.managedChild_2: b2, XmPushButton
X*chData.managedChild_3: b3, XmPushButton
X
X*chData.b0.labelString: First Channel Set
X*chData.b0.activateCallback: CreateDynamicWidgetCB( \
X main.work.picture.ScrolledWindowClipWindow.drawing.firstChSetIcon )
X*chData.b1.labelString: Second Channel Set
X*chData.b2.labelString: Third Channel Set
X*chData.b3.labelString: Specific Channels
X
X*chProc.managedChild_0: b0, XmPushButton
X*chProc.managedChild_1: b1, XmPushButton
X*chProc.managedChild_2: b2, XmPushButton
X*chProc.managedChild_3: b3, XmPushButton
X*chProc.managedChild_4: b4, XmPushButton
X
X*chProc.b0.labelString: ECDR Conversion (Std)
X*chProc.b1.labelString: ECDR Conv (Specific)
X*chProc.b2.labelString: Template Fmt (File)
X*chProc.b3.labelString: Template Fmt (Proc)
X*chProc.b4.labelString: Subset
X
X*frData.managedChild_0: b0, XmPushButton
X*frData.managedChild_1: b1, XmPushButton
X*frData.managedChild_2: b2, XmPushButton
X*frData.managedChild_3: b3, XmPushButton
X*frData.managedChild_4: b4, XmPushButton
X*frData.managedChild_5: b5, XmPushButton
X*frData.managedChild_6: b6, XmPushButton
X
X*frData.b0.labelString: Raw Frames
X*frData.b1.labelString: Packets
X*frData.b2.labelString: S/C Engineering
X*frData.b3.labelString: MRO
X*frData.b4.labelString: DSS Monitor
X*frData.b5.labelString: QQC
X*frData.b6.labelString: Science
X
X*frProc.managedChild_0: b0, XmPushButton
X*frProc.managedChild_1: b1, XmPushButton
X*frProc.managedChild_2: b2, XmPushButton
X*frProc.managedChild_3: b3, XmPushButton
X*frProc.managedChild_4: b4, XmPushButton
X*frProc.managedChild_5: b5, XmPushButton
X
X*frProc.b0.labelString: ECDR Conversion (Std)
X*frProc.b1.labelString: ECDR Conv (Specific)
X*frProc.b2.labelString: Template Fmt (File)
X*frProc.b3.labelString: Template Fmt (Proc)
X*frProc.b4.labelString: Subset
X*frProc.b5.labelString: Decommutation
X
X*sinkl.managedChild_0: b0, XmPushButton
X*sinkl.managedChild_1: b1, XmPushButton
X*sinkl.managedChild_2: b2, XmPushButton
X
X*sinkl.b0.labelString: UNIX File
X*sinkl.b1.labelString: UNIX Pipe
X*sinkl.b2.labelString: UNIX Socket
X
X*sinkr.managedChild_0: b0, XmPushButton
X*sinkr.managedChild_1: b1, XmPushButton
X*sinkr.managedChild_2: b2, XmPushButton
X
X*sinkr.b0.labelString: Spooler
X*sinkr.b1.labelString: Virtual Circuit
X*sinkr.b2.labelString: stdout
X*sinkr.b2.activateCallback: CreateDynamicWidgetCB( \
X main.work.picture.ScrolledWindowClipWindow.drawing.stdoutIcon )
X
X##########
X# Picture: Drawing area within scrolled window
X##########
X
X*picture.topAttachment: ATTACH_FORM
X*picture.leftAttachment: ATTACH_WIDGET
X*picture.leftWidget: main.work.ctrls
X*picture.rightAttachment: ATTACH_FORM
X*picture.bottomAttachment: ATTACH_FORM
X*picture.scrollingPolicy: AUTOMATIC
X*picture.scrollBarDisplayPolicy: AS_NEEDED
X*picture.managedChild_0: drawing, XmForm
X
X*drawing.width: 200
X*drawing.height: 700
X*drawing.xrmCreateCallback: SetResourceOnWidgetCB( workWindow, this, \
X main.work.picture)
X
X*drawing.dynamicChild_0: stdoutIcon, XmPushButton, n
X*drawing.dynamicChild_1: firstChSetIcon, XmPushButton
X
X*stdoutIcon.activateCallback: destroy()
X*stdoutIcon.labelString: stdout
X*stdoutIcon.fontList: *Times-Bold*140*
X*stdoutIcon.rightAttachment: ATTACH_FORM
X
X*firstChSetIcon.activateCallback: destroy()
X*firstChSetIcon.labelString: First Channel Set
X*firstChSetIcon.fontList: *Times-Bold*140*
X*firstChSetIcon.leftAttachment: ATTACH_FORM
+FUNKY+STUFF+
echo '-rw-r--r-- 1 david 8404 Apr 11 07:50 R_3 (as sent)'
chmod u=rw,g=r,o=r R_3
ls -l R_3
exit 0
dan
-----------------------------------------------------------
O'Reilly && Associates
argv at sun.com / argv at ora.com
632 Petaluma Ave, Sebastopol, CA 95472
800-338-NUTS, in CA: 800-533-NUTS, FAX 707-829-0104
Opinions expressed reflect those of the author only.
More information about the Comp.sources.x
mailing list