home *** CD-ROM | disk | FTP | other *** search
- #include <exec/types.h>
- #include <exec/memory.h>
- #include <dos/dosextens.h>
- #include <graphics/displayinfo.h>
- #include <graphics/gfxbase.h>
- #include <graphics/gfxmacros.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/gadtools.h>
- #include <libraries/commodities.h>
- #include <proto/commodities.h>
- #include <proto/keymap.h>
- #include <proto/exec.h>
- #include <proto/intuition.h>
- #include <proto/gadtools.h>
- #include <proto/graphics.h>
- #include <proto/locale.h>
- #include <proto/utility.h>
- #include <proto/dos.h>
- #include <string.h>
- #include <ctype.h>
-
-
- #include "code.h"
- #include "version.h"
- #include "hotkey_types.h"
- #include "yak.h"
- #include "gui.h"
- #include "KeyDef_Window.h"
-
- #define CATCOMP_NUMBERS
- #include "locale/yak_locale_strings.h"
-
-
- extern LONG (*HandleIDCMP)(void);
-
-
- struct Window *KeyDefWnd = NULL;
- struct Gadget *KeyDefGList = NULL;
- struct Gadget *KeyDefGadgets[KeyDef_CNT];
- UWORD KeyDefLeft = 0;
- UWORD KeyDefTop = 0;
- UWORD KeyDefWidth = 517;
- UWORD KeyDefHeight = 85;
- UBYTE *KeyDefWdt = NULL;
-
- IMPORT YakHotKey *curhk;
- IMPORT UWORD curtype;
-
- static YakKeyDef KeyDef;
-
-
-
- UBYTE *Class0Labels[5];
-
- void
- InitClass0Labels()
- {
- Class0Labels[0] = getString(RawKey_CLASS);
- Class0Labels[1] = getString(RawMouse_CLASS);
- Class0Labels[2] = getString(DiskInserted_CLASS);
- Class0Labels[3] = getString(DiskRemoved_CLASS);
- Class0Labels[4] = NULL;
- }
-
-
- UBYTE *Stroke0Labels[4];
-
- void
- InitStroke0Labels()
- {
- Stroke0Labels[0] = getString(Down_STROKE);
- Stroke0Labels[1] = getString(Up_STROKE);
- Stroke0Labels[2] = getString(Down_Up_STROKE);
- Stroke0Labels[3] = NULL;
- }
-
-
- UWORD KeyDefGTypes[] =
- {
- CYCLE_KIND,
- CYCLE_KIND,
- STRING_KIND,
- BUTTON_KIND,
- BUTTON_KIND
- };
-
- struct NewGadget KeyDefNGad[] = {
- 66, 13, 166, 13, NULL, NULL, GD_Class, PLACETEXT_LEFT, NULL, NULL,
- 325, 13, 186, 13, NULL, NULL, GD_Stroke, PLACETEXT_LEFT, NULL, NULL,
- 108, 38, 403, 14, NULL, NULL, GD_Desc, PLACETEXT_LEFT, NULL, NULL,
- 6, 68, 79, 13, NULL, NULL, GD_Ok, PLACETEXT_IN, NULL, NULL,
- 431, 68, 79, 13, NULL, NULL, GD_Cancel, PLACETEXT_IN, NULL, NULL
- };
-
-
- void InitKeyDefNGad (void)
- {
- KeyDefNGad[GD_Class].ng_GadgetText = getString(CLASS_STRING);
- KeyDefNGad[GD_Stroke].ng_GadgetText = getString(STROKE_STRING);
- KeyDefNGad[GD_Desc].ng_GadgetText = getString(DESC_STRING);
- KeyDefNGad[GD_Ok].ng_GadgetText = getString(OK_STRING);
- KeyDefNGad[GD_Cancel].ng_GadgetText = getString(CANCEL_STRING);
- }
-
-
-
- ULONG KeyDefGTags[] = {
- (GTCY_Labels), (ULONG)&Class0Labels[ 0 ], (TAG_DONE),
- (GTCY_Labels), (ULONG)&Stroke0Labels[ 0 ], (TAG_DONE),
- (GTST_MaxChars), 256, (TAG_DONE),
- (TAG_DONE),
- (TAG_DONE)
- };
-
-
-
- static __regargs void
- ConvertQualifiers(UWORD qual, UWORD iqual, UWORD squal, char *qualstr)
- {
- UWORD i;
-
- *qualstr = '\0';
-
- for (i=0; i<SAMEQUALIFIERS_NUMBER; i++)
- {
- if ((qual & squal & SameQualifierArray[i].qat_ID) == SameQualifierArray[i].qat_ID)
- {
- *qualstr++ = ' ';
- qualstr = stpcpy(qualstr, SameQualifierArray[i].qat_Str);
- }
- if ((iqual & squal & SameQualifierArray[i].qat_ID) == SameQualifierArray[i].qat_ID)
- {
- *qualstr++ = ' ';
- *qualstr++ = '-';
- qualstr = stpcpy(qualstr, SameQualifierArray[i].qat_Str);
- }
-
- }
-
- qual &= ~squal;
- iqual &= ~squal;
- for (i=0; i<QUALIFIERS_NUMBER; i++)
- {
- if (qual & QualifierArray[i].qat_ID)
- {
- *qualstr++ = ' ';
- qualstr = stpcpy(qualstr, QualifierArray[i].qat_Str);
- }
- if (iqual & QualifierArray[i].qat_ID)
- {
- *qualstr++ = ' ';
- *qualstr++ = '-';
- qualstr = stpcpy(qualstr, QualifierArray[i].qat_Str);
- }
- }
- }
-
-
- static __regargs BOOL
- ConvertCode(UWORD code, char *codestr)
- {
- *codestr = '\0';
-
- if (code != NO_IECODE)
- {
- struct InputEvent ievent;
- UWORD i;
-
- for (i=0; i<CODES_NUMBER; i++)
- {
- if (code == CodeArray[i].cat_Code)
- {
- codestr[0] = ' ';
- strcpy(codestr+1, CodeArray[i].cat_Str);
- return TRUE;
- }
-
- }
-
- ievent.ie_Class = IECLASS_RAWKEY;
- ievent.ie_Code = code;
- ievent.ie_Qualifier = NO_IEQUALIFIER;
- ievent.ie_Prev1DownCode = ievent.ie_Prev1DownQual = NO_IEQUALIFIER;
- ievent.ie_Prev2DownCode = ievent.ie_Prev2DownQual = NO_IEQUALIFIER;
-
- if((MapRawKey(&ievent, codestr+1, 1, NULL) == 1) &&
- (codestr[1] != '-')) /* forbidden */
- {
- codestr[0] = ' ';
- codestr[2] = '\0';
- return TRUE;
- }
- }
- return FALSE;
- }
-
-
-
-
-
-
- static __regargs BOOL
- BuildKeyDef(YakKeyDef *ykd, STRPTR desc)
- {
- BOOL ret;
- UBYTE codestr[20], qualstr[110];
-
- ConvertQualifiers(ykd->ykd_Qual, ykd->ykd_IQual, ykd->ykd_SQual, qualstr);
-
- if (ykd->ykd_Class > HKCLASS_RAWMOUSE)
- ret = TRUE;
- else
- ret = ConvertCode(ykd->ykd_Code, codestr);
-
- stpcpy(desc, ClassArray[ykd->ykd_Class]);
- strcat(desc, qualstr);
- strcat(desc, StrokeArray[ykd->ykd_Stroke]);
- strcat(desc, codestr);
-
- return ret;
-
- }
-
-
- /* initialise all gadgets of keydef window */
- static void
- InitKeyDefGadgets(void)
- {
- UBYTE SeqString[127];
- BOOL SeqOk = BuildKeyDef(&KeyDef, SeqString);
-
- InitWindowGadget(GDX_Class, GTCY_Active, KeyDef.ykd_Class, KEYDEF_WINDOW);
- InitWindowGadget(GDX_Desc, GTST_String, (LONG)SeqString, KEYDEF_WINDOW);
- InitWindowGadget(GDX_Stroke, GTCY_Active, KeyDef.ykd_Stroke, KEYDEF_WINDOW);
- InitWindowGadget(GDX_Stroke, GA_Disabled, KeyDef.ykd_Class, KEYDEF_WINDOW);
- InitWindowGadget(GDX_Ok, GA_Disabled, !SeqOk, KEYDEF_WINDOW);
- }
-
-
- static __regargs LONG
- ParseKeyDef(STRPTR desc, YakKeyDef *ykd)
- {
- IX ix;
- LONG ret;
-
-
- if (!(ret=ParseIX(desc, &ix)))
- {
- /* Class ? */
- switch(ix.ix_Class)
- {
- case IECLASS_RAWKEY:
- ykd->ykd_Class = HKCLASS_RAWKEY;
- break;
- case IECLASS_RAWMOUSE:
- ykd->ykd_Class = HKCLASS_RAWMOUSE;
- break;
- case IECLASS_DISKINSERTED:
- ykd->ykd_Class = HKCLASS_DISKINSERTED;
- break;
- case IECLASS_DISKREMOVED:
- ykd->ykd_Class = HKCLASS_DISKREMOVED;
- break;
- default:
- return -1;
- }
-
- /* Qualifier ? */
- ykd->ykd_Qual = ix.ix_Qualifier;
- ykd->ykd_IQual = ~ix.ix_QualMask;
-
- ykd->ykd_SQual = NO_IEQUALIFIER;
- if (ix.ix_QualSame & IXSYM_SHIFT) ykd->ykd_SQual |= IXSYM_SHIFTMASK;
- if (ix.ix_QualSame & IXSYM_CAPS) ykd->ykd_SQual |= IXSYM_CAPSMASK;
- if (ix.ix_QualSame & IXSYM_ALT) ykd->ykd_SQual |= IXSYM_ALTMASK;
-
- /* Stroke ? */
- if (ix.ix_Code & IECODE_UP_PREFIX)
- ykd->ykd_Stroke = HKSTROKE_UP;
- else
- if (~ix.ix_CodeMask & IECODE_UP_PREFIX)
- ykd->ykd_Stroke = HKSTROKE_DOWN_UP;
- else
- ykd->ykd_Stroke = HKSTROKE_DOWN;
-
- /* Code ? */
- if (!ix.ix_Code && (ix.ix_Class == IECLASS_RAWMOUSE))
- ykd->ykd_Code = NO_IECODE;
- else
- ykd->ykd_Code = ix.ix_Code & ~IECODE_UP_PREFIX;
- }
- else
- {
- if (ret == -2) /* NULL description */
- {
- ykd->ykd_Class = HKCLASS_RAWKEY;
- ykd->ykd_Qual = ykd->ykd_IQual = ykd->ykd_SQual = NO_IEQUALIFIER;
- ykd->ykd_Stroke = HKSTROKE_DOWN;
- ykd->ykd_Code = NO_IECODE;
- }
- }
-
- return ret;
- }
-
- static __regargs UWORD
- IsQualifierPad(UWORD code)
- {
- UWORD i;
-
- for (i=0; i<QUALIFIERSPAD_NUMBER; i++)
- if (QualifierPadArray[i].qpat_Code == code)
- return QualifierPadArray[i].qpat_Qualifier;
-
- return NO_IEQUALIFIER;
- }
-
-
- /* switch from misc window to keydef window */
- BOOL
- SwitchToKeyDefWindow(void)
- {
- static char title[80];
-
- strcpy(title, getString(DefKey_Window_TITLE));
- strcat(title, " : ");
- strcat(title, Actions1Nodes[curtype].ln_Name);
- KeyDefWdt = title;
-
- KeyDefLeft = HotKeyWnd->LeftEdge;
- WindowTop = HotKeyWnd->TopEdge;
-
- ParseKeyDef(curhk->yhk_KeyDef, &KeyDef);
-
- CloseHotKeyWindow();
- return ShowKeyDefWindow();
- }
-
-
- /* handle KeyDef window events */
- LONG
- HandleKeyDefIDCMP(void)
- {
- struct IntuiMessage *msg;
- struct Gadget *gadget;
- ULONG class;
- UWORD code;
- UWORD qual, newqual;
-
-
- while (msg = GT_GetIMsg(KeyDefWnd->UserPort))
- {
- class = msg->Class;
- code = msg->Code;
- qual = msg->Qualifier;
- gadget = (struct Gadget *)msg->IAddress;
- GT_ReplyIMsg(msg);
-
- switch (class)
- {
- case CLOSEWINDOW:
- HideInterface();
- return ROOT_OKAY;
-
- case GADGETUP:
- case GADGETDOWN:
- switch (gadget->GadgetID)
- {
- case GD_Class:
- 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:
- if ((KeyDef.ykd_Stroke=code) == HKSTROKE_UP)
- {
- KeyDef.ykd_Qual &= ~IEQUALIFIER_REPEAT;
- KeyDef.ykd_IQual &= ~IEQUALIFIER_REPEAT;
- }
-
- InitKeyDefGadgets();
- break;
-
- case GD_Desc:
- if (ParseKeyDef(GetString(gadget), &KeyDef) == -1)
- PostError(getString(Invalid_hotkey_specif_ERR));
-
- InitKeyDefGadgets();
-
- break;
-
- case GD_Cancel:
- if (!strcmp(curhk->yhk_Node.ln_Name,"<unset>"))
- {
- DeleteYakHotKey(curhk);
- curhk = NULL;
- }
- UpdateWindowsPosition();
- CloseKeyDefWindow();
- if (!ShowHotKeyWindow())
- PostError(getString(Couldnt_open_other_window_ERR));
- return ROOT_OKAY;
-
- case GD_Ok:
- ModifyYHKKeyDef(curhk, GetString(KeyDefGadgets[GDX_Desc]));
- UpdateWindowsPosition();
- CloseKeyDefWindow();
- if (ShowHotKeyWindow())
- {
- ActivateWindow(HotKeyWnd);
-
- if (YHK_Takes_Arg(curhk))
- ActivateGadget(HotKeyGadgets[GDX_Argument], HotKeyWnd, NULL);
- }
- else
- PostError(getString(Couldnt_open_other_window_ERR));
-
- return ROOT_OKAY;
-
- } /* switch (gadget->GadgetID) */
- break;
-
- 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;
-
- case REFRESHWINDOW:
- GT_BeginRefresh(KeyDefWnd);
- GT_EndRefresh(KeyDefWnd, TRUE);
- break;
-
- } /* switch (class) */
-
- } /* while more messages */
-
- return ROOT_OKAY;
- }
-
-
- void
- CloseKeyDefWindow( void )
- {
- CloseOneWindow (KeyDefWnd, NULL, KeyDefGList);
- KeyDefWnd = NULL;
- }
-
-
- void KeyDefRender( void )
- {
- UWORD Width, X;
-
- ComputeFont( KeyDefWidth, KeyDefHeight );
-
- Width = ComputeX( 517 ) ;
- X = OffX + ComputeX( 0 ) ;
-
- DrawBevelBox( KeyDefWnd->RPort, X,
- OffY + ComputeY( 65 ),
- Width,
- ComputeY( 20 ),
- GT_VisualInfo, VisualInfo, TAG_DONE );
- DrawBevelBox( KeyDefWnd->RPort, X,
- OffY + ComputeY( 0 ),
- Width,
- ComputeY( 65 ),
- GT_VisualInfo, VisualInfo, TAG_DONE );
- }
-
-
- int
- OpenKeyDefWindow( void )
- {
- struct NewGadget ng;
- struct Gadget *g;
- UWORD lc, tc;
- UWORD wleft = KeyDefLeft, wtop = WindowTop, ww, wh;
-
- ComputeFont( KeyDefWidth, KeyDefHeight );
-
- ww = ComputeX( KeyDefWidth );
- wh = ComputeY( KeyDefHeight );
-
- if (( wleft + ww + OffX + Scr->WBorRight ) > Scr->Width ) wleft = Scr->Width - ww;
- if (( wtop + wh + OffY + Scr->WBorBottom ) > Scr->Height ) wtop = Scr->Height - wh;
-
- if ( ! ( g = CreateContext( &KeyDefGList )))
- return( 1L );
-
- for( lc = 0, tc = 0; lc < KeyDef_CNT; lc++ ) {
-
- CopyMem((char * )&KeyDefNGad[ lc ], (char * )&ng, (long)sizeof( struct NewGadget ));
-
- ng.ng_VisualInfo = VisualInfo;
- ng.ng_TextAttr = Font;
- ng.ng_LeftEdge = OffX + ComputeX( ng.ng_LeftEdge );
- ng.ng_TopEdge = OffY + ComputeY( ng.ng_TopEdge );
- ng.ng_Width = ComputeX( ng.ng_Width );
- ng.ng_Height = ComputeY( ng.ng_Height);
-
- KeyDefGadgets[ lc ] = g = CreateGadgetA((ULONG)KeyDefGTypes[ lc ], g, &ng, ( struct TagItem * )&KeyDefGTags[ tc ] );
-
- while( KeyDefGTags[ tc ] ) tc += 2;
- tc++;
-
- if ( NOT g )
- return( 2L );
- }
-
- if ( ! ( KeyDefWnd = OpenWindowTags( NULL,
- WA_Left, wleft,
- WA_Top, wtop,
- WA_Width, ww + OffX + Scr->WBorRight,
- WA_Height, wh + OffY + Scr->WBorBottom,
- WA_IDCMP, CYCLEIDCMP|TEXTIDCMP|BUTTONIDCMP|IDCMP_MOUSEBUTTONS|IDCMP_CLOSEWINDOW|IDCMP_RAWKEY|IDCMP_REFRESHWINDOW,
- WA_Flags, WFLG_ACTIVATE|WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_CLOSEGADGET|WFLG_SMART_REFRESH|WFLG_RMBTRAP,
- WA_Gadgets, KeyDefGList,
- WA_Title, KeyDefWdt,
- WA_ScreenTitle, getString(COPYRIGHT_STRING),
- WA_PubScreen, TRUE,
- WA_PubScreenName,PubScreenName,
- TAG_DONE )))
- return( 4L );
-
- GT_RefreshWindow( KeyDefWnd, NULL );
-
- KeyDefRender();
-
- return( 0L );
- }
-
-
- /* show our KeyDef window */
- BOOL
- ShowKeyDefWindow(void)
- {
- if (!OpenKeyDefWindow()) /* like the name says... */
- {
- InitKeyDefGadgets();
- wndsigflag = 1 << KeyDefWnd->UserPort->mp_SigBit;
- curwin = KeyDefWnd;
- HandleIDCMP = HandleKeyDefIDCMP;
- return TRUE;
- }
- CloseDownScreen();
- return FALSE;
- }
-
-
-
-