home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 5 / DATAFILE_PDCD5.iso / utilities / o / orbits / !orbits / c / RunImage < prev   
Text File  |  1991-11-24  |  7KB  |  263 lines

  1. /*
  2.  * Module:        RunImage.c
  3.  * Creation:      28th July, 1991.
  4.  * Last modified: 12th November, 1991.
  5.  *
  6.  * (c) Copyright Neil Hoggarth, 1991.
  7.  *
  8.  * This text file is ANSI C source code.
  9.  *
  10.  *  This program is free software; you can redistribute it and/or modify
  11.  *  it under the terms of the GNU General Public License as published by
  12.  *  the Free Software Foundation; either version 1, or (at your option)
  13.  *  any later version.
  14.  *
  15.  *  This program is distributed in the hope that it will be useful,
  16.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  *  GNU General Public License for more details.
  19.  *
  20.  *  You should have received a copy of the GNU General Public License
  21.  *  along with this program; if not, write to the Free Software
  22.  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  23.  *
  24.  * This program compiles to 'RunImage', which is a multitasking interface
  25.  * to the 'orbits' many body orbital mechanics simulation. This program is
  26.  * written for computers running the RISC OS operating system.
  27.  *
  28.  * All external functions which are not part of the standard ANSI library
  29.  * come from the RISC OS interface library "RISC_OSlib.o" which should be
  30.  * linked in when the program is compiled.
  31.  *
  32.  */
  33.  
  34. #include <stdio.h>
  35. #include <stdlib.h>
  36. #include <math.h>
  37.  
  38. #include "baricon.h"  /* Icon bar stuff from RISC_OSlib */
  39. #include "dbox.h"     /* Dialogue box stuff from RISC_OSlib */
  40. #include "event.h"    /* WIMP events from RISC_OSlib */
  41. #include "flex.h"     /* RISC_OSlib malloc thingy. Needed for txt */
  42. #include "menu.h"     /* Menu handling from RISC_OSlib */
  43. #include "res.h"      /* Resources from you know where */
  44. #include "resspr.h"   /* Something to do with sprites I think */
  45. #include "template.h" /* Template routines from RISC_OSlib */
  46. #include "txt.h"      /* Text windows */
  47. #include "vhidelay.h" /* Hourglass functions from RISC_OSlib */
  48. #include "werr.h"     /* RISC_OSlib WIMP error box */
  49. #include "win.h"      /* WIMP stuff from RISC_OSlib */
  50. #include "wimpt.h"    /*            ditto           */
  51. #include "xferrecv.h" /* File handling by icon drags from RISC_OSlib */
  52.  
  53. /*
  54.  * A suggestion to Acorn for the next compiler release. The above is
  55.  * ridiculous! Why can't we just have a "riscos.h" header and be done
  56.  * with it? It would save me some typing anyway.
  57.  */
  58.  
  59. #define STRNG_LEN 81
  60.  
  61. enum ICON_MENU_ITEMS {IM_INFO=1,IM_INTRO,IM_LICENSE,IM_TRAIL,IM_INPUT,IM_QUIT};
  62.  
  63. typedef struct {
  64.                  win_event_handler *handler;
  65.                  void *handle;
  66.                } event_t;
  67.  
  68. static int finished=FALSE;
  69. static int trail=FALSE;
  70. static txt t;
  71.  
  72. /*************************** Function Definitions ***********************/
  73.  
  74. static void read_handler(wimp_eventstr *e, void *handle)
  75. /*
  76.  * This function is the event handler for the text window. Actually most
  77.  * event handling is done by a handler in the library. This just
  78.  * pre-processes the event to catch a few things not provided in the main
  79.  * handler.
  80.  */
  81.  {
  82.   event_t *next;
  83.  
  84.   next=handle;
  85.  
  86.   if (e->e==wimp_ECLOSE)
  87.     wimpt_noerr(wimp_close_wind(e->data.o.w));
  88.   else if (e->e==wimp_ESCROLL)
  89.     txt_movevertical(t,-e->data.scroll.y,1);
  90.   else
  91.     (*(next->handler))(e,next->handle);
  92.   return;
  93. }
  94.  
  95. static void read_open(char *file,char *title)
  96. /*
  97.  * This function opens a text window which displays the contents of file
  98.  * 'file' with the text pointed to by 'title' on the title bar.
  99.  */
  100. {
  101.   static event_t Handler;
  102.   static int     active=FALSE;
  103.   FILE          *stream;
  104.   char           strng[STRNG_LEN];
  105.   int            nchar;
  106.  
  107.   if (active)
  108.     txt_dispose(&t);
  109.  
  110.   t=txt_new(title);
  111.   txt_show(t);
  112.  
  113.   stream=fopen(file,"r");
  114.   if (stream==NULL)
  115.     werr(FALSE,"Can't find the file\n'%s'\n",file);
  116.  
  117.   while(!feof(stream))
  118.   {
  119.     nchar=fread(strng,sizeof(char),STRNG_LEN-1,stream);
  120.     strng[nchar]=NULL;
  121.     txt_insertstring(t,strng);
  122.     txt_movedot(t,STRNG_LEN);
  123.   }
  124.  
  125.   fclose(stream);
  126.   txt_setdot(t,0);
  127.  
  128.   win_read_eventhandler(txt_syshandle(t),Handler.handler,&(Handler.handle));
  129.   win_register_event_handler(txt_syshandle(t),read_handler,&Handler);
  130.  
  131.   active=TRUE;
  132.  
  133.   return;
  134. }
  135.  
  136. static menu MenuMaker(void *handle)
  137. /*
  138.  * Builds the icon bar menu.
  139.  */
  140. {
  141.   menu temp;
  142.  
  143.   handle=handle; /* Supresses a compiler warning. */
  144.  
  145.   if (trail)
  146.     temp=menu_new("Orbits",">Info,Intro,License,!Trail,Input,Quit");
  147.   else
  148.     temp=menu_new("Orbits",">Info,Intro,License,Trail,Input,Quit");
  149.  
  150.   return(temp);
  151. }
  152.  
  153. static void MenuProc(void *handle, char *hit)
  154. /*
  155.  * Handles choices from the icon bar menu.
  156.  */
  157. {
  158.   dbox i;
  159.   char cmd[100];
  160.  
  161.   handle=handle; /* Supresses a compiler warning */
  162.  
  163.   switch(hit[0])
  164.   {
  165.     case IM_INFO:
  166.       i=dbox_new("progInfo");
  167.       dbox_showstatic(i);
  168.       dbox_fillin(i);
  169.       dbox_dispose(&i);
  170.       break;
  171.     case IM_INTRO:
  172.       vhsdelay_begin();
  173.       read_open("<orbits$dir>.Doc","Introduction to Orbits");
  174.       vhsdelay_end();
  175.       break;
  176.     case IM_LICENSE:
  177.       vhsdelay_begin();
  178.       read_open("<orbits$dir>.Copying","License Agreement");
  179.       vhidelay_end();
  180.       break;
  181.     case IM_TRAIL:
  182.       trail=!trail;
  183.       break;
  184.     case IM_INPUT:
  185.       sprintf(cmd,"Filer_OpenDir %s.input",getenv("orbits$dir"));
  186.       wimp_starttask(cmd);
  187.       break;
  188.     case IM_QUIT:
  189.       finished=TRUE;
  190.       break;
  191.   }
  192.   return;
  193. }
  194.  
  195. static void EventHandler(wimp_eventstr *e,void *handle)
  196. /*
  197.  * This is the event handler for the sprite on the icon bar.
  198.  */
  199. {
  200.   char *filename;
  201.   char cmd[100];
  202.  
  203.   handle=handle; /* This line prevents a compiler warning. */
  204.    
  205.   switch (e->e)
  206.   {
  207.     case wimp_EREDRAW:
  208.       (void)wimpt_checkmode();
  209.       break;
  210.     case wimp_ESEND:
  211.     case wimp_ESENDWANTACK:
  212.       if ( e->data.msg.hdr.action==wimp_MDATALOAD )
  213.       {
  214.         (void)xferrecv_checkinsert(&filename);
  215.         sprintf(cmd,"<orbits$dir>.orbits %s %s",trail?"-t":"",filename);
  216.         wimp_starttask(cmd);
  217.         xferrecv_insertfileok();
  218.       }
  219.       break;
  220.  
  221.     default:
  222.       /*
  223.        * It's not an event that we wish to respond to,
  224.        * therefore we ignore it.
  225.        */
  226.       break;
  227.   }
  228. }
  229.  
  230. static void Init(void)
  231. /*
  232.  * Declare the program as a WIMP task and initialise all the RISC_OSlib
  233.  * stuff.
  234.  */
  235. {
  236.   wimpt_init("orbits");
  237.   res_init("orbits");
  238.   resspr_init();
  239.   template_init();
  240.   dbox_init();
  241.   vhsdelay_init();
  242.   flex_init();
  243.   txt_init();
  244.  
  245.   return;
  246. }
  247. /****************************** Main Program ****************************/
  248.  
  249. int main(void)
  250. {
  251.   Init();
  252.  
  253.   baricon("!orbits", (int)resspr_area(), 0);
  254.   win_register_event_handler(win_ICONBAR, EventHandler, 0);
  255.   event_attachmenumaker(win_ICONBAR, MenuMaker, MenuProc, 0);
  256.   win_claim_unknown_events(win_ICONBAR);
  257.  
  258.   event_setmask(wimp_EMPTRENTER | wimp_EMPTRLEAVE | wimp_EKEY);
  259.  
  260.   while(!finished)
  261.     event_process();
  262. }
  263.