home *** CD-ROM | disk | FTP | other *** search
- /************************************************************************
- ********************** BGUI KEYDEFINITION WINDOW **********************
- ************************************************************************/
-
- #include <exec/types.h>
- #include <exec/memory.h>
- #include <dos/dosextens.h>
- #include <intuition/intuition.h>
- #include <intuition/classes.h>
- #include <intuition/classusr.h>
- #include <intuition/imageclass.h>
- #include <intuition/gadgetclass.h>
- #include <intuition/intuitionbase.h>
- #include <libraries/bgui.h>
- #include <libraries/bgui_macros.h>
- #include <libraries/commodities.h>
- #include <proto/commodities.h>
- #include <proto/exec.h>
- #include <proto/intuition.h>
- #include <proto/bgui.h>
- #include <proto/wb.h>
- #include <clib/alib_protos.h>
- #include <string.h>
-
- #include "code.h"
- #include "version.h"
- #include "yak.h"
- #include "hotkey_types.h"
- #include "handlers.h"
- #include "keydef.h"
- #include "gui.h"
- #include "KeyDef_Window.h"
- #include "Requesters.h"
- #include "yak_locale_strings.h"
-
- /************************************************************************
- ***************************** REFERENCES ******************************
- ************************************************************************/
-
- IMPORT LONG (*HandleReturnID)(LONG ID);
- IMPORT UBYTE ParentWindowID;
- IMPORT char *PrefsHelp;
-
- extern void HookEntry(void); /* from amiga.lib */
-
- /************************************************************************
- ***************************** PROTOTYPES ******************************
- ************************************************************************/
-
- static void InitHook(struct Hook *hook,ULONG (*hookfn)(),APTR data);
-
- static SAVEDS ASM ULONG KeyDefWindowHandler(REG(a0) struct Hook *hook, REG(a2) void *obj, REG(a1) void *msg);
-
- /************************************************************************
- ***************************** LOCAL DATA ******************************
- ************************************************************************/
-
- struct Window *KeyDefWnd = NULL;
- Object *KeyDefWndObj = NULL;
- Object *KeyDefObjects[KeyDef_CNT];
- char *KeyDefWdt;
- struct IBox KeyDefBox;
- BOOL KeyDefBoxValid = FALSE;
-
- struct Hook KeyDefWindowHook;
-
- static APTR CurObj;
- static YakKeyDef KeyDef;
-
- UBYTE *Class0Labels[5];
- UBYTE *Stroke0Labels[4];
-
- /************************************************************************
- ***************************** INITHOOK() ******************************
- *************************************************************************
- * Initialize the hook struct supplied with the hook function and
- * (optional) hook data ptr.
- *
- *************************************************************************/
-
- static void InitHook(struct Hook *hook,ULONG (*hookfn)(),APTR data)
- {
- hook->h_Entry = (ULONG (*)()) HookEntry;
- hook->h_SubEntry = hookfn;
- hook->h_Data = data;
- }
-
- /************************************************************************
- ************************ CREATEKEYDEFWINDOW() *************************
- *************************************************************************
- * Create the keydef window object tree. Returns the window object ptr or
- * NULL if create failed. Gadgets are initialised with default values,
- * InitKeyDefGadgets must be called after window opened to reflect current
- * settings.
- *
- *************************************************************************/
-
- APTR CreateKeyDefWindow(VOID)
- {
- Object *obj;
-
- /* put localised strings into cycle gadget labels */
- Class0Labels[0] = getString(RawKey_CLASS);
- Class0Labels[1] = getString(RawMouse_CLASS);
- Class0Labels[2] = getString(DiskInserted_CLASS);
- Class0Labels[3] = getString(DiskRemoved_CLASS);
- Class0Labels[4] = NULL;
-
- Stroke0Labels[0] = getString(Down_STROKE);
- Stroke0Labels[1] = getString(Up_STROKE);
- Stroke0Labels[2] = getString(Down_Up_STROKE);
- Stroke0Labels[3] = NULL;
-
- /* initialize the window idcmp hook */
- InitHook(&KeyDefWindowHook,KeyDefWindowHandler,NULL);
-
- obj = WindowObject,
- WINDOW_PubScreenName, PubScreenName,
- WINDOW_Title, KeyDefWdt,
- WINDOW_ScreenTitle, getString(COPYRIGHT_STRING),
- WINDOW_SmartRefresh, TRUE,
- WINDOW_SizeBottom, FALSE, /* put size gadget in right border */
- WINDOW_SizeRight, TRUE,
- WINDOW_AutoAspect, TRUE, /* automatic edges pixel width */
- WINDOW_Position, POS_CENTERMOUSE,
- (KeyDefBoxValid ? WINDOW_Bounds : TAG_IGNORE), &KeyDefBox,
- WINDOW_AppWindow, TRUE, /* make it an appwindow */
- WINDOW_RMBTrap, TRUE, /* trap rmb - no menu */
- WINDOW_CloseGadget, FALSE, /* no windowclose gadget please */
- WINDOW_IDCMP, IDCMP_MOUSEBUTTONS, /* additional idcmp bits */
- WINDOW_IDCMPHookBits, IDCMP_RAWKEY|IDCMP_MOUSEBUTTONS,
- WINDOW_IDCMPHook, &KeyDefWindowHook,
- (TextFont ? WINDOW_Font : TAG_IGNORE), &Attr, /* use font if specified */
- WINDOW_MasterGroup,
- VGroupObject, Spacing(4), HOffset(4), VOffset(4),
- StartMember,
- HGroupObject, Spacing(8),
- StartMember,
- CYC_Class = CycleObject,
- LAB_Label, getString(CLASS_STRING),
- GA_ID, GD_Class,
- ButtonFrame,
- CYC_Labels, Class0Labels,
- CYC_Active, 0,
- CYC_Popup, TRUE,
- EndObject,
- EndMember,
- VarSpace(DEFAULT_WEIGHT/10),
- StartMember,
- CYC_Stroke = CycleObject,
- LAB_Label, getString(STROKE_STRING),
- GA_ID, GD_Stroke,
- ButtonFrame,
- CYC_Labels, Stroke0Labels,
- CYC_Active, 0,
- CYC_Popup, TRUE,
- EndObject,
- EndMember,
- EndObject,
- EndMember,
- VarSpace(DEFAULT_WEIGHT/10),
- StartMember,
- STR_Desc = StringObject,
- LAB_Label, getString(DESC_STRING),
- STRINGA_MaxChars,256,
- GA_ID, GD_Desc,
- RidgeFrame,
- EndObject,
- EndMember,
- VarSpace(DEFAULT_WEIGHT/10),
- StartMember,
- HorizSeparator,
- EndMember,
- StartMember,
- HGroupObject, Spacing(2),
- StartMember,
- BT_Ok = Button(getString(OK_STRING),GD_Ok),
- EndMember,
- VarSpace(DEFAULT_WEIGHT),
- StartMember,
- BT_Clear = Button(getString(CLEAR_STRING),GD_Clear),
- EndMember,
- VarSpace(DEFAULT_WEIGHT),
- StartMember,
- BT_Help = Button(getString(HELP_STRING),GD_Help),
- EndMember,
- VarSpace(DEFAULT_WEIGHT),
- StartMember,
- BT_Cancel2 = Button(getString(CANCEL_STRING),GD_Cancel),
- EndMember,
- EndObject,
- EndMember,
- EndObject,
- EndObject;
-
- return(obj);
- }
-
- /************************************************************************
- ************************* CLOSEKEYDEFWINDOW() *************************
- *************************************************************************
- * Close the keydef window, disposing of the window object.
- *
- *************************************************************************/
-
- void CloseKeyDefWindow(void)
- {
- if (KeyDefWnd)
- {
- GetAttr(WINDOW_Bounds,KeyDefWndObj,(ULONG *) &KeyDefBox);
- KeyDefBoxValid = TRUE;
- }
-
- DisposeObject(KeyDefWndObj);
- KeyDefWndObj = NULL;
- KeyDefWnd = NULL;
-
- /* Re-enable Yak now that our job is finished */
- BrokerCommand("Yak", CXCMD_ENABLE);
- }
-
- /************************************************************************
- ************************ INITKEYDEFGADGETS() **************************
- *************************************************************************
- * Initialize the keydef window gadgets to reflect current settings.
- *
- *************************************************************************/
-
- static void InitKeyDefGadgets(void)
- {
- UBYTE SeqString[127];
- BOOL SeqOk;
-
- SeqOk = BuildKeyDef(&KeyDef, SeqString);
-
- InitWindowGadget(GDX_Class, CYC_Active, KeyDef.ykd_Class, KEYDEF_WINDOW);
-
- if (ParentWindowID == MCYCLING_WINDOW)
- InitWindowGadget(GDX_Class, GA_Disabled, KeyDef.ykd_Class, KEYDEF_WINDOW);
-
- InitWindowGadget(GDX_Desc, STRINGA_TextVal, (LONG)SeqString, KEYDEF_WINDOW);
- InitWindowGadget(GDX_Stroke, CYC_Active, KeyDef.ykd_Stroke, KEYDEF_WINDOW);
- InitWindowGadget(GDX_Stroke, GA_Disabled, KeyDef.ykd_Class, KEYDEF_WINDOW);
- InitWindowGadget(GDX_Ok, GA_Disabled, !SeqOk, KEYDEF_WINDOW);
- }
-
- /************************************************************************
- *********************** SWITCHTOKEYDEFWINDOW() ************************
- *************************************************************************
- * Switch to keydef window from another window, which will be closed by
- * this routine. Supply the parent window ID, the object whose key
- * definition you want edited (YakHotKey if from hotkey window, YakHandler
- * if from Misc window), and an 'action' string which appears in the
- * window title (tells the user what s/he's editing). Returns TRUE or
- * FALSE to indicate success.
- *
- *************************************************************************/
-
- BOOL SwitchToKeyDefWindow(UBYTE I_ParentWindowID, APTR I_object, char *I_action)
- {
- static char title[80];
- char *def;
-
- strcpy(title, getString(KeyDef_Window_TITLE));
- strcat(title, " ");
- if (I_action)
- strcat(title, I_action);
- else
- strcat(title, "<<unnamed>>");
- KeyDefWdt = title;
-
- ParentWindowID = I_ParentWindowID;
- CurObj = I_object;
-
- if (ParentWindowID == HOTKEY_WINDOW)
- def = ((YakHotKey *)CurObj)->yhk_KeyDef;
- else
- def = ((YakHandler *)CurObj)->KeyDef;
-
- ParseKeyDef(def, &KeyDef);
-
- CloseWindowID(ParentWindowID);
-
- return(ShowKeyDefWindow());
- }
-
- /************************************************************************
- *********************** HANDLEKEYDEFRETURNID() ************************
- *************************************************************************
- * Handle msgs arriving at keydef window - supply the ID returned by
- * BGUI. Returns either RET_OKAY or RET_QUIT.
- *
- *************************************************************************/
-
- LONG HandleKeyDefReturnID(LONG id)
- {
- LONG ret;
- ULONG code;
-
- ret = RET_OKAY;
-
- switch(id)
- {
- case GD_Class:
- GetAttr(CYC_Active,CYC_Class,&code);
- KeyDef.ykd_Class = code;
- KeyDef.ykd_Stroke = HKSTROKE_DOWN;
- KeyDef.ykd_Code = NO_IECODE;
- KeyDef.ykd_Qual = KeyDef.ykd_IQual = KeyDef.ykd_SQual = NO_IEQUALIFIER;
- InitKeyDefGadgets();
- break;
-
- case GD_Stroke:
- GetAttr(CYC_Active,CYC_Stroke,&code);
- if ((KeyDef.ykd_Stroke=code) == HKSTROKE_UP)
- {
- KeyDef.ykd_Qual &= ~IEQUALIFIER_REPEAT;
- KeyDef.ykd_IQual &= ~IEQUALIFIER_REPEAT;
- }
- InitKeyDefGadgets();
- break;
-
- case GD_Desc:
- GetAttr(STRINGA_TextVal,STR_Desc,&code);
- if (ParseKeyDef((char *)code, &KeyDef) == -1)
- PostError(getString(Invalid_hotkey_specif_ERR));
- InitKeyDefGadgets();
- break;
-
- case GD_Cancel:
- CloseKeyDefWindow();
- if (!ShowWindowID(ParentWindowID))
- ret = RET_QUIT;
- break;
-
- case GD_Help:
- DisableYakInterface();
- BrokerCommand("Yak", CXCMD_ENABLE);
- BGUI_Help(KeyDefWnd, PrefsHelp, "Hotkey Description String",0);
- BrokerCommand("Yak", CXCMD_DISABLE);
- ActivateWindow(KeyDefWnd);
- EnableYakInterface();
- break;
-
- case GD_Clear:
- KeyDef.ykd_Stroke = HKSTROKE_DOWN;
- KeyDef.ykd_Code = NO_IECODE;
- KeyDef.ykd_Qual = KeyDef.ykd_IQual = KeyDef.ykd_SQual = NO_IEQUALIFIER;
- InitKeyDefGadgets();
- break;
-
- case GD_Ok:
- GetAttr(STRINGA_TextVal,STR_Desc,&code);
- if (ParentWindowID == HOTKEY_WINDOW)
- {
- if (ModifyYHKKeyDef(CurObj, (char *)code) == TRUE)
- {
- /* Turn hotkey on active by default */
- ((YakHotKey *)CurObj)->yhk_State = YKHK_ACTIVE;
- }
- }
- else
- {
- char *newdef;
- YakHandler *curhd;
-
- if (newdef = DupStr((char *)code))
- {
- curhd = (YakHandler *)CurObj;
- FreeVec(curhd->KeyDef);
- curhd->KeyDef = newdef;
- }
- else
- PostError(getString(Allocation_ERR));
- }
- CloseKeyDefWindow();
- if (!ShowWindowID(ParentWindowID))
- ret = RET_QUIT;
- break;
-
- default:
- break;
- }
-
- return(ret);
- }
-
- /************************************************************************
- ************************ KEYDEFWINDOWHANDLER() ************************
- *************************************************************************
- * Hook called by bgui during idcmp msg processing. Used here to scan
- * input for codes and qualifiers to put in hotkey description string.
- *
- *************************************************************************/
-
- static SAVEDS ASM ULONG KeyDefWindowHandler(REG(a0) struct Hook *hook, REG(a2) void *obj, REG(a1) void *msg)
- {
- struct IntuiMessage *imsg;
- UWORD code,qual,newqual;
-
- imsg = (struct IntuiMessage *)msg;
- code = imsg->Code;
- qual = imsg->Qualifier;
-
- switch(imsg->Class)
- {
- case IDCMP_RAWKEY:
- if ( (!(code & IECODE_UP_PREFIX) || code == 0xe2 ) && /* a downstroke || capslock up */
- ((KeyDef.ykd_Class == HKCLASS_RAWKEY) || (KeyDef.ykd_Class == HKCLASS_RAWMOUSE)) )
- {
- if (newqual = IsQualifierPad(code))
- {
- newqual &= ~KeyDef.ykd_SQual;
- newqual &= ~KeyDef.ykd_IQual;
-
- /* Toggle Qualifier */
- KeyDef.ykd_Qual ^= newqual;
- }
- else
- {
- if (KeyDef.ykd_Class == HKCLASS_RAWKEY)
- {
- if ((code == KeyDef.ykd_Code) && (KeyDef.ykd_Stroke != HKSTROKE_UP))
- {
- /* Toggle Repeat Keyword */
- if(!(KeyDef.ykd_IQual & IEQUALIFIER_REPEAT))
- KeyDef.ykd_Qual ^= IEQUALIFIER_REPEAT;
- }
- else /* New key or upstroke mode */
- {
- KeyDef.ykd_Qual &= ~IEQUALIFIER_KEYS;
- KeyDef.ykd_IQual &= ~IEQUALIFIER_KEYS;
- KeyDef.ykd_Qual |= qual & IEQUALIFIER_NUMERICPAD;
- KeyDef.ykd_Code = code;
- }
- }
- }
-
- InitKeyDefGadgets();
- }
- break;
-
- case IDCMP_MOUSEBUTTONS:
- if (!(code & IECODE_UP_PREFIX) && /* a downstroke */
- ((KeyDef.ykd_Class == HKCLASS_RAWKEY) || (KeyDef.ykd_Class == HKCLASS_RAWMOUSE)) )
- {
- switch(code)
- {
- case IECODE_RBUTTON:
- newqual = IEQUALIFIER_RBUTTON;
- break;
- case IECODE_LBUTTON:
- newqual = IEQUALIFIER_LEFTBUTTON;
- break;
- case IECODE_MBUTTON:
- newqual = IEQUALIFIER_MIDBUTTON;
- break;
- default:
- newqual = NO_IEQUALIFIER;
- break;
- }
-
- newqual &= ~KeyDef.ykd_IQual;
-
- if (KeyDef.ykd_Class == HKCLASS_RAWMOUSE)
- {
- if (KeyDef.ykd_Code == code)
- {
- KeyDef.ykd_Qual &= ~newqual;
- KeyDef.ykd_Code = NO_IECODE;
- }
- else
- {
- KeyDef.ykd_Qual |= newqual;
- KeyDef.ykd_Code = code;
- }
- }
- else
- KeyDef.ykd_Qual ^= newqual;
-
- InitKeyDefGadgets();
- }
- break;
-
- default:
- break;
- }
-
- return(0);
- }
-
- /************************************************************************
- ************************* SHOWKEYDEFWINDOW() **************************
- *************************************************************************
- * Create and open the KeyDef window and initialize the gadgets to
- * reflect current settings. Sets up HandleReturnID function, curwin,
- * curwinobj and curwinID. Returns TRUE or FALSE to indicate success.
- *
- *************************************************************************/
-
- BOOL ShowKeyDefWindow(void)
- {
- if (KeyDefWndObj = (Object *)CreateKeyDefWindow())
- {
- if (KeyDefWnd = WindowOpen(KeyDefWndObj))
- {
- /* Disable Yak so that it doesn't interfere with us */
- BrokerCommand("Yak", CXCMD_DISABLE);
-
- InitKeyDefGadgets();
- HandleReturnID = HandleKeyDefReturnID;
- curwin = KeyDefWnd;
- curwinobj = KeyDefWndObj;
- curwinID = KEYDEF_WINDOW;
- return(TRUE);
- }
- }
-
- CloseKeyDefWindow();
- curwin = NULL;
- curwinobj = NULL;
- wndsigflag = 0L;
- appwinsigflag = 0L;
- return(FALSE);
- }
-
-
-