summaryrefslogtreecommitdiff
path: root/raveos-calamares-module/welcome/RaveBillentyuzet.cpp
blob: aeb1205004cacae8ebbc2dbb9d86e91c9a50855a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include "RaveBillentyuzet.h"

#include <QQmlEngine>

#include <xkbcommon/xkbcommon.h>

namespace
{
constexpr int EvdevEltolas = 8;

const QList< QList< int > >& sorKodok()
{
    static const QList< QList< int > > kodok {
        { 41, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 },
        { 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27 },
        { 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 43 },
        { 86, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53 },
    };
    return kodok;
}
}

QVariantList
RaveBillentyuzet::gombok( const QString& layout, const QString& variant ) const
{
    QVariantList sorok;
    if ( layout.isEmpty() )
    {
        return sorok;
    }

    xkb_context* context = xkb_context_new( XKB_CONTEXT_NO_FLAGS );
    if ( !context )
    {
        return sorok;
    }

    const QByteArray layoutBytes = layout.toUtf8();
    const QByteArray variantBytes = variant.toUtf8();
    xkb_rule_names names {};
    names.rules = "evdev";
    names.model = "pc105";
    names.layout = layoutBytes.constData();
    names.variant = variantBytes.isEmpty() ? nullptr : variantBytes.constData();

    xkb_keymap* keymap = xkb_keymap_new_from_names( context, &names, XKB_KEYMAP_COMPILE_NO_FLAGS );
    if ( !keymap )
    {
        xkb_context_unref( context );
        return sorok;
    }
    xkb_state* state = xkb_state_new( keymap );

    for ( const auto& sor : sorKodok() )
    {
        QVariantList cimkek;
        for ( int kod : sor )
        {
            char buffer[ 16 ] = {};
            xkb_state_key_get_utf8( state, static_cast< xkb_keycode_t >( kod + EvdevEltolas ), buffer, sizeof( buffer ) );
            cimkek << QString::fromUtf8( buffer ).toUpper();
        }
        sorok << QVariant( cimkek );
    }

    xkb_state_unref( state );
    xkb_keymap_unref( keymap );
    xkb_context_unref( context );
    return sorok;
}

void
RaveBillentyuzet::regisztral()
{
    if ( qmlTypeId( "RaveOSNative", 1, 0, "Billentyuzet" ) >= 0 )
    {
        return;
    }
    qmlRegisterSingletonType< RaveBillentyuzet >(
        "RaveOSNative", 1, 0, "Billentyuzet", []( QQmlEngine*, QJSEngine* ) -> QObject* { return new RaveBillentyuzet; } );
}