/* * Key Map Editor ver 1.0 * Update Display * * parameters: GadgetList - pointer to linked list of Gadgets to update * KeyMapNode - KeyMapNode pointer * Option - Update Options (TRUE = all keys, FALSE = 1 key) * * by: Tim Friest * on: January 2, 1989 */ #include "KME_Includes.h" #include "KME_Protos.h" #include "KME_Defs.h" #include "KME_Globals.h" extern char GetKeyVal(UBYTE, ULONG, int); extern int GetKeyStr(char *, UBYTE, UBYTE *, int); extern char GetKeyDead(UBYTE, UBYTE *, int, UBYTE *); extern struct Gadget CloseBracketGadget; void UpdateDisplay(Gadget, KeyMapNode, UpdateAll) struct Gadget *Gadget; struct KeyMapNode *KeyMapNode; int UpdateAll; { struct Gadget *Gad; USHORT KeyCode; struct KeyMap *KeyMap; struct HalfKeyMap *HalfKeyMap; int Capsable; static char buff[256]; static struct IntuiText buffIText = { 1, 0, JAM1, 0, 0, NULL, buff, NULL }; int len; UBYTE color; struct IntuiText *IntuiText; int GadWidth; KeyMap = &KeyMapNode->kn_KeyMap; Gad = Gadget; KeyCode = Gad->GadgetID; do { if (KeyCode < 0x40) HalfKeyMap = (struct HalfKeyMap *)KeyMap; else { HalfKeyMap = (struct HalfKeyMap *)&KeyMap->km_HiKeyMapTypes; KeyCode -= 0x40; } len = 0; color = 1; Capsable = HalfKeyMap->Capsable[(KeyCode/8)] & (1<<(KeyCode % 8)); switch (HalfKeyMap->KeyMapTypes[KeyCode] & (KCF_DEAD|KCF_STRING|KCF_NOP)) { case KC_NOQUAL: buff[0] = GetKeyVal( HalfKeyMap->KeyMapTypes[KeyCode], HalfKeyMap->KeyMap[KeyCode], Capsable); buff[1] = '\x00'; len = 2; break; case KCF_STRING: len = GetKeyStr(buff, HalfKeyMap->KeyMapTypes[KeyCode], (UBYTE *)HalfKeyMap->KeyMap[KeyCode], Capsable); break; case KCF_DEAD: buff[0] = GetKeyDead( HalfKeyMap->KeyMapTypes[KeyCode], (UBYTE *)HalfKeyMap->KeyMap[KeyCode], Capsable, &color); buff[1] = '\x00'; len = 2; break; case KCF_NOP: default: len = 0; } /* switch */ if (len > 0) { GadWidth = Gad->Width; if (Gad->Activation & BOOLEXTEND) GadWidth -= 22; while ((len > 0) && (IntuiTextLength(&buffIText) > GadWidth)) buff[--len] = '\x00'; if (Gad->GadgetText == NULL) { IntuiText = (struct IntuiText *)AllocMem(sizeof(struct IntuiText), MEMF_CLEAR); if (IntuiText != NULL) { IntuiText->IText = (UBYTE *)AllocMem(len, 0); IntuiText->FrontPen = 1; IntuiText->BackPen = 0; IntuiText->DrawMode = JAM2; } } else { IntuiText = Gad->GadgetText; if (IntuiText->IText == NULL) IntuiText->IText = (UBYTE *)AllocMem(len, 0); else if (strlen(IntuiText->IText) != len) { FreeMem(IntuiText->IText, strlen(IntuiText->IText)+1); IntuiText->IText = (UBYTE *)AllocMem(len, 0); } } if (IntuiText != NULL) { if (IntuiText->IText != NULL) { if (buff[0] != '\x00') { strcpy(IntuiText->IText, buff); IntuiText->FrontPen = color; IntuiText->BackPen = 0; } else { IntuiText->IText[0] = '@'; IntuiText->IText[1] = '\x00'; IntuiText->FrontPen = 0; IntuiText->BackPen = 1; } if (buff[0] == ' ') IntuiText->BackPen = 1; IntuiText->LeftEdge = (GadWidth - IntuiTextLength(IntuiText))/2; if (Gad->Activation & BOOLEXTEND) IntuiText->LeftEdge += 22; Gad->GadgetText = IntuiText; FlagResource(RF_GadgetText); } else { FreeMem(IntuiText, sizeof(struct IntuiText)); Gad->GadgetText = NULL; } } } else if (Gad->GadgetText != NULL) if (Gad->GadgetText->IText != NULL) { FreeMem(Gad->GadgetText->IText, strlen(Gad->GadgetText->IText)+1); Gad->GadgetText->IText = NULL; } } while ((Gad = Gad->NextGadget) && ((KeyCode = Gad->GadgetID) < 0x60) && UpdateAll); if (CheckResource(RF_Window)) if (UpdateAll) RefreshGList(GadgetList, KeyMapEdWindow, NULL, DefinableKeys); else { RefreshGList(Gadget, KeyMapEdWindow, NULL, 1); if (Gadget->GadgetType == BOOLGADGET) /* kludge to fix return key overwriting this gadget */ RefreshGList(&CloseBracketGadget, KeyMapEdWindow, NULL, 1); } } /* * Get Key Value * * parameters: KeyType - Key Type Flags * KeyMap - Longword Key Map Value * KeyCapsable - Is key Caps Lockable * returns: Key Value */ char GetKeyVal(KeyType, KeyMap, KeyCapsable) UBYTE KeyType; ULONG KeyMap; int KeyCapsable; { char KeyVal = '\x00'; ULONG CurrentStatus; CurrentStatus = StatusFlags; if (CheckFlag(SF_CapsLock)) if (KeyCapsable) CurrentStatus |= SF_Shift; switch(KeyType & KC_VANILLA) { case KC_NOQUAL: KeyVal = KeyMap & 0x000000FF; break; case KCF_SHIFT: if (!(CurrentStatus & SF_Shift)) KeyVal = KeyMap & 0x000000FF; else KeyVal = ((KeyMap & 0x0000FF00)>>8); break; case KCF_ALT: if (!(CurrentStatus & SF_Alt)) KeyVal = KeyMap & 0x000000FF; else KeyVal = ((KeyMap & 0x0000FF00)>>8); break; case KCF_CONTROL: if (!(CurrentStatus & SF_Control)) KeyVal = KeyMap & 0x000000FF; else KeyVal = ((KeyMap & 0x0000FF00)>>8); break; case KCF_ALT|KCF_SHIFT: switch (CurrentStatus & (SF_Shift|SF_Alt)) { case 0: /* Shift and Alt are not pressed */ KeyVal = KeyMap & 0x000000FF; break; case SF_Shift: KeyVal = ((KeyMap & 0x0000FF00)>>8); break; case SF_Alt: KeyVal = ((KeyMap & 0x00FF0000)>>16); break; case SF_Shift|SF_Alt: KeyVal = ((KeyMap & 0xFF000000)>>24); } /* switch */ break; case KCF_CONTROL|KCF_SHIFT: switch (CurrentStatus & (SF_Shift|SF_Control)) { case 0: /* Shift and Control are not pressed */ KeyVal = KeyMap & 0x000000FF; break; case SF_Shift: KeyVal = ((KeyMap & 0x0000FF00)>>8); break; case SF_Control: KeyVal = ((KeyMap & 0x00FF0000)>>16); break; case SF_Shift|SF_Control: KeyVal = ((KeyMap & 0xFF000000)>>24); } /* switch */ break; case KCF_CONTROL|KCF_ALT: switch (CurrentStatus & (SF_Control|SF_Alt)) { case 0: /* Control and Alt are not pressed */ KeyVal = KeyMap & 0x000000FF; break; case SF_Alt: KeyVal = ((KeyMap & 0x0000FF00)>>8); break; case SF_Control: KeyVal = ((KeyMap & 0x00FF0000)>>16); break; case SF_Alt|SF_Control: KeyVal = ((KeyMap & 0xFF000000)>>24); } /* switch */ break; case KC_VANILLA: switch (CurrentStatus & (SF_Shift|SF_Alt)) { case 0: /* Shift and Alt are not pressed */ KeyVal = KeyMap & 0x000000FF; break; case SF_Shift: KeyVal = ((KeyMap & 0x0000FF00)>>8); break; case SF_Alt: KeyVal = ((KeyMap & 0x00FF0000)>>16); break; case SF_Shift|SF_Alt: KeyVal = ((KeyMap & 0xFF000000)>>24); } /* switch */ if (CurrentStatus & SF_Control) if ((KeyMap & 0x00000040) && (!((CurrentStatus & SF_Shift) && (KeyMap & 0x00000040)))) KeyVal = KeyMap & 0x0000009F; else if (KeyMap & 0x00004000) KeyVal = ((KeyMap & 0x00009F00)>>8); } /* switch */ return(KeyVal); } /* * Get Key String * * parameters: KeyStr - String to receive key's string * KeyType - Key Type Flags * KeyMap - Longword Key Map Value * KeyCapsable - Is key Caps Lockable * returns: String length */ int GetKeyStr(KeyStr, KeyType, KeyMap, KeyCapsable) char *KeyStr; UBYTE KeyType; UBYTE *KeyMap; int KeyCapsable; { ULONG CurrentStatus; int len = 0; CurrentStatus = StatusFlags; if (CheckFlag(SF_CapsLock)) if (KeyCapsable) CurrentStatus |= SF_Shift; switch(KeyType & KC_VANILLA) { case KC_NOQUAL: len = *KeyMap; memcpy(KeyStr, (KeyMap + *(KeyMap+1)), len); break; case KCF_SHIFT: if (!(CurrentStatus & SF_Shift)) { len = *KeyMap; memcpy(KeyStr, (KeyMap + *(KeyMap+1)), len); } else { len = *(KeyMap+2); memcpy(KeyStr, (KeyMap + *(KeyMap+3)), len); } break; case KCF_ALT: if (!(CurrentStatus & SF_Alt)) { len = *KeyMap; memcpy(KeyStr, (KeyMap + *(KeyMap+1)), len); } else { len = *(KeyMap+2); memcpy(KeyStr, (KeyMap + *(KeyMap+3)), len); } break; case KCF_CONTROL: if (!(CurrentStatus & SF_Control)) { len = *KeyMap; memcpy(KeyStr, (KeyMap + *(KeyMap+1)), len); } else { len = *(KeyMap+2); memcpy(KeyStr, (KeyMap + *(KeyMap+3)), len); } break; case KCF_ALT|KCF_SHIFT: switch (CurrentStatus & (SF_Shift|SF_Alt)) { case 0: /* Shift and Alt are not pressed */ len = *KeyMap; memcpy(KeyStr, (KeyMap + *(KeyMap+1)), len); break; case SF_Shift: len = *(KeyMap+2); memcpy(KeyStr, (KeyMap + *(KeyMap+3)), len); break; case SF_Alt: len = *(KeyMap+4); memcpy(KeyStr, (KeyMap + *(KeyMap+5)), len); break; case SF_Shift|SF_Alt: len = *(KeyMap+6); memcpy(KeyStr, (KeyMap + *(KeyMap+7)), len); } /* switch */ break; case KCF_CONTROL|KCF_SHIFT: switch (CurrentStatus & (SF_Shift|SF_Control)) { case 0: /* Shift and Control are not pressed */ len = *KeyMap; memcpy(KeyStr, (KeyMap + *(KeyMap+1)), len); break; case SF_Shift: len = *(KeyMap+2); memcpy(KeyStr, (KeyMap + *(KeyMap+3)), len); break; case SF_Control: len = *(KeyMap+4); memcpy(KeyStr, (KeyMap + *(KeyMap+5)), len); break; case SF_Shift|SF_Control: len = *(KeyMap+6); memcpy(KeyStr, (KeyMap + *(KeyMap+7)), len); } /* switch */ break; case KCF_CONTROL|KCF_ALT: switch (CurrentStatus & (SF_Control|SF_Alt)) { case 0: /* Alt and Control are not pressed */ len = *KeyMap; memcpy(KeyStr, (KeyMap + *(KeyMap+1)), len); break; case SF_Alt: len = *(KeyMap+2); memcpy(KeyStr, (KeyMap + *(KeyMap+3)), len); break; case SF_Control: len = *(KeyMap+4); memcpy(KeyStr, (KeyMap + *(KeyMap+5)), len); break; case SF_Alt|SF_Control: len = *(KeyMap+6); memcpy(KeyStr, (KeyMap + *(KeyMap+7)), len); } /* switch */ break; case KC_VANILLA: switch (CurrentStatus & (SF_Shift|SF_Control|SF_Alt)) { case 0: /* Shift, Alt and Control are not pressed */ len = *KeyMap; memcpy(KeyStr, (KeyMap + *(KeyMap+1)), len); break; case SF_Shift: len = *(KeyMap+2); memcpy(KeyStr, (KeyMap + *(KeyMap+3)), len); break; case SF_Alt: len = *(KeyMap+4); memcpy(KeyStr, (KeyMap + *(KeyMap+5)), len); break; case SF_Shift|SF_Alt: len = *(KeyMap+6); memcpy(KeyStr, (KeyMap + *(KeyMap+7)), len); break; case SF_Control: len = *(KeyMap+8); memcpy(KeyStr, (KeyMap + *(KeyMap+9)), len); break; case SF_Shift|SF_Control: len = *(KeyMap+10); memcpy(KeyStr, (KeyMap + *(KeyMap+11)), len); break; case SF_Control|SF_Alt: len = *(KeyMap+12); memcpy(KeyStr, (KeyMap + *(KeyMap+13)), len); break; case SF_Shift|SF_Control|SF_Alt: len = *(KeyMap+14); memcpy(KeyStr, (KeyMap + *(KeyMap+15)), len); } /* switch */ } /* switch */ if (len > 0) KeyStr[len++] = '\x00'; return(len); } /* * Get Key Dead * * parameters: KeyType - Key Type Flags * KeyMap - Longword Key Map Value * KeyCapsable - Is key Caps Lockable * returns: Key Value */ char GetKeyDead(KeyType, KeyMap, KeyCapsable, color) UBYTE KeyType; UBYTE *KeyMap; int KeyCapsable; UBYTE *color; { static char Accents[] = { '\xB4', '`', '^', '~', '\xA8' }; ULONG CurrentStatus; char KeyVal = '\x00'; CurrentStatus = StatusFlags; if (CheckFlag(SF_CapsLock)) if (KeyCapsable) CurrentStatus |= SF_Shift; *color = 1; switch (KeyType & KC_VANILLA) { case KC_NOQUAL: switch (*KeyMap) { case KC_NOQUAL: KeyVal = *(KeyMap+1); break; case DPF_MOD: KeyVal = *(KeyMap + *(KeyMap+1)); break; case DPF_DEAD: KeyVal = Accents[*(KeyMap+1)-1]; *color = 3; } /* switch */ break; case KCF_SHIFT: if (!(CurrentStatus & SF_Shift)) switch (*KeyMap) { case KC_NOQUAL: KeyVal = *(KeyMap+1); break; case DPF_MOD: KeyVal = *(KeyMap + *(KeyMap+1)); break; case DPF_DEAD: KeyVal = Accents[*(KeyMap+1)-1]; *color = 3; } /* switch */ else switch (*(KeyMap+2)) { case KC_NOQUAL: KeyVal = *(KeyMap+3); break; case DPF_MOD: KeyVal = *(KeyMap + *(KeyMap+3)); break; case DPF_DEAD: KeyVal = Accents[*(KeyMap+3)-1]; *color = 3; } /* switch */ break; case KCF_ALT: if (!(CurrentStatus & SF_Alt)) switch (*KeyMap) { case KC_NOQUAL: KeyVal = *(KeyMap+1); break; case DPF_MOD: KeyVal = *(KeyMap + *(KeyMap+1)); break; case DPF_DEAD: KeyVal = Accents[*(KeyMap+1)-1]; *color = 3; } /* switch */ else switch (*(KeyMap+2)) { case KC_NOQUAL: KeyVal = *(KeyMap+3); break; case DPF_MOD: KeyVal = *(KeyMap + *(KeyMap+3)); break; case DPF_DEAD: KeyVal = Accents[*(KeyMap+3)-1]; *color = 3; } /* switch */ break; case KCF_CONTROL: if (!(CurrentStatus & SF_Control)) switch (*KeyMap) { case KC_NOQUAL: KeyVal = *(KeyMap+1); break; case DPF_MOD: KeyVal = *(KeyMap + *(KeyMap+1)); break; case DPF_DEAD: KeyVal = Accents[*(KeyMap+1)-1]; *color = 3; } /* switch */ else switch (*(KeyMap+2)) { case KC_NOQUAL: KeyVal = *(KeyMap+3); break; case DPF_MOD: KeyVal = *(KeyMap + *(KeyMap+3)); break; case DPF_DEAD: KeyVal = Accents[*(KeyMap+3)-1]; *color = 3; } /* switch */ break; case KCF_SHIFT|KCF_ALT: switch (CurrentStatus & (SF_Shift|SF_Alt)) { case 0: /* Shift and Alt not selected */ switch (*KeyMap) { case KC_NOQUAL: KeyVal = *(KeyMap+1); break; case DPF_MOD: KeyVal = *(KeyMap + *(KeyMap+1)); break; case DPF_DEAD: KeyVal = Accents[*(KeyMap+1)-1]; *color = 3; } /* switch */ break; case SF_Shift: switch (*(KeyMap+2)) { case KC_NOQUAL: KeyVal = *(KeyMap+3); break; case DPF_MOD: KeyVal = *(KeyMap + *(KeyMap+3)); break; case DPF_DEAD: KeyVal = Accents[*(KeyMap+3)-1]; *color = 3; } /* switch */ break; case SF_Alt: switch (*(KeyMap+4)) { case KC_NOQUAL: KeyVal = *(KeyMap+5); break; case DPF_MOD: KeyVal = *(KeyMap + *(KeyMap+5)); break; case DPF_DEAD: KeyVal = Accents[*(KeyMap+5)-1]; *color = 3; } /* switch */ break; case SF_Shift|SF_Alt: switch (*(KeyMap+6)) { case KC_NOQUAL: KeyVal = *(KeyMap+7); break; case DPF_MOD: KeyVal = *(KeyMap + *(KeyMap+7)); break; case DPF_DEAD: KeyVal = Accents[*(KeyMap+7)-1]; *color = 3; } /* switch */ } /* switch */ break; case KCF_SHIFT|KCF_CONTROL: switch (CurrentStatus & (SF_Shift|SF_Control)) { case 0: /* Shift and Control not selected */ switch (*KeyMap) { case KC_NOQUAL: KeyVal = *(KeyMap+1); break; case DPF_MOD: KeyVal = *(KeyMap + *(KeyMap+1)); break; case DPF_DEAD: KeyVal = Accents[*(KeyMap+1)-1]; *color = 3; } /* switch */ break; case SF_Shift: switch (*(KeyMap+2)) { case KC_NOQUAL: KeyVal = *(KeyMap+3); break; case DPF_MOD: KeyVal = *(KeyMap + *(KeyMap+3)); break; case DPF_DEAD: KeyVal = Accents[*(KeyMap+3)-1]; *color = 3; } /* switch */ break; case SF_Control: switch (*(KeyMap+4)) { case KC_NOQUAL: KeyVal = *(KeyMap+5); break; case DPF_MOD: KeyVal = *(KeyMap + *(KeyMap+5)); break; case DPF_DEAD: KeyVal = Accents[*(KeyMap+5)-1]; *color = 3; } /* switch */ break; case SF_Shift|SF_Control: switch (*(KeyMap+6)) { case KC_NOQUAL: KeyVal = *(KeyMap+7); break; case DPF_MOD: KeyVal = *(KeyMap + *(KeyMap+7)); break; case DPF_DEAD: KeyVal = Accents[*(KeyMap+7)-1]; *color = 3; } /* switch */ } /* switch */ break; case KCF_ALT|KCF_CONTROL: switch (CurrentStatus & (SF_Alt|SF_Control)) { case 0: /* Alt and Control not selected */ switch (*KeyMap) { case KC_NOQUAL: KeyVal = *(KeyMap+1); break; case DPF_MOD: KeyVal = *(KeyMap + *(KeyMap+1)); break; case DPF_DEAD: KeyVal = Accents[*(KeyMap+1)-1]; *color = 3; } /* switch */ break; case SF_Alt: switch (*(KeyMap+2)) { case KC_NOQUAL: KeyVal = *(KeyMap+3); break; case DPF_MOD: KeyVal = *(KeyMap + *(KeyMap+3)); break; case DPF_DEAD: KeyVal = Accents[*(KeyMap+3)-1]; *color = 3; } /* switch */ break; case SF_Control: switch (*(KeyMap+4)) { case KC_NOQUAL: KeyVal = *(KeyMap+5); break; case DPF_MOD: KeyVal = *(KeyMap + *(KeyMap+5)); break; case DPF_DEAD: KeyVal = Accents[*(KeyMap+5)-1]; *color = 3; } /* switch */ break; case SF_Alt|SF_Control: switch (*(KeyMap+6)) { case KC_NOQUAL: KeyVal = *(KeyMap+7); break; case DPF_MOD: KeyVal = *(KeyMap + *(KeyMap+7)); break; case DPF_DEAD: KeyVal = Accents[*(KeyMap+7)-1]; *color = 3; } /* switch */ } /* switch */ break; case KC_VANILLA: switch (CurrentStatus & (SF_Shift|SF_Alt|SF_Control)) { case 0: /* Shift, Alt and Control not selected */ switch (*KeyMap) { case KC_NOQUAL: KeyVal = *(KeyMap+1); break; case DPF_MOD: KeyVal = *(KeyMap + *(KeyMap+1)); break; case DPF_DEAD: KeyVal = Accents[*(KeyMap+1)-1]; *color = 3; } /* switch */ break; case SF_Shift: switch (*(KeyMap+2)) { case KC_NOQUAL: KeyVal = *(KeyMap+3); break; case DPF_MOD: KeyVal = *(KeyMap + *(KeyMap+3)); break; case DPF_DEAD: KeyVal = Accents[*(KeyMap+3)-1]; *color = 3; } /* switch */ break; case SF_Alt: switch (*(KeyMap+4)) { case KC_NOQUAL: KeyVal = *(KeyMap+5); break; case DPF_MOD: KeyVal = *(KeyMap + *(KeyMap+5)); break; case DPF_DEAD: KeyVal = Accents[*(KeyMap+5)-1]; *color = 3; } /* switch */ break; case SF_Shift|SF_Alt: switch (*(KeyMap+6)) { case KC_NOQUAL: KeyVal = *(KeyMap+7); break; case DPF_MOD: KeyVal = *(KeyMap + *(KeyMap+7)); break; case DPF_DEAD: KeyVal = Accents[*(KeyMap+7)-1]; *color = 3; } /* switch */ break; case SF_Control: switch (*(KeyMap+8)) { case KC_NOQUAL: KeyVal = *(KeyMap+9); break; case DPF_MOD: KeyVal = *(KeyMap + *(KeyMap+9)); break; case DPF_DEAD: KeyVal = Accents[*(KeyMap+9)-1]; *color = 3; } /* switch */ break; case SF_Shift|SF_Control: switch (*(KeyMap+10)) { case KC_NOQUAL: KeyVal = *(KeyMap+11); break; case DPF_MOD: KeyVal = *(KeyMap + *(KeyMap+11)); break; case DPF_DEAD: KeyVal = Accents[*(KeyMap+11)-1]; *color = 3; } /* switch */ break; case SF_Alt|SF_Control: switch (*(KeyMap+12)) { case KC_NOQUAL: KeyVal = *(KeyMap+13); break; case DPF_MOD: KeyVal = *(KeyMap + *(KeyMap+13)); break; case DPF_DEAD: KeyVal = Accents[*(KeyMap+13)-1]; *color = 3; } /* switch */ break; case SF_Shift|SF_Alt|SF_Control: switch (*(KeyMap+14)) { case KC_NOQUAL: KeyVal = *(KeyMap+15); break; case DPF_MOD: KeyVal = *(KeyMap + *(KeyMap+15)); break; case DPF_DEAD: KeyVal = Accents[*(KeyMap+15)-1]; *color = 3; } /* switch */ } /* switch */ } /* switch */ return(KeyVal); }