Amiga-Request@cs.odu.edu (Amiga Sources/Binaries Moderator) (02/12/90)
Submitted-by: micke@slaka.sirius.se (Mikael Karlsson) Posting-number: Volume 90, Issue 068 Archive-name: util/snap-1.4/part02 #!/bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of archive 2 (of 4)." # Contents: source/ikm.c source/settings.c source/windows.c # startsnap.rexx # Wrapped by tadguy@xanth on Sun Feb 11 17:48:45 1990 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'source/ikm.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'source/ikm.c'\" else echo shar: Extracting \"'source/ikm.c'\" \(9076 characters\) sed "s/^X//" >'source/ikm.c' <<'END_OF_FILE' X/* ikm.c -- invert keymaps */ X X/** NOTICE: X * The contents of this file are copyright 1987, Jim Mackraz. All rights X * reserved. No use of the contents of this file or the compilation X * of them may be used apart from the entire Commodities Exchange X * without written permission. X */ X X#define CONTROLBITS ( (1 << 5) | (1 << 6) ) X X/* return >= 0 if ok (no error checking now) */ XULONG InvertKeyMap(ansicode, ie, km) XULONG ansicode; Xregister struct InputEvent *ie; Xstruct KeyMap *km; X{ X ULONG kindex; X UBYTE code = 0; X extern struct KeyMap keymap; X X if (km == NULL) { X km = &keymap; X } X X ie->ie_Class = IECLASS_RAWKEY; X ie->ie_EventAddress = 0; X X /* check for codes in (default) high map first */ X switch(ansicode) X { X case ' ': X code = 0x40; /* space */ X break; X case 0x08: /* backspace */ X code = 0x41; X break; X case '\t': /* tab */ X code = 0x42; X break; X case 0x0D: /* return */ X code = 0x44; X break; X case 0x1B: /* esc */ X code = 0x45; X break; X case 0x7F: /* del */ X code = 0x46; X break; X } X X if (code) { X ie->ie_Code = code; X ie->ie_Qualifier = 0; X return (1); X } X X if (LowKeyInvert((UBYTE) ansicode, km, X &ie->ie_Code, &ie->ie_Qualifier, &kindex) >= 0) { X if (kindex) { /* was dead key, need "preceding" keystroke. */ X IndexKey(kindex, km, (ULONG *)&ie->ie_EventAddress); X } X } X X return (1); X} X X#define KEYMAPSIZE 64 X X/* LowKeyInvert returns good code else <0 if no find X * X * regarding keymap as many-to-one mapping: X * -entries for a given key are scanned so that X * the minimum number of qualifiers are associated X * with the keystroke. X * -passing a character value of zero corresponds, in X * the default keymap, to CTRL-`, which is probably a bug. X * -numerals are matched with numeric pad keystrokes (no X * qualifiers) on standard keymap. The way to specify X * a key on the number row is via its shifted value; X * specify explicitly that the qualifier is to be unshifted, X * or a "don't care." X */ XUWORD LowKeyInvert(value, km, codep, qualp, indexp) Xregister UBYTE value; /* translation value from low keymap */ Xstruct KeyMap *km; XUWORD *codep; /* pointers where answers are to be put */ XUWORD *qualp; XULONG *indexp; /* dead-key index information (put into ie?) */ X{ X register UWORD code = 0; X register WORD type; X register LONG *p; /* points to four-byte lokeymap entry */ X WORD found_it = 0; X X *indexp = *qualp = 0; X X p = (LONG *) km->km_LoKeyMap; X X do { X /* determine type of key */ X if ((type = km->km_LoKeyMapTypes[code] ) == KC_VANILLA) { X found_it = checkVanilla((UBYTE *)p, value, qualp); X } else if (type & KCF_DEAD) { X found_it = checkDead((UBYTE **)p, value, qualp, indexp); X } X /** X else if (type & KCF_STRING) { X } X **/ X else if (!(type & KCF_NOP)) { X found_it = checkNormal((LONG)p, value, (UWORD)type, qualp); X } X X ++p; X } while (!found_it && ++code < KEYMAPSIZE); X X *codep = code; X return (code); X} X X/* X * packs code|qual of previous key (should be keys) in *dead_vudup X * returns code, <0 if failure X */ XVOID IndexKey(inx, km, dead_vudup) XULONG inx; Xstruct KeyMap *km; XULONG *dead_vudup; X{ X /* find keystroke which generates index */ X X register WORD code = 0; X UWORD **p; /* points to four-byte lokeymap entry */ X register UWORD *deadthing; X WORD i; X WORD qual = 0; X LONG vudu; X X p = (UWORD **) km->km_LoKeyMap; X X do { X /* check each deadkey in the table */ X X if (km->km_LoKeyMapTypes[code] & KCF_DEAD) { X /* keymap entry is pointer to eight prefix:byte pairs */ X X deadthing = *p; X for (i = 0; i < 8; ++i, ++deadthing) { X /* check for index prefix and correct index */ X if (*deadthing == ((DPF_DEAD << 8) | inx)) { X deadQual((WORD)i, &qual); X goto FOUND_IT; X } X } X } X ++p; X } while (++code < KEYMAPSIZE); X XFOUND_IT: X X /* pack as follows: [pred(-1)|qual(-1)|pred(-2)|qual(-2)] */ X /* for now, 2nd previous deadkey ignored */ X X if (code < 0) { X *dead_vudup = 0; X } else { X vudu = code << 8; X vudu |= (0xFF & qual); X vudu <<= 16; X X *dead_vudup = vudu; X } X} X X XWORD checkNormal(four_bytesp, val, type, qualp) XLONG four_bytesp; XUBYTE val; XUWORD type; XUWORD *qualp; X{ X register UBYTE *p = (UBYTE *) four_bytesp; /* codes held in long word */ X register WORD position; X X /* start with last of four bytes, "more vanilla" */ X p += 3; X X for (position = 3; position >= 0; --position, --p) { X if (*p == val) { X switch (type) { X case KC_NOQUAL: X if (position != 3) goto NOT_THIS; X break; X X case KCF_SHIFT: X if (!(position & 2)) goto NOT_THIS; X if (position == 2) *qualp |= IEQUALIFIER_LSHIFT; X break; X X case KCF_ALT: X if (!(position & 2)) goto NOT_THIS; X if (position == 2) *qualp |= IEQUALIFIER_LALT; X break; X X case KCF_CONTROL: X if (!(position & 2)) goto NOT_THIS; X if (position == 2) *qualp |= IEQUALIFIER_CONTROL; X break; X X case KCF_ALT | KCF_CONTROL: X if (!(position & 1)) *qualp |= IEQUALIFIER_LALT; X if (!(position & 2)) *qualp |= IEQUALIFIER_CONTROL; X break; X X case KCF_SHIFT | KCF_CONTROL: X if (!(position & 1)) *qualp |= IEQUALIFIER_LSHIFT; X if (!(position & 2)) *qualp |= IEQUALIFIER_CONTROL; X break; X X case KCF_SHIFT | KCF_ALT: X if (!(position & 1)) *qualp |= IEQUALIFIER_LSHIFT; X if (!(position & 2)) *qualp |= IEQUALIFIER_LALT; X break; X default: X break; X } X return (1); X } XNOT_THIS: ; X } X return (0); X} X XWORD checkVanilla(p, val, qualp) XUBYTE *p; /* note: byte pointer */ XUBYTE val; XUWORD *qualp; X{ X register WORD i; X X /* only one way to match a vanilla control key */ X if (!(val & CONTROLBITS)) { X /* is a control code */ X X if ((p[3] & ~CONTROLBITS) == val) { X *qualp |= IEQUALIFIER_CONTROL; X return (1); X } X } else { X /* not a control */ X for (i = 3; i >= 0; --i) { X if (p[i] == val) { X if (!(i & 1)) *qualp |= IEQUALIFIER_LSHIFT; X if (!(i & 2)) *qualp |= IEQUALIFIER_LALT; X return (1); X } X } X } X return (0); X} X X XWORD checkDead(keybase, val, qualp, indexp) XUBYTE **keybase; /* note: byte pointer */ XUBYTE val; XUWORD *qualp; XULONG *indexp; X{ X WORD i; X WORD j; X X register UWORD *p = (UWORD *) *keybase; X /* need to remember keybase for offsets */ X X UBYTE *deadp; X WORD found_it = 0; X X /* walk through eight two-byte entries, one for each qual. combo. */ X for (i = 0; i < 8; ++i, ++p) { X switch (*p >> 8) { X case DPF_DEAD: /* dead keys do not themselves map to anything */ X break; X case DPF_MOD: /* dead key modifiable */ X deadp = *keybase + (*p & 0xFF); X /* look down the string indexed by dead-key index */ X for (j = 0; j < 6; ++j) { X if (deadp[j] == val) { X found_it = 1; X *indexp = j; X break; X } X } X break; X case 0: /* normal stroke for this key */ X if ((*p & 0xFF) == val) { X found_it = 1; X } X } X X if (found_it) { X deadQual((WORD)i, qualp); X return (1); X } X } X X return (0); X} X X/* figure out qualifier from position */ XWORD deadQual(wordpos, qualp) XWORD wordpos; /* which word in dead-key string? */ XUWORD *qualp; X{ X if (wordpos & 1) *qualp |= IEQUALIFIER_LSHIFT; X if (wordpos & 2) *qualp |= IEQUALIFIER_LALT; X if (wordpos & 4) *qualp |= IEQUALIFIER_CONTROL; X return (0); X} X X END_OF_FILE if test 9076 -ne `wc -c <'source/ikm.c'`; then echo shar: \"'source/ikm.c'\" unpacked with wrong size! fi # end of 'source/ikm.c' fi if test -f 'source/settings.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'source/settings.c'\" else echo shar: Extracting \"'source/settings.c'\" \(12211 characters\) sed "s/^X//" >'source/settings.c' <<'END_OF_FILE' X#include "snap.h" X#include <stdio.h> X X#define ARGVAL() (*++(*argv) || (--argc && *++argv)) X Xstruct SnapRsrc *SnapRsrc = NULL; X XSHORT isdigit(c) XREGISTER char c; X{ X return (c>='0' && c<='9'); X} X X#ifdef AZTEC_C Xchar *strupr(str) Xchar *str; X{ X register char *p = str; X register char c; X while (c = *p) { X if ('a' <= c && c <= 'z') { X *p = c - ('a' - 'A'); X } X ++p; X } X return str; X} X#endif AZTEC_C X XLONG dectoint(str) XREGISTER char *str; X{ X REGISTER long val = 0; X REGISTER char c; X while (isdigit(c = *str)) { X val = (((val<<2)+val)<<1) + c-'0'; X str++; X } X return(val); X} X XLONG hextoint(str) XREGISTER char *str; X{ X REGISTER long val = 0; X REGISTER char c; X while (c = *str) { X val <<= 4; X val |= (c & 15) + (isdigit(c) ? 0 : 9); X str++; X } X return(val); X} X Xmain(argc, argv) XWORD argc; Xchar *argv[]; X{ X WORD usage = 0; X X SnapRsrc = (struct SnapRsrc *)OpenResource(SNAPRSRC); X if (!SnapRsrc) { X puts("Snap not installed"); X exit(0); X } X X if (argc == 1) { X puts("Snap settings:"); X printf("Priority: %d\n", SnapRsrc->Priority); X printf("Gfx Qual: %x, ", SnapRsrc->gfxqual); X printf("Text Qual: %x\n", SnapRsrc->textqual); X printf("Insert key: %x, ", SnapRsrc->insertkey); X printf("CW key: %x\n", SnapRsrc->cwkey); X printf("Prepend: \"%s\"\n", &SnapRsrc->Prepend); X printf("Append: \"%s\"\n", &SnapRsrc->Append); X printf("Xerox: %s, ", (SnapRsrc->flags & XEROX ? "On " : "Off")); X printf("Early patch: %s\n", (SnapRsrc->flags & EARLYPATCH ? "On " : "Off")); X printf("Join long: %s, ", (SnapRsrc->flags & JOINLONG ? "On " : "Off")); X printf("Underscore: %s\n", (SnapRsrc->flags & TRUEUNDERSCORE ? "True" : "Fake")); X printf("Line Delay: %ld, ", SnapRsrc->linedelay); X printf("Char Delay: %ld\n", SnapRsrc->chardelay); X printf("Crawl Ptrn: %x\n", SnapRsrc->CrawlPtrn); X printf("Start Unit: %d\n", SnapRsrc->StartUnit); X printf("Frame Mask: %x\n", SnapRsrc->FrameMask); X printf("Gad Offset: %d\n", SnapRsrc->GadOffset); X printf("Cache Size: %d\n", SnapRsrc->CacheSize); X printf("Bad char: %d\n", SnapRsrc->BadChar); X exit(0); X } X X for (argc--, argv++; argc > 0; argc--, argv++) { X if (**argv == '-') { /* Argument coming up */ X switch(*++(*argv)) { X case 'p': priority: { /* Priority */ X if (ARGVAL()) { X WORD pri = dectoint(*argv); X if (pri>50 && pri<128) { X SnapRsrc->Priority = pri; X } X } else { X usage = 1; X } X break; X } X case 't': textqual: { X if (ARGVAL()) { X SnapRsrc->textqual = hextoint(*argv); X } else { X usage = 1; X } X break; X } X case 'g': gfxqual: { X if (ARGVAL()) { X SnapRsrc->gfxqual = hextoint(*argv); X } else { X usage = 1; X } X break; X } X case 'i': insertkey: { X if (ARGVAL()) { X SnapRsrc->insertkey = hextoint(*argv); X } else { X usage = 1; X } X break; X } X case 'w': cwkey: { X if (ARGVAL()) { X SnapRsrc->cwkey = hextoint(*argv); X } else { X usage = 1; X } X break; X } X case 'c': chardelay: { X if (ARGVAL()) { X SnapRsrc->chardelay = dectoint(*argv) * 1000; X } else { X usage = 1; X } X break; X } X case 'l': linedelay: { X if (ARGVAL()) { X SnapRsrc->linedelay = dectoint(*argv) * 1000; X } else { X usage = 1; X } X break; X } X case 'a': crawlptrn: { X if (ARGVAL()) { X SnapRsrc->CrawlPtrn = hextoint(*argv); X } else { X usage = 1; X } X break; X } X case 'X': noxerox: { X SnapRsrc->flags &= ~XEROX; X break; X } X case 'x': xerox: { X SnapRsrc->flags |= XEROX; X break; X } X case 'E': noearlypatch: { X SnapRsrc->flags &= ~EARLYPATCH; X break; X } X case 'e': earlypatch: { X SnapRsrc->flags |= EARLYPATCH; X break; X } X case 'R': fakeunderscore: { X SnapRsrc->flags &= ~TRUEUNDERSCORE; X break; X } X case 'r': realunderscore: { X SnapRsrc->flags |= TRUEUNDERSCORE; X break; X } X case 'J': nojoinlong: { X SnapRsrc->flags &= ~JOINLONG; X break; X } X case 'j': joinlong: { X SnapRsrc->flags |= JOINLONG; X break; X } X case 'A': append: X case 'P': prepend: { X char *dest = (**argv == 'A' ? X &SnapRsrc->Append[0] : &SnapRsrc->Prepend[0]); X if (*++(*argv) || (--argc && ++argv)) { /* "" is ok */ X char *src = *argv; X WORD i = 16; X while (*src && i--) { X *dest++ = *src++; X } X *dest = '\0'; X } else { X usage = 1; X } X break; X } X case 'u': startunit: { X if (ARGVAL()) { X switch(dectoint(*argv)) { X case 1: { X SnapRsrc->StartUnit = UNIT_CHAR; X break; X } X case 0: X default: { X SnapRsrc->StartUnit = UNIT_FRAME; X break; X } X } X } else { X usage = 1; X } X break; X } X case 'b': planemask: { X if (ARGVAL()) { X SnapRsrc->FrameMask = hextoint(*argv); X } else { X usage = 1; X } X break; X } X case 'o': gadoffset: { X if (ARGVAL()) { X SnapRsrc->GadOffset = dectoint(*argv); X } else { X usage = 1; X } X break; X } X case 'C': cachesize: { X if (ARGVAL()) { X SnapRsrc->CacheSize = dectoint(*argv); X } else { X usage = 1; X } X break; X } X case 'B': badchar: { X if (ARGVAL()) { X SnapRsrc->BadChar = dectoint(*argv); X } else { X usage = 1; X } X break; X } X case 'Q': quit: { X Signal(SnapRsrc->Task, SIGBREAKF_CTRL_C); X exit(0); X } X case '?': { X usage = 1; X break; X } X default: { X printf("Bad option: -%c.\n", **argv); X usage = 1; X break; X } X } X } else { X (VOID)strupr(*argv); X if (!strcmp(*argv, "PRIORITY")) { X (*argv)[1] = '\0'; /* Fake no argument */ X goto priority; /* Terrible, ain't it? */ X } else if (!strcmp(*argv, "TEXTQUAL")) { X (*argv)[1] = '\0'; X goto textqual; X } else if (!strcmp(*argv, "GFXQUAL")) { X (*argv)[1] = '\0'; X goto gfxqual; X } else if (!strcmp(*argv, "INSERTKEY")) { X (*argv)[1] = '\0'; X goto insertkey; X } else if (!strcmp(*argv, "CWKEY")) { X (*argv)[1] = '\0'; X goto cwkey; X } else if (!strcmp(*argv, "PREPEND")) { X (*argv)[1] = '\0'; X goto prepend; X } else if (!strcmp(*argv, "APPEND")) { X (*argv)[1] = '\0'; X goto append; X } else if (!strcmp(*argv, "CHARDELAY")) { X (*argv)[1] = '\0'; X goto chardelay; X } else if (!strcmp(*argv, "LINEDELAY")) { X (*argv)[1] = '\0'; X goto linedelay; X } else if (!strcmp(*argv, "CRAWLPTRN")) { X (*argv)[1] = '\0'; X goto crawlptrn; X } else if (!strcmp(*argv, "XEROX")) { X goto xerox; X } else if (!strcmp(*argv, "NOXEROX")) { X goto noxerox; X } else if (!strcmp(*argv, "EARLYPATCH")) { X goto earlypatch; X } else if (!strcmp(*argv, "NOEARLYPATCH")) { X goto noearlypatch; X } else if (!strcmp(*argv, "TRUEUNDERSCORE")) { X goto realunderscore; X } else if (!strcmp(*argv, "FAKEUNDERSCORE")) { X goto fakeunderscore; X } else if (!strcmp(*argv, "JOINLONG")) { X goto joinlong; X } else if (!strcmp(*argv, "NOJOINLONG")) { X goto nojoinlong; X } else if (!strcmp(*argv, "STARTUNIT")) { X (*argv)[1] = '\0'; X goto startunit; X } else if (!strcmp(*argv, "PLANEMASK")) { X (*argv)[1] = '\0'; X goto planemask; X } else if (!strcmp(*argv, "GADOFFSET")) { X (*argv)[1] = '\0'; X goto gadoffset; X } else if (!strcmp(*argv, "CACHESIZE")) { X (*argv)[1] = '\0'; X goto cachesize; X } else if (!strcmp(*argv, "BADCHAR")) { X (*argv)[1] = '\0'; X goto badchar; X } else if (!strcmp(*argv, "QUIT")) { X goto quit; X } else if (strcmp(*argv, "?")) { X printf("Bad switch/keyword: %s.\n", *argv); X } X usage = 1; X } X } X X if (usage) { X puts("Usage:"); X puts(" snap -pNN -tXX -gXX -iXX -wXX -Pstr -Astr -cNN -lNN -aXXXX"); X puts(" -x -X -e -E -r -R -j -J -uN -bXX -oNN -CNN -BNN -Q"); X puts(" or"); X puts(" snap PRIORITY/k TEXTQUAL/k GFXQUAL/k INSERTKEY/k CWKEY/k"); X puts(" PREPEND/k APPEND/k CHARDELAY/k LINEDELAY/k CRAWLPTRN/k"); X puts(" XEROX/s NOXEROX/s EARLYPATCH/s NOEARLYPATCH/s STARTUNIT/k"); X puts(" TRUEUNDERSCORE/s FAKEUNDERSCORE/s JOINLONG/s NOJOINLONG/s"); X puts(" PLANEMASK/k GADOFFSET/k CACHESIZE/k BADCHAR/s QUIT/s"); X } X X /* Tell him there are new settings available */ X Signal(SnapRsrc->Task, SIGBREAKF_CTRL_F); X} END_OF_FILE if test 12211 -ne `wc -c <'source/settings.c'`; then echo shar: \"'source/settings.c'\" unpacked with wrong size! fi # end of 'source/settings.c' fi if test -f 'source/windows.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'source/windows.c'\" else echo shar: Extracting \"'source/windows.c'\" \(10836 characters\) sed "s/^X//" >'source/windows.c' <<'END_OF_FILE' X/* Auto: make X*/ X XIMPORT struct ArpBase *ArpBase; X Xstruct Window *ControlWindow = NULL; XIMPORT struct MsgPort *Sharedport; XIMPORT WORD Sharedrefs; X XIMPORT LONG TitleBarHeight; XIMPORT LONG ContentsFontHeight; XIMPORT struct RastPort MyRP; X X#define IDCMPFLAGS (MOUSEMOVE|NEWSIZE|CLOSEWINDOW|GADGETUP|ACTIVEWINDOW|INACTIVEWINDOW|MOUSEBUTTONS) X XUBYTE *WindowTitle = (UBYTE *)"Snap (c) 1989 Mikael Karlsson"; X Xstruct Image DiskImage = { X 0, -1, X 16, 8, 1, X NULL, X 0x01, 0x00, X NULL X}; X Xstruct Gadget DiskGad = { X NULL, X 0, 1, X 16, 8, X GADGIMAGE|GADGHCOMP|GRELRIGHT, X RELVERIFY, X BOOLGADGET, X (APTR)&DiskImage, X NULL, X NULL, X 0L, X NULL, X DISKGAD, X NULL, X}; X Xstruct Gadget VProp = { X NULL, X -15, 10, X 16, -10, X GADGHCOMP|GRELRIGHT|GRELHEIGHT, X GADGIMMEDIATE|FOLLOWMOUSE|RELVERIFY, X PROPGADGET, X NULL, X NULL, X NULL, X 0L, X NULL, X VPROP, X NULL X}; X Xstruct Gadget HProp = { X NULL, X 1, -8, X -15, 9, X GADGHCOMP|GRELBOTTOM|GRELWIDTH, X GADGIMMEDIATE|FOLLOWMOUSE|RELVERIFY, X PROPGADGET, X NULL, X NULL, X NULL, X 0L, X NULL, X HPROP, X NULL X}; X Xstruct PropInfo VInfo = { X AUTOKNOB|FREEVERT, X 0, 0, X MAXBODY, MAXBODY, X 0, 0, 0, 0, 0, 0 X}; X Xstruct PropInfo HInfo = { X AUTOKNOB|FREEHORIZ, X 0, 0, X MAXBODY, MAXBODY, X 0, 0, 0, 0, 0, 0 X}; X Xstruct Image VImage = { X 0, 0, 0, 0, 0, NULL, 0, 0, NULL X}; Xstruct Image HImage = { X 0, 0, 0, 0, 0, NULL, 0, 0, NULL X}; X X/* Window structure for snapped gfx */ Xstruct NewWindow Nw = { X 0, 1, /* LeftEdge, TopEdge */ X 0, 0, /* Width, Height */ X -1, -1, /* DetailPen, BlockPen */ X NULL, /* IDCMPFlags */ X WINDOWDRAG|WINDOWDEPTH|WINDOWCLOSE|WINDOWSIZING|SMART_REFRESH|NOCAREREFRESH|RMBTRAP, X NULL, NULL, /* FirstGadget, CheckMark */ X NULL, X NULL, NULL, /* Screen, BitMap */ X 32, 32, /* MinWidth, MinHeight */ X 0, 0, /* MaxWidth, MaxHeight */ X WBENCHSCREEN /* Type */ X}; X XSHORT Coords3[5][2] = { X { 0, 0}, X { 74, 0}, X { 74, 10}, X { 0, 10}, X { 0, 0} X}; X XSHORT Coords2[5][2] = { X { 0, 0}, X { 74, 0}, X { 74, 10}, X { 0, 10}, X { 0, 0} X}; X XSHORT Coords1[5][2] = { X { 0, 0}, X { 34, 0}, X { 34, 10}, X { 0, 10}, X { 0, 0} X}; X Xstruct Border Border3 = { X 42, 0, X 1, 0, X JAM1, X 5, X (SHORT *)&Coords3, X NULL X}; X Xstruct Border Border2 = { X 42, 0, X 1, 0, X JAM1, X 5, X (SHORT *)&Coords2, X &Border3 X}; X Xstruct Border Border1 = { X 4, 0, X 1, 0, X JAM1, X 5, X (SHORT *)&Coords1, X &Border2 X}; X XUBYTE TranspBuf[5]; X Xstruct StringInfo TranspSI = { X TranspBuf, /* Buf */ X NULL, /* UndoBuf */ X 0, /* BufferPos */ X 4, /* MaxChars */ X 0, /* DispPos */ X 0, /* UndoPos */ X 0, /* NumChars */ X 0, /* DispCount */ X 0, 0, /* CLeft, CTop */ X NULL, /* Layer */ X 0L, /* LongInt */ X NULL /* AltKeyMap */ X}; X Xstruct Gadget TranspGad = { X NULL, X 5, 16, X 32, 8, X LONGINT, X RELVERIFY, X STRGADGET, X NULL, X NULL, X NULL, X 0L, X (APTR)&TranspSI, X 0, X NULL, X}; X XUBYTE SaveName[256] = ""; XUBYTE SaveDirName[256] = ""; X Xstruct StringInfo NameSI = { X SaveName, /* Buf */ X NULL, /* UndoBuf */ X 0, /* BufferPos */ X 255, /* MaxChars */ X 0, /* DispPos */ X 0, /* UndoPos */ X 0, /* NumChars */ X 0, /* DispCount */ X 0, 0, /* CLeft, CTop */ X NULL, /* Layer */ X 0L, /* LongInt */ X NULL /* AltKeyMap */ X}; X Xstruct Gadget NameGad = { X &TranspGad, X 5, 16, X 32, 8, X NULL, X NULL, X NULL, X NULL, X NULL, X NULL, X 0L, X NULL, X NAMEGAD, X NULL, X}; X Xstruct Gadget SaveGad = { X &NameGad, X 5, 16, X 32, 8, X GADGHCOMP, X RELVERIFY, X BOOLGADGET, X NULL, X NULL, X NULL, X 0L, X NULL, X SAVEGAD, X NULL, X}; X X/* Window structure for control window */ Xstruct NewWindow NewCW = { X 10, 10, /* LeftEdge, TopEdge */ X 320, 40, /* Width, Height */ X -1, -1, /* DetailPen, BlockPen */ X NULL, /* IDCMPFlags */ X WINDOWDRAG|WINDOWDEPTH|WINDOWCLOSE|SMART_REFRESH|ACTIVATE|NOCAREREFRESH, X NULL, NULL, /* FirstGadget, CheckMark */ X (UBYTE *)"Snap Control Window", X NULL, NULL, /* Screen, BitMap */ X 32, 32, /* MinWidth, MinHeight */ X -1, -1, /* MaxWidth, MaxHeight */ X WBENCHSCREEN /* Type */ X}; X Xstruct FileRequester NameFR = { X "Save picture as...", X (BYTE *)SaveName, X (BYTE *)SaveDirName, X NULL, X NULL, X NULL, X NULL, X NULL X}; X Xstruct Window *opensharedwindow(nw) Xstruct NewWindow *nw; X{ X struct Window *win; X struct Screen scr; X X if (Sharedport) { X nw->IDCMPFlags = NULL; X } else { X nw->IDCMPFlags = IDCMPFLAGS; X } X if (!GetScreenData((char *)&scr, (LONG)sizeof(struct Screen), X WBENCHSCREEN, NULL)) { X return NULL; /* No WB */ X } X if (nw->TopEdge+nw->Height > scr.Height) { X nw->TopEdge = scr.Height-nw->Height; X } X if (nw->LeftEdge+nw->Width > scr.Width) { X nw->LeftEdge = scr.Width-nw->Width; X } X if (nw->TopEdge < 0) { X nw->TopEdge = 0; X } X if (nw->LeftEdge < 0) { X nw->LeftEdge = 0; X } X if (nw->TopEdge+nw->Height > scr.Height) { X nw->Height = scr.Height-nw->TopEdge; X } X if (nw->LeftEdge+nw->Width > scr.Width) { X nw->Width = scr.Width-nw->LeftEdge; X } X X if (win = OpenWindow(nw)) { X if (Sharedport) { X win->UserPort = Sharedport; X ModifyIDCMP(win, IDCMPFLAGS); X } else { X Sharedport = win->UserPort; X } X ++Sharedrefs; X } X return(win); X} X X XVOID closesharedwindow(win) Xstruct Window *win; X{ X Forbid(); X Sharedrefs--; X if (Sharedrefs > 0) { X REGISTER struct IntuiMessage *im, *succ; X im = (struct IntuiMessage *)win->UserPort->mp_MsgList.lh_Head; X while (succ = (struct IntuiMessage *)im->ExecMessage.mn_Node.ln_Succ) { X if (im->IDCMPWindow == win) { X Remove(im); X ReplyMsg(im); X } X im = succ; X } X win->UserPort = NULL; X ModifyIDCMP(win, MENUVERIFY); /* NEVER occurs */ X } else X Sharedport = NULL; X Permit(); X CloseWindow(win); X} X XVOID SetUpBorder(Border, Gad) Xstruct Border *Border; Xstruct Gadget *Gad; X{ X Border->LeftEdge = Gad->LeftEdge-1; X Border->TopEdge = Gad->TopEdge-1; X Border->XY[2] = Border->XY[4] = Gad->Width+1; X Border->XY[5] = Border->XY[7] = Gad->Height+1; X} X XVOID AdjustSize(GS) Xstruct GfxSnap *GS; X{ X ULONG w = GS->window->Width - 18; X ULONG h = GS->window->Height - GS->VProp.TopEdge - 9; X ULONG vb, hb; X X vb = hb = MAXBODY; X X if (w < GS->width) { X hb = w * (ULONG)MAXBODY / GS->width; X } X if (h < GS->height) { X vb = h * (ULONG)MAXBODY / GS->height; X } X NewModifyProp(&GS->VProp, GS->window, NULL, (ULONG)AUTOKNOB|FREEVERT, X 0L, 0L, (ULONG)MAXBODY, vb, 1L); X NewModifyProp(&GS->HProp, GS->window, NULL, (ULONG)AUTOKNOB|FREEHORIZ, X 0L, 0L, hb, (ULONG)MAXBODY, 1L); X InitRastPort(&MyRP); X MyRP.BitMap = &GS->BM; X ClipBlit(&MyRP, 0L, 0L, GS->window->RPort, X 2L, (LONG)GS->VProp.TopEdge, w, h, 0xC0L); X} X XVOID SyncGS(GS) Xstruct GfxSnap *GS; X{ X ULONG w = GS->window->Width - 18; X ULONG h = GS->window->Height - GS->VProp.TopEdge - 9; X ULONG vpos, hpos; X LONG temp; X X temp = GS->width - w; X if (temp <= 0) { X hpos = 0; X } else { X hpos = temp * (LONG)GS->HInfo.HorizPot / MAXBODY; X if (hpos > temp) { X hpos = temp; X } X } X temp = GS->height - h; X if (temp <= 0) { X vpos = 0; X } else { X vpos = temp * (LONG)GS->VInfo.VertPot / MAXBODY; X if (vpos > temp) { X vpos = temp; X } X } X InitRastPort(&MyRP); X MyRP.BitMap = &GS->BM; X ClipBlit(&MyRP, hpos, vpos, GS->window->RPort, X 2L, (LONG)GS->VProp.TopEdge, w, h, 0xC0L); X} X XSHORT OpenCW() X{ X WORD temp; X X FixHeights(); X X NewCW.Height = TitleBarHeight + ContentsFontHeight * 2 + 12; X ControlWindow = opensharedwindow(&NewCW); X if (!ControlWindow) { X return 0; X } X SaveGad.TopEdge = NameGad.TopEdge = TitleBarHeight + 2; X SaveGad.Height = NameGad.Height = TranspGad.Height = ContentsFontHeight+2; X TranspGad.TopEdge = SaveGad.TopEdge + SaveGad.Height + 3; X X SaveGad.LeftEdge = 4L; X SaveGad.Width = TextLength(ControlWindow->RPort, "Save", 4L) + 1; X if (Sharedrefs == 1) { /* No snap window, just control window? */ X SaveGad.Flags |= GADGDISABLED; X } else { X SaveGad.Flags &= ~GADGDISABLED; X } X X NameGad.LeftEdge = SaveGad.LeftEdge + X TextLength(ControlWindow->RPort, "Save as ", 8L); X temp = ControlWindow->Width - 4 - NameGad.LeftEdge; X NameGad.Width = X temp - (temp % TextLength(ControlWindow->RPort, " ", 1L)) + 1; X X TranspGad.LeftEdge = SaveGad.LeftEdge + X TextLength(ControlWindow->RPort, "Transparent color ", 18L); X TranspGad.Width = TextLength(ControlWindow->RPort, "0000", 4L); X X SetUpBorder(&Border1, &SaveGad); X SetUpBorder(&Border2, &NameGad); X SetUpBorder(&Border3, &TranspGad); X X ++TranspGad.LeftEdge; X ++TranspGad.TopEdge; X X if (ArpBase) { X NameGad.Flags = GADGHCOMP; X NameGad.Activation = RELVERIFY; X NameGad.GadgetType = BOOLGADGET; X NameGad.SpecialInfo = NULL; X } else { X NameGad.Flags = SELECTED; X NameGad.Activation = NULL; X NameGad.GadgetType = STRGADGET; X NameGad.SpecialInfo = (APTR)&NameSI; X ++NameGad.LeftEdge; /* Adjust string gadget position */ X ++NameGad.TopEdge; /* Adjust string gadget position */ X } X X strcpy(SaveName, "Snap.pic"); X strcpy(TranspBuf, "0"); X TranspSI.LongInt = 0L; X X SetAPen(ControlWindow->RPort, 1L); X SetBPen(ControlWindow->RPort, 0L); X SetDrMd(ControlWindow->RPort, JAM2); X Move(ControlWindow->RPort, X 5L, (LONG)SaveGad.TopEdge + 1 + ControlWindow->RPort->Font->tf_Baseline); X Text(ControlWindow->RPort, "Save as", 7L); X Move(ControlWindow->RPort, X 5L, (LONG)TranspGad.TopEdge + ControlWindow->RPort->Font->tf_Baseline); X Text(ControlWindow->RPort, "Transparent color", 17L); X DrawBorder(ControlWindow->RPort, &Border1, 0L, 0L); X AddGList(ControlWindow, &SaveGad, -1L, 3L, NULL); X RefreshGList(&SaveGad, ControlWindow, NULL, 3L); X if (ArpBase) { X GadText(&NameGad, SaveName, 8L); X } else { X ActivateGadget(&NameGad, ControlWindow, NULL); X } X return 1; X} END_OF_FILE if test 10836 -ne `wc -c <'source/windows.c'`; then echo shar: \"'source/windows.c'\" unpacked with wrong size! fi # end of 'source/windows.c' fi if test -f 'startsnap.rexx' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'startsnap.rexx'\" else echo shar: Extracting \"'startsnap.rexx'\" \(13368 characters\) sed "s/^X//" >'startsnap.rexx' <<'END_OF_FILE' X/* Arexx script to help people with Snap arguments */ X Xsignal on error X Xif ~show('l', "rexxarplib.library") then do X check = addlib('rexxsupport.library',0,-30,0) X check = addlib('rexxmathlib.library',0,-30,0) X check = addlib('rexxarplib.library',0,-30,0) Xend X Xif ~exists("fonts:helvetica/15") then do X say "Actually I need font 'Helvetica 15', but I'll try anyway." Xend X Xbool.0 = 'OFF'; bool.1 = 'ON' X X/* Fix window dimensions */ X Xscreen.width = ScreenCols() Xscreen.height = ScreenRows() X Xwindow.width = 530 Xwindow.height = 200 Xwindow.leftedge = (screen.width-window.width)/2 Xwindow.topedge = (screen.height-window.height)/2 X X/* Set up a host */ Xparse version 'V' vers . Xsignal on syntax Xcall stop(SNAPHOST) Xsyntax: Xif vers > 1.06 then X address AREXX "'call CreateHost(SNAPHOST, SNAPPORT)'" Xelse X "runwsh >nil:" "'call CreateHost(SNAPHOST, SNAPPORT)'" X X/* X* Wait for a while until host is ready. X*/ Xdo for 50 while ~show('Ports','SNAPHOST') X call delay 10 /* 200 ms */ Xend X Xcall SetReqColor(SNAPHOST, BLOCKPEN, 1) Xcall SetReqColor(SNAPHOST, DETAILPEN, 0) X X/* X* Open the window X*/ Xwindow.idcmp = 'CLOSEWINDOW+GADGETUP+RAWKEY' Xwindow.flags = 'WINDOWCLOSE+WINDOWDRAG+WINDOWDEPTH+ACTIVATE' X Xtitle = "Setup tool for Snap" X Xcall OpenWindow(SNAPHOST, window.leftedge, window.topedge, window.width, , X window.height, window.idcmp, window.flags, title) X Xcall ModifyHost(SNAPHOST, RAWKEY, "RAWKEY %c") X Xif exists("fonts:Helvetica/15") then do X call SetFont(SNAPHOST, "Helvetica.font", 15) Xend X Xsignal dotext X/* --- Start of texts --- X" Please hold on..." 5 20 60 "" X"Priority:" 5 40 6 "Input handler priority." X"Insert key:" 215 60 9 "Key used with Left Amiga to insert." X"Window key:" 215 80 9 "Key used with Left Amiga to open control window." X"Char delay:" 215 100 9 "Delay after each inserted character" X"Line delay:" 215 120 9 "Delay after each inserted newline." X"Bit mask:" 215 140 9 "Bit planes to draw selection frame into." X"Starting unit:" 215 160 9 "Unit in which to start snapping." X"Prepend:" 5 180 6 "Characters added in front of each line in modified inserts." X"Append:" 215 180 6 "Characters added at the end of each line in modified inserts." X"Selection frame pattern:" 345 40 19 "Pattern used for crawling dots in selection frame." X"Text qualifier:" 5 60 11 "Qualifier used when snapping characters." X"Gfx qualifier:" 110 60 11 "Qualifier used when snapping graphics." XEOT X--- End of texts --- */ X Xdotext: Xtextlines = sigl+1 X Xcall SetReqColor(SNAPHOST, 'BOXPEN', 0) Xcall SetReqColor(SNAPHOST, 'SHADOWPEN', 0) Xcall SetAPen(SNAPHOST, 1) Xdo i=1 while sourceline(textlines+i) ~= "EOT" X parse value sourceline(textlines+i) with '"'text'"' x y w . '"'help'"' X call AddGadget(SNAPHOST, x, y, 'HLP'i, copies(' ',w), "HELP "help) Xend X Xcall SetReqColor(SNAPHOST, 'BOXPEN', 2) Xcall SetReqColor(SNAPHOST, 'SHADOWPEN', 3) Xdo i=1 while sourceline(textlines+i) ~= "EOT" X parse value sourceline(textlines+i) with '"'text'"' x y w . '"'help'"' X call Move(SNAPHOST, x, y+10); call Text(SNAPHOST, text) Xend X X/* Set up some nice gadgets */ Xx = 65 Xdo i=51 for 5 X call AddGadget(SNAPHOST, x, 40, 'PR'i, ''i'', 'PRIORITY 'i); x = x+27 Xend X Xinscode.1 = 23; inscode.2 = 15; inscode.3 = 34 Xinskey.1 = 'I'; inskey.2 = 'Y'; inskey.3 = 'V' Xx = 300 Xdo i=1 for 3 X call AddGadget(SNAPHOST, x, 60, 'INS'i, inskey.i, 'INSKEY 'i); x = x+20 Xend X Xcwcode.1 = 17; cwcode.2 = 51; cwcode.3 = 24 Xcwkey.1 = 'W'; cwkey.2 = 'C'; cwkey.3 = 'O' Xx = 300 Xdo i=1 for 3 X call AddGadget(SNAPHOST, x, 80, 'CW'i, cwkey.i, 'CWKEY 'i); x = x+20 Xend X Xx = 300 Xdo i=0 for 3 X call AddGadget(SNAPHOST, x, 100, 'CDL'i, i, 'CDELAY 'i); x = x+20 Xend X Xx = 300 Xdo i=0 for 3 X call AddGadget(SNAPHOST, x, 120, 'LDL'i, i, 'LDELAY 'i); x = x+20 Xend X Xx = 300 Xdo i=0 for 3 X call AddGadget(SNAPHOST, x, 140, 'MSK'i, i, 'MASK 'i); x = x+20 Xend X Xcall AddGadget(SNAPHOST, 300, 160, 'UNT'0, "Frame", 'UNIT 0') Xcall AddGadget(SNAPHOST, 350, 160, 'UNT'1, "Char ", 'UNIT 1') X Xcall AddGadget(SNAPHOST, 365, 60, 'XERX', 'Immediate insert', 'XEROX') Xcall AddGadget(SNAPHOST, 365, 80, 'JOIN', 'Join long lines ', 'JOIN') Xcall AddGadget(SNAPHOST, 365, 100, 'PTCH', 'Early patch ', 'PATCH') Xcall AddGadget(SNAPHOST, 365, 120, 'USCR', 'True underscore ', 'UNDERSCORE') X Xcall AddGadget(SNAPHOST, 70, 180, 'PREP', "> ", 'PREP %g', 128) Xcall AddGadget(SNAPHOST, 280, 180, 'APP', "", 'APP %g', 128) X Xcall SetReqColor(SNAPHOST, 'SHADOWPEN', 0L) Xy = 18 Xdo i=0 for 16 X call AddGadget(SNAPHOST, 510, y, 'PAT'i, ' ', 'PATTERN 'i); y = y+11 Xend Xcall SetReqColor(SNAPHOST, 'SHADOWPEN', 3L) X Xbit.1 = 0; desc.1 = 'Left Shift ' Xbit.2 = 1; desc.2 = 'Right Shift' Xbit.3 = 3; desc.3 = 'Control ' Xbit.4 = 4; desc.4 = 'Left Alt ' Xbit.5 = 5; desc.5 = 'Right Alt ' Xbit.6 = 6; desc.6 = 'Left Amiga ' Xbit.7 = 7; desc.7 = 'Right Amiga' X Xy = 75 Xdo i=1 for 7 X call AddGadget(SNAPHOST, 5, y, 'TQ'i, desc.i, 'TEXTQUAL 'i) X call AddGadget(SNAPHOST, 110, y, 'GQ'i, desc.i, 'GFXQUAL 'i) X y = y+15 Xend X Xcall AddGadget(SNAPHOST, 430, 172, 'APPLY', ' Apply\settings', 'APPLY') X X/* Open our host port */ Xcall openport(SNAPPORT) X Xstart: X Xcall ShowText(" Setting defaults...") Xpri = 51; call SetGadget(SNAPHOST, 'PR51', 'ON') Xtextqual = '0040'x; call SetGadget(SNAPHOST, 'TQ6', 'ON') Xgfxqual = '0080'x; call SetGadget(SNAPHOST, 'GQ7', 'ON') Xinskey = 1; call SetGadget(SNAPHOST, 'INS1', 'ON') Xcwkey = 1; call SetGadget(SNAPHOST, 'CW1', 'ON') Xcdelay = 0; call SetGadget(SNAPHOST, 'CDL0', 'ON') Xldelay = 0; call SetGadget(SNAPHOST, 'LDL0', 'ON') Xpattern = '7777'x; Xdo i=0 for 16 X if bittst(pattern,i) then call SetGadget(SNAPHOST, 'PAT'i, 'ON') Xend Xunit = 0; call SetGadget(SNAPHOST, 'UNT0', 'ON') Xxerox = 0 Xpatch = 0 Xjoin = 0 Xunderscore = 1; call SetGadget(SNAPHOST, 'USCR', 'ON') Xplanes = '00'x X Xcall ShowText(" Select options. Click here for help.") X Xhelp.1 = "Click text (eg 'Priority') for help. Click here for more help." Xhelp.2 = "Close window for correct command line. Click for more." Xhelp.3 = "Click 'Apply settings' to reconfigure Snap." Xmaxhelp = 3 X Xkeycmd. = "" Xkeycmd.95 = "HELP"; keycmd.25 = "PRIORITY"; keycmd.16 = "CLOSEWINDOW" Xkeycmd.23 = "INSKEY"; keycmd.51 = "CDELAY"; keycmd.40 = "LDELAY" Xkeycmd.33 = "UNIT"; keycmd.32 = "APPLY" X Xmain: Xquitflag = 0 Xhelpnum = 1 X Xloop: Xif quitflag~=0 then signal done X Xcall waitpkt(SNAPPORT) Xp = getpkt(SNAPPORT) Xif p == NULL() then signal loop X Xcmd = getarg(p) Xcall reply(p, 0) X Xdocmd: Xparse var cmd item val . Xsignal value item X Xclosewindow: X quitflag = 1 X signal loop X Xrawkey: X cmd = keycmd.val X if cmd ~= "" then do X signal docmd X end X signal loop X Xhelp: X parse var cmd item help X if help="" then do X call showtext(help.helpnum) X helpnum = helpnum+1 X if helpnum>maxhelp then helpnum = 1 X end X else do X call showtext(help) X end X signal loop X Xpriority: X if val="" then do X val = pri+1 X if val>55 then val = 51 X end X pri = val X do i=51 for 5 X call setgadget(SNAPHOST, 'PR'i, 'OFF') X end X call setgadget(SNAPHOST, 'PR'pri, 'ON') X signal loop X Xinskey: X if val="" then do X val = inskey+1 X if val>3 then val = 1 X end X inskey = val X do i=1 for 3 X call setgadget(SNAPHOST, 'INS'i, 'OFF') X end X call setgadget(SNAPHOST, 'INS'val, 'ON') X signal loop X Xcwkey: X if val="" then do X val = cwkey+1 X if val>3 then val = 1 X end X cwkey = val X do i=1 for 3 X call setgadget(SNAPHOST, 'CW'i, 'OFF') X end X call setgadget(SNAPHOST, 'CW'val, 'ON') X signal loop X Xcdelay: X if val="" then do X val = cdelay+1 X if val>2 then val = 0 X end X cdelay = val X do i=0 for 3 X call setgadget(SNAPHOST, 'CDL'i, 'OFF') X end X call setgadget(SNAPHOST, 'CDL'val, 'ON') X signal loop X Xldelay: X if val="" then do X val = ldelay+1 X if val>2 then val = 0 X end X ldelay = val X do i=0 for 3 X call setgadget(SNAPHOST, 'LDL'i, 'OFF') X end X call setgadget(SNAPHOST, 'LDL'val, 'ON') X signal loop X Xunit: X if val="" then do X val = 1-unit X end X unit = val X call setgadget(SNAPHOST, 'UNT0', 'OFF') X call setgadget(SNAPHOST, 'UNT1', 'OFF') X call setgadget(SNAPHOST, 'UNT'unit, 'ON') X signal loop X Xpattern: X pattern = bitchg(pattern,val) X temp = bittst(pattern,val) X call setgadget(SNAPHOST, 'PAT'val, bool.temp) X signal loop X Xmask: X planes = bitchg(planes,val) X temp = bittst(planes,val) X call setgadget(SNAPHOST, 'MSK'val, bool.temp) X signal loop X Xprep: X parse var cmd . ' ' prepend X signal loop X Xapp: X parse var cmd . ' ' append X signal loop X Xtextqual: X if bittst(textqual,bit.val) then do X textqual = bitclr(textqual,bit.val) X call setgadget(SNAPHOST, 'TQ'val, 'OFF') X end X else do X call setgadget(SNAPHOST, 'GQ'val, 'OFF') X gfxqual = bitclr(gfxqual,bit.val) X textqual = bitset(textqual,bit.val) X call setgadget(SNAPHOST, 'TQ'val, 'ON') X end X signal loop X Xgfxqual: X if bittst(gfxqual,bit.val) then do X gfxqual = bitclr(gfxqual,bit.val) X call setgadget(SNAPHOST, 'GQ'val, 'OFF') X end X else do X call setgadget(SNAPHOST, 'TQ'val, 'OFF') X textqual = bitclr(textqual,bit.val) X gfxqual = bitset(gfxqual,bit.val) X call setgadget(SNAPHOST, 'GQ'val, 'ON') X end X signal loop X Xxerox: X xerox = 1-xerox X call setgadget(SNAPHOST, 'XERX', bool.xerox) X signal loop X Xjoin: X join = 1-join X call setgadget(SNAPHOST, 'JOIN', bool.join) X signal loop X Xpatch: X patch = 1-patch X call setgadget(SNAPHOST, 'PTCH', bool.patch) X signal loop X Xunderscore: X underscore = 1-underscore X call setgadget(SNAPHOST, 'USCR', bool.underscore) X signal loop X Xapply: X quitflag = 2 X signal loop X X Xdone: Xcall ReadGadget(SNAPHOST, 'PREP') Xcall waitpkt(SNAPPORT) Xgetprep: Xp = getpkt(SNAPPORT) Xif p == NULL() then signal getprep X Xcmd = getarg(p) Xcall reply(p, 0) Xparse var cmd . ' ' prepend X Xcall ReadGadget(SNAPHOST, 'APP') Xcall waitpkt(SNAPPORT) Xgetapp: Xp = getpkt(SNAPPORT) Xif p == NULL() then signal getapp X Xcmd = getarg(p) Xcall reply(p, 0) Xparse var cmd . ' ' append X Xif c2d(textqual)=0 then do X call ShowText("No text qualifier specified!") X signal main Xend Xelse if c2d(gfxqual)=0 then do X call ShowText("No graphics qualifier specified!") X signal main Xend X Xunixargs = "" Xamigaargs = "" Xif pri~=51 then do X unixargs = unixargs "-p"pri X amigaargs = amigaargs "priority" pri Xend Xif textqual~='0040'x then do X unixargs = unixargs "-t"c2x(textqual) X amigaargs = amigaargs "textqual" c2x(textqual) Xend Xif gfxqual~='0080'x then do X unixargs = unixargs "-g"c2x(gfxqual) X amigaargs = amigaargs "gfxqual" c2x(gfxqual) Xend Xif inskey.inskey~='I' then do X unixargs = unixargs "-i"inscode.inskey X amigaargs = amigaargs "insertkey" inscode.inskey Xend Xif cwkey.cwkey~='W' then do X unixargs = unixargs "-w"cwcode.cwkey X amigaargs = amigaargs "cwkey" cwcode.cwkey Xend Xif prepend~="> " then do X unixargs = unixargs "-P" '"'||prepend||'"' X amigaargs = amigaargs "prepend" '"'||prepend||'"' Xend Xif append~="" then do X unixargs = unixargs "-A" '"'append'"' X amigaargs = amigaargs "append" '"'append'"' Xend Xif cdelay~=0 then do X unixargs = unixargs "-c"cdelay X amigaargs = amigaargs "chardelay" cdelay Xend Xif ldelay~=0 then do X unixargs = unixargs "-l"ldelay X amigaargs = amigaargs "linedelay" ldelay Xend Xif pattern~='7777'x then do X unixargs = unixargs "-a"c2x(pattern) X amigaargs = amigaargs "crawlptrn" c2x(pattern) Xend Xif xerox then do X unixargs = unixargs "-x" X amigaargs = amigaargs "XEROX" Xend Xif patch then do X unixargs = unixargs "-e" X amigaargs = amigaargs "EARLYPATCH" Xend Xif underscore then do X unixargs = unixargs "-r" X amigaargs = amigaargs "TRUEUNDERSCORE" Xend Xif join then do X unixargs = unixargs "-j" X amigaargs = amigaargs "JOINLONG" Xend Xif unit~=0 then do X unixargs = unixargs "-u"unit X amigaargs = amigaargs "startunit" unit Xend Xif planes~='00'x then do X unixargs = unixargs "-b"c2x(planes) X amigaargs = amigaargs "planemask" c2x(planes) Xend X Xsnapcmd = "snap" X Xif quitflag=1 then do X say snapcmd || unixargs X if amigaargs ~= unixargs then do X say "or" X say snapcmd || amigaargs X end Xend Xelse do X if ~exists("snap") & ~exists("c:snap") then do X snapcmd = GetFile(50, 50, "sys:", "", "Find Snap for me") X if word(statef(snapcmd),1) ~= 'FILE' then do X snapcmd = snapcmd'snap' X end X end X if exists(snapcmd) then do X address command snapcmd unixargs X end X else do X call ShowText("Snap not found.") X signal main X end Xend X Xerror: Xcall Stop(SNAPHOST) Xexit X Xshowtext: procedure expose SNAPHOST X Xparse arg text X Xcall SetAPen(SNAPHOST, 0) Xcall RectFill(SNAPHOST, 5, 15, 490, 35) Xcall SetAPen(SNAPHOST, 1) Xcall Move(SNAPHOST, 5, 30) Xcall Text(SNAPHOST, text) Xreturn END_OF_FILE if test 13368 -ne `wc -c <'startsnap.rexx'`; then echo shar: \"'startsnap.rexx'\" unpacked with wrong size! fi # end of 'startsnap.rexx' fi echo shar: End of archive 2 \(of 4\). cp /dev/null ark2isdone MISSING="" for I in 1 2 3 4 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 4 archives. rm -f ark[1-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0 -- Mail submissions (sources or binaries) to <amiga@cs.odu.edu>. Mail comments to the moderator at <amiga-request@cs.odu.edu>. Post requests for sources, and general dicussion to comp.sys.amiga.