VirtualBox

Changeset 78635 in vbox


Ignore:
Timestamp:
May 21, 2019 2:27:39 PM (6 years ago)
Author:
vboxsync
Message:

FE/Qt: bugref:6143. Sending the scan codes to the guest.

Location:
trunk/src/VBox/Frontends/VirtualBox
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineLogic.cpp

    r78567 r78635  
    16081608
    16091609    QIManagerDialog *pSoftKeyboardDialog;
    1610     UISoftKeyboardDialogFactory dialogFactory(actionPool(), machine().GetName());
     1610    UISoftKeyboardDialogFactory dialogFactory(uisession(), actionPool(), machine().GetName());
    16111611    dialogFactory.prepare(pSoftKeyboardDialog, activeMachineWindow());
    16121612    if (pSoftKeyboardDialog)
  • trunk/src/VBox/Frontends/VirtualBox/src/softkeyboard/UISoftKeyboard.cpp

    r78606 r78635  
    1919#include <QApplication>
    2020#include <QFile>
    21 #include <QPushButton>
     21#include <QToolButton>
    2222#include <QXmlStreamReader>
    2323#include <QVBoxLayout>
     
    2626#include "QIDialogButtonBox.h"
    2727#include "UIExtraDataManager.h"
     28#include "UISession.h"
    2829#include "UISoftKeyboard.h"
    2930#include "VBoxGlobal.h"
     
    3839    QString  m_strLabel;
    3940    LONG     m_scanCode;
     41    LONG     m_scanCodePrefix;
    4042};
    4143
     
    7476*********************************************************************************************************************************/
    7577
    76 class UISoftKeyboardKey : public QPushButton
     78class UISoftKeyboardKey : public QToolButton
    7779{
    7880    Q_OBJECT;
     
    8183
    8284    UISoftKeyboardKey(QWidget *pParent = 0);
     85
    8386    void setWidth(int iWidth);
    8487    int width() const;
     88
     89    void setScanCode(LONG scanCode);
     90    LONG scanCode() const;
     91
     92    void setScanCodePrefix(LONG scanCode);
     93    LONG scanCodePrefix() const;
     94
     95    QVector<LONG> scanCodeWithPrefix() const;
     96
    8597    void updateFontSize(float multiplier);
    8698
    87 protected:
    88 
    8999private:
    90100
    91     int m_iWidth;
    92     int m_iDefaultPixelSize;
    93     int m_iDefaultPointSize;
     101    int   m_iWidth;
     102    int   m_iDefaultPixelSize;
     103    int   m_iDefaultPointSize;
     104    LONG  m_scanCode;
     105    LONG  m_scanCodePrefix;
    94106};
    95107
     
    160172    row.m_keys.append(SoftKeyboardKey());
    161173    SoftKeyboardKey &key = row.m_keys.last();
     174    key.m_scanCode = 0;
     175    key.m_scanCodePrefix = 0;
    162176    while (m_xmlReader.readNextStartElement())
    163177    {
     
    165179            key.m_iWidth = m_xmlReader.readElementText().toInt();
    166180        else if (m_xmlReader.name() == "label")
    167             key.m_strLabel = m_xmlReader.readElementText();
     181        {
     182            if (key.m_strLabel.isEmpty())
     183                key.m_strLabel = m_xmlReader.readElementText();
     184            else
     185                key.m_strLabel = QString("%1%2%3").arg(key.m_strLabel).arg("\n").arg(m_xmlReader.readElementText());
     186        }
    168187        else if (m_xmlReader.name() == "scancode")
    169             key.m_scanCode = m_xmlReader.readElementText().toInt();
     188        {
     189            QString strCode = m_xmlReader.readElementText();
     190            bool fOk = false;
     191            key.m_scanCode = strCode.toInt(&fOk, 16);
     192            if (!fOk)
     193                key.m_scanCode = 0;
     194        }
     195        else if (m_xmlReader.name() == "scancodeprefix")
     196        {
     197            QString strCode = m_xmlReader.readElementText();
     198            bool fOk = false;
     199            key.m_scanCodePrefix = strCode.toInt(&fOk, 16);
     200            if (!fOk)
     201                key.m_scanCodePrefix = 0;
     202        }
    170203        else
    171204            m_xmlReader.skipCurrentElement();
     
    179212
    180213UISoftKeyboardKey::UISoftKeyboardKey(QWidget *pParent /* = 0 */)
    181     :QPushButton(pParent)
     214    :QToolButton(pParent)
    182215    , m_iWidth(1)
    183216{
     
    194227{
    195228    return m_iWidth;
     229}
     230
     231void UISoftKeyboardKey::setScanCode(LONG scanCode)
     232{
     233    m_scanCode = scanCode;
     234}
     235
     236LONG UISoftKeyboardKey::scanCode() const
     237{
     238    return m_scanCode;
     239}
     240
     241void UISoftKeyboardKey::setScanCodePrefix(LONG scanCodePrefix)
     242{
     243    m_scanCodePrefix = scanCodePrefix;
     244}
     245
     246LONG UISoftKeyboardKey::scanCodePrefix() const
     247{
     248    return m_scanCodePrefix;
    196249}
    197250
     
    238291        pKey->setVisible(true);
    239292        pKey->updateFontSize(fMultiplier);
    240         pKey->setGeometry(iX, 0, fMultiplier * pKey->width(), height());
     293        int iKeyWidth = fMultiplier * pKey->width();
     294        if (i != m_keys.size() - 1)
     295            pKey->setGeometry(iX, 0, iKeyWidth, height());
     296        else
     297        {
     298            pKey->setGeometry(iX, 0, width() - iX - 1, height());
     299        }
    241300        iX += fMultiplier * pKey->width();
    242301    }
    243302}
    244303
    245 
    246304/*********************************************************************************************************************************
    247305*   UISoftKeyboard implementation.                                                                                  *
    248306*********************************************************************************************************************************/
    249307
    250 UISoftKeyboard::UISoftKeyboard(EmbedTo /* enmEmbedding */,
    251                                QWidget *pParent, QString strMachineName /* = QString()*/,
     308UISoftKeyboard::UISoftKeyboard(EmbedTo /* enmEmbedding */, QWidget *pParent,
     309                               UISession *pSession, QString strMachineName /* = QString()*/,
    252310                               bool fShowToolbar /* = false */)
    253311    :QIWithRetranslateUI<QWidget>(pParent)
     312    , m_pSession(pSession)
    254313    , m_pMainLayout(0)
    255314    , m_pContainerWidget(0)
     
    283342}
    284343
     344void UISoftKeyboard::sltHandleKeyPress()
     345{
     346    UISoftKeyboardKey *pKey = qobject_cast<UISoftKeyboardKey*>(sender());
     347    if (!pKey)
     348        return;
     349    QVector<LONG> sequence;
     350    if (pKey->scanCodePrefix() != 0)
     351        sequence << pKey->scanCodePrefix();
     352    sequence << pKey->scanCode();
     353    keyboard().PutScancodes(sequence);
     354    printf("sending for press: ");
     355    for (int i = 0; i < sequence.size(); ++i)
     356        printf("%#04x ", sequence[i]);
     357    printf("\n");
     358}
     359
     360void UISoftKeyboard::sltHandleKeyRelease()
     361{
     362    UISoftKeyboardKey *pKey = qobject_cast<UISoftKeyboardKey*>(sender());
     363    if (!pKey)
     364        return;
     365
     366    QVector<LONG> sequence;
     367    if (pKey->scanCodePrefix() != 0)
     368        sequence <<  pKey->scanCodePrefix();
     369    sequence << (pKey->scanCode() | 0x80);
     370    keyboard().PutScancodes(sequence);
     371    printf("sending for release: ");
     372    for (int i = 0; i < sequence.size(); ++i)
     373        printf("%#04x ", sequence[i]);
     374    printf("\n");
     375}
     376
    285377void UISoftKeyboard::prepareObjects()
    286378{
     
    295387        return;
    296388    m_pContainerWidget->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
    297     //m_pContainerWidget->setStyleSheet("background-color:red;");
    298     //m_pContainerWidget->setAutoFillBackground(false);
    299 
    300389    m_pMainLayout->addWidget(m_pContainerWidget);
    301390}
     
    332421    {
    333422        UISoftKeyboardRow *pNewRow = new UISoftKeyboardRow(m_pContainerWidget);
    334         if ( i == 0)
    335             pNewRow->setStyleSheet("background-color:yellow;");
    336         else
    337             pNewRow->setStyleSheet("background-color:green;");
    338 
    339423        m_rows.push_back(pNewRow);
    340424        pNewRow->m_iHeight = layout.m_rows[i].m_iHeight;
     
    345429            pNewRow->m_iWidth += layout.m_rows[i].m_keys[j].m_iWidth;
    346430            UISoftKeyboardKey *pKey = new UISoftKeyboardKey(pNewRow);
     431            if (!pKey)
     432                continue;
     433            connect(pKey, &UISoftKeyboardKey::pressed, this, &UISoftKeyboard::sltHandleKeyPress);
     434            connect(pKey, &UISoftKeyboardKey::released, this, &UISoftKeyboard::sltHandleKeyRelease);
    347435            pNewRow->m_keys.append(pKey);
    348436            pKey->setText(layout.m_rows[i].m_keys[j].m_strLabel);
    349437            pKey->setWidth(layout.m_rows[i].m_keys[j].m_iWidth);
     438            pKey->setScanCode(layout.m_rows[i].m_keys[j].m_scanCode);
     439            pKey->setScanCodePrefix(layout.m_rows[i].m_keys[j].m_scanCodePrefix);
    350440            pKey->hide();
    351441        }
     442        printf("row width %d %d\n", i, pNewRow->m_iWidth);
    352443        m_iMaxRowWidth = qMax(m_iMaxRowWidth, pNewRow->m_iWidth);
    353444    }
    354     printf("total height %d %d\n", m_iTotalRowHeight, m_iMaxRowWidth);
    355 
    356 
    357 //     return;
    358 //     for (int i = 0; i < layout.m_rows.size(); ++i)
    359 //     {
    360 //         QHBoxLayout *pRowLayout = new QHBoxLayout;
    361 //         pRowLayout->setSpacing(0);
    362 //         for (int j = 0; j < layout.m_rows[i].m_keys.size(); ++j)
    363 //         {
    364 //             UISoftKeyboardKey *pKey = new UISoftKeyboardKey;
    365 //             pRowLayout->addWidget(pKey);
    366 
    367 //             //m_pContainerLayout->addWidget(pKey, i, j);
    368 //             //pKey->setFixedSize(layout.m_rows[i].m_keys[j].m_iWidth, layout.m_rows[i].m_iHeight);
    369 //             pKey->setText(layout.m_rows[i].m_keys[j].m_strLabel);
    370 //             //if (j != 3)
    371 
    372 
    373 //             // else
    374 //             //m_pContainerLayout->setColumnStretch(j, 0);
    375 //             //m_pContainerLayout->addSpacing(2);
    376 //             // QSpacerItem *pSpacer = new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding);
    377 //             // m_pContainerLayout->addItem(pSpacer);
    378 //         }
    379 //         //pRowLayout->addStretch(1);
    380 //         //m_pContainerLayout->setColumnStretch(layout.m_rows[i].m_keys.size()-1, 1);
    381 //         m_pContainerLayout->addLayout(pRowLayout);
    382 //     }
    383445}
    384446
     
    405467        pRow->setVisible(true);
    406468        y += fMultiplier * pRow->m_iHeight;
    407         // pRow->setAutoFillBackground(true);
    408         // pRow->raise();
    409 
    410         pRow->updateLayout();
    411 
    412         // m_pContainerWidget->lower();
    413         // pRow->update();
    414 
     469         pRow->updateLayout();
    415470    }
    416471    update();
    417     /* Compute the size multiplier: */
    418 
     472}
     473
     474CKeyboard& UISoftKeyboard::keyboard() const
     475{
     476    return m_pSession->keyboard();
    419477}
    420478
  • trunk/src/VBox/Frontends/VirtualBox/src/softkeyboard/UISoftKeyboard.h

    r78606 r78635  
    3535
    3636/* Forward declarations: */
     37class UISession;
    3738class UISoftKeyboardKey;
    3839class UISoftKeyboardRow;
     
    4849public:
    4950
    50     UISoftKeyboard(EmbedTo enmEmbedding, QWidget *pParent,
     51    UISoftKeyboard(EmbedTo enmEmbedding, QWidget *pParent, UISession *pSession,
    5152                                QString strMachineName = QString(), bool fShowToolbar = false);
    5253    ~UISoftKeyboard();
     
    5960private slots:
    6061
     62    void sltHandleKeyPress();
     63    void sltHandleKeyRelease();
     64
    6165private:
    6266
     
    6872    void parseLayout();
    6973    void updateLayout();
     74    CKeyboard& keyboard() const;
    7075
     76    UISession     *m_pSession;
    7177    QHBoxLayout   *m_pMainLayout;
    7278    QWidget       *m_pContainerWidget;
  • trunk/src/VBox/Frontends/VirtualBox/src/softkeyboard/UISoftKeyboardDialog.cpp

    r78567 r78635  
    2525#include "UIIconPool.h"
    2626#include "UIGuestControlConsole.h"
     27#include "UISession.h"
    2728#include "UISoftKeyboardDialog.h"
    2829#include "UISoftKeyboard.h"
     
    3738*********************************************************************************************************************************/
    3839
    39 UISoftKeyboardDialogFactory::UISoftKeyboardDialogFactory(UIActionPool *pActionPool /* = 0 */,
     40UISoftKeyboardDialogFactory::UISoftKeyboardDialogFactory(UISession *pSession /* = 0 */, UIActionPool *pActionPool /* = 0 */,
    4041                                                         const QString &strMachineName /* = QString() */)
    41     : m_pActionPool(pActionPool)
     42    : m_pSession(pSession)
     43    , m_pActionPool(pActionPool)
    4244    , m_strMachineName(strMachineName)
    4345{
     
    4648void UISoftKeyboardDialogFactory::create(QIManagerDialog *&pDialog, QWidget *pCenterWidget)
    4749{
    48     pDialog = new UISoftKeyboardDialog(pCenterWidget, m_pActionPool, m_strMachineName);
     50    pDialog = new UISoftKeyboardDialog(pCenterWidget, m_pSession, m_pActionPool, m_strMachineName);
    4951}
    5052
     
    5557
    5658UISoftKeyboardDialog::UISoftKeyboardDialog(QWidget *pCenterWidget,
     59                                           UISession *pSession,
    5760                                           UIActionPool *pActionPool,
    5861                                           const QString &strMachineName /* = QString() */)
    5962    : QIWithRetranslateUI<QIManagerDialog>(pCenterWidget)
     63    , m_pSession(pSession)
    6064    , m_pActionPool(pActionPool)
    6165    , m_strMachineName(strMachineName)
     
    8084{
    8185    /* Create widget: */
    82     UISoftKeyboard  *pSoftKeyboard = new UISoftKeyboard(EmbedTo_Dialog, 0, "");
     86    UISoftKeyboard  *pSoftKeyboard = new UISoftKeyboard(EmbedTo_Dialog, 0, m_pSession, "");
    8387
    8488    if (pSoftKeyboard)
  • trunk/src/VBox/Frontends/VirtualBox/src/softkeyboard/UISoftKeyboardDialog.h

    r78567 r78635  
    3535/* Forward declarations: */
    3636class UIActionPool;
     37class UISession;
    3738class UISoftKeyboardDialog;
    3839class CGuest;
     
    4344public:
    4445
    45     UISoftKeyboardDialogFactory(UIActionPool *pActionPool = 0, const QString &strMachineName = QString());
     46    UISoftKeyboardDialogFactory(UISession *pSession = 0,UIActionPool *pActionPool = 0, const QString &strMachineName = QString());
    4647
    4748protected:
     
    5152    virtual void create(QIManagerDialog *&pDialog, QWidget *pCenterWidget) /* override */;
    5253
     54    UISession    *m_pSession;
    5355    UIActionPool *m_pActionPool;
    5456    QString       m_strMachineName;
     
    6668      * @param  pCenterWidget  Passes the widget reference to center according to.
    6769      * @param  pActionPool    Passes the action-pool reference. */
    68     UISoftKeyboardDialog(QWidget *pCenterWidget, UIActionPool *pActionPool, const QString &strMachineName = QString());
     70    UISoftKeyboardDialog(QWidget *pCenterWidget, UISession *pSession, UIActionPool *pActionPool, const QString &strMachineName = QString());
    6971
    7072protected:
     
    103105private:
    104106
     107    UISession    *m_pSession;
    105108    UIActionPool *m_pActionPool;
    106     QString     m_strMachineName;
     109    QString      m_strMachineName;
    107110};
    108111
  • trunk/src/VBox/Frontends/VirtualBox/xml/us_layout.xml

    r78595 r78635  
    55        <key>
    66            <width>50</width>
    7             <label>Key1</label>
    8             <scancode>X11</scancode>
    9         </key>
    10         <key>
    11             <width>150</width>
    12             <label>Key2</label>
    13             <scancode>X11</scancode>
    14         </key>
    15         <key>
    16             <width>20</width>
    17             <label>Key3</label>
    18             <scancode>X11</scancode>
    19         </key>
    20         <key>
    21             <width>50</width>
    22             <label>Key4</label>
    23             <scancode>X11</scancode>
    24         </key>
     7            <label>Esc</label>
     8            <position>110</position>
     9            <scancode>0x01</scancode>
     10        </key>
     11        <key>
     12            <width>50</width>
     13            <label>F1</label>
     14            <position>112</position>
     15            <scancode>0x3b</scancode>
     16        </key>
     17        <key>
     18            <width>50</width>
     19            <label>F2</label>
     20            <position>113</position>
     21            <scancode>0x3c</scancode>
     22        </key>
     23        <key>
     24            <width>50</width>
     25            <label>F3</label>
     26            <position>114</position>
     27            <scancode>0x3d</scancode>
     28        </key>
     29        <key>
     30            <width>50</width>
     31            <label>F4</label>
     32            <position>115</position>
     33            <scancode>0x3e</scancode>
     34        </key>
     35        <key>
     36            <width>50</width>
     37            <label>F5</label>
     38            <position>116</position>
     39            <scancode>0x3f</scancode>
     40        </key>
     41        <key>
     42            <width>50</width>
     43            <label>F6</label>
     44            <position>117</position>
     45            <scancode>0x40</scancode>
     46        </key>
     47        <key>
     48            <width>50</width>
     49            <label>F7</label>
     50            <position>188</position>
     51            <scancode>0x41</scancode>
     52        </key>
     53        <key>
     54            <width>50</width>
     55            <label>F8</label>
     56            <position>119</position>
     57            <scancode>0x42</scancode>
     58        </key>
     59        <key>
     60            <width>50</width>
     61            <label>F9</label>
     62            <position>120</position>
     63            <scancode>0x43</scancode>
     64        </key>
     65        <key>
     66            <width>50</width>
     67            <label>F10</label>
     68            <position>121</position>
     69            <scancode>0x44</scancode>
     70        </key>
     71        <key>
     72            <width>50</width>
     73            <label>F11</label>
     74            <position>122</position>
     75            <scancode>0x57</scancode>
     76        </key>
     77        <key>
     78            <width>50</width>
     79            <label>F12</label>
     80            <position>123</position>
     81            <scancode>0x58</scancode>
     82        </key>
     83    </row>
     84    <row>
     85        <height>50</height>
     86        <key>
     87            <width>50</width>
     88            <label>~</label>
     89            <label>`</label>
     90            <position>1</position>
     91            <scancode>0x29</scancode>
     92        </key>
     93        <key>
     94            <width>50</width>
     95            <label>!</label>
     96            <label>1</label>
     97            <position>2</position>
     98            <scancode>0x02</scancode>
     99        </key>
     100        <key>
     101            <width>50</width>
     102            <label>@</label>
     103            <label>2</label>
     104            <position>3</position>
     105            <scancode>0x03</scancode>
     106        </key>
     107        <key>
     108            <width>50</width>
     109            <label>#</label>
     110            <label>3</label>
     111            <position>4</position>
     112            <scancode>0x04</scancode>
     113        </key>
     114        <key>
     115            <width>50</width>
     116            <label>$</label>
     117            <label>4</label>
     118            <position>5</position>
     119            <scancode>0x05</scancode>
     120        </key>
     121        <key>
     122            <width>50</width>
     123            <label>%</label>
     124            <label>5</label>
     125            <position>6</position>
     126            <scancode>0x06</scancode>
     127        </key>
     128        <key>
     129            <width>50</width>
     130            <label>^</label>
     131            <label>6</label>
     132            <position>7</position>
     133            <scancode>0x07</scancode>
     134        </key>
     135        <key>
     136            <width>50</width>
     137            <label>&amp;</label>
     138            <label>7</label>
     139            <position>8</position>
     140            <scancode>0x08</scancode>
     141        </key>
     142        <key>
     143            <width>50</width>
     144            <label>*</label>
     145            <label>8</label>
     146            <position>9</position>
     147            <scancode>0x09</scancode>
     148        </key>
     149        <key>
     150            <width>50</width>
     151            <label>(</label>
     152            <label>9</label>
     153            <position>10</position>
     154            <scancode>0x0a</scancode>
     155        </key>
     156        <key>
     157            <width>50</width>
     158            <label>)</label>
     159            <label>0</label>
     160            <position>11</position>
     161            <scancode>0x0b</scancode>
     162        </key>
     163        <key>
     164            <width>50</width>
     165            <label>_</label>
     166            <label>-</label>
     167            <position>12</position>
     168            <scancode>0x0c</scancode>
     169        </key>
     170        <key>
     171            <width>50</width>
     172            <label>+</label>
     173            <label>=</label>
     174            <position>13</position>
     175            <scancode>0x0d</scancode>
     176        </key>
     177        <key>
     178            <width>80</width>
     179            <label>Backspace</label>
     180            <position>14</position>
     181            <scancode>0x0e</scancode>
     182        </key>
     183    </row>
     184    <row>
     185        <height>50</height>
     186        <key>
     187            <width>70</width>
     188            <label>Tab</label>
     189            <position>16</position>
     190            <scancode>0x0f</scancode>
     191        </key>
     192        <key>
     193            <width>50</width>
     194            <label>Q</label>
     195            <position>17</position>
     196            <scancode>0x10</scancode>
     197        </key>
     198        <key>
     199            <width>50</width>
     200            <label>W</label>
     201            <position>18</position>
     202            <scancode>0x11</scancode>
     203        </key>
     204        <key>
     205            <width>50</width>
     206            <label>E</label>
     207            <position>19</position>
     208            <scancode>0x12</scancode>
     209        </key>
     210        <key>
     211            <width>50</width>
     212            <label>R</label>
     213            <position>20</position>
     214            <scancode>0x13</scancode>
     215        </key>
     216        <key>
     217            <width>50</width>
     218            <label>T</label>
     219            <position>21</position>
     220            <scancode>0x14</scancode>
     221        </key>
     222        <key>
     223            <width>50</width>
     224            <label>Y</label>
     225            <position>22</position>
     226            <scancode>0x15</scancode>
     227        </key>
     228        <key>
     229            <width>50</width>
     230            <label>U</label>
     231            <position>23</position>
     232            <scancode>0x16</scancode>
     233        </key>
     234        <key>
     235            <width>50</width>
     236            <label>I</label>
     237            <position>24</position>
     238            <scancode>0x17</scancode>
     239        </key>
     240        <key>
     241            <width>50</width>
     242            <label>O</label>
     243            <position>25</position>
     244            <scancode>0x18</scancode>
     245        </key>
     246        <key>
     247            <width>50</width>
     248            <label>P</label>
     249            <position>26</position>
     250            <scancode>0x19</scancode>
     251        </key>
     252        <key>
     253            <width>50</width>
     254            <label>{</label>
     255            <label>[</label>
     256            <position>27</position>
     257            <scancode>0x1a</scancode>
     258        </key>
     259        <key>
     260            <width>50</width>
     261            <label>}</label>
     262            <label>]</label>
     263            <position>28</position>
     264            <scancode>0x1b</scancode>
     265        </key>
     266        <key>
     267            <width>60</width>
     268            <label>|</label>
     269            <label>\</label>
     270            <position>29</position>
     271            <scancode>0x2b</scancode>
     272        </key>
     273    </row>
    25274
     275    <row>
     276        <height>50</height>
     277        <key>
     278            <width>70</width>
     279            <label>CapsLock</label>
     280            <position>30</position>
     281            <scancode>0x3a</scancode>
     282        </key>
     283        <key>
     284            <width>50</width>
     285            <label>A</label>
     286            <position>31</position>
     287            <scancode>0x1e</scancode>
     288        </key>
     289        <key>
     290            <width>50</width>
     291            <label>S</label>
     292            <position>32</position>
     293            <scancode>0x1f</scancode>
     294        </key>
     295        <key>
     296            <width>50</width>
     297            <label>D</label>
     298            <position>33</position>
     299            <scancode>0x20</scancode>
     300        </key>
     301        <key>
     302            <width>50</width>
     303            <label>F</label>
     304            <position>34</position>
     305            <scancode>0x21</scancode>
     306        </key>
     307        <key>
     308            <width>50</width>
     309            <label>G</label>
     310            <position>35</position>
     311            <scancode>0x22</scancode>
     312        </key>
     313        <key>
     314            <width>50</width>
     315            <label>H</label>
     316            <position>36</position>
     317            <scancode>0x23</scancode>
     318        </key>
     319        <key>
     320            <width>50</width>
     321            <label>J</label>
     322            <position>37</position>
     323            <scancode>0x24</scancode>
     324        </key>
     325        <key>
     326            <width>50</width>
     327            <label>K</label>
     328            <position>38</position>
     329            <scancode>0x25</scancode>
     330        </key>
     331        <key>
     332            <width>50</width>
     333            <label>L</label>
     334            <position>39</position>
     335            <scancode>0x26</scancode>
     336        </key>
     337        <key>
     338            <width>50</width>
     339            <label>:</label>
     340            <label>;</label>
     341            <position>40</position>
     342            <scancode>0x27</scancode>
     343        </key>
     344        <key>
     345            <width>50</width>
     346            <label>&quot;</label>
     347            <label>'</label>
     348            <position>41</position>
     349            <scancode>0x28</scancode>
     350        </key>
     351        <key>
     352            <width>110</width>
     353            <label>Enter</label>
     354            <position>43</position>
     355            <scancode>0x1c</scancode>
     356        </key>
     357    </row>
     358    <row>
     359        <height>50</height>
     360        <key>
     361            <width>115</width>
     362            <label>Shift</label>
     363            <position>44</position>
     364            <scancode>0x2a</scancode>
     365        </key>
     366        <key>
     367            <width>50</width>
     368            <label>Z</label>
     369            <position>46</position>
     370            <scancode>0x2c</scancode>
     371        </key>
     372        <key>
     373            <width>50</width>
     374            <label>X</label>
     375            <position>47</position>
     376            <scancode>0x2d</scancode>
     377        </key>
     378        <key>
     379            <width>50</width>
     380            <label>C</label>
     381            <position>48</position>
     382            <scancode>0x2e</scancode>
     383        </key>
     384        <key>
     385            <width>50</width>
     386            <label>V</label>
     387            <position>49</position>
     388            <scancode>0x2f</scancode>
     389        </key>
     390        <key>
     391            <width>50</width>
     392            <label>B</label>
     393            <position>50</position>
     394            <scancode>0x30</scancode>
     395        </key>
     396        <key>
     397            <width>50</width>
     398            <label>N</label>
     399            <position>51</position>
     400            <scancode>0x31</scancode>
     401        </key>
     402        <key>
     403            <width>50</width>
     404            <label>M</label>
     405            <position>52</position>
     406            <scancode>0x32</scancode>
     407        </key>
     408        <key>
     409            <width>50</width>
     410            <label>&lt;</label>
     411            <label>,</label>
     412            <position>53</position>
     413            <scancode>0x33</scancode>
     414        </key>
     415        <key>
     416            <width>50</width>
     417            <label>&gt;</label>
     418            <label>.</label>
     419            <position>54</position>
     420            <scancode>0x34</scancode>
     421        </key>
     422        <key>
     423            <width>50</width>
     424            <label>?</label>
     425            <label>/</label>
     426            <position>55</position>
     427            <scancode>0x35</scancode>
     428        </key>
     429        <key>
     430            <width>115</width>
     431            <label>Shift</label>
     432            <position>57</position>
     433            <scancode>0x36</scancode>
     434        </key>
    26435    </row>
    27436
    28437    <row>
    29         <height>30</height>
    30         <key>
    31             <width>150</width>
    32             <label>Key2</label>
    33             <scancode>X11</scancode>
    34         </key>
    35         <key>
    36             <width>20</width>
    37             <label>Key3</label>
    38             <scancode>X11</scancode>
    39         </key>
    40         <key>
    41             <width>50</width>
    42             <label>Key4</label>
    43             <scancode>X11</scancode>
     438        <height>50</height>
     439        <key>
     440            <width>90</width>
     441            <label>Ctrl</label>
     442            <position>58</position>
     443            <scancode>0x1d</scancode>
     444        </key>
     445        <key>
     446            <width>50</width>
     447            <label>Win</label>
     448            <scancodeprefix>0xe0</scancodeprefix>
     449            <scancode>0x5b</scancode>
     450        </key>
     451        <key>
     452            <width>70</width>
     453            <position>60</position>
     454            <label>Alt</label>
     455            <scancode>0x38</scancode>
     456        </key>
     457        <key>
     458            <width>240</width>
     459            <position>61</position>
     460            <scancode>0x39</scancode>
     461        </key>
     462        <key>
     463            <width>70</width>
     464            <label>AltGr</label>
     465            <scancodeprefix>0xe0</scancodeprefix>
     466            <scancode>0x38</scancode>
     467        </key>
     468        <key>
     469            <width>50</width>
     470            <label>Win</label>
     471            <scancodeprefix>0xe0</scancodeprefix>
     472            <scancode>0x5c</scancode>
     473        </key>
     474        <key>
     475            <width>70</width>
     476            <label>Menu</label>
     477            <scancodeprefix>0xe0</scancodeprefix>
     478            <scancode>0x5d</scancode>
     479        </key>
     480        <key>
     481            <width>90</width>
     482            <label>Ctrl</label>
     483            <scancodeprefix>0xe0</scancodeprefix>
     484            <scancode>0x1d</scancode>
    44485        </key>
    45486
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