Files
nethack/outdated/sys/mac/maccurs.c
nhmall c6d09a58d6 move unmaintained files into outdated folder
If an old port is resurrected to work with current version code, its files
can be relocated to the appropriate sys or win folder as required.

In the meantime, the burden of upkeep can be avoided for the stuff in the
outdated folder for now.
2020-05-10 11:24:51 -04:00

213 lines
4.6 KiB
C

/* NetHack 3.6 maccurs.c $NHDT-Date: 1432512797 2015/05/25 00:13:17 $ $NHDT-Branch: master $:$NHDT-Revision: 1.9 $ */
/* Copyright (c) Jon W{tte, 1992. */
/* NetHack may be freely redistributed. See license for details. */
#include "hack.h"
#include "mactty.h"
#include "macwin.h"
#if 1 /*!TARGET_API_MAC_CARBON*/
#include <Folders.h>
#include <TextUtils.h>
#include <Resources.h>
#endif
static Boolean winFileInit = 0;
static unsigned char winFileName[32] = "\pNetHack Preferences";
static long winFileDir;
static short winFileVol;
typedef struct WinPosSave {
char validPos;
char validSize;
short top;
short left;
short height;
short width;
} WinPosSave;
static WinPosSave savePos[kLastWindowKind + 1];
static void
InitWinFile(void)
{
StringHandle sh;
long len;
short ref = 0;
if (winFileInit) {
return;
}
/* We trust the glue. If there's an error, store in game dir. */
if (FindFolder(kOnSystemDisk, kPreferencesFolderType, kCreateFolder,
&winFileVol, &winFileDir)) {
winFileVol = 0;
winFileDir = 0;
}
sh = GetString(128);
if (sh && *sh) {
BlockMove(*sh, winFileName, **sh + 1);
ReleaseResource((Handle) sh);
}
if (HOpen(winFileVol, winFileDir, winFileName, fsRdPerm, &ref)) {
return;
}
len = sizeof(savePos);
if (!FSRead(ref, &len, savePos)) {
winFileInit = 1;
}
FSClose(ref);
}
static void
FlushWinFile(void)
{
short ref;
long len;
if (!winFileInit) {
if (!winFileName[0]) {
return;
}
HCreate(winFileVol, winFileDir, winFileName, MAC_CREATOR, PREF_TYPE);
HCreateResFile(winFileVol, winFileDir, winFileName);
}
if (HOpen(winFileVol, winFileDir, winFileName, fsWrPerm, &ref)) {
return;
}
winFileInit = 1;
len = sizeof(savePos);
(void) FSWrite(ref, &len, savePos); /* Don't care about error */
FSClose(ref);
}
Boolean
RetrievePosition(short kind, short *top, short *left)
{
Point p;
if (kind < 0 || kind > kLastWindowKind) {
dprintf("Retrieve Bad kind %d", kind);
return 0;
}
InitWinFile();
if (!savePos[kind].validPos) {
dprintf("Retrieve Not stored kind %d", kind);
return 0;
}
p.v = savePos[kind].top;
p.h = savePos[kind].left;
*left = p.h;
*top = p.v;
dprintf("Retrieve Kind %d Pt (%d,%d)", kind, p.h, p.v);
return (PtInRgn(p, GetGrayRgn()));
}
Boolean
RetrieveSize(short kind, short top, short left, short *height, short *width)
{
Point p;
if (kind < 0 || kind > kLastWindowKind) {
return 0;
}
InitWinFile();
if (!savePos[kind].validSize) {
return 0;
}
*width = savePos[kind].width;
*height = savePos[kind].height;
p.h = left + *width;
p.v = top + *height;
return PtInRgn(p, GetGrayRgn());
}
static void
SavePosition(short kind, short top, short left)
{
if (kind < 0 || kind > kLastWindowKind) {
dprintf("Save bad kind %d", kind);
return;
}
InitWinFile();
savePos[kind].validPos = 1;
savePos[kind].top = top;
savePos[kind].left = left;
dprintf("Save kind %d pt (%d,%d)", kind, left, top);
FlushWinFile();
}
static void
SaveSize(short kind, short height, short width)
{
if (kind < 0 || kind > kLastWindowKind) {
dprintf("Save bad kind %d", kind);
return;
}
InitWinFile();
savePos[kind].validSize = 1;
savePos[kind].width = width;
savePos[kind].height = height;
FlushWinFile();
}
static short
GetWinKind(WindowPtr win)
{
short kind;
if (!CheckNhWin(win)) {
return -1;
}
kind = GetWindowKind(win) - WIN_BASE_KIND;
if (kind < 0 || kind > NHW_TEXT) {
return -1;
}
dprintf("In win kind %d (%lx)", kind, win);
switch (kind) {
case NHW_MAP:
case NHW_STATUS:
case NHW_BASE:
kind = kMapWindow;
break;
case NHW_MESSAGE:
kind = kMessageWindow;
break;
case NHW_MENU:
kind = kMenuWindow;
break;
default:
kind = kTextWindow;
break;
}
dprintf("Out kind %d", kind);
return kind;
}
Boolean
RetrieveWinPos(WindowPtr win, short *top, short *left)
{
return RetrievePosition(GetWinKind(win), top, left);
}
void
SaveWindowPos(WindowPtr win)
{
Rect r;
GetWindowBounds(win, kWindowContentRgn, &r);
SavePosition(GetWinKind(win), r.top, r.left);
}
void
SaveWindowSize(WindowPtr win)
{
short width, height;
Rect r;
GetWindowBounds(win, kWindowContentRgn, &r);
width = r.right - r.left;
height = r.bottom - r.top;
SaveSize(GetWinKind(win), height, width);
}