home *** CD-ROM | disk | FTP | other *** search
/ Magazyn Amiga Shareware Floppies / ma15.dms / ma15.adf / Yak / Source / settings.c < prev    next >
C/C++ Source or Header  |  1993-05-17  |  7KB  |  301 lines

  1.  /*
  2.  * Variables controlling Yak settings.
  3.  * Routines for initialisation at startup.
  4.  */
  5.  
  6. #include <exec/types.h>
  7. #include <dos/dos.h>
  8. #include <dos/dosextens.h>
  9. #include <libraries/commodities.h>
  10. #include <proto/dos.h>
  11. #include <string.h>
  12.  
  13. #include "yak.h"
  14. #include "hotkey_types.h"
  15. #include "popup.h"
  16.  
  17. /* local prototypes */
  18. static BOOL __regargs FWriteLong(BPTR fh, LONG n);
  19. static BOOL __regargs FReadLong(BPTR fh, LONG *n);
  20. static BOOL __regargs FWriteString(BPTR fh, char *buf);
  21. static BOOL __regargs FReadString(BPTR fh, char *buf, LONG len);
  22. static void LoadHotKeys(void);
  23. static void SaveHotKeys(void);
  24.  
  25. #define DEF_VOLUME    48
  26. LONG    click_volume = DEF_VOLUME;        /* used for keyclick */
  27.  
  28. #define DEF_BLANKSECS    300
  29. LONG    blanksecs = DEF_BLANKSECS;
  30. LONG    blanktimeout;
  31. LONG    blankcount;                /* countdown to blank-time */
  32.  
  33. #define DEF_MBLANKSECS    5
  34. LONG    mouseblank = MB_SPRITES;
  35. LONG    mblanksecs = DEF_MBLANKSECS;
  36. LONG    mblanktimeout;
  37. LONG    mblankcount;            /* countdown to mouse-blank-time */
  38.  
  39. TOGGLEDATA toggles[] = {        /* -1 means UNUSED */
  40.     TRUE,    GDX_CTFCheck,
  41.     TRUE,    GDX_CTBCheck,
  42.     TRUE,    GDX_AutoCheck,
  43.     FALSE,    GDX_KeyActCheck,
  44.     TRUE,    GDX_ScrCycleCheck,
  45.     FALSE,    GDX_AutoPopCheck,
  46.     FALSE,    GDX_RMBActCheck,
  47.     FALSE,    -1,
  48.     FALSE,    -1,
  49.     FALSE,    GDX_WildStarCheck,
  50.     TRUE,    GDX_ScrActCheck
  51. };
  52.  
  53. PATTERNDATA patterns[NUM_PATTERNS] = {
  54.     { "#?", NULL },            /* autoactivation screens */
  55.     { "#?", NULL },            /* click screens */
  56.     { "~(Workbench)", NULL },    /* autopop windows */
  57.     { "~(Workbench)", NULL }    /* click windows */
  58. };
  59.  
  60. /* 1.5 format
  61.  * Routines to load/save config file for Yak.
  62.  * Should handle config files in upward-compatible manner.
  63.  * File format:
  64.  * 
  65.  *     LONG ID
  66.  *     LONG NUM_TOGGLES
  67.  *     BOOL toggles
  68.  *     LONG NUM_HOTKEYS        **REMOVED @ v1.5
  69.  *     STR hotkey1 '\n'            :
  70.  *         :                :
  71.  *     STR hotkeyN '\n'            :
  72.  *     LONG NUM_PATTERNS
  73.  *    STR pattern1 '\n'
  74.  *         :
  75.  *    STR patternN '\n'
  76.  *     STR popcommand '\n'        **REMOVED @ v1.5
  77.  *    STR datefmt '\n'        **REMOVED @ v1.5
  78.  *     LONG click_volume, blanksecs
  79.  *    LONG mblanksecs            **ADDED @ v1.3b
  80.  *    LONG mouseblank            **ADDED @ v1.3e
  81.  */
  82.  
  83. #define CONFIG_ID    0x594b3135    /* YK15 */
  84.  
  85. /* write a LONG to a file (in binary format) - returns success*/
  86. static BOOL __regargs
  87. FWriteLong(BPTR fh, LONG n)
  88. {
  89.     return (BOOL)(FWrite(fh, (UBYTE *)&n, sizeof(LONG), 1) == 1);
  90. }
  91.  
  92. /* read a LONG to a file (in binary format) - returns success */
  93. static BOOL __regargs
  94. FReadLong(BPTR fh, LONG *n)
  95. {
  96.     return (BOOL)(FRead(fh, (UBYTE *)n, sizeof(LONG), 1) == 1);
  97. }
  98.  
  99. /* write a string to a file (in binary format) - returns success*/
  100. /* '\n' is appended */
  101. static BOOL __regargs
  102. FWriteString(BPTR fh, char *buf)
  103. {
  104.     FPuts(fh, buf);
  105.     FPutC(fh, '\n');
  106.     return (BOOL)(IoErr() == 0);
  107. }
  108.  
  109. /* read a string to a file (in binary format) - returns success */
  110. /* '\n' is stripped and buf null-terminated; assumes dest large enough */
  111. static BOOL __regargs
  112. FReadString(BPTR fh, char *buf, LONG len)
  113. {
  114.     FGets(fh, buf, len-1);
  115.     buf[strlen(buf)-1] = '\0';    /* '\n' --> '\0' */
  116.     return (BOOL)(IoErr() == 0);
  117. }
  118.  
  119. /* save current settings to config file */
  120. void
  121. SaveSettings()
  122. {
  123.     BPTR    fh;
  124.     UWORD    i;
  125.  
  126.     if (fh = Open(CONFIG_FILE, MODE_NEWFILE))
  127.     {
  128.         FWriteLong(fh, CONFIG_ID);
  129.  
  130.         /* toggles */
  131.         FWriteLong(fh, NUM_TOGGLES);
  132.         for (i = 0; i < NUM_TOGGLES; i++)
  133.             FWrite(fh, (UBYTE *)&toggles[i].pos, sizeof(BOOL), 1);
  134.  
  135.         /* patterns */
  136.         FWriteLong(fh, NUM_PATTERNS);
  137.         for (i = 0; i < NUM_PATTERNS; i++)
  138.             FWriteString(fh, patterns[i].patstr);
  139.  
  140.         /* miscellaneous */
  141.         FWriteLong(fh, click_volume);
  142.         FWriteLong(fh, blanksecs);
  143.         FWriteLong(fh, mblanksecs);
  144.         FWriteLong(fh, mouseblank);
  145.  
  146.         Close(fh);
  147.     }
  148.  
  149.     SaveHotKeys();
  150. }
  151.  
  152. /* load current settings from file */
  153. void
  154. LoadSettings()
  155. {
  156.     BPTR    fh;
  157.     UWORD    i;
  158.     LONG    n;
  159.  
  160.     if (fh = Open(CONFIG_FILE, MODE_OLDFILE))
  161.     {
  162.         FReadLong(fh, &n);
  163.         if (n == CONFIG_ID)
  164.         {
  165.             /* toggles */
  166.             FReadLong(fh, &n);
  167.             for (i = 0; i < n; i++)
  168.                 FRead(fh, (UBYTE *)&toggles[i].pos, sizeof(BOOL), 1);
  169.  
  170.             /* patterns */
  171.             FReadLong(fh, &n);
  172.             for (i = 0; i < n; i++)
  173.                 FReadString(fh, patterns[i].patstr, PATLEN+1);
  174.  
  175.             /* miscellaneous */
  176.             FReadLong(fh, &click_volume);
  177.             FReadLong(fh, &blanksecs);
  178.             if (!FReadLong(fh, &mblanksecs))    /* none there */
  179.                 mblanksecs = DEF_MBLANKSECS;
  180.             if (!FReadLong(fh, &mouseblank))    /* none there */
  181.                 mouseblank = MB_SPRITES;
  182.         }
  183.         else PostError("Invalid config file");
  184.         Close(fh);
  185.     }
  186.  
  187.     DeleteYakHotKeyList();        /* delete old keys */
  188.     LoadHotKeys();            /* and load new ones */
  189.  
  190.     /* set-up patterns */
  191.     for (i = 0; i < NUM_PATTERNS; i++)
  192.         InitPattern(NULL, i);
  193.  
  194.     if (wildstar)
  195.         WILDSTARON;
  196.     else
  197.         wildstar = ((struct RootNode *)(DOSBase->dl_Root))->rn_Flags & RNF_WILDSTAR;
  198.     blankcount = blanktimeout = 10*blanksecs;
  199.     mblankcount = mblanktimeout = 10*mblanksecs;
  200. }
  201.  
  202. /*
  203.  *     HOTKEY FILE FORMAT
  204.  * 
  205.  *     LONG    ID    'YKK1'
  206.  *     LONG NUM_HOTKEYS
  207.  *     UWORD type1
  208.  *     UWORD opts1
  209.  *     STR hotkey1 '\n'
  210.  *     STR argstr1 '\n'
  211.  *         :
  212.  *     STR hotkeyN '\n'
  213.  */
  214. #define HOTKEY_ID 0x594B4B31    /* 'YKK1' */
  215.  
  216. static void
  217. SaveHotKeys()
  218. {
  219.     YakHotKey *yhk;
  220.     BPTR    fh;
  221.     UWORD    type, i;
  222.  
  223.     if (fh = Open(HOTKEY_FILE, MODE_NEWFILE))
  224.     {
  225.         FWriteLong(fh, HOTKEY_ID);
  226.  
  227.         FWriteLong(fh, num_hkeys);
  228.         for (type = 0; type < NUM_HOTKEY_TYPES; type++)
  229.             for (yhk = (YakHotKey *)keylist(type)->lh_Head, i = 0;
  230.                  i < numkeys(type);
  231.                  i++, yhk = (YakHotKey *)yhk->yhk_Node.ln_Succ)
  232.             {
  233.                 FWrite(fh, (UBYTE *)&yhk->yhk_Type, sizeof(UWORD), 1);
  234.                 FWrite(fh, (UBYTE *)&yhk->yhk_Options, sizeof(UWORD), 1);
  235.                 FWriteString(fh, yhk->yhk_KeyDef);
  236.                 FWriteString(fh, yhk->yhk_ArgStr ? yhk->yhk_ArgStr : "");
  237.             }
  238.  
  239.         Close(fh);
  240.     }
  241. }
  242.  
  243. static void
  244. LoadHotKeys()
  245. {
  246.     YakHotKey *yhk;
  247.     char    *buf;
  248.     UWORD    type, opts;
  249.     BPTR    fh;
  250.     LONG    n;
  251.     UWORD    i;
  252.  
  253.     if (!(buf = AllocVec(512, 0L)))
  254.     {
  255.         PostError("No memory");
  256.         return;
  257.     }
  258.  
  259.     if (fh = Open(HOTKEY_FILE, MODE_OLDFILE))
  260.     {
  261.         FReadLong(fh, &n);
  262.  
  263.         if (n == HOTKEY_ID)
  264.         {
  265.             FReadLong(fh, &n);
  266.             for (i = 0; i < n; i++)
  267.             {
  268.               FRead(fh, (UBYTE *)&type, sizeof(UWORD), 1);
  269.               FRead(fh, (UBYTE *)&opts, sizeof(UWORD), 1);
  270.  
  271.               if (type >= NUM_HOTKEY_TYPES)
  272.               {
  273.                 /* ignore key definition */
  274.                 FReadString(fh, buf, 512);
  275.                 FReadString(fh, buf, 512);
  276.                 continue;
  277.               }
  278.  
  279.               if (yhk = NewYakHotKey(type))
  280.               {
  281.                 yhk->yhk_Options = opts;
  282.                 FReadString(fh, buf, 512);
  283.                 if (ModifyYHKKeyDef(yhk, buf))
  284.                 {
  285.                   FReadString(fh, buf, 512);
  286.                   if (!buf[0] || ModifyYHKArgStr(yhk, buf))
  287.                   {
  288.                 continue;
  289.                   }
  290.                  }
  291.               }
  292.               PostError("Error reading hotkey file");
  293.               DeleteYakHotKeyList();
  294.               break;
  295.             }
  296.         }
  297.         Close(fh);
  298.     }
  299.     FreeVec(buf);
  300. }
  301.