Files
nethack/sys/mac/maccurs.c
Sean Hunt 97d6fade74 Reformat all C files.
I'll push a formatting guide at some point. There may still be
outstanding changes, but please feel free to resolve those as you arrive
a them.

To the best of my knowledge, there is no changes to the actual code
content, but the formatter does have the occasional bug. If you run into
an issue, please fix it!
2015-05-09 13:43:16 -04:00

215 lines
4.8 KiB
C

/* NetHack 3.6 maccurs.c $NHDT-Date: 1431192785 2015/05/09 17:33:05 $ $NHDT-Branch: master $:$NHDT-Revision: 1.8 $ */
/* NetHack 3.6 maccurs.c $Date: 2009/05/06 10:49:10 $ $Revision: 1.5 $ */
/* SCCS Id: @(#)maccurs.c 3.5 1993/01/24 */
/* 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);
}