

/******************************************************************************
 *
 * RCS ID
 * $Id: wimp,v 1.3 1999/11/07 15:11:54 david Exp $
 *
 * HISTORY
 * $Log: wimp,v $
 * Revision 1.3  1999/11/07 15:11:54  david
 * version:updated!
 * wimp:no longer used -> now using toolbox lib instead
 *
 * Revision 1.2  1999/06/20 13:46:34  david
 * Stuff to place baricon on left or right or not at all!
 *
 * Revision 1.1  1999/05/16 12:00:07  david
 * Initial revision
 *
 *
 *****************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>





#include "wimp.h"        /*  access to WIMP SWIs                      */
#include "wimpt.h"       /*  wimp task facilities                     */
#include "win.h"         /*  registering window handlers              */
#include "event.h"       /*  poll loops, etc                          */
#include "baricon.h"     /*  putting icon on icon bar                 */
#include "sprite.h"      /*  sprite operations                        */
#include "werr.h"        /*  error reporting                          */
#include "res.h"         /*  access to resources                      */
#include "resspr.h"      /*  sprite resources                         */
#include "flex.h"        /*  dynamic mem alloc from WIMP              */
#include "template.h"    /*  reading in template file                 */
#include "bbc.h"         /*  olde-style graphics routines             */
#include "colourtran.h"  /*  interface to colour translation module   */
#include "os.h"          /*  low-level RISCOS access                  */
#include "dbox.h"        /*  dialogue box handling                    */
#include "saveas.h"      /*  data export from dbox by icon dragging   */
#include "visdelay.h"    /*  show the hourglass for delay             */
#include "C:swis.h"
#include "coords.h"
#include "heap.h"  
#include "pointer.h"
#include "coords.h" 





/* --- Conversion macros --- */
/* These macros convert between sprite coords and work area coords */

#define smbserver_Xtowork(x)  ((x) << 1)
#define smbserver_Ytowork(y)  ((y) << 1) /*((y) << 2)*/

/* --- Sprite Constants --- */
#define SpriteFile   0x0ff9
#define SpriteWidth  1024
#define SpriteHeight 768
#define SpriteMode   0x301680b5 /*31*/
#define BytesPerPixel 4
#define SpriteSize   (4*SpriteWidth*SpriteHeight) +sizeof(sprite_header)+sizeof(sprite_area)

/* --- Circle Constants --- */
#define Radius  64
#define RadDiv2 Radius>>1
#define Step    Radius>>3

/* --- Menu Entry Constants --- */
#define iconmenu_MInfo     1
#define iconmenu_MQuit     2

#define ver_field 4

#define LEFT_BARICON  0
#define RIGHT_BARICON 1
#define NO_BARICON    2

FILE *debug_coords;

const int ButArray[]={0,1,2,3,4,5,6,7};

int bariconPos=LEFT_BARICON;

/*#define OS_ChangedBox 0x0000005a*/
typedef struct
        {
          int flag;
          wimp_box box;
        } change_box;

int displaywin_handle;

/* --- Program Globals --- */

#define MAX_MSG_LEN MAX_RECV

#define MALLOC(result, type, number) do \
   {                       \
      if (!((result) = (type *) malloc ((number) * sizeof (type))))   \
         exit (1);                               \
   } while (0)

#define FREE(x) (free(x))

#ifndef MAX
#define MAX(A,B) ((A) > (B) ? (A) : (B))
#endif

BOOL displaying;



void PLOT(int plot_code,int x, int y)
{                                    
    _kernel_swi_regs in,out;
 
    in.r[0]=plot_code;
    in.r[1]=x;
    in.r[2]=y; 
    _kernel_swi(OS_Plot,&in,&out);
}

static void smbserver_open_window(wimp_openstr *o)
{
  static int old_x, old_y;
  
  /* --- force scroll offsets to 0, since the window always --- */
  /* --- represents the whole display                       --- */
  o->x = 0;
  o->y = 0;

  wimp_open_wind(o);


}  

