/* vdutype.c
 *
 * (C) 1990 Graham Toal and Pieter Schoenmakers
 * Written by Tiggr, 11 July 1990.
 */

#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "wimp.h"
#include "sprite.h"
#include "kernel.h"
#include "template.h"
#include "resspr.h"
#include "res.h"
#include "menu.h"

#define ABS(X)    ((X) >= 0 ? (X) : -(X))
#define SGN(X)    ((X) > 0 ? 1 : (X) < 0 ? -1 : 0)

wimp_t pid;
wimp_i iconbar_icon;
wimp_w proginfo;
os_error *err;
menu iconbar_menu;
void do_a_poll (void);
int monitor_type;
int type_to_mode[3] = {12, 20, 23};
char menu_buffer[3][12];
menu type_menu[3];

char *copyright="!VduType version 0.01\nCopyright 1990 Graham Toal and Pieter Schoenmakers\n";

int
fatal (const char *fmt, ...)
{
  va_list ap;
  static struct
   {
     int dummy;
     char msg[2048];
   } msg;

  va_start (ap, fmt);
  vsprintf (msg.msg, fmt, ap);
  va_end (ap);

  wimp_reporterror ((os_error *) &msg, wimp_EHICANCEL, "VduType");
  exit (1);
}



/* This function is called at exit.  */

void
cleanup (void)
{
  wimp_taskclose (pid);
}


/**********
   Initialise the lot.  */

void
initialise (void)
{
  char fname[1024];   /* YECH! */
  wimp_icreate ic;
  int i;

  if (wimp_taskinit ("VduType", &pid))
    fatal ("Can't task/init\n");

  res_init ("VduType");
  resspr_init ();
  res_findname ("Templates", fname);
  template_init ();
  template_readfile (fname);

  /* prefetch the aboutbox window.  */

  err = wimp_create_wind (template_syshandle ("progInfo"), &proginfo);
  if (err)
    fatal ("Can't get about box: %s\n", err->errmess);

  ic.w = -1;
  ic.i.box.x0 = 0;
  ic.i.box.y0 = 0;
  ic.i.box.x1 = 68;
  ic.i.box.y1 = 68;
  ic.i.flags = wimp_ISPRITE | wimp_INDIRECT | (3 << 12);
  ic.i.data.indirectsprite.name = "!VduType";
  ic.i.data.indirectsprite.spritearea = resspr_area ();
  ic.i.data.indirectsprite.nameisname = 5;
  err = wimp_create_icon (&ic, &iconbar_icon);
  if (err)
    fatal ("Can't create iconbar icon: %s\n", err->errmess);

  iconbar_menu = menu_new ("VduType", ">Info|0,1,2|Quit");
  for (i = 0; i < 3; i++)
    {
      type_menu[i] = menu_new ("", "42424242");
      menu_make_writeable (type_menu[i], 1, &menu_buffer[i][0], 12, "a0-9");
      menu_submenu (iconbar_menu, 2 + i, type_menu[i]);
    }

  strcpy (&menu_buffer[0][0], "12");
  strcpy (&menu_buffer[1][0], "20");
  strcpy (&menu_buffer[2][0], "23");

  atexit (cleanup);
} /* initialise */


int
main (void)
{
  initialise ();

  for (;;)
    do_a_poll ();

  exit (0);        /* Calls cleanup ().  */
  return (0);      /* To keep stupid compiler happy.  */
} /* main */


void
do_a_poll (void)
{
  wimp_eventstr b;
  int i, event;

  do
    {
      err = wimp_poll (0, &b);
      event = b.e;

      if (err)
        fatal ("wimp_poll: %s\n", err->errmess);

      switch (event)
        {
        case wimp_EREDRAW:
          _kernel_oswrch (7);
          break;

        case wimp_EOPEN:
          wimp_open_wind (&b.data.o);
          break;

        case wimp_ECLOSE:
          wimp_close_wind (b.data.o.w);
          break;

        case wimp_EBUT:
          if (b.data.but.m.bbits != wimp_BMID || b.data.but.m.w != -2 || b.data.but.m.i != iconbar_icon)
            break;

          monitor_type = (_kernel_osbyte (0xa1, 133, 0) >> 10) & 3;
          sprintf (&menu_buffer[monitor_type][0], "%d", (_kernel_osbyte (135, 0, 0) >> 8) & 0xff);

          for (i = 0; i < 3; i++)
            menu_setflags (iconbar_menu, i + 2, monitor_type == i, 0);

          wimp_create_menu (menu_syshandle (iconbar_menu), b.data.but.m.x - 64, 96 + 6 * 45);
          break;

        case wimp_EMENU:
          switch (b.data.menu[0])
            {
            case 1:
            case 2:
            case 3:
              i = b.data.menu[0] - 1;
              _kernel_osbyte (0xa2, 133, ((_kernel_osbyte (0xa1, 133, 0) >> 8) & ~0xc) | (i << 2));
              monitor_type = (_kernel_osbyte (0xa1, 133, 0) >> 10) & 3;

              type_to_mode[monitor_type] = atoi (&menu_buffer[monitor_type][0]);

              err = wimp_setmode (type_to_mode[monitor_type]);
              if (err)
                wimp_reporterror (err, 0, "VduType");

              break;

            case 4:
              exit (0);
            default:
              break;
            }

        case wimp_ESEND:
        case wimp_ESENDWANTACK:
          switch (b.data.msg.hdr.action)
            {
            case wimp_MCLOSEDOWN:
              exit (0);
              break;

            case wimp_MMENUWARN:
              if (b.data.msg.data.words[3] == 0)
                {
                  err = wimp_create_submenu ((wimp_menustr *) proginfo, b.data.msg.data.words[1], b.data.msg.data.words[2]);
                  if (err)
                    fatal ("Can't create submenu: %s\n", err->errmess);
                }
              break;

            default:
              break;
            }
          break;

        default:
          break;
        }
    }
  while (event);
} /* do_a_poll */
