🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: comp.sys.amiga.tech
Article #8979

Re: RAW: windows

#8979
From: Carolyn Scheppner CATS
Date: Thu, 26 May 1988 23:11
197 lines
6212 bytes
In article <1162@pur-phy> ng@newton.physics.purdue.edu.UUCP (Nicholas J. Giordano) writes:
>
>I am working on a program which opens a raw: window for input and
>output.  Even though I make it a certain size when I open it, it is possible
>for the user to change the size later.  How can my program determine the
>actual size? 

Check out the ConUnit stuff in this example.  The ConUnit structure
is defined in devices/conunit.h and contains all kinds of useful
information including the current and maximum X and Y character positions 
for your window.  When the user resizes the window, the maximums change.

This example shows how to make DOS tell you the window pointer and the
console IORequest pointer (and ConUnit) of your AmigaDOS window.


/* 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);
   }




-- 
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Carolyn Scheppner -- CATS   >>Commodore Amiga Technical Support<<
                     UUCP  ...{allegra,ihnp4,rutgers}!cbmvax!carolyn 
                     PHONE 215-431-9180
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Technical Details
Message-ID: <3881@cbmvax.UUCP>
Path: arc1-ca.pugleaf.net!utzoo!utgpu!water!watmath!clyde!att!ihnp4!cbmvax!carolyn
References: <5997@well.UUCP> <1162@pur-phy>

Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!utzoo!utgpu!water!watmath!clyde!att!ihnp4!cbmvax!carolyn
From: carolyn@cbmvax.UUCP (Carolyn Scheppner CATS)
Newsgroups: comp.sys.amiga.tech
Subject: Re: RAW: windows
Keywords: RAW: window size
Message-ID: <3881@cbmvax.UUCP>
Date: 26 May 88 23:11:12 GMT
References: <5997@well.UUCP> <1162@pur-phy>
Reply-To: carolyn@cbmvax.UUCP (Carolyn Scheppner CATS)
Organization: Commodore Technology, West Chester, PA
Lines: 197