static void smbserver_info_aboutprog(void)
{
  dbox d;  
  extern char* date_string;
  extern char* time_string;
  extern char* ver_string;
  char ver_field_string[50];

  sprintf(ver_field_string,"%s %s %s",
          ver_string, time_string, date_string);

  /* --- display info about the program in a dialogue box --- */
    d = dbox_new("ProgInfo");

    /* Fill in the version number */
    dbox_setfield(d, ver_field, ver_field_string);

    dbox_show(d);

    dbox_fillin(d);

    dbox_dispose(&d);
}


static void smbserver_leftclickproc(wimp_i i)
{
  wimp_wstate state;
  wimp_redrawstr r;
  i=i;

  if(displaying == FALSE)
  {
   /* --- open the window we created --- */
      wimpt_noerr(wimp_get_wind_state(displaywin_handle, &state));
      state.o.behind = -1;  /* make sure it is opened in front */
      smbserver_open_window(&state.o);
      
   /* --- force a redraw of the whole window --- */
   /*   r.w = displaywin_handle;
      r.box.x0 = 0;
      r.box.x1 = balls64_Xtowork(SpriteWidth);
      r.box.y0 = -balls64_Ytowork(SpriteHeight);
      r.box.y1 = 0;          
      wimp_force_redraw(&r); */
      displaying = TRUE;
  }
}

static void smbserver_menuproc(void *handle, char *hit)
{
  handle = handle;
  /* --- see which menu entry has been chosen --- */
    switch(hit[0])
    {
      case iconmenu_MInfo:
        smbserver_info_aboutprog();
        break;

      case iconmenu_MQuit:
        closesockets();
        file_close_all();
        close_malloc();
        exit(0);
        break;

      default:    /* shouldn't get here */
        break;
    }
}




static void smbserver_redraw_window(wimp_w handle)
{
  BOOL  more;
  wimp_redrawstr r;
  wimp_winfo      winfo;
  wimp_icon       myicon; 
  wimp_wstate     state; 
  char            *yesicon="radioon";
  
  winfo.w = handle;
  wimp_get_wind_info(&winfo);

  wimp_get_wind_state(handle, &state);

  /* --- establish factors by which to scale sprite from current --- */
  /* --- window size     
                                        --- */
/*  xdivmult = winfo.info.ex.x1 - winfo.info.ex.x0;
  ydivmult = winfo.info.ex.y1 - winfo.info.ex.y0;
  xmagmult = winfo.info.box.x1 - winfo.info.box.x0;
  ymagmult = winfo.info.box.y1 - winfo.info.box.y0;
*/  
  /* --- do the redraw --- */ 

  myicon.box.x0 = 100;
  myicon.box.x1 = 300;
  myicon.box.y0 = -300;
  myicon.box.y1 = -100;
  myicon.flags = wimp_ISPRITE | wimp_BCLICKSEL | wimp_ISELECTED | wimp_INDIRECT |
                 wimp_IREDRAW | wimp_IBORDER;
  myicon.data.indirectsprite.name=yesicon;
  myicon.data.indirectsprite.spritearea=(void*)1;
  myicon.data.indirectsprite.nameisname=TRUE;

  r.w = handle;
  wimp_redraw_wind(&r, &more);


   
    while (more) 
    {
      _swix(0x110,0);  
          
      wimp_setcolour(5);

      wimp_ploticon(&myicon);

      PLOT (4,state.o.box.x0-state.o.x,state.o.box.y1-state.o.y);
      PLOT (5,state.o.box.x0-state.o.x+300, 
              state.o.box.y1-state.o.y-300);



      wimp_get_rectangle(&r, &more);
    }
   
}

/****************************** EVENT HANDLING *****************************/
     

static void smbserver_handler(wimp_eventstr *e, void *handle)
{

  handle = handle;

  switch (e->e)
  {
    case wimp_ENULL:

   /*   do_select();*/

      break;

    case wimp_EBUT:

      break;

    case wimp_EKEY:

       break;

    case wimp_EUSERDRAG:

      break;

    case wimp_EPTRLEAVE:

      break;

    case wimp_EPTRENTER:
 
      break;

    case wimp_EREDRAW:
      smbserver_redraw_window(e->data.o.w);
      break;

    case wimp_EOPEN:
      smbserver_open_window(&e->data.o);
      break;

    case wimp_ECLOSE:
      wimpt_noerr(wimp_close_wind(e->data.o.w));
      displaying=FALSE;
/*        closesockets();
        file_close_all();
        close_malloc();
        exit(0);
*/ 
      break;

    case wimp_ESEND:
    case wimp_ESENDWANTACK:     /* 
                                 * this code checks for mode/palette
                                 * broadcasts
                                 */
      switch(e->data.msg.hdr.action)
      {
        case wimp_MCLOSEDOWN:
          closesockets();
          file_close_all();
          close_malloc();
          exit(0); 
          break;

        case wimp_PALETTECHANGE:

          break;

        case wimp_MMODECHANGE:

          break;

        case wimp_MHELPREQUEST:

        
        default:
          break;
    }

    default:  /* we're not interested in any other events */
      break;
  }
}



   
/******************************* MENU HANDLING *****************************/

static menu smbserver_menumaker(void *handle)
{
  menu temp;
  int   displaying=0,frozen=0;

  handle = handle;


  /* --- create a menu for the icon on the icon bar --- */
    temp = menu_new("smbserver", ">Info,Quit");

  return temp;
}

                     

static void smbserver_create_displaywin(wimp_w *handle)
{
  wimp_wind *window;

  /* --- find template for our window and create a window from it --- */
    window = template_syshandle("MainWindow");
    wimp_create_wind(window, handle);
                                      
  displaying=FALSE;
}   

/******************************** INITIALISATION ***************************/     
int smbserver_initialise(void)
{
    int result=1;

    /* --- initialise wimp library modules --- */
    wimpt_init("smbserver");
    res_init("smbserver");
    resspr_init();
    flex_init();
    heap_init(TRUE);
    template_init();
    dbox_init();


    /* I'm sure there was an easier way to check this but I can't remember it! */
    if (taskCheck("smbserver")>0)
    {
        result=0;
        werr(0,"Only one copy of Samba can run at once.");
    }
    else
    {

        /* --- check which mode we are in --- */
        wimpt_checkmode();
 
        /* --- create a window for display --- */
        smbserver_create_displaywin(&displaywin_handle);

        /* --- attach an event handling function to window --- */
        win_register_event_handler(displaywin_handle, smbserver_handler, 0);

        /* --- make the window we just created get delivered null events --- */
        /* --- and also unknown events (ie. msgs for palette/mode change --- */
        win_claim_idle_events(displaywin_handle);
        win_claim_unknown_events(displaywin_handle);

        /* --- put our icon on the icon bar --- */
        if (bariconPos==LEFT_BARICON)
        {
            baricon_left("!smbserver", (int)resspr_area(), smbserver_leftclickproc);
        }
        else
        if (bariconPos==RIGHT_BARICON)
        {
            baricon("!smbserver", (int)resspr_area(), smbserver_leftclickproc);

        }
        else
        if (bariconPos==NO_BARICON)
        {
            baricon_left("noicon", (int)resspr_area(), smbserver_leftclickproc);           
        }   
   
        /* --- attach a menu to the icon on the icon bar --- */
        event_attachmenumaker(win_ICONBAR, smbserver_menumaker, smbserver_menuproc, 0);
        

        /* --- activate saving of floating point registers on poll --- */
        wimp_save_fp_state_on_poll(); 


        event_setmask(event_getmask() & ~wimp_EMNULL);
    }

    return result;
}
                   
void wimp_werr(int severity,char *msg)
{
  werr (severity,msg);
}

void wimp_process(void)
{
  event_process();
}

