diff --git a/src/modules/keyboard/KeyboardPage.cpp b/src/modules/keyboard/KeyboardPage.cpp index 770c7c6b1..8bcde4b50 100644 --- a/src/modules/keyboard/KeyboardPage.cpp +++ b/src/modules/keyboard/KeyboardPage.cpp @@ -37,6 +37,21 @@ #include #include +static QPersistentModelIndex +findLayout( const KeyboardLayoutModel* klm, const QString& currentLayout ) +{ + QPersistentModelIndex currentLayoutItem; + + for ( int i = 0; i < klm->rowCount(); ++i ) + { + QModelIndex idx = klm->index( i ); + if ( idx.isValid() && + idx.data( KeyboardLayoutModel::KeyboardLayoutKeyRole ).toString() == currentLayout ) + currentLayoutItem = idx; + } + + return currentLayoutItem; +} KeyboardPage::KeyboardPage( QWidget* parent ) : QWidget() @@ -68,8 +83,8 @@ KeyboardPage::KeyboardPage( QWidget* parent ) QString model = m_models.value( text, "pc105" ); // Set Xorg keyboard model - QProcess::execute( QString( "setxkbmap -model \"%1\"" ) - .arg( model ).toUtf8() ); + QProcess::execute( QLatin1Literal( "setxkbmap" ), + QStringList() << "-model" << model ); }); CALAMARES_RETRANSLATE( ui->retranslateUi( this ); ) @@ -160,14 +175,13 @@ KeyboardPage::init() // Block signals ui->listLayout->blockSignals( true ); - QPersistentModelIndex currentLayoutItem; - - for ( int i = 0; i < klm->rowCount(); ++i ) + QPersistentModelIndex currentLayoutItem = findLayout( klm, currentLayout ); + if ( !currentLayoutItem.isValid() && ( + ( currentLayout == "latin" ) + || ( currentLayout == "pc" ) ) ) { - QModelIndex idx = klm->index( i ); - if ( idx.isValid() && - idx.data( KeyboardLayoutModel::KeyboardLayoutKeyRole ).toString() == currentLayout ) - currentLayoutItem = idx; + currentLayout = "us"; + currentLayoutItem = findLayout( klm, currentLayout ); } // Set current layout and variant @@ -341,6 +355,16 @@ KeyboardPage::onListLayoutCurrentItemChanged( const QModelIndex& current, updateVariants( QPersistentModelIndex( current ) ); } +/* Returns stringlist with suitable setxkbmap command-line arguments + * to set the given @p layout and @p variant. + */ +static inline QStringList xkbmap_args( QStringList&& r, const QString& layout, const QString& variant) +{ + r << "-layout" << layout; + if ( !variant.isEmpty() ) + r << "-variant" << variant; + return r; +} void KeyboardPage::onListVariantCurrentItemChanged( QListWidgetItem* current, QListWidgetItem* previous ) @@ -369,8 +393,8 @@ KeyboardPage::onListVariantCurrentItemChanged( QListWidgetItem* current, QListWi connect( &m_setxkbmapTimer, &QTimer::timeout, this, [=] { - QProcess::execute( QString( "setxkbmap -layout \"%1\" -variant \"%2\"" ) - .arg( layout, variant ).toUtf8() ); + QProcess::execute( QLatin1Literal( "setxkbmap" ), + xkbmap_args( QStringList(), layout, variant ) ); cDebug() << "xkbmap selection changed to: " << layout << "-" << variant; m_setxkbmapTimer.disconnect( this ); } ); @@ -379,4 +403,3 @@ KeyboardPage::onListVariantCurrentItemChanged( QListWidgetItem* current, QListWi m_selectedLayout = layout; m_selectedVariant = variant; } -