Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 11 additions & 8 deletions src/modules/keyboard/Config.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -259,8 +259,8 @@ applyXkb( const BasicLayoutInfo& settings, AdditionalLayoutInfo& extra )
{
prepareGroupSwitcher( settings, extra );
basicArguments.append(
xkbmap_layout_args_with_group_switch( { extra.additionalLayout, settings.selectedLayout },
{ extra.additionalVariant, settings.selectedVariant },
xkbmap_layout_args_with_group_switch( { settings.selectedLayout, extra.additionalLayout },
{ settings.selectedVariant, extra.additionalVariant },
extra.groupSwitcher ) );
QProcess::execute( "setxkbmap", basicArguments );

Expand All @@ -286,8 +286,8 @@ applyLocale1( const BasicLayoutInfo& settings, AdditionalLayoutInfo& extra )
if ( !extra.additionalLayout.isEmpty() )
{
prepareGroupSwitcher( settings, extra );
layout = extra.additionalLayout + "," + layout;
variant = extra.additionalVariant + "," + variant;
layout = layout + "," + extra.additionalLayout;
variant = variant + "," + extra.additionalVariant;
option = extra.groupSwitcher;
}

Expand Down Expand Up @@ -412,11 +412,11 @@ applyKWin( const BasicLayoutInfo& settings, AdditionalLayoutInfo& extra )
const auto paths = QStandardPaths::standardLocations( QStandardPaths::ConfigLocation );
prepareGroupSwitcher( settings, extra );

auto join = [ &additional = extra.additionalLayout ]( const QString& additionalValue, const QString& selectedValue )
{ return additional.isEmpty() ? selectedValue : QStringLiteral( "%1,%2" ).arg( additionalValue, selectedValue ); };
auto join = [ &additional = extra.additionalLayout ]( const QString& selectedValue, const QString& additionalValue )
{ return additional.isEmpty() ? selectedValue : QStringLiteral( "%1,%2" ).arg( selectedValue, additionalValue ); };

const QString layouts = join( extra.additionalLayout, settings.selectedLayout );
const QString variants = join( extra.additionalVariant, settings.selectedVariant );
const QString layouts = join( settings.selectedLayout, extra.additionalLayout );
const QString variants = join( settings.selectedVariant, extra.additionalVariant );
const QString options = extra.groupSwitcher;

bool updated = false;
Expand Down Expand Up @@ -745,6 +745,8 @@ Calamares::JobList
Config::createJobs()
{
QList< Calamares::job_ptr > list;
m_additionalLayoutInfo = getAdditionalLayoutInfo( m_current.selectedLayout );
prepareGroupSwitcher( m_current, m_additionalLayoutInfo );

Calamares::Job* j = new SetKeyboardLayoutJob( m_current.selectedModel,
m_current.selectedLayout,
Expand All @@ -753,6 +755,7 @@ Config::createJobs()
m_xOrgConfFileName,
m_convertedKeymapPath,
m_configureEtcDefaultKeyboard,
m_configureKWin,
m_configureLocale1 );
list.append( Calamares::job_ptr( j ) );

Expand Down
52 changes: 49 additions & 3 deletions src/modules/keyboard/SetKeyboardLayoutJob.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ variantList( const AdditionalLayoutInfo& additionalLayoutInfo, const QString& va
return removeEmpty( { variant } );
}

QStringList variants { additionalLayoutInfo.additionalVariant, variant };
QStringList variants { variant, additionalLayoutInfo.additionalVariant };
if ( variants.join( QString() ).isEmpty() )
{
variants.clear();
Expand All @@ -63,6 +63,7 @@ SetKeyboardLayoutJob::SetKeyboardLayoutJob( const QString& model,
const QString& xOrgConfFileName,
const QString& convertedKeymapPath,
bool writeEtcDefaultKeyboard,
bool writeKdeKeyboardConfig,
bool skipIfNoRoot )
: Calamares::Job()
, m_model( model )
Expand All @@ -72,6 +73,7 @@ SetKeyboardLayoutJob::SetKeyboardLayoutJob( const QString& model,
, m_xOrgConfFileName( xOrgConfFileName )
, m_convertedKeymapPath( convertedKeymapPath )
, m_writeEtcDefaultKeyboard( writeEtcDefaultKeyboard )
, m_writeKdeKeyboardConfig( writeKdeKeyboardConfig )
, m_skipIfNoRoot( skipIfNoRoot )
{
}
Expand Down Expand Up @@ -296,7 +298,7 @@ SetKeyboardLayoutJob::writeX11Data( const QString& keyboardConfPath ) const
" MatchIsKeyboard \"on\"\n";


const QStringList layouts = removeEmpty( { m_additionalLayoutInfo.additionalLayout, m_layout } );
const QStringList layouts = removeEmpty( { m_layout, m_additionalLayoutInfo.additionalLayout } );
const QStringList variants = variantList( m_additionalLayoutInfo, m_variant );
stream << " Option \"XkbLayout\" \"" << layouts.join( "," ) << "\"\n";
stream << " Option \"XkbVariant\" \"" << variants.join( "," ) << "\"\n";
Expand Down Expand Up @@ -330,7 +332,7 @@ SetKeyboardLayoutJob::writeDefaultKeyboardData( const QString& defaultKeyboardPa
}
QTextStream stream( &file );

const QStringList layouts = removeEmpty( { m_additionalLayoutInfo.additionalLayout, m_layout } );
const QStringList layouts = removeEmpty( { m_layout, m_additionalLayoutInfo.additionalLayout } );
const QStringList variants = variantList( m_additionalLayoutInfo, m_variant );
stream << "# KEYBOARD CONFIGURATION FILE\n\n"
"# Consult the keyboard(5) manual page.\n\n";
Expand All @@ -354,6 +356,35 @@ SetKeyboardLayoutJob::writeDefaultKeyboardData( const QString& defaultKeyboardPa
return ( stream.status() == QTextStream::Ok );
}

static bool
writeKdeKeyboardData( const QString& kxkbPath,
const QString& model,
const QString& layout,
const QString& variant,
const AdditionalLayoutInfo& additionalLayoutInfo )
{
QDir().mkpath( QFileInfo( kxkbPath ).absolutePath() );

QSettings config( kxkbPath, QSettings::IniFormat );
const QStringList layouts = removeEmpty( { layout, additionalLayoutInfo.additionalLayout } );
const QStringList variants = variantList( additionalLayoutInfo, variant );

config.beginGroup( QStringLiteral( "Layout" ) );
config.setValue( QStringLiteral( "Use" ), true );
config.setValue( QStringLiteral( "Model" ), model );
config.setValue( QStringLiteral( "LayoutList" ), layouts.join( "," ) );
config.setValue( QStringLiteral( "VariantList" ), variants.join( "," ) );
if ( !additionalLayoutInfo.additionalLayout.isEmpty() )
{
config.setValue( QStringLiteral( "ResetOldOptions" ), true );
config.setValue( QStringLiteral( "Options" ), additionalLayoutInfo.groupSwitcher );
}
config.endGroup();
config.sync();

return config.status() == QSettings::NoError;
}


Calamares::JobResult
SetKeyboardLayoutJob::exec()
Expand Down Expand Up @@ -436,5 +467,20 @@ SetKeyboardLayoutJob::exec()
}
}

if ( m_writeKdeKeyboardConfig && !( m_skipIfNoRoot && ( destDir.isEmpty() || destDir.isRoot() ) ) )
{
QDir skelDir( destDir.absoluteFilePath( "etc/skel" ) );
if ( skelDir.exists() )
{
QString kdeKeyboardPath = skelDir.absoluteFilePath( ".config/kxkbrc" );
if ( !writeKdeKeyboardData( kdeKeyboardPath, m_model, m_layout, m_variant, m_additionalLayoutInfo ) )
{
return Calamares::JobResult::error(
tr( "Failed to write keyboard configuration for KDE Plasma.", "@error" ),
tr( "Failed to write to %1", "@error, %1 is KDE keyboard configuration path" ).arg( kdeKeyboardPath ) );
}
}
}

return Calamares::JobResult::ok();
}
2 changes: 2 additions & 0 deletions src/modules/keyboard/SetKeyboardLayoutJob.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ class SetKeyboardLayoutJob : public Calamares::Job
const QString& xOrgConfFileName,
const QString& convertedKeymapPath,
bool writeEtcDefaultKeyboard,
bool writeKdeKeyboardConfig,
bool skipIfNoRoot );

QString prettyName() const override;
Expand All @@ -45,6 +46,7 @@ class SetKeyboardLayoutJob : public Calamares::Job
QString m_xOrgConfFileName;
QString m_convertedKeymapPath;
const bool m_writeEtcDefaultKeyboard;
const bool m_writeKdeKeyboardConfig;
const bool m_skipIfNoRoot;
};

Expand Down
4 changes: 2 additions & 2 deletions src/modules/keyboard/Tests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -80,10 +80,10 @@ KeyboardLayoutTests::testVariantList_data()
<< QStringList { QStringLiteral( "dvorak" ) };
QTest::newRow( "additional layout with selected variant" ) << QStringLiteral( "us" ) << QString()
<< QStringLiteral( "phonetic" )
<< QStringList { QString(), QStringLiteral( "phonetic" ) };
<< QStringList { QStringLiteral( "phonetic" ), QString() };
QTest::newRow( "additional layout with additional variant" ) << QStringLiteral( "us" ) << QStringLiteral( "intl" )
<< QString()
<< QStringList { QStringLiteral( "intl" ), QString() };
<< QStringList { QString(), QStringLiteral( "intl" ) };
QTest::newRow( "additional layout with no variants" ) << QStringLiteral( "us" ) << QString() << QString()
<< QStringList {};
}
Expand Down