diff --git a/src/prefs/keymap/Keymap.cpp b/src/prefs/keymap/Keymap.cpp index af9192b2c4..a4ba220feb 100644 --- a/src/prefs/keymap/Keymap.cpp +++ b/src/prefs/keymap/Keymap.cpp @@ -51,41 +51,6 @@ print_key( char *chars, int32 offset ) } -void -Keymap::GetChars(uint32 keyCode, uint32 modifiers, char **chars, int32 *numBytes) -{ - int32 offset = 0; - switch (modifiers & 0xff) { - case B_SHIFT_KEY: offset = fKeys.shift_map[keyCode]; break; - case B_CAPS_LOCK: offset = fKeys.caps_map[keyCode]; break; - case B_CAPS_LOCK|B_SHIFT_KEY: offset = fKeys.caps_shift_map[keyCode]; break; - case B_OPTION_KEY: offset = fKeys.option_map[keyCode]; break; - case B_OPTION_KEY|B_SHIFT_KEY: offset = fKeys.option_shift_map[keyCode]; break; - case B_OPTION_KEY|B_CAPS_LOCK: offset = fKeys.option_caps_map[keyCode]; break; - case B_OPTION_KEY|B_SHIFT_KEY|B_CAPS_LOCK: offset = fKeys.option_caps_shift_map[keyCode]; break; - case B_CONTROL_KEY: offset = fKeys.control_map[keyCode]; break; - default: offset = fKeys.normal_map[keyCode]; break; - } - - *numBytes = fChars[offset++]; - - switch( *numBytes ) { - case 0: - // Not mapped - *chars = NULL; - break; - default: - // 1-, 2-, 3-, or 4-byte UTF-8 character - { - char *str = *chars = new char[*numBytes + 1]; - strncpy(str, &(fChars[offset]), *numBytes ); - str[*numBytes] = 0; - } - break; - } -} - - void Keymap::DumpKeymap() { @@ -109,6 +74,13 @@ Keymap::DumpKeymap() } +/* + file format in big endian : + struct key_map + uint32 size of following charset + charset (offsets go into this with size of character followed by character) +*/ +// we load a map from a file status_t Keymap::Load(entry_ref &ref) { @@ -141,6 +113,7 @@ Keymap::Load(entry_ref &ref) } +// we save a map from a file status_t Keymap::Save(entry_ref &ref) { @@ -177,6 +150,9 @@ Keymap::Save(entry_ref &ref) } +/* we need to know if a key is a modifier key to choose + a valid key when several are pressed together +*/ bool Keymap::IsModifierKey(uint32 keyCode) { @@ -196,13 +172,14 @@ Keymap::IsModifierKey(uint32 keyCode) } +// tell if a key is a dead key, needed for draw a dead key uint8 Keymap::IsDeadKey(uint32 keyCode, uint32 modifiers) { int32 offset; uint32 tableMask = 0; - switch (modifiers & 0xff) { + switch (modifiers & 0xcf) { case B_SHIFT_KEY: offset = fKeys.shift_map[keyCode]; tableMask = B_SHIFT_TABLE; break; case B_CAPS_LOCK: offset = fKeys.caps_map[keyCode]; tableMask = B_CAPS_TABLE; break; case B_CAPS_LOCK|B_SHIFT_KEY: offset = fKeys.caps_shift_map[keyCode]; tableMask = B_CAPS_SHIFT_TABLE; break; @@ -261,6 +238,7 @@ Keymap::IsDeadKey(uint32 keyCode, uint32 modifiers) } +// tell if a key is a dead second key, needed for draw a dead second key bool Keymap::IsDeadSecondKey(uint32 keyCode, uint32 modifiers, uint8 activeDeadKey) { @@ -269,7 +247,7 @@ Keymap::IsDeadSecondKey(uint32 keyCode, uint32 modifiers, uint8 activeDeadKey) int32 offset; - switch (modifiers & 0xff) { + switch (modifiers & 0xcf) { case B_SHIFT_KEY: offset = fKeys.shift_map[keyCode]; break; case B_CAPS_LOCK: offset = fKeys.caps_map[keyCode]; break; case B_CAPS_LOCK|B_SHIFT_KEY: offset = fKeys.caps_shift_map[keyCode]; break; @@ -285,10 +263,6 @@ Keymap::IsDeadSecondKey(uint32 keyCode, uint32 modifiers, uint8 activeDeadKey) if (!numBytes) return false; - - char chars[4]; - strncpy(chars, &(fChars[offset+1]), numBytes ); - chars[numBytes] = 0; int32* deadOffsets[] = { fKeys.acute_dead_key, @@ -302,30 +276,49 @@ Keymap::IsDeadSecondKey(uint32 keyCode, uint32 modifiers, uint8 activeDeadKey) for (int32 i=0; i<32; i++) { if (offset == deadOffset[i]) - return i+1; + return true; - uint32 deadNumBytes = fChars[deadOffset[i]+1]; + uint32 deadNumBytes = fChars[deadOffset[i]]; if (!deadNumBytes) continue; - if (strncmp(chars, &(fChars[deadOffset[i]]), deadNumBytes ) == 0) { + if (strncmp(&(fChars[offset+1]), &(fChars[deadOffset[i]+1]), deadNumBytes ) == 0) return true; - } i++; } return false; } +// get the char for a key given modifiers and active dead key void -Keymap::DeadKey(uint32 keyCode, uint32 modifiers, uint8 activeDeadKey, char** chars, int32* numBytes) +Keymap::GetChars(uint32 keyCode, uint32 modifiers, uint8 activeDeadKey, char** chars, int32* numBytes) { int32 offset; *numBytes = 0; + *chars = NULL; - switch (modifiers & 0xff) { + // here we take NUMLOCK into account + if (modifiers & B_NUM_LOCK) + switch (keyCode) { + case 0x37: + case 0x38: + case 0x39: + case 0x48: + case 0x49: + case 0x4a: + case 0x58: + case 0x59: + case 0x5a: + case 0x64: + case 0x65: + modifiers ^= B_SHIFT_KEY; + } + + // here we choose the right map given the modifiers + switch (modifiers & 0xcf) { case B_SHIFT_KEY: offset = fKeys.shift_map[keyCode]; break; case B_CAPS_LOCK: offset = fKeys.caps_map[keyCode]; break; case B_CAPS_LOCK|B_SHIFT_KEY: offset = fKeys.caps_shift_map[keyCode]; break; @@ -337,15 +330,13 @@ Keymap::DeadKey(uint32 keyCode, uint32 modifiers, uint8 activeDeadKey, char** ch default: offset = fKeys.normal_map[keyCode]; break; } - uint32 numBytes2 = fChars[offset]; + // here we get the char size + *numBytes = fChars[offset]; - if (!numBytes2) + if (!*numBytes) return; - char chars2[4]; - strncpy(chars2, &(fChars[offset+1]), numBytes2 ); - chars2[numBytes2] = 0; - + // here we take an potential active dead key int32 *dead_key; switch(activeDeadKey) { case 1: dead_key = fKeys.acute_dead_key; break; @@ -353,11 +344,20 @@ Keymap::DeadKey(uint32 keyCode, uint32 modifiers, uint8 activeDeadKey, char** ch case 3: dead_key = fKeys.circumflex_dead_key; break; case 4: dead_key = fKeys.dieresis_dead_key; break; case 5: dead_key = fKeys.tilde_dead_key; break; - //default: return; + default: + { + // if not dead, we copy and return the char + char *str = *chars = new char[*numBytes + 1]; + strncpy(str, &(fChars[offset+1]), *numBytes ); + str[*numBytes] = 0; + return; + } } + // if dead key, we search for our current offset char in the dead key offset table + // string comparison is needed for (int32 i=0; i<32; i++) { - if (strncmp(chars2, &(fChars[dead_key[i]+1]), numBytes2 ) == 0) { + if (strncmp(&(fChars[offset+1]), &(fChars[dead_key[i]+1]), *numBytes ) == 0) { *numBytes = fChars[dead_key[i+1]]; switch( *numBytes ) { @@ -374,14 +374,22 @@ Keymap::DeadKey(uint32 keyCode, uint32 modifiers, uint8 activeDeadKey, char** ch } break; } - break; + return; } i++; } + + // if not found we return the current char mapped + *chars = new char[*numBytes + 1]; + strncpy(*chars, &(fChars[offset+1]), *numBytes ); + (*chars)[*numBytes] = 0; + } status_t _restore_key_map_(); + +// we make our input server use the map in /boot/home/config/settings/Keymap status_t Keymap::Use() { diff --git a/src/prefs/keymap/Keymap.h b/src/prefs/keymap/Keymap.h index 6d286edecd..9ab42c839c 100644 --- a/src/prefs/keymap/Keymap.h +++ b/src/prefs/keymap/Keymap.h @@ -25,11 +25,10 @@ public: status_t Load(entry_ref &ref); status_t Save(entry_ref &ref); void DumpKeymap(); - void GetChars(uint32 keyCode, uint32 modifiers, char **chars, int32 *numBytes); bool IsModifierKey(uint32 keyCode); uint8 IsDeadKey(uint32 keyCode, uint32 modifiers); bool IsDeadSecondKey(uint32 keyCode, uint32 modifiers, uint8 activeDeadKey); - void DeadKey(uint32 keyCode, uint32 modifiers, uint8 activeDeadKey, char** chars, int32* numBytes); + void GetChars(uint32 keyCode, uint32 modifiers, uint8 activeDeadKey, char** chars, int32* numBytes); status_t Use(); private: char *fChars; diff --git a/src/prefs/keymap/KeymapWindow.cpp b/src/prefs/keymap/KeymapWindow.cpp index 0278c69d09..b9a1115a08 100644 --- a/src/prefs/keymap/KeymapWindow.cpp +++ b/src/prefs/keymap/KeymapWindow.cpp @@ -419,6 +419,8 @@ MapView::MapView(BRect rect, const char *name, Keymap* keymap) fCurrentMap(keymap), fCurrentMouseKey(0) { + SetViewColor(B_TRANSPARENT_COLOR); + BRect frameRect = BRect(14, 16, Bounds().right-12, 30); BRect textRect = frameRect; textRect.OffsetTo(B_ORIGIN); @@ -429,363 +431,471 @@ MapView::MapView(BRect rect, const char *name, Keymap* keymap) fTextView->MakeSelectable(true); AddChild(fTextView); - + + for (uint32 j = 0; j<128; j++) + fKeysToDraw[j] = false; + BRect keyRect = BRect(11,50,29,68); - int32 i = 1; + uint32 i = 1; fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; // Fx keys i++; keyRect.OffsetBySelf(36,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(27,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(27,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; // Pause, PrintScreen, ... i++; keyRect.OffsetBySelf(35,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; // 1st line : numbers and backspace i++; keyRect = BRect(11,78,29,96); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); keyRect.right += 18; fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; keyRect.left += 18; // Insert, pg up ... i++; keyRect.OffsetBySelf(35,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; // 2nd line : tab and azerty ... i = 0x26; keyRect = BRect(11,96,38,114); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(27,0); keyRect.right -= 9; fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); keyRect.right += 9; fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; keyRect.left += 9; // Suppr, pg down ... i++; keyRect.OffsetBySelf(35,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; // 3rd line : caps and qsdfg ... i = 0x3b; keyRect = BRect(11,114,47,132); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(36,0); keyRect.right -= 18; fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); keyRect.right += 18; fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; keyRect.left += 18; // 4th line : shift and wxcv ... i = 0x4b; keyRect = BRect(11,132,56,150); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(45,0); keyRect.right -= 27; fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); keyRect.right += 27; fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; keyRect.left += 27; //5th line : Ctrl, Alt, Space ... i = 0x5c; keyRect = BRect(11,150,38,168); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(27,0); keyRect.OffsetBySelf(26,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(27,0); keyRect.right += 92; fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.right -= 92; keyRect.OffsetBySelf(92,0); keyRect.OffsetBySelf(27,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(26,0); keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; // Arrows i++; keyRect = BRect(298,150,316,168); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i = 0x57; keyRect.OffsetBySelf(-18,-18); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; // numkeys i = 0x22; keyRect = BRect(369,78,387,96); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i = 0x37; keyRect.OffsetBySelf(-54, 18); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); keyRect.bottom += 18; fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i = 0x48; keyRect.bottom -= 18; keyRect.OffsetBySelf(-54, 18); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i = 0x58; keyRect.OffsetBySelf(-36, 18); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.OffsetBySelf(18,0); keyRect.bottom += 18; fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i = 0x64; keyRect.bottom -= 18; keyRect.OffsetBySelf(-54, 18); keyRect.right += 18; fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; i++; keyRect.right -= 18; keyRect.OffsetBySelf(36,0); fKeysRect[i] = keyRect; + fKeysToDraw[i] = true; - for (uint8 j = 0; j<128; j++) + for (uint32 j = 0; j<128; j++) fKeysVertical[j] = false; fKeysVertical[0x5e] = true; fActiveDeadKey = 0; + + for (int8 j=0; j<16; j++) + fOldKeyInfo.key_states[j] = 0; + fOldKeyInfo.modifiers = 0; } @@ -829,128 +939,24 @@ MapView::Draw(BRect rect) StrokeLine(BPoint(r.right-9, r.bottom), BPoint(r.right-2, r.bottom)); StrokeLine(BPoint(r.right, r.bottom-9), BPoint(r.right, r.bottom-2)); - int32 i = 1; + InvalidateKeys(); // Esc key - DrawKey(i); - DrawBorder(BRect(10,49,30,69)); // Fx keys - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - DrawBorder(BRect(46, 49, 120, 69)); - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - DrawBorder(BRect(127, 49, 201, 69)); - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - DrawBorder(BRect(208, 49, 282, 69)); // Pause, PrintScreen, ... - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - DrawBorder(BRect(297, 49, 353, 69)); - // 1st line : numbers and backspace - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - // Insert, pg up ... - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - DrawBorder(BRect(297, 77, 353, 115)); - // 2nd line : tab and azerty ... - i = 0x26; - DrawKey(i); - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - - // Suppr, pg down ... - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - - // 3rd line : caps and qsdfg ... - i = 0x3b; - - DrawKey(i); - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - - // 4th line : shift and wxcv ... - i = 0x4b; - DrawKey(i); - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - - - //5th line : Ctrl, Alt, Space ... - i = 0x5c; - DrawKey(i); - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - SetHighColor(80,80,80); StrokeLine(BPoint(10,169), BPoint(10,77)); StrokeLine(BPoint(282,77)); @@ -971,13 +977,6 @@ MapView::Draw(BRect rect) StrokeLine(BPoint(11,169)); // Arrows - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - - i = 0x57; - DrawKey(i); - SetHighColor(80,80,80); StrokeLine(BPoint(297,169), BPoint(297,149)); StrokeLine(BPoint(315,149)); @@ -990,33 +989,6 @@ MapView::Draw(BRect rect) StrokeLine(BPoint(298,169)); // numkeys - i = 0x22; - DrawKey(i); - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - - i = 0x37; - DrawKey(i); - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - - i = 0x48; - DrawKey(i); - DrawKey(++i); - DrawKey(++i); - - i = 0x58; - DrawKey(i); - DrawKey(++i); - DrawKey(++i); - DrawKey(++i); - - i = 0x64; - DrawKey(i); - DrawKey(++i); - DrawBorder(BRect(368, 77, 442, 169)); // lights @@ -1107,6 +1079,15 @@ MapView::Draw(BRect rect) } +void +MapView::InvalidateKeys() +{ + for (uint32 i=0; i<128; i++) + if (fKeysToDraw[i+1]) + DrawKey(i+1); +} + + void MapView::DrawKey(uint32 keyCode) { @@ -1253,7 +1234,7 @@ MapView::DrawKey(uint32 keyCode) char *str; int32 numBytes; - fCurrentMap->GetChars(keyCode, fOldKeyInfo.modifiers, &str, &numBytes); + fCurrentMap->GetChars(keyCode, fOldKeyInfo.modifiers, fActiveDeadKey, &str, &numBytes); if (str) { bool hasGlyphs; if (deadKey>0) { @@ -1331,8 +1312,6 @@ MapView::MessageReceived(BMessage *msg) const uint8 *states; ssize_t size; - //msg->PrintToStream(); - if ((msg->FindData("states", 'UBYT', (const void **)&states, &size)!=B_OK) || (msg->FindInt32("modifiers", (int32 *)&info.modifiers)!=B_OK)) break; @@ -1341,7 +1320,7 @@ MapView::MessageReceived(BMessage *msg) fOldKeyInfo.modifiers = info.modifiers; for (int8 i=0; i<16; i++) fOldKeyInfo.key_states[i] = states[i]; - Invalidate(); + InvalidateKeys(); } else { int32 keyCode = -1; @@ -1357,12 +1336,6 @@ MapView::MessageReceived(BMessage *msg) } - if (fActiveDeadKey) { - - } - // - - if (keyCode<0) for (int8 i=0; i<16; i++) { uint8 stbits = states[i]; @@ -1380,30 +1353,27 @@ MapView::MessageReceived(BMessage *msg) if (Window()->IsActive() && msg->what == B_KEY_DOWN) { fTextView->MakeFocus(); - char *str; + char *str = NULL; int32 numBytes; if (fActiveDeadKey) { - fCurrentMap->DeadKey(keyCode, fOldKeyInfo.modifiers, fActiveDeadKey, &str, &numBytes); + fCurrentMap->GetChars(keyCode, fOldKeyInfo.modifiers, fActiveDeadKey, &str, &numBytes); if (numBytes>0) { fTextView->FakeKeyDown(str, numBytes); } fActiveDeadKey = 0; - Invalidate(); + InvalidateKeys(); } else { - fCurrentMap->GetChars(keyCode, fOldKeyInfo.modifiers, &str, &numBytes); + fCurrentMap->GetChars(keyCode, fOldKeyInfo.modifiers, fActiveDeadKey, &str, &numBytes); fActiveDeadKey = fCurrentMap->IsDeadKey(keyCode, fOldKeyInfo.modifiers); if (fActiveDeadKey) - Invalidate(); + InvalidateKeys(); else if (numBytes>0) { fTextView->FakeKeyDown(str, numBytes); } } delete str; - - } - + } } - break; } default: @@ -1440,7 +1410,7 @@ MapView::MouseDown(BPoint point) DrawKey(fCurrentMouseKey); char *str = NULL; int32 numBytes; - fCurrentMap->GetChars(fCurrentMouseKey, fOldKeyInfo.modifiers, &str, &numBytes); + fCurrentMap->GetChars(fCurrentMouseKey, fOldKeyInfo.modifiers, fActiveDeadKey, &str, &numBytes); if (numBytes>0) { fTextView->FakeKeyDown(str, numBytes); delete str; @@ -1454,6 +1424,7 @@ MapView::MouseDown(BPoint point) } } + void MapView::MouseUp(BPoint point) { @@ -1464,6 +1435,7 @@ MapView::MouseUp(BPoint point) DrawKey(value); } + void MapView::MouseMoved(BPoint point, uint32 transit, const BMessage *msg) { @@ -1476,7 +1448,7 @@ MapView::MouseMoved(BPoint point, uint32 transit, const BMessage *msg) DrawKey(fCurrentMouseKey); char *str = NULL; int32 numBytes; - fCurrentMap->GetChars(fCurrentMouseKey, fOldKeyInfo.modifiers, &str, &numBytes); + fCurrentMap->GetChars(fCurrentMouseKey, fOldKeyInfo.modifiers, fActiveDeadKey, &str, &numBytes); if (numBytes>0) { fTextView->FakeKeyDown(str, numBytes); delete str; diff --git a/src/prefs/keymap/KeymapWindow.h b/src/prefs/keymap/KeymapWindow.h index 8337b9e26a..f6cabfc773 100644 --- a/src/prefs/keymap/KeymapWindow.h +++ b/src/prefs/keymap/KeymapWindow.h @@ -45,11 +45,12 @@ public: void MouseDown(BPoint point); void MouseUp(BPoint point); void MouseMoved(BPoint point, uint32 transit, const BMessage *msg); - + void InvalidateKeys(); private: key_info fOldKeyInfo; BRect fKeysRect[128]; bool fKeysVertical[128]; + bool fKeysToDraw[128]; uint8 fKeyState[16]; BFont fCurrentFont;