From 94000b6847c01b947b8a8a5b572bddbc7ddfcf4a Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 29 Mar 2018 04:33:55 -0400 Subject: [PATCH 01/12] [plasmalnf] Improve wording of LnF explanation. --- src/modules/plasmalnf/PlasmaLnfPage.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/modules/plasmalnf/PlasmaLnfPage.cpp b/src/modules/plasmalnf/PlasmaLnfPage.cpp index 2b171cc40..8462261c9 100644 --- a/src/modules/plasmalnf/PlasmaLnfPage.cpp +++ b/src/modules/plasmalnf/PlasmaLnfPage.cpp @@ -61,7 +61,11 @@ PlasmaLnfPage::PlasmaLnfPage( QWidget* parent ) CALAMARES_RETRANSLATE( { ui->retranslateUi( this ); - ui->generalExplanation->setText( tr( "Please choose a look-and-feel for the KDE Plasma Desktop. You can also skip this step and configure the look-and-feel once the system is installed." ) ); + ui->generalExplanation->setText( tr( + "Please choose a look-and-feel for the KDE Plasma Desktop. " + "You can also skip this step and configure the look-and-feel " + "once the system is installed. Clicking on a look-and-feel " + "selection will give you a live preview of that look-and-feel.") ); updateThemeNames(); fillUi(); } From 11652c585669d3d25615f1fbd3edaf7d6e17142c Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 29 Mar 2018 04:45:34 -0400 Subject: [PATCH 02/12] [plasmalnf] Add pre-selected theme - For OEM modes where there is already a theme, add a preselect: key to pick a specific theme and have that one come up as already- selected in the list. - Don't re-run the lnftool if an already-selected theme is clicked again. Use toggled() instead of clicked(). --- src/modules/plasmalnf/PlasmaLnfPage.cpp | 15 +++++++++++++++ src/modules/plasmalnf/PlasmaLnfPage.h | 3 +++ src/modules/plasmalnf/PlasmaLnfViewStep.cpp | 6 ++++++ src/modules/plasmalnf/PlasmaLnfViewStep.h | 6 +++--- src/modules/plasmalnf/ThemeWidget.cpp | 2 +- src/modules/plasmalnf/plasmalnf.conf | 12 ++++++++++++ 6 files changed, 40 insertions(+), 4 deletions(-) diff --git a/src/modules/plasmalnf/PlasmaLnfPage.cpp b/src/modules/plasmalnf/PlasmaLnfPage.cpp index 8462261c9..2638ca9b1 100644 --- a/src/modules/plasmalnf/PlasmaLnfPage.cpp +++ b/src/modules/plasmalnf/PlasmaLnfPage.cpp @@ -23,6 +23,8 @@ #include "utils/Logger.h" #include "utils/Retranslator.h" +#include + #include #include @@ -94,6 +96,14 @@ PlasmaLnfPage::setEnabledThemesAll() setEnabledThemes( plasma_themes() ); } +void +PlasmaLnfPage::setPreselect( const QString& id ) +{ + m_preselect = id; + if ( !m_enabledThemes.isEmpty() ) + fillUi(); +} + void PlasmaLnfPage::updateThemeNames() { @@ -166,6 +176,11 @@ void PlasmaLnfPage::fillUi() { theme.widget->updateThemeName( theme ); } + if ( theme.id == m_preselect ) + { + const QSignalBlocker b( theme.widget->button() ); + theme.widget->button()->setChecked( true ); + } ++c; } } diff --git a/src/modules/plasmalnf/PlasmaLnfPage.h b/src/modules/plasmalnf/PlasmaLnfPage.h index e489e99a7..104fca83d 100644 --- a/src/modules/plasmalnf/PlasmaLnfPage.h +++ b/src/modules/plasmalnf/PlasmaLnfPage.h @@ -50,6 +50,8 @@ public: void setEnabledThemes( const ThemeInfoList& themes ); /** @brief enable all installed plasma themes. */ void setEnabledThemesAll(); + /** @brief set which theme is to be preselected. */ + void setPreselect( const QString& id ); signals: void plasmaThemeSelected( const QString& id ); @@ -64,6 +66,7 @@ private: Ui::PlasmaLnfPage* ui; QString m_lnfPath; + QString m_preselect; ThemeInfoList m_enabledThemes; QButtonGroup *m_buttonGroup; diff --git a/src/modules/plasmalnf/PlasmaLnfViewStep.cpp b/src/modules/plasmalnf/PlasmaLnfViewStep.cpp index db8529d56..a14b8e338 100644 --- a/src/modules/plasmalnf/PlasmaLnfViewStep.cpp +++ b/src/modules/plasmalnf/PlasmaLnfViewStep.cpp @@ -137,6 +137,12 @@ PlasmaLnfViewStep::setConfigurationMap( const QVariantMap& configurationMap ) liveUser = configurationMap.value( "liveuser" ).toString(); m_liveUser = liveUser; + QString preselect; + if ( configurationMap.contains( "preselect" ) && configurationMap.value( "preselect" ).type() == QVariant::String ) + preselect = configurationMap.value( "preselect" ).toString(); + if ( !preselect.isEmpty() ) + m_widget->setPreselect( preselect ); + if ( configurationMap.contains( "themes" ) && configurationMap.value( "themes" ).type() == QVariant::List ) { diff --git a/src/modules/plasmalnf/PlasmaLnfViewStep.h b/src/modules/plasmalnf/PlasmaLnfViewStep.h index 7fcfc50cc..1fa4139e1 100644 --- a/src/modules/plasmalnf/PlasmaLnfViewStep.h +++ b/src/modules/plasmalnf/PlasmaLnfViewStep.h @@ -61,9 +61,9 @@ public slots: private: PlasmaLnfPage* m_widget; - QString m_lnfPath; - QString m_themeId; - QString m_liveUser; + QString m_lnfPath; // Path to the lnf tool + QString m_themeId; // Id of selected theme + QString m_liveUser; // Name of the live user (for OEM mode) }; CALAMARES_PLUGIN_FACTORY_DECLARATION( PlasmaLnfViewStepFactory ) diff --git a/src/modules/plasmalnf/ThemeWidget.cpp b/src/modules/plasmalnf/ThemeWidget.cpp index 28e01c2ff..68a8c5f83 100644 --- a/src/modules/plasmalnf/ThemeWidget.cpp +++ b/src/modules/plasmalnf/ThemeWidget.cpp @@ -62,7 +62,7 @@ ThemeWidget::ThemeWidget(const ThemeInfo& info, QWidget* parent) layout->addWidget( image_label, 1 ); layout->addWidget( m_description, 3 ); - connect( m_check, &QRadioButton::clicked, this, &ThemeWidget::clicked ); + connect( m_check, &QRadioButton::toggled, this, &ThemeWidget::clicked ); } void diff --git a/src/modules/plasmalnf/plasmalnf.conf b/src/modules/plasmalnf/plasmalnf.conf index aa9865117..49a91b3b5 100644 --- a/src/modules/plasmalnf/plasmalnf.conf +++ b/src/modules/plasmalnf/plasmalnf.conf @@ -27,3 +27,15 @@ themes: - theme: org.kde.breezedark.desktop image: "breeze-dark.png" - org.kde.fluffy-bunny.desktop + +# You can pre-select one of the themes; it is not applied +# immediately, but its radio-button is switched on to indicate +# that that is the theme (that is most likely) currently in use. +# Do this only on Live images where you are reasonably sure +# that the user is not going to change the theme out from under +# themselves before running the installer. +# +# If this key is present, its value should be the id of the theme +# which should be pre-selected. If absent, empty, or the pre-selected +# theme is not found on the live system, no theme will be pre-selected. +preselect: org.kde.breeze.desktop From c2efae765da30d3c3e28518ed8f8a976143bc007 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 29 Mar 2018 08:49:22 -0400 Subject: [PATCH 03/12] [plasmalnf] Add auto-detection of Plasma theme. - Although it's not necessarily accurate for an extensively-modified Plasma configuration, we can read the Look-and-Feel from the configuration files. Allows auto-detection. --- src/modules/plasmalnf/CMakeLists.txt | 16 +++++++++++++++- src/modules/plasmalnf/PlasmaLnfViewStep.cpp | 19 +++++++++++++++++++ src/modules/plasmalnf/plasmalnf.conf | 6 +++++- 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/modules/plasmalnf/CMakeLists.txt b/src/modules/plasmalnf/CMakeLists.txt index 15897f98c..e39b1af9f 100644 --- a/src/modules/plasmalnf/CMakeLists.txt +++ b/src/modules/plasmalnf/CMakeLists.txt @@ -4,8 +4,13 @@ find_package(ECM ${ECM_VERSION} REQUIRED NO_MODULE) # needs a runtime support component (which we don't test for). set( lnf_ver 5.41 ) +find_package( KF5Config ${lnf_ver} ) find_package( KF5Plasma ${lnf_ver} ) find_package( KF5Package ${lnf_ver} ) +set_package_properties( + KF5Config PROPERTIES + PURPOSE "For finding default Plasma Look-and-Feel" +) set_package_properties( KF5Plasma PROPERTIES PURPOSE "For Plasma Look-and-Feel selection" @@ -16,11 +21,19 @@ set_package_properties( ) if ( KF5Plasma_FOUND AND KF5Package_FOUND ) - find_package( KF5 ${lnf_ver} REQUIRED CoreAddons Plasma Package ) + if ( KF5Config_FOUND ) + set( option_kf5 Config ) + set( option_defs WITH_KCONFIG ) + # set( option_libs KF5::Config ) # Not needed anyway + endif() + + find_package( KF5 ${lnf_ver} REQUIRED CoreAddons Plasma Package ${option_kf5} ) calamares_add_plugin( plasmalnf TYPE viewmodule EXPORT_MACRO PLUGINDLLEXPORT_PRO + COMPILE_DEFINITIONS + ${option_defs} SOURCES PlasmaLnfViewStep.cpp PlasmaLnfPage.cpp @@ -32,6 +45,7 @@ if ( KF5Plasma_FOUND AND KF5Package_FOUND ) page_plasmalnf.ui LINK_PRIVATE_LIBRARIES calamaresui + ${option_libs} KF5::Package KF5::Plasma SHARED_LIB diff --git a/src/modules/plasmalnf/PlasmaLnfViewStep.cpp b/src/modules/plasmalnf/PlasmaLnfViewStep.cpp index a14b8e338..2ba4f7bca 100644 --- a/src/modules/plasmalnf/PlasmaLnfViewStep.cpp +++ b/src/modules/plasmalnf/PlasmaLnfViewStep.cpp @@ -26,8 +26,25 @@ #include #include +#ifdef WITH_KCONFIG +#include +#include +#endif + CALAMARES_PLUGIN_FACTORY_DEFINITION( PlasmaLnfViewStepFactory, registerPlugin(); ) +static QString +currentPlasmaTheme() +{ +#ifdef WITH_KCONFIG + KConfigGroup cg( KSharedConfig::openConfig( QStringLiteral( "kdeglobals" ) ), "KDE" ); + return cg.readEntry( "LookAndFeelPackage", QString() ); +#else + cWarning() << "No KConfig support, cannot determine Plasma theme."; + return QString(); +#endif +} + PlasmaLnfViewStep::PlasmaLnfViewStep( QObject* parent ) : Calamares::ViewStep( parent ) , m_widget( new PlasmaLnfPage ) @@ -140,6 +157,8 @@ PlasmaLnfViewStep::setConfigurationMap( const QVariantMap& configurationMap ) QString preselect; if ( configurationMap.contains( "preselect" ) && configurationMap.value( "preselect" ).type() == QVariant::String ) preselect = configurationMap.value( "preselect" ).toString(); + if ( preselect == QStringLiteral( "*" ) ) + preselect = currentPlasmaTheme(); if ( !preselect.isEmpty() ) m_widget->setPreselect( preselect ); diff --git a/src/modules/plasmalnf/plasmalnf.conf b/src/modules/plasmalnf/plasmalnf.conf index 49a91b3b5..e6ed88e77 100644 --- a/src/modules/plasmalnf/plasmalnf.conf +++ b/src/modules/plasmalnf/plasmalnf.conf @@ -38,4 +38,8 @@ themes: # If this key is present, its value should be the id of the theme # which should be pre-selected. If absent, empty, or the pre-selected # theme is not found on the live system, no theme will be pre-selected. -preselect: org.kde.breeze.desktop +# +# As a special setting, use "*", to try to find the currently- +# selected theme by reading the Plasma configuration. This requires +# KF5::Config at build- and run-time. +preselect: "*" From b0828faadb4eccbd4c2441d23860e452b406a434 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 29 Mar 2018 09:57:19 -0400 Subject: [PATCH 04/12] [plasmalnf] New setting to show all installed LnF themes - This enables working in three modes: - No themes listed; all are shown without screenshots, - Themes listed, showAll false; only those are shown, - Themes listed, showAll true; the installed-but-not-listed themes are shown after the listed ones, and have limited info. --- src/modules/plasmalnf/PlasmaLnfPage.cpp | 15 +++++++++++++++ src/modules/plasmalnf/PlasmaLnfPage.h | 3 +++ src/modules/plasmalnf/PlasmaLnfViewStep.cpp | 5 +++++ src/modules/plasmalnf/plasmalnf.conf | 12 ++++++++++-- 4 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/modules/plasmalnf/PlasmaLnfPage.cpp b/src/modules/plasmalnf/PlasmaLnfPage.cpp index 2638ca9b1..247fa950b 100644 --- a/src/modules/plasmalnf/PlasmaLnfPage.cpp +++ b/src/modules/plasmalnf/PlasmaLnfPage.cpp @@ -57,6 +57,7 @@ static ThemeInfoList plasma_themes() PlasmaLnfPage::PlasmaLnfPage( QWidget* parent ) : QWidget( parent ) , ui( new Ui::PlasmaLnfPage ) + , m_showAll( false ) , m_buttonGroup( nullptr ) { ui->setupUi( this ); @@ -85,6 +86,14 @@ PlasmaLnfPage::setEnabledThemes(const ThemeInfoList& themes) { m_enabledThemes = themes; + if ( m_showAll ) + { + auto plasmaThemes = plasma_themes(); + for ( auto& installed_theme : plasmaThemes ) + if ( !m_enabledThemes.findById( installed_theme.id ) ) + m_enabledThemes.append( installed_theme ); + } + updateThemeNames(); winnowThemes(); fillUi(); @@ -104,6 +113,12 @@ PlasmaLnfPage::setPreselect( const QString& id ) fillUi(); } +void +PlasmaLnfPage::setShowAll(bool b) +{ + m_showAll = b; +} + void PlasmaLnfPage::updateThemeNames() { diff --git a/src/modules/plasmalnf/PlasmaLnfPage.h b/src/modules/plasmalnf/PlasmaLnfPage.h index 104fca83d..564b61fef 100644 --- a/src/modules/plasmalnf/PlasmaLnfPage.h +++ b/src/modules/plasmalnf/PlasmaLnfPage.h @@ -52,6 +52,8 @@ public: void setEnabledThemesAll(); /** @brief set which theme is to be preselected. */ void setPreselect( const QString& id ); + /** @brief set whether to show all themes, not just the listed ones. */ + void setShowAll( bool b ); signals: void plasmaThemeSelected( const QString& id ); @@ -67,6 +69,7 @@ private: Ui::PlasmaLnfPage* ui; QString m_lnfPath; QString m_preselect; + bool m_showAll; // If true, don't winnow according to enabledThemes ThemeInfoList m_enabledThemes; QButtonGroup *m_buttonGroup; diff --git a/src/modules/plasmalnf/PlasmaLnfViewStep.cpp b/src/modules/plasmalnf/PlasmaLnfViewStep.cpp index 2ba4f7bca..929d57360 100644 --- a/src/modules/plasmalnf/PlasmaLnfViewStep.cpp +++ b/src/modules/plasmalnf/PlasmaLnfViewStep.cpp @@ -162,6 +162,11 @@ PlasmaLnfViewStep::setConfigurationMap( const QVariantMap& configurationMap ) if ( !preselect.isEmpty() ) m_widget->setPreselect( preselect ); + bool showAll( false ); + if ( configurationMap.contains( "showAll" ) && configurationMap.value( "showAll" ).type() == QVariant::Bool ) + showAll = configurationMap.value( "showAll" ).toBool(); + m_widget->setShowAll( showAll ); + if ( configurationMap.contains( "themes" ) && configurationMap.value( "themes" ).type() == QVariant::List ) { diff --git a/src/modules/plasmalnf/plasmalnf.conf b/src/modules/plasmalnf/plasmalnf.conf index e6ed88e77..a3a80fcff 100644 --- a/src/modules/plasmalnf/plasmalnf.conf +++ b/src/modules/plasmalnf/plasmalnf.conf @@ -13,8 +13,9 @@ lnftool: "/usr/bin/lookandfeeltool" # You can limit the list of Plasma look-and-feel themes by listing ids # here. If this key is not present, all of the installed themes are listed. -# If the key is present, only installed themes that are *also* included -# in the list are shown (could be none!). +# If the key is present, only installed themes that are **also** included +# in the list are shown (could be none!). See the *showAll* key, below, +# to change that. # # Themes may be listed by id, (e.g. fluffy-bunny, below) or as a theme # and an image (e.g. breeze) which will be used to show a screenshot. @@ -28,6 +29,13 @@ themes: image: "breeze-dark.png" - org.kde.fluffy-bunny.desktop +# If *showAll* is true, then all installed themes are shown in the +# UI for selection, even if they are not listed in *themes*. This +# allows selection of all themes even while not all of them are +# listed in *themes* -- which is useful to show screenshots for those +# you do have a screenshot for. +showAll: false + # You can pre-select one of the themes; it is not applied # immediately, but its radio-button is switched on to indicate # that that is the theme (that is most likely) currently in use. From fb93a8288e74cdbcca90b905dadc72649d9e76ff Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 29 Mar 2018 10:09:45 -0400 Subject: [PATCH 05/12] [plasmalnf] Simplify showAll handling - Only need the showAll parameter once, when passing in the list of themes to show. --- src/modules/plasmalnf/PlasmaLnfPage.cpp | 15 +++++---------- src/modules/plasmalnf/PlasmaLnfPage.h | 11 +++++++---- src/modules/plasmalnf/PlasmaLnfViewStep.cpp | 11 +++++------ 3 files changed, 17 insertions(+), 20 deletions(-) diff --git a/src/modules/plasmalnf/PlasmaLnfPage.cpp b/src/modules/plasmalnf/PlasmaLnfPage.cpp index 247fa950b..c65e79ba2 100644 --- a/src/modules/plasmalnf/PlasmaLnfPage.cpp +++ b/src/modules/plasmalnf/PlasmaLnfPage.cpp @@ -82,11 +82,11 @@ PlasmaLnfPage::setLnfPath( const QString& path ) } void -PlasmaLnfPage::setEnabledThemes(const ThemeInfoList& themes) +PlasmaLnfPage::setEnabledThemes(const ThemeInfoList& themes, bool showAll ) { m_enabledThemes = themes; - if ( m_showAll ) + if ( showAll ) { auto plasmaThemes = plasma_themes(); for ( auto& installed_theme : plasmaThemes ) @@ -102,7 +102,9 @@ PlasmaLnfPage::setEnabledThemes(const ThemeInfoList& themes) void PlasmaLnfPage::setEnabledThemesAll() { - setEnabledThemes( plasma_themes() ); + // Don't need to set showAll=true, because we're already passing in + // the complete list of installed themes. + setEnabledThemes( plasma_themes(), false ); } void @@ -113,13 +115,6 @@ PlasmaLnfPage::setPreselect( const QString& id ) fillUi(); } -void -PlasmaLnfPage::setShowAll(bool b) -{ - m_showAll = b; -} - - void PlasmaLnfPage::updateThemeNames() { auto plasmaThemes = plasma_themes(); diff --git a/src/modules/plasmalnf/PlasmaLnfPage.h b/src/modules/plasmalnf/PlasmaLnfPage.h index 564b61fef..49a6ff69a 100644 --- a/src/modules/plasmalnf/PlasmaLnfPage.h +++ b/src/modules/plasmalnf/PlasmaLnfPage.h @@ -46,14 +46,17 @@ public: explicit PlasmaLnfPage( QWidget* parent = nullptr ); void setLnfPath( const QString& path ); - /** @brief enable only the listed themes. */ - void setEnabledThemes( const ThemeInfoList& themes ); + /** @brief enable only the listed themes. + * + * Shows the listed @p themes with full information (e.g. screenshot). + * If @p showAll is true, then also show all installed themes + * not explicitly listed (without a screenshot). + */ + void setEnabledThemes( const ThemeInfoList& themes, bool showAll ); /** @brief enable all installed plasma themes. */ void setEnabledThemesAll(); /** @brief set which theme is to be preselected. */ void setPreselect( const QString& id ); - /** @brief set whether to show all themes, not just the listed ones. */ - void setShowAll( bool b ); signals: void plasmaThemeSelected( const QString& id ); diff --git a/src/modules/plasmalnf/PlasmaLnfViewStep.cpp b/src/modules/plasmalnf/PlasmaLnfViewStep.cpp index 929d57360..498a40fe0 100644 --- a/src/modules/plasmalnf/PlasmaLnfViewStep.cpp +++ b/src/modules/plasmalnf/PlasmaLnfViewStep.cpp @@ -165,12 +165,11 @@ PlasmaLnfViewStep::setConfigurationMap( const QVariantMap& configurationMap ) bool showAll( false ); if ( configurationMap.contains( "showAll" ) && configurationMap.value( "showAll" ).type() == QVariant::Bool ) showAll = configurationMap.value( "showAll" ).toBool(); - m_widget->setShowAll( showAll ); if ( configurationMap.contains( "themes" ) && configurationMap.value( "themes" ).type() == QVariant::List ) { - ThemeInfoList allThemes; + ThemeInfoList listedThemes; auto themeList = configurationMap.value( "themes" ).toList(); // Create the ThemInfo objects for the listed themes; information // about the themes from Plasma (e.g. human-readable name and description) @@ -179,14 +178,14 @@ PlasmaLnfViewStep::setConfigurationMap( const QVariantMap& configurationMap ) if ( i.type() == QVariant::Map ) { auto iv = i.toMap(); - allThemes.append( ThemeInfo( iv.value( "theme" ).toString(), iv.value( "image" ).toString() ) ); + listedThemes.append( ThemeInfo( iv.value( "theme" ).toString(), iv.value( "image" ).toString() ) ); } else if ( i.type() == QVariant::String ) - allThemes.append( ThemeInfo( i.toString() ) ); + listedThemes.append( ThemeInfo( i.toString() ) ); - if ( allThemes.length() == 1 ) + if ( listedThemes.length() == 1 ) cDebug() << "WARNING: only one theme enabled in plasmalnf"; - m_widget->setEnabledThemes( allThemes ); + m_widget->setEnabledThemes( listedThemes, showAll ); } else m_widget->setEnabledThemesAll(); // All of them From 32a1c849352c6e5650dc0cf17e3e90bf397a172d Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 29 Mar 2018 16:50:02 -0400 Subject: [PATCH 06/12] [locale] Document the settings in locale.conf - The geoipUrl is weird, because it is not a complete URL. Document that, and what kind of data is expected. FIXES #920 --- src/modules/locale/locale.conf | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/modules/locale/locale.conf b/src/modules/locale/locale.conf index 824c8abeb..88148f47a 100644 --- a/src/modules/locale/locale.conf +++ b/src/modules/locale/locale.conf @@ -1,7 +1,33 @@ --- +# The starting timezone (e.g. the pin-on-the-map) when entering +# the locale page can be set through keys *region* and *zone*. +# If either is not set, defaults to America/New_York. +# region: "America" zone: "New_York" -# GeoIP settings. Leave commented out to disable GeoIP. +# Some distros come with a meaningfully commented and easy to parse +# `/etc/locale.gen`, and others ship a separate file +# `/usr/share/i18n/SUPPORTED` with a clean list of supported locales. +# We first try SUPPORTED, and if it doesn't exist, we fall back +# to parsing the lines from `locale.gen`. For distro's that ship +# the `locale.gen` file installed elsewhere, the key *localeGenPath* +# can be used to specify where it is. If not set, the default +# `/etc/locale.gen` is used. +# #localeGenPath: "/etc/locale.gen" + +# GeoIP settings. Leave commented out to disable GeoIP. +# +# An HTTP request is made to http://*geoipUrl*/json (which just happens +# to be the GET path needed by freegeoip.net, so calling this a URL +# is a stretch). The request must return valid JSON data; there should +# be an attribute *time_zone*, with a string value set to the +# timezone, in / form. +# +# Suitable data looks like +# ``` +# {"time_zone":"America/New_York"} +# ``` +# #geoipUrl: "freegeoip.net" From 9cdb6734bfa83fe3476b096f8bbe851567330240 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 3 Apr 2018 08:02:16 -0400 Subject: [PATCH 07/12] [packages] If locale is empty, pretend it is 'en'. - Otherwise packages like vi-$LOCALE will be retained in the package list, which will cause install problems. --- src/modules/packages/main.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/modules/packages/main.py b/src/modules/packages/main.py index 60ede34fa..3105474f8 100644 --- a/src/modules/packages/main.py +++ b/src/modules/packages/main.py @@ -318,7 +318,10 @@ def subst_locale(plist): """ locale = libcalamares.globalstorage.value("locale") if not locale: - return plist + # It is possible to skip the locale-setting entirely. + # Then pretend it is "en", so that {LOCALE}-decorated + # package names are removed from the list. + locale = "en" ret = [] for packagedata in plist: From fd1279dbe36aef6665d04eb78b413434dfc8b3f2 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 3 Apr 2018 08:19:45 -0400 Subject: [PATCH 08/12] [welcome] Make the example configuration less strict --- src/modules/welcome/welcome.conf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modules/welcome/welcome.conf b/src/modules/welcome/welcome.conf index 18e71b1ef..b7ce5cfcd 100644 --- a/src/modules/welcome/welcome.conf +++ b/src/modules/welcome/welcome.conf @@ -25,6 +25,6 @@ requirements: # If any of these conditions are not met, the user cannot # continue past the welcome page. required: - - storage + # - storage - ram - - root + # - root From 36aede52ef6c0d4ddb3b8cf5f752f798446ba769 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 3 Apr 2018 08:20:01 -0400 Subject: [PATCH 09/12] [packages] Example configuration installs a localization package --- src/modules/packages/packages.conf | 1 + 1 file changed, 1 insertion(+) diff --git a/src/modules/packages/packages.conf b/src/modules/packages/packages.conf index 2d6ca116f..38497c2f5 100644 --- a/src/modules/packages/packages.conf +++ b/src/modules/packages/packages.conf @@ -127,6 +127,7 @@ update_db: true operations: - install: - vi + - vi-${LOCALE} - wget - binutils - remove: From 4c04260b9783d3c14c6187fced640292d41725e8 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 3 Apr 2018 08:28:29 -0400 Subject: [PATCH 10/12] [packages] Don't change the global package list. - Count only the packages that will be changed, given the current locale settings. - Preserve global storage unchanged (don't remove any locale-packages). --- src/modules/packages/main.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/modules/packages/main.py b/src/modules/packages/main.py index 3105474f8..f252bc15f 100644 --- a/src/modules/packages/main.py +++ b/src/modules/packages/main.py @@ -367,20 +367,20 @@ def run_operations(pkgman, entry): global group_packages, completed_packages, mode_packages for key in entry.keys(): - entry[key] = subst_locale(entry[key]) - group_packages = len(entry[key]) + package_list = subst_locale(entry[key]) + group_packages = len(package_list) if key == "install": _change_mode(INSTALL) - if all([isinstance(x, str) for x in entry[key]]): - pkgman.install(entry[key]) + if all([isinstance(x, str) for x in package_list]): + pkgman.install(package_list) else: - for package in entry[key]: + for package in package_list: pkgman.install_package(package) elif key == "try_install": _change_mode(INSTALL) # we make a separate package manager call for each package so a # single failing package won't stop all of them - for package in entry[key]: + for package in package_list: try: pkgman.install_package(package) except subprocess.CalledProcessError: @@ -389,10 +389,10 @@ def run_operations(pkgman, entry): libcalamares.utils.debug(warn_text) elif key == "remove": _change_mode(REMOVE) - pkgman.remove(entry[key]) + pkgman.remove(package_list) elif key == "try_remove": _change_mode(REMOVE) - for package in entry[key]: + for package in package_list: try: pkgman.remove([package]) except subprocess.CalledProcessError: @@ -401,9 +401,9 @@ def run_operations(pkgman, entry): libcalamares.utils.debug(warn_text) elif key == "localInstall": _change_mode(INSTALL) - pkgman.install(entry[key], from_local=True) + pkgman.install(package_list, from_local=True) - completed_packages += len(entry[key]) + completed_packages += len(package_list) libcalamares.job.setprogress(completed_packages * 1.0 / total_packages) libcalamares.utils.debug(pretty_name()) @@ -447,7 +447,7 @@ def run(): completed_packages = 0 for op in operations: for packagelist in op.values(): - total_packages += len(packagelist) + total_packages += len(subst_locale(packagelist)) if not total_packages: # Avoids potential divide-by-zero in progress reporting From b8e61445531f2ec1a56d3720a16755df6c69aafa Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 3 Apr 2018 12:10:05 -0400 Subject: [PATCH 11/12] [locale] Document how the locale entry in Global Storage works. - Make the BCP47 value explicitly lower-case. - Add some constness and encapsulation. - Fix up documentation in the packages module explaining the format of the ${LOCALE} replacement (now forced to lower-case, but it is also only the language part, not e.g. en-UK). FIXES #922 --- src/modules/locale/LocaleConfiguration.cpp | 14 +++++++++++--- src/modules/locale/LocaleConfiguration.h | 9 +++++++-- src/modules/locale/LocalePage.cpp | 6 ++++-- src/modules/packages/packages.conf | 17 +++++++++++------ 4 files changed, 33 insertions(+), 13 deletions(-) diff --git a/src/modules/locale/LocaleConfiguration.cpp b/src/modules/locale/LocaleConfiguration.cpp index b8f5f6a9e..c612c50c4 100644 --- a/src/modules/locale/LocaleConfiguration.cpp +++ b/src/modules/locale/LocaleConfiguration.cpp @@ -43,9 +43,11 @@ LocaleConfiguration::fromLanguageAndLocation( const QString& languageLocale, const QStringList& availableLocales, const QString& countryCode ) { - LocaleConfiguration lc = LocaleConfiguration(); + LocaleConfiguration lc; + + // Note that the documentation how this works is in packages.conf QString language = languageLocale.split( '_' ).first(); - lc.myLanguageLocaleBcp47 = QLocale(language).bcp47Name(); + lc.myLanguageLocaleBcp47 = QLocale(language).bcp47Name().toLower(); QStringList linesForLanguage; for ( const QString &line : availableLocales ) @@ -288,7 +290,7 @@ LocaleConfiguration::isEmpty() const QMap< QString, QString > -LocaleConfiguration::toMap() +LocaleConfiguration::toMap() const { QMap< QString, QString > map; @@ -324,3 +326,9 @@ LocaleConfiguration::toMap() return map; } + +QString +LocaleConfiguration::toBcp47() const +{ + return myLanguageLocaleBcp47; +} diff --git a/src/modules/locale/LocaleConfiguration.h b/src/modules/locale/LocaleConfiguration.h index 073d19a5b..04d1db456 100644 --- a/src/modules/locale/LocaleConfiguration.h +++ b/src/modules/locale/LocaleConfiguration.h @@ -35,16 +35,21 @@ public: bool isEmpty() const; + QMap< QString, QString > toMap() const; + // Note that the documentation how this works is in packages.conf + QString toBcp47() const; + // These become all uppercase in locale.conf, but we keep them lowercase here to // avoid confusion with locale.h. QString lang, lc_numeric, lc_time, lc_monetary, lc_paper, lc_name, lc_address, lc_telephone, lc_measurement, lc_identification; - QString myLanguageLocaleBcp47; - QMap< QString, QString > toMap(); // If the user has explicitly selected language (from the dialog) // or numbers format, set these to avoid implicit changes to them. bool explicit_lang, explicit_lc; + +private: + QString myLanguageLocaleBcp47; }; #endif // LOCALECONFIGURATION_H diff --git a/src/modules/locale/LocalePage.cpp b/src/modules/locale/LocalePage.cpp index 2172586ff..8b05ccfba 100644 --- a/src/modules/locale/LocalePage.cpp +++ b/src/modules/locale/LocalePage.cpp @@ -489,8 +489,10 @@ LocalePage::updateGlobalStorage() ->insert( "locationRegion", location.region ); Calamares::JobQueue::instance()->globalStorage() ->insert( "locationZone", location.zone ); - Calamares::JobQueue::instance()->globalStorage() - ->insert( "locale", m_selectedLocaleConfiguration.myLanguageLocaleBcp47); + + const QString bcp47 = m_selectedLocaleConfiguration.toBcp47(); + Calamares::JobQueue::instance()->globalStorage()->insert( "locale", bcp47 ); + cDebug() << "Updated locale globals, BCP47=" << bcp47; // If we're in chroot mode (normal install mode), then we immediately set the // timezone on the live system. diff --git a/src/modules/packages/packages.conf b/src/modules/packages/packages.conf index 38497c2f5..7e5717b7c 100644 --- a/src/modules/packages/packages.conf +++ b/src/modules/packages/packages.conf @@ -76,7 +76,7 @@ update_db: true # pre-script: touch /tmp/installing-vi # post-script: rm -f /tmp/installing-vi # -# The pre- and post-scripts are optional, but not both optional: using +# The pre- and post-scripts are optional, but you cannot leave both out: using # "package: vi" with neither script option will trick Calamares into # trying to install a package named "package: vi", which is unlikely to work. # @@ -84,11 +84,16 @@ update_db: true # packages for software based on the selected system locale. By including # the string LOCALE in the package name, the following happens: # -# - if the system locale is English (generally US English; en_GB is a valid -# localization), then the package is not installed at all, -# - otherwise $LOCALE or ${LOCALE} is replaced by the Bcp47 name of the selected -# system locale, e.g. nl_BE. Note that just plain LOCALE will not be replaced, -# so foo-LOCALE will be unchanged, while foo-$LOCALE will be changed. +# - if the system locale is English (any variety), then the package is not +# installed at all, +# - otherwise $LOCALE or ${LOCALE} is replaced by the **lower-cased** BCP47 +# name of the **language** part of the selected system locale (not the +# country/region/dialect part), e.g. selecting *nl_BE* will use *nl* +# here. +# +# Take care that just plain LOCALE will not be replaced, so foo-LOCALE will +# be left unchanged, while foo-$LOCALE will be changed. However, foo-LOCALE +# **will** be removed from the list of packages, if English is selected. # # The following installs localizations for vi, if they are relevant; if # there is no localization, installation continues normally. From 06e43a731278edd894319bb04ce5b91587bc57cc Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 9 Apr 2018 11:20:40 -0400 Subject: [PATCH 12/12] CI: Switch to stable Neon, to avoid all-builds-failing. The dev-unstable Neon branch now has a too-new KPMCore for this branch of Calamares. --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index cd0e4f365..a4d424f45 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,2 +1,2 @@ -FROM kdeneon/all +FROM kdeneon/all:dev-stable RUN sudo apt-get update && sudo apt-get -y install build-essential cmake extra-cmake-modules gettext kio-dev libatasmart-dev libboost-python-dev libkf5config-dev libkf5coreaddons-dev libkf5i18n-dev libkf5iconthemes-dev libkf5parts-dev libkf5service-dev libkf5solid-dev libkpmcore-dev libparted-dev libpolkit-qt5-1-dev libqt5svg5-dev libqt5webkit5-dev libyaml-cpp-dev os-prober pkg-config python3-dev qtbase5-dev qtdeclarative5-dev qttools5-dev qttools5-dev-tools