[comp.sys.amiga] Finding pointer to CLI Window structure

slc@hoptoad.UUCP (04/01/87)

Am I overlooking something obvious? After searching though my various
manuals, I can't figure this out:

If I start a program from a CLI (for example, in my startup-sequence)
how can I tell what window the CLI is running in? I can't seem to
find any way to do it other than to open a new window, and backtrack
along the linked list, which seems inelegant.

phillip@cbmvax.UUCP (04/01/87)

in article <1949@hoptoad.uucp>, slc@hoptoad.uucp (Steve Costa) says:
> 
> Am I overlooking something obvious? After searching though my various
> manuals, I can't figure this out:
> 
> If I start a program from a CLI (for example, in my startup-sequence)
> how can I tell what window the CLI is running in? I can't seem to

I thought this was already posted (by Carolyn), but in light of the 
questions what follows is a re-post of ConPackets.c.
==============================================================================
  Phillip Lindsay - Commodore Business Machines - Amiga Technical Support
  UUCP: {ihnp4|seismo|caip}!cbmvax!phillip      - Phone: (215) 431-9180
  No warranty is implied or otherwise given in the form of suggestion or 
  example. Any opinions found here are of my making. 

-------------------------------------cut here
/* ConPackets.c -  C. Scheppner, A. Finkel, P. Lindsay  CBM
 *   DOS packet example
 *   Requires 1.2
 */

#include "exec/types.h"
#include "exec/memory.h"
#include "libraries/dos.h"
#include "libraries/dosextens.h"
#include "devices/conunit.h"

#define ACTION_SCREEN_MODE  994L
#define DOSTRUE  -1L
#define DOSFALSE  0L

/* Used for checking version */
ULONG DosBase;

/* Globals initialized by findWindow() */
struct Window  *conWindow;
struct ConUnit *conUnit;

main()
   {
   LONG  infile;
   WORD  curX, curY;

   if(!(DosBase=(OpenLibrary("dos.library",33))))
      cleanexit("\nVersion 1.2 required\n");

   if((infile = Input()) <= 0)
      cleanexit("\nNo stdin ... Did you RUN this ???\n");

   if (! findWindow()) cleanexit("\nNot enough free memory\n");

   printf("\033[0 p\014");  /* Turn off cursor, home and clear */
   printf("Window = $%lx   ConUnit = $%lx\n\n",conWindow, conUnit);
   printf("CURSOR LIMITS:  XMax = %ld   YMax = %ld\n",
              conUnit->cu_XMax + 1, conUnit->cu_YMax + 1);
   curX = conUnit->cu_XCCP;
   curY = conUnit->cu_YCCP;
   printf("*<--- here cursor was at position %ld,%ld\n",curX,curY);

   /* Move to first position of last line and clear to EOL */
   clearLast();
   printf("ABSOLUTE CURSOR POSITIONING...");
   Delay(100);
   clearLast();
   setRawCon(DOSTRUE);
   printf("RAW MODE: Press ANY key...");
   printf(" Hex value = %02lx",(UBYTE)getchar());
   /* Maybe they pressed a string key - if so, get rest */
   while(WaitForChar(infile,100L)) printf(" %02lx",(UBYTE)getchar());

   setRawCon(DOSFALSE);
   printf("\nShort demo --- That's it\n");
   cleanup();
   }


clearLast()
   {
   printf("\033[%ld;%0H\033[M", conUnit->cu_YMax + 1);
   }


cleanexit(s)
char *s;
   {
   if(*s)    printf(s);    /* Print error */
   cleanup();
   exit(0);
   }

cleanup()
   {
   setRawCon(DOSFALSE);
   printf("\033[1 p\n"); /* Turn cursor on */
   if(DosBase) CloseLibrary(DosBase);
   }



/* sendpkt code - A. Finkel, P. Lindsay, C. Scheppner  CBM */

LONG setRawCon(toggle)
LONG toggle;     /* DOSTRUE (-1L)  or  DOSFALSE (0L) */
   {
   struct MsgPort *conid;
   struct Process *me;
   LONG myargs[8] ,nargs, res1;

   me = (struct Process *) FindTask(NULL);
   conid = (struct MsgPort *) me->pr_ConsoleTask;

   myargs[0]=toggle;
   nargs = 1;
   res1 = (LONG)sendpkt(conid,ACTION_SCREEN_MODE,myargs,nargs);
   return(res1);
   }


LONG findWindow() /* inits conWindow and conUnit (global vars) */
   {
   struct InfoData *id;
   struct MsgPort  *conid;
   struct Process  *me;
   LONG myargs[8] ,nargs, res1;

   /* Alloc to insure longword alignment */
   id = (struct InfoData *)AllocMem(sizeof(struct InfoData),
                                       MEMF_PUBLIC|MEMF_CLEAR);
   if(! id) return(0);
   me = (struct Process *) FindTask(NULL);
   conid = (struct MsgPort *) me->pr_ConsoleTask;

   myargs[0]=((ULONG)id) >> 2;
   nargs = 1;
   res1 = (LONG)sendpkt(conid,ACTION_DISK_INFO,myargs,nargs);
   conWindow = (struct Window *)id->id_VolumeNode;
   conUnit = (struct ConUnit *)
                 ((struct IOStdReq *)id->id_InUse)->io_Unit;
   FreeMem(id,sizeof(struct InfoData));
   return(res1);
   }


LONG sendpkt(pid,action,args,nargs)
struct MsgPort *pid;  /* process indentifier ... (handlers message port ) */
LONG action,          /* packet type ... (what you want handler to do )   */
     args[],          /* a pointer to a argument list */
     nargs;           /* number of arguments in list  */
   {
   struct MsgPort        *replyport;
   struct StandardPacket *packet;
 
   LONG  count, *pargs, res1;

   replyport = (struct MsgPort *) CreatePort(NULL,0);
   if(!replyport) return(NULL);

   packet = (struct StandardPacket *) 
      AllocMem((long)sizeof(struct StandardPacket),MEMF_PUBLIC|MEMF_CLEAR);
   if(!packet) 
      {
      DeletePort(replyport);
      return(NULL);
      }

   packet->sp_Msg.mn_Node.ln_Name = (char *)&(packet->sp_Pkt);
   packet->sp_Pkt.dp_Link         = &(packet->sp_Msg);
   packet->sp_Pkt.dp_Port         = replyport;
   packet->sp_Pkt.dp_Type         = action;

   /* copy the args into the packet */
   pargs = &(packet->sp_Pkt.dp_Arg1);       /* address of first argument */
   for(count=0;count < nargs;count++) 
      pargs[count]=args[count];
 
   PutMsg(pid,packet); /* send packet */

   WaitPort(replyport);
   GetMsg(replyport); 

   res1 = packet->sp_Pkt.dp_Res1;

   FreeMem(packet,(long)sizeof(struct StandardPacket));
   DeletePort(replyport); 

   return(res1);
   }


/* eof */