summaryrefslogtreecommitdiff
path: root/maccaml/prefs.c
blob: 70f208550a7f50069f34e469ecf519582fa00d0b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
/***********************************************************************/
/*                                                                     */
/*                           Objective Caml                            */
/*                                                                     */
/*             Damien Doligez, projet Para, INRIA Rocquencourt         */
/*                                                                     */
/*  Copyright 1998 Institut National de Recherche en Informatique et   */
/*  en Automatique.  All rights reserved.  This file is distributed    */
/*  under the terms of the GNU Library General Public License, with    */
/*  the special exception on linking described in file ../LICENSE.     */
/*                                                                     */
/***********************************************************************/

/* $Id$ */

#include "main.h"

#define kPrefResource 1000

struct prefs prefs;
static struct prefs defpref;

static void InitPrefs (void)
{
  TextStyle defstyle;

  defpref.version = PREF_VERSION;
  defpref.asksavetop = 0;
  WinToplevelStdState (&defpref.toppos);
  WinGraphicsStdState (&defpref.graphpos);
  WinClipboardStdState (&defpref.clippos);
  GetFNum ("\pmonaco", &defstyle.tsFont);
  defstyle.tsSize = 9;
  defstyle.tsFace = 0;
  defstyle.tsColor.red = 0;
  defstyle.tsColor.green = 0;
  defstyle.tsColor.blue = 0;
  defpref.text = defpref.unread = defpref.input = defpref.output
    = defpref.errors = defstyle;

  defpref.unread.tsColor.green = 35000;
  defpref.input.tsColor.blue = 65535;
  defpref.errors.tsColor.red = 50000;
  defpref.errors.tsFace = underline;
}

void ReadPrefs (void)
{
  short err;
  short vrefnum;
  long dirid;
  short refnum = -1;
  Handle prefsH = NULL;
  Str255 prefsfilename;
  FSSpec spec;

  InitPrefs ();
  GetIndString (prefsfilename, kMiscStrings, kPrefsFileNameIdx);
  err = FindFolder (kOnSystemDisk, kPreferencesFolderType, kCreateFolder,
                    &vrefnum, &dirid);
  if (err != noErr) goto cantread;
  err = FSMakeFSSpec (vrefnum, dirid, prefsfilename, &spec);
  if (err != noErr) goto cantread;
  refnum = FSpOpenResFile (&spec, fsRdPerm);
  if (refnum == -1) goto cantread;
  prefsH = Get1Resource ('Oprf', kPrefResource);
  if (prefsH == NULL) goto cantread;
  if (GetHandleSize (prefsH) != sizeof (prefs)) goto cantread;
  if (**(long **)prefsH != PREF_VERSION) goto cantread;
  memmove (&prefs, *prefsH, sizeof (prefs));
  CloseResFile (refnum);
  return;

  cantread:
  if (refnum != -1) CloseResFile (refnum);
  prefs = defpref;
}

void WritePrefs (void)
{
  short err;
  short vrefnum;
  long dirid;
  short refnum = -1;
  Handle prefsH = NULL;
  Str255 prefsfilename;
  FSSpec spec;
  Handle h;

  GetIndString (prefsfilename, kMiscStrings, kPrefsFileNameIdx);
  err = FindFolder (kOnSystemDisk, kPreferencesFolderType, kCreateFolder,
                    &vrefnum, &dirid);
  if (err != noErr) goto cantwrite;
  err = FSMakeFSSpec (vrefnum, dirid, prefsfilename, &spec);
  if (err != noErr && err != fnfErr) goto cantwrite;

  if (err == fnfErr){
    if (!memcmp (&prefs, &defpref, sizeof (prefs))) return;
    else FSpCreateResFile (&spec, 0, 0, smSystemScript);
  }
  refnum = FSpOpenResFile (&spec, fsRdWrPerm);
  if (refnum == -1) goto cantwrite;

  prefsH = Get1Resource ('Oprf', kPrefResource);
  if (prefsH == NULL){
    err = AllocHandle (sizeof (prefs), (Handle *) &prefsH);
    if (err != noErr) goto cantwrite;
    AddResource (prefsH, 'Oprf', kPrefResource, "\pO'Caml prefs");
  }
  SetHandleSize (prefsH, sizeof (prefs));
  if (MemError () != noErr) goto cantwrite;
  memmove (*prefsH, &prefs, sizeof (prefs));
  ChangedResource (prefsH);

  h = GetResource ('STR ', kPrefsDescriptionStr);
  if (h != NULL){
    DetachResource (h);
    AddResource (h, 'STR ', kApplicationMissing, NULL);
    ChangedResource (h);
  }

  CloseResFile (refnum);
  return;

  cantwrite:
  if (refnum != -1) CloseResFile (refnum);
}