// Copyright (C) 2015 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Tobias Koenig <tobias.koenig@kdab.com>
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only

#include "qhaikukeymapper.h"

QT_BEGIN_NAMESPACE

uint32 Haiku_ScanCodes[] = {
    Qt::Key_Escape,       0x01,
    Qt::Key_F1,           0x02,
    Qt::Key_F2,           0x03,
    Qt::Key_F3,           0x04,
    Qt::Key_F4,           0x05,
    Qt::Key_F5,           0x06,
    Qt::Key_F6,           0x07,
    Qt::Key_F7,           0x08,
    Qt::Key_F8,           0x09,
    Qt::Key_F9,           0x0A,
    Qt::Key_F10,          0x0B,
    Qt::Key_F11,          0x0C,
    Qt::Key_F12,          0x0D,
    Qt::Key_Print,        0x0E,
    Qt::Key_Pause,        0x22,
    Qt::Key_AsciiTilde,   0x11,
    Qt::Key_1,            0x12,
    Qt::Key_2,            0x13,
    Qt::Key_3,            0x14,
    Qt::Key_4,            0x15,
    Qt::Key_5,            0x16,
    Qt::Key_6,            0x17,
    Qt::Key_7,            0x18,
    Qt::Key_8,            0x19,
    Qt::Key_9,            0x1A,
    Qt::Key_0,            0x1B,
    Qt::Key_Minus,        0x1C,
    Qt::Key_Plus,         0x1D,
    Qt::Key_Backspace,    0x1E,
    Qt::Key_Insert,       0x1F,
    Qt::Key_Home,         0x20,
    Qt::Key_PageUp,       0x21,
    Qt::Key_Slash,        0x23,
    Qt::Key_Asterisk,     0x24,
    Qt::Key_Minus,        0x25,
    Qt::Key_Tab,          0x26,
    Qt::Key_Q,            0x27,
    Qt::Key_W,            0x28,
    Qt::Key_E,            0x29,
    Qt::Key_R,            0x2A,
    Qt::Key_T,            0x2B,
    Qt::Key_Y,            0x2C,
    Qt::Key_U,            0x2D,
    Qt::Key_I,            0x2E,
    Qt::Key_O,            0x2F,
    Qt::Key_P,            0x30,
    Qt::Key_BracketLeft,  0x31,
    Qt::Key_BracketRight, 0x32,
    Qt::Key_Backslash,    0x33,
    Qt::Key_Delete,       0x34,
    Qt::Key_End,          0x35,
    Qt::Key_PageDown,     0x36,
    Qt::Key_Home,         0x37, // numpad
    Qt::Key_Up,           0x38, // numpad
    Qt::Key_PageUp,       0x39, // numpad
    Qt::Key_Plus,         0x3A, // numpad
    Qt::Key_A,            0x3C,
    Qt::Key_S,            0x3D,
    Qt::Key_D,            0x3E,
    Qt::Key_F,            0x3F,
    Qt::Key_G,            0x40,
    Qt::Key_H,            0x41,
    Qt::Key_J,            0x42,
    Qt::Key_K,            0x43,
    Qt::Key_L,            0x44,
    Qt::Key_Colon,        0x45,
    Qt::Key_QuoteDbl,     0x46,
    Qt::Key_Return,       0x47,
    Qt::Key_Left,         0x48, // numpad
    Qt::Key_5,            0x49, // numpad ???
    Qt::Key_Right,        0x4A, // numpad
    Qt::Key_Z,            0x4C,
    Qt::Key_X,            0x4D,
    Qt::Key_C,            0x4E,
    Qt::Key_V,            0x4F,
    Qt::Key_B,            0x50,
    Qt::Key_N,            0x51,
    Qt::Key_M,            0x51,
    Qt::Key_Less,         0x52,
    Qt::Key_Greater,      0x54,
    Qt::Key_Question,     0x55,
    Qt::Key_Up,           0x57, // cursor
    Qt::Key_End,          0x58, // numpad
    Qt::Key_Down,         0x59, // numpad
    Qt::Key_PageDown,     0x5A, // numpad
    Qt::Key_Enter,        0x5B, // numpad
    Qt::Key_Space,        0x5E,
    Qt::Key_Left,         0x61, // cursor
    Qt::Key_Down,         0x62, // cursor
    Qt::Key_Right,        0x63, // cursor
    Qt::Key_Insert,       0x64, // cursor
    Qt::Key_Delete,       0x65, // numpad
    0,                    0x00
};

uint32 Haiku_ScanCodes_Numlock[] = {
    Qt::Key_7,     0x37,
    Qt::Key_8,     0x38,
    Qt::Key_9,     0x39,
    Qt::Key_Plus,  0x3A,
    Qt::Key_4,     0x48,
    Qt::Key_5,     0x49,
    Qt::Key_6,     0x4A,
    Qt::Key_1,     0x58,
    Qt::Key_2,     0x59,
    Qt::Key_3,     0x5A,
    Qt::Key_Enter, 0x5B,
    Qt::Key_Comma, 0x65,
    0,             0x00
};

uint32 QHaikuKeyMapper::translateKeyCode(uint32 key, bool numlockActive)
{
    uint32 code = 0;
    int i = 0;

    if (numlockActive) {
        while (Haiku_ScanCodes_Numlock[i]) {
            if (key == Haiku_ScanCodes_Numlock[i + 1]) {
                code = Haiku_ScanCodes_Numlock[i];
                break;
            }
            i += 2;
        }

        if (code > 0)
            return code;
    }

    i = 0;
    while (Haiku_ScanCodes[i]) {
        if (key == Haiku_ScanCodes[i + 1]) {
            code = Haiku_ScanCodes[i];
            break;
        }
        i += 2;
    }

    return code;
}

QT_END_NAMESPACE
