253 lines
5.5 KiB
C
253 lines
5.5 KiB
C
/* Copyright 2000 by Abacus Research and
|
|
* Development, Inc. All rights reserved.
|
|
*/
|
|
|
|
#if !defined (OMIT_RCSID_STRINGS)
|
|
char ROMlib_rcsid_appearance[] =
|
|
"$Id: appearance.c 88 2005-05-25 03:59:37Z ctm $";
|
|
#endif
|
|
|
|
/* Forward declarations in ResourceMgr.h (DO NOT DELETE THIS LINE) */
|
|
|
|
#include "rsys/common.h"
|
|
#include "rsys/appearance.h"
|
|
|
|
#include "ResourceMgr.h"
|
|
#include "FileMgr.h"
|
|
#include "MemoryMgr.h"
|
|
#include "OSUtil.h"
|
|
|
|
#include "rsys/error.h"
|
|
#include "rsys/options.h"
|
|
|
|
PRIVATE appearance_t appearance = appearance_sys7;
|
|
|
|
/*
|
|
* NOTE: Order of following entries must correspond to appearance_t enum
|
|
*/
|
|
|
|
PRIVATE StringPtr res_filenames[] =
|
|
{
|
|
(StringPtr) "\010mac.rsrc",
|
|
(StringPtr) "\014windows.rsrc",
|
|
};
|
|
|
|
/* Exactly the same as CountTypes, except only the resource file with the
|
|
refnum of rn is consulted. */
|
|
|
|
PRIVATE INTEGER
|
|
CountTypesRN (INTEGER rn)
|
|
{
|
|
INTEGER savern, retval;
|
|
|
|
savern = CurResFile ();
|
|
UseResFile (rn);
|
|
retval = Count1Types ();
|
|
UseResFile (savern);
|
|
return retval;
|
|
}
|
|
|
|
/* Exactly the same as CountResources, except only the resource file with the
|
|
refnum rn is consulted. */
|
|
|
|
PRIVATE INTEGER
|
|
CountResourcesRN (INTEGER rn, ResType type)
|
|
{
|
|
INTEGER savern, retval;
|
|
|
|
savern = CurResFile ();
|
|
UseResFile (rn);
|
|
retval = Count1Resources (type);
|
|
UseResFile (savern);
|
|
return retval;
|
|
}
|
|
|
|
/* Exactly like GetResource, except limited to the file specified by rn. */
|
|
|
|
PRIVATE Handle
|
|
GetResourceRN (INTEGER rn, ResType type, INTEGER id)
|
|
{
|
|
INTEGER savern;
|
|
Handle retval;
|
|
|
|
savern = CurResFile ();
|
|
UseResFile (rn);
|
|
retval = Get1Resource (type, id);
|
|
UseResFile (savern);
|
|
return retval;
|
|
}
|
|
|
|
/* Exactly the same as AddResource, except its action is limited to the file
|
|
with the refnum rn. */
|
|
|
|
PRIVATE void
|
|
AddResourceRN (INTEGER rn, Handle h, ResType type, INTEGER id, Str255 name)
|
|
{
|
|
Handle current_handle;
|
|
|
|
current_handle = GetResourceRN (rn, type, id);
|
|
if (current_handle)
|
|
{
|
|
if (current_handle != h)
|
|
{
|
|
Size new_size;
|
|
OSErr err;
|
|
|
|
LoadResource (current_handle);
|
|
new_size = GetHandleSize (h);
|
|
SetHandleSize (current_handle, new_size);
|
|
err = MemError ();
|
|
if (err != noErr)
|
|
warning_unexpected ("err = %d", err);
|
|
else
|
|
{
|
|
memcpy (STARH (current_handle), STARH (h), new_size);
|
|
|
|
/* NOTE: we don't call ChangedResource because we don't
|
|
care if this change gets lost. In fact, we will try
|
|
to set up our System file so that it has the union of
|
|
all the resources that the various appearances use so that
|
|
the act of setting an appearance won't cause the system
|
|
file to be marked dirty. This should lessen the chance
|
|
of corruption.
|
|
|
|
ChangedResource (current_handle); */
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
INTEGER savern;
|
|
HIDDEN_Handle hh;
|
|
|
|
hh.p = h;
|
|
if (HandleZone (h) != SysZone)
|
|
{
|
|
Handle save_hand;
|
|
|
|
save_hand = h;
|
|
HandToHand (&hh);
|
|
DisposHandle (save_hand);
|
|
}
|
|
savern = CurResFile ();
|
|
UseResFile (rn);
|
|
AddResource (hh.p, type, id, name);
|
|
UseResFile (savern);
|
|
}
|
|
}
|
|
|
|
/* Exactly the same as GetIndType, except its action is limited to the file
|
|
with the refnum rn. */
|
|
|
|
PRIVATE void
|
|
GetIndTypeRN (INTEGER rn, ResType *typep, INTEGER type_num)
|
|
{
|
|
INTEGER savern;
|
|
|
|
savern = CurResFile ();
|
|
UseResFile (rn);
|
|
Get1IndType (typep, type_num);
|
|
UseResFile (savern);
|
|
}
|
|
|
|
/* Exactly the same as GetIndResource except limited to resources from the
|
|
file with refnum rn. */
|
|
|
|
PRIVATE Handle
|
|
GetIndResourceRN (INTEGER rn, ResType type, INTEGER id)
|
|
{
|
|
INTEGER savern;
|
|
Handle retval;
|
|
|
|
savern = CurResFile ();
|
|
UseResFile (rn);
|
|
retval = Get1IndResource (type, id);
|
|
UseResFile (savern);
|
|
return retval;
|
|
}
|
|
|
|
PRIVATE void
|
|
silently_replace_resources (INTEGER master_file_rn, INTEGER from_file_rn)
|
|
{
|
|
THz save_zone;
|
|
INTEGER type_num, type_num_max;
|
|
INTEGER save_resload;
|
|
|
|
save_zone = GetZone ();
|
|
SetZone (MR (SysZone));
|
|
type_num_max = CountTypesRN (from_file_rn);
|
|
save_resload = ResLoad;
|
|
SetResLoad (FALSE);
|
|
for (type_num = 1; type_num <= type_num_max; ++type_num)
|
|
{
|
|
ResType type;
|
|
INTEGER res_num, res_num_max;
|
|
|
|
GetIndTypeRN (from_file_rn, &type, type_num);
|
|
type = CL (type);
|
|
res_num_max = CountResourcesRN (from_file_rn, type);
|
|
for (res_num = 1; res_num <= res_num_max; ++res_num)
|
|
{
|
|
Handle h;
|
|
INTEGER id;
|
|
ResType t;
|
|
Str255 name;
|
|
|
|
h = GetIndResourceRN (from_file_rn, type, res_num);
|
|
GetResInfo (h, &id, &t, name);
|
|
id = CW (id);
|
|
LoadResource (h);
|
|
DetachResource (h);
|
|
AddResourceRN (master_file_rn, h, type, id, name);
|
|
}
|
|
}
|
|
SetResLoad (save_resload);
|
|
SetZone (save_zone);
|
|
}
|
|
|
|
PUBLIC void
|
|
ROMlib_set_appearance (void)
|
|
{
|
|
INTEGER res_file;
|
|
|
|
if (appearance < 0 || appearance >= NELEM (res_filenames))
|
|
appearance = 0;
|
|
|
|
res_file = OpenRFPerm (res_filenames[appearance], CW (BootDrive), fsRdPerm);
|
|
if (res_file != CWC (-1))
|
|
{
|
|
silently_replace_resources (CW (SysMap), res_file);
|
|
CloseResFile (res_file);
|
|
}
|
|
else if (appearance != 0)
|
|
{
|
|
appearance = 0;
|
|
ROMlib_set_appearance ();
|
|
}
|
|
}
|
|
|
|
PUBLIC boolean_t
|
|
ROMlib_parse_appearance (const char *appearance_str)
|
|
{
|
|
boolean_t retval;
|
|
|
|
retval = TRUE;
|
|
|
|
if (strcasecmp (appearance_str, "mac") == 0)
|
|
appearance = appearance_sys7;
|
|
else if (strcasecmp (appearance_str, "windows") == 0)
|
|
{
|
|
ROMlib_options |= ROMLIB_RECT_SCREEN_BIT;
|
|
appearance = appearance_win3;
|
|
}
|
|
else
|
|
retval = FALSE;
|
|
|
|
return retval;
|
|
}
|
|
|
|
PUBLIC appearance_t ROMlib_get_appearance (void)
|
|
{
|
|
return appearance;
|
|
}
|