home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The CDPD Public Domain Collection for CDTV 3
/
CDPDIII.bin
/
pd
/
utilities
/
dirutils
/
visualshell
/
src
/
main_segment.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-10-28
|
9KB
|
262 lines
/*********************************
* *
* Visual Shell v1.17 10/92 *
* *
* by Torsten Jürgeleit *
* *
* segment main part *
* *
*********************************/
/* Includes */
#include "includes.h"
#include "imports.h"
#include "protos.h"
/* Structures */
struct StartupMsg {
struct Message sm_Message;
struct Process *sm_CLIProcess;
struct Window *sm_ConWindow;
struct Device *sm_ConDevice;
struct ConUnit *sm_ConUnit;
BYTE *sm_LeftPath; /* path for left file requester */
BYTE *sm_RightPath; /* path for right file requester */
USHORT sm_Flags; /* used for HIDE flag */
};
/* Main - waits for startup msg and installs input event handler */
VOID
_main(VOID)
{
struct MsgPort *mp;
struct StartupMsg *sm;
BYTE *path;
/* Wait for startup msg */
main_task = FindTask(NULL);
mp = &((struct Process *)main_task)->pr_MsgPort;
WaitPort(mp);
if (sm = (struct StartupMsg *)GetMsg(mp)) {
/* Get data from startup msg and return it */
_parent_proc = sm->sm_CLIProcess;
save_cli = BTOC(_parent_proc->pr_CLI);
con_input_fhandle = BTOC(_parent_proc->pr_CIS);
con_output_fhandle = BTOC(_parent_proc->pr_COS);
con_window = sm->sm_ConWindow;
con_rport = con_window->RPort;
con_device = sm->sm_ConDevice;
con_unit = sm->sm_ConUnit;
show_flag = (sm->sm_Flags == 1 ? 0 : 1);
/* Copy given path names to allocated buffer */
if (!(path = sm->sm_LeftPath)) {
dir_arg[0] = NULL;
} else {
if (dir_arg[0] = AllocMem((LONG)(strlen(path) + 1), (LONG)
MEMF_PUBLIC)) {
strcpy(dir_arg[0], path);
}
}
if (!(path = sm->sm_RightPath)) {
dir_arg[1] = NULL;
} else {
if (dir_arg[1] = AllocMem((LONG)(strlen(path) + 1), (LONG)
MEMF_PUBLIC)) {
strcpy(dir_arg[1], path);
}
}
/* Send startup message back to VSh */
ReplyMsg(&sm->sm_Message);
/* Alloc respources */
if (ArpBase = OpenLibrary(ArpName, ArpVersion)) {
/* Use libraries arp.library has already opened for us */
GfxBase = (struct GfxBase *)ArpBase->GfxBase;
IntuitionBase = (struct IntuitionBase *)ArpBase->IntuiBase;
/* Check if started from WShell */
SPrintf(&line1_buffer[0], "WSH_%ld", _parent_proc->pr_TaskNum);
wshell_flag = (FindPort(&line1_buffer[0]) ? 1 : 0);
/* Build process name */
SPrintf(&process_name[0], PROCESS_NAME, _parent_proc->pr_TaskNum);
/* Install input event handler */
if (vsh_port = CreatePort(&process_name[0], 0L)) {
if (input_req = CreateStdIO(vsh_port)) {
if (!OpenDevice("input.device", 0L, (struct IORequest *)
input_req, 0L)) {
/* Init interrupt struct */
interrupt.is_Node.ln_Name = &process_name[0];
interrupt.is_Node.ln_Pri = 51; /* above Intuition */
interrupt.is_Code = (VOID (*)())
&input_event_handler;
#asm
move.l a4,_interrupt+14 ; use our data segment ptr as data for interrupt
#endasm
/* Init IOStdReq */
input_req->io_Command = IND_ADDHANDLER;
input_req->io_Data = (APTR)&interrupt;
input_req->io_Length = sizeof(struct Interrupt);
if (DoIO((struct IORequest *)input_req)) {
Printf("Can't install input event handler !\n");
} else {
if (nil_handle = (BPTR)Open(nil, (LONG)MODE_NEWFILE)) {
if (con_handle = (BPTR)Open(star, (LONG)
MODE_NEWFILE)) {
alloc_buffers();
Close(con_handle);
}
Close(nil_handle);
}
input_req->io_Command = IND_REMHANDLER;
DoIO((struct IORequest *)input_req);
}
CloseDevice((struct IORequest *)input_req);
}
DeleteStdIO(input_req);
}
DeletePort(vsh_port);
}
CloseLibrary(ArpBase);
}
/* Free path name buffer */
if (path = dir_arg[0]) {
FreeMem(path, (LONG)(strlen(path) + 1));
}
if (path = dir_arg[1]) {
FreeMem(path, (LONG)(strlen(path) + 1));
}
}
}
/* Allocate and initialize buffers */
VOID
alloc_buffers(VOID)
{
struct Screen *wb_screen = con_window->WScreen;
struct TextFont *text_font;
USHORT i;
BYTE *data_buffer, *ptr;
/* Get current workbench dimension */
wb_width = wb_screen->Width;
wb_height = wb_screen->Height;
wb_line_len = wb_width / 8;
/* Need even line len for BltTemplate() -> EVEN source modulo!!! */
if (wb_line_len & 1) {
wb_line_len++;
}
/* Initialize max values in config entry array */
config_entry[CONFIG_ENTRY_LEFT_EDGE].ce_MaxValue = wb_width -
MIN_VSH_WIDTH;
config_entry[CONFIG_ENTRY_TOP_EDGE].ce_MaxValue = wb_width -
MIN_VSH_HEIGHT;
config_entry[CONFIG_ENTRY_WIDTH].ce_MaxValue = wb_width;
config_entry[CONFIG_ENTRY_HEIGHT].ce_MaxValue = wb_height;
config_entry[CONFIG_ENTRY_CLI_LINES].ce_MaxValue = (wb_height -
MIN_VSH_HEIGHT) / 8 + DEFAULT_CLI_LINES;
if (data_buffer = AllocMem((LONG)((MAX_EDITOR_NAME_LEN + 1) +
(MAX_EDITOR_OPTS_LEN + 1) + MAX_FKEYS * ((MAX_USER_FUNCTION_LEN +
1) + (MAX_FKEY_LEN + 1))), MEMF_PUBLIC | MEMF_CLEAR)) {
if (fib = (struct FileInfoBlock *)AllocMem((LONG)
sizeof(struct FileInfoBlock), MEMF_PUBLIC | MEMF_CLEAR)) {
if (idata = (struct InfoData *)AllocMem((LONG)
sizeof(struct InfoData), MEMF_PUBLIC | MEMF_CLEAR)) {
if (template_buffer = (UBYTE *)AllocMem((LONG)(wb_line_len * 8),
MEMF_PUBLIC | MEMF_CHIP)) {
if (font_data = (UBYTE *)AllocMem((LONG)(MAX_FONT_CHARS * 8),
MEMF_PUBLIC)) {
/* Clone console 8x8 font attr struct and open this font */
text_font = con_rport->Font;
con_font_attr.ta_Name = (STRPTR)
text_font->tf_Message.mn_Node.ln_Name;
con_font_attr.ta_YSize = text_font->tf_YSize;
con_font_attr.ta_Style = text_font->tf_Style;
con_font_attr.ta_Flags = text_font->tf_Flags;
if (con_font = OpenFont(&con_font_attr)) {
/*
Printf("font: name='%s' XSize=%d YSize=%d Style=%d Flags=%d\n",
con_font->tf_Message.mn_Node.ln_Name, con_font->tf_XSize, con_font->tf_YSize, con_font->tf_Style, con_font->tf_Flags);
Printf("BaseLine=%d Accessors=%d Modulo=%d LoChar=%d HiChar=%d\n",
con_font->tf_Baseline, con_font->tf_Accessors, con_font->tf_Modulo, con_font->tf_LoChar, con_font->tf_HiChar);
Printf("CharData=$%lx CharLoc=$%lx CharSpace=$%lx CharKern=$%lx Extension=$%lx\n",
con_font->tf_CharData, con_font->tf_CharLoc, con_font->tf_CharSpace, con_font->tf_CharKern, con_font->tf_Message.mn_ReplyPort);
Delay(400L);
*/
/* Init font data */
unpack_font(con_font, font_data);
CopyMem((BYTE *)&special_chars[0][0],
(BYTE *)font_data + 128 * 8,
(LONG)(MAX_SPECIAL_CHARS * 8));
/* Init string buffer ptrs */
vsh_editor_name = ptr = data_buffer;
vsh_editor_opts = ptr += MAX_EDITOR_NAME_LEN + 1;
/* Init user func fkey text and buffer ptrs */
for (i = 0, ptr += MAX_EDITOR_OPTS_LEN + 1;
i < MAX_FKEYS; i++,
ptr += MAX_USER_FUNCTION_LEN + 1) {
user_fkey_text[i] = ptr;
user_function[i] = ptr += MAX_FKEY_LEN + 1;
}
/* Save old window dimensions */
old_left = con_window->LeftEdge;
old_top = con_window->TopEdge;
old_width = con_window->Width;
old_height = con_window->Height;
old_min_width = con_window->MinWidth,
old_min_height = con_window->MinHeight,
old_max_width = con_window->MaxWidth,
old_max_height = con_window->MaxHeight,
old_flags = con_window->Flags;
old_idcmp_flags = con_window->IDCMPFlags;
old_bleft = con_window->BorderLeft;
old_btop = con_window->BorderTop;
old_bright = con_window->BorderRight;
old_bbottom = con_window->BorderBottom;
old_wb_font = wb_screen->RastPort.Font;
/* Turn on window border and refresh events (2nd used for Kick 2.0 simple refresh console windows !!!) */
con_window->Flags = old_flags & ~(BORDERLESS |
NOCAREREFRESH);
RefreshWindowFrame(con_window);
if (read_config_file() == FALSE) {
set_default_config();
}
prepare_con_window();
/* Get refresh and timing events from intuition */
ModifyIDCMP(con_window, (ULONG)REFRESHWINDOW | INTUITICKS);
start_vsh();
/* Restore old IDCMP flags */
ModifyIDCMP(con_window, old_idcmp_flags);
restore_con_window();
CloseFont(con_font);
}
FreeMem(font_data, (LONG)(MAX_FONT_CHARS * 8));
}
FreeMem(template_buffer, (LONG)(wb_line_len * 8));
}
FreeMem(idata, (LONG)sizeof(struct InfoData));
}
FreeMem(fib, (LONG)sizeof(struct FileInfoBlock));
}
FreeMem(data_buffer, (LONG)((MAX_EDITOR_NAME_LEN + 1) +
(MAX_EDITOR_OPTS_LEN + 1) + MAX_FKEYS * ((MAX_USER_FUNCTION_LEN +
1) + (MAX_FKEY_LEN + 1))));
}
}