From 98c7cec732ba76349c3b06bc076b91fadcd68625 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Sun, 25 Oct 2020 18:52:38 +0100 Subject: [PATCH 01/13] CMake: restore NOTREACHED, without the macro-mess - gcc (up to at least version 10) is worse at recognizing that all cases have been handled, so it complains about all the switches that cover enum values. --- src/calamares/CalamaresWindow.cpp | 1 + src/libcalamares/partition/PartitionSize.cpp | 7 ++++++- src/libcalamares/utils/Yaml.cpp | 1 + src/modules/netinstall/Config.cpp | 1 + src/modules/packagechooser/PackageChooserViewStep.cpp | 1 + 5 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/calamares/CalamaresWindow.cpp b/src/calamares/CalamaresWindow.cpp index b062c0b4d..a141317e0 100644 --- a/src/calamares/CalamaresWindow.cpp +++ b/src/calamares/CalamaresWindow.cpp @@ -271,6 +271,7 @@ flavoredWidget( Calamares::Branding::PanelFlavor flavor, case Calamares::Branding::PanelFlavor::None: return nullptr; } + __builtin_unreachable(); } /** @brief Adds widgets to @p layout if they belong on this @p side diff --git a/src/libcalamares/partition/PartitionSize.cpp b/src/libcalamares/partition/PartitionSize.cpp index 82444da6a..ddd3be2ef 100644 --- a/src/libcalamares/partition/PartitionSize.cpp +++ b/src/libcalamares/partition/PartitionSize.cpp @@ -139,6 +139,7 @@ PartitionSize::toBytes( qint64 totalSectors, qint64 sectorSize ) const case SizeUnit::GiB: return toBytes(); } + __builtin_unreachable(); } qint64 @@ -175,7 +176,7 @@ PartitionSize::toBytes( qint64 totalBytes ) const case SizeUnit::GiB: return toBytes(); } - + __builtin_unreachable(); } qint64 @@ -206,6 +207,7 @@ PartitionSize::toBytes() const case SizeUnit::GiB: return CalamaresUtils::GiBtoBytes( static_cast< unsigned long long >( value() ) ); } + __builtin_unreachable(); } bool @@ -231,6 +233,7 @@ PartitionSize::operator<( const PartitionSize& other ) const case SizeUnit::GiB: return ( toBytes() < other.toBytes() ); } + __builtin_unreachable(); } bool @@ -256,6 +259,7 @@ PartitionSize::operator>( const PartitionSize& other ) const case SizeUnit::GiB: return ( toBytes() > other.toBytes() ); } + __builtin_unreachable(); } bool @@ -281,6 +285,7 @@ PartitionSize::operator==( const PartitionSize& other ) const case SizeUnit::GiB: return ( toBytes() == other.toBytes() ); } + __builtin_unreachable(); } } // namespace Partition diff --git a/src/libcalamares/utils/Yaml.cpp b/src/libcalamares/utils/Yaml.cpp index f999b8bb0..dd7523ae4 100644 --- a/src/libcalamares/utils/Yaml.cpp +++ b/src/libcalamares/utils/Yaml.cpp @@ -52,6 +52,7 @@ yamlToVariant( const YAML::Node& node ) case YAML::NodeType::Undefined: return QVariant(); } + __builtin_unreachable(); } diff --git a/src/modules/netinstall/Config.cpp b/src/modules/netinstall/Config.cpp index 92cdcb2bf..e69b3c2a4 100644 --- a/src/modules/netinstall/Config.cpp +++ b/src/modules/netinstall/Config.cpp @@ -43,6 +43,7 @@ Config::status() const case Status::FailedNetworkError: return tr( "Network Installation. (Disabled: Unable to fetch package lists, check your network connection)" ); } + __builtin_unreachable(); } diff --git a/src/modules/packagechooser/PackageChooserViewStep.cpp b/src/modules/packagechooser/PackageChooserViewStep.cpp index b649e6431..d576f2753 100644 --- a/src/modules/packagechooser/PackageChooserViewStep.cpp +++ b/src/modules/packagechooser/PackageChooserViewStep.cpp @@ -110,6 +110,7 @@ PackageChooserViewStep::isNextEnabled() const // exactly one OR one or more return m_widget->hasSelection(); } + __builtin_unreachable(); } From 83b06fe3cb9e2a3bcb24a5996c30a4fecc547f24 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 27 Oct 2020 15:38:38 +0100 Subject: [PATCH 02/13] Changes: credits for this round --- CHANGES | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index ac8bf5855..1f6f104da 100644 --- a/CHANGES +++ b/CHANGES @@ -10,7 +10,9 @@ website will have to do for older versions. # 3.2.33 (unreleased) # This release contains contributions from (alphabetically by first name): - - No external contributors yet + - Anke Boersma + - Andrius Štikonas + - Gaël PORTAY ## Core ## - Calamares now sets the C++ standard for compilation to C++17; this From 17b964701606bdbf620e7229840768568c6c6096 Mon Sep 17 00:00:00 2001 From: Artem Grinev Date: Sun, 25 Oct 2020 05:14:42 +0300 Subject: [PATCH 03/13] [keyboard] Support for additional layout if current layout is not ASCII- capable in live system --- src/modules/keyboard/Config.cpp | 132 ++++++++++++++++++++++++- src/modules/keyboard/Config.h | 12 +++ src/modules/keyboard/keyboard.qrc | 1 + src/modules/keyboard/non-ascii-layouts | 4 + 4 files changed, 147 insertions(+), 2 deletions(-) create mode 100644 src/modules/keyboard/non-ascii-layouts diff --git a/src/modules/keyboard/Config.cpp b/src/modules/keyboard/Config.cpp index 7f7eb7b27..4e59b5fda 100644 --- a/src/modules/keyboard/Config.cpp +++ b/src/modules/keyboard/Config.cpp @@ -49,6 +49,104 @@ xkbmap_layout_args( const QString& layout, const QString& variant ) return r; } +static inline QStringList +xkbmap_layout_args( const QList> layoutsAndVariantsList, const QString& switchOption = "grp:alt_shift_toggle") +{ + QStringList layouts; + QStringList variants; + + for( auto& [layout,variant] : layoutsAndVariantsList ) + { + layouts.append(layout); + variants.append(variant); + } + + QStringList r{ "-layout", layouts.join( "," ) }; + + if ( !variants.isEmpty() ) + { + r << "-variant" << variants.join( "," ); + } + + if ( !switchOption.isEmpty()) + { + r << "-option" << switchOption; + } + + return r; +} + +static inline QString +xkbmap_query_grp_option() +{ + QProcess setxkbmapQuery; + setxkbmapQuery.start( "setxkbmap", { "-query" } ); + setxkbmapQuery.waitForFinished(); + + QString outputLine; + + do + { + outputLine = setxkbmapQuery.readLine(); + } + while( !setxkbmapQuery.atEnd() || !outputLine.startsWith("options:") ); + + if( !outputLine.startsWith("options:") ) + { + return QString(); + } + + int index = outputLine.indexOf("grp:"); + + if( index == -1 ) + { + return QString(); + } + + //it's either in the end of line or before the other option so \s or , + int lastIndex = outputLine.indexOf( QRegExp("[\\s,]"), index ); + + return outputLine.mid( index, lastIndex-1 ); +} + +AdditionalLayoutInfo Config::getAdditionalLayoutInfo( const QString &layout, bool* found ) +{ + QFile layoutTable(":/non-ascii-layouts"); + + if(!layoutTable.open(QIODevice::ReadOnly | QIODevice::Text)) { + cError() << "Non-ASCII layout table could not be opened"; + *found = false; + return {}; + } + + QString tableLine; + + do + { + tableLine = layoutTable.readLine(); + } + while( !layoutTable.atEnd() || !tableLine.startsWith(layout) ); + + if( !tableLine.startsWith(layout) ){ + *found = false; + return {}; + } + + *found = true; + + QStringList tableEntries = tableLine.split(" ", SplitSkipEmptyParts); + + AdditionalLayoutInfo r; + + r.name = tableEntries[0]; + r.additionalLayout = tableEntries[1]; + r.additionalVariant = tableEntries[2]; + + r.vconsoleKeymap = tableEntries[3]; + + return r; +} + Config::Config( QObject* parent ) : QObject( parent ) , m_keyboardModelsModel( new KeyboardModelsModel( this ) ) @@ -82,8 +180,31 @@ Config::Config( QObject* parent ) } connect( &m_setxkbmapTimer, &QTimer::timeout, this, [=] { - QProcess::execute( "setxkbmap", xkbmap_layout_args( m_selectedLayout, m_selectedVariant ) ); - cDebug() << "xkbmap selection changed to: " << m_selectedLayout << '-' << m_selectedVariant; + bool isNotAsciiCapable = false; + AdditionalLayoutInfo info = getAdditionalLayoutInfo( m_selectedLayout, &isNotAsciiCapable ); + + if(isNotAsciiCapable) + { + m_selectedLayoutsAdditionalLayoutInfo = info; + QString switchOption = xkbmap_query_grp_option(); + + QProcess::execute( "setxkbmap", xkbmap_layout_args( { + {m_selectedLayout, m_selectedVariant}, + {info.additionalLayout, info.additionalVariant} + }, + switchOption.isEmpty()?"grp:alt_shift_toggle":QString() ) + ); + cDebug() << "xkbmap selection changed to: " << m_selectedLayout << '-' << m_selectedVariant + << "(added " << info.additionalLayout << "-" << info.additionalVariant << " since target layout is not ASCII-capable)"; + + + } + else + { + m_selectedLayoutsAdditionalLayoutInfo = AdditionalLayoutInfo(); + QProcess::execute( "setxkbmap", xkbmap_layout_args( m_selectedLayout, m_selectedVariant ) ); + cDebug() << "xkbеmap selection changed to: " << m_selectedLayout << '-' << m_selectedVariant; + } m_setxkbmapTimer.disconnect( this ); } ); m_setxkbmapTimer.start( QApplication::keyboardInputInterval() ); @@ -372,6 +493,13 @@ Config::finalize() { gs->insert( "keyboardLayout", m_selectedLayout ); gs->insert( "keyboardVariant", m_selectedVariant ); //empty means default variant + + if ( !m_selectedLayoutsAdditionalLayoutInfo.name.isEmpty() ) + { + gs->insert( "keyboardAdditionalLayout", m_selectedLayoutsAdditionalLayoutInfo.additionalLayout); + gs->insert( "keyboardAdditionalLayout", m_selectedLayoutsAdditionalLayoutInfo.additionalVariant); + gs->insert( "keyboardVConsoleKeymap", m_selectedLayoutsAdditionalLayoutInfo.vconsoleKeymap ); + } } //FIXME: also store keyboard model for something? diff --git a/src/modules/keyboard/Config.h b/src/modules/keyboard/Config.h index 9a3a3a013..34d719d1b 100644 --- a/src/modules/keyboard/Config.h +++ b/src/modules/keyboard/Config.h @@ -20,6 +20,15 @@ #include #include +struct AdditionalLayoutInfo { + QString name; + + QString additionalLayout; + QString additionalVariant; + + QString vconsoleKeymap; +}; + class Config : public QObject { Q_OBJECT @@ -41,6 +50,8 @@ public: void setConfigurationMap( const QVariantMap& configurationMap ); + static AdditionalLayoutInfo getAdditionalLayoutInfo( const QString& layout, bool* found ); + private: void guessLayout( const QStringList& langParts ); void updateVariants( const QPersistentModelIndex& currentItem, QString currentVariant = QString() ); @@ -52,6 +63,7 @@ private: QString m_selectedLayout; QString m_selectedModel; QString m_selectedVariant; + AdditionalLayoutInfo m_selectedLayoutsAdditionalLayoutInfo; QTimer m_setxkbmapTimer; // From configuration diff --git a/src/modules/keyboard/keyboard.qrc b/src/modules/keyboard/keyboard.qrc index dd211e630..4283d8190 100644 --- a/src/modules/keyboard/keyboard.qrc +++ b/src/modules/keyboard/keyboard.qrc @@ -2,5 +2,6 @@ kbd-model-map images/restore.png + non-ascii-layouts diff --git a/src/modules/keyboard/non-ascii-layouts b/src/modules/keyboard/non-ascii-layouts new file mode 100644 index 000000000..83935c190 --- /dev/null +++ b/src/modules/keyboard/non-ascii-layouts @@ -0,0 +1,4 @@ +# Layouts stored here need additional layout (usually us) to provide ASCII support for user + +#layout additional-layout additional-variant vconsole-keymap +ru us - ruwin_alt_sh-UTF-8 From 09b5e42734c040312ca1021067048a392d7421bd Mon Sep 17 00:00:00 2001 From: Artem Grinev Date: Sun, 25 Oct 2020 14:29:33 +0300 Subject: [PATCH 04/13] [keyboard] Minor additional layout info rework --- src/modules/keyboard/Config.cpp | 34 ++++++++++++++------------------- src/modules/keyboard/Config.h | 4 +--- 2 files changed, 15 insertions(+), 23 deletions(-) diff --git a/src/modules/keyboard/Config.cpp b/src/modules/keyboard/Config.cpp index 4e59b5fda..47aaf6dbe 100644 --- a/src/modules/keyboard/Config.cpp +++ b/src/modules/keyboard/Config.cpp @@ -109,14 +109,13 @@ xkbmap_query_grp_option() return outputLine.mid( index, lastIndex-1 ); } -AdditionalLayoutInfo Config::getAdditionalLayoutInfo( const QString &layout, bool* found ) +AdditionalLayoutInfo Config::getAdditionalLayoutInfo( const QString &layout ) { - QFile layoutTable(":/non-ascii-layouts"); + QFile layoutTable( ":/non-ascii-layouts" ); - if(!layoutTable.open(QIODevice::ReadOnly | QIODevice::Text)) { + if( !layoutTable.open( QIODevice::ReadOnly | QIODevice::Text ) ) { cError() << "Non-ASCII layout table could not be opened"; - *found = false; - return {}; + return AdditionalLayoutInfo(); } QString tableLine; @@ -125,22 +124,19 @@ AdditionalLayoutInfo Config::getAdditionalLayoutInfo( const QString &layout, boo { tableLine = layoutTable.readLine(); } - while( !layoutTable.atEnd() || !tableLine.startsWith(layout) ); + while( !layoutTable.atEnd() || !tableLine.startsWith( layout ) ); - if( !tableLine.startsWith(layout) ){ - *found = false; - return {}; + if( !tableLine.startsWith( layout ) ) + { + return AdditionalLayoutInfo(); } - *found = true; - - QStringList tableEntries = tableLine.split(" ", SplitSkipEmptyParts); + QStringList tableEntries = tableLine.split( " ", SplitSkipEmptyParts ); AdditionalLayoutInfo r; - r.name = tableEntries[0]; r.additionalLayout = tableEntries[1]; - r.additionalVariant = tableEntries[2]; + r.additionalVariant = tableEntries[2] == "-" ? "" : tableEntries[2]; r.vconsoleKeymap = tableEntries[3]; @@ -180,10 +176,9 @@ Config::Config( QObject* parent ) } connect( &m_setxkbmapTimer, &QTimer::timeout, this, [=] { - bool isNotAsciiCapable = false; - AdditionalLayoutInfo info = getAdditionalLayoutInfo( m_selectedLayout, &isNotAsciiCapable ); + AdditionalLayoutInfo info = getAdditionalLayoutInfo( m_selectedLayout); - if(isNotAsciiCapable) + if(!info.additionalLayout.isEmpty()) { m_selectedLayoutsAdditionalLayoutInfo = info; QString switchOption = xkbmap_query_grp_option(); @@ -195,8 +190,7 @@ Config::Config( QObject* parent ) switchOption.isEmpty()?"grp:alt_shift_toggle":QString() ) ); cDebug() << "xkbmap selection changed to: " << m_selectedLayout << '-' << m_selectedVariant - << "(added " << info.additionalLayout << "-" << info.additionalVariant << " since target layout is not ASCII-capable)"; - + << "(added " << info.additionalLayout << "-" << info.additionalVariant << " since current layout is not ASCII-capable)"; } else @@ -494,7 +488,7 @@ Config::finalize() gs->insert( "keyboardLayout", m_selectedLayout ); gs->insert( "keyboardVariant", m_selectedVariant ); //empty means default variant - if ( !m_selectedLayoutsAdditionalLayoutInfo.name.isEmpty() ) + if ( !m_selectedLayoutsAdditionalLayoutInfo.additionalLayout.isEmpty() ) { gs->insert( "keyboardAdditionalLayout", m_selectedLayoutsAdditionalLayoutInfo.additionalLayout); gs->insert( "keyboardAdditionalLayout", m_selectedLayoutsAdditionalLayoutInfo.additionalVariant); diff --git a/src/modules/keyboard/Config.h b/src/modules/keyboard/Config.h index 34d719d1b..96b3d7dd4 100644 --- a/src/modules/keyboard/Config.h +++ b/src/modules/keyboard/Config.h @@ -21,8 +21,6 @@ #include struct AdditionalLayoutInfo { - QString name; - QString additionalLayout; QString additionalVariant; @@ -50,7 +48,7 @@ public: void setConfigurationMap( const QVariantMap& configurationMap ); - static AdditionalLayoutInfo getAdditionalLayoutInfo( const QString& layout, bool* found ); + static AdditionalLayoutInfo getAdditionalLayoutInfo( const QString& layout ); private: void guessLayout( const QStringList& langParts ); From 354dc1613a7eae1ec36ecc6ac157f9fc9d028a9e Mon Sep 17 00:00:00 2001 From: Artem Grinev Date: Mon, 26 Oct 2020 18:22:43 +0300 Subject: [PATCH 05/13] [keyboard] Removed unnecessary repacking in xkbmap_layout_args --- src/modules/keyboard/Config.cpp | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/src/modules/keyboard/Config.cpp b/src/modules/keyboard/Config.cpp index 47aaf6dbe..4d61b0938 100644 --- a/src/modules/keyboard/Config.cpp +++ b/src/modules/keyboard/Config.cpp @@ -50,15 +50,12 @@ xkbmap_layout_args( const QString& layout, const QString& variant ) } static inline QStringList -xkbmap_layout_args( const QList> layoutsAndVariantsList, const QString& switchOption = "grp:alt_shift_toggle") +xkbmap_layout_args( const QStringList& layouts, const QStringList& variants, const QString& switchOption = "grp:alt_shift_toggle") { - QStringList layouts; - QStringList variants; - - for( auto& [layout,variant] : layoutsAndVariantsList ) + if ( layouts.size() != variants.size() ) { - layouts.append(layout); - variants.append(variant); + cError() << "Number of layouts and variants must be equal (empty string should be used if there is no corresponding variant)"; + return QStringList(); } QStringList r{ "-layout", layouts.join( "," ) }; @@ -183,11 +180,10 @@ Config::Config( QObject* parent ) m_selectedLayoutsAdditionalLayoutInfo = info; QString switchOption = xkbmap_query_grp_option(); - QProcess::execute( "setxkbmap", xkbmap_layout_args( { - {m_selectedLayout, m_selectedVariant}, - {info.additionalLayout, info.additionalVariant} - }, - switchOption.isEmpty()?"grp:alt_shift_toggle":QString() ) + QProcess::execute( "setxkbmap", xkbmap_layout_args( + { m_selectedLayout, info.additionalLayout }, + { m_selectedVariant, info.additionalVariant }, + switchOption.isEmpty()?"grp:alt_shift_toggle":QString() ) ); cDebug() << "xkbmap selection changed to: " << m_selectedLayout << '-' << m_selectedVariant << "(added " << info.additionalLayout << "-" << info.additionalVariant << " since current layout is not ASCII-capable)"; From 384b1ba8c69c9f032f459815761f70d8ecd9fada Mon Sep 17 00:00:00 2001 From: Artem Grinev Date: Mon, 26 Oct 2020 18:26:14 +0300 Subject: [PATCH 06/13] [keyboard] Swapped primary and additional layouts in selection --- src/modules/keyboard/Config.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modules/keyboard/Config.cpp b/src/modules/keyboard/Config.cpp index 4d61b0938..173f34051 100644 --- a/src/modules/keyboard/Config.cpp +++ b/src/modules/keyboard/Config.cpp @@ -181,8 +181,8 @@ Config::Config( QObject* parent ) QString switchOption = xkbmap_query_grp_option(); QProcess::execute( "setxkbmap", xkbmap_layout_args( - { m_selectedLayout, info.additionalLayout }, - { m_selectedVariant, info.additionalVariant }, + { info.additionalLayout, m_selectedLayout }, + { info.additionalVariant, m_selectedVariant }, switchOption.isEmpty()?"grp:alt_shift_toggle":QString() ) ); cDebug() << "xkbmap selection changed to: " << m_selectedLayout << '-' << m_selectedVariant From 19b1fb3358f6ca4e8f969757b140c7dc266f32f5 Mon Sep 17 00:00:00 2001 From: Artem Grinev Date: Mon, 26 Oct 2020 18:30:24 +0300 Subject: [PATCH 07/13] [keyboard] Added explanatory comment for xkbmap_query_grp_option --- src/modules/keyboard/Config.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/modules/keyboard/Config.cpp b/src/modules/keyboard/Config.cpp index 173f34051..e766c8a53 100644 --- a/src/modules/keyboard/Config.cpp +++ b/src/modules/keyboard/Config.cpp @@ -73,6 +73,9 @@ xkbmap_layout_args( const QStringList& layouts, const QStringList& variants, con return r; } +/* Returns group-switch setxkbd option if set + * or an empty string otherwise + */ static inline QString xkbmap_query_grp_option() { From 0dd027af90caf23bbafcac5207247047079e4c32 Mon Sep 17 00:00:00 2001 From: Artem Grinev Date: Tue, 27 Oct 2020 04:53:05 +0300 Subject: [PATCH 08/13] [keyboard] Fixed condition bug --- src/modules/keyboard/Config.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modules/keyboard/Config.cpp b/src/modules/keyboard/Config.cpp index e766c8a53..aab7db014 100644 --- a/src/modules/keyboard/Config.cpp +++ b/src/modules/keyboard/Config.cpp @@ -89,7 +89,7 @@ xkbmap_query_grp_option() { outputLine = setxkbmapQuery.readLine(); } - while( !setxkbmapQuery.atEnd() || !outputLine.startsWith("options:") ); + while( setxkbmapQuery.canReadLine() && !outputLine.startsWith("options:") ); if( !outputLine.startsWith("options:") ) { @@ -124,7 +124,7 @@ AdditionalLayoutInfo Config::getAdditionalLayoutInfo( const QString &layout ) { tableLine = layoutTable.readLine(); } - while( !layoutTable.atEnd() || !tableLine.startsWith( layout ) ); + while( layoutTable.canReadLine() && !tableLine.startsWith( layout ) ); if( !tableLine.startsWith( layout ) ) { From bfc60ad2cfc2f16ca87fd3c024a2d96defa0c023 Mon Sep 17 00:00:00 2001 From: Artem Grinev Date: Tue, 27 Oct 2020 04:56:19 +0300 Subject: [PATCH 09/13] [keyboard] Implemented X11 config writing for additional layout --- src/modules/keyboard/AdditionalLayoutInfo.h | 24 +++++++++++++ src/modules/keyboard/Config.cpp | 25 ++++++++----- src/modules/keyboard/Config.h | 8 +---- src/modules/keyboard/KeyboardPage.cpp | 1 + src/modules/keyboard/SetKeyboardLayoutJob.cpp | 36 +++++++++++++------ src/modules/keyboard/SetKeyboardLayoutJob.h | 4 +++ src/modules/keyboardq/keyboardq.qrc | 1 + 7 files changed, 72 insertions(+), 27 deletions(-) create mode 100644 src/modules/keyboard/AdditionalLayoutInfo.h diff --git a/src/modules/keyboard/AdditionalLayoutInfo.h b/src/modules/keyboard/AdditionalLayoutInfo.h new file mode 100644 index 000000000..660449952 --- /dev/null +++ b/src/modules/keyboard/AdditionalLayoutInfo.h @@ -0,0 +1,24 @@ +/* === This file is part of Calamares - === + * + * SPDX-FileCopyrightText: 2020 Artem Grinev + * SPDX-License-Identifier: GPL-3.0-or-later + * + * Calamares is Free Software: see the License-Identifier above. + * + */ + +#ifndef KEYBOARD_ADDITIONAL_LAYOUT_INFO_H +#define KEYBOARD_ADDITIONAL_LAYOUT_INFO_H + +#include + +struct AdditionalLayoutInfo { + QString additionalLayout; + QString additionalVariant; + + QString groupSwitcher; + + QString vconsoleKeymap; +}; + +#endif diff --git a/src/modules/keyboard/Config.cpp b/src/modules/keyboard/Config.cpp index aab7db014..03a774ef6 100644 --- a/src/modules/keyboard/Config.cpp +++ b/src/modules/keyboard/Config.cpp @@ -176,27 +176,33 @@ Config::Config( QObject* parent ) } connect( &m_setxkbmapTimer, &QTimer::timeout, this, [=] { - AdditionalLayoutInfo info = getAdditionalLayoutInfo( m_selectedLayout); + m_selectedLayoutsAdditionalLayoutInfo = getAdditionalLayoutInfo( m_selectedLayout ); - if(!info.additionalLayout.isEmpty()) + if(!m_selectedLayoutsAdditionalLayoutInfo.additionalLayout.isEmpty()) { - m_selectedLayoutsAdditionalLayoutInfo = info; - QString switchOption = xkbmap_query_grp_option(); + m_selectedLayoutsAdditionalLayoutInfo.groupSwitcher = xkbmap_query_grp_option(); QProcess::execute( "setxkbmap", xkbmap_layout_args( - { info.additionalLayout, m_selectedLayout }, - { info.additionalVariant, m_selectedVariant }, - switchOption.isEmpty()?"grp:alt_shift_toggle":QString() ) + { m_selectedLayoutsAdditionalLayoutInfo.additionalLayout, m_selectedLayout }, + { m_selectedLayoutsAdditionalLayoutInfo.additionalVariant, m_selectedVariant }, + m_selectedLayoutsAdditionalLayoutInfo.groupSwitcher.isEmpty()?"grp:alt_shift_toggle":QString() ) ); + + if( m_selectedLayoutsAdditionalLayoutInfo.groupSwitcher.isEmpty() ) + { + m_selectedLayoutsAdditionalLayoutInfo.groupSwitcher = "grp:alt_shift_toggle"; + } + cDebug() << "xkbmap selection changed to: " << m_selectedLayout << '-' << m_selectedVariant - << "(added " << info.additionalLayout << "-" << info.additionalVariant << " since current layout is not ASCII-capable)"; + << "(added " << m_selectedLayoutsAdditionalLayoutInfo.additionalLayout << "-" + << m_selectedLayoutsAdditionalLayoutInfo.additionalVariant << " since current layout is not ASCII-capable)"; } else { m_selectedLayoutsAdditionalLayoutInfo = AdditionalLayoutInfo(); QProcess::execute( "setxkbmap", xkbmap_layout_args( m_selectedLayout, m_selectedVariant ) ); - cDebug() << "xkbеmap selection changed to: " << m_selectedLayout << '-' << m_selectedVariant; + cDebug() << "xkbmap selection changed to: " << m_selectedLayout << '-' << m_selectedVariant; } m_setxkbmapTimer.disconnect( this ); } ); @@ -336,6 +342,7 @@ Config::createJobs() Calamares::Job* j = new SetKeyboardLayoutJob( m_selectedModel, m_selectedLayout, m_selectedVariant, + m_selectedLayoutsAdditionalLayoutInfo, m_xOrgConfFileName, m_convertedKeymapPath, m_writeEtcDefaultKeyboard ); diff --git a/src/modules/keyboard/Config.h b/src/modules/keyboard/Config.h index 96b3d7dd4..dda4403b3 100644 --- a/src/modules/keyboard/Config.h +++ b/src/modules/keyboard/Config.h @@ -13,6 +13,7 @@ #include "Job.h" #include "KeyboardLayoutModel.h" +#include "AdditionalLayoutInfo.h" #include #include @@ -20,13 +21,6 @@ #include #include -struct AdditionalLayoutInfo { - QString additionalLayout; - QString additionalVariant; - - QString vconsoleKeymap; -}; - class Config : public QObject { Q_OBJECT diff --git a/src/modules/keyboard/KeyboardPage.cpp b/src/modules/keyboard/KeyboardPage.cpp index 07c5cf763..84958761b 100644 --- a/src/modules/keyboard/KeyboardPage.cpp +++ b/src/modules/keyboard/KeyboardPage.cpp @@ -222,6 +222,7 @@ KeyboardPage::createJobs( const QString& xOrgConfFileName, Calamares::Job* j = new SetKeyboardLayoutJob( selectedModel, m_selectedLayout, m_selectedVariant, + AdditionalLayoutInfo(), xOrgConfFileName, convertedKeymapPath, writeEtcDefaultKeyboard ); diff --git a/src/modules/keyboard/SetKeyboardLayoutJob.cpp b/src/modules/keyboard/SetKeyboardLayoutJob.cpp index cabe0b5c0..ddadc8430 100644 --- a/src/modules/keyboard/SetKeyboardLayoutJob.cpp +++ b/src/modules/keyboard/SetKeyboardLayoutJob.cpp @@ -30,9 +30,9 @@ #include -SetKeyboardLayoutJob::SetKeyboardLayoutJob( const QString& model, +SetKeyboardLayoutJob::SetKeyboardLayoutJob(const QString& model, const QString& layout, - const QString& variant, + const QString& variant, const AdditionalLayoutInfo &additionaLayoutInfo, const QString& xOrgConfFileName, const QString& convertedKeymapPath, bool writeEtcDefaultKeyboard ) @@ -40,6 +40,7 @@ SetKeyboardLayoutJob::SetKeyboardLayoutJob( const QString& model, , m_model( model ) , m_layout( layout ) , m_variant( variant ) + , m_additionalLayoutInfo( additionaLayoutInfo ) , m_xOrgConfFileName( xOrgConfFileName ) , m_convertedKeymapPath( convertedKeymapPath ) , m_writeEtcDefaultKeyboard( writeEtcDefaultKeyboard ) @@ -250,19 +251,32 @@ SetKeyboardLayoutJob::writeX11Data( const QString& keyboardConfPath ) const " Identifier \"system-keyboard\"\n" " MatchIsKeyboard \"on\"\n"; - if ( !m_layout.isEmpty() ) - { - stream << " Option \"XkbLayout\" \"" << m_layout << "\"\n"; - } - if ( !m_model.isEmpty() ) + if ( m_additionalLayoutInfo.additionalLayout.isEmpty() ) { - stream << " Option \"XkbModel\" \"" << m_model << "\"\n"; - } + if ( !m_layout.isEmpty() ) + { + stream << " Option \"XkbLayout\" \"" << m_layout << "\"\n"; + } - if ( !m_variant.isEmpty() ) + if ( !m_variant.isEmpty() ) + { + stream << " Option \"XkbVariant\" \"" << m_variant << "\"\n"; + } + } + else { - stream << " Option \"XkbVariant\" \"" << m_variant << "\"\n"; + if ( !m_layout.isEmpty() ) + { + stream << " Option \"XkbLayout\" \"" << m_additionalLayoutInfo.additionalLayout << "," << m_layout << "\"\n"; + } + + if ( !m_variant.isEmpty() ) + { + stream << " Option \"XkbVariant\" \"" << m_additionalLayoutInfo.additionalVariant << "," << m_variant << "\"\n"; + } + + stream << " Option \"XkbOptions\" \"" << m_additionalLayoutInfo.groupSwitcher << "\"\n"; } stream << "EndSection\n"; diff --git a/src/modules/keyboard/SetKeyboardLayoutJob.h b/src/modules/keyboard/SetKeyboardLayoutJob.h index f1eabe195..b1ce0bb15 100644 --- a/src/modules/keyboard/SetKeyboardLayoutJob.h +++ b/src/modules/keyboard/SetKeyboardLayoutJob.h @@ -12,6 +12,8 @@ #define SETKEYBOARDLAYOUTJOB_H #include "Job.h" +#include "AdditionalLayoutInfo.h" + class SetKeyboardLayoutJob : public Calamares::Job @@ -21,6 +23,7 @@ public: SetKeyboardLayoutJob( const QString& model, const QString& layout, const QString& variant, + const AdditionalLayoutInfo& additionaLayoutInfo, const QString& xOrgConfFileName, const QString& convertedKeymapPath, bool writeEtcDefaultKeyboard ); @@ -38,6 +41,7 @@ private: QString m_model; QString m_layout; QString m_variant; + AdditionalLayoutInfo m_additionalLayoutInfo; QString m_xOrgConfFileName; QString m_convertedKeymapPath; const bool m_writeEtcDefaultKeyboard; diff --git a/src/modules/keyboardq/keyboardq.qrc b/src/modules/keyboardq/keyboardq.qrc index 492f6e213..d2473a8ec 100644 --- a/src/modules/keyboardq/keyboardq.qrc +++ b/src/modules/keyboardq/keyboardq.qrc @@ -3,5 +3,6 @@ ../keyboard/kbd-model-map ../keyboard/images/restore.png keyboardq.qml + ../keyboard/non-ascii-layouts From 996c82160eb276697de24e54c018e3a7803f632b Mon Sep 17 00:00:00 2001 From: Artem Grinev Date: Tue, 27 Oct 2020 20:38:04 +0300 Subject: [PATCH 10/13] [keyboard] fixed typo --- src/modules/keyboard/SetKeyboardLayoutJob.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/modules/keyboard/SetKeyboardLayoutJob.cpp b/src/modules/keyboard/SetKeyboardLayoutJob.cpp index ddadc8430..e733c18ed 100644 --- a/src/modules/keyboard/SetKeyboardLayoutJob.cpp +++ b/src/modules/keyboard/SetKeyboardLayoutJob.cpp @@ -32,7 +32,8 @@ SetKeyboardLayoutJob::SetKeyboardLayoutJob(const QString& model, const QString& layout, - const QString& variant, const AdditionalLayoutInfo &additionaLayoutInfo, + const QString& variant, + const AdditionalLayoutInfo &additionalLayoutInfo, const QString& xOrgConfFileName, const QString& convertedKeymapPath, bool writeEtcDefaultKeyboard ) @@ -40,7 +41,7 @@ SetKeyboardLayoutJob::SetKeyboardLayoutJob(const QString& model, , m_model( model ) , m_layout( layout ) , m_variant( variant ) - , m_additionalLayoutInfo( additionaLayoutInfo ) + , m_additionalLayoutInfo( additionalLayoutInfo ) , m_xOrgConfFileName( xOrgConfFileName ) , m_convertedKeymapPath( convertedKeymapPath ) , m_writeEtcDefaultKeyboard( writeEtcDefaultKeyboard ) From 6667ea834feba460b2adceabc435dc09e55644d3 Mon Sep 17 00:00:00 2001 From: Artem Grinev Date: Tue, 27 Oct 2020 20:42:49 +0300 Subject: [PATCH 11/13] [keyboard] Adjusted indents --- src/modules/keyboard/Config.cpp | 10 +++++----- src/modules/keyboard/SetKeyboardLayoutJob.cpp | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/modules/keyboard/Config.cpp b/src/modules/keyboard/Config.cpp index 03a774ef6..1e46e7f6d 100644 --- a/src/modules/keyboard/Config.cpp +++ b/src/modules/keyboard/Config.cpp @@ -91,12 +91,12 @@ xkbmap_query_grp_option() } while( setxkbmapQuery.canReadLine() && !outputLine.startsWith("options:") ); - if( !outputLine.startsWith("options:") ) + if( !outputLine.startsWith( "options:" ) ) { return QString(); } - int index = outputLine.indexOf("grp:"); + int index = outputLine.indexOf( "grp:" ); if( index == -1 ) { @@ -104,7 +104,7 @@ xkbmap_query_grp_option() } //it's either in the end of line or before the other option so \s or , - int lastIndex = outputLine.indexOf( QRegExp("[\\s,]"), index ); + int lastIndex = outputLine.indexOf( QRegExp( "[\\s,]" ), index ); return outputLine.mid( index, lastIndex-1 ); } @@ -178,14 +178,14 @@ Config::Config( QObject* parent ) connect( &m_setxkbmapTimer, &QTimer::timeout, this, [=] { m_selectedLayoutsAdditionalLayoutInfo = getAdditionalLayoutInfo( m_selectedLayout ); - if(!m_selectedLayoutsAdditionalLayoutInfo.additionalLayout.isEmpty()) + if( !m_selectedLayoutsAdditionalLayoutInfo.additionalLayout.isEmpty() ) { m_selectedLayoutsAdditionalLayoutInfo.groupSwitcher = xkbmap_query_grp_option(); QProcess::execute( "setxkbmap", xkbmap_layout_args( { m_selectedLayoutsAdditionalLayoutInfo.additionalLayout, m_selectedLayout }, { m_selectedLayoutsAdditionalLayoutInfo.additionalVariant, m_selectedVariant }, - m_selectedLayoutsAdditionalLayoutInfo.groupSwitcher.isEmpty()?"grp:alt_shift_toggle":QString() ) + m_selectedLayoutsAdditionalLayoutInfo.groupSwitcher.isEmpty() ? "grp:alt_shift_toggle" : QString() ) ); if( m_selectedLayoutsAdditionalLayoutInfo.groupSwitcher.isEmpty() ) diff --git a/src/modules/keyboard/SetKeyboardLayoutJob.cpp b/src/modules/keyboard/SetKeyboardLayoutJob.cpp index e733c18ed..766044179 100644 --- a/src/modules/keyboard/SetKeyboardLayoutJob.cpp +++ b/src/modules/keyboard/SetKeyboardLayoutJob.cpp @@ -33,7 +33,7 @@ SetKeyboardLayoutJob::SetKeyboardLayoutJob(const QString& model, const QString& layout, const QString& variant, - const AdditionalLayoutInfo &additionalLayoutInfo, + const AdditionalLayoutInfo& additionalLayoutInfo, const QString& xOrgConfFileName, const QString& convertedKeymapPath, bool writeEtcDefaultKeyboard ) From 3552233bf12a63225ee5793520bdfb03090845ff Mon Sep 17 00:00:00 2001 From: Artem Grinev Date: Tue, 27 Oct 2020 20:48:18 +0300 Subject: [PATCH 12/13] [keyboard] Minor logic rework --- src/modules/keyboard/Config.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/modules/keyboard/Config.cpp b/src/modules/keyboard/Config.cpp index 1e46e7f6d..4725dc91d 100644 --- a/src/modules/keyboard/Config.cpp +++ b/src/modules/keyboard/Config.cpp @@ -178,21 +178,23 @@ Config::Config( QObject* parent ) connect( &m_setxkbmapTimer, &QTimer::timeout, this, [=] { m_selectedLayoutsAdditionalLayoutInfo = getAdditionalLayoutInfo( m_selectedLayout ); - if( !m_selectedLayoutsAdditionalLayoutInfo.additionalLayout.isEmpty() ) + if ( !m_selectedLayoutsAdditionalLayoutInfo.additionalLayout.isEmpty() ) { m_selectedLayoutsAdditionalLayoutInfo.groupSwitcher = xkbmap_query_grp_option(); - QProcess::execute( "setxkbmap", xkbmap_layout_args( - { m_selectedLayoutsAdditionalLayoutInfo.additionalLayout, m_selectedLayout }, - { m_selectedLayoutsAdditionalLayoutInfo.additionalVariant, m_selectedVariant }, - m_selectedLayoutsAdditionalLayoutInfo.groupSwitcher.isEmpty() ? "grp:alt_shift_toggle" : QString() ) - ); - if( m_selectedLayoutsAdditionalLayoutInfo.groupSwitcher.isEmpty() ) { m_selectedLayoutsAdditionalLayoutInfo.groupSwitcher = "grp:alt_shift_toggle"; } + QProcess::execute( "setxkbmap", xkbmap_layout_args( + { m_selectedLayoutsAdditionalLayoutInfo.additionalLayout, m_selectedLayout }, + { m_selectedLayoutsAdditionalLayoutInfo.additionalVariant, m_selectedVariant }, + m_selectedLayoutsAdditionalLayoutInfo.groupSwitcher ) + ); + + + cDebug() << "xkbmap selection changed to: " << m_selectedLayout << '-' << m_selectedVariant << "(added " << m_selectedLayoutsAdditionalLayoutInfo.additionalLayout << "-" << m_selectedLayoutsAdditionalLayoutInfo.additionalVariant << " since current layout is not ASCII-capable)"; @@ -200,7 +202,6 @@ Config::Config( QObject* parent ) } else { - m_selectedLayoutsAdditionalLayoutInfo = AdditionalLayoutInfo(); QProcess::execute( "setxkbmap", xkbmap_layout_args( m_selectedLayout, m_selectedVariant ) ); cDebug() << "xkbmap selection changed to: " << m_selectedLayout << '-' << m_selectedVariant; } From 4434e85d4d8871d7e1d0cea703e894b7539a94cb Mon Sep 17 00:00:00 2001 From: Artem Grinev Date: Tue, 27 Oct 2020 20:53:20 +0300 Subject: [PATCH 13/13] [keyboard] Simplified variable name --- src/modules/keyboard/Config.cpp | 30 +++++++++++++++--------------- src/modules/keyboard/Config.h | 5 ++++- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/src/modules/keyboard/Config.cpp b/src/modules/keyboard/Config.cpp index 4725dc91d..b3365cff6 100644 --- a/src/modules/keyboard/Config.cpp +++ b/src/modules/keyboard/Config.cpp @@ -176,28 +176,28 @@ Config::Config( QObject* parent ) } connect( &m_setxkbmapTimer, &QTimer::timeout, this, [=] { - m_selectedLayoutsAdditionalLayoutInfo = getAdditionalLayoutInfo( m_selectedLayout ); + m_additionalLayoutInfo = getAdditionalLayoutInfo( m_selectedLayout ); - if ( !m_selectedLayoutsAdditionalLayoutInfo.additionalLayout.isEmpty() ) + if ( !m_additionalLayoutInfo.additionalLayout.isEmpty() ) { - m_selectedLayoutsAdditionalLayoutInfo.groupSwitcher = xkbmap_query_grp_option(); + m_additionalLayoutInfo.groupSwitcher = xkbmap_query_grp_option(); - if( m_selectedLayoutsAdditionalLayoutInfo.groupSwitcher.isEmpty() ) + if( m_additionalLayoutInfo.groupSwitcher.isEmpty() ) { - m_selectedLayoutsAdditionalLayoutInfo.groupSwitcher = "grp:alt_shift_toggle"; + m_additionalLayoutInfo.groupSwitcher = "grp:alt_shift_toggle"; } QProcess::execute( "setxkbmap", xkbmap_layout_args( - { m_selectedLayoutsAdditionalLayoutInfo.additionalLayout, m_selectedLayout }, - { m_selectedLayoutsAdditionalLayoutInfo.additionalVariant, m_selectedVariant }, - m_selectedLayoutsAdditionalLayoutInfo.groupSwitcher ) + { m_additionalLayoutInfo.additionalLayout, m_selectedLayout }, + { m_additionalLayoutInfo.additionalVariant, m_selectedVariant }, + m_additionalLayoutInfo.groupSwitcher ) ); cDebug() << "xkbmap selection changed to: " << m_selectedLayout << '-' << m_selectedVariant - << "(added " << m_selectedLayoutsAdditionalLayoutInfo.additionalLayout << "-" - << m_selectedLayoutsAdditionalLayoutInfo.additionalVariant << " since current layout is not ASCII-capable)"; + << "(added " << m_additionalLayoutInfo.additionalLayout << "-" + << m_additionalLayoutInfo.additionalVariant << " since current layout is not ASCII-capable)"; } else @@ -343,7 +343,7 @@ Config::createJobs() Calamares::Job* j = new SetKeyboardLayoutJob( m_selectedModel, m_selectedLayout, m_selectedVariant, - m_selectedLayoutsAdditionalLayoutInfo, + m_additionalLayoutInfo, m_xOrgConfFileName, m_convertedKeymapPath, m_writeEtcDefaultKeyboard ); @@ -495,11 +495,11 @@ Config::finalize() gs->insert( "keyboardLayout", m_selectedLayout ); gs->insert( "keyboardVariant", m_selectedVariant ); //empty means default variant - if ( !m_selectedLayoutsAdditionalLayoutInfo.additionalLayout.isEmpty() ) + if ( !m_additionalLayoutInfo.additionalLayout.isEmpty() ) { - gs->insert( "keyboardAdditionalLayout", m_selectedLayoutsAdditionalLayoutInfo.additionalLayout); - gs->insert( "keyboardAdditionalLayout", m_selectedLayoutsAdditionalLayoutInfo.additionalVariant); - gs->insert( "keyboardVConsoleKeymap", m_selectedLayoutsAdditionalLayoutInfo.vconsoleKeymap ); + gs->insert( "keyboardAdditionalLayout", m_additionalLayoutInfo.additionalLayout); + gs->insert( "keyboardAdditionalLayout", m_additionalLayoutInfo.additionalVariant); + gs->insert( "keyboardVConsoleKeymap", m_additionalLayoutInfo.vconsoleKeymap ); } } diff --git a/src/modules/keyboard/Config.h b/src/modules/keyboard/Config.h index dda4403b3..031cf8922 100644 --- a/src/modules/keyboard/Config.h +++ b/src/modules/keyboard/Config.h @@ -55,7 +55,10 @@ private: QString m_selectedLayout; QString m_selectedModel; QString m_selectedVariant; - AdditionalLayoutInfo m_selectedLayoutsAdditionalLayoutInfo; + + // Layout (and corresponding info) added if current one doesn't support ASCII (e.g. Russian or Japanese) + AdditionalLayoutInfo m_additionalLayoutInfo; + QTimer m_setxkbmapTimer; // From configuration