home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / programs / desktop / newbar / Source / NewBar / c / main < prev    next >
Text File  |  1998-08-03  |  5KB  |  181 lines

  1.  
  2. /* main.c */
  3.  
  4. #include <stdlib.h>
  5. #include <stdio.h>
  6. #include "OS:menu.h"
  7. #include "Dreamscape:task.h"
  8. #include "Dreamscape:tboxevent.h"
  9. #include "Dreamscape:wimpmsg.h"
  10. #include "Dreamscape:x.h"
  11.  
  12. #ifdef MemCheck_MEMCHECK
  13. #include "MemCheck:memcheck.h"
  14. #endif
  15.  
  16. #ifdef HierProf_PROFILE
  17. #include "HierProf:hierprof.h"
  18. #endif
  19.  
  20. #include "iconbar.h"
  21. #include "options.h"
  22. #include "pinpatch.h"
  23. #include "debug.h"
  24.  
  25.  
  26. /* Prototypes, defines and variables */
  27.  
  28. #define ENTRY_QUIT        0x1
  29. #define ENTRY_EDIT_OPTIONS    0x2
  30. #define ENTRY_RELOAD_OPTIONS    0x3
  31. #define OPTIONS_FILE        "<NewIconbar$Choices>"
  32.  
  33. static bool quit_handler(const toolbox_action *event,
  34.     const toolbox_block *ids, void *handle);
  35. static bool edit_options(const toolbox_action *event,
  36.     const toolbox_block *ids, void *handle);
  37. static bool reload_options(const toolbox_action *event,
  38.     const toolbox_block *ids, void *handle);
  39. static bool prequit_handler(const wimp_message *message, void *xhandle);
  40. static void atexit_handler(void);
  41.  
  42. static bool shutdown_quit = 0;
  43. iconbar_manager_task *iconbar_manager_this_task = 0;
  44. thin_iconbar *the_iconbar = 0;
  45. toolbox_o iconbar_menu = 0; /* Menu for the iconbar */
  46.  
  47.  
  48. /* Initialisation and finalisation */
  49.  
  50. TaskDirectory("<NewIconbar$Dir>");
  51.  
  52. int main(int argc, char *argv[])
  53. {
  54. #ifdef MemCheck_MEMCHECK
  55.   MemCheck_Init();
  56.   MemCheck_InterceptSCLStringFunctions();
  57.   MemCheck_SetStoreMallocFunctions(1);
  58.   MemCheck_RegisterArgs(argc, argv);
  59. #endif
  60.  
  61. #ifdef HierProf_PROFILE
  62.   HierProf_ProfileAllFunctions();
  63. #endif
  64.  
  65. #ifdef DEBUG
  66.   /* Turn stderr buffering off -- I wasn't getting my debugging info! */
  67.   setvbuf(stderr, 0, _IONBF, 0);
  68. #endif
  69.  
  70.   DEBUGF("main() starting...\n");
  71.  
  72.   /* Load options file. */
  73.   options = thiniconbar_options_create();
  74.   if(!options) x_throw_message(x_msg_memory());
  75.   thiniconbar_options_from_file(options, OPTIONS_FILE);
  76.   thiniconbar_options_from_cli(options, argc-1, argv+1);
  77.  
  78.   /* If the first argument says --patch, we patch the Pinboard and exit. */
  79.   if(argc >= 2 && !strcmp(argv[1], "--patch")) {
  80.     patch_pinboard(options, !(argc >= 3 && !strcmp(argv[2], "--silent")));
  81.     return 0;
  82.   }
  83.  
  84.   /* Create iconbar. */
  85.   the_iconbar = thiniconbar_create();
  86.   iconbar_manager_this_task = iconbar_manager_initialise(
  87.     thiniconbar_castto_arranger(the_iconbar));
  88.  
  89.   /* Create our menu and attach it to the iconbar. */
  90.   iconbar_menu = toolbox_create_object(0, (toolbox_id) "MainMenu");
  91.   thiniconbar_set_menu(the_iconbar, iconbar_menu);
  92.  
  93.   /* Register handlers for quitting. */
  94.   atexit(atexit_handler);
  95.   dscape_tboxevent_register_c_handler(action_MENU_SELECTION, iconbar_menu, 0,
  96.     ENTRY_QUIT, 0, quit_handler, 0);
  97.   dscape_wimpmsg_register_handler(message_PREQUIT, prequit_handler, 0);
  98.  
  99.   /* Menu entry handlers */
  100.   dscape_tboxevent_register_c_handler(action_MENU_SELECTION, iconbar_menu, 0,
  101.     ENTRY_EDIT_OPTIONS, 0, edit_options, 0);
  102.   dscape_tboxevent_register_c_handler(action_MENU_SELECTION, iconbar_menu, 0,
  103.     ENTRY_RELOAD_OPTIONS, 0, reload_options, 0);
  104.  
  105.   /* Let's go! */
  106.   DEBUGF("Beginning to poll\n");
  107.   dscape_task_poll_forever();
  108.   return 0;
  109. }
  110.  
  111. static void atexit_handler(void)
  112. {
  113.   DEBUGF("Entering main's atexit handler\n");
  114.  
  115.   /* Destroy it so as to finalise properly. */
  116.   thiniconbar_destroy(the_iconbar);
  117.   iconbar_manager_finalise(iconbar_manager_this_task);
  118.  
  119. #ifdef MemCheck_MEMCHECK
  120.   thiniconbar_options_destroy(options); /* Quicker not to */
  121.   MemCheck_OutputBlocksInfo();
  122. #endif
  123.  
  124.   /* Not needed now that we can start with desktop. */
  125. #if 0
  126.   /* If the task was quit individually, kill the IconbarPatch module.
  127.      Otherwise this was a desktop shutdown, so leave it intact to prevent
  128.      spurious errors.  The type of quit is set by a Message_PreQuit or
  129.      through the program's quit menu entry. */
  130.   if(!shutdown_quit) xosmodule_kill("IconbarPatch");
  131. #endif
  132.  
  133.   DEBUGF("Finishing: goodbye!\n");
  134. }
  135.  
  136.  
  137. /* Event handlers */
  138.  
  139. static bool quit_handler(const toolbox_action *event,
  140.     const toolbox_block *ids, void *handle)
  141. {
  142.   shutdown_quit = 0;
  143.   dscape_task_quit();
  144.   return 1;
  145. }
  146.  
  147. static bool edit_options(const toolbox_action *event,
  148.     const toolbox_block *ids, void *handle)
  149. {
  150.   os_cli("Filer_Run " OPTIONS_FILE);
  151.   return 1;
  152. }
  153.  
  154. static bool reload_options(const toolbox_action *event,
  155.     const toolbox_block *ids, void *handle)
  156. {
  157.   /* To reload options, re-create the whole iconbar at present. */
  158.   thiniconbar_destroy(the_iconbar);
  159.   iconbar_manager_finalise(iconbar_manager_this_task);
  160.   thiniconbar_options_destroy(options);
  161.  
  162.   options = thiniconbar_options_create();
  163.   if(!options) x_throw_message(x_msg_memory());
  164.   thiniconbar_options_from_file(options, OPTIONS_FILE);
  165.  
  166.   the_iconbar = thiniconbar_create();
  167.   iconbar_manager_this_task = iconbar_manager_initialise(
  168.     thiniconbar_castto_arranger(the_iconbar));
  169.  
  170.   thiniconbar_set_menu(the_iconbar, iconbar_menu);
  171.  
  172.   return 1;
  173. }
  174.  
  175. static bool prequit_handler(const wimp_message *message, void *xhandle)
  176. {
  177.   shutdown_quit = (message->size >= 24 &&
  178.     (~message->data.prequit.flags & wimp_PRE_QUIT_TASK_ONLY));
  179.   return 0;
  180. }
  181.