home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frozen Fish 1: Amiga
/
FrozenFish-Apr94.iso
/
bbs
/
alib
/
d9xx
/
d971
/
yak.lha
/
Yak
/
Source
/
help.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-12-21
|
15KB
|
693 lines
/*
* help.c
*
* Opens help/settings window and handles events.
* For yak.
*
* Martin W. Scott, 12-Sep-92.
*/
#include <exec/types.h>
#include <dos/dosextens.h>
#include <graphics/gfxmacros.h>
#include <libraries/commodities.h>
#include <intuition/gadgetclass.h>
#include <intuition/intuition.h>
#include <libraries/gadtools.h>
#include <proto/exec.h>
#include <proto/dos.h>
#include <proto/intuition.h>
#include <proto/gadtools.h>
#include <proto/graphics.h>
#include <proto/commodities.h>
#include <string.h>
#include "yak.h"
#include "hotkey_types.h"
#include "popup.h"
#include "version.h"
#define CATCOMP_NUMBERS
#include "yak_locale_strings.h"
static struct Window *curwin;
/* static protos */
static void __regargs InitHelpGadget(UWORD num, LONG tagtype, LONG tagvalue);
static void InitHelpGadgets(void);
static void __regargs InitHotKeyGadget(UWORD num, LONG tagtype, LONG tagvalue);
static void InitHotKeyGadgets(void);
static void __regargs InitMiscGadget(UWORD num, LONG tagtype, LONG tagvalue);
static void InitMiscGadgets(void);
static void __regargs NewPattern(UWORD gdx, UWORD n, struct Gadget *gad);
static BOOL ShowHelpWindow(void);
static BOOL ShowHotKeyWindow(void);
static BOOL ShowMiscWindow(void);
static BOOL SwitchToHotkeyWindow(void);
static BOOL SwitchToMiscWindow(void);
static LONG HandleHelpIDCMP(void);
static LONG HandleHotKeyIDCMP(void);
static LONG HandleMiscIDCMP(void);
/* menu numbers */
#define LOAD 0
#define SAVE 1
#define HIDE 2
#define QUIT 3
/* initialise individual gadget in help window */
static void __regargs
InitHelpGadget(UWORD num, LONG tagtype, LONG tagvalue)
{
GT_SetGadgetAttrs(HelpGadgets[num], HelpWnd, NULL, tagtype, tagvalue, TAG_DONE);
}
/* initialise all gadgets */
static void
InitHelpGadgets(void)
{
UWORD i;
for (i = 0; i < NUM_TOGGLES; i++)
if (toggles[i].gadid != -1)
InitHelpGadget(toggles[i].gadid,
GTCB_Checked,
toggles[i].pos);
InitHelpGadget(GDX_ScrTONum, GTIN_Number, blanksecs);
InitHelpGadget(GDX_MouseTONum, GTIN_Number, mblanksecs);
InitHelpGadget(GDX_AutoPat, GTST_String, (LONG)patterns[YP_AUTOSCR_PAT].patstr);
InitHelpGadget(GDX_ClickPat, GTST_String, (LONG)patterns[YP_CLICKSCR_PAT].patstr);
InitHelpGadget(GDX_PopPat, GTST_String, (LONG)patterns[YP_POPWIN_PAT].patstr);
InitHelpGadget(GDX_ClickWinPat, GTST_String, (LONG)patterns[YP_CLICKWIN_PAT].patstr);
InitHelpGadget(GDX_ClickWinPat, GTCY_Active, qualifier);
}
/* show current window */
BOOL
ShowWindow(void)
{
if (curwin) /* already opened */
{
ScreenToFront(curwin->WScreen);
WindowToFront(curwin);
ActivateWindow(curwin);
return TRUE;
}
if (SetupScreen())
return FALSE;
return ShowHelpWindow();
}
/* show our help window */
static BOOL
ShowHelpWindow(void)
{
InitGUI ();
if (!OpenHelpWindow()) /* like the name says... */
{
InitHelpGadgets();
wndsigflag = 1 << HelpWnd->UserPort->mp_SigBit;
curwin = HelpWnd;
return TRUE;
}
CloseDownScreen();
return FALSE;
}
/* show our hotkey window */
static BOOL
ShowHotKeyWindow(void)
{
if (!OpenHotKeyWindow()) /* like the name says... */
{
InitHotKeyGadgets();
wndsigflag = 1 << HotKeyWnd->UserPort->mp_SigBit;
curwin = HotKeyWnd;
return TRUE;
}
CloseDownScreen();
return FALSE;
}
/* show our misc window */
static BOOL
ShowMiscWindow(void)
{
if (!OpenMiscWindow()) /* like the name says... */
{
InitMiscGadgets();
wndsigflag = 1 << MiscWnd->UserPort->mp_SigBit;
curwin = MiscWnd;
return TRUE;
}
CloseDownScreen();
return FALSE;
}
/* update windows position for next openings */
void
UpdateWindowsPosition (void)
{
HelpLeft = curwin->LeftEdge;
WindowTop = curwin->TopEdge;
}
/* hide our window */
void
HideWindow(void)
{
if (curwin)
{
UpdateWindowsPosition();
if (curwin == HelpWnd)
CloseHelpWindow();
else
if (curwin == MiscWnd)
CloseMiscWindow();
else
CloseHotKeyWindow();
CloseDownScreen();
wndsigflag = NULL;
curwin = HelpWnd = HotKeyWnd = MiscWnd = NULL;
}
}
/* switch from help window to hotkey window */
static BOOL
SwitchToHotkeyWindow(void)
{
HotKeyLeft = HelpWnd->LeftEdge;
WindowTop = HelpWnd->TopEdge;
CloseHelpWindow();
return ShowHotKeyWindow();
}
/* switch from help window to misc window */
static BOOL
SwitchToMiscWindow(void)
{
MiscLeft = HelpWnd->LeftEdge;
WindowTop = HelpWnd->TopEdge;
CloseHelpWindow();
return ShowMiscWindow();
}
/* handle pattern string-gadget */
static void __regargs
NewPattern(UWORD gdx, UWORD n, struct Gadget *gad)
{
char *newpatstr;
newpatstr = GetString(gad);
if (!InitPattern(newpatstr, n))
{
DisplayBeep(Scr);
InitHelpGadget(gdx, GTST_String, (LONG)patterns[n].patstr);
}
}
/* handle window events */
LONG
HandleIDCMP(void)
{
if (curwin == HelpWnd)
return HandleHelpIDCMP();
else
if (curwin == MiscWnd)
return HandleMiscIDCMP();
else
return HandleHotKeyIDCMP();
}
/* handle help window events */
static LONG
HandleHelpIDCMP(void)
{
struct IntuiMessage *msg;
struct Gadget *gadget;
ULONG class;
UWORD code;
LONG num;
while (msg = GT_GetIMsg(HelpWnd->UserPort))
{
class = msg->Class;
code = msg->Code;
gadget = (struct Gadget *)msg->IAddress;
GT_ReplyIMsg(msg);
switch (class)
{
case CLOSEWINDOW:
HideWindow();
return HELP_OKAY;
case GADGETUP:
case GADGETDOWN:
switch (gadget->GadgetID)
{
case GD_EditHotkeys:
if (!SwitchToHotkeyWindow())
PostError(getString(Couldnt_open_other_window_ERR));
return HELP_OKAY;
case GD_Miscellaneous:
if (!SwitchToMiscWindow())
PostError(getString(Couldnt_open_other_window_ERR));
return HELP_OKAY;
case GD_AutoPat:
NewPattern(GDX_AutoPat, YP_AUTOSCR_PAT, gadget);
break;
case GD_ClickPat:
NewPattern(GDX_ClickPat, YP_CLICKSCR_PAT, gadget);
break;
case GD_PopPat:
NewPattern(GDX_PopPat, YP_POPWIN_PAT, gadget);
break;
case GD_ClickWinPat:
NewPattern(GDX_ClickWinPat, YP_CLICKWIN_PAT, gadget);
break;
case GD_Hide:
HideWindow();
return HELP_OKAY;
case GD_Quit:
HideWindow();
return HELP_QUIT;
case GD_AutoCheck: /* toggle */
autopoint ^= TRUE;
break;
case GD_AutoPopCheck: /* toggle */
autopop ^= TRUE;
break;
case GD_KeyActCheck: /* toggle */
keyactivate ^= TRUE;
break;
case GD_CTFCheck: /* toggle */
clicktofront ^= TRUE;
break;
case GD_CTBCheck: /* toggle */
clicktoback ^= TRUE;
break;
case GD_ScrCycleCheck: /* toggle */
screencycle ^= TRUE;
break;
case GD_WildStarCheck: /* toggle */
wildstar ^= TRUE;
if (wildstar) WILDSTARON; else WILDSTAROFF;
break;
case GD_NoClickCheck: /* toggle */
noclick ^= TRUE;
SetClickDrive(noclick);
break;
case GD_ScrActCheck: /* toggle */
scractivate ^= TRUE;
break;
case GD_RMBActCheck: /* toggle */
rmbactivate ^= TRUE;
break;
case GD_MMBActCheck: /* toggle */
mmbactivate ^= TRUE;
break;
case GD_ScrTONum:
num = GetNumber(gadget);
if (num >= 0) {
blanksecs = num;
blankcount = blanktimeout = blanksecs*10;
} else {
InitHelpGadget(GDX_ScrTONum, GTIN_Number, blanksecs);
DisplayBeep(HelpWnd->WScreen);
}
break;
case GD_MouseTONum:
num = GetNumber(gadget);
if (num >= 0) {
mblanksecs = num;
mblankcount = mblanktimeout = mblanksecs*10;
} else {
InitHelpGadget(GDX_MouseTONum, GTIN_Number, mblanksecs);
DisplayBeep(HelpWnd->WScreen);
}
break;
} /* switch (gadget->GadgetID) */
break;
case REFRESHWINDOW:
GT_BeginRefresh(HelpWnd);
HelpRender();
GT_EndRefresh(HelpWnd, TRUE);
break;
case IDCMP_MENUPICK:
while (code != MENUNULL)
{
struct MenuItem *item = ItemAddress(HelpMenus, code);
switch (ITEMNUM(code))
{
case LOAD:
LoadSettings();
InitHelpGadgets();
break;
case SAVE:
SaveSettings();
break;
case HIDE:
HideWindow();
return HELP_OKAY;
case QUIT:
HideWindow();
return HELP_QUIT;
}
code = item->NextSelect;
} /* while more menuchoices */
break;
} /* switch (class) */
} /* while more messages */
return HELP_OKAY;
}
/*******************************************************************************
* HOTKEY SPECIFIC DATA/ROUTINES
* perhaps move to another file?
*******************************************************************************/
/* prototypes */
static struct Node *GetNode(struct List *lh, UWORD n);
static UWORD GetNodeNum(struct List *lh, struct Node *node);
/* external data */
static YakHotKey *curhk;
static UWORD curtype;
/* get nth node in list - list MUST have >= n nodes!!! */
static struct Node *
GetNode(struct List *lh, UWORD n)
{
struct Node *ln;
for (ln = lh->lh_Head; n--; ln = ln->ln_Succ)
;
return ln;
}
/* get number of node in list - node MUST be there! */
static UWORD
GetNodeNum(struct List *lh, struct Node *node)
{
struct Node *ln;
UWORD i;
for (i = 0, ln = lh->lh_Head; ln != node; ln = ln->ln_Succ, i++)
;
return i;
}
/* initialise individual gadget in hotkey window */
static void __regargs
InitHotKeyGadget(UWORD num, LONG tagtype, LONG tagvalue)
{
GT_SetGadgetAttrs(HotKeyGadgets[num], HotKeyWnd, NULL, tagtype, tagvalue, TAG_DONE);
}
/* initialise all gadgets of hotkey window */
static void
InitHotKeyGadgets(void)
{
InitHotKeyGadget(GDX_Hotkeys, GTLV_Labels, (LONG)keylist(curtype));
InitHotKeyGadget(GDX_Actions, GTLV_Selected, curtype);
InitHotKeyGadget(GDX_Delete, GA_Disabled, !curhk);
InitHotKeyGadget(GDX_HKStr, GA_Disabled, !curhk);
/* something selected */
if (curhk)
{
UWORD n = GetNodeNum(keylist(curtype), (struct Node *)curhk);
if (YHK_Has_Options(curhk))
{
InitHotKeyGadget(GDX_Options, GA_Disabled, FALSE);
InitHotKeyGadget(GDX_Options, GTCY_Active, (LONG)curhk->yhk_Options);
}
if (YHK_Takes_Arg(curhk))
{
InitHotKeyGadget(GDX_Argument, GA_Disabled, FALSE);
InitHotKeyGadget(GDX_Argument, GTST_String, (LONG)curhk->yhk_ArgStr);
}
InitHotKeyGadget(GDX_Hotkeys, GTLV_Selected, n);
InitHotKeyGadget(GDX_Hotkeys, GTLV_Top, n);
InitHotKeyGadget(GDX_HKStr, GTST_String, (LONG)curhk->yhk_KeyDef);
}
else /* no current hotkey */
{
InitHotKeyGadget(GDX_HKStr, GTST_String, (LONG)"");
InitHotKeyGadget(GDX_Options, GTCY_Active, 0);
InitHotKeyGadget(GDX_Argument, GTST_String, (LONG)"");
InitHotKeyGadget(GDX_Argument, GA_Disabled, TRUE);
InitHotKeyGadget(GDX_Options, GA_Disabled, TRUE);
}
}
/* handle hotkey window events */
static LONG
HandleHotKeyIDCMP(void)
{
struct IntuiMessage *msg;
struct Gadget *gadget;
ULONG class;
UWORD code;
while (msg = GT_GetIMsg(HotKeyWnd->UserPort))
{
class = msg->Class;
code = msg->Code;
gadget = (struct Gadget *)msg->IAddress;
GT_ReplyIMsg(msg);
switch (class)
{
case CLOSEWINDOW:
HideWindow();
return HELP_OKAY;
case GADGETUP:
case GADGETDOWN:
switch (gadget->GadgetID)
{
case GD_Hotkeys:
curhk = (YakHotKey *)GetNode(keylist(curtype), code);
InitHotKeyGadgets();
ActivateGadget(HotKeyGadgets[GDX_HKStr], HotKeyWnd, NULL);
break;
case GD_HKStr:
if (!curhk) /* shouldn't happen */
break;
if (ModifyYHKKeyDef(curhk, GetString(gadget)))
{
InitHotKeyGadget(GDX_Hotkeys, GTLV_Labels, (LONG)keylist(curtype));
if (YHK_Takes_Arg(curhk))
ActivateGadget(HotKeyGadgets[GDX_Argument], HotKeyWnd, NULL);
}
else
{
InitHotKeyGadgets();
ActivateGadget(HotKeyGadgets[GDX_HKStr], HotKeyWnd, NULL);
}
break;
case GD_Argument:
if (!curhk) /* shouldn't happen */
break;
if (!(ModifyYHKArgStr(curhk, GetString(gadget))))
InitHotKeyGadgets();
break;
case GD_Actions:
if (code != curtype)
{
curtype = code;
curhk = NULL;
InitHotKeyGadgets();
}
break;
case GD_Options:
if (curhk)
curhk->yhk_Options = code;
break;
case GD_Add:
curhk = NewYakHotKey(curtype);
InitHotKeyGadgets();
ActivateGadget(HotKeyGadgets[GDX_HKStr], HotKeyWnd, NULL);
break;
case GD_Delete:
if (curhk)
{
DeleteYakHotKey(curhk);
curhk = NULL;
InitHotKeyGadgets();
}
break;
case GD_Return:
curhk = NULL; /* in case of reloading */
UpdateWindowsPosition();
CloseHotKeyWindow();
if (!ShowHelpWindow())
PostError(getString(Couldnt_open_other_window_ERR));
return HELP_OKAY;
} /* switch (gadget->GadgetID) */
break;
case REFRESHWINDOW:
GT_BeginRefresh(HotKeyWnd);
GT_EndRefresh(HotKeyWnd, TRUE);
break;
} /* switch (class) */
} /* while more messages */
return HELP_OKAY;
}
/* initialise individual gadget in misc window */
static void __regargs
InitMiscGadget(UWORD num, LONG tagtype, LONG tagvalue)
{
GT_SetGadgetAttrs(MiscGadgets[num], MiscWnd, NULL, tagtype, tagvalue, TAG_DONE);
}
/* initialise all gadgets of Misc window */
static void
InitMiscGadgets(void)
{
InitMiscGadget(GDX_MBMethod, GTCY_Active, mouseblank);
InitMiscGadget(GDX_ClickVol, GTIN_Number, click_volume);
InitMiscGadget(GDX_AutoPointDelay, GTIN_Number, autopoint_delay);
}
/* handle Misc window events */
static LONG
HandleMiscIDCMP(void)
{
struct IntuiMessage *msg;
struct Gadget *gadget;
ULONG class;
UWORD code;
LONG num;
while (msg = GT_GetIMsg(MiscWnd->UserPort))
{
class = msg->Class;
code = msg->Code;
gadget = (struct Gadget *)msg->IAddress;
GT_ReplyIMsg(msg);
switch (class)
{
case CLOSEWINDOW:
HideWindow();
return HELP_OKAY;
case GADGETUP:
case GADGETDOWN:
switch (gadget->GadgetID)
{
case GD_Return2:
UpdateWindowsPosition();
CloseMiscWindow();
if (!ShowHelpWindow())
PostError(getString(Couldnt_open_other_window_ERR));
return HELP_OKAY;
case GD_ClickVol:
num = GetNumber(gadget);
if (num >= 0 && num <= 64) {
click_volume = num;
} else {
InitHelpGadget(GDX_ClickVol, GTIN_Number, click_volume);
DisplayBeep(HelpWnd->WScreen);
}
break;
case GD_AutoPointDelay:
num = GetNumber(gadget);
if (num >= 0 && num <= 5) {
autopoint_delay = num;
} else {
InitHelpGadget(GDX_AutoPointDelay, GTIN_Number, autopoint_delay);
DisplayBeep(MiscWnd->WScreen);
}
break;
case GD_MBMethod:
mouseblank = code;
mblankcount = mblanktimeout;
break;
} /* switch (gadget->GadgetID) */
break;
case REFRESHWINDOW:
GT_BeginRefresh(MiscWnd);
GT_EndRefresh(MiscWnd, TRUE);
break;
} /* switch (class) */
} /* while more messages */
return HELP_OKAY;
}