summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorluigi2us <luigi2us@gmail.com>2009-04-23 18:19:38 +0000
committerluigi2us <luigi2us@gmail.com>2009-04-23 18:19:38 +0000
commitc525563d77d22efe104665b74617c609bcce2532 (patch)
treede9aae7539533054fc1ee0b565209ff67b7c1946 /Source/Core
parent35b99a80ed6c42eb9761e32e8c16a99cc2024352 (diff)
Added support for AZERTY keyboard layout. Most keys should now work correctly for AZERTY keyboards, if you set the correct Wii language in Dolphin.
To change keyboard layout used, you need to open User\Config\Dolphin.ini and add the following two lines: [USB Keyboard] Layout = {0 for QWERTY, 1 for AZERTY} git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@3056 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp129
-rw-r--r--Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.h15
2 files changed, 130 insertions, 14 deletions
diff --git a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp
index 69d6a56a8a..0032537221 100644
--- a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp
+++ b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp
@@ -1999,7 +1999,7 @@ bool CWII_IPC_HLE_Device_usb_oh0::IOCtlV(u32 _CommandAddress)
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-u8 CWII_IPC_HLE_Device_usb_kbd::m_KeyCodes[256] = {
+u8 CWII_IPC_HLE_Device_usb_kbd::m_KeyCodesQWERTY[256] = {
#ifdef _WIN32
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x2A, // Backspace
@@ -2090,6 +2090,97 @@ u8 CWII_IPC_HLE_Device_usb_kbd::m_KeyCodes[256] = {
#endif
};
+u8 CWII_IPC_HLE_Device_usb_kbd::m_KeyCodesAZERTY[256] = {
+#ifdef _WIN32
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x2A, // Backspace
+ 0x2B, // Tab
+ 0x00, 0x00,
+ 0x00, // Clear
+ 0x28, // Return
+ 0x00, 0x00,
+ 0x00, // Shift
+ 0x00, // Control
+ 0x00, // ALT
+ 0x48, // Pause
+ 0x39, // Capital
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x29, // Escape
+ 0x00, 0x00, 0x00, 0x00,
+ 0x2C, // Space
+ 0x4B, // Prior
+ 0x4E, // Next
+ 0x4D, // End
+ 0x4A, // Home
+ 0x50, // Left
+ 0x52, // Up
+ 0x4F, // Right
+ 0x51, // Down
+ 0x00, 0x00, 0x00,
+ 0x46, // Print screen
+ 0x49, // Insert
+ 0x4C, // Delete
+ 0x00,
+ // 0 -> 9
+ 0x27, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24,
+ 0x25, 0x26,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00,
+ // A -> Z
+ 0x14, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
+ 0x0C, 0x0D, 0x0E, 0x0F, 0x33, 0x11, 0x12, 0x13,
+ 0x04, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1D, 0x1B,
+ 0x1C, 0x1A,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00,
+ // Numpad 0 -> 9
+ 0x62, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
+ 0x60, 0x61,
+ 0x55, // Multiply
+ 0x57, // Add
+ 0x00, // Separator
+ 0x56, // Substract
+ 0x63, // Decimal
+ 0x54, // Divide
+ // F1 -> F12
+ 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x41,
+ 0x42, 0x43, 0x44, 0x45,
+ // F13 -> F24
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x53, // Numlock
+ 0x47, // Scroll lock
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ // Modifier keys
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x30, // '$'
+ 0x2E, // Plus
+ 0x10, // Comma
+ 0x00, // Minus
+ 0x36, // Period
+ 0x37, // '/'
+ 0x34, // 'ù'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00,
+ 0x2D, // ')'
+ 0x32, // '\'
+ 0x2F, // '^'
+ 0x00, // '²'
+ 0x38, // '!'
+ 0x00, // Nothing interesting past this point.
+#else
+ // TODO: do it for non-Windows platforms
+ 0
+#endif
+};
+
CWII_IPC_HLE_Device_usb_kbd::CWII_IPC_HLE_Device_usb_kbd(u32 _DeviceID, const std::string& _rDeviceName)
: IWII_IPC_HLE_Device(_DeviceID, _rDeviceName)
{
@@ -2102,9 +2193,13 @@ bool CWII_IPC_HLE_Device_usb_kbd::Open(u32 _CommandAddress, u32 _Mode)
{
Memory::Write_U32(GetDeviceID(), _CommandAddress+4);
+ IniFile ini;
+ ini.Load(CONFIG_FILE);
+ ini.Get("USB Keyboard", "Layout", &m_KeyboardLayout, KBD_LAYOUT_QWERTY);
+
for(int i = 0; i < 256; i++)
- m_KeyBuffer[i] = false;
- m_Modifiers = 0x00;
+ m_OldKeyBuffer[i] = false;
+ m_OldModifiers = 0x00;
PushMessage(MSG_KBD_CONNECT, 0x00, NULL);
@@ -2153,16 +2248,28 @@ u32 CWII_IPC_HLE_Device_usb_kbd::Update()
for (i = 0; i < 256; i++)
{
bool KeyPressedNow = IsKeyPressed(i);
- bool KeyPressedBefore = m_KeyBuffer[i];
+ bool KeyPressedBefore = m_OldKeyBuffer[i];
+ u8 KeyCode;
if (KeyPressedNow ^ KeyPressedBefore)
{
if (KeyPressedNow)
{
- if(m_KeyCodes[i] == 0x00)
- continue;
+ switch(m_KeyboardLayout)
+ {
+ case KBD_LAYOUT_QWERTY:
+ KeyCode = m_KeyCodesQWERTY[i];
+ break;
+
+ case KBD_LAYOUT_AZERTY:
+ KeyCode = m_KeyCodesAZERTY[i];
+ break;
+ }
+
+ if(KeyCode == 0x00)
+ continue;
- PressedKeys[j] = m_KeyCodes[i];
+ PressedKeys[j] = KeyCode;
j++;
if(j == 6) break;
@@ -2171,7 +2278,7 @@ u32 CWII_IPC_HLE_Device_usb_kbd::Update()
GotEvent = true;
}
- m_KeyBuffer[i] = KeyPressedNow;
+ m_OldKeyBuffer[i] = KeyPressedNow;
}
#ifdef _WIN32
@@ -2187,7 +2294,7 @@ u32 CWII_IPC_HLE_Device_usb_kbd::Update()
Modifiers |= 0x10;
if (GetAsyncKeyState(VK_RSHIFT) & 0x8000)
Modifiers |= 0x20;
- if (GetAsyncKeyState(VK_MENU) & 0x8000) // TODO: VK_MENU is for ALT, not for ALT GR
+ if (GetAsyncKeyState(VK_MENU) & 0x8000) // TODO: VK_MENU is for ALT, not for ALT GR (ALT GR seems to work though...)
Modifiers |= 0x40;
if (GetAsyncKeyState(VK_RWIN) & 0x8000)
Modifiers |= 0x80;
@@ -2195,10 +2302,10 @@ u32 CWII_IPC_HLE_Device_usb_kbd::Update()
// TODO: modifiers for non-Windows platforms
#endif
- if(Modifiers ^ m_Modifiers)
+ if(Modifiers ^ m_OldModifiers)
{
GotEvent = true;
- m_Modifiers = Modifiers;
+ m_OldModifiers = Modifiers;
}
if (GotEvent)
diff --git a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.h b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.h
index b38ff3d79d..79e5a1e722 100644
--- a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.h
+++ b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.h
@@ -251,7 +251,16 @@ public:
private:
- static u8 m_KeyCodes[256];
+ static u8 m_KeyCodesQWERTY[256];
+ static u8 m_KeyCodesAZERTY[256];
+
+ enum
+ {
+ KBD_LAYOUT_QWERTY = 0,
+ KBD_LAYOUT_AZERTY
+ };
+
+ int m_KeyboardLayout;
enum
{
@@ -273,8 +282,8 @@ private:
std::queue<SMessageData> m_MessageQueue;
- bool m_KeyBuffer[256];
- u8 m_Modifiers;
+ bool m_OldKeyBuffer[256];
+ u8 m_OldModifiers;
virtual bool IsKeyPressed(int _Key);