* Started implementing a SetKey() function to change the current keymap;

right now, it can only replace keys with the same mapped length.
* Cleanup.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@29695 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2009-03-25 13:34:59 +00:00
parent a62f575a80
commit 6835544f8f
2 changed files with 100 additions and 72 deletions
+92 -72
View File
@@ -5,6 +5,7 @@
* Authors:
* Sandor Vroemisse
* Jérôme Duval
* Axel Dörfler, [email protected].
*/
#include "Keymap.h"
@@ -18,6 +19,10 @@
#include <input_globals.h>
static const uint32 kModifierKeys = B_SHIFT_KEY | B_COMMAND_KEY | B_CONTROL_KEY
| B_CAPS_LOCK | B_OPTION_KEY | B_MENU_KEY;
static void
print_key(char *chars, int32 offset)
{
@@ -121,7 +126,7 @@ Keymap::Load(entry_ref &ref)
}
//! We save a map from a file
//! We save a map to a file
status_t
Keymap::Save(entry_ref& ref)
{
@@ -203,55 +208,15 @@ Keymap::IsModifierKey(uint32 keyCode)
}
//! Tell if a key is a dead key, needed for draw a dead key.
//! Checks whether a key is a dead key.
uint8
Keymap::IsDeadKey(uint32 keyCode, uint32 modifiers)
{
if (fChars == NULL)
return 0;
int32 offset;
uint32 tableMask = 0;
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;
case B_OPTION_KEY:
offset = fKeys.option_map[keyCode];
tableMask = B_OPTION_TABLE;
break;
case B_OPTION_KEY|B_SHIFT_KEY:
offset = fKeys.option_shift_map[keyCode];
tableMask = B_OPTION_SHIFT_TABLE;
break;
case B_OPTION_KEY|B_CAPS_LOCK:
offset = fKeys.option_caps_map[keyCode];
tableMask = B_OPTION_CAPS_TABLE;
break;
case B_OPTION_KEY|B_SHIFT_KEY|B_CAPS_LOCK:
offset = fKeys.option_caps_shift_map[keyCode];
tableMask = B_OPTION_CAPS_SHIFT_TABLE;
break;
case B_CONTROL_KEY:
offset = fKeys.control_map[keyCode];
tableMask = B_CONTROL_TABLE;
break;
default:
offset = fKeys.normal_map[keyCode];
tableMask = B_NORMAL_TABLE;
break;
}
int32 offset = _Offset(keyCode, modifiers, &tableMask);
if (offset <= 0)
return 0;
@@ -304,22 +269,11 @@ Keymap::IsDeadSecondKey(uint32 keyCode, uint32 modifiers, uint8 activeDeadKey)
if (!activeDeadKey)
return false;
int32 offset;
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;
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;
}
int32 offset = _Offset(keyCode, modifiers);
if (offset < 0)
return false;
uint32 numBytes = fChars[offset];
if (!numBytes)
return false;
@@ -356,8 +310,6 @@ void
Keymap::GetChars(uint32 keyCode, uint32 modifiers, uint8 activeDeadKey,
char** chars, int32* numBytes)
{
int32 offset;
*numBytes = 0;
*chars = NULL;
@@ -382,18 +334,9 @@ Keymap::GetChars(uint32 keyCode, uint32 modifiers, uint8 activeDeadKey,
}
}
// 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;
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;
}
int32 offset = _Offset(keyCode, modifiers);
if (offset < 0)
return;
// here we get the char size
*numBytes = fChars[offset];
@@ -451,9 +394,86 @@ Keymap::GetChars(uint32 keyCode, uint32 modifiers, uint8 activeDeadKey,
}
// we make our input server use the map in /boot/home/config/settings/Keymap
//! We make our input server use the map in /boot/home/config/settings/Keymap
status_t
Keymap::Use()
{
return _restore_key_map_();
}
void
Keymap::SetKey(uint32 keyCode, uint32 modifiers, int8 deadKey,
const char* bytes, int32 numBytes)
{
int32 offset = _Offset(keyCode, modifiers);
if (offset < 0)
return;
if (numBytes == -1)
numBytes = strlen(bytes);
int32 oldNumBytes = fChars[offset];
// TODO: handle dead keys!
// TODO!
if (oldNumBytes != numBytes)
return;
memcpy(&fChars[offset + 1], bytes, numBytes);
}
int32
Keymap::_Offset(uint32 keyCode, uint32 modifiers, uint32* _table)
{
int32 offset;
uint32 table;
switch (modifiers & kModifierKeys) {
case B_SHIFT_KEY:
offset = fKeys.shift_map[keyCode];
table = B_SHIFT_TABLE;
break;
case B_CAPS_LOCK:
offset = fKeys.caps_map[keyCode];
table = B_CAPS_TABLE;
break;
case B_CAPS_LOCK | B_SHIFT_KEY:
offset = fKeys.caps_shift_map[keyCode];
table = B_CAPS_SHIFT_TABLE;
break;
case B_OPTION_KEY:
offset = fKeys.option_map[keyCode];
table = B_OPTION_TABLE;
break;
case B_OPTION_KEY | B_SHIFT_KEY:
offset = fKeys.option_shift_map[keyCode];
table = B_OPTION_SHIFT_TABLE;
break;
case B_OPTION_KEY | B_CAPS_LOCK:
offset = fKeys.option_caps_map[keyCode];
table = B_OPTION_CAPS_TABLE;
break;
case B_OPTION_KEY | B_SHIFT_KEY | B_CAPS_LOCK:
offset = fKeys.option_caps_shift_map[keyCode];
table = B_OPTION_CAPS_SHIFT_TABLE;
break;
case B_CONTROL_KEY:
offset = fKeys.control_map[keyCode];
table = B_CONTROL_TABLE;
break;
default:
offset = fKeys.normal_map[keyCode];
table = B_NORMAL_TABLE;
break;
}
if (_table != NULL)
*_table = table;
if (offset >= (int32)fCharsSize)
return -1;
return offset;
}
+8
View File
@@ -4,6 +4,7 @@
*
* Authors:
* Jérôme Duval
* Axel Dörfler, [email protected].
*/
#ifndef KEYMAP_H
#define KEYMAP_H
@@ -28,9 +29,16 @@ public:
status_t Use();
bool Equals(const Keymap& map) const;
void SetKey(uint32 keyCode, uint32 modifiers,
int8 deadKey, const char* bytes,
int32 numBytes = -1);
const key_map& Map() const { return fKeys; }
private:
int32 _Offset(uint32 keyCode, uint32 modifiers,
uint32* _table = NULL);
char* fChars;
key_map fKeys;
uint32 fCharsSize;