home *** CD-ROM | disk | FTP | other *** search
/ Aminet 10 / aminetcdnumber101996.iso / Aminet / misc / emu / Frodo.lha / Frodo / src / Prefs.c < prev    next >
C/C++ Source or Header  |  1995-12-07  |  25KB  |  862 lines

  1. /*
  2.  *  Prefs.c - Handhabung des Einstellungsfensters
  3.  *
  4.  *  Copyright (C) 1994-1995 by Christian Bauer
  5.  */
  6.  
  7. #include <exec/types.h>
  8. #include <intuition/gadgetclass.h>
  9. #include <graphics/displayinfo.h>
  10. #include <workbench/workbench.h>
  11. #include <libraries/asl.h>
  12. #include <libraries/gadtools.h>
  13. #include <clib/exec_protos.h>
  14. #include <clib/dos_protos.h>
  15. #include <clib/intuition_protos.h>
  16. #include <clib/graphics_protos.h>
  17. #include <clib/gadtools_protos.h>
  18. #include <clib/asl_protos.h>
  19. #include <clib/icon_protos.h>
  20. #include <string.h>
  21.  
  22. #include "Prefs.h"
  23. #include "FrodoGUI.h"
  24. #include "Frodo_rev.h"
  25. #define CATCOMP_NUMBERS 1
  26. #include "LocStrings.h"
  27.  
  28.  
  29. // Aus Main.asm
  30. extern char *GetStr(int strnum);
  31. extern short PrefsFromEmul;
  32. extern char PrefsName[256];
  33.  
  34. // Aus 6510(SC).asm
  35. extern USHORT IsFrodoSC;
  36.  
  37.  
  38. // Prototypes
  39. void set_gadgets(Preferences *p);
  40. void set_display_id_gadget(Preferences *p);
  41. void get_gadgets(Preferences *p);
  42. void ghost_gadgets(Preferences *p);
  43. int handle_IDCMP(Preferences *p, struct Window *win, int done);
  44. int handle_gadget(Preferences *p, struct Window *win, struct Gadget *gad, UWORD code, int done);
  45. int handle_menu(Preferences *p, struct Window *win, int menu, int item, int done);
  46. int handle_key(Preferences *p, struct Window *win, UWORD code, int done);
  47. int request_display_id(struct Window *win, ULONG *display_id, UWORD *overscan);
  48. int request_drive(struct Window *win, UWORD type, char *str);
  49. int request_file(struct Window *win, char *name, int hail, int save);
  50. void open_prefs_as(Preferences *p);
  51. void save_prefs(Preferences *p);
  52. void save_prefs_as(Preferences *p);
  53.  
  54.  
  55. // Requester
  56. struct EasyStruct about_req = {
  57.   sizeof(struct EasyStruct), 0, NULL, NULL, NULL
  58. };
  59.  
  60.  
  61. // Icon der Prefs-Datei
  62. const UWORD PrefsI1Data[] =
  63. {
  64. /* Plane 0 */
  65.     0x0000,0x0000,0x0000,0x0400,0x0000,0x0000,0x0000,0x0C00,
  66.     0x0003,0xFFC0,0x0000,0x0C00,0x000C,0x0030,0x0000,0x0C00,
  67.     0x0010,0x7E08,0x0000,0x0C00,0x0020,0x8104,0x0000,0x0C00,
  68.     0x0020,0x4104,0x0000,0x0C00,0x0020,0x4104,0x0000,0x0C00,
  69.     0x0010,0x8204,0x0000,0x0C00,0x000F,0x0C08,0x0000,0x0C00,
  70.     0x0000,0x3010,0x0000,0x0C00,0x0000,0x4060,0x0000,0x0C00,
  71.     0x0000,0x8180,0x0000,0x0C00,0x0001,0x0E00,0x0000,0x0C00,
  72.     0x0000,0x8400,0x0000,0x0C00,0x0000,0x7800,0x0000,0x0C00,
  73.     0x0000,0x8400,0x0000,0x0C00,0x0000,0x8400,0x0000,0x0C00,
  74.     0x0000,0x7800,0x0000,0x0C00,0x0000,0x0000,0x0000,0x0C00,
  75.     0x0000,0x0000,0x0000,0x0C00,0x7FFF,0xFFFF,0xFFFF,0xFC00,
  76. /* Plane 1 */
  77.     0xFFFF,0xFFFF,0xFFFF,0xF800,0xD555,0x5557,0xD555,0x5000,
  78.     0xD554,0x001F,0xF555,0x5000,0xD553,0xFFCF,0xF555,0x5000,
  79.     0xD54F,0x81F7,0xF555,0x5000,0xD55F,0x54FB,0xF555,0x5000,
  80.     0xD55F,0x94FB,0xFFD5,0x5000,0xD55F,0x94F9,0x7FF5,0x5000,
  81.     0xD54F,0x55F9,0x7FD5,0x5000,0xD550,0x53F5,0x7FD5,0x5000,
  82.     0xD555,0x4FE5,0x5F55,0x5000,0xD555,0x3F95,0x60D5,0x5000,
  83.     0xD555,0x7E7D,0x6055,0x5000,0xD554,0xF1FD,0x6035,0x5000,
  84.     0xD555,0x79FF,0xFFD5,0x5000,0xD555,0x05FF,0xF555,0x5000,
  85.     0xD555,0x797F,0xF555,0x5000,0xD555,0x797F,0xF555,0x5000,
  86.     0xD555,0x055F,0xF555,0x5000,0xD555,0x5557,0xD555,0x5000,
  87.     0xD555,0x5555,0x5555,0x5000,0x8000,0x0000,0x0000,0x0000,
  88. /* Plane 2 */
  89.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  90.     0x0000,0x0007,0xC000,0x0000,0x0000,0x000F,0xE000,0x0000,
  91.     0x0000,0x0007,0xE000,0x0000,0x0000,0x0003,0xE000,0x0000,
  92.     0x0000,0x0000,0x6000,0x0000,0x0000,0x0000,0x1FC0,0x0000,
  93.     0x0000,0x0000,0x1F80,0x0000,0x0000,0x0000,0x1F00,0x0000,
  94.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1F00,0x0000,
  95.     0x0000,0x0070,0x1F80,0x0000,0x0000,0x00F0,0x1FC0,0x0000,
  96.     0x0000,0x00FC,0x6000,0x0000,0x0000,0x007F,0xE000,0x0000,
  97.     0x0000,0x003F,0xE000,0x0000,0x0000,0x001F,0xE000,0x0000,
  98.     0x0000,0x0007,0xC000,0x0000,0x0000,0x0000,0x0000,0x0000,
  99.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  100. /* Plane 3 */
  101.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  102.     0x0000,0x0007,0xC000,0x0000,0x0000,0x000F,0xE000,0x0000,
  103.     0x0000,0x0007,0xE000,0x0000,0x0000,0x0003,0xE000,0x0000,
  104.     0x0000,0x0000,0x6000,0x0000,0x0000,0x0000,0x1FC0,0x0000,
  105.     0x0000,0x0000,0x1F80,0x0000,0x0000,0x0000,0x1F00,0x0000,
  106.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1F00,0x0000,
  107.     0x0000,0x0070,0x1F80,0x0000,0x0000,0x00F0,0x1FC0,0x0000,
  108.     0x0000,0x00FC,0x6000,0x0000,0x0000,0x007F,0xE000,0x0000,
  109.     0x0000,0x003F,0xE000,0x0000,0x0000,0x001F,0xE000,0x0000,
  110.     0x0000,0x0007,0xC000,0x0000,0x0000,0x0000,0x0000,0x0000,
  111.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  112. /* Plane 4 */
  113.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  114.     0x0000,0x0007,0xC000,0x0000,0x0000,0x000F,0xE000,0x0000,
  115.     0x0000,0x0007,0xE000,0x0000,0x0000,0x0003,0xE000,0x0000,
  116.     0x0000,0x0000,0x6000,0x0000,0x0000,0x0000,0x1FC0,0x0000,
  117.     0x0000,0x0000,0x1F80,0x0000,0x0000,0x0000,0x1F00,0x0000,
  118.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1F00,0x0000,
  119.     0x0000,0x0070,0x1F80,0x0000,0x0000,0x00F0,0x1FC0,0x0000,
  120.     0x0000,0x00FC,0x6000,0x0000,0x0000,0x007F,0xE000,0x0000,
  121.     0x0000,0x003F,0xE000,0x0000,0x0000,0x001F,0xE000,0x0000,
  122.     0x0000,0x0007,0xC000,0x0000,0x0000,0x0000,0x0000,0x0000,
  123.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  124. /* Plane 5 */
  125.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  126.     0x0000,0x0007,0xC000,0x0000,0x0000,0x000F,0xE000,0x0000,
  127.     0x0000,0x0007,0xE000,0x0000,0x0000,0x0003,0xE000,0x0000,
  128.     0x0000,0x0000,0x6000,0x0000,0x0000,0x0000,0x1FC0,0x0000,
  129.     0x0000,0x0000,0x1F80,0x0000,0x0000,0x0000,0x1F00,0x0000,
  130.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1F00,0x0000,
  131.     0x0000,0x0070,0x1F80,0x0000,0x0000,0x00F0,0x1FC0,0x0000,
  132.     0x0000,0x00FC,0x6000,0x0000,0x0000,0x007F,0xE000,0x0000,
  133.     0x0000,0x003F,0xE000,0x0000,0x0000,0x001F,0xE000,0x0000,
  134.     0x0000,0x0007,0xC000,0x0000,0x0000,0x0000,0x0000,0x0000,
  135.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  136. /* Plane 6 */
  137.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  138.     0x0000,0x0007,0xC000,0x0000,0x0000,0x000F,0xE000,0x0000,
  139.     0x0000,0x0007,0xE000,0x0000,0x0000,0x0003,0xE000,0x0000,
  140.     0x0000,0x0000,0x6000,0x0000,0x0000,0x0000,0x1FC0,0x0000,
  141.     0x0000,0x0000,0x1F80,0x0000,0x0000,0x0000,0x1F00,0x0000,
  142.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1F00,0x0000,
  143.     0x0000,0x0070,0x1F80,0x0000,0x0000,0x00F0,0x1FC0,0x0000,
  144.     0x0000,0x00FC,0x6000,0x0000,0x0000,0x007F,0xE000,0x0000,
  145.     0x0000,0x003F,0xE000,0x0000,0x0000,0x001F,0xE000,0x0000,
  146.     0x0000,0x0007,0xC000,0x0000,0x0000,0x0000,0x0000,0x0000,
  147.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  148. /* Plane 7 */
  149.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  150.     0x0000,0x0007,0xC000,0x0000,0x0000,0x000F,0xE000,0x0000,
  151.     0x0000,0x0007,0xE000,0x0000,0x0000,0x0003,0xE000,0x0000,
  152.     0x0000,0x0000,0x6000,0x0000,0x0000,0x0000,0x1FC0,0x0000,
  153.     0x0000,0x0000,0x1F80,0x0000,0x0000,0x0000,0x1F00,0x0000,
  154.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1F00,0x0000,
  155.     0x0000,0x0070,0x1F80,0x0000,0x0000,0x00F0,0x1FC0,0x0000,
  156.     0x0000,0x00FC,0x6000,0x0000,0x0000,0x007F,0xE000,0x0000,
  157.     0x0000,0x003F,0xE000,0x0000,0x0000,0x001F,0xE000,0x0000,
  158.     0x0000,0x0007,0xC000,0x0000,0x0000,0x0000,0x0000,0x0000,
  159.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  160. };
  161.  
  162. const struct Image PrefsI1 =
  163. {
  164.     0, 0,            /* Upper left corner */
  165.     54, 22, 8,        /* Width, Height, Depth */
  166.     PrefsI1Data,    /* Image data */
  167.     0x00FF, 0x0000,    /* PlanePick, PlaneOnOff */
  168.     NULL            /* Next image */
  169. };
  170.  
  171. const struct DiskObject PrefsIcon =
  172. {
  173.     WB_DISKMAGIC,        /* Magic Number */
  174.     WB_DISKVERSION,        /* Version */
  175.     {                    /* Embedded Gadget Structure */
  176.     NULL,                /* Next Gadget Pointer */
  177.     0, 0, 54, 23,        /* Left,Top,Width,Height */
  178.     GFLG_GADGIMAGE | GFLG_GADGHCOMP,    /* Flags */
  179.     GACT_RELVERIFY,        /* Activation Flags */
  180.     BOOLGADGET,            /* Gadget Type */
  181.     (APTR)&PrefsI1,        /* Render Image */
  182.     NULL,                /* Select Image */
  183.     NULL,                /* Gadget Text */
  184.     NULL,                /* Mutual Exclude */
  185.     NULL,                /* Special Info */
  186.     0,                    /* Gadget ID */
  187.     (APTR) 0x0001,        /* User Data (Revision) */
  188.     },
  189.     WBPROJECT,            /* Icon Type */
  190.     (char *)"Frodo",    /* Default Tool */
  191.     NULL,                /* Tool Type Array */
  192.     NO_ICON_POSITION,    /* Current X */
  193.     NO_ICON_POSITION,    /* Current Y */
  194.     NULL,                /* Drawer Structure */
  195.     NULL,                /* Tool Window */
  196.     0                    /* Stack Size */
  197. };
  198.  
  199.  
  200. /*
  201.  *  Einstellungsfenster öffnen, handhaben und schließen
  202.  *  Die Preferences werden auf jeden Fall verändert, auch bei Cancel
  203.  *  0: Cancel, 1: OK
  204.  */
  205.  
  206. int DoThePrefs(Preferences *p)
  207. {
  208.   int done = FALSE;
  209.  
  210.   if (!SetupScreen()) {
  211.     if (!OpenPrefsWindow()) {
  212.       SetWindowTitles(PrefsWnd,
  213.         GetStr(IsFrodoSC ? MSG_PREFSTITLESC : MSG_PREFSTITLE),
  214.         GetStr(IsFrodoSC ? MSG_SCREENTITLESC : MSG_SCREENTITLE));
  215.  
  216.       set_gadgets(p);
  217.  
  218.       // ScreenReqWindow, DirReqWindow, FileReqWindow setzen
  219.       while (!done) {
  220.         WaitPort(PrefsWnd->UserPort);
  221.         done = handle_IDCMP(p, PrefsWnd, done);
  222.       }
  223.       if (done == -1) done = 0;
  224.  
  225.       get_gadgets(p);
  226.  
  227.       ClosePrefsWindow();
  228.     }
  229.     CloseDownScreen();
  230.   }
  231.  
  232.   return done;
  233. }
  234.  
  235.  
  236. /*
  237.  *  Gadgets auf die Einstellungen setzen
  238.  */
  239.  
  240. void set_gadgets(Preferences *p)
  241. {
  242.   GT_SetGadgetAttrs(PrefsGadgets[GDX_NormalCycles], PrefsWnd, NULL,
  243.     GTIN_Number, p->normal_cycles, TAG_DONE);
  244.   GT_SetGadgetAttrs(PrefsGadgets[GDX_BadLineCycles], PrefsWnd, NULL,
  245.     GTIN_Number, p->bad_line_cycles, TAG_DONE);
  246.   GT_SetGadgetAttrs(PrefsGadgets[GDX_CIACycles], PrefsWnd, NULL,
  247.     GTIN_Number, p->CIA_cycles, TAG_DONE);
  248.   GT_SetGadgetAttrs(PrefsGadgets[GDX_SkipLatch], PrefsWnd, NULL,
  249.     GTIN_Number, p->skip_latch, TAG_DONE);
  250.  
  251.   GT_SetGadgetAttrs(PrefsGadgets[GDX_Joystick1On], PrefsWnd, NULL,
  252.     GTCB_Checked, p->joystick_1_on, TAG_DONE);
  253.   GT_SetGadgetAttrs(PrefsGadgets[GDX_Joystick2On], PrefsWnd, NULL,
  254.     GTCB_Checked, p->joystick_2_on, TAG_DONE);
  255.   GT_SetGadgetAttrs(PrefsGadgets[GDX_JoystickSwap], PrefsWnd, NULL,
  256.     GTCB_Checked, p->joystick_swap, TAG_DONE);
  257.   GT_SetGadgetAttrs(PrefsGadgets[GDX_KeyboardYZ], PrefsWnd, NULL,
  258.     GTCB_Checked, p->keyboard_yz, TAG_DONE);
  259.   GT_SetGadgetAttrs(PrefsGadgets[GDX_Collisions], PrefsWnd, NULL,
  260.     GTCB_Checked, p->collisions, TAG_DONE);
  261.   GT_SetGadgetAttrs(PrefsGadgets[GDX_FastReset], PrefsWnd, NULL,
  262.     GTCB_Checked, p->fast_reset, TAG_DONE);
  263.   GT_SetGadgetAttrs(PrefsGadgets[GDX_LimitSpeed], PrefsWnd, NULL,
  264.     GTCB_Checked, p->limit_speed, TAG_DONE);
  265.   GT_SetGadgetAttrs(PrefsGadgets[GDX_DirectVideo], PrefsWnd, NULL,
  266.     GTCB_Checked, p->direct_video, TAG_DONE);
  267.   GT_SetGadgetAttrs(PrefsGadgets[GDX_OtherIEC], PrefsWnd, NULL,
  268.     GTCB_Checked, p->other_IEC, TAG_DONE);
  269.   GT_SetGadgetAttrs(PrefsGadgets[GDX_MapSlash], PrefsWnd, NULL,
  270.     GTCB_Checked, p->map_slash, TAG_DONE);
  271.  
  272.   GT_SetGadgetAttrs(PrefsGadgets[GDX_SIDType], PrefsWnd, NULL,
  273.     GTCY_Active, p->SID_type, TAG_DONE);
  274.   GT_SetGadgetAttrs(PrefsGadgets[GDX_ScreenType], PrefsWnd, NULL,
  275.     GTCY_Active, p->screen_type, TAG_DONE);
  276.  
  277.   set_display_id_gadget(p);
  278.  
  279.   GT_SetGadgetAttrs(PrefsGadgets[GDX_Drv8Type], PrefsWnd, NULL,
  280.     GTCY_Active, p->drv_8_type, TAG_DONE);
  281.   GT_SetGadgetAttrs(PrefsGadgets[GDX_Drv9Type], PrefsWnd, NULL,
  282.     GTCY_Active, p->drv_9_type, TAG_DONE);
  283.   GT_SetGadgetAttrs(PrefsGadgets[GDX_Drv10Type], PrefsWnd, NULL,
  284.     GTCY_Active, p->drv_10_type, TAG_DONE);
  285.   GT_SetGadgetAttrs(PrefsGadgets[GDX_Drv11Type], PrefsWnd, NULL,
  286.     GTCY_Active, p->drv_11_type, TAG_DONE);
  287.  
  288.   GT_SetGadgetAttrs(PrefsGadgets[GDX_Dir8], PrefsWnd, NULL,
  289.     GTST_String, p->dir_8, TAG_DONE);
  290.   GT_SetGadgetAttrs(PrefsGadgets[GDX_Dir9], PrefsWnd, NULL,
  291.     GTST_String, p->dir_9, TAG_DONE);
  292.   GT_SetGadgetAttrs(PrefsGadgets[GDX_Dir10], PrefsWnd, NULL,
  293.     GTST_String, p->dir_10, TAG_DONE);
  294.   GT_SetGadgetAttrs(PrefsGadgets[GDX_Dir11], PrefsWnd, NULL,
  295.     GTST_String, p->dir_11, TAG_DONE);
  296.  
  297.   ghost_gadgets(p);
  298. }
  299.  
  300.  
  301. /*
  302.  *  Display-ID-Gadget setzen
  303.  */
  304.  
  305. char mode_name[DISPLAYNAMELEN];
  306.  
  307. void set_display_id_gadget(Preferences *p)
  308. {
  309.   struct NameInfo query;
  310.  
  311.   GetDisplayInfoData(NULL, (UBYTE *)&query, sizeof(query), DTAG_NAME, p->display_id);
  312.   strncpy(mode_name, query.Name, DISPLAYNAMELEN);
  313.  
  314.   GT_SetGadgetAttrs(PrefsGadgets[GDX_DisplayID], PrefsWnd, NULL,
  315.     GTTX_Text, mode_name, TAG_DONE);
  316. }
  317.  
  318.  
  319. /*
  320.  *  Einstellungen aus den Gadgets lesen
  321.  */
  322.  
  323. void get_gadgets(Preferences *p)
  324. {
  325.   p->normal_cycles = GetNumber(PrefsGadgets[GDX_NormalCycles]);
  326.   p->bad_line_cycles = GetNumber(PrefsGadgets[GDX_BadLineCycles]);
  327.   p->CIA_cycles = GetNumber(PrefsGadgets[GDX_CIACycles]);
  328.   p->skip_latch = GetNumber(PrefsGadgets[GDX_SkipLatch]);
  329.  
  330.   strncpy(p->dir_8, GetString(PrefsGadgets[GDX_Dir8]), 256);
  331.   strncpy(p->dir_9, GetString(PrefsGadgets[GDX_Dir9]), 256);
  332.   strncpy(p->dir_10, GetString(PrefsGadgets[GDX_Dir10]), 256);
  333.   strncpy(p->dir_11, GetString(PrefsGadgets[GDX_Dir11]), 256);
  334. }
  335.  
  336.  
  337. /*
  338.  *  Gadgets korrekt ghosten
  339.  */
  340.  
  341. void ghost_gadgets(Preferences *p)
  342. {
  343.   GT_SetGadgetAttrs(PrefsGadgets[GDX_Dir8], PrefsWnd, NULL,
  344.     GA_Disabled, p->drv_8_type == DRVTYPE_IEC, TAG_DONE);
  345.   GT_SetGadgetAttrs(PrefsGadgets[GDX_Dir9], PrefsWnd, NULL,
  346.     GA_Disabled, p->drv_9_type == DRVTYPE_IEC, TAG_DONE);
  347.   GT_SetGadgetAttrs(PrefsGadgets[GDX_Dir10], PrefsWnd, NULL,
  348.     GA_Disabled, p->drv_10_type == DRVTYPE_IEC, TAG_DONE);
  349.   GT_SetGadgetAttrs(PrefsGadgets[GDX_Dir11], PrefsWnd, NULL,
  350.     GA_Disabled, p->drv_11_type == DRVTYPE_IEC, TAG_DONE);
  351.  
  352.   GT_SetGadgetAttrs(PrefsGadgets[GDX_Collisions], PrefsWnd, NULL,
  353.     GA_Disabled, p->screen_type == SCRTYPE_1BIT, TAG_DONE);
  354.   GT_SetGadgetAttrs(PrefsGadgets[GDX_DirectVideo], PrefsWnd, NULL,
  355.     GA_Disabled, (p->screen_type != SCRTYPE_8BIT) || PrefsFromEmul, TAG_DONE);
  356.  
  357.   GT_SetGadgetAttrs(PrefsGadgets[GDX_GetDisplayID], PrefsWnd, NULL,
  358.     GA_Disabled, PrefsFromEmul, TAG_DONE);
  359.   GT_SetGadgetAttrs(PrefsGadgets[GDX_ScreenType], PrefsWnd, NULL,
  360.     GA_Disabled, PrefsFromEmul, TAG_DONE);
  361.  
  362.   if (IsFrodoSC) {
  363.     GT_SetGadgetAttrs(PrefsGadgets[GDX_ScreenType], PrefsWnd, NULL,
  364.       GA_Disabled, TRUE, TAG_DONE);
  365.     GT_SetGadgetAttrs(PrefsGadgets[GDX_Collisions], PrefsWnd, NULL,
  366.       GA_Disabled, TRUE, TAG_DONE);
  367.     GT_SetGadgetAttrs(PrefsGadgets[GDX_NormalCycles], PrefsWnd, NULL,
  368.       GA_Disabled, TRUE, TAG_DONE);
  369.     GT_SetGadgetAttrs(PrefsGadgets[GDX_BadLineCycles], PrefsWnd, NULL,
  370.       GA_Disabled, TRUE, TAG_DONE);
  371.     GT_SetGadgetAttrs(PrefsGadgets[GDX_CIACycles], PrefsWnd, NULL,
  372.       GA_Disabled, TRUE, TAG_DONE);
  373.     GT_SetGadgetAttrs(PrefsGadgets[GDX_DirectVideo], PrefsWnd, NULL,
  374.       GA_Disabled, TRUE, TAG_DONE);
  375.   }
  376. }
  377.  
  378.  
  379. /*
  380.  *  IDCMP-Messages eines Fensters handhaben
  381.  *  -1: Cancel, 1: OK, 0: weitermachen
  382.  */
  383.  
  384. int handle_IDCMP(Preferences *p, struct Window *win, int done)
  385. {
  386.   struct IntuiMessage *msg;
  387.   ULONG class;
  388.   UWORD code;
  389.   UWORD menu_number;
  390.   struct Gadget *gad;
  391.   struct MenuItem *item;
  392.  
  393.   while (!done && (msg = GT_GetIMsg(win->UserPort))) {
  394.     class = msg->Class;
  395.     code = msg->Code;
  396.     gad = (struct Gadget *)msg->IAddress;
  397.  
  398.     GT_ReplyIMsg(msg);
  399.  
  400.     switch (class) {
  401.       case IDCMP_GADGETUP:
  402.         done = handle_gadget(p, win, gad, code, done);
  403.         break;
  404.  
  405.       case IDCMP_MENUPICK:
  406.         menu_number = code;
  407.         while (!done && (menu_number != MENUNULL)) {
  408.           item = ItemAddress(win->MenuStrip, menu_number);
  409.           done = handle_menu(p, win, MENUNUM(menu_number), ITEMNUM(menu_number), done);
  410.           menu_number = item->NextSelect;
  411.         }
  412.         break;
  413.  
  414.       case IDCMP_VANILLAKEY:
  415.         done = handle_key(p, win, code, done);
  416.         break;
  417.  
  418.       case IDCMP_REFRESHWINDOW:
  419.         GT_BeginRefresh(win);
  420.         GT_EndRefresh(win, TRUE);
  421.         break;
  422.     }
  423.   }
  424.  
  425.   return done;
  426. }
  427.  
  428.  
  429. /*
  430.  *  Gadget wurde betätigt
  431.  *  -1: Cancel, 1: OK, 0: weitermachen
  432.  */
  433.  
  434. int handle_gadget(Preferences *p, struct Window *win, struct Gadget *gad, UWORD code, int done)
  435. {
  436.   switch (gad->GadgetID) {
  437.     case GD_OK:
  438.       done = 1;
  439.       break;
  440.  
  441.     case GD_Cancel:
  442.       done = -1;
  443.       break;
  444.  
  445.     case GD_Save:
  446.       save_prefs(p);
  447.       break;
  448.  
  449.     case GD_Joystick1On:
  450.       p->joystick_1_on = p->joystick_1_on ? 0 : -1;
  451.       break;
  452.  
  453.     case GD_Joystick2On:
  454.       p->joystick_2_on = p->joystick_2_on ? 0 : -1;
  455.       break;
  456.  
  457.     case GD_JoystickSwap:
  458.       p->joystick_swap = p->joystick_swap ? 0 : -1;
  459.       break;
  460.  
  461.     case GD_SIDType:
  462.       p->SID_type = code;
  463.       break;
  464.  
  465.     case GD_OtherIEC:
  466.       p->other_IEC = p->other_IEC ? 0 : -1;
  467.       break;
  468.  
  469.     case GD_KeyboardYZ:
  470.       p->keyboard_yz = p->keyboard_yz ? 0 : -1;
  471.       break;
  472.  
  473.     case GD_Collisions:
  474.       p->collisions = p->collisions ? 0 : -1;
  475.       break;
  476.  
  477.     case GD_MapSlash:
  478.       p->map_slash = p->map_slash ? 0 : -1;
  479.       break;
  480.  
  481.     case GD_FastReset:
  482.       p->fast_reset = p->fast_reset ? 0 : -1;
  483.       break;
  484.  
  485.     case GD_LimitSpeed:
  486.       p->limit_speed = p->limit_speed ? 0 : -1;
  487.       break;
  488.  
  489.     case GD_DirectVideo:
  490.       if (!PrefsFromEmul)
  491.         p->direct_video = p->direct_video ? 0 : -1;
  492.       break;
  493.  
  494.     case GD_ScreenType:
  495.       if (!PrefsFromEmul)
  496.         p->screen_type = code;
  497.       ghost_gadgets(p);
  498.       break;
  499.  
  500.     case GD_GetDisplayID:
  501.       if (!PrefsFromEmul)
  502.         if (request_display_id(win, &p->display_id, &p->overscan))
  503.           set_display_id_gadget(p);
  504.       break;
  505.  
  506.     case GD_Drv8Type:
  507.       p->drv_8_type = code;
  508.       ghost_gadgets(p);
  509.       break;
  510.  
  511.     case GD_Drv9Type:
  512.       p->drv_9_type = code;
  513.       ghost_gadgets(p);
  514.       break;
  515.  
  516.     case GD_Drv10Type:
  517.       p->drv_10_type = code;
  518.       ghost_gadgets(p);
  519.       break;
  520.  
  521.     case GD_Drv11Type:
  522.       p->drv_11_type = code;
  523.       ghost_gadgets(p);
  524.       break;
  525.  
  526.     case GD_GetDir8:
  527.       strncpy(p->dir_8, GetString(PrefsGadgets[GDX_Dir8]), 256);
  528.       if (request_drive(win, p->drv_8_type, p->dir_8))
  529.         GT_SetGadgetAttrs(PrefsGadgets[GDX_Dir8], PrefsWnd, NULL,
  530.           GTST_String, p->dir_8, TAG_DONE);
  531.       break;
  532.  
  533.     case GD_GetDir9:
  534.       strncpy(p->dir_9, GetString(PrefsGadgets[GDX_Dir9]), 256);
  535.       if (request_drive(win, p->drv_9_type, p->dir_9))
  536.         GT_SetGadgetAttrs(PrefsGadgets[GDX_Dir9], PrefsWnd, NULL,
  537.           GTST_String, p->dir_9, TAG_DONE);
  538.       break;
  539.  
  540.     case GD_GetDir10:
  541.       strncpy(p->dir_10, GetString(PrefsGadgets[GDX_Dir10]), 256);
  542.       if (request_drive(win, p->drv_10_type, p->dir_10))
  543.         GT_SetGadgetAttrs(PrefsGadgets[GDX_Dir10], PrefsWnd, NULL,
  544.           GTST_String, p->dir_10, TAG_DONE);
  545.       break;
  546.  
  547.     case GD_GetDir11:
  548.       strncpy(p->dir_11, GetString(PrefsGadgets[GDX_Dir11]), 256);
  549.       if (request_drive(win, p->drv_11_type, p->dir_11))
  550.         GT_SetGadgetAttrs(PrefsGadgets[GDX_Dir11], PrefsWnd, NULL,
  551.           GTST_String, p->dir_11, TAG_DONE);
  552.       break;
  553.   }
  554.  
  555.   return done;
  556. }
  557.  
  558.  
  559. /*
  560.  *  Menü wurde ausgewählt
  561.  *  -1: Cancel, 1: OK, 0: weitermachen
  562.  */
  563.  
  564. int handle_menu(Preferences *p, struct Window *win, int menu, int item, int done)
  565. {
  566.   if (menu == 0) {
  567.     switch (item) {
  568.       case 0:        // Open
  569.         open_prefs_as(p);
  570.         break;
  571.  
  572.       case 2:        // Save
  573.         save_prefs(p);
  574.         break;
  575.  
  576.       case 3:        // Save As
  577.         save_prefs_as(p);
  578.         break;
  579.  
  580.       case 5:        // About
  581.         EasyRequest(win, &about_req, NULL, VERSION, REVISION);
  582.         break;
  583.  
  584.       case 7:        // OK
  585.         done = 1;
  586.         break;
  587.  
  588.       case 8:        // Cancel
  589.         done = -1;
  590.         break;
  591.     }
  592.   }
  593.  
  594.   return done;
  595. }
  596.  
  597.  
  598. /*
  599.  *  Taste wurde gedrückt
  600.  *  -1: Cancel, 1: OK, 0: weitermachen
  601.  */
  602.  
  603. int handle_key(Preferences *p, struct Window *win, UWORD code, int done)
  604. {
  605.   switch (code) {
  606.     case 'o':        // OK
  607.     case 'O':
  608.       done = 1;
  609.       break;
  610.  
  611.     case 'c':        // Cancel
  612.     case 'C':
  613.       done = -1;
  614.       break;
  615.  
  616.     case 's':
  617.     case 'S':
  618.       save_prefs(p);
  619.       break;
  620.   }
  621.  
  622.   return done;
  623. }
  624.  
  625.  
  626. /*
  627.  *  Screenmode-Requester
  628.  *  FALSE: Cancel, TRUE: OK
  629.  */
  630.  
  631. int request_display_id(struct Window *win, ULONG *display_id, UWORD *overscan)
  632. {
  633.   struct ScreenModeRequester *sm;
  634.   int result = FALSE;
  635.  
  636.   if (sm = AllocAslRequestTags(ASL_ScreenModeRequest,
  637.     ASLSM_TitleText, GetStr(MSG_SCREENHAIL),
  638.     ASLSM_Window, win,
  639.     ASLSM_SleepWindow, TRUE,
  640.     ASLSM_PropertyMask, DIPF_IS_HAM | DIPF_IS_EXTRAHALFBRITE | DIPF_IS_DUALPF,
  641.     ASLSM_PropertyFlags, 0,
  642.     ASLSM_InitialDisplayID, *display_id,
  643.     ASLSM_InitialOverscanType, *overscan,
  644.     TAG_DONE)) {
  645.  
  646.     if (result = AslRequest(sm, NULL)) {
  647.       *display_id = sm->sm_DisplayID;
  648.       *overscan = sm->sm_OverscanType;
  649.     }
  650.  
  651.     FreeAslRequest(sm);
  652.   }
  653.  
  654.   return result;
  655. }
  656.  
  657.  
  658. /*
  659.  *  Requester für Verzeichnis/.d64-Datei
  660.  *  FALSE: Cancel, TRUE: OK
  661.  */
  662.  
  663. int request_drive(struct Window *win, UWORD type, char *str)
  664. {
  665.   struct FileRequester *fr;
  666.   int result = FALSE;
  667.  
  668.   if (type == DRVTYPE_D64) {
  669.     return request_file(win, str, MSG_D64HAIL, FALSE);
  670.  
  671.   } else {
  672.     if (fr = AllocAslRequestTags(ASL_FileRequest,
  673.       ASLFR_TitleText, GetStr(MSG_DIRHAIL),
  674.       ASLFR_InitialDrawer, str,
  675.       ASLFR_Window, win,
  676.       ASLFR_SleepWindow, TRUE,
  677.       ASLFR_Flags2, FRF_REJECTICONS | FRF_DRAWERSONLY,
  678.       TAG_DONE)) {
  679.  
  680.       if (result = AslRequest(fr, NULL))
  681.         strncpy(str, fr->fr_Drawer, 256);
  682.  
  683.       FreeAslRequest(fr);
  684.     }
  685.   }
  686.  
  687.   return result;
  688. }
  689.  
  690.  
  691. /*
  692.  *  Einfacher Dateirequester
  693.  *  FALSE: Cancel, TRUE: OK
  694.  */
  695.  
  696. int request_file(struct Window *win, char *name, int hail, int save)
  697. {
  698.   struct FileRequester *fr;
  699.   int result = FALSE;
  700.   char dir[256];
  701.   char file[256];
  702.   char *s;
  703.  
  704.   // Pfad und Dateinamen aufteilen (dir, file)
  705.   strcpy(dir, name);
  706.   s = FilePart(dir);
  707.   strcpy(file, s);
  708.   *s = 0;
  709.  
  710.   if (fr = AllocAslRequestTags(ASL_FileRequest,
  711.     ASLFR_TitleText, GetStr(hail),
  712.     ASLFR_Window, win,
  713.     ASLFR_SleepWindow, TRUE,
  714.     ASLFR_InitialDrawer, dir,
  715.     ASLFR_InitialFile, file,
  716.     ASLFR_Flags1, save ? FRF_DOSAVEMODE : 0,
  717.     ASLFR_Flags2, FRF_REJECTICONS,
  718.     TAG_DONE)) {
  719.  
  720.     if (result = AslRequest(fr, NULL)) {
  721.       strncpy(name, fr->fr_Drawer, 256);
  722.       AddPart(name, fr->fr_File, 256);
  723.     }
  724.  
  725.     FreeAslRequest(fr);
  726.   }
  727.  
  728.   return result;
  729. }
  730.  
  731.  
  732. /*
  733.  *  Einstellungen laden
  734.  */
  735.  
  736. void OpenPrefs(Preferences *p)
  737. {
  738.   BPTR fh;
  739.  
  740.   if (fh = Open(PrefsName, MODE_OLDFILE)) {
  741.     Read(fh, p, sizeof(Preferences));
  742.     Close(fh);
  743.  
  744.     // Altes drv_?_is_IEC konvertieren
  745.     if (p->drv_8_type == 0xffff)
  746.       p->drv_8_type = DRVTYPE_IEC;
  747.     if (p->drv_9_type == 0xffff)
  748.       p->drv_9_type = DRVTYPE_IEC;
  749.     if (p->drv_10_type == 0xffff)
  750.       p->drv_10_type = DRVTYPE_IEC;
  751.     if (p->drv_11_type == 0xffff)
  752.       p->drv_11_type = DRVTYPE_IEC;
  753.  
  754.     // Altes use_SID_card konvertieren
  755.     if (p->SID_type == 0xffff)
  756.       p->SID_type = SIDTYPE_CARD;
  757.   }  
  758. }
  759.  
  760.  
  761. /*
  762.  *  Einstellungen laden (Dateirequester, ändert PrefsName)
  763.  */
  764.  
  765. void open_prefs_as(Preferences *p)
  766. {
  767.   if (request_file(PrefsWnd, PrefsName, MSG_PREFSHAIL, FALSE)) {
  768.     OpenPrefs(p);
  769.     set_gadgets(p);
  770.   }
  771. }
  772.  
  773.  
  774. /*
  775.  *  Einstellungen unter aktuellem Namen speichern
  776.  */
  777.  
  778. void save_prefs(Preferences *p)
  779. {
  780.   BPTR fh;
  781.   struct DiskObject *dobj;
  782.  
  783.   get_gadgets(p);
  784.  
  785.   if (fh = Open(PrefsName, MODE_NEWFILE)) {
  786.     Write(fh, p, sizeof(Preferences));
  787.     Close(fh);
  788.  
  789.     if (dobj = GetDiskObject(PrefsName))
  790.       FreeDiskObject(dobj);
  791.     else
  792.       PutDiskObject(PrefsName, &PrefsIcon);
  793.   }
  794. }
  795.  
  796.  
  797. /*
  798.  *  Einstellungen speichern (Dateirequester, ändert PrefsName)
  799.  */
  800.  
  801. void save_prefs_as(Preferences *p)
  802. {
  803.   if (request_file(PrefsWnd, PrefsName, MSG_PREFSHAIL, TRUE))
  804.     save_prefs(p);
  805. }
  806.  
  807.  
  808. /*
  809.  *  Lokalisierungen vornehmen
  810.  */
  811.  
  812. const int gadget_table[] = {
  813.   GDX_OK, MSG_OK_GAD,
  814.   GDX_Save, MSG_SAVE_GAD,
  815.   GDX_Cancel, MSG_CANCEL_GAD,
  816.   GDX_Joystick1On, MSG_JOYSTICK1ON_GAD,
  817.   GDX_Joystick2On, MSG_JOYSTICK2ON_GAD,
  818.   GDX_JoystickSwap, MSG_JOYSTICKSWAP_GAD,
  819.   GDX_GetDisplayID, MSG_GETDISPLAYID_GAD,
  820.   GDX_DisplayID, MSG_DISPLAYID_GAD,
  821.   GDX_ScreenType, MSG_SCREENTYPE_GAD,
  822.   GDX_NormalCycles, MSG_NORMALCYCLES_GAD,
  823.   GDX_BadLineCycles, MSG_BADLINECYCLES_GAD,
  824.   GDX_CIACycles, MSG_CIACYCLES_GAD,
  825.   GDX_Drv8Type, MSG_DIR8_GAD,
  826.   GDX_Drv9Type, MSG_DIR9_GAD,
  827.   GDX_Drv10Type, MSG_DIR10_GAD,
  828.   GDX_Drv11Type, MSG_DIR11_GAD,
  829.   GDX_SIDType, MSG_SIDTYPE_GAD,
  830.   GDX_OtherIEC, MSG_OTHERIEC_GAD,
  831.   GDX_KeyboardYZ, MSG_KEYBOARDYZ_GAD,
  832.   GDX_Collisions, MSG_COLLISIONS_GAD,
  833.   GDX_MapSlash, MSG_MAPSLASH_GAD,
  834.   GDX_FastReset, MSG_FASTRESET_GAD,
  835.   GDX_SkipLatch, MSG_SKIPLATCH_GAD,
  836.   GDX_LimitSpeed, MSG_LIMITSPEED_GAD,
  837.   GDX_DirectVideo, MSG_DIRECTVIDEO_GAD,
  838.   -1
  839. };
  840.  
  841. void LocalizePrefs(void)
  842. {
  843.   int i;
  844.  
  845.   about_req.es_Title = GetStr(IsFrodoSC ? MSG_ABOUTTITLESC : MSG_ABOUTTITLE);
  846.   about_req.es_TextFormat = GetStr(IsFrodoSC ? MSG_ABOUTSC_REQ : MSG_ABOUT_REQ);
  847.   about_req.es_GadgetFormat = GetStr(MSG_REQGADS5);
  848.  
  849.   PrefsWdt = GetStr(MSG_PREFSTITLE);
  850.  
  851.   PrefsNewMenu[0].nm_Label = GetStr(MSG_PROJECT_MENU);
  852.   PrefsNewMenu[1].nm_Label = GetStr(MSG_OPEN_MENU);
  853.   PrefsNewMenu[3].nm_Label = GetStr(MSG_SAVE_MENU);
  854.   PrefsNewMenu[4].nm_Label = GetStr(MSG_SAVEAS_MENU);
  855.   PrefsNewMenu[6].nm_Label = GetStr(IsFrodoSC ? MSG_ABOUTSC_MENU : MSG_ABOUT_MENU);
  856.   PrefsNewMenu[8].nm_Label = GetStr(MSG_OK_MENU);
  857.   PrefsNewMenu[9].nm_Label = GetStr(MSG_CANCEL_MENU);
  858.  
  859.   for (i=0; gadget_table[i]>=0; i+=2)
  860.     PrefsNGad[gadget_table[i]].ng_GadgetText = GetStr(gadget_table[i+1]);
  861. }
  862.