Changeset 79121 in vbox
- Timestamp:
- Jun 13, 2019 10:22:19 AM (5 years ago)
- 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 3 3 <file alias="101_ansi.xml">xml/101_ansi.xml</file> 4 4 <file alias="102_iso.xml">xml/102_iso.xml</file> 5 <file alias="us_international.xml">xml/us_international.xml</file> 5 6 </qresource> 6 7 </RCC> -
trunk/src/VBox/Frontends/VirtualBox/src/softkeyboard/UISoftKeyboard.cpp
r79109 r79121 18 18 /* Qt includes: */ 19 19 #include <QApplication> 20 #include <QComboBox> 20 21 #include <QFile> 21 22 #include <QGroupBox> … … 79 80 80 81 void sigKeyCaptionEdited(); 82 void sigPhysicalLayoutChanged(int iIndex); 83 void sigLayoutNameChanged(const QString &strName); 81 84 82 85 public: … … 84 87 UILayoutEditor(QWidget *pParent = 0); 85 88 void setKey(UISoftKeyboardKey *pKey); 89 void setLayoutName(const QString &strName); 90 void setPhysicalLayoutNames(const QStringList &strPhysicalLayoutNames); 86 91 87 92 protected: … … 91 96 private slots: 92 97 93 void sltHandleAcceptCaptionChanges(); 98 void sltKeyBaseCaptionChange(); 99 void sltKeyShiftCaptionChange(); 100 void sltKeyAltGrCaptionChange(); 101 void sltLayoutNameChange(); 94 102 95 103 private: … … 99 107 QWidget *prepareKeyCaptionEditWidgets(); 100 108 101 Q VBoxLayout *m_pMainLayout;109 QGridLayout *m_pEditorLayout; 102 110 QGroupBox *m_pSelectedKeyGroupBox; 103 111 QGroupBox *m_pCaptionEditGroupBox; 104 112 113 QComboBox *m_pPhysicalLayoutCombo; 114 QLabel *m_pPhysicalLayoutLabel; 115 QLabel *m_pLayoutNameLabel; 105 116 QLabel *m_pScanCodeLabel; 106 117 QLabel *m_pPositionLabel; … … 109 120 QLabel *m_pAltGrCaptionLabel; 110 121 122 QLineEdit *m_pLayoutNameEdit; 111 123 QLineEdit *m_pScanCodeEdit; 112 124 QLineEdit *m_pPositionEdit; … … 115 127 QLineEdit *m_pAltGrCaptionEdit; 116 128 117 QPushButton *m_pAcceptCaptionsChangesButton;118 QPushButton *m_pResetCaptionsButton;119 129 /** The key which is being currently edited. Might be Null. */ 120 130 UISoftKeyboardKey *m_pKey; … … 329 339 void sltHandleNewLayout(); 330 340 void sltHandleKeyCaptionEdited(); 341 void sltPhysicalLayoutForLayoutChanged(int iIndex); 342 void sltLayoutNameChange(const QString &strName); 331 343 332 344 private: … … 340 352 void handleKeyRelease(UISoftKeyboardKey *pKey); 341 353 bool loadPhysicalLayout(const QString &strLayoutFileName); 354 bool loadKeyboardLayout(const QString &strLayoutName); 342 355 void reset(); 343 356 void configure(); 344 357 void prepareObjects(); 345 void enableDisableKeyCapEditMode(bool fEnable);346 358 /** Sets m_pKeyBeingEdited. */ 347 void setKeyBeingEdited(UISoftKeyboardKey *pKey);348 359 void setKeyBeingEdited(UISoftKeyboardKey *pKey); 360 void setCurrentLayout(UISoftKeyboardLayout *pLayout); 349 361 UISoftKeyboardKey *m_pKeyUnderMouse; 350 362 UISoftKeyboardKey *m_pKeyBeingEdited; … … 378 390 QAction *m_pShowPositionsAction; 379 391 QAction *m_pLayoutEditModeToggleAction; 380 UILayoutEditor *m_p KeyCapEditor;392 UILayoutEditor *m_pLayoutEditor; 381 393 Mode m_enmMode; 382 394 }; 383 395 384 396 /********************************************************************************************************************************* 385 * UI KeyboardLayoutReader definition. *397 * UIPhysicalLayoutReader definition. * 386 398 *********************************************************************************************************************************/ 387 399 388 class UI KeyboardLayoutReader400 class UIPhysicalLayoutReader 389 401 { 390 402 … … 407 419 408 420 /********************************************************************************************************************************* 409 * UIKeyboard KeyCapReader definition. *421 * UIKeyboardLayoutReader definition. * 410 422 *********************************************************************************************************************************/ 411 423 412 class UIKeyboard KeyCapReader424 class UIKeyboardLayoutReader 413 425 { 414 426 415 427 public: 416 428 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); 419 437 420 438 private: 421 439 422 bool parseKeyCapFile(const QString &strFileName); 423 void parseKey( );440 441 void parseKey(QMap<int, KeyCaptions> &keyCapMap); 424 442 QXmlStreamReader m_xmlReader; 425 /** Keys are positions and values are keycaps. */426 QMap<int, QString> m_keyCapMap;427 443 }; 428 444 … … 433 449 UILayoutEditor::UILayoutEditor(QWidget *pParent /* = 0 */) 434 450 :QIWithRetranslateUI<QWidget>(pParent) 435 , m_p MainLayout(0)451 , m_pEditorLayout(0) 436 452 , m_pSelectedKeyGroupBox(0) 437 453 , m_pCaptionEditGroupBox(0) 454 , m_pPhysicalLayoutCombo(0) 455 , m_pPhysicalLayoutLabel(0) 456 , m_pLayoutNameLabel(0) 438 457 , m_pScanCodeLabel(0) 439 458 , m_pPositionLabel(0) … … 441 460 , m_pShiftCaptionLabel(0) 442 461 , m_pAltGrCaptionLabel(0) 462 , m_pLayoutNameEdit(0) 443 463 , m_pScanCodeEdit(0) 444 464 , m_pPositionEdit(0) … … 446 466 , m_pShiftCaptionEdit(0) 447 467 , m_pAltGrCaptionEdit(0) 448 , m_pAcceptCaptionsChangesButton(0)449 , m_pResetCaptionsButton(0)450 468 , m_pKey(0) 451 469 { … … 475 493 } 476 494 495 void UILayoutEditor::setLayoutName(const QString &strName) 496 { 497 if (m_pLayoutNameEdit) 498 m_pLayoutNameEdit->setText(strName); 499 } 500 501 void 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 477 509 void UILayoutEditor::retranslateUi() 478 510 { 511 if (m_pPhysicalLayoutLabel) 512 m_pPhysicalLayoutLabel->setText(UISoftKeyboard::tr("Physical Layout")); 513 if (m_pLayoutNameLabel) 514 m_pLayoutNameLabel->setText(UISoftKeyboard::tr("Layout Name")); 479 515 if (m_pScanCodeLabel) 480 516 m_pScanCodeLabel->setText(UISoftKeyboard::tr("Scan Code")); … … 487 523 if (m_pAltGrCaptionLabel) 488 524 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"));493 525 if (m_pCaptionEditGroupBox) 494 526 m_pCaptionEditGroupBox->setTitle(UISoftKeyboard::tr("Captions")); … … 497 529 } 498 530 499 void UILayoutEditor::slt HandleAcceptCaptionChanges()500 { 501 if (!m_pKey )531 void UILayoutEditor::sltKeyBaseCaptionChange() 532 { 533 if (!m_pKey || !m_pBaseCaptionEdit) 502 534 return; 503 535 m_pKey->setBaseCaption(m_pBaseCaptionEdit->text()); 536 emit sigKeyCaptionEdited(); 537 } 538 539 void UILayoutEditor::sltKeyShiftCaptionChange() 540 { 541 if (!m_pKey || !m_pShiftCaptionEdit) 542 return; 504 543 m_pKey->setShiftCaption(m_pShiftCaptionEdit->text()); 544 emit sigKeyCaptionEdited(); 545 } 546 547 void UILayoutEditor::sltKeyAltGrCaptionChange() 548 { 549 if (!m_pKey || !m_pAltGrCaptionEdit) 550 return; 505 551 m_pKey->setAltGrCaption(m_pAltGrCaptionEdit->text()); 506 552 emit sigKeyCaptionEdited(); 507 553 } 508 554 555 void UILayoutEditor::sltLayoutNameChange() 556 { 557 if (!m_pLayoutNameEdit) 558 return; 559 emit sigLayoutNameChanged(m_pLayoutNameEdit->text()); 560 } 561 509 562 void UILayoutEditor::prepareObjects() 510 563 { 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); 515 584 516 585 m_pSelectedKeyGroupBox = new QGroupBox; 517 586 m_pSelectedKeyGroupBox->setEnabled(false); 518 587 519 m_p MainLayout->addWidget(m_pSelectedKeyGroupBox);588 m_pEditorLayout->addWidget(m_pSelectedKeyGroupBox, 2, 0, 1, 2); 520 589 QGridLayout *pSelectedKeyLayout = new QGridLayout(m_pSelectedKeyGroupBox); 521 590 pSelectedKeyLayout->setSpacing(0); … … 525 594 m_pScanCodeEdit = new QLineEdit; 526 595 m_pScanCodeLabel->setBuddy(m_pScanCodeEdit); 527 m_pScanCodeEdit->set ReadOnly(true);596 m_pScanCodeEdit->setEnabled(false); 528 597 pSelectedKeyLayout->addWidget(m_pScanCodeLabel, 0, 0); 529 598 pSelectedKeyLayout->addWidget(m_pScanCodeEdit, 0, 1); … … 531 600 m_pPositionLabel= new QLabel; 532 601 m_pPositionEdit = new QLineEdit; 602 m_pPositionEdit->setEnabled(false); 533 603 m_pPositionLabel->setBuddy(m_pPositionEdit); 534 m_pPositionEdit->setReadOnly(true);535 604 pSelectedKeyLayout->addWidget(m_pPositionLabel, 1, 0); 536 605 pSelectedKeyLayout->addWidget(m_pPositionEdit, 1, 1); … … 565 634 pCaptionEditorLayout->addWidget(m_pBaseCaptionLabel, 0, 0); 566 635 pCaptionEditorLayout->addWidget(m_pBaseCaptionEdit, 0, 1); 636 connect(m_pBaseCaptionEdit, &QLineEdit::editingFinished, this, &UILayoutEditor::sltKeyBaseCaptionChange); 567 637 568 638 m_pShiftCaptionLabel = new QLabel; … … 571 641 pCaptionEditorLayout->addWidget(m_pShiftCaptionLabel, 1, 0); 572 642 pCaptionEditorLayout->addWidget(m_pShiftCaptionEdit, 1, 1); 643 connect(m_pShiftCaptionEdit, &QLineEdit::editingFinished, this, &UILayoutEditor::sltKeyShiftCaptionChange); 573 644 574 645 m_pAltGrCaptionLabel = new QLabel; … … 577 648 pCaptionEditorLayout->addWidget(m_pAltGrCaptionLabel, 2, 0); 578 649 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 586 652 587 653 QSpacerItem *pSpacer = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Expanding); … … 958 1024 if (m_enmMode == Mode_LayoutEdit) 959 1025 { 960 m_p KeyCapEditor->setGeometry(width() - iEditDialogWidth, 0,1026 m_pLayoutEditor->setGeometry(width() - iEditDialogWidth, 0, 961 1027 iEditDialogWidth, height()); 962 m_p KeyCapEditor->show();963 m_p KeyCapEditor->setFocus();1028 m_pLayoutEditor->show(); 1029 m_pLayoutEditor->setFocus(); 964 1030 } 965 1031 else 966 m_p KeyCapEditor->hide();1032 m_pLayoutEditor->hide(); 967 1033 968 1034 if (!m_pCurrentKeyboardLayout || m_iInitialWidth == 0 || m_iInitialHeight == 0) … … 1039 1105 } 1040 1106 setKeyBeingEdited(m_pKeyUnderMouse); 1041 // if (m_pKeyBeingEdited && m_p KeyCapEditor)1042 // m_p KeyCapEditor->setText(m_pKeyBeingEdited->keyCap());1107 // if (m_pKeyBeingEdited && m_pLayoutEditor) 1108 // m_pLayoutEditor->setText(m_pKeyBeingEdited->keyCap()); 1043 1109 } 1044 1110 update(); … … 1068 1134 bool UISoftKeyboardWidget::eventFilter(QObject *pWatched, QEvent *pEvent) 1069 1135 { 1070 if (pWatched != m_p KeyCapEditor)1136 if (pWatched != m_pLayoutEditor) 1071 1137 return QIWithRetranslateUI<QWidget>::eventFilter(pWatched, pEvent); 1072 1138 … … 1085 1151 { 1086 1152 // if (m_pKeyBeingEdited) 1087 // m_pKeyBeingEdited->setStaticKeyCap(m_p KeyCapEditor->text());1153 // m_pKeyBeingEdited->setStaticKeyCap(m_pLayoutEditor->text()); 1088 1154 setKeyBeingEdited(0); 1089 1155 update(); … … 1121 1187 // m_pLastSelectedLayout = pSenderAction; 1122 1188 // m_pLoadLayoutFileAction->setData(strFileName); 1123 // emit sigLayoutChange(strFileName);1189 // 1124 1190 // return; 1125 1191 // } … … 1147 1213 void UISoftKeyboardWidget::sltHandleSaveLayout() 1148 1214 { 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(); 1192 1264 } 1193 1265 … … 1198 1270 // if (strFileName.isEmpty()) 1199 1271 // return; 1200 // UIKeyboard KeyCapReader keyCapReader(strFileName);1272 // UIKeyboardLayoutReader keyCapReader(strFileName); 1201 1273 // //const QMap<int, QString> &keyCapMap = keyCapReader.keyCapMap(); 1202 1274 … … 1234 1306 newLayout.m_pPhysicalLayout = &(m_physicalLayouts[0]); 1235 1307 newLayout.m_strName = QString(UISoftKeyboard::tr("Unnamed")); 1236 m_pCurrentKeyboardLayout = &newLayout;1308 setCurrentLayout(&newLayout); 1237 1309 } 1238 1310 … … 1240 1312 { 1241 1313 update(); 1314 } 1315 1316 void 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 1329 void 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); 1242 1335 } 1243 1336 … … 1374 1467 if (strLayoutFileName.isEmpty()) 1375 1468 return false; 1376 UI KeyboardLayoutReader reader;1469 UIPhysicalLayoutReader reader; 1377 1470 m_physicalLayouts.append(UISoftKeyboardPhysicalLayout()); 1378 1471 UISoftKeyboardPhysicalLayout &newPhysicalLayout = m_physicalLayouts.back(); 1379 //reset();1380 1472 1381 1473 if (!reader.parseXMLFile(strLayoutFileName, newPhysicalLayout)) … … 1397 1489 UISoftKeyboardKey &key = (row.keys())[j]; 1398 1490 key.setKeyGeometry(QRect(iX, iY, key.width(), key.height())); 1399 key.setPolygon(QPolygon(UI KeyboardLayoutReader::computeKeyVertices(key)));1491 key.setPolygon(QPolygon(UIPhysicalLayoutReader::computeKeyVertices(key))); 1400 1492 key.setParentWidget(this); 1401 1493 iX += key.width(); … … 1417 1509 setNewMinimumSize(QSize(fScale * iInitialWidth, fScale * iInitialHeight)); 1418 1510 setInitialSize(fScale * iInitialWidth, fScale * iInitialHeight); 1419 update();1420 1511 return true; 1512 } 1513 1514 bool 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 1421 1543 } 1422 1544 … … 1429 1551 void UISoftKeyboardWidget::configure() 1430 1552 { 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 } 1435 1566 1436 1567 setMouseTracking(true); … … 1442 1573 void UISoftKeyboardWidget::prepareObjects() 1443 1574 { 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); 1450 1589 } 1451 1590 m_pContextMenu = new QMenu(this); … … 1469 1608 } 1470 1609 1471 void UISoftKeyboardWidget::enableDisableKeyCapEditMode(bool fEnable)1472 {1473 if (m_fInKeyCapEditMode == fEnable)1474 return;1475 m_enmMode = Mode_LayoutEdit;1476 }1477 1478 1610 void UISoftKeyboardWidget::setKeyBeingEdited(UISoftKeyboardKey* pKey) 1479 1611 { … … 1481 1613 return; 1482 1614 m_pKeyBeingEdited = pKey; 1483 if (m_pKeyCapEditor) 1484 m_pKeyCapEditor->setKey(pKey); 1615 if (m_pLayoutEditor) 1616 m_pLayoutEditor->setKey(pKey); 1617 } 1618 1619 void 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 } 1485 1635 } 1486 1636 1487 1637 /********************************************************************************************************************************* 1488 * UI KeyboardLayoutReader implementation. *1638 * UIPhysicalLayoutReader implementation. * 1489 1639 *********************************************************************************************************************************/ 1490 1640 1491 bool UI KeyboardLayoutReader::parseXMLFile(const QString &strFileName, UISoftKeyboardPhysicalLayout &physicalLayout)1641 bool UIPhysicalLayoutReader::parseXMLFile(const QString &strFileName, UISoftKeyboardPhysicalLayout &physicalLayout) 1492 1642 { 1493 1643 QFile xmlFile(strFileName); … … 1500 1650 m_xmlReader.setDevice(&xmlFile); 1501 1651 1502 if (!m_xmlReader.readNextStartElement() || m_xmlReader.name() != " layout")1652 if (!m_xmlReader.readNextStartElement() || m_xmlReader.name() != "physicallayout") 1503 1653 return false; 1504 1654 physicalLayout.m_strFileName = strFileName; … … 1525 1675 } 1526 1676 1527 void UI KeyboardLayoutReader::parseRow(int iDefaultWidth, int iDefaultHeight, QVector<UISoftKeyboardRow> &rows)1677 void UIPhysicalLayoutReader::parseRow(int iDefaultWidth, int iDefaultHeight, QVector<UISoftKeyboardRow> &rows) 1528 1678 { 1529 1679 rows.append(UISoftKeyboardRow()); … … 1551 1701 } 1552 1702 1553 void UI KeyboardLayoutReader::parseRowSpace(QVector<UISoftKeyboardRow> &rows)1703 void UIPhysicalLayoutReader::parseRowSpace(QVector<UISoftKeyboardRow> &rows) 1554 1704 { 1555 1705 int iSpace = 0; … … 1565 1715 } 1566 1716 1567 void UI KeyboardLayoutReader::parseKey(UISoftKeyboardRow &row)1717 void UIPhysicalLayoutReader::parseKey(UISoftKeyboardRow &row) 1568 1718 { 1569 1719 row.keys().append(UISoftKeyboardKey()); … … 1607 1757 } 1608 1758 1609 void UI KeyboardLayoutReader::parseKeySpace(UISoftKeyboardRow &row)1759 void UIPhysicalLayoutReader::parseKeySpace(UISoftKeyboardRow &row) 1610 1760 { 1611 1761 int iWidth = row.defaultWidth(); … … 1622 1772 } 1623 1773 1624 void UI KeyboardLayoutReader::parseCutout(UISoftKeyboardKey &key)1774 void UIPhysicalLayoutReader::parseCutout(UISoftKeyboardKey &key) 1625 1775 { 1626 1776 int iWidth = 0; … … 1651 1801 } 1652 1802 1653 QVector<QPoint> UI KeyboardLayoutReader::computeKeyVertices(const UISoftKeyboardKey &key)1803 QVector<QPoint> UIPhysicalLayoutReader::computeKeyVertices(const UISoftKeyboardKey &key) 1654 1804 { 1655 1805 QVector<QPoint> vertices; … … 1703 1853 1704 1854 /********************************************************************************************************************************* 1705 * UIKeyboard KeyCapReader implementation. *1855 * UIKeyboardLayoutReader implementation. * 1706 1856 *********************************************************************************************************************************/ 1707 1857 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) 1858 bool UIKeyboardLayoutReader::parseFile(const QString &strFileName, UISoftKeyboardLayout &layout, QUuid &physicalLayoutUid) 1719 1859 { 1720 1860 QFile xmlFile(strFileName); … … 1727 1867 m_xmlReader.setDevice(&xmlFile); 1728 1868 1729 if (!m_xmlReader.readNextStartElement() || m_xmlReader.name() != " keycaps")1869 if (!m_xmlReader.readNextStartElement() || m_xmlReader.name() != "layout") 1730 1870 return false; 1731 1871 1872 /** Map key is the key position and the value is the captions of the key. */ 1873 QMap<int, KeyCaptions> keyCapMap; 1874 1732 1875 while (m_xmlReader.readNextStartElement()) 1733 1876 { 1734 1877 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()); 1736 1883 else 1737 1884 m_xmlReader.skipCurrentElement(); … … 1740 1887 } 1741 1888 1742 void UIKeyboard KeyCapReader::parseKey()1743 { 1744 QString strKeyCap;1889 void UIKeyboardLayoutReader::parseKey(QMap<int, KeyCaptions> &keyCapMap) 1890 { 1891 KeyCaptions keyCaptions; 1745 1892 int iKeyPosition = 0; 1746 1893 while (m_xmlReader.readNextStartElement()) 1747 1894 { 1748 1895 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(); 1754 1901 else if (m_xmlReader.name() == "position") 1755 1902 iKeyPosition = m_xmlReader.readElementText().toInt(); … … 1757 1904 m_xmlReader.skipCurrentElement(); 1758 1905 } 1759 m_keyCapMap.insert(iKeyPosition, strKeyCap);1906 keyCapMap.insert(iKeyPosition, keyCaptions); 1760 1907 } 1761 1908 -
trunk/src/VBox/Frontends/VirtualBox/xml/101_ansi.xml
r79109 r79121 1 1 <?xml version="1.0"?> 2 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">3 <physicallayout defaultHeight="50" defaultWidth="50"> 4 4 <name>101_ansi</name> 5 5 <id>368efa94-3744-48c5-9d5a-59c2f15fe5ec</id> … … 452 452 </row> 453 453 454 </ layout>454 </physicallayout> -
trunk/src/VBox/Frontends/VirtualBox/xml/102_iso.xml
r79105 r79121 1 1 <?xml version="1.0"?> 2 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"> 3 <physicallayout defaultHeight="50" defaultWidth="50"> 4 <name>102_iso</name> 5 <id>d41a0398-92a0-4ba4-beba-3d91a5dd0e50</id> 4 6 <row> 5 7 <key> … … 452 454 </key> 453 455 </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><</shiftcaption> 435 <altgrcaption></altgrcaption> 436 </key> 437 <key> 438 <position>54</position> 439 <basecaption>.</basecaption> 440 <shiftcaption>></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> 454 527 </layout>
Note:
See TracChangeset
for help on using the changeset viewer.