VirtualBox

Changeset 79121 in vbox


Ignore:
Timestamp:
Jun 13, 2019 10:22:19 AM (5 years ago)
Author:
vboxsync
Message:

FE/Qt: bugref:6143. Loading keyboard layouts.

Location:
trunk/src/VBox/Frontends/VirtualBox
Files:
4 edited
1 copied

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VirtualBox/VirtualBox_xml.qrc

    r78953 r79121  
    33        <file alias="101_ansi.xml">xml/101_ansi.xml</file>
    44        <file alias="102_iso.xml">xml/102_iso.xml</file>
     5        <file alias="us_international.xml">xml/us_international.xml</file>
    56    </qresource>
    67</RCC>
  • trunk/src/VBox/Frontends/VirtualBox/src/softkeyboard/UISoftKeyboard.cpp

    r79109 r79121  
    1818/* Qt includes: */
    1919#include <QApplication>
     20#include <QComboBox>
    2021#include <QFile>
    2122#include <QGroupBox>
     
    7980
    8081    void sigKeyCaptionEdited();
     82    void sigPhysicalLayoutChanged(int iIndex);
     83    void sigLayoutNameChanged(const QString &strName);
    8184
    8285public:
     
    8487    UILayoutEditor(QWidget *pParent = 0);
    8588    void setKey(UISoftKeyboardKey *pKey);
     89    void setLayoutName(const QString &strName);
     90    void setPhysicalLayoutNames(const QStringList &strPhysicalLayoutNames);
    8691
    8792protected:
     
    9196private slots:
    9297
    93     void sltHandleAcceptCaptionChanges();
     98    void sltKeyBaseCaptionChange();
     99    void sltKeyShiftCaptionChange();
     100    void sltKeyAltGrCaptionChange();
     101    void sltLayoutNameChange();
    94102
    95103private:
     
    99107    QWidget *prepareKeyCaptionEditWidgets();
    100108
    101     QVBoxLayout *m_pMainLayout;
     109    QGridLayout *m_pEditorLayout;
    102110    QGroupBox *m_pSelectedKeyGroupBox;
    103111    QGroupBox *m_pCaptionEditGroupBox;
    104112
     113    QComboBox *m_pPhysicalLayoutCombo;
     114    QLabel *m_pPhysicalLayoutLabel;
     115    QLabel *m_pLayoutNameLabel;
    105116    QLabel *m_pScanCodeLabel;
    106117    QLabel *m_pPositionLabel;
     
    109120    QLabel *m_pAltGrCaptionLabel;
    110121
     122    QLineEdit *m_pLayoutNameEdit;
    111123    QLineEdit *m_pScanCodeEdit;
    112124    QLineEdit *m_pPositionEdit;
     
    115127    QLineEdit *m_pAltGrCaptionEdit;
    116128
    117     QPushButton *m_pAcceptCaptionsChangesButton;
    118     QPushButton *m_pResetCaptionsButton;
    119129    /** The key which is being currently edited. Might be Null. */
    120130    UISoftKeyboardKey  *m_pKey;
     
    329339    void sltHandleNewLayout();
    330340    void sltHandleKeyCaptionEdited();
     341    void sltPhysicalLayoutForLayoutChanged(int iIndex);
     342    void sltLayoutNameChange(const QString &strName);
    331343
    332344private:
     
    340352    void               handleKeyRelease(UISoftKeyboardKey *pKey);
    341353    bool               loadPhysicalLayout(const QString &strLayoutFileName);
     354    bool               loadKeyboardLayout(const QString &strLayoutName);
    342355    void               reset();
    343356    void               configure();
    344357    void               prepareObjects();
    345     void               enableDisableKeyCapEditMode(bool fEnable);
    346358    /** Sets m_pKeyBeingEdited. */
    347     void               setKeyBeingEdited(UISoftKeyboardKey* pKey);
    348 
     359    void               setKeyBeingEdited(UISoftKeyboardKey *pKey);
     360    void               setCurrentLayout(UISoftKeyboardLayout *pLayout);
    349361    UISoftKeyboardKey *m_pKeyUnderMouse;
    350362    UISoftKeyboardKey *m_pKeyBeingEdited;
     
    378390    QAction *m_pShowPositionsAction;
    379391    QAction *m_pLayoutEditModeToggleAction;
    380     UILayoutEditor *m_pKeyCapEditor;
     392    UILayoutEditor *m_pLayoutEditor;
    381393    Mode       m_enmMode;
    382394};
    383395
    384396/*********************************************************************************************************************************
    385 *   UIKeyboardLayoutReader definition.                                                                                  *
     397*   UIPhysicalLayoutReader definition.                                                                                  *
    386398*********************************************************************************************************************************/
    387399
    388 class UIKeyboardLayoutReader
     400class UIPhysicalLayoutReader
    389401{
    390402
     
    407419
    408420/*********************************************************************************************************************************
    409 *   UIKeyboardKeyCapReader definition.                                                                                  *
     421*   UIKeyboardLayoutReader definition.                                                                                  *
    410422*********************************************************************************************************************************/
    411423
    412 class UIKeyboardKeyCapReader
     424class UIKeyboardLayoutReader
    413425{
    414426
    415427public:
    416428
    417     UIKeyboardKeyCapReader(const QString &strFileName);
    418     const QMap<int, QString> &keyCapMap() const;
     429    struct KeyCaptions
     430    {
     431        QString m_strBase;
     432        QString m_strShift;
     433        QString m_strAltGr;
     434    };
     435
     436    bool  parseFile(const QString &strFileName, UISoftKeyboardLayout &layout, QUuid &physicalLayoutUid);
    419437
    420438private:
    421439
    422     bool  parseKeyCapFile(const QString &strFileName);
    423     void  parseKey();
     440
     441    void  parseKey(QMap<int, KeyCaptions> &keyCapMap);
    424442    QXmlStreamReader m_xmlReader;
    425     /** Keys are positions and values are keycaps. */
    426     QMap<int, QString> m_keyCapMap;
    427443};
    428444
     
    433449UILayoutEditor::UILayoutEditor(QWidget *pParent /* = 0 */)
    434450    :QIWithRetranslateUI<QWidget>(pParent)
    435     , m_pMainLayout(0)
     451    , m_pEditorLayout(0)
    436452    , m_pSelectedKeyGroupBox(0)
    437453    , m_pCaptionEditGroupBox(0)
     454    , m_pPhysicalLayoutCombo(0)
     455    , m_pPhysicalLayoutLabel(0)
     456    , m_pLayoutNameLabel(0)
    438457    , m_pScanCodeLabel(0)
    439458    , m_pPositionLabel(0)
     
    441460    , m_pShiftCaptionLabel(0)
    442461    , m_pAltGrCaptionLabel(0)
     462    , m_pLayoutNameEdit(0)
    443463    , m_pScanCodeEdit(0)
    444464    , m_pPositionEdit(0)
     
    446466    , m_pShiftCaptionEdit(0)
    447467    , m_pAltGrCaptionEdit(0)
    448     , m_pAcceptCaptionsChangesButton(0)
    449     , m_pResetCaptionsButton(0)
    450468    , m_pKey(0)
    451469{
     
    475493}
    476494
     495void UILayoutEditor::setLayoutName(const QString &strName)
     496{
     497    if (m_pLayoutNameEdit)
     498        m_pLayoutNameEdit->setText(strName);
     499}
     500
     501void UILayoutEditor::setPhysicalLayoutNames(const QStringList &strPhysicalLayoutNames)
     502{
     503    if (!m_pPhysicalLayoutCombo)
     504        return;
     505    foreach (const QString &strName, strPhysicalLayoutNames)
     506        m_pPhysicalLayoutCombo->addItem(strName);
     507}
     508
    477509void UILayoutEditor::retranslateUi()
    478510{
     511    if (m_pPhysicalLayoutLabel)
     512        m_pPhysicalLayoutLabel->setText(UISoftKeyboard::tr("Physical Layout"));
     513    if (m_pLayoutNameLabel)
     514        m_pLayoutNameLabel->setText(UISoftKeyboard::tr("Layout Name"));
    479515    if (m_pScanCodeLabel)
    480516        m_pScanCodeLabel->setText(UISoftKeyboard::tr("Scan Code"));
     
    487523    if (m_pAltGrCaptionLabel)
    488524        m_pAltGrCaptionLabel->setText(UISoftKeyboard::tr("AltGr"));
    489     if (m_pAcceptCaptionsChangesButton)
    490         m_pAcceptCaptionsChangesButton->setText(UISoftKeyboard::tr("Accept"));
    491     if (m_pResetCaptionsButton)
    492         m_pResetCaptionsButton->setText(UISoftKeyboard::tr("Reset"));
    493525    if (m_pCaptionEditGroupBox)
    494526        m_pCaptionEditGroupBox->setTitle(UISoftKeyboard::tr("Captions"));
     
    497529}
    498530
    499 void UILayoutEditor::sltHandleAcceptCaptionChanges()
    500 {
    501     if (!m_pKey)
     531void UILayoutEditor::sltKeyBaseCaptionChange()
     532{
     533    if (!m_pKey || !m_pBaseCaptionEdit)
    502534        return;
    503535    m_pKey->setBaseCaption(m_pBaseCaptionEdit->text());
     536    emit sigKeyCaptionEdited();
     537}
     538
     539void UILayoutEditor::sltKeyShiftCaptionChange()
     540{
     541    if (!m_pKey || !m_pShiftCaptionEdit)
     542        return;
    504543    m_pKey->setShiftCaption(m_pShiftCaptionEdit->text());
     544    emit sigKeyCaptionEdited();
     545}
     546
     547void UILayoutEditor::sltKeyAltGrCaptionChange()
     548{
     549    if (!m_pKey || !m_pAltGrCaptionEdit)
     550        return;
    505551    m_pKey->setAltGrCaption(m_pAltGrCaptionEdit->text());
    506552    emit sigKeyCaptionEdited();
    507553}
    508554
     555void UILayoutEditor::sltLayoutNameChange()
     556{
     557    if (!m_pLayoutNameEdit)
     558        return;
     559    emit sigLayoutNameChanged(m_pLayoutNameEdit->text());
     560}
     561
    509562void UILayoutEditor::prepareObjects()
    510563{
    511     m_pMainLayout = new QVBoxLayout;
    512     if (!m_pMainLayout)
    513         return;
    514     setLayout(m_pMainLayout);
     564    m_pEditorLayout = new QGridLayout;
     565    if (!m_pEditorLayout)
     566        return;
     567    setLayout(m_pEditorLayout);
     568
     569    m_pLayoutNameLabel = new QLabel;
     570    m_pLayoutNameEdit = new QLineEdit;
     571    m_pLayoutNameLabel->setBuddy(m_pLayoutNameEdit);
     572    m_pEditorLayout->addWidget(m_pLayoutNameLabel, 0, 0, 1, 1);
     573    m_pEditorLayout->addWidget(m_pLayoutNameEdit, 0, 1, 1, 1);
     574    connect(m_pLayoutNameEdit, &QLineEdit::editingFinished, this, &UILayoutEditor::sltLayoutNameChange);
     575
     576
     577    m_pPhysicalLayoutLabel = new QLabel;
     578    m_pPhysicalLayoutCombo = new QComboBox;
     579    m_pPhysicalLayoutLabel->setBuddy(m_pPhysicalLayoutCombo);
     580    m_pEditorLayout->addWidget(m_pPhysicalLayoutLabel, 1, 0, 1, 1);
     581    m_pEditorLayout->addWidget(m_pPhysicalLayoutCombo, 1, 1, 1, 1);
     582    connect(m_pPhysicalLayoutCombo, static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
     583            this, &UILayoutEditor::sigPhysicalLayoutChanged);
    515584
    516585    m_pSelectedKeyGroupBox = new QGroupBox;
    517586    m_pSelectedKeyGroupBox->setEnabled(false);
    518587
    519     m_pMainLayout->addWidget(m_pSelectedKeyGroupBox);
     588    m_pEditorLayout->addWidget(m_pSelectedKeyGroupBox, 2, 0, 1, 2);
    520589    QGridLayout *pSelectedKeyLayout = new QGridLayout(m_pSelectedKeyGroupBox);
    521590    pSelectedKeyLayout->setSpacing(0);
     
    525594    m_pScanCodeEdit = new QLineEdit;
    526595    m_pScanCodeLabel->setBuddy(m_pScanCodeEdit);
    527     m_pScanCodeEdit->setReadOnly(true);
     596    m_pScanCodeEdit->setEnabled(false);
    528597    pSelectedKeyLayout->addWidget(m_pScanCodeLabel, 0, 0);
    529598    pSelectedKeyLayout->addWidget(m_pScanCodeEdit, 0, 1);
     
    531600    m_pPositionLabel= new QLabel;
    532601    m_pPositionEdit = new QLineEdit;
     602    m_pPositionEdit->setEnabled(false);
    533603    m_pPositionLabel->setBuddy(m_pPositionEdit);
    534     m_pPositionEdit->setReadOnly(true);
    535604    pSelectedKeyLayout->addWidget(m_pPositionLabel, 1, 0);
    536605    pSelectedKeyLayout->addWidget(m_pPositionEdit, 1, 1);
     
    565634    pCaptionEditorLayout->addWidget(m_pBaseCaptionLabel, 0, 0);
    566635    pCaptionEditorLayout->addWidget(m_pBaseCaptionEdit, 0, 1);
     636    connect(m_pBaseCaptionEdit, &QLineEdit::editingFinished, this, &UILayoutEditor::sltKeyBaseCaptionChange);
    567637
    568638    m_pShiftCaptionLabel = new QLabel;
     
    571641    pCaptionEditorLayout->addWidget(m_pShiftCaptionLabel, 1, 0);
    572642    pCaptionEditorLayout->addWidget(m_pShiftCaptionEdit, 1, 1);
     643    connect(m_pShiftCaptionEdit, &QLineEdit::editingFinished, this, &UILayoutEditor::sltKeyShiftCaptionChange);
    573644
    574645    m_pAltGrCaptionLabel = new QLabel;
     
    577648    pCaptionEditorLayout->addWidget(m_pAltGrCaptionLabel, 2, 0);
    578649    pCaptionEditorLayout->addWidget(m_pAltGrCaptionEdit, 2, 1);
    579 
    580 
    581     m_pAcceptCaptionsChangesButton = new QPushButton;
    582     pCaptionEditorLayout->addWidget(m_pAcceptCaptionsChangesButton, 3, 0);
    583     connect(m_pAcceptCaptionsChangesButton, &QPushButton::pressed, this, &UILayoutEditor::sltHandleAcceptCaptionChanges);
    584     m_pResetCaptionsButton = new QPushButton;
    585     pCaptionEditorLayout->addWidget(m_pResetCaptionsButton, 3, 1);
     650    connect(m_pAltGrCaptionEdit, &QLineEdit::editingFinished, this, &UILayoutEditor::sltKeyAltGrCaptionChange);
     651
    586652
    587653    QSpacerItem *pSpacer = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Expanding);
     
    9581024    if (m_enmMode == Mode_LayoutEdit)
    9591025    {
    960         m_pKeyCapEditor->setGeometry(width() - iEditDialogWidth, 0,
     1026        m_pLayoutEditor->setGeometry(width() - iEditDialogWidth, 0,
    9611027                                     iEditDialogWidth, height());
    962         m_pKeyCapEditor->show();
    963         m_pKeyCapEditor->setFocus();
     1028        m_pLayoutEditor->show();
     1029        m_pLayoutEditor->setFocus();
    9641030    }
    9651031    else
    966         m_pKeyCapEditor->hide();
     1032        m_pLayoutEditor->hide();
    9671033
    9681034    if (!m_pCurrentKeyboardLayout || m_iInitialWidth == 0 || m_iInitialHeight == 0)
     
    10391105        }
    10401106        setKeyBeingEdited(m_pKeyUnderMouse);
    1041         // if (m_pKeyBeingEdited && m_pKeyCapEditor)
    1042         //     m_pKeyCapEditor->setText(m_pKeyBeingEdited->keyCap());
     1107        // if (m_pKeyBeingEdited && m_pLayoutEditor)
     1108        //     m_pLayoutEditor->setText(m_pKeyBeingEdited->keyCap());
    10431109    }
    10441110    update();
     
    10681134bool UISoftKeyboardWidget::eventFilter(QObject *pWatched, QEvent *pEvent)
    10691135{
    1070     if (pWatched != m_pKeyCapEditor)
     1136    if (pWatched != m_pLayoutEditor)
    10711137        return QIWithRetranslateUI<QWidget>::eventFilter(pWatched, pEvent);
    10721138
     
    10851151            {
    10861152                // if (m_pKeyBeingEdited)
    1087                 //     m_pKeyBeingEdited->setStaticKeyCap(m_pKeyCapEditor->text());
     1153                //     m_pKeyBeingEdited->setStaticKeyCap(m_pLayoutEditor->text());
    10881154                setKeyBeingEdited(0);
    10891155                update();
     
    11211187//             m_pLastSelectedLayout = pSenderAction;
    11221188//             m_pLoadLayoutFileAction->setData(strFileName);
    1123 //             emit sigLayoutChange(strFileName);
     1189//
    11241190//             return;
    11251191//         }
     
    11471213void UISoftKeyboardWidget::sltHandleSaveLayout()
    11481214{
    1149    //  QString strFileName = QIFileDialog::getSaveFileName(vboxGlobal().documentsPath(), UISoftKeyboard::tr("XML files (*.xml)"),
    1150    //                                                      this, tr("Save keycaps to a file..."));
    1151    //  if (strFileName.isEmpty())
    1152    //      return;
    1153 
    1154    //  QFileInfo fileInfo(strFileName);
    1155    //  if (fileInfo.suffix().compare("xml", Qt::CaseInsensitive) != 0)
    1156    //      strFileName += ".xml";
    1157 
    1158    //  QFile xmlFile(strFileName);
    1159    //  if (!xmlFile.open(QIODevice::WriteOnly))
    1160    //      return;
    1161    //  QXmlStreamWriter xmlWriter;
    1162    //  xmlWriter.setDevice(&xmlFile);
    1163 
    1164    //  xmlWriter.setAutoFormatting(true);
    1165    //  xmlWriter.writeStartDocument("1.0");
    1166    //  xmlWriter.writeStartElement("keycaps");
    1167 
    1168    // for (int i = 0; i < m_rows.size(); ++i)
    1169    // {
    1170    //     QVector<UISoftKeyboardKey> &keys = m_rows[i].keys();
    1171    //     for (int j = 0; j < keys.size(); ++j)
    1172    //     {
    1173    //         xmlWriter.writeStartElement("key");
    1174 
    1175    //         UISoftKeyboardKey &key = keys[j];
    1176    //         xmlWriter.writeTextElement("position", QString::number(key.position()));
    1177    //         xmlWriter.writeTextElement("basecaption", key.baseCaption());
    1178    //         xmlWriter.writeTextElement("shiftcaption", key.shiftCaption());
    1179    //         xmlWriter.writeTextElement("altgrcaption", key.altGrCaption());
    1180 
    1181    //         // if (!key.keyCap().isEmpty())
    1182    //         //     xmlWriter.writeTextElement("keycap", key.keyCap());
    1183    //         // else
    1184    //         //     xmlWriter.writeTextElement("keycap", key.staticKeyCap());
    1185    //         xmlWriter.writeEndElement();
    1186    //     }
    1187    // }
    1188    // xmlWriter.writeEndElement();
    1189    // xmlWriter.writeEndDocument();
    1190 
    1191    // xmlFile.close();
     1215    QString strFileName = QIFileDialog::getSaveFileName(vboxGlobal().documentsPath(), UISoftKeyboard::tr("XML files (*.xml)"),
     1216                                                        this, tr("Save layout to a file..."));
     1217    if (strFileName.isEmpty())
     1218        return;
     1219    if (!m_pCurrentKeyboardLayout || !m_pCurrentKeyboardLayout->m_pPhysicalLayout)
     1220        return;
     1221
     1222    QFileInfo fileInfo(strFileName);
     1223    if (fileInfo.suffix().compare("xml", Qt::CaseInsensitive) != 0)
     1224        strFileName += ".xml";
     1225
     1226    QFile xmlFile(strFileName);
     1227    if (!xmlFile.open(QIODevice::WriteOnly))
     1228        return;
     1229    QXmlStreamWriter xmlWriter;
     1230    xmlWriter.setDevice(&xmlFile);
     1231
     1232    xmlWriter.setAutoFormatting(true);
     1233    xmlWriter.writeStartDocument("1.0");
     1234    xmlWriter.writeStartElement("layout");
     1235    xmlWriter.writeTextElement("name", m_pCurrentKeyboardLayout->m_strName);
     1236    xmlWriter.writeTextElement("physicallayoutid", m_pCurrentKeyboardLayout->m_pPhysicalLayout->m_uId.toString());
     1237
     1238    QVector<UISoftKeyboardRow> &rows = m_pCurrentKeyboardLayout->m_pPhysicalLayout->m_rows;
     1239    for (int i = 0; i < rows.size(); ++i)
     1240    {
     1241        QVector<UISoftKeyboardKey> &keys = rows[i].keys();
     1242
     1243       for (int j = 0; j < keys.size(); ++j)
     1244       {
     1245           xmlWriter.writeStartElement("key");
     1246
     1247           UISoftKeyboardKey &key = keys[j];
     1248           xmlWriter.writeTextElement("position", QString::number(key.position()));
     1249           xmlWriter.writeTextElement("basecaption", key.baseCaption());
     1250           xmlWriter.writeTextElement("shiftcaption", key.shiftCaption());
     1251           xmlWriter.writeTextElement("altgrcaption", key.altGrCaption());
     1252
     1253           // if (!key.keyCap().isEmpty())
     1254           //     xmlWriter.writeTextElement("keycap", key.keyCap());
     1255           // else
     1256           //     xmlWriter.writeTextElement("keycap", key.staticKeyCap());
     1257           xmlWriter.writeEndElement();
     1258       }
     1259   }
     1260   xmlWriter.writeEndElement();
     1261   xmlWriter.writeEndDocument();
     1262
     1263   xmlFile.close();
    11921264}
    11931265
     
    11981270//     if (strFileName.isEmpty())
    11991271//         return;
    1200 //     UIKeyboardKeyCapReader keyCapReader(strFileName);
     1272//     UIKeyboardLayoutReader keyCapReader(strFileName);
    12011273//     //const QMap<int, QString> &keyCapMap = keyCapReader.keyCapMap();
    12021274
     
    12341306    newLayout.m_pPhysicalLayout = &(m_physicalLayouts[0]);
    12351307    newLayout.m_strName = QString(UISoftKeyboard::tr("Unnamed"));
    1236     m_pCurrentKeyboardLayout = &newLayout;
     1308    setCurrentLayout(&newLayout);
    12371309}
    12381310
     
    12401312{
    12411313    update();
     1314}
     1315
     1316void UISoftKeyboardWidget::sltPhysicalLayoutForLayoutChanged(int iIndex)
     1317{
     1318    if (!m_pCurrentKeyboardLayout)
     1319        return;
     1320    if (iIndex < 0 || iIndex >= m_physicalLayouts.size())
     1321        return;
     1322
     1323    if (m_pCurrentKeyboardLayout->m_pPhysicalLayout == &(m_physicalLayouts[iIndex]))
     1324        return;
     1325    m_pCurrentKeyboardLayout->m_pPhysicalLayout = &(m_physicalLayouts[iIndex]);
     1326    update();
     1327}
     1328
     1329void UISoftKeyboardWidget::sltLayoutNameChange(const QString &strName)
     1330{
     1331    if (!m_pCurrentKeyboardLayout)
     1332        return;
     1333    m_pCurrentKeyboardLayout->m_strName = strName;
     1334    emit sigLayoutChange(m_pCurrentKeyboardLayout->m_strName);
    12421335}
    12431336
     
    13741467    if (strLayoutFileName.isEmpty())
    13751468        return false;
    1376     UIKeyboardLayoutReader reader;
     1469    UIPhysicalLayoutReader reader;
    13771470    m_physicalLayouts.append(UISoftKeyboardPhysicalLayout());
    13781471    UISoftKeyboardPhysicalLayout &newPhysicalLayout = m_physicalLayouts.back();
    1379     //reset();
    13801472
    13811473    if (!reader.parseXMLFile(strLayoutFileName, newPhysicalLayout))
     
    13971489            UISoftKeyboardKey &key = (row.keys())[j];
    13981490            key.setKeyGeometry(QRect(iX, iY, key.width(), key.height()));
    1399             key.setPolygon(QPolygon(UIKeyboardLayoutReader::computeKeyVertices(key)));
     1491            key.setPolygon(QPolygon(UIPhysicalLayoutReader::computeKeyVertices(key)));
    14001492            key.setParentWidget(this);
    14011493            iX += key.width();
     
    14171509    setNewMinimumSize(QSize(fScale * iInitialWidth, fScale * iInitialHeight));
    14181510    setInitialSize(fScale * iInitialWidth, fScale * iInitialHeight);
    1419     update();
    14201511    return true;
     1512}
     1513
     1514bool UISoftKeyboardWidget::loadKeyboardLayout(const QString &strLayoutName)
     1515{
     1516    if (strLayoutName.isEmpty())
     1517        return false;
     1518
     1519    m_layouts.append(UISoftKeyboardLayout());
     1520    UISoftKeyboardLayout &newLayout = m_layouts.back();
     1521    UIKeyboardLayoutReader keyboardLayoutReader;
     1522    QUuid physicalLayoutUid;
     1523    if (!keyboardLayoutReader.parseFile(strLayoutName, newLayout, physicalLayoutUid))
     1524    {
     1525        m_layouts.removeLast();
     1526        return false;
     1527    }
     1528    return true;
     1529//     //const QMap<int, QString> &keyCapMap = keyCapReader.keyCapMap();
     1530
     1531//     //for (int i = 0; i < m_rows.size(); ++i)
     1532//     {
     1533//         //QVector<UISoftKeyboardKey> &keys = m_rows[i].keys();
     1534//         // for (int j = 0; j < keys.size(); ++j)
     1535//         // {
     1536//         //     UISoftKeyboardKey &key = keys[j];
     1537//         //     if (keyCapMap.contains(key.position()))
     1538//         //         key.setKeyCap(keyCapMap[key.position()]);
     1539//         // }
     1540//     }
     1541//     emit sigKeyCapChange(strFileName);
     1542
    14211543}
    14221544
     
    14291551void UISoftKeyboardWidget::configure()
    14301552{
    1431     QStringList physicalLayoutFileNames;
    1432     physicalLayoutFileNames << ":/101_ansi.xml" << ":/102_iso.xml";
    1433     foreach (const QString &strFileName, physicalLayoutFileNames)
    1434         loadPhysicalLayout(strFileName);
     1553    /* Load physical layouts from resources: */
     1554    QStringList physicalLayoutNames;
     1555    physicalLayoutNames << ":/101_ansi.xml" << ":/102_iso.xml";
     1556    foreach (const QString &strName, physicalLayoutNames)
     1557        loadPhysicalLayout(strName);
     1558
     1559    /* Load keyboard layouts from resources: */
     1560    QStringList keyboardLayoutNames;
     1561    keyboardLayoutNames << ":/us_international.xml";
     1562    foreach (const QString &strName, keyboardLayoutNames)
     1563    {
     1564        loadKeyboardLayout(strName);
     1565    }
    14351566
    14361567    setMouseTracking(true);
     
    14421573void UISoftKeyboardWidget::prepareObjects()
    14431574{
    1444     m_pKeyCapEditor = new UILayoutEditor(this);
    1445     if (m_pKeyCapEditor)
    1446     {
    1447         m_pKeyCapEditor->hide();
    1448         m_pKeyCapEditor->installEventFilter(this);
    1449         connect(m_pKeyCapEditor, &UILayoutEditor::sigKeyCaptionEdited, this, &UISoftKeyboardWidget::sltHandleKeyCaptionEdited);
     1575    m_pLayoutEditor = new UILayoutEditor(this);
     1576    if (m_pLayoutEditor)
     1577    {
     1578        m_pLayoutEditor->hide();
     1579        m_pLayoutEditor->installEventFilter(this);
     1580
     1581        QStringList physicalLayoutNames;
     1582        for (int i = 0; i < m_physicalLayouts.size(); ++i)
     1583            physicalLayoutNames << m_physicalLayouts[i].m_strName;
     1584        m_pLayoutEditor->setPhysicalLayoutNames(physicalLayoutNames);
     1585
     1586        connect(m_pLayoutEditor, &UILayoutEditor::sigKeyCaptionEdited, this, &UISoftKeyboardWidget::sltHandleKeyCaptionEdited);
     1587        connect(m_pLayoutEditor, &UILayoutEditor::sigPhysicalLayoutChanged, this, &UISoftKeyboardWidget::sltPhysicalLayoutForLayoutChanged);
     1588        connect(m_pLayoutEditor, &UILayoutEditor::sigLayoutNameChanged, this, &UISoftKeyboardWidget::sltLayoutNameChange);
    14501589    }
    14511590    m_pContextMenu = new QMenu(this);
     
    14691608}
    14701609
    1471 void UISoftKeyboardWidget::enableDisableKeyCapEditMode(bool fEnable)
    1472 {
    1473     if (m_fInKeyCapEditMode == fEnable)
    1474         return;
    1475     m_enmMode = Mode_LayoutEdit;
    1476 }
    1477 
    14781610void UISoftKeyboardWidget::setKeyBeingEdited(UISoftKeyboardKey* pKey)
    14791611{
     
    14811613        return;
    14821614    m_pKeyBeingEdited = pKey;
    1483     if (m_pKeyCapEditor)
    1484         m_pKeyCapEditor->setKey(pKey);
     1615    if (m_pLayoutEditor)
     1616        m_pLayoutEditor->setKey(pKey);
     1617}
     1618
     1619void UISoftKeyboardWidget::setCurrentLayout(UISoftKeyboardLayout *pLayout)
     1620{
     1621    if (m_pCurrentKeyboardLayout == pLayout)
     1622        return;
     1623    m_pCurrentKeyboardLayout = pLayout;
     1624    if (!m_pCurrentKeyboardLayout)
     1625    {
     1626        emit sigLayoutChange(QString());
     1627        return;
     1628    }
     1629    emit sigLayoutChange(m_pCurrentKeyboardLayout->m_strName);
     1630
     1631    if (m_pLayoutEditor)
     1632    {
     1633        m_pLayoutEditor->setLayoutName(m_pCurrentKeyboardLayout->m_strName);
     1634    }
    14851635}
    14861636
    14871637/*********************************************************************************************************************************
    1488 *   UIKeyboardLayoutReader implementation.                                                                                  *
     1638*   UIPhysicalLayoutReader implementation.                                                                                  *
    14891639*********************************************************************************************************************************/
    14901640
    1491 bool UIKeyboardLayoutReader::parseXMLFile(const QString &strFileName, UISoftKeyboardPhysicalLayout &physicalLayout)
     1641bool UIPhysicalLayoutReader::parseXMLFile(const QString &strFileName, UISoftKeyboardPhysicalLayout &physicalLayout)
    14921642{
    14931643    QFile xmlFile(strFileName);
     
    15001650    m_xmlReader.setDevice(&xmlFile);
    15011651
    1502     if (!m_xmlReader.readNextStartElement() || m_xmlReader.name() != "layout")
     1652    if (!m_xmlReader.readNextStartElement() || m_xmlReader.name() != "physicallayout")
    15031653        return false;
    15041654    physicalLayout.m_strFileName = strFileName;
     
    15251675}
    15261676
    1527 void UIKeyboardLayoutReader::parseRow(int iDefaultWidth, int iDefaultHeight, QVector<UISoftKeyboardRow> &rows)
     1677void UIPhysicalLayoutReader::parseRow(int iDefaultWidth, int iDefaultHeight, QVector<UISoftKeyboardRow> &rows)
    15281678{
    15291679    rows.append(UISoftKeyboardRow());
     
    15511701}
    15521702
    1553 void UIKeyboardLayoutReader::parseRowSpace(QVector<UISoftKeyboardRow> &rows)
     1703void UIPhysicalLayoutReader::parseRowSpace(QVector<UISoftKeyboardRow> &rows)
    15541704{
    15551705    int iSpace = 0;
     
    15651715}
    15661716
    1567 void UIKeyboardLayoutReader::parseKey(UISoftKeyboardRow &row)
     1717void UIPhysicalLayoutReader::parseKey(UISoftKeyboardRow &row)
    15681718{
    15691719    row.keys().append(UISoftKeyboardKey());
     
    16071757}
    16081758
    1609 void UIKeyboardLayoutReader::parseKeySpace(UISoftKeyboardRow &row)
     1759void UIPhysicalLayoutReader::parseKeySpace(UISoftKeyboardRow &row)
    16101760{
    16111761    int iWidth = row.defaultWidth();
     
    16221772}
    16231773
    1624 void UIKeyboardLayoutReader::parseCutout(UISoftKeyboardKey &key)
     1774void UIPhysicalLayoutReader::parseCutout(UISoftKeyboardKey &key)
    16251775{
    16261776    int iWidth = 0;
     
    16511801}
    16521802
    1653 QVector<QPoint> UIKeyboardLayoutReader::computeKeyVertices(const UISoftKeyboardKey &key)
     1803QVector<QPoint> UIPhysicalLayoutReader::computeKeyVertices(const UISoftKeyboardKey &key)
    16541804{
    16551805    QVector<QPoint> vertices;
     
    17031853
    17041854/*********************************************************************************************************************************
    1705 *   UIKeyboardKeyCapReader implementation.                                                                                  *
     1855*   UIKeyboardLayoutReader implementation.                                                                                  *
    17061856*********************************************************************************************************************************/
    17071857
    1708 UIKeyboardKeyCapReader::UIKeyboardKeyCapReader(const QString &strFileName)
    1709 {
    1710     parseKeyCapFile(strFileName);
    1711 }
    1712 
    1713 const QMap<int, QString> &UIKeyboardKeyCapReader::keyCapMap() const
    1714 {
    1715     return m_keyCapMap;
    1716 }
    1717 
    1718 bool UIKeyboardKeyCapReader::parseKeyCapFile(const QString &strFileName)
     1858bool UIKeyboardLayoutReader::parseFile(const QString &strFileName, UISoftKeyboardLayout &layout, QUuid &physicalLayoutUid)
    17191859{
    17201860    QFile xmlFile(strFileName);
     
    17271867    m_xmlReader.setDevice(&xmlFile);
    17281868
    1729     if (!m_xmlReader.readNextStartElement() || m_xmlReader.name() != "keycaps")
     1869    if (!m_xmlReader.readNextStartElement() || m_xmlReader.name() != "layout")
    17301870        return false;
    17311871
     1872    /** Map key is the key position and the value is the captions of the key. */
     1873    QMap<int, KeyCaptions> keyCapMap;
     1874
    17321875    while (m_xmlReader.readNextStartElement())
    17331876    {
    17341877        if (m_xmlReader.name() == "key")
    1735             parseKey();
     1878            parseKey(keyCapMap);
     1879        else if (m_xmlReader.name() == "name")
     1880            layout.m_strName = m_xmlReader.readElementText();
     1881        else if (m_xmlReader.name() == "physicallayoutid")
     1882            physicalLayoutUid = QUuid(m_xmlReader.readElementText());
    17361883        else
    17371884            m_xmlReader.skipCurrentElement();
     
    17401887}
    17411888
    1742 void  UIKeyboardKeyCapReader::parseKey()
    1743 {
    1744     QString strKeyCap;
     1889void  UIKeyboardLayoutReader::parseKey(QMap<int, KeyCaptions> &keyCapMap)
     1890{
     1891    KeyCaptions keyCaptions;
    17451892    int iKeyPosition = 0;
    17461893    while (m_xmlReader.readNextStartElement())
    17471894    {
    17481895        if (m_xmlReader.name() == "basecaption")
    1749             strKeyCap = m_xmlReader.readElementText();
    1750         if (m_xmlReader.name() == "shiftcaption")
    1751             strKeyCap = m_xmlReader.readElementText();
    1752         if (m_xmlReader.name() == "altgrcaption")
    1753             strKeyCap = m_xmlReader.readElementText();
     1896            keyCaptions.m_strBase = m_xmlReader.readElementText();
     1897        else if (m_xmlReader.name() == "shiftcaption")
     1898            keyCaptions.m_strShift = m_xmlReader.readElementText();
     1899        else if (m_xmlReader.name() == "altgrcaption")
     1900            keyCaptions.m_strAltGr = m_xmlReader.readElementText();
    17541901        else if (m_xmlReader.name() == "position")
    17551902            iKeyPosition = m_xmlReader.readElementText().toInt();
     
    17571904            m_xmlReader.skipCurrentElement();
    17581905    }
    1759     m_keyCapMap.insert(iKeyPosition, strKeyCap);
     1906    keyCapMap.insert(iKeyPosition, keyCaptions);
    17601907}
    17611908
  • trunk/src/VBox/Frontends/VirtualBox/xml/101_ansi.xml

    r79109 r79121  
    11<?xml version="1.0"?>
    22<!-- https://www.ibm.com/support/knowledgecenter/en/ssw_aix_71/com.ibm.aix.keyboardtechref/doc/kybdtech/Key.htm -->
    3 <layout defaultHeight="50" defaultWidth="50">
     3<physicallayout defaultHeight="50" defaultWidth="50">
    44    <name>101_ansi</name>
    55    <id>368efa94-3744-48c5-9d5a-59c2f15fe5ec</id>
     
    452452    </row>
    453453
    454 </layout>
     454</physicallayout>
  • trunk/src/VBox/Frontends/VirtualBox/xml/102_iso.xml

    r79105 r79121  
    11<?xml version="1.0"?>
    22<!-- https://www.ibm.com/support/knowledgecenter/en/ssw_aix_71/com.ibm.aix.keyboardtechref/doc/kybdtech/Key.htm -->
    3 <layout defaultHeight="50" defaultWidth="50">
     3<physicallayout defaultHeight="50" defaultWidth="50">
     4    <name>102_iso</name>
     5    <id>d41a0398-92a0-4ba4-beba-3d91a5dd0e50</id>
    46    <row>
    57        <key>
     
    452454        </key>
    453455    </row>
    454 </layout>
     456</physicallayout>
  • trunk/src/VBox/Frontends/VirtualBox/xml/us_international.xml

    r79109 r79121  
    1 <?xml version="1.0"?>
    2 <!-- https://www.ibm.com/support/knowledgecenter/en/ssw_aix_71/com.ibm.aix.keyboardtechref/doc/kybdtech/Key.htm -->
    3 <layout defaultHeight="50" defaultWidth="50">
    4     <name>101_ansi</name>
    5     <id>368efa94-3744-48c5-9d5a-59c2f15fe5ec</id>
    6     <row>
    7         <key>
    8             <position>110</position>
    9             <scancode>0x01</scancode>
    10         </key>
    11         <space>
    12             <width>50</width>
    13         </space>
    14         <key>
    15             <position>112</position>
    16             <scancode>0x3b</scancode>
    17         </key>
    18         <key>
    19             <position>113</position>
    20             <scancode>0x3c</scancode>
    21         </key>
    22         <key>
    23             <position>114</position>
    24             <scancode>0x3d</scancode>
    25         </key>
    26         <key>
    27             <position>115</position>
    28             <scancode>0x3e</scancode>
    29         </key>
    30         <space>
    31             <width>25</width>
    32         </space>
    33         <key>
    34             <position>116</position>
    35             <scancode>0x3f</scancode>
    36         </key>
    37         <key>
    38             <position>117</position>
    39             <scancode>0x40</scancode>
    40         </key>
    41         <key>
    42             <position>188</position>
    43             <scancode>0x41</scancode>
    44         </key>
    45         <key>
    46             <position>119</position>
    47             <scancode>0x42</scancode>
    48         </key>
    49         <space>
    50             <width>25</width>
    51         </space>
    52         <key>
    53             <position>120</position>
    54             <scancode>0x43</scancode>
    55         </key>
    56         <key>
    57             <position>121</position>
    58             <scancode>0x44</scancode>
    59         </key>
    60         <key>
    61             <position>122</position>
    62             <scancode>0x57</scancode>
    63         </key>
    64         <key>
    65             <position>123</position>
    66             <scancode>0x58</scancode>
    67         </key>
    68         <space>
    69             <width>25</width>
    70         </space>
    71         <key>
    72 
    73 
    74             <position>124</position>
    75             <scancodeprefix>0xe0</scancodeprefix>
    76             <scancode>37</scancode>
    77         </key>
    78         <key>
    79 
    80 
    81             <position>125</position>
    82             <scancode>0x46</scancode>
    83         </key>
    84         <key>
    85             <position>126</position>
    86             <scancodeprefix>0xe0-0x1d</scancodeprefix>
    87             <scancode>0x45</scancode>
    88         </key>
    89     </row>
    90     <space>
    91         <height>20</height>
    92     </space>
    93     <row>
    94         <key>
    95             <position>1</position>
    96             <scancode>0x29</scancode>
    97         </key>
    98         <key>
    99             <position>2</position>
    100             <scancode>0x02</scancode>
    101         </key>
    102         <key>
    103             <position>3</position>
    104             <scancode>0x03</scancode>
    105         </key>
    106         <key>
    107             <position>4</position>
    108             <scancode>0x04</scancode>
    109         </key>
    110         <key>
    111             <position>5</position>
    112             <scancode>0x05</scancode>
    113         </key>
    114         <key>
    115             <position>6</position>
    116             <scancode>0x06</scancode>
    117         </key>
    118         <key>
    119             <position>7</position>
    120             <scancode>0x07</scancode>
    121         </key>
    122         <key>
    123             <position>8</position>
    124             <scancode>0x08</scancode>
    125         </key>
    126         <key>
    127             <position>9</position>
    128             <scancode>0x09</scancode>
    129         </key>
    130         <key>
    131             <position>10</position>
    132             <scancode>0x0a</scancode>
    133         </key>
    134         <key>
    135             <position>11</position>
    136             <scancode>0x0b</scancode>
    137         </key>
    138         <key>
    139             <position>12</position>
    140             <scancode>0x0c</scancode>
    141         </key>
    142         <key>
    143             <position>13</position>
    144             <scancode>0x0d</scancode>
    145         </key>
    146         <key>
    147             <width>110</width>
    148 
    149             <position>15</position>
    150             <scancode>0x0e</scancode>
    151         </key>
    152         <space>
    153             <width>25</width>
    154         </space>
    155         <key>
    156             <position>75</position>
    157             <scancodeprefix>0xe0</scancodeprefix>
    158             <scancode>52</scancode>
    159         </key>
    160         <key>
    161             <position>80</position>
    162             <scancodeprefix>0xe0</scancodeprefix>
    163             <scancode>0x47</scancode>
    164         </key>
    165         <key>
    166             <position>85</position>
    167             <scancodeprefix>0xe0</scancodeprefix>
    168             <scancode>0x49</scancode>
    169         </key>
    170     </row>
    171     <row>
    172         <key>
    173             <width>75</width>
    174 
    175             <position>16</position>
    176             <scancode>0x0f</scancode>
    177         </key>
    178         <key>
    179             <position>17</position>
    180             <scancode>0x10</scancode>
    181         </key>
    182         <key>
    183             <position>18</position>
    184             <scancode>0x11</scancode>
    185         </key>
    186         <key>
    187             <position>19</position>
    188             <scancode>0x12</scancode>
    189         </key>
    190         <key>
    191             <position>20</position>
    192             <scancode>0x13</scancode>
    193         </key>
    194         <key>
    195             <position>21</position>
    196             <scancode>0x14</scancode>
    197         </key>
    198         <key>
    199             <position>22</position>
    200             <scancode>0x15</scancode>
    201         </key>
    202         <key>
    203             <position>23</position>
    204             <scancode>0x16</scancode>
    205         </key>
    206         <key>
    207             <position>24</position>
    208             <scancode>0x17</scancode>
    209         </key>
    210         <key>
    211             <position>25</position>
    212             <scancode>0x18</scancode>
    213         </key>
    214         <key>
    215             <position>26</position>
    216             <scancode>0x19</scancode>
    217         </key>
    218         <key>
    219             <position>27</position>
    220             <scancode>0x1a</scancode>
    221         </key>
    222         <key>
    223             <position>28</position>
    224             <scancode>0x1b</scancode>
    225         </key>
    226         <key>
    227             <position>29</position>
    228             <scancode>0x2b</scancode>
    229             <width>85</width>
    230         </key>
    231         <space>
    232             <width>25</width>
    233         </space>
    234         <key>
    235             <position>76</position>
    236             <scancode>0x53</scancode>
    237             <scancodeprefix>0xe0</scancodeprefix>
    238         </key>
    239         <key>
    240             <position>81</position>
    241             <scancodeprefix>0xe0</scancodeprefix>
    242             <scancode>0x4f</scancode>
    243         </key>
    244         <key>
    245             <position>86</position>
    246             <scancode>0x51</scancode>
    247             <scancodeprefix>0xe0</scancodeprefix>
    248         </key>
    249     </row>
    250     <row>
    251         <key>
    252             <width>100</width>
    253 
    254             <type>toggleable</type>
    255             <position>30</position>
    256             <scancode>0x3a</scancode>
    257         </key>
    258         <key>
    259             <position>31</position>
    260             <scancode>0x1e</scancode>
    261         </key>
    262         <key>
    263             <position>32</position>
    264             <scancode>0x1f</scancode>
    265         </key>
    266         <key>
    267             <position>33</position>
    268             <scancode>0x20</scancode>
    269         </key>
    270         <key>
    271             <position>34</position>
    272             <scancode>0x21</scancode>
    273         </key>
    274         <key>
    275             <position>35</position>
    276             <scancode>0x22</scancode>
    277         </key>
    278         <key>
    279             <position>36</position>
    280             <scancode>0x23</scancode>
    281         </key>
    282         <key>
    283             <position>37</position>
    284             <scancode>0x24</scancode>
    285         </key>
    286         <key>
    287             <position>38</position>
    288             <scancode>0x25</scancode>
    289         </key>
    290         <key>
    291             <position>39</position>
    292             <scancode>0x26</scancode>
    293         </key>
    294         <key>
    295             <position>40</position>
    296             <scancode>0x27</scancode>
    297         </key>
    298         <key>
    299             <position>41</position>
    300             <scancode>0x28</scancode>
    301         </key>
    302         <key>
    303             <width>115</width>
    304 
    305             <position>43</position>
    306             <scancode>0x1c</scancode>
    307         </key>
    308     </row>
    309     <row>
    310         <key>
    311             <width>125</width>
    312 
    313             <type>modifier</type>
    314             <position>44</position>
    315             <scancode>0x2a</scancode>
    316         </key>
    317         <key>
    318             <position>46</position>
    319             <scancode>0x2c</scancode>
    320         </key>
    321         <key>
    322             <position>47</position>
    323             <scancode>0x2d</scancode>
    324         </key>
    325         <key>
    326             <position>48</position>
    327             <scancode>0x2e</scancode>
    328         </key>
    329         <key>
    330             <position>49</position>
    331             <scancode>0x2f</scancode>
    332         </key>
    333         <key>
    334             <position>50</position>
    335             <scancode>0x30</scancode>
    336         </key>
    337         <key>
    338             <position>51</position>
    339             <scancode>0x31</scancode>
    340         </key>
    341         <key>
    342             <position>52</position>
    343             <scancode>0x32</scancode>
    344         </key>
    345         <key>
    346             <position>53</position>
    347             <scancode>0x33</scancode>
    348         </key>
    349         <key>
    350             <position>54</position>
    351             <scancode>0x34</scancode>
    352         </key>
    353         <key>
    354             <position>55</position>
    355             <scancode>0x35</scancode>
    356         </key>
    357         <key>
    358             <width>145</width>
    359 
    360             <type>modifier</type>
    361             <position>57</position>
    362             <scancode>0x36</scancode>
    363         </key>
    364         <space>
    365             <width>80</width>
    366         </space>
    367         <key>
    368 
    369             <scancodeprefix>0xe0</scancodeprefix>
    370             <position>83</position>
    371             <scancode>0x48</scancode>
    372         </key>
    373     </row>
    374     <row>
    375         <key>
    376             <width>90</width>
    377 
    378             <type>modifier</type>
    379             <position>58</position>
    380             <scancode>0x1d</scancode>
    381         </key>
    382         <key>
    383 
    384             <width>75</width>
    385             <type>modifier</type>
    386             <position>227</position>
    387             <scancodeprefix>0xe0</scancodeprefix>
    388             <scancode>0x5b</scancode>
    389         </key>
    390         <key>
    391             <position>60</position>
    392 
    393             <width>75</width>
    394             <type>modifier</type>
    395             <scancode>0x38</scancode>
    396         </key>
    397         <key>
    398             <width>235</width>
    399             <position>61</position>
    400             <scancode>0x39</scancode>
    401         </key>
    402         <key>
    403 
    404             <width>75</width>
    405             <type>modifier</type>
    406             <position>62</position>
    407             <scancodeprefix>0xe0</scancodeprefix>
    408             <scancode>0x38</scancode>
    409         </key>
    410         <key>
    411 
    412             <width>75</width>
    413             <type>modifier</type>
    414             <position>231</position>
    415             <scancodeprefix>0xe0</scancodeprefix>
    416             <scancode>0x5c</scancode>
    417         </key>
    418         <key>
    419 
    420             <width>75</width>
    421             <scancodeprefix>0xe0</scancodeprefix>
    422             <scancode>0x5d</scancode>
    423         </key>
    424         <key>
    425 
    426             <width>90</width>
    427             <position>64</position>
    428             <type>modifier</type>
    429             <scancodeprefix>0xe0</scancodeprefix>
    430             <scancode>0x1d</scancode>
    431         </key>
    432         <space>
    433             <width>25</width>
    434         </space>
    435         <key>
    436             <position>79</position>
    437             <scancodeprefix>0xe0</scancodeprefix>
    438             <scancode>0x4b</scancode>
    439         </key>
    440         <key>
    441             <position>84</position>
    442             <scancodeprefix>0xe0</scancodeprefix>
    443             <scancode>0x50</scancode>
    444         </key>
    445         <key>
    446             <position>89</position>
    447             <scancodeprefix>0xe0</scancodeprefix>
    448             <scancode>0x4d</scancode>
    449         </key>
    450 
    451 
    452     </row>
    453 
     1<?xml version="1.0" encoding="UTF-8"?>
     2<layout>
     3    <name>US International</name>
     4    <physicallayoutid>{368efa94-3744-48c5-9d5a-59c2f15fe5ec}</physicallayoutid>
     5    <key>
     6        <position>110</position>
     7        <basecaption>Esc</basecaption>
     8        <shiftcaption></shiftcaption>
     9        <altgrcaption></altgrcaption>
     10    </key>
     11    <key>
     12        <position>112</position>
     13        <basecaption>F1</basecaption>
     14        <shiftcaption></shiftcaption>
     15        <altgrcaption></altgrcaption>
     16    </key>
     17    <key>
     18        <position>113</position>
     19        <basecaption>F2</basecaption>
     20        <shiftcaption></shiftcaption>
     21        <altgrcaption></altgrcaption>
     22    </key>
     23    <key>
     24        <position>114</position>
     25        <basecaption>F3</basecaption>
     26        <shiftcaption></shiftcaption>
     27        <altgrcaption></altgrcaption>
     28    </key>
     29    <key>
     30        <position>115</position>
     31        <basecaption>F4</basecaption>
     32        <shiftcaption></shiftcaption>
     33        <altgrcaption></altgrcaption>
     34    </key>
     35    <key>
     36        <position>116</position>
     37        <basecaption>F5</basecaption>
     38        <shiftcaption></shiftcaption>
     39        <altgrcaption></altgrcaption>
     40    </key>
     41    <key>
     42        <position>117</position>
     43        <basecaption>F6</basecaption>
     44        <shiftcaption></shiftcaption>
     45        <altgrcaption></altgrcaption>
     46    </key>
     47    <key>
     48        <position>188</position>
     49        <basecaption>F7</basecaption>
     50        <shiftcaption></shiftcaption>
     51        <altgrcaption></altgrcaption>
     52    </key>
     53    <key>
     54        <position>119</position>
     55        <basecaption>F8</basecaption>
     56        <shiftcaption></shiftcaption>
     57        <altgrcaption></altgrcaption>
     58    </key>
     59    <key>
     60        <position>120</position>
     61        <basecaption>F9</basecaption>
     62        <shiftcaption></shiftcaption>
     63        <altgrcaption></altgrcaption>
     64    </key>
     65    <key>
     66        <position>121</position>
     67        <basecaption>F10</basecaption>
     68        <shiftcaption></shiftcaption>
     69        <altgrcaption></altgrcaption>
     70    </key>
     71    <key>
     72        <position>122</position>
     73        <basecaption>F11</basecaption>
     74        <shiftcaption></shiftcaption>
     75        <altgrcaption></altgrcaption>
     76    </key>
     77    <key>
     78        <position>123</position>
     79        <basecaption>F12</basecaption>
     80        <shiftcaption></shiftcaption>
     81        <altgrcaption></altgrcaption>
     82    </key>
     83    <key>
     84        <position>124</position>
     85        <basecaption></basecaption>
     86        <shiftcaption></shiftcaption>
     87        <altgrcaption></altgrcaption>
     88    </key>
     89    <key>
     90        <position>125</position>
     91        <basecaption></basecaption>
     92        <shiftcaption></shiftcaption>
     93        <altgrcaption></altgrcaption>
     94    </key>
     95    <key>
     96        <position>126</position>
     97        <basecaption></basecaption>
     98        <shiftcaption></shiftcaption>
     99        <altgrcaption></altgrcaption>
     100    </key>
     101    <key>
     102        <position>1</position>
     103        <basecaption>`</basecaption>
     104        <shiftcaption>~</shiftcaption>
     105        <altgrcaption></altgrcaption>
     106    </key>
     107    <key>
     108        <position>2</position>
     109        <basecaption>1</basecaption>
     110        <shiftcaption>!</shiftcaption>
     111        <altgrcaption></altgrcaption>
     112    </key>
     113    <key>
     114        <position>3</position>
     115        <basecaption>2</basecaption>
     116        <shiftcaption>@</shiftcaption>
     117        <altgrcaption></altgrcaption>
     118    </key>
     119    <key>
     120        <position>4</position>
     121        <basecaption>3</basecaption>
     122        <shiftcaption>#</shiftcaption>
     123        <altgrcaption></altgrcaption>
     124    </key>
     125    <key>
     126        <position>5</position>
     127        <basecaption></basecaption>
     128        <shiftcaption></shiftcaption>
     129        <altgrcaption></altgrcaption>
     130    </key>
     131    <key>
     132        <position>6</position>
     133        <basecaption></basecaption>
     134        <shiftcaption></shiftcaption>
     135        <altgrcaption></altgrcaption>
     136    </key>
     137    <key>
     138        <position>7</position>
     139        <basecaption></basecaption>
     140        <shiftcaption></shiftcaption>
     141        <altgrcaption></altgrcaption>
     142    </key>
     143    <key>
     144        <position>8</position>
     145        <basecaption></basecaption>
     146        <shiftcaption></shiftcaption>
     147        <altgrcaption></altgrcaption>
     148    </key>
     149    <key>
     150        <position>9</position>
     151        <basecaption></basecaption>
     152        <shiftcaption></shiftcaption>
     153        <altgrcaption></altgrcaption>
     154    </key>
     155    <key>
     156        <position>10</position>
     157        <basecaption></basecaption>
     158        <shiftcaption></shiftcaption>
     159        <altgrcaption></altgrcaption>
     160    </key>
     161    <key>
     162        <position>11</position>
     163        <basecaption></basecaption>
     164        <shiftcaption></shiftcaption>
     165        <altgrcaption></altgrcaption>
     166    </key>
     167    <key>
     168        <position>12</position>
     169        <basecaption></basecaption>
     170        <shiftcaption></shiftcaption>
     171        <altgrcaption></altgrcaption>
     172    </key>
     173    <key>
     174        <position>13</position>
     175        <basecaption></basecaption>
     176        <shiftcaption></shiftcaption>
     177        <altgrcaption></altgrcaption>
     178    </key>
     179    <key>
     180        <position>15</position>
     181        <basecaption></basecaption>
     182        <shiftcaption></shiftcaption>
     183        <altgrcaption></altgrcaption>
     184    </key>
     185    <key>
     186        <position>75</position>
     187        <basecaption></basecaption>
     188        <shiftcaption></shiftcaption>
     189        <altgrcaption></altgrcaption>
     190    </key>
     191    <key>
     192        <position>80</position>
     193        <basecaption></basecaption>
     194        <shiftcaption></shiftcaption>
     195        <altgrcaption></altgrcaption>
     196    </key>
     197    <key>
     198        <position>85</position>
     199        <basecaption></basecaption>
     200        <shiftcaption></shiftcaption>
     201        <altgrcaption></altgrcaption>
     202    </key>
     203    <key>
     204        <position>16</position>
     205        <basecaption></basecaption>
     206        <shiftcaption></shiftcaption>
     207        <altgrcaption></altgrcaption>
     208    </key>
     209    <key>
     210        <position>17</position>
     211        <basecaption></basecaption>
     212        <shiftcaption></shiftcaption>
     213        <altgrcaption></altgrcaption>
     214    </key>
     215    <key>
     216        <position>18</position>
     217        <basecaption></basecaption>
     218        <shiftcaption></shiftcaption>
     219        <altgrcaption></altgrcaption>
     220    </key>
     221    <key>
     222        <position>19</position>
     223        <basecaption></basecaption>
     224        <shiftcaption></shiftcaption>
     225        <altgrcaption></altgrcaption>
     226    </key>
     227    <key>
     228        <position>20</position>
     229        <basecaption></basecaption>
     230        <shiftcaption></shiftcaption>
     231        <altgrcaption></altgrcaption>
     232    </key>
     233    <key>
     234        <position>21</position>
     235        <basecaption></basecaption>
     236        <shiftcaption></shiftcaption>
     237        <altgrcaption></altgrcaption>
     238    </key>
     239    <key>
     240        <position>22</position>
     241        <basecaption></basecaption>
     242        <shiftcaption></shiftcaption>
     243        <altgrcaption></altgrcaption>
     244    </key>
     245    <key>
     246        <position>23</position>
     247        <basecaption></basecaption>
     248        <shiftcaption></shiftcaption>
     249        <altgrcaption></altgrcaption>
     250    </key>
     251    <key>
     252        <position>24</position>
     253        <basecaption></basecaption>
     254        <shiftcaption></shiftcaption>
     255        <altgrcaption></altgrcaption>
     256    </key>
     257    <key>
     258        <position>25</position>
     259        <basecaption></basecaption>
     260        <shiftcaption></shiftcaption>
     261        <altgrcaption></altgrcaption>
     262    </key>
     263    <key>
     264        <position>26</position>
     265        <basecaption></basecaption>
     266        <shiftcaption></shiftcaption>
     267        <altgrcaption></altgrcaption>
     268    </key>
     269    <key>
     270        <position>27</position>
     271        <basecaption></basecaption>
     272        <shiftcaption></shiftcaption>
     273        <altgrcaption></altgrcaption>
     274    </key>
     275    <key>
     276        <position>28</position>
     277        <basecaption></basecaption>
     278        <shiftcaption></shiftcaption>
     279        <altgrcaption></altgrcaption>
     280    </key>
     281    <key>
     282        <position>29</position>
     283        <basecaption></basecaption>
     284        <shiftcaption></shiftcaption>
     285        <altgrcaption></altgrcaption>
     286    </key>
     287    <key>
     288        <position>76</position>
     289        <basecaption></basecaption>
     290        <shiftcaption></shiftcaption>
     291        <altgrcaption></altgrcaption>
     292    </key>
     293    <key>
     294        <position>81</position>
     295        <basecaption></basecaption>
     296        <shiftcaption></shiftcaption>
     297        <altgrcaption></altgrcaption>
     298    </key>
     299    <key>
     300        <position>86</position>
     301        <basecaption></basecaption>
     302        <shiftcaption></shiftcaption>
     303        <altgrcaption></altgrcaption>
     304    </key>
     305    <key>
     306        <position>30</position>
     307        <basecaption></basecaption>
     308        <shiftcaption></shiftcaption>
     309        <altgrcaption></altgrcaption>
     310    </key>
     311    <key>
     312        <position>31</position>
     313        <basecaption></basecaption>
     314        <shiftcaption></shiftcaption>
     315        <altgrcaption></altgrcaption>
     316    </key>
     317    <key>
     318        <position>32</position>
     319        <basecaption></basecaption>
     320        <shiftcaption></shiftcaption>
     321        <altgrcaption></altgrcaption>
     322    </key>
     323    <key>
     324        <position>33</position>
     325        <basecaption></basecaption>
     326        <shiftcaption></shiftcaption>
     327        <altgrcaption></altgrcaption>
     328    </key>
     329    <key>
     330        <position>34</position>
     331        <basecaption></basecaption>
     332        <shiftcaption></shiftcaption>
     333        <altgrcaption></altgrcaption>
     334    </key>
     335    <key>
     336        <position>35</position>
     337        <basecaption></basecaption>
     338        <shiftcaption></shiftcaption>
     339        <altgrcaption></altgrcaption>
     340    </key>
     341    <key>
     342        <position>36</position>
     343        <basecaption></basecaption>
     344        <shiftcaption></shiftcaption>
     345        <altgrcaption></altgrcaption>
     346    </key>
     347    <key>
     348        <position>37</position>
     349        <basecaption></basecaption>
     350        <shiftcaption></shiftcaption>
     351        <altgrcaption></altgrcaption>
     352    </key>
     353    <key>
     354        <position>38</position>
     355        <basecaption></basecaption>
     356        <shiftcaption></shiftcaption>
     357        <altgrcaption></altgrcaption>
     358    </key>
     359    <key>
     360        <position>39</position>
     361        <basecaption></basecaption>
     362        <shiftcaption></shiftcaption>
     363        <altgrcaption></altgrcaption>
     364    </key>
     365    <key>
     366        <position>40</position>
     367        <basecaption></basecaption>
     368        <shiftcaption></shiftcaption>
     369        <altgrcaption></altgrcaption>
     370    </key>
     371    <key>
     372        <position>41</position>
     373        <basecaption></basecaption>
     374        <shiftcaption></shiftcaption>
     375        <altgrcaption></altgrcaption>
     376    </key>
     377    <key>
     378        <position>43</position>
     379        <basecaption></basecaption>
     380        <shiftcaption></shiftcaption>
     381        <altgrcaption></altgrcaption>
     382    </key>
     383    <key>
     384        <position>44</position>
     385        <basecaption>Shift</basecaption>
     386        <shiftcaption></shiftcaption>
     387        <altgrcaption></altgrcaption>
     388    </key>
     389    <key>
     390        <position>46</position>
     391        <basecaption>Z</basecaption>
     392        <shiftcaption></shiftcaption>
     393        <altgrcaption></altgrcaption>
     394    </key>
     395    <key>
     396        <position>47</position>
     397        <basecaption>X</basecaption>
     398        <shiftcaption></shiftcaption>
     399        <altgrcaption></altgrcaption>
     400    </key>
     401    <key>
     402        <position>48</position>
     403        <basecaption>C</basecaption>
     404        <shiftcaption></shiftcaption>
     405        <altgrcaption></altgrcaption>
     406    </key>
     407    <key>
     408        <position>49</position>
     409        <basecaption>V</basecaption>
     410        <shiftcaption></shiftcaption>
     411        <altgrcaption></altgrcaption>
     412    </key>
     413    <key>
     414        <position>50</position>
     415        <basecaption>B</basecaption>
     416        <shiftcaption></shiftcaption>
     417        <altgrcaption></altgrcaption>
     418    </key>
     419    <key>
     420        <position>51</position>
     421        <basecaption>N</basecaption>
     422        <shiftcaption></shiftcaption>
     423        <altgrcaption></altgrcaption>
     424    </key>
     425    <key>
     426        <position>52</position>
     427        <basecaption>M</basecaption>
     428        <shiftcaption></shiftcaption>
     429        <altgrcaption></altgrcaption>
     430    </key>
     431    <key>
     432        <position>53</position>
     433        <basecaption>,</basecaption>
     434        <shiftcaption>&lt;</shiftcaption>
     435        <altgrcaption></altgrcaption>
     436    </key>
     437    <key>
     438        <position>54</position>
     439        <basecaption>.</basecaption>
     440        <shiftcaption>&gt;</shiftcaption>
     441        <altgrcaption></altgrcaption>
     442    </key>
     443    <key>
     444        <position>55</position>
     445        <basecaption>/</basecaption>
     446        <shiftcaption>?</shiftcaption>
     447        <altgrcaption></altgrcaption>
     448    </key>
     449    <key>
     450        <position>57</position>
     451        <basecaption></basecaption>
     452        <shiftcaption></shiftcaption>
     453        <altgrcaption></altgrcaption>
     454    </key>
     455    <key>
     456        <position>83</position>
     457        <basecaption></basecaption>
     458        <shiftcaption></shiftcaption>
     459        <altgrcaption></altgrcaption>
     460    </key>
     461    <key>
     462        <position>58</position>
     463        <basecaption></basecaption>
     464        <shiftcaption></shiftcaption>
     465        <altgrcaption></altgrcaption>
     466    </key>
     467    <key>
     468        <position>227</position>
     469        <basecaption></basecaption>
     470        <shiftcaption></shiftcaption>
     471        <altgrcaption></altgrcaption>
     472    </key>
     473    <key>
     474        <position>60</position>
     475        <basecaption></basecaption>
     476        <shiftcaption></shiftcaption>
     477        <altgrcaption></altgrcaption>
     478    </key>
     479    <key>
     480        <position>61</position>
     481        <basecaption></basecaption>
     482        <shiftcaption></shiftcaption>
     483        <altgrcaption></altgrcaption>
     484    </key>
     485    <key>
     486        <position>62</position>
     487        <basecaption></basecaption>
     488        <shiftcaption></shiftcaption>
     489        <altgrcaption></altgrcaption>
     490    </key>
     491    <key>
     492        <position>231</position>
     493        <basecaption></basecaption>
     494        <shiftcaption></shiftcaption>
     495        <altgrcaption></altgrcaption>
     496    </key>
     497    <key>
     498        <position>0</position>
     499        <basecaption></basecaption>
     500        <shiftcaption></shiftcaption>
     501        <altgrcaption></altgrcaption>
     502    </key>
     503    <key>
     504        <position>64</position>
     505        <basecaption></basecaption>
     506        <shiftcaption></shiftcaption>
     507        <altgrcaption></altgrcaption>
     508    </key>
     509    <key>
     510        <position>79</position>
     511        <basecaption></basecaption>
     512        <shiftcaption></shiftcaption>
     513        <altgrcaption></altgrcaption>
     514    </key>
     515    <key>
     516        <position>84</position>
     517        <basecaption></basecaption>
     518        <shiftcaption></shiftcaption>
     519        <altgrcaption></altgrcaption>
     520    </key>
     521    <key>
     522        <position>89</position>
     523        <basecaption></basecaption>
     524        <shiftcaption></shiftcaption>
     525        <altgrcaption></altgrcaption>
     526    </key>
    454527</layout>
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette