leei@lightning.McRCIM.McGill.EDU (Lee Iverson) (05/24/91)
Below you'll find the first pass at a package which I've found quite
useful for managing error output from X applications. If the
stderrNotifier() is called from an application (and the notifier
application is built and installed), then any messages written to
stderr by the application will popup in a window controlled by the
notifier process! This is clean, simple and immensely useful, however
I'm waiting on a full release for one simple reason... I can't seem to
figure out how to get the Text widget to automatically scrollto the
just added text.
Ideally, this would likely involve a piece of code inserted just after
the XtPopup() in this fragment of main():
if ( len != prev_len ) {
XtVaSetValues( text, XtNstring, str, XtNlength, len, NULL );
if ( !initialized ) {
CenterWidgetUnderPointer(shell);
initialized = True;
}
if ( !popped_up ) XtPopup(shell,XtGrabNone);
popped_up = True;
/* Position scrollbars to display new text... How? */
XBell(display,50);
} else {
...
If anyone has any clues, I'd appreciate all the help I can get on this
one. It should be simple, but the Athena Xaw docs give me no real
clues.
--
Lee Iverson McGill Research Centre for Intelligent Machines
leei@mcrcim.mcgill.edu Computer Vision and Robotics Lab
McGill University, Montreal
----------
#! /bin/sh
#
# Shar: Shell Archiver
#
# This archive created Fri May 24 10:19:41 1991
# Run this through sh to create:
# Imakefile
# Makefile
# Notifier.ad
# Notifier.ad.h
# notifier.c
# notifier.h
# stderr_notifier.c
echo x - Imakefile \(1932 characters\)
sed 's/^X//' > Imakefile << \EOF
X#
X# Copyright 1991 McGill University
X#
X# Permission to use, copy, modify, and distribute this software and its
X# documentation for any purpose without fee is hereby granted without fee,
X# provided that the above copyright notice appear in all copies and that
X# both that copyright notice and this permission notice appear in
X# supporting documentation, and that the name of McGill not be used in
X# advertising or publicity pertaining to distribution of the software
X# without specific, written prior permission. McGill makes no
X# representations about the suitability of this software for any purpose.
X# It is provided "as is" without express or implied warranty.
X#
X# MCGILL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
X# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T.
X# BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
X# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
X# OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
X# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
X#
X# Author:
X# Lee Iverson <leei@mcrcim.mcgill.edu>,
X# McGill Research Centre for Intelligent Machines (McRCIM)
X#
X# $Id: Imakefile,v 0.7.1.7 1991/05/24 12:39:37 leei Exp $
X#
X
XDEBUG = UDEBUG
XAR = ar rv
X
X# Include these lines if you are using GCC.
X# Remember this needs an ANSI compiler!
XCC = gcc -pipe
XCDEBUGFLAGS = $(DBG) $(OPT) $(DEFS)
XOPT = -O -fstrength-reduce -fdelayed-branch
XDBG =
XDEFS = -$(DEBUG) $(BITMAPS)
XBITMAPS = -DBITMAPDIR=\"$(INCDIR)/bitmaps\" -DPIXMAPDIR=\"$(INCDIR)/pixmaps\"
X
XINCLUDES = -I.
XLOCAL_LIBRARIES = XawClientLibs
XDEPLIBS = XawClientDepLibs
X
XPROGRAMS = notifier
X
XSRCS = notifier.c
XOBJS = notifier.o
X
XComplexProgramTarget(notifier)
X
XInstallAppDefaults(Notifier)
X
XNotifier.ad.h: Notifier.ad
X ad2c Notifier.ad > Notifier.ad.h
X
XWorld:
X make Makefile
X make depend
X make all
X
EOF
if test 1932 -ne "`wc -c Imakefile`"
then
echo shar: error transmitting Imakefile \(should have been 1932 characters\)
fi
echo x - Makefile \(10430 characters\)
sed 's/^X//' > Makefile << \EOF
X# Makefile generated by imake - do not edit!
X# $XConsortium: imake.c,v 1.51 89/12/12 12:37:30 jim Exp $
X
X###########################################################################
X# Makefile generated from "Imake.tmpl" and </tmp/IIf.a02037>
X# $XConsortium: Imake.tmpl,v 1.77 89/12/18 17:01:37 jim Exp $
X#
X# Platform-specific parameters may be set in the appropriate .cf
X# configuration files. Site-wide parameters may be set in the file
X# site.def. Full rebuilds are recommended if any parameters are changed.
X#
X# If your C preprocessor doesn't define any unique symbols, you'll need
X# to set BOOTSTRAPCFLAGS when rebuilding imake (usually when doing
X# "make Makefile", "make Makefiles", or "make World").
X#
X# If you absolutely can't get imake to work, you'll need to set the
X# variables at the top of each Makefile as well as the dependencies at the
X# bottom (makedepend will do this automatically).
X#
X
X###########################################################################
X# platform-specific configuration parameters - edit ultrix.cf to change
X
X# platform: $XConsortium: ultrix.cf,v 1.20 89/12/22 15:56:14 rws Exp $
X# operating system: Ultrix 4.0
X
X###########################################################################
X# site-specific configuration parameters - edit site.def to change
X
X# site: $XConsortium: site.def,v 1.21 89/12/06 11:46:50 jim Exp $
X
X SHELL = /bin/sh
X
X TOP = .
X CURRENT_DIR = .
X
X AR = ar cq
X BOOTSTRAPCFLAGS =
X CC = gcc -fpcc-struct-return -fwritable-strings
X
X COMPRESS = compress
X CPP = /lib/cpp $(STD_CPP_DEFINES)
X PREPROCESSCMD = gcc -fpcc-struct-return -fwritable-strings -E $(STD_CPP_DEFINES)
X INSTALL = install
X LD = ld
X LINT = lint
X LINTLIBFLAG = -C
X LINTOPTS = -axz
X LN = ln -s
X MAKE = /bin/make
X MV = mv
X CP = cp
X RANLIB = ranlib
X RANLIBINSTFLAGS = -t
X RM = rm -f
X STD_INCLUDES = -I$(INCROOT)
X STD_CPP_DEFINES =
X STD_DEFINES =
X EXTRA_LOAD_FLAGS = -L$(USRLIBDIR)
X EXTRA_LIBRARIES =
X TAGS = ctags
X
X PROTO_DEFINES =
X
X INSTPGMFLAGS =
X
X INSTBINFLAGS = -m 0755
X INSTUIDFLAGS = -m 4755
X INSTLIBFLAGS = -m 0664
X INSTINCFLAGS = -m 0444
X INSTMANFLAGS = -m 0444
X INSTDATFLAGS = -m 0444
X INSTKMEMFLAGS = -m 4755
X
X DESTDIR =
X
X TOP_INCLUDES = -I$(INCROOT)
X
X CDEBUGFLAGS = -O -fstrength-reduce -finline-functions -fcombine-regs -fdelayed-branch
X CCOPTIONS = -pipe
X COMPATFLAGS =
X
X ALLINCLUDES = $(STD_INCLUDES) $(TOP_INCLUDES) $(INCLUDES) $(EXTRA_INCLUDES)
X ALLDEFINES = $(ALLINCLUDES) $(STD_DEFINES) $(PROTO_DEFINES) $(DEFINES) $(COMPATFLAGS)
X CFLAGS = $(CDEBUGFLAGS) $(CCOPTIONS) $(ALLDEFINES)
X LINTFLAGS = $(LINTOPTS) -DLINT $(ALLDEFINES)
X LDLIBS = $(SYS_LIBRARIES) $(EXTRA_LIBRARIES)
X LDOPTIONS = $(CDEBUGFLAGS) $(CCOPTIONS)
X LDCOMBINEFLAGS = -X -r
X
X MACROFILE = ultrix.cf
X RM_CMD = $(RM) *.CKP *.ln *.BAK *.bak *.o core errs ,* *~ *.a .emacs_* tags TAGS make.log MakeOut
X
X IMAKE_DEFINES =
X
X IRULESRC = $(CONFIGDIR)
X IMAKE_CMD = $(IMAKE) -DUseInstalled -I$(IRULESRC) $(IMAKE_DEFINES)
X
X ICONFIGFILES = $(IRULESRC)/Imake.tmpl $(IRULESRC)/Imake.rules \
X $(IRULESRC)/Project.tmpl $(IRULESRC)/site.def \
X $(IRULESRC)/$(MACROFILE) $(EXTRA_ICONFIGFILES)
X
X###########################################################################
X# X Window System Build Parameters
X# $XConsortium: Project.tmpl,v 1.63 89/12/18 16:46:44 jim Exp $
X
X###########################################################################
X# X Window System make variables; this need to be coordinated with rules
X# $XConsortium: Project.tmpl,v 1.63 89/12/18 16:46:44 jim Exp $
X
X PATHSEP = /
X USRLIBDIR = /usr/lib
X BINDIR = /local/bin
X INCROOT = /local/include
X BUILDINCROOT = $(TOP)
X BUILDINCDIR = $(BUILDINCROOT)/X11
X BUILDINCTOP = ..
X INCDIR = $(INCROOT)/X11
X ADMDIR = $(DESTDIR)/usr/adm
X LIBDIR = /usr/lib/X11
X CONFIGDIR = $(LIBDIR)/config
X LINTLIBDIR = $(USRLIBDIR)/lint
X
X FONTDIR = $(LIBDIR)/fonts
X XINITDIR = $(LIBDIR)/xinit
X XDMDIR = $(LIBDIR)/xdm
X AWMDIR = $(LIBDIR)/awm
X TWMDIR = $(LIBDIR)/twm
X GWMDIR = $(LIBDIR)/gwm
X MANPATH = $(DESTDIR)/local/man
X MANSOURCEPATH = $(MANPATH)/man
X MANDIR = $(MANSOURCEPATH)1
X LIBMANDIR = $(MANSOURCEPATH)3
X XAPPLOADDIR = $(LIBDIR)/app-defaults
X
X FONTCFLAGS = -t
X
X INSTAPPFLAGS = $(INSTDATFLAGS)
X
X IMAKE = imake
X DEPEND = makedepend
X RGB = rgb
X FONTC = bdftosnf
X MKFONTDIR = mkfontdir
X MKDIRHIER = /bin/sh $(BINDIR)/mkdirhier.sh
X
X CONFIGSRC = $(TOP)/config
X CLIENTSRC = $(TOP)/clients
X DEMOSRC = $(TOP)/demos
X LIBSRC = $(TOP)/lib
X FONTSRC = $(TOP)/fonts
X INCLUDESRC = $(TOP)/X11
X SERVERSRC = $(TOP)/server
X UTILSRC = $(TOP)/util
X SCRIPTSRC = $(UTILSRC)/scripts
X EXAMPLESRC = $(TOP)/examples
X CONTRIBSRC = $(TOP)/../contrib
X DOCSRC = $(TOP)/doc
X RGBSRC = $(TOP)/rgb
X DEPENDSRC = $(UTILSRC)/makedepend
X IMAKESRC = $(CONFIGSRC)
X XAUTHSRC = $(LIBSRC)/Xau
X XLIBSRC = $(LIBSRC)/X
X XMUSRC = $(LIBSRC)/Xmu
X TOOLKITSRC = $(LIBSRC)/Xt
X AWIDGETSRC = $(LIBSRC)/Xaw
X OLDXLIBSRC = $(LIBSRC)/oldX
X XDMCPLIBSRC = $(LIBSRC)/Xdmcp
X BDFTOSNFSRC = $(FONTSRC)/bdftosnf
X MKFONTDIRSRC = $(FONTSRC)/mkfontdir
X EXTENSIONSRC = $(TOP)/extensions
X
X DEPEXTENSIONLIB = $(USRLIBDIR)/libXext.a
X EXTENSIONLIB = -lXext
X
X DEPXLIB = $(DEPEXTENSIONLIB) $(USRLIBDIR)/libX11.a
X XLIB = $(EXTENSIONLIB) -lX11
X
X DEPXAUTHLIB = $(USRLIBDIR)/libXau.a
X XAUTHLIB = -lXau
X
X DEPXMULIB = $(USRLIBDIR)/libXmu.a
X XMULIB = -lXmu
X
X DEPOLDXLIB = $(USRLIBDIR)/liboldX.a
X OLDXLIB = -loldX
X
X DEPXTOOLLIB = $(USRLIBDIR)/libXt.a
X XTOOLLIB = -lXt
X
X DEPXAWLIB = $(USRLIBDIR)/libXaw.a
X XAWLIB = -lXaw
X
X LINTEXTENSIONLIB = $(USRLIBDIR)/llib-lXext.ln
X LINTXLIB = $(USRLIBDIR)/llib-lX11.ln
X LINTXMU = $(USRLIBDIR)/llib-lXmu.ln
X LINTXTOOL = $(USRLIBDIR)/llib-lXt.ln
X LINTXAW = $(USRLIBDIR)/llib-lXaw.ln
X
X DEPLIBS = $(LOCAL_LIBRARIES)
X
X DEPLIBS1 = $(DEPLIBS)
X DEPLIBS2 = $(DEPLIBS)
X DEPLIBS3 = $(DEPLIBS)
X
X###########################################################################
X# Imake rules for building libraries, programs, scripts, and data files
X# rules: $XConsortium: Imake.rules,v 1.67 89/12/18 17:14:15 jim Exp $
X
X###########################################################################
X# start of Imakefile
X
X#
X# Copyright 1991 McGill University
X#
X# Permission to use, copy, modify, and distribute this software and its
X# documentation for any purpose without fee is hereby granted without fee,
X# provided that the above copyright notice appear in all copies and that
X# both that copyright notice and this permission notice appear in
X# supporting documentation, and that the name of McGill not be used in
X# advertising or publicity pertaining to distribution of the software
X# without specific, written prior permission. McGill makes no
X# representations about the suitability of this software for any purpose.
X# It is provided "as is" without express or implied warranty.
X#
X# MCGILL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
X# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN 0 EVENT SHALL M.I.T.
X# BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
X# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
X# OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
X# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
X#
X# Author:
X# Lee Iverson <leei@mcrcim.mcgill.edu>,
X# McGill Research Centre for Intelligent Machines (McRCIM)
X#
X# $Id: Imakefile,v 0.7.1.7 1991/05/24 12:39:37 leei Exp $
X#
X
XDEBUG = UDEBUG
XAR = ar rv
X
X# Include these lines if you are using GCC.
X# Remember this needs an ANSI compiler!
XCC = gcc -pipe
XCDEBUGFLAGS = $(DBG) $(OPT) $(DEFS)
XOPT = -O -fstrength-reduce -fdelayed-branch
XDBG =
XDEFS = -$(DEBUG) $(BITMAPS)
XBITMAPS = -DBITMAPDIR=\"$(INCDIR)/bitmaps\" -DPIXMAPDIR=\"$(INCDIR)/pixmaps\"
X
XINCLUDES = -I.
XLOCAL_LIBRARIES = $(XAWLIB) $(XMULIB) $(XTOOLLIB) $(XLIB)
XDEPLIBS = $(DEPXAWLIB) $(DEPXMULIB) $(DEPXTOOLLIB) $(DEPXLIB)
X
XPROGRAMS = notifier
X
XSRCS = notifier.c
XOBJS = notifier.o
X
X PROGRAM = notifier
X
Xall:: notifier
X
Xnotifier: $(OBJS) $(DEPLIBS)
X $(RM) $@
X $(CC) -o $@ $(OBJS) $(LDOPTIONS) $(LOCAL_LIBRARIES) $(LDLIBS) $(EXTRA_LOAD_FLAGS)
X
Xinstall:: notifier
X $(INSTALL) -c $(INSTPGMFLAGS) notifier $(BINDIR)
X
Xinstall.man:: notifier.man
X $(INSTALL) -c $(INSTMANFLAGS) notifier.man $(MANDIR)/notifier.1
X
Xdepend::
X $(DEPEND) -s "# DO NOT DELETE" -- $(ALLDEFINES) -- $(SRCS)
X
Xlint:
X $(LINT) $(LINTFLAGS) $(SRCS) $(LINTLIBS)
Xlint1:
X $(LINT) $(LINTFLAGS) $(FILE) $(LINTLIBS)
X
Xclean::
X $(RM) $(PROGRAM)
X
Xinstall:: Notifier.ad
X $(INSTALL) -c $(INSTAPPFLAGS) Notifier.ad $(XAPPLOADDIR)/Notifier
X
XNotifier.ad.h: Notifier.ad
X ad2c Notifier.ad > Notifier.ad.h
X
XWorld:
X make Makefile
X make depend
X make all
X
X###########################################################################
X# common rules for all Makefiles - do not edit
X
Xemptyrule::
X
Xclean::
X $(RM_CMD) \#*
X
XMakefile::
X -@if [ -f Makefile ]; then \
X echo " $(RM) Makefile.bak; $(MV) Makefile Makefile.bak"; \
X $(RM) Makefile.bak; $(MV) Makefile Makefile.bak; \
X else exit 0; fi
X $(IMAKE_CMD) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT_DIR)
X
Xtags::
X $(TAGS) -w *.[ch]
X $(TAGS) -xw *.[ch] > TAGS
X
X###########################################################################
X# empty rules for directories that do not have SUBDIRS - do not edit
X
Xinstall::
X @echo "install in $(CURRENT_DIR) done"
X
Xinstall.man::
X @echo "install.man in $(CURRENT_DIR) done"
X
XMakefiles::
X
Xincludes::
X
X###########################################################################
X# dependencies generated by makedepend
X
EOF
if test 10430 -ne "`wc -c Makefile`"
then
echo shar: error transmitting Makefile \(should have been 10430 characters\)
fi
echo x - Notifier.ad \(923 characters\)
sed 's/^X//' > Notifier.ad << \EOF
XNotifier*BorderWidth: 0
XNotifier*Command.ShapeStyle: Oval
XNotifier*Command.BorderWidth: 3
X
XNotifier*shell.allowShellResize: True
X
XNotifier*form.title.borderWidth: 0
XNotifier*form.title.top: ChainTop
XNotifier*form.title.bottom: ChainTop
XNotifier*form.title.left: ChainLeft
XNotifier*form.title.right: ChainRight
X
XNotifier*form.text.height: 100
XNotifier*form.text.width: 300
XNotifier*form.text.scrollVertical: Always
XNotifier*form.text.scrollHorizontal: WhenNeeded
XNotifier*form.text.editType: read
XNotifier*form.text.fromVert: title
XNotifier*form.text.top: ChainTop
XNotifier*form.text.bottom: ChainBottom
XNotifier*form.text.left: ChainLeft
XNotifier*form.text.right: ChainRight
X
XNotifier*form.hideButton.label: Hide
XNotifier*form.hideButton.fromVert: text
XNotifier*form.hideButton.top: ChainBottom
XNotifier*form.hideButton.bottom: ChainBottom
XNotifier*form.hideButton.left: ChainLeft
XNotifier*form.hideButton.right: ChainLeft
EOF
if test 923 -ne "`wc -c Notifier.ad`"
then
echo shar: error transmitting Notifier.ad \(should have been 923 characters\)
fi
echo x - Notifier.ad.h \(861 characters\)
sed 's/^X//' > Notifier.ad.h << \EOF
X"*BorderWidth: 0",
X"*MenuButton.BorderWidth: 1",
X"*MenuButton.ShapeStyle: Rectangle",
X"*Command.ShapeStyle: Oval",
X"*Command.BorderWidth: 3",
X"*shell.allowShellResize: True",
X"*form.title.borderWidth: 0",
X"*form.title.top: ChainTop",
X"*form.title.bottom: ChainTop",
X"*form.title.left: ChainLeft",
X"*form.title.right: ChainRight",
X"*form.text.height: 100",
X"*form.text.width: 300",
X"*form.text.scrollVertical: Always",
X"*form.text.scrollHorizontal: WhenNeeded",
X"*form.text.editType: read",
X"*form.text.fromVert: title",
X"*form.text.top: ChainTop",
X"*form.text.bottom: ChainBottom",
X"*form.text.left: ChainLeft",
X"*form.text.right: ChainRight",
X"*form.hideButton.label: Hide",
X"*form.hideButton.fromVert: text",
X"*form.hideButton.top: ChainBottom",
X"*form.hideButton.bottom: ChainBottom",
X"*form.hideButton.left: ChainLeft",
X"*form.hideButton.right: ChainLeft",
EOF
if test 861 -ne "`wc -c Notifier.ad.h`"
then
echo shar: error transmitting Notifier.ad.h \(should have been 861 characters\)
fi
echo x - notifier.c \(5486 characters\)
sed 's/^X//' > notifier.c << \EOF
X/******************************************************************************
X
X Copyright 1991 McGill University
X
X Permission to use, copy, modify, and distribute this software and its
X documentation for any purpose without fee is hereby granted without fee,
X provided that the above copyright notice appear in all copies and that
X both that copyright notice and this permission notice appear in
X supporting documentation, and that the name of McGill not be used in
X advertising or publicity pertaining to distribution of the software
X without specific, written prior permission. McGill makes no
X representations about the suitability of this software for any purpose.
X It is provided "as is" without express or implied warranty.
X
X MCGILL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
X IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T.
X BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
X WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
X OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
X CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
X
X Author:
X Lee Iverson <leei@mcrcim.mcgill.edu>,
X McGill Research Centre for Intelligent Machines (McRCIM)
X
X******************************************************************************/
X
Xstatic char RCSid[] = "$Id: notifier.c,v 0.7.1.1 1991/05/24 12:28:20 leei Exp $";
X
X#include <stdio.h>
X#include <stdlib.h>
X#include <errno.h>
X#include <fcntl.h>
X
X#include <sys/types.h>
X
X#include <X11/Intrinsic.h>
X#include <X11/StringDefs.h>
X
X#include <X11/Shell.h>
X
X#include <X11/Xaw/Form.h>
X#include <X11/Xaw/AsciiText.h>
X#include <X11/Xaw/Command.h>
X
X/*
X * Widget and non-widget resources if the application defaults
X * file can't be found.
X * [ Generated automatically from Notifier.ad. ]
X */
Xstatic String fallbackResources[] = {
X#include "Notifier.ad.h"
X NULL
X};
X
XBoolean stdin_open = True;
XBoolean popped_up = False;
X
Xstatic void
XHide( Widget w, XtPointer client_data, XtPointer call_data )
X{
X if ( stdin_open ) {
X XtPopdown((Widget)client_data);
X XSync(XtDisplay(w),False);
X popped_up = False;
X } else {
X exit(0);
X }
X}
X
Xvoid CenterWidgetUnderPointer();
XBoolean WaitForXOrStdin();
X
Xmain(argc,argv)
XCardinal argc;
XString *argv;
X{
X XtAppContext app_context;
X Widget toplevel, shell, text, hide;
X Display *display;
X int len = 0;
X char *str = 0;
X int flags;
X Boolean initialized = False;
X
X /* Make sure that input on stdin is non-blocking. */
X toplevel = XtVaAppInitialize( &app_context, "Notifier",
X NULL, 0,
X &argc, argv,
X fallbackResources,
X NULL );
X shell = XtVaCreatePopupShell( "shell", transientShellWidgetClass, toplevel,
X NULL );
X
X {
X Widget form, title;
X
X form =
X XtVaCreateManagedWidget("form", formWidgetClass, shell,
X NULL);
X
X title =
X XtVaCreateManagedWidget( "title", labelWidgetClass, form,
X XtNlabel, argv[0],
X NULL );
X text =
X XtVaCreateManagedWidget( "text", asciiTextWidgetClass, form,
X XtNtype, XawAsciiString,
X /* XtNuseStringInPlace, True, /**/
X NULL);
X
X hide =
X XtVaCreateManagedWidget( "hideButton", commandWidgetClass, form,
X NULL);
X
X XtAddCallback( hide, XtNcallback, Hide, shell);
X }
X
X XtRealizeWidget(shell);
X display = XtDisplay(shell);
X
X /* Make sure stdin is set up for non-blocking input. */
X flags = fcntl( 0, F_GETFL, 0 );
X fcntl( 0, F_SETFL, flags | FNDELAY );
X
X while ( True ) {
X XEvent event;
X
X if ( WaitForXOrStdin(display,stdin_open) ) {
X int prev_len = len, n;
X char buf[BUFSIZ];
X
X /* Copy data from stdin to Text widget. */
X while ( (n = read(0,buf,BUFSIZ)) > 0 ) {
X char *newstr = malloc(len+n+1);
X if ( str ) {
X bcopy(str,newstr,len);
X free(str);
X }
X bcopy(buf,newstr+len,n);
X newstr[len+n] = '\0';
X str = newstr; len += n;
X }
X
X if ( len != prev_len ) {
X XtVaSetValues( text, XtNstring, str, XtNlength, len, NULL );
X if ( !initialized ) {
X CenterWidgetUnderPointer(shell);
X initialized = True;
X }
X if ( !popped_up ) XtPopup(shell,XtGrabNone);
X popped_up = True;
X XBell(display,50);
X } else {
X if ( !popped_up ) exit(0);
X XtVaSetValues( hide, XtNlabel, "Quit", NULL );
X stdin_open = False;
X }
X }
X
X while ( XtAppPending(app_context) ) {
X XtAppNextEvent(app_context,&event);
X XtDispatchEvent(&event);
X }
X }
X}
X
X/* Centre the widget over the pointer. */
Xvoid
XCenterWidgetUnderPointer(w)
XWidget w;
X{
X Dimension width, height;
X Window r, c;
X int rx, ry, cx, cy;
X Position x, y;
X unsigned int m;
X
X XtVaGetValues(w, XtNwidth, &width, XtNheight, &height, NULL);
X XQueryPointer(XtDisplay(w), XtWindow(w), &r,&c, &rx,&ry,&cx,&cy, &m);
X x = rx-width/2; if ( x < 0 ) x = 0;
X y = ry-height/2; if ( y < 0 ) y = 0;
X XtVaSetValues(w, XtNx, x, XtNy, y, NULL);
X}
X
X/*
X * Blocks for input to either stdin or X connection.
X * Returns True if stdin is available.
X */
XBoolean
XWaitForXOrStdin(dpy, use_stdin)
X Display *dpy;
X Boolean use_stdin;
X{
X fd_set r_mask;
X int result;
X
X FD_ZERO(&r_mask);
X do {
X if ( use_stdin ) FD_SET(0, &r_mask); /* stdin */
X FD_SET(dpy->fd, &r_mask); /* display to X */
X result = select(dpy->fd + 1, &r_mask, NULL, NULL, NULL);
X if (result == -1 && errno != EINTR) _XIOError(dpy);
X } while (result <= 0);
X return FD_ISSET(0,&r_mask);
X}
EOF
if test 5486 -ne "`wc -c notifier.c`"
then
echo shar: error transmitting notifier.c \(should have been 5486 characters\)
fi
echo x - notifier.h \(1594 characters\)
sed 's/^X//' > notifier.h << \EOF
X/******************************************************************************
X
X Copyright 1991 McGill University
X
X Permission to use, copy, modify, and distribute this software and its
X documentation for any purpose without fee is hereby granted without fee,
X provided that the above copyright notice appear in all copies and that
X both that copyright notice and this permission notice appear in
X supporting documentation, and that the name of McGill not be used in
X advertising or publicity pertaining to distribution of the software
X without specific, written prior permission. McGill makes no
X representations about the suitability of this software for any purpose.
X It is provided "as is" without express or implied warranty.
X
X MCGILL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
X IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T.
X BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
X WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
X OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
X CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
X
X Author:
X Lee Iverson <leei@mcrcim.mcgill.edu>,
X McGill Research Centre for Intelligent Machines (McRCIM)
X
X $Id: notifier.h,v 0.7.1.1 1991/05/24 12:28:20 leei Exp $
X
X******************************************************************************/
X
X#ifndef _notifier_h_
X#define _notifier_h_
X
X#include <sys/wait.h>
X
Xpid_t stderrNotifier( char *name );
X
X#endif /* _notifier_h_ */
EOF
if test 1594 -ne "`wc -c notifier.h`"
then
echo shar: error transmitting notifier.h \(should have been 1594 characters\)
fi
echo x - stderr_notifier.c \(2183 characters\)
sed 's/^X//' > stderr_notifier.c << \EOF
X/******************************************************************************
X
X Copyright 1991 McGill University
X
X Permission to use, copy, modify, and distribute this software and its
X documentation for any purpose without fee is hereby granted without fee,
X provided that the above copyright notice appear in all copies and that
X both that copyright notice and this permission notice appear in
X supporting documentation, and that the name of McGill not be used in
X advertising or publicity pertaining to distribution of the software
X without specific, written prior permission. McGill makes no
X representations about the suitability of this software for any purpose.
X It is provided "as is" without express or implied warranty.
X
X MCGILL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
X IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T.
X BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
X WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
X OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
X CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
X
X Author:
X Lee Iverson <leei@mcrcim.mcgill.edu>,
X McGill Research Centre for Intelligent Machines (McRCIM)
X
X******************************************************************************/
X
Xstatic char RCSid[] = "$Id: stderr_notifier.c,v 0.7.1.1 1991/05/24 12:28:20 leei Exp $";
X
X#include <stdio.h>
X#include <notifier.h>
X
Xpid_t
XstderrNotifier( char *name )
X{
X pid_t pid;
X int to_notifier[2];
X
X if ( pipe(to_notifier) ) {
X fprintf( stderr, "Failed to create pipe for notifier.\n" );
X return;
X }
X
X if ( !(pid = vfork()) ) {
X /* Exec notifier process and ... */
X dup2( to_notifier[0], 0 ); /* Pipe -> stdin of notifier. */
X close(to_notifier[0]); close(to_notifier[1]);
X execlp( "notifier", name, 0 );
X exit(1);
X } else {
X if ( waitpid( pid, WNOHANG ) != pid ) {
X /* Attach input end of pipe to stderr. */
X dup2( to_notifier[1], 2 ); /* Pipe <- stderr of process. */
X close(to_notifier[0]); close(to_notifier[1]);
X }
X }
X
X return pid;
X}
EOF
if test 2183 -ne "`wc -c stderr_notifier.c`"
then
echo shar: error transmitting stderr_notifier.c \(should have been 2183 characters\)
fi
exit 0
# end of shell archive
--
Lee Iverson McGill Research Centre for Intelligent Machines
leei@mcrcim.mcgill.edu Computer Vision and Robotics Lab
McGill University, Montreal