[comp.sys.amiga.programmer] Console handling

robinson@elux1.cs.umass.edu (Richard Robinson) (05/07/91)

To attach a console file to a window you have open (you must be using
ConMan, I don't know which version), use this code fragment:


/*----------------------------------------------------------------------*/

FILE *fp;
struct Window *w;
char buffer[20];


w = OpenWindow(whatever);
sprintf(buffer,"CON:W%x",w);
fp = fopen(buffer,"w+");

/*----------------------------------------------------------------------*/

I don't know of any way to do this with standard AmigaDOS (well, maybe with
2.0, but I don't have 2.0, so).


A second question was how to turn a console window into RAW mode, like
more does, use this code

/*----------------------------------------------------------------------*/

/*
 * code to switch a terminal to and from RAW / CON mode.
 * use and abuse as desired
 *
 * -Dread
 */

#include <exec/types.h>
#include <exec/memory.h>
#include <libraries/dosextens.h>
#include <string.h>
#include <stdio.h>
#include <proto/exec.h>
#include <proto/dos.h>


static LONG send_packet(struct MsgPort *where,LONG what,LONG args[],
			LONG num_args,LONG result[2])
{
	struct MsgPort *reply_port;
	struct StandardPacket *packet;
	LONG index,*array;


	result[0] = result[1] = 0;

	reply_port = CreatePort(NULL,0);
	if( !reply_port ) return 0;

	packet = AllocMem(sizeof(struct StandardPacket),MEMF_PUBLIC|MEMF_CLEAR);
	if( !packet )
	{
		DeletePort(reply_port);
		return 0;
	}
	packet->sp_Msg.mn_Node.ln_Name = (char *)&(packet->sp_Pkt);
	packet->sp_Pkt.dp_Link = &(packet->sp_Msg);
	packet->sp_Pkt.dp_Port = reply_port;
	packet->sp_Pkt.dp_Type = what;

	array = &(packet->sp_Pkt.dp_Arg1);
	for( index=0;index<num_args;index++ )
		array[index] = args[index];

	PutMsg(where,(struct Message *)packet);
	WaitPort(reply_port);
	GetMsg(reply_port);

	result[0] = packet->sp_Pkt.dp_Result1;

	result[1] = packet->sp_Pkt.dp_Res1;
/* I think that should be res2 - I will check, but since the following
    code doesn't use it, who cares? */

	FreeMem(packet,sizeof(struct StandardPacket));
	DeletePort(reply_port);

	return result[0];
}

/* ok, here is the function to call */

LONG set_screen_mode(BPTR fp,int flag)
{
	LONG args[1];
	LONG res[2];
	struct FileHandle *fh;


	fh = (struct FileHandle *)(fp<<2);
	args[0] = flag;
	return send_packet(fh->fh_Type,ACTION_SCREEN_MODE,args,1,res);
}

/* I HOPE this code is correct - I just retyped it in, and might of made
   some typing errors. I also renamed the variables to be more clear.
   If you have problems (I doubt it though), I will fix it */


/*
 * ok, now to set the current console to RAW mode, do this
 */

set_screen_mode(Output(),-1);

/* to set it back to con mode - do this before you exit */
set_screen_mode(Output(),0);


Hope that helps

-Dread
--
robinson@elux1.cs.umass.edu