home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / hensa / colour / modesel_1 / !ModeSel / c / Main < prev    next >
Text File  |  1994-06-20  |  9KB  |  354 lines

  1. #include "os.h"
  2. #include "wimp.h"
  3. #include "fileswitch.h"
  4. #include "Icon_Bar.h"
  5. #include "Menus.h"
  6. #include "Windows.h"
  7. #include "Modes.h"
  8. #include "File.h"
  9. #include "stdlib.h"
  10. #include "kernel.h"
  11.  
  12. static osspriteop_area *sa;        /* sprite area */
  13. static wimp_i            barIc;      /* icon bar icon */
  14. static int        barMode;    /* Current Screen Mode */
  15. static int        Opt[6];
  16. static bool        mainWindowOpen = FALSE;
  17.  
  18.  
  19. void open_mode(bits *eventMask);
  20. void update_main_window(bits *eventMask);
  21. void handle_menu_sel(wimp_block *block, bool *finished, bits *eventMask);
  22. void handle_message(wimp_block *block, bool *finished);
  23. void handle_mouse_click(wimp_block *block, bits *eventMask);
  24. void open_select(bits *eventMask);
  25. void file_out(char *str, os_f handle);
  26. void save_desktop (os_f handle);
  27. void clickBar (wimp_block *block, bits *eventMask);
  28. void clickSelect (wimp_block *block);
  29. void clickMode (wimp_block *block);
  30.  
  31.  
  32. void open_mode(bits *eventMask)
  33. {
  34.   if(mainWindowOpen == FALSE)
  35.   {
  36.     wimp_window_state state;
  37.  
  38.     state.w = get_mode();
  39.  
  40.     if (got_modes()==FALSE)
  41.     {
  42.       get_all_modes();
  43.       end_modes_get(eventMask);
  44.       sort_modes(Opt[5]);
  45.     }
  46.     create_mode_icons(barMode, Opt);
  47.  
  48.     wimp_get_window_state (&state);
  49.     wimp_open_window ((wimp_open *) &state);
  50.  
  51.     mainWindowOpen = TRUE;
  52.   }
  53. }
  54.  
  55. void open_select(bits *eventMask)
  56. {
  57.   wimp_window_state state;
  58.  
  59.   state.w = get_select();
  60.  
  61.   if (got_modes()==FALSE)
  62.   {
  63.     get_all_modes();
  64.     end_modes_get(eventMask);
  65.     sort_modes(Opt[5]);
  66.   }
  67.  
  68.   update_sel_icons(barMode);
  69.  
  70.   wimp_get_window_state (&state);
  71.   wimp_open_window ((wimp_open *) &state);
  72. }
  73.  
  74. void update_main_window(bits *eventMask)
  75. {
  76.   if(mainWindowOpen)
  77.   {
  78.     close_mode_window(&mainWindowOpen);
  79.     open_mode(eventMask);
  80.   }
  81. }
  82.  
  83.  
  84. void handle_menu_sel(wimp_block *block, bool *finished, bits *eventMask)
  85. {
  86.   int sel;
  87.   char selResStr[12];
  88.  
  89.   switch (sel = decode_menu_sel(block))
  90.   {
  91.     case ib_refresh : start_modes_get (eventMask);
  92.                    if(mainWindowOpen)
  93.                    {
  94.                      get_all_modes();
  95.                   end_modes_get(eventMask);
  96.                   sort_modes(Opt[5]);
  97.                   update_main_window(eventMask);
  98.                     }
  99.                        break;
  100.  
  101.     case ib_save    : save_config(Opt);
  102.                         break;
  103.     case ib_palette : _kernel_oscli("wimppalette <Modesel$dir>.palette");
  104.                       break;
  105.     case ib_quit    : *finished = TRUE;
  106.                       break;
  107.  
  108.     case opt_reinit : /* mode reinited in menu module - easier */
  109.                       build_except_menu();
  110.                       start_modes_get (eventMask);
  111.                       if(mainWindowOpen)
  112.                    {
  113.                      get_all_modes();
  114.                   end_modes_get(eventMask);
  115.                   sort_modes(Opt[5]);
  116.                   update_main_window(eventMask);
  117.                     }
  118.                    break;
  119.  
  120.     case opt_remove : new_except(remove_no());
  121.                    build_except_menu();
  122.                    start_modes_get (eventMask);
  123.                       if(mainWindowOpen)
  124.                    {
  125.                      get_all_modes();
  126.                   end_modes_get(eventMask);
  127.                   sort_modes(Opt[5]);
  128.                   update_main_window(eventMask);
  129.                     }
  130.                    break;
  131.     case opt_kill_p : Opt[4] = 1- Opt[4];
  132.                    break;
  133.  
  134.     case col_2      :
  135.     case col_4      :
  136.     case col_16     :
  137.     case col_256    : Opt[sel-col_2] = 1- Opt[sel-col_2];
  138.                    update_main_window(eventMask);
  139.                    break;
  140.     case srt_mode   :
  141.     case srt_X        :
  142.     case srt_Y      :
  143.     case srt_size   :
  144.     case srt_area   : Opt[5] = sel - srt_mode;
  145.                    sort_modes(Opt[5]);
  146.                    update_main_window(eventMask);
  147.                    break;
  148.     case selCol_2   : set_sel_col(1);
  149.                    get_last_res(1,selResStr);
  150.                    set_sel_res(selResStr);
  151.                       break;
  152.     case selCol_4   : set_sel_col(2);
  153.                    get_last_res(2,selResStr);
  154.                    set_sel_res(selResStr);
  155.                    break;
  156.     case selCol_16  : set_sel_col(4);
  157.                    get_last_res(4,selResStr);
  158.                    set_sel_res(selResStr);
  159.                       break;
  160.     case selCol_256 : set_sel_col(8);
  161.                    get_last_res(8,selResStr);
  162.                    set_sel_res(selResStr);
  163.                       break;
  164.     case resMenu    : get_res_str(block, selResStr); /* from menu */
  165.                    set_sel_res(selResStr);
  166.                    break;
  167.  
  168.   }
  169.   check_redisplay();
  170. }
  171.  
  172.  
  173. void file_out(char *str, os_f handle)
  174. {
  175.   int loop=0;
  176.  
  177.   while (str[loop] != '\0')
  178.     xos_bput (str[loop++], handle);
  179. }
  180.  
  181. void save_desktop (os_f handle)
  182. {  char *ptr;
  183.  
  184.    if ((ptr = getenv ("ModeSel$Dir")) != NULL && !EMPTY (ptr))
  185.    {
  186.       if(Opt[4])  file_out("RMkill PaletteUtil\n",handle);
  187.       file_out("Filer_Run ",handle);
  188.       file_out(ptr,handle);
  189.    }
  190. }
  191.  
  192.  
  193. void handle_message(wimp_block *block, bool *finished)
  194. {
  195.   if (block->message.action == message_MODE_CHANGE)
  196.   {
  197.     int oldMode = barMode;
  198.  
  199.     update_bar_icon(sa, &barIc, &barMode );
  200.     if (mainWindowOpen)
  201.       update_mode_icons(oldMode, barMode);
  202.   }
  203.  
  204.   if ((block->message.action == message_QUIT) ||
  205.       (block->message.action == message_SHUTDOWN))
  206.   {
  207.     *finished=TRUE;
  208.   }
  209.  
  210.   if (block->message.action == message_SAVE_DESKTOP)
  211.   {
  212.      save_desktop(block->message.data.save_desktop.file);
  213.   }
  214. }
  215.  
  216. void clickBar (wimp_block *block, bits *eventMask)
  217. {
  218.   if (block->pointer.buttons == wimp_CLICK_MENU)
  219.     show_icon_bar_menu(block->pointer.pos);
  220.  
  221.   if (block->pointer.buttons == wimp_CLICK_SELECT)
  222.     open_mode(eventMask);
  223.  
  224.   if (block->pointer.buttons == wimp_CLICK_ADJUST)
  225.     open_select(eventMask);
  226. }
  227.  
  228.  
  229. void clickMode (wimp_block *block)
  230. {
  231.   if (block->pointer.buttons == wimp_CLICK_MENU)
  232.     show_options_menu(block->pointer.pos);
  233.  
  234.   if ( (block->pointer.buttons == wimp_CLICK_SELECT) ||
  235.        (block->pointer.buttons == wimp_CLICK_ADJUST))
  236.   {
  237.     int mode = find_mode_clicked(block->pointer.i);
  238.  
  239.     if (mode != -1)
  240.     {
  241.       wimp_set_mode ((os_mode) mode);
  242.       if (block->pointer.buttons == wimp_CLICK_SELECT)
  243.         close_mode_window(&mainWindowOpen);
  244.     }
  245.   }
  246. }
  247.  
  248. void clickSelect (wimp_block *block)
  249. {
  250.   if (block->pointer.i == selColMen)
  251.     show_colour_menu(block->pointer.pos);
  252.   if (block->pointer.i == selResMen)
  253.     show_res_menu(block->pointer.pos,get_sel_bpp());
  254.   if ((block->pointer.i == selCancel) && (block->pointer.buttons != wimp_CLICK_MENU))
  255.     close_select_window();
  256.   if ((block->pointer.i == selChange) && (block->pointer.buttons != wimp_CLICK_MENU))
  257.   {
  258.     wimp_set_mode ((os_mode) sel_find_mode(get_sel_bpp(), get_sel_res_str()));
  259.     if (block->pointer.buttons != wimp_CLICK_ADJUST)
  260.       close_select_window();
  261.   }
  262. }
  263.  
  264.  
  265. void handle_mouse_click(wimp_block *block, bits *eventMask)
  266. {
  267.     if (block->pointer.w == wimp_ICON_BAR)
  268.       clickBar (block, eventMask);
  269.     else
  270.     {
  271.       if (block->pointer.w == get_mode())
  272.         clickMode (block);
  273.       else
  274.         if (block->pointer.w == get_select())
  275.           clickSelect (block);
  276.     }
  277. }
  278.  
  279.  
  280. int main (void)
  281.  
  282. {
  283.    bool       finished = FALSE;
  284.    wimp_block block; /*get the block for wimp_poll()*/
  285.    int        event;
  286.  
  287.    int        msgsList[]={  message_SAVE_DESKTOP ,
  288.                     message_SHUTDOWN,
  289.                     message_MODE_CHANGE ,
  290.                     message_QUIT
  291.                    };
  292.  
  293.    bits       eventMask =    wimp_MASK_NULL |
  294.                              wimp_MASK_LEAVING |
  295.                              wimp_MASK_ENTERING |
  296.                  wimp_QUEUE_MOUSE |
  297.                              wimp_QUEUE_KEY |
  298.                              wimp_MASK_LOSE |
  299.                         wimp_MASK_GAIN ;
  300.  
  301.  
  302.  
  303.    wimp_initialise ( wimp_VERSION_RO3, "Mode Selector",
  304.                     (wimp_message_list *) msgsList,
  305.                     NULL);
  306.  
  307.    load_config(Opt);
  308.    init_sprites(&sa, &barMode, &barIc);
  309.    set_up_windows();
  310.    set_up_menus(Opt);
  311.  
  312.    start_modes_get(&eventMask);
  313.  
  314.    while (!finished)
  315.    {
  316.       xwimp_poll (eventMask, &block, NULL, &event);
  317.  
  318.       switch (event)
  319.       {
  320.  
  321.         case wimp_MOUSE_CLICK           : handle_mouse_click(&block, &eventMask );
  322.                                              break;
  323.  
  324.         case wimp_MENU_SELECTION        : handle_menu_sel(&block,&finished, &eventMask);
  325.                                              break;
  326.  
  327.         case wimp_OPEN_WINDOW_REQUEST   : handle_open_win(&block);
  328.                                             break;
  329.  
  330.         case wimp_CLOSE_WINDOW_REQUEST  : handle_close_win(&block, &mainWindowOpen);
  331.                                       break;
  332.  
  333.         case wimp_REDRAW_WINDOW_REQUEST : handle_redraw(&block);
  334.                                break;
  335.  
  336.         case wimp_NULL_REASON_CODE      : if(get_modes())
  337.                                {
  338.                                         end_modes_get(&eventMask);
  339.                                         sort_modes(Opt[5]);
  340.                                       }
  341.                                       break;
  342.  
  343.         case wimp_USER_MESSAGE          :
  344.         case wimp_USER_MESSAGE_RECORDED :
  345.                                        handle_message(&block,&finished);
  346.                                               break;
  347.  
  348.       }
  349.    }
  350.    wimp_close_down ((wimp_t) 0);
  351.  
  352.    return 0;
  353. }
  354.