executor/src/appearance.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;
}