diff --git a/CMakeLists.txt b/CMakeLists.txt index e2d4109a..3e235622 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,90 +1,96 @@ # Konsole project # KDE Application Version, managed by release script set (KDE_APPLICATIONS_VERSION_MAJOR "19") set (KDE_APPLICATIONS_VERSION_MINOR "07") set (KDE_APPLICATIONS_VERSION_MICRO "70") set (KDE_APPLICATIONS_VERSION "${KDE_APPLICATIONS_VERSION_MAJOR}.${KDE_APPLICATIONS_VERSION_MINOR}.${KDE_APPLICATIONS_VERSION_MICRO}") # minimal requirements cmake_minimum_required (VERSION 3.0 FATAL_ERROR) # Qt 5.9 LTS EOL May 2020 -set (QT_MIN_VERSION "5.9.7") + +# See autotests/KeyboardTranslatorTest.cpp which require checks for +# Qt >= 5.10.0 due to qCompare issues. +# Qt 5.9.4 is on DragonflyBSD; Qt 5.9.5 is on Ubuntu 18.04 LTS +# I could not find a 5.9.6 or 5.9.7 system to test. +set (QT_MIN_VERSION "5.9.4") + set (KF5_MIN_VERSION "5.6.0") # Release script will create bugzilla versions project(konsole VERSION ${KDE_APPLICATIONS_VERSION}) find_package(ECM 1.6.0 REQUIRED NO_MODULE) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${ECM_MODULE_PATH} ${ECM_KDE_MODULE_DIR}) include(KDEInstallDirs) include(KDECMakeSettings) include(KDECompilerSettings NO_POLICY_SCOPE) include(KDEFrameworkCompilerSettings NO_POLICY_SCOPE) include(ECMOptionalAddSubdirectory) include(ECMInstallIcons) include(ECMSetupVersion) include(ECMMarkNonGuiExecutable) include(ECMGenerateHeaders) include(GenerateExportHeader) include(FeatureSummary) include(ECMQtDeclareLoggingCategory) ecm_setup_version(${KDE_APPLICATIONS_VERSION} VARIABLE_PREFIX KONSOLEPRIVATE SOVERSION ${KDE_APPLICATIONS_VERSION_MAJOR} ) find_package(Qt5 ${QT_MIN_VERSION} CONFIG REQUIRED Core DBus PrintSupport Widgets ) find_package(KF5 ${KF5_MIN_VERSION} REQUIRED Bookmarks Completion Config ConfigWidgets CoreAddons Crash GuiAddons DBusAddons I18n IconThemes Init KIO NewStuff NewStuffCore Notifications NotifyConfig Parts Pty Service TextWidgets WidgetsAddons WindowSystem XmlGui DBusAddons GlobalAccel ) find_package(KF5DocTools ${KF5_MIN_VERSION}) set_package_properties(KF5DocTools PROPERTIES DESCRIPTION "Tools to generate documentation" TYPE OPTIONAL ) if(NOT APPLE) find_package(X11) set_package_properties(X11 PROPERTIES TYPE OPTIONAL) endif() set(HAVE_X11 ${X11_FOUND}) # FIXME: Fix code to allow this #add_definitions(-DQT_NO_FOREACH) # See above includes for defaults add_definitions( -DQT_STRICT_ITERATORS -DQT_NO_URL_CAST_FROM_STRING ) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) include_directories(${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR} ) add_subdirectory( src ) add_subdirectory( data ) add_subdirectory( desktop ) if (KF5DocTools_FOUND) add_subdirectory( doc/manual ) endif() add_subdirectory( tools ) install( FILES konsole.categories DESTINATION ${KDE_INSTALL_CONFDIR} ) feature_summary(WHAT ALL INCLUDE_QUIET_PACKAGES FATAL_ON_MISSING_REQUIRED_PACKAGES) diff --git a/src/autotests/KeyboardTranslatorTest.cpp b/src/autotests/KeyboardTranslatorTest.cpp index de066782..525bc221 100644 --- a/src/autotests/KeyboardTranslatorTest.cpp +++ b/src/autotests/KeyboardTranslatorTest.cpp @@ -1,194 +1,210 @@ /* Copyright 2013, 2018 by Kurt Hindenburg This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ // Own #include "KeyboardTranslatorTest.h" // KDE #include using namespace Konsole; Q_DECLARE_METATYPE(Qt::KeyboardModifiers) void KeyboardTranslatorTest::testEntryTextWildcards_data() { // Shift = 1 + (1 << 0) = 2 // Alt = 1 + (1 << 2) = 3 // Control = 1 + (1 << 4) = 5 QTest::addColumn("text"); QTest::addColumn("result"); QTest::addColumn("wildcards"); QTest::addColumn("modifiers"); QTest::newRow("Home no wildcards no modifiers")<< QByteArray("Home") << QByteArray("Home") << false << Qt::KeyboardModifiers(Qt::NoModifier); QTest::newRow("Home no wildcards Shift modifiers")<< QByteArray("Home") << QByteArray("Home") << false << Qt::KeyboardModifiers(Qt::ShiftModifier); QTest::newRow("Home no wildcards Alt modifiers")<< QByteArray("Home") << QByteArray("Home") << false << Qt::KeyboardModifiers(Qt::AltModifier); QTest::newRow("Home no wildcards Control modifiers")<< QByteArray("Home") << QByteArray("Home") << false << Qt::KeyboardModifiers(Qt::ControlModifier); QTest::newRow("Home yes wildcards no modifiers")<< QByteArray("Home") << QByteArray("Home") << true << Qt::KeyboardModifiers(Qt::NoModifier); QTest::newRow("Home yes wildcards Shift modifiers")<< QByteArray("Home") << QByteArray("Home") << true << Qt::KeyboardModifiers(Qt::ShiftModifier); QTest::newRow("Home yes wildcards Alt modifiers")<< QByteArray("Home") << QByteArray("Home") << true << Qt::KeyboardModifiers(Qt::AltModifier); QTest::newRow("Home yes wildcards Control modifiers")<< QByteArray("Home") << QByteArray("Home") << true << Qt::KeyboardModifiers(Qt::ControlModifier); // text, results: no mod, shift, alt, control QList entry; entry << QByteArray("E*") << QByteArray("E1") << QByteArray("E2") << QByteArray("E3") << QByteArray("E5"); QTest::newRow("E* yes wildcards no modifiers")<< entry[0] << entry[1] << true << Qt::KeyboardModifiers(Qt::NoModifier); QTest::newRow("E* yes wildcards Shift modifiers")<< entry[0] << entry[2] << true << Qt::KeyboardModifiers(Qt::ShiftModifier); QTest::newRow("E* yes wildcards Alt modifiers")<< entry[0] << entry[3] << true << Qt::KeyboardModifiers(Qt::AltModifier); QTest::newRow("E* yes wildcards Control modifiers")<< entry[0] << entry[4] << true << Qt::KeyboardModifiers(Qt::ControlModifier); // combinations entry.clear();; entry << QByteArray("E*") << QByteArray("E4") << QByteArray("E6") << QByteArray("E8") << QByteArray("E7"); QTest::newRow("E* yes wildcards Shift+Alt modifiers")<< entry[0] << entry[1] << true << Qt::KeyboardModifiers(Qt::ShiftModifier | Qt::AltModifier); QTest::newRow("E* yes wildcards Shift+Control modifiers")<< entry[0] << entry[2] << true << Qt::KeyboardModifiers(Qt::ShiftModifier | Qt::ControlModifier); QTest::newRow("E* yes wildcards Shift+Alt+Control modifiers")<< entry[0] << entry[3] << true << Qt::KeyboardModifiers(Qt::ShiftModifier | Qt::AltModifier | Qt::ControlModifier); QTest::newRow("E* yes wildcards Alt+Control modifiers")<< entry[0] << entry[4] << true << Qt::KeyboardModifiers(Qt::AltModifier | Qt::ControlModifier); // text, results: no mod, shift, alt, control entry.clear();; entry << QByteArray("\033[24;*~") << QByteArray("\033[24;1~") << QByteArray("\033[24;2~") << QByteArray("\033[24;3~") << QByteArray("\033[24;5~"); QTest::newRow("\033[24;*~ yes wildcards no modifiers")<< entry[0] << entry[1] << true << Qt::KeyboardModifiers(Qt::NoModifier); QTest::newRow("\033[24;*~ yes wildcards Shift modifiers")<< entry[0] << entry[2] << true << Qt::KeyboardModifiers(Qt::ShiftModifier); QTest::newRow("\033[24;*~ yes wildcards Alt modifiers")<< entry[0] << entry[3] << true << Qt::KeyboardModifiers(Qt::AltModifier); QTest::newRow("\033[24;*~ yes wildcards Control modifiers")<< entry[0] << entry[4] << true << Qt::KeyboardModifiers(Qt::ControlModifier); // combinations entry.clear();; entry << QByteArray("\033[24;*~") << QByteArray("\033[24;4~") << QByteArray("\033[24;6~") << QByteArray("\033[24;8~") << QByteArray("\033[24;7~"); QTest::newRow("\033[24;*~ yes wildcards Shift+Alt modifiers")<< entry[0] << entry[1] << true << Qt::KeyboardModifiers(Qt::ShiftModifier | Qt::AltModifier); QTest::newRow("\033[24;*~ yes wildcards Shift+Control modifiers")<< entry[0] << entry[2] << true << Qt::KeyboardModifiers(Qt::ShiftModifier | Qt::ControlModifier); QTest::newRow("\033[24;*~ yes wildcards Shift+Alt+Control modifiers")<< entry[0] << entry[3] << true << Qt::KeyboardModifiers(Qt::ShiftModifier | Qt::AltModifier | Qt::ControlModifier); QTest::newRow("\033[24;*~ yes wildcards Alt+Control modifiers")<< entry[0] << entry[4] << true << Qt::KeyboardModifiers(Qt::AltModifier | Qt::ControlModifier); } void KeyboardTranslatorTest::testEntryTextWildcards() { QFETCH(QByteArray, text); QFETCH(QByteArray, result); QFETCH(bool, wildcards); QFETCH(Qt::KeyboardModifiers, modifiers); KeyboardTranslator::Entry entry; entry.setText(text); QCOMPARE(entry.text(wildcards, modifiers), result); } // Use FallbackKeyboardTranslator to test basic functionality void KeyboardTranslatorTest::testFallback() { auto fallback = new FallbackKeyboardTranslator(); QCOMPARE(QStringLiteral("fallback"), fallback->name()); QCOMPARE(QStringLiteral("Fallback Keyboard Translator"), fallback->description()); auto entries = fallback->entries(); QCOMPARE(1, entries.size()); auto entry = fallback->findEntry(Qt::Key_Tab, nullptr); QVERIFY(!entry.isNull()); QCOMPARE(FallbackKeyboardTranslator::Command::NoCommand, entry.command()); +#if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)) QCOMPARE(Qt::Key_Tab, entry.keyCode()); +#endif QCOMPARE(QByteArray("\t"), entry.text()); QCOMPARE(QByteArray("\\t"), entry.escapedText()); +#if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)) QCOMPARE(Qt::NoModifier, entry.modifiers()); QCOMPARE(Qt::NoModifier, entry.modifierMask()); QCOMPARE(KeyboardTranslator::NoState, entry.state()); +#endif QCOMPARE(QStringLiteral("Tab"), entry.conditionToString()); QCOMPARE(QStringLiteral("\\t"), entry.resultToString()); QVERIFY(entry.matches(Qt::Key_Tab, Qt::NoModifier, KeyboardTranslator::NoState)); QVERIFY(entry == fallback->findEntry(Qt::Key_Tab, nullptr)); } void KeyboardTranslatorTest::testHexKeys() { QFile linuxkeytab(QFINDTESTDATA(QStringLiteral("data/test.keytab"))); QVERIFY(linuxkeytab.exists()); QVERIFY(linuxkeytab.open(QIODevice::ReadOnly)); KeyboardTranslator* translator = new KeyboardTranslator(QStringLiteral("testtranslator")); KeyboardTranslatorReader reader(&linuxkeytab); while (reader.hasNextEntry()) { translator->addEntry(reader.nextEntry()); } linuxkeytab.close(); // A worthless check ATM if (reader.parseError()) { QFAIL("Parse failure"); } QCOMPARE(QStringLiteral("testtranslator"), translator->name()); QCOMPARE(QString(), translator->description()); auto entry = translator->findEntry(Qt::Key_Backspace, nullptr); QVERIFY(!entry.isNull()); QCOMPARE(FallbackKeyboardTranslator::Command::NoCommand, entry.command()); +#if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)) QCOMPARE(Qt::Key_Backspace, entry.keyCode()); +#endif QCOMPARE(QByteArray("\x7F"), entry.text()); QCOMPARE(QByteArray("\\x7f"), entry.escapedText()); +#if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)) QCOMPARE(Qt::NoModifier, entry.modifiers()); QCOMPARE(Qt::NoModifier, entry.modifierMask()); QCOMPARE(KeyboardTranslator::NoState, entry.state()); +#endif QCOMPARE(QStringLiteral("Backspace"), entry.conditionToString()); QCOMPARE(QStringLiteral("\\x7f"), entry.resultToString()); QVERIFY(entry.matches(Qt::Key_Backspace, Qt::NoModifier, KeyboardTranslator::NoState)); QVERIFY(entry == translator->findEntry(Qt::Key_Backspace, nullptr)); entry = translator->findEntry(Qt::Key_Delete, nullptr); QVERIFY(!entry.isNull()); QCOMPARE(FallbackKeyboardTranslator::Command::NoCommand, entry.command()); +#if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)) QCOMPARE(Qt::Key_Delete, entry.keyCode()); QCOMPARE(QByteArray("\x08"), entry.text()); +#endif QCOMPARE(QByteArray("\\b"), entry.escapedText()); +#if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)) QCOMPARE(Qt::NoModifier, entry.modifiers()); QCOMPARE(Qt::NoModifier, entry.modifierMask()); QCOMPARE(KeyboardTranslator::NoState, entry.state()); +#endif QCOMPARE(QStringLiteral("Del"), entry.conditionToString()); QCOMPARE(QStringLiteral("\\b"), entry.resultToString()); QVERIFY(entry.matches(Qt::Key_Delete, Qt::NoModifier, KeyboardTranslator::NoState)); QVERIFY(!entry.matches(Qt::Key_Backspace, Qt::NoModifier, KeyboardTranslator::NoState)); QVERIFY(!(entry == translator->findEntry(Qt::Key_Backspace, nullptr))); entry = translator->findEntry(Qt::Key_Space, nullptr); QVERIFY(!entry.isNull()); QCOMPARE(FallbackKeyboardTranslator::Command::NoCommand, entry.command()); +#if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)) QCOMPARE(Qt::Key_Space, entry.keyCode()); QEXPECT_FAIL("", "Several keytabs use x00 as Space +Control; text() fails", Continue); QCOMPARE(QByteArray("\x00"), entry.text()); +#endif QCOMPARE(QByteArray("\\x00"), entry.escapedText()); +#if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)) QCOMPARE(Qt::NoModifier, entry.modifiers()); QCOMPARE(Qt::NoModifier, entry.modifierMask()); QCOMPARE(KeyboardTranslator::NoState, entry.state()); +#endif QCOMPARE(QStringLiteral("Space"), entry.conditionToString()); QCOMPARE(QStringLiteral("\\x00"), entry.resultToString()); QVERIFY(entry.matches(Qt::Key_Space, Qt::NoModifier, KeyboardTranslator::NoState)); QVERIFY(entry == translator->findEntry(Qt::Key_Space, nullptr)); QVERIFY(!entry.matches(Qt::Key_Backspace, Qt::NoModifier, KeyboardTranslator::NoState)); QVERIFY(!(entry == translator->findEntry(Qt::Key_Backspace, nullptr))); } QTEST_GUILESS_MAIN(KeyboardTranslatorTest)