gregc@cgl.ucsf.edu (Greg Couch) (07/12/89)
Ever been frustrated by the inability to autostart several Terminal windows in *different* screen locations? If so, please check out the following "fix" and let me know if you come up with any spiffy window positioning programs. - Greg Couch gregc@cgl.ucsf.edu ------ Pseudo.shar ------ #! /bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create: # Makefile # Pseudo.c # window-position.c # Pseudo.1 # window-position.1 # Pseudo.iconheader # This archive created: Tue Jul 11 16:51:42 1989 export PATH; PATH=/bin:/usr/bin:$PATH echo shar: "extracting 'Makefile'" '(1577 characters)' if test -f 'Makefile' then echo shar: "will not over-write existing file 'Makefile'" else sed 's/^ X//' << \SHAR_EOF > 'Makefile' X# X# $Id: Makefile,v 1.3 89/07/11 16:51:33 gregc Exp $ X# X# See the manual pages for a description of what these programs X# do. To install, do a "make install" and then as root do a X# "make installman". You may want to change the APPDEST and X# BINDEST macros first though. X# XSHELL = /bin/sh X XAPPDEST = /LocalApps XBINDEST = /usr/local/bin X XCFLAGS = -O -Wall -pendantic X XPROGRAM1 = Pseudo XAPPICON1 = XDOCICON1 = XAPPICONFLAGS1 = -segcreate __ICON __header ${PROGRAM1}.iconheader \ X -segcreate __ICON __tiff ${PROGRAM1}.iconlist XSRCS1 = Pseudo.c XOBJS1 = Pseudo.o XLIBS1 = -lNeXT_s -lsys_s X XPROGRAM2 = window-position XSRCS2 = window-position.c XOBJS2 = window-position.o XLIBS2 = -lsys_s X Xall: ${PROGRAM1} ${PROGRAM2} X Xinstall: ${PROGRAM1} ${PROGRAM2} X install -s ${PROGRAM1} ${APPDEST}/${PROGRAM1} X install -s ${PROGRAM2} ${BINDEST}/${PROGRAM2} X Xinstallman: X @echo "You probably need to be root to install the manual pages" X ln ${PROGRAM1}.1 ${PROGRAM1}.l ; \ X installman ${PROGRAM1}.l ; \ X rm ${PROGRAM1}.l X ln ${PROGRAM2}.1 ${PROGRAM2}.l ; \ X installman ${PROGRAM2}.l ; \ X rm ${PROGRAM2}.l X X${PROGRAM1}: ${OBJS1} ${PROGRAM1}.iconheader ${PROGRAM1}.iconlist X ${CC} ${CFLAGS} -o ${PROGRAM1} ${OBJS1} ${LIBS1} ${APPICONFLAGS1} X X${PROGRAM1}.iconlist: ${APPICON1} ${DOCICON1} X cat ${APPICON1} ${DOCICON1} /dev/null > ${PROGRAM1}.iconlist X X${PROGRAM2}: ${OBJS2} X ${CC} ${CFLAGS} -o ${PROGRAM2} ${OBJS2} ${LIBS2} X Xclean: X rm -f ${OBJS1} ${PROGRAM1} ${PROGRAM1}.iconlist ${OBJS2} ${PROGRAM2} \ X ${PROGRAM1}.shar X Xshar: X shar -a Makefile *.c *.1 *.iconheader > ${PROGRAM1}.shar SHAR_EOF if test 1577 -ne "`wc -c < 'Makefile'`" then echo shar: "error transmitting 'Makefile'" '(should have been 1577 characters)' fi fi echo shar: "extracting 'Pseudo.c'" '(3506 characters)' if test -f 'Pseudo.c' then echo shar: "will not over-write existing file 'Pseudo.c'" else sed 's/^ X//' << \SHAR_EOF > 'Pseudo.c' X/* X * $Id: Pseudo.c,v 1.3 89/07/11 16:50:45 gregc Exp $ X * X * Copyright 1989 by the Regents of the University of California and X * the UCSF Computer Graphics Laboratory. All rights reserved. X * Freely redistributable. X * X * Pseudo: by Greg Couch, gregc@cgl.ucsf.edu, July 1989. X * X * One of the main design defects of the Workspace manager X * and NeXT defaults database is that you can't specify command line X * arguments to applications invoked via the dock. This is especially X * important if you wish to startup more than one terminal emulator X * without them appearing in the same place, same font, same .... X * X * This program pretends to be an application, so it will X * get the -MachLaunch arguments to communicate back to the Workspace X * manager with. All of its arguments are passed through to the X * real application being run. To find out which application to run X * and the set of arguments to use, it checks the name that it was X * invoked with and uses that as the application name for finding X * variables in the defaults database. X */ X X# include <appkit/defaults.h> X# include <stdlib.h> X# include <string.h> X# include <syslog.h> X# include <sys/param.h> X Xextern int execvp(char *, char **); Xstatic char *strend(char *, char *, char *); X X# define DEFAULT_SHELL "/bin/sh" X# define CMDBUF_END (&cmdbuf[sizeof cmdbuf]) X Xstatic char cmdbuf[NCARGS]; Xstatic char *shell[] = { DEFAULT_SHELL, "-c", cmdbuf, NULL }; X Xvoid Xmain(argc, argv) X int argc; X char *argv[]; X{ X register char *cmdend; X register int i; X register char *invoked_as; X /* defaults */ X register char *Application; X register char *Args; X register char *Shell; X X if (argc <= 0) X exit(1); X X /* find out which application we're pretending to be */ X if ((invoked_as = strrchr(argv[0], '/')) != NULL) X invoked_as += 1; X else X invoked_as = argv[0]; X X openlog(invoked_as, LOG_PID, LOG_USER); X X Application = NXGetDefaultValue(invoked_as, "Application"); X if (Application == NULL) { X syslog(LOG_ERR, "missing Application default"); X exit(2); X } X X Shell = NXGetDefaultValue(invoked_as, "Shell"); X if (Shell == NULL) X Shell = getenv("SHELL"); X if (Shell != NULL) X shell[0] = Shell; X X /* X * build command string X */ X X cmdend = cmdbuf; X cmdend = strend(cmdend, "exec ", CMDBUF_END); X X /* start with application */ X cmdend = strend(cmdend, Application, CMDBUF_END); X cmdend = strend(cmdend, " ", CMDBUF_END); X X /* pass through command line arguments */ X for (i = 1; i < argc; i += 1) { X register char *s, *t; X X cmdend = strend(cmdend, "\"", CMDBUF_END); X for (s = argv[i]; (t = strchr(s, '"')) != NULL; s = t + 1) { X *t = '\0'; X cmdend = strend(cmdend, s, CMDBUF_END); X *t = '"'; X } X cmdend = strend(cmdend, s, CMDBUF_END); X cmdend = strend(cmdend, "\" ", CMDBUF_END); X } X X /* add on specific arguments */ X Args = NXGetDefaultValue(invoked_as, "Args"); X if (Args != NULL) X cmdend = strend(cmdend, Args, CMDBUF_END); X X if (cmdend == NULL) { X syslog(LOG_ERR, "argument list too long"); X exit(3); X } X X (void) execvp(shell[0], shell); X syslog(LOG_ERR, "exec failed (%s): %m", shell[0]); X syslog(LOG_ERR, "PATH = %s", getenv("PATH")); X exit(errno); X} X X/* X * strend: X * X * append src string to dest string and return the end of the X * dest string without going beyond the last position in the dest string. X */ X Xstatic char * Xstrend(dest, src, last) X char *dest, *src, *last; X{ X if (dest == NULL) X return NULL; X X while (dest < last && *src) X *dest++ = *src++; X X if (*src) X return NULL; X *dest = '\0'; X return dest; X} SHAR_EOF if test 3506 -ne "`wc -c < 'Pseudo.c'`" then echo shar: "error transmitting 'Pseudo.c'" '(should have been 3506 characters)' fi fi echo shar: "extracting 'window-position.c'" '(1783 characters)' if test -f 'window-position.c' then echo shar: "will not over-write existing file 'window-position.c'" else sed 's/^ X//' << \SHAR_EOF > 'window-position.c' X/* X * $Id: window-position.c,v 1.3 89/07/11 16:50:47 gregc Exp $ X * X * Copyright 1989 by the Regents of the University of California and X * the UCSF Computer Graphics Laboratory. All rights reserved. X * Freely redistributable. X * X * window-position: by Greg Couch, gregc@cgl.ucsf.edu, July 1989. X * X * Generate random window postions. X */ X X# include <stdio.h> X# include <stdlib.h> X# include <string.h> X# include <nextdev/video.h> X Xextern int getpid(void); Xextern int getopt(int, char **, char *), optind; Xextern char *optarg; X Xvoid Xmain(argc, argv) X int argc; X char *argv[]; X{ X int c; X int along_line; X int h, v; X double t; X int lowerH, upperH, lowerV, upperV; X char *invoked_as; X X if (argc <= 0) { X invoked_as = "???"; X goto usage; X } X X if ((invoked_as = strrchr(argv[0], '/')) != NULL) X invoked_as += 1; X else X invoked_as = argv[0]; X X along_line = 0; X while ((c = getopt(argc, argv, "l")) != EOF) switch (c) { X X case 'l': X along_line = 1; X break; X X default: X goto usage; X } X X if (optind + 4 != argc) { Xusage: X (void) fprintf(stderr, X "usage: %s [-l] lowerH upperH lowerV upperV\n", X invoked_as); X exit(1); X } X X lowerH = atoi(argv[optind + 0]); X upperH = atoi(argv[optind + 1]); X lowerV = atoi(argv[optind + 2]); X upperV = atoi(argv[optind + 3]); X X if (lowerH < 0 || lowerH > VIDEO_W X || upperH < 0 || upperH > VIDEO_W X || lowerV < 0 || lowerV > VIDEO_H X || upperV < 0 || upperV > VIDEO_H) { X (void) fprintf(stderr, X "%s: bounds must be between (0, 0) and (%d, %d)\n", X invoked_as, VIDEO_W, VIDEO_H); X exit(1); X } X X srand(getpid()); X t = rand() / (double) RAND_MAX; X h = lowerH + t * (upperH - lowerH) + .5; X if (!along_line) X t = rand() / (double) RAND_MAX; X v = lowerV + t * (upperV - lowerV) + .5; X printf("-WinLocH %d -WinLocV %d\n", h, v); X exit(0); X} SHAR_EOF if test 1783 -ne "`wc -c < 'window-position.c'`" then echo shar: "error transmitting 'window-position.c'" '(should have been 1783 characters)' fi fi echo shar: "extracting 'Pseudo.1'" '(2375 characters)' if test -f 'Pseudo.1' then echo shar: "will not over-write existing file 'Pseudo.1'" else sed 's/^ X//' << \SHAR_EOF > 'Pseudo.1' X.\" $Id: Pseudo.1,v 1.2 89/07/11 16:50:43 gregc Exp $ X.\" Copyright 1989 by the Regents of the University of California and X.\" the UCSF Computer Graphics Laboratory. All rights reserved. X.\" Freely redistributable. X.TH PSEUDO 1 "10 July 1989" "LOCAL" X.SH NAME XPseudo \- a fake application to customize instances of applications X.SH SYNOPSIS Xln -s /LocalApps/Pseudo ~/Apps/NewName X.sp XNewName X.RI [ "Arguments to pass to Application" ] X.SH DESCRIPTION XOne of the main design features of the NeXTStep Workspace manager Xand NeXT defaults database is that you can't specify command line Xarguments to applications invoked via the dock or the directory Xbrowser. XThis is especially important if you wish to autostart Xmore than one terminal emulator Xwithout them appearing in the same place, same font, same .... X.PP XThe X.I Pseudo Xapplication Xadds command line arguments to other applications by adding another Xlayer to their invocation. XAny command line arguments it receives are passed unaltered to the Xreal application. X.PP XTo find out which application to run Xand the set of arguments to use, it checks the name that it was Xinvoked with and uses that as the application name for finding Xvariables in the defaults database. XThe variables are used to construct the following command line Xto invoke the real application: X.sp X \f2Shell\fP -c "exec \f2Application\fP command-line-args \f2Args\fP" X.SH "DEFAULTS VARIABLES" XThe X.I Application Xvariable is the name of the application to invoke. X.PP XThe X.I Args Xvariable is an argument string for the application. X.PP XThe X.I Shell Xvariable is the shell to pass the command to (the default is your SHELL Xenvironment variable \(em or the Workspace's). X.SH EXAMPLE #1 X.nf X% ln -s /LocalApps/Pseudo ~/Apps/myterm X% dwrite myterm Application /NextApps/Terminal X% dwrite myterm Args "-Lines 40 -FontSize 14 -WinLocH 0 -WinLocV 152" X% rehash # if using csh X% myterm X.SH EXAMPLE #2 X.nf X% ln -s /LocalApps/Pseudo ~/Apps/myterm X% dwrite Application /NextApps/Terminal X% dwrite myterm Args "-Lines 40 -FontSize 14 `window-position -l 0 369 152 0`" X% rehash # if using csh X% myterm & ; myterm & X.fi X.SH FILES X.IP "/bin/sh" 3i XDefault shell X.SH "SEE ALSO" Xwindow-position(local), Xdwrite(1), Xsyslogd(1) X.SH AUTHOR XGreg Couch, gregc@cgl.ucsf.edu X.SH DIAGNOSTICS XErrors are logged via syslog(3) with the X.I user Xfacility. X.SH BUGS XNeeds a spiffy icon. SHAR_EOF if test 2375 -ne "`wc -c < 'Pseudo.1'`" then echo shar: "error transmitting 'Pseudo.1'" '(should have been 2375 characters)' fi fi echo shar: "extracting 'window-position.1'" '(873 characters)' if test -f 'window-position.1' then echo shar: "will not over-write existing file 'window-position.1'" else sed 's/^ X//' << \SHAR_EOF > 'window-position.1' X.\" $Id: window-position.1,v 1.3 89/07/11 16:50:44 gregc Exp $ X.\" Copyright 1989 by the Regents of the University of California and X.\" the UCSF Computer Graphics Laboratory. All rights reserved. X.\" Freely redistributable. X.TH WINDOW-POSITION 1 "10 July 1989" "LOCAL" X.SH NAME Xwindow-position \- generate a random window position X.SH SYNOPSIS Xwindow-position X.RI [ \-l ] XlowerH upperH lowerV upperV X.SH DESCRIPTION X.I window-position Xgenerates a random window postion acceptable as command line input to Xthe X.IR Terminal (1) Xapplication. X.PP XThe horizontal position is between X.I lowerH Xand X.I upperH Xinclusive. X.PP XThe vertical position is between X.I upperH Xand X.I upperH Xinclusive. X.PP XIf the X.B \-l Xoption is given, Xthe output is along the line (lowerH, lowerV) to (upperH, upperV). X.SH "SEE ALSO" XTerminal(1), XPseudo(local) X.SH AUTHOR XGreg Couch, gregc@cgl.ucsf.edu SHAR_EOF if test 873 -ne "`wc -c < 'window-position.1'`" then echo shar: "error transmitting 'window-position.1'" '(should have been 873 characters)' fi fi echo shar: "extracting 'Pseudo.iconheader'" '(18 characters)' if test -f 'Pseudo.iconheader' then echo shar: "will not over-write existing file 'Pseudo.iconheader'" else sed 's/^ X//' << \SHAR_EOF > 'Pseudo.iconheader' XF Pseudo Pseudo 0 SHAR_EOF if test 18 -ne "`wc -c < 'Pseudo.iconheader'`" then echo shar: "error transmitting 'Pseudo.iconheader'" '(should have been 18 characters)' fi fi exit 0 # End of shell archive