home *** CD-ROM | disk | FTP | other *** search
/ Acorn User 2 / AUCD2.iso / program / vista.arc / !Vista / h / task < prev    next >
Text File  |  1996-01-27  |  12KB  |  354 lines

  1. // **************************************************************************
  2. //                     Copyright 1996 David Allison
  3. //
  4. //             VV    VV    IIIIII     SSSSS     TTTTTT       AA
  5. //             VV    VV      II      SS           TT       AA  AA
  6. //             VV    VV      II        SSSS       TT      AA    AA
  7. //              VV  VV       II           SS      TT      AAAAAAAA
  8. //                VV       IIIIII     SSSS        TT      AA    AA
  9. //
  10. //                    MULTI-THREADED C++ WIMP CLASS LIBRARY
  11. //                                for RISC OS
  12. // **************************************************************************
  13. //
  14. //             P U B L I C    D O M A I N    L I C E N C E
  15. //             -------------------------------------------
  16. //
  17. //     This library is copyright. You may not sell the library for
  18. //     profit, but you may sell products which use it providing
  19. //     those products are presented as executable code and are not
  20. //     libraries themselves.  The library is supplied without any
  21. //     warranty and the copyright owner cannot be held responsible for
  22. //     damage resulting from failure of any part of this library.
  23. //
  24. //          See the User Manual for details of the licence.
  25. //
  26. // *************************************************************************
  27.  
  28.  
  29. //
  30. // wimp task
  31. //
  32. #ifndef __task_h
  33. #define __task_h
  34.  
  35. #include "Vista:defs.h"
  36.  
  37. #include "Vista:delete.h"
  38.  
  39. #ifndef __thread_h
  40. #include "Vista:thread.h"
  41. #endif
  42.  
  43. #ifndef __msgtrans_h
  44. #include "Vista:msgtrans.h"
  45. #endif
  46.  
  47. #ifndef __template_h
  48. #include "Vista:template.h"
  49. #endif
  50.  
  51. #ifndef __window_h
  52. #include "Vista:window.h"
  53. #endif
  54.  
  55. #ifndef __channel_h
  56. #include "Vista:channel.h"
  57. #endif
  58.  
  59.  
  60.  
  61. #ifndef NULL
  62. #define NULL 0
  63. #endif
  64.  
  65. #ifndef TRUE
  66. #define TRUE 1
  67. #endif
  68.  
  69. #ifndef FALSE
  70. #define FALSE 0
  71. #endif
  72.  
  73. extern void print (char * ...) ;
  74.  
  75. class Task ;
  76.  
  77. class ControlThread : public Thread
  78.    {
  79.    public:
  80.       ControlThread (Task *, int event, int *buf) ;
  81.       ~ControlThread() ;
  82.       void run() ;
  83.       void init(int event, int *buf) ;
  84.       ControlThread *next ;
  85.    private:
  86.       Task *task ;
  87.       int buf[256/sizeof(int)] ;           // event buffer
  88.       int event ;
  89.    } ;
  90.  
  91.  
  92. class DebugWin : public Window
  93.    {
  94.    public:
  95.       DebugWin (Task *) ;
  96.       ~DebugWin() ;
  97.       void print (char *format...) ;
  98.    private:
  99.       TextObject *text ;
  100.       int min_height ;
  101.    } ;
  102.  
  103. struct sprite_area
  104.    {
  105.    int size ;
  106.    int number ;
  107.    int sproff ;
  108.    int freeoff ;
  109.    } ;
  110.  
  111. class Task
  112.    {
  113.    friend class ControlThread ;
  114.    public:
  115.       enum events
  116.          {
  117.          ENULL,                /* null event */
  118.          EREDRAW,              /* redraw event */
  119.          EOPEN,
  120.          ECLOSE,
  121.          EPTRLEAVE,
  122.          EPTRENTER,
  123.          EBUT,                 /* mouse button change */
  124.          EUSERDRAG,
  125.          EKEY,
  126.          EMENU,
  127.          ESCROLL,
  128.          ELOSECARET,
  129.          EGAINCARET,
  130.          EPOLLNONZERO,
  131.          ESEND = 17,        /* send message, don't worry if it doesn't arrive */
  132.          ESENDWANTACK = 18, /* send message, return ack if not acknowledged */
  133.          EACK = 19          /* acknowledge receipt of message. */
  134.          } ;
  135.       enum Buttons
  136.          {
  137.          BRIGHT       = 0x001,
  138.          BMID         = 0x002,
  139.          BLEFT        = 0x004,
  140.          BDRAGRIGHT   = 0x010,
  141.          BDRAGLEFT    = 0x040,
  142.          BCLICKRIGHT  = 0x100,
  143.          BCLICKLEFT   = 0x400
  144.          } ;
  145.       enum Messages
  146.          {
  147.          Message_Quit   = 0,
  148.          Message_DataSave     = 1,
  149.          Message_DataSaveAck   = 2,
  150.          Message_DataLoad     = 3,
  151.          Message_DataLoadAck   = 4,
  152.          Message_DataOpen     = 5,
  153.          Message_RAMFetch     = 6,
  154.          Message_RAMTransmit  = 7,
  155.          Message_PreQuit      = 8,
  156.          Message_PaletteChange = 9,
  157.          Message_SaveDesktop      = 10,
  158.          Message_DeviceClaim  = 11,
  159.          Message_DeviceInUse  = 12,
  160.          Message_DataSaved    = 13,
  161.          Message_Shutdown     = 14,
  162.          Message_FilerOpenDir  = 0x0400,
  163.          Message_FilerCloseDir = 0x0401,
  164.          Message_FilerOpenDirAt  = 0x0402,
  165.          Message_FilerSelectionDirectory  = 0x0403,
  166.          Message_FilerAddSelection  = 0x0404,
  167.          Message_FilerAction  = 0x0405,
  168.          Message_FilerControlAction  = 0x0406,
  169.          Message_FilerSelection  = 0x0407,
  170.          Message_Notify        = 0x40040,
  171.          Message_MenuWarning     = 0x400c0,
  172.          Message_ModeChange   = 0x400c1,
  173.          Message_TaskInitialise     = 0x400c2,
  174.          Message_TaskCloseDown    = 0x400c3,
  175.          Message_SlotSize   = 0x400c4,
  176.          Message_SetSlot      = 0x400c5,
  177.          Message_TaskNameRq   = 0x400c6,
  178.          Message_TaskNameIs   = 0x400c7,
  179.          Message_TaskStarted  = 0x400c8,
  180.          Message_MenusDeleted = 0x400c9,
  181.          Message_Iconize      = 0x400ca,
  182.          Message_WindowClosed = 0x400cb,
  183.          Message_WindowInf    = 0x400cc,
  184.          Message_AlarmSet     = 0x500,
  185.          Message_AlarmGoneOff = 0x501,
  186.          Message_HelpRequest  = 0x502,
  187.          Message_HelpReply    = 0x503,
  188.          Message_PrintFile       = 0x80140,
  189.          Message_WillPrint       = 0x80141,
  190.          Message_WPrintSave       = 0x80142,
  191.          Message_PrintInit       = 0x80143,
  192.          Message_PrintError       = 0x80144,
  193.          Message_PrintTypeOdd    = 0x80145,
  194.          Message_PrintTypeUnknown  = 0x80146,
  195.          Message_SetPrinter   = 0x80147,
  196.          Message_PSPrinterQuery       = 0x8014c,
  197.          Message_PSPrinterAck       = 0x8014d,
  198.          Message_PSPrinterModified       = 0x8014e,
  199.          Message_PSPrinterDefaults       = 0x8014f,
  200.          Message_PSPrinterDefaulted       = 0x80150,
  201.          Message_PSPrinterNotPS       = 0x80151,
  202.          Message_ResetPrinter       = 0x80152,
  203.          Message_PSIsFontPrintRunning       = 0x80153,
  204.      TaskWindow_Input   = 0x808c0,
  205.      TaskWindow_Output   = 0x808c1,
  206.      TaskWindow_Ego   = 0x808c2,
  207.      TaskWindow_Morio   = 0x808c3,
  208.      TaskWindow_Morite   = 0x808c4,
  209.      TaskWindow_NewTask   = 0x808c5,
  210.      TaskWindow_Suspend   = 0x808c6,
  211.      TaskWindow_Resume   = 0x808c7
  212.          } ;
  213.  
  214.       struct receiver
  215.          {
  216.          int message ;
  217.          Channel *channel ;
  218.          receiver *next ;
  219.          receiver *prev ;
  220.          receiver(Channel *ch, int m)
  221.             {
  222.             channel = ch ;
  223.             message = m ;
  224.             next = prev = NULL ;
  225.             }
  226.          } ;
  227.  
  228.    public:
  229.       Task (char *taskname, char *applname, char *spritename, char *iconmenu = NULL, int pri = 0, int position = -1,
  230.             int wimp_version = 200, int *message_list = 0) ;
  231.       Task (char *taskname, char *applname,int wimp_version = 310, int *message_list = 0) ;                                     // no icon on iconbar
  232.       Task (char *taskname, char *applname, Icon *iconbar, char *iconmenu = NULL, int pri = 0, int position = -1,
  233.             int wimp_version = 200, int *message_list = 0) ;
  234.       virtual ~Task() ;
  235.       void set_mask(int m) { poll_mask = m ; }
  236.       void run() ;                 // run the task
  237.       void exit(int status = 0) ;
  238.       void sleep (ThreadResource *, int pri = THREAD_BASE_PRIORITY) ;              // sleep on a thread
  239.       void sleep (int time) ;              // sleep for a number of centiseconds
  240.       void yield() ;
  241.       int spawn (char *command...) ;          // spawn another task, return task handle
  242.       void add_window (Window *w) ;        // add a window
  243.       void remove_window (Window *w) ;     // remove a window
  244.       void delete_window (Window *w) ;     // delete a window
  245.       void delete_deferred (DeferredDelete *) ;  // add a deferred deletion
  246.       Window *find_window (int handle) ;   // find a window
  247.       void *find_template(char *name)     // find a template
  248.          {
  249.          return templates->find(name) ;
  250.          }
  251.       void free_template (void *defn)
  252.          {
  253.          templates->free (defn) ;
  254.          }
  255.       Menu *find_menu (char *name)        // find a menu
  256.          {
  257.          return menus->find (name) ;
  258.          }
  259.       virtual char *get_iconbar_menu(int icon) ;      // get a new menu
  260.       virtual void menu(MenuItem items[]) ;          // menu hit
  261.       virtual void click(int x, int y, int buttons, int icon) ;   // icon bar click
  262.       char *lookup(char *token)
  263. #ifdef __EASY_C
  264.          {
  265.          char *s ;
  266.          if ((s = messages->lookup(token)) != NULL)
  267.             return s ;
  268.          return token ;
  269.          }
  270. #else             // cfront gives a 'sorry not implemented' error is this is inline
  271.         ;
  272. #endif
  273.       void send_message (events event, int action, int &task, int &my_ref, int your_ref, int data_length, void *data, int icon = 0)  ;
  274.       void print (char *format,...) ;
  275.       virtual void pre_menu (Menu *menu) ;   // give user a chance to adjust menu
  276.       void register_drag (Window *dragger, int id, bool dragging_sprite = false) ;
  277.       void register_object_drag (Object *dragger, int id, bool dragging_sprite = false) ;
  278.       void add_receiver (Channel *channel, int message) ;
  279.       void remove_receiver (Channel *channel, int message) ;
  280.       receiver *find_receiver (int message, int your_ref) ;
  281.  
  282.       int open_font (char *name, int xisize, int ysize) ;
  283.       void close_font (int handle) ;
  284.  
  285.       void spawn_control_thread(int event, int *buf) ;
  286.       void enter_critical() ;
  287.       void exit_critical() ;
  288.       void *find_sprite (char *name) ;
  289.       virtual void poll_word_non_zero (int *poll_word, int contents) ;
  290.  
  291.       void set_menu (Menu *menu, Icon *icon) ;
  292.       void set_menu (Menu *menu, Object *object) ;
  293.       void set_menu (Menu *menu, Window *window) ;
  294.       virtual char *help (int mx, int my, int button, int window, int icon) ;   // give help outside a window
  295.       void show_threads() ;
  296.  
  297.   public:
  298.       events last_event ;
  299.       int last_event_data [256 / sizeof (int)] ;
  300.       Window *windows ;                    // windows in this task
  301.       Window *last_window ;
  302.       Template *templates ;          // templates
  303.       MenuSet *menus ;               // menus
  304.       MsgTrans *messages ;           // messages
  305.       int poll_mask ;
  306.       int xeigfactor ;                // shift for x pixel to os unit
  307.       int yeigfactor ;                // shift for y pixel to os unit
  308.       Icon *iconbar_icon ;            // iconbar icon
  309.  
  310.    private:
  311.       void init(char *taskname, char *applname, char *iconmenu, int wimp_version, int *message_list) ;
  312.       int initialised ;                    // task is initialised
  313.       int running ;
  314.       int resume_pending ;
  315.       sprite_area *spr_area ;
  316.       char icon_name[12] ;
  317.       int icon_handle ;
  318.       Menu *current_menu ;           // menu currently being displayed
  319.       Window *current_menu_window ;  // window menu belongs to
  320.       Icon *current_menu_icon ;      // icon menu belongs to
  321.       Object *current_menu_object ;  // object menu belongs to
  322.       Menu *iconbar_menu ;           // default iconbar menu
  323.       Window *dragger ;              // window dragging
  324.       int dragger_id ;
  325.       Object *object_dragger ;       // object being dragged
  326.       int object_dragger_id ;        // id for object dragger
  327.       bool dragging_sprite ;         // am I dragging a sprite?
  328.       int waiting ;                  // waiting (counter)
  329.       receiver *receivers ;
  330.       receiver *last_receiver ;
  331.       int num_open_fonts ;
  332.       int max_open_fonts ;
  333.       int *open_fonts ;
  334.       ThreadManager *thread_manager ;
  335.       ControlThread *control_threads ;
  336.       int threads_running ;
  337.       DeferredDelete *deferred_deletions ;
  338.    public:
  339.       DebugWin *debug ;              // debugger display window
  340.       char *program ;
  341.       int handle ;                         // handle assigned by WIMP
  342.       char country[50] ;
  343.    } ;
  344.  
  345. class TaskError
  346.    {
  347.    public:
  348.       TaskError (int f, char *format ...) ;
  349.       char buf[256] ;
  350.       int fatal ;
  351.    } ;
  352.  
  353. #endif
  354.