home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frozen Fish 1: Amiga
/
FrozenFish-Apr94.iso
/
bbs
/
alib
/
d9xx
/
d935
/
clipwindow.lha
/
ClipWindow
/
ClipWindow.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-12-20
|
12KB
|
372 lines
char cc1[] = "\0$VER: ClipWindow 1.0 August 22, 1993";
char cc2[] = "Jim Harvey, 18538 Inkster, Redford Mich, 48240";
/* An AppWindow that stuffs the clipboard from Project Icons.
Text can be stored in either a text file associated with
the Project icon, or directly in the icon ToolTypes. A
Project icon with the word RESET as the default tool will
flush the clipboard.
Requires the CBIO.C and CB.H ClipBoard IO library files from
the ROM Kernal Reference Manual - Devices chapter 3. These
are available on Fish Disk 741 in the RKRM_Devices archive.
Makefile for Manx 5.0D (with debug) is:
ClipWindow: ClipWindow.o Cbio.o
ln -g ClipWindow Cbio -lc
ClipWindow.o: ClipWindow.c
cc -wl -pl -bs ClipWindow.c
Cbio.o: Cbio.c
cc -wn -pl -bs Cbio.c
Revisions: 1.0 initial release August 22, 1993
*/
#define BUFFSIZE 8192L /* maxsize of clipboard */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <functions.h>
#include <exec/types.h> /* Need this for the Amiga variable types */
#include <workbench/workbench.h>/* This has DiskObject and AppWindow */
#include <workbench/startup.h> /* This has WBStartup and WBArg structs */
#include <exec/libraries.h> /* Need this to check library versions */
#include <stdio.h>
#include <clib/intuition_protos.h>
#include <clib/exec_protos.h>
#include <clib/wb_protos.h>
/* includes for clipboard */
#include "exec/ports.h"
#include "exec/io.h"
#include "exec/memory.h"
#include "devices/clipboard.h"
#include "cb.h"
#include <clib/exec_protos.h>
#include <clib/alib_protos.h>
struct IntuitionBase *IntuitionBase;
struct WorkbenchBase *WorkbenchBase;
struct IconBase *IconBase;
struct MsgPort *myport;
struct AppWindow *appwin;
struct IntuiMessage *imsg;
struct AppMessage *appmsg;
struct WBArg *wbargs;
char *conname = "CON:200/30/500/100/ Clip Window /CLOSE";
FILE *conwin = NULL; /* will be handle for the above window */
struct Screen *tstscr; /* dummy for finding ptr to window */
struct Window *homewindow; /* pointer to AppWindow opened */
struct MsgPort *myport = NULL; /* message port for AppWindow */
struct DiskObject *dobject;
char **tooltypes = NULL;
ULONG id = 1, userdata = 0;
/* function prototypes */
void cleanexit (char *, LONG);
void openup ();
void cleanup (void);
void message (char *);
BOOL getToolTypes (struct WBArg *, char **);
LONG olddir = -1; /* will remember if we changed directory */
extern int Enable_Abort; /* MANX C Reference abort enable */
void
main (int argc, char **argv)
{
ULONG winsig, appwinsig, signals; /* Wait() signals */
BOOL done = FALSE;
int x, i; /* gen purpose counters */
char tempname[33]; /* holds a filename */
char tempstring[] = "\n"; /* holds a dummy line to clipboard */
struct IOClipReq *ior = NULL; /* IO request for clipboard use */
struct cbbuf *bigbuf = NULL; /* holds contents of retrieved clipboard */
char *newstuff = NULL; /* holds contents of dropped icon tooltypes */
char *stuffend = NULL; /* point to position of next avail space in newstuff */
char *deftool = NULL; /* Default icon Tool */
FILE *textfile; /* for text file associated with Project icon */
int inchar, laschar; /* for reading associated text file */
Enable_Abort = 0; /* turn off CTRL-C */
openup (); /* gets things started */
InitializeClip: /* target for a RESET */
/* initalize clipboard zero by writing a short string */
/* note: must write at least one byte */
if ((ior = CBOpen (0l)) == NULL)
cleanexit ("Can't open ClipBoard\n", RETURN_FAIL);
if ((CBWriteFTXT (ior, tempstring)) == FALSE)
cleanexit ("Can't write to ClipBoard\n", RETURN_FAIL);
CBClose (ior);
fprintf (conwin, " Drag Project icons here, tooltypes\n");
fprintf (conwin, " will be appended to ClipBoard\n");
winsig = 1L << homewindow->UserPort->mp_SigBit; /* for close gadget */
appwinsig = 1L << myport->mp_SigBit; /* for AppWindow */
while (!done) {
signals = Wait (winsig | appwinsig); /* Wait for IDCMP and AppMessages */
if (signals & winsig) { /** Got an IDCMP message **/
while (imsg = (struct IntuiMessage *) GetMsg (homewindow->UserPort)) {
if (imsg->Class = CLOSEWINDOW) /* check for close button */
done = TRUE;
ReplyMsg ((struct Message *) imsg); /* spit it back */
}
}
if (signals & appwinsig) { /** Got an AppMessage **/
if ((stuffend = newstuff =
AllocMem (BUFFSIZE, MEMF_PUBLIC | MEMF_CLEAR)) == NULL)
cleanexit ("Can't allocate memory for buffer\n", RETURN_FAIL);
/* read entire clipboard into struct cbbuf buffer */
if ((ior = CBOpen (0l)) == NULL)
cleanexit ("Can't open ClipBoard\n", RETURN_FAIL);
if (CBQueryFTXT (ior)) { /* Look for FTXT */
bigbuf = CBReadCHRS (ior); /* Obtain a copy of the contents */
CBReadDone (ior); /* must read to EOF */
CBClose (ior);
}
else {
CBClose (ior);
cleanexit ("ClipBoard is Empty!\n", RETURN_FAIL);
}
/* copy the contents to temp buffer */
strcpy (newstuff, (char *) bigbuf->mem);
/* if first time, point stuffend to 1st data byte, */
/*if > first point to byte following the string */
x = strlen (newstuff);
stuffend += (x > 1) ? x : x - 1;
/* read through all messages (may be more than one if a multiple select) */
while (appmsg = (struct AppMessage *) GetMsg (myport)) {
/* get information for this icon */
for (x = 0, wbargs = appmsg->am_ArgList;
x < appmsg->am_NumArgs;
x++, wbargs++) {
if (!(*wbargs->wa_Name)) {
message (" Sorry, must be a Project Icon!\n");
break;
}
strcpy (tempname, wbargs->wa_Name); /* copy name of icon */
/* CD to directory of this icon */
olddir = -1; /* will remember if CD was necessary */
if ((wbargs->wa_Lock) && (*wbargs->wa_Name))
olddir = CurrentDir (wbargs->wa_Lock); /* remember old directory */
if (getToolTypes (wbargs, &deftool)) { /* now parse tooltypes */
if (dobject->do_Type != WBPROJECT) {
message (" Sorry, must be a Project Icon!\n");
break; /* proceed to process next icon */
}
/* see if user wants to flush clipboard */
if (!strcmp (deftool, "RESET") || !strcmp (deftool, "reset")) {
fprintf (conwin,
"\f %c3;7m%s%c0m\n", 0x9b, "* Resetting Clipboard *", 0x9b);
FreeDiskObject (dobject); /* Free the diskobject we got */
/* Clear away any messages that arrived at the last moment */
while (appmsg = (struct AppMessage *) GetMsg (myport))
ReplyMsg ((struct Message *) appmsg); /* spit it back */
while (imsg = (struct IntuiMessage *) GetMsg (homewindow->UserPort))
ReplyMsg ((struct Message *) imsg); /* spit it back */
if (bigbuf)
CBFreeBuf (bigbuf); /* discard clip read buffer */
if (newstuff)
FreeMem (newstuff, BUFFSIZE); /* discard clip write buffer */
goto InitializeClip; /* start over */
}
/* now check for a text file associated with the Project icon */
if ((textfile = fopen (tempname, "r")) != NULL) {
laschar = 0;
fprintf (conwin, "%c1;7m%s:%c0m", 0x9b, tempname, 0x9b);
/* associated textfile was found, append contents to temp buffer */
while ((inchar = fgetc (textfile)) != EOF) {
*stuffend++ = (char) inchar;
if (laschar == 0x0a)
fprintf (conwin, "%c1;7m%s:%c0m", 0x9b, tempname, 0x9b);
fputc (inchar, conwin); /* echo */
laschar = inchar; /* remember last real character */
}
if (laschar != 0x0a) {
*stuffend++ = '\n'; /* ensure last line has line feed */
fputc (0x0a, conwin); /* echo */
}
fclose (textfile);
}
/* no associated text file found, get info from tooltypes */
else {
for (i = 0; tooltypes[i]; i++) { /* exit on NULL tooltype */
fprintf (conwin, "%c1m%s:%c0m%s\n", 0x9b, tempname, 0x9b, tooltypes[i]);
strcpy (stuffend, tooltypes[i]); /* append tooltype to buffer */
stuffend += strlen (tooltypes[i]); /* pos to end string */
*stuffend++ = '\n'; /* append a line feed */
if ((int) (stuffend - newstuff) >= BUFFSIZE) /* check memory */
cleanexit ("Buffer Memory Overflow\n", RETURN_FAIL);
}
}
}
FreeDiskObject (dobject); /* Free the diskobject we got */
if (olddir != -1)
CurrentDir (olddir);/* cd back home if necessary */
}
ReplyMsg ((struct Message *) appmsg); /* spit message back */
}
/** write entire appended buffer to clipboard **/
if ((ior = CBOpen (0l)) == NULL)
cleanexit ("Can't open ClipBoard\n", RETURN_FAIL);
if (!CBWriteFTXT (ior, newstuff))
cleanexit ("ClipBoard rewrite error!\n", RETURN_FAIL);
/* Free buffer allocated by CBReadCHRS() */
if (bigbuf)
CBFreeBuf (bigbuf);
/* Free buffer used for incoming tooltypes */
if (newstuff)
FreeMem (newstuff, BUFFSIZE);
}
} /* done */
/* Clear away any messages that arrived at the last moment */
while (appmsg = (struct AppMessage *) GetMsg (myport))
ReplyMsg ((struct Message *) appmsg);
cleanup ();
}
void
openup ()
{
if ((IntuitionBase = (struct IntuitionBase *)
OpenLibrary ((STRPTR) "intuition.library", 0l)) == NULL)
cleanexit ("Can't open Intuition\n", RETURN_FAIL);
if ((WorkbenchBase = (struct WorkbenchBase *)
OpenLibrary ((STRPTR) "workbench.library", 37)) == NULL)
cleanexit ("Can't open Workbench.library\n", RETURN_FAIL);
if ((IconBase = (struct IconBase *)
OpenLibrary ((STRPTR) "icon.library", 37)) == NULL)
cleanexit ("Can't open Icon.library\n", RETURN_FAIL);
if ((conwin = fopen (conname, "r+")) == NULL)
cleanexit ("Can't open output window\n", RETURN_FAIL);
if ((tstscr = /* get copy of wkbnch screen */
AllocMem (sizeof (struct Screen), MEMF_FAST)) == NULL)
cleanexit ("Memory too low for screen\n", RETURN_FAIL);
if ((GetScreenData
(tstscr, sizeof (struct Screen), (ULONG) WBENCHSCREEN, NULL)) == FALSE)
cleanexit ("Can't get WorkBench screen data\n", RETURN_FAIL);
homewindow = tstscr->FirstWindow;
if (strcmp ((char *) homewindow->Title, " Clip Window ") != 0)
cleanexit ("Wrong Window found\n", RETURN_FAIL);
/* this creates a message port automatically */
ModifyIDCMP (homewindow, IDCMP_CLOSEWINDOW);
/* The CreateMsgPort() function is in Exec version 37 and later only */
if ((myport = CreateMsgPort ()) == NULL)
cleanexit ("Can't get Message Port\n", RETURN_FAIL);
if ((appwin = AddAppWindowA (id, userdata, homewindow, myport, NULL)) == NULL)
cleanexit ("Appwindow atachment failed\n", RETURN_FAIL);
}
void
cleanexit (char *s, LONG n)
{
if (*s)
message (s);
Delay (100l);
cleanup ();
exit (n);
}
void
cleanup ()
{
if (olddir != -1)
CurrentDir (olddir); /* cd back home */
if (myport)
DeleteMsgPort (myport);
if (conwin)
RemoveAppWindow (appwin);
if (conwin)
fclose (conwin);
if (tstscr)
FreeMem (tstscr, sizeof (struct Screen));
if (IconBase)
CloseLibrary ((struct Library *) IconBase);
if (WorkbenchBase)
CloseLibrary ((struct Library *) WorkbenchBase);
if (IntuitionBase)
CloseLibrary ((struct Library *) IntuitionBase);
}
void
message (char *s)
{
if (conwin)
fprintf (conwin, s, strlen (s));
else
printf (s, strlen (s));
}
/* Extract all ToolTypes */
BOOL
getToolTypes (struct WBArg *wbarg, char **defaulttool)
{
BOOL success = FALSE;
dobject = GetDiskObject ((UBYTE *) (wbarg->wa_Name));
if ((*wbarg->wa_Name) && dobject) {
tooltypes = (char **) dobject->do_ToolTypes;
*defaulttool = dobject->do_DefaultTool;
success = TRUE;
}
else if (!(*wbarg->wa_Name))
fprintf (conwin, " Must be a disk or drawer icon\n");
else
fprintf (conwin, " Can't find any DiskObject (icon) for this WBArg\n");
return (success);
}