From 4fea2920d7b08ee056a331d08604b653c60da6eb Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Sun, 1 Sep 2024 20:39:58 +0200 Subject: [PATCH] [keyboard] Rename functions, simplify logic The timer can be connected to one slot, which just checks what kinds of configuration are enabled. Then update all the ones that make sense in a live system. --- src/modules/keyboard/Config.cpp | 78 +++++++++++++++------------------ src/modules/keyboard/Config.h | 21 +++++---- 2 files changed, 48 insertions(+), 51 deletions(-) diff --git a/src/modules/keyboard/Config.cpp b/src/modules/keyboard/Config.cpp index d1d480f83..291cddb5e 100644 --- a/src/modules/keyboard/Config.cpp +++ b/src/modules/keyboard/Config.cpp @@ -160,24 +160,16 @@ Config::Config( QObject* parent ) , m_keyboardVariantsModel( new KeyboardVariantsModel( this ) ) , m_KeyboardGroupSwitcherModel( new KeyboardGroupsSwitchersModel( this ) ) { - m_setxkbmapTimer.setSingleShot( true ); + m_applyTimer.setSingleShot( true ); + connect( &m_applyTimer, &QTimer::timeout, this, &Config::apply ); // Connect signals and slots connect( m_keyboardModelsModel, &KeyboardModelsModel::currentIndexChanged, [ & ]( int index ) { - // Set Xorg keyboard model m_selectedModel = m_keyboardModelsModel->key( index ); - if ( m_useLocale1 ) - { - locale1Apply(); - } - else - { - QProcess::execute( "setxkbmap", xkbmap_model_args( m_selectedModel ) ); - } - emit prettyStatusChanged(); + somethingChanged(); } ); connect( m_keyboardLayoutsModel, @@ -194,16 +186,14 @@ Config::Config( QObject* parent ) [ & ]( int index ) { m_selectedVariant = m_keyboardVariantsModel->key( index ); - xkbChanged(); - emit prettyStatusChanged(); + somethingChanged(); } ); connect( m_KeyboardGroupSwitcherModel, &KeyboardGroupsSwitchersModel::currentIndexChanged, [ & ]( int index ) { m_selectedGroup = m_KeyboardGroupSwitcherModel->key( index ); - xkbChanged(); - emit prettyStatusChanged(); + somethingChanged(); } ); // If the user picks something explicitly -- not a consequence of @@ -223,30 +213,32 @@ Config::Config( QObject* parent ) } void -Config::xkbChanged() +Config::somethingChanged() { - // Set Xorg keyboard layout + variant - if ( m_setxkbmapTimer.isActive() ) + if ( m_applyTimer.isActive() ) { - m_setxkbmapTimer.stop(); - m_setxkbmapTimer.disconnect( this ); + m_applyTimer.stop(); } - - if ( m_useLocale1 ) - { - connect( &m_setxkbmapTimer, &QTimer::timeout, this, &Config::locale1Apply ); - } - else - { - connect( &m_setxkbmapTimer, &QTimer::timeout, this, &Config::xkbApply ); - } - - m_setxkbmapTimer.start( QApplication::keyboardInputInterval() ); + m_applyTimer.start( QApplication::keyboardInputInterval() ); emit prettyStatusChanged(); } void -Config::locale1Apply() +Config::apply() +{ + if ( m_configureXkb ) + { + applyXkb(); + } + if ( m_configureLocale1 ) + { + applyLocale1(); + } + // Writing /etc/ files is not needed "live" +} + +void +Config::applyLocale1() { m_additionalLayoutInfo = getAdditionalLayoutInfo( m_selectedLayout ); @@ -282,10 +274,11 @@ Config::locale1Apply() } void -Config::xkbApply() +Config::applyXkb() { m_additionalLayoutInfo = getAdditionalLayoutInfo( m_selectedLayout ); + QStringList basicArguments = xkbmap_model_args( m_selectedModel ); if ( !m_additionalLayoutInfo.additionalLayout.isEmpty() ) { if ( !m_selectedGroup.isEmpty() ) @@ -302,11 +295,11 @@ Config::xkbApply() m_additionalLayoutInfo.groupSwitcher = "grp:alt_shift_toggle"; } - QProcess::execute( - "setxkbmap", + basicArguments.append( xkbmap_layout_args_with_group_switch( { m_additionalLayoutInfo.additionalLayout, m_selectedLayout }, { m_additionalLayoutInfo.additionalVariant, m_selectedVariant }, m_additionalLayoutInfo.groupSwitcher ) ); + QProcess::execute( "setxkbmap", basicArguments ); cDebug() << "xkbmap selection changed to: " << m_selectedLayout << '-' << m_selectedVariant << "(added " << m_additionalLayoutInfo.additionalLayout << "-" << m_additionalLayoutInfo.additionalVariant @@ -314,10 +307,11 @@ Config::xkbApply() } else { - QProcess::execute( "setxkbmap", xkbmap_layout_args( m_selectedLayout, m_selectedVariant ) ); + basicArguments.append( xkbmap_layout_args( m_selectedLayout, m_selectedVariant ) ); + QProcess::execute( "setxkbmap", basicArguments ); cDebug() << "xkbmap selection changed to: " << m_selectedLayout << '-' << m_selectedVariant; } - m_setxkbmapTimer.disconnect( this ); + m_applyTimer.stop(); } KeyboardModelsModel* @@ -455,7 +449,7 @@ Config::detectCurrentKeyboardLayout() QString currentVariant; QString currentModel; - if ( m_useLocale1 ) + if ( m_configureLocale1 ) { getCurrentKeyboardLayoutLocale1( currentLayout, currentVariant, currentModel ); } @@ -527,8 +521,8 @@ Config::createJobs() m_additionalLayoutInfo, m_xOrgConfFileName, m_convertedKeymapPath, - m_writeEtcDefaultKeyboard, - m_useLocale1 ); + m_configureEtcDefaultKeyboard, + m_configureLocale1 ); list.append( Calamares::job_ptr( j ) ); return list; @@ -718,8 +712,8 @@ Config::setConfigurationMap( const QVariantMap& configurationMap ) m_xOrgConfFileName = xorgConfDefault; } m_convertedKeymapPath = getString( configurationMap, "convertedKeymapPath" ); - m_writeEtcDefaultKeyboard = getBool( configurationMap, "writeEtcDefaultKeyboard", true ); - m_useLocale1 = getBool( configurationMap, "useLocale1", !isX11 ); + m_configureEtcDefaultKeyboard = getBool( configurationMap, "writeEtcDefaultKeyboard", true ); + m_configureLocale1 = getBool( configurationMap, "useLocale1", !isX11 ); m_guessLayout = getBool( configurationMap, "guessLayout", true ); } diff --git a/src/modules/keyboard/Config.h b/src/modules/keyboard/Config.h index 04659514d..2d28990f1 100644 --- a/src/modules/keyboard/Config.h +++ b/src/modules/keyboard/Config.h @@ -86,14 +86,16 @@ private: * keyboard layout. This introduces a slight delay between selecting * a keyboard, and applying it to the system -- so that if you * scroll through or down-arrow through the list of keyboards, - * you don't get buried under xkbset processes. + * you don't get buried under updates which might take some time. * - * xkbChanged() is called when the selection changes, and triggers - * a delayed call to xkbApply() which does the actual work. + * somethingChanged() is called when the selection changes, and triggers + * a delayed call to apply() which does the actual work by calling the + * relevant apply*() functions. */ - void xkbChanged(); - void xkbApply(); - void locale1Apply(); + void somethingChanged(); + void apply(); + void applyLocale1(); + void applyXkb(); void getCurrentKeyboardLayoutXkb( QString& currentLayout, QString& currentVariant, QString& currentModel ); void getCurrentKeyboardLayoutLocale1( QString& currentLayout, QString& currentVariant, QString& currentModel ); @@ -111,13 +113,14 @@ private: // Layout (and corresponding info) added if current one doesn't support ASCII (e.g. Russian or Japanese) AdditionalLayoutInfo m_additionalLayoutInfo; - QTimer m_setxkbmapTimer; + QTimer m_applyTimer; // From configuration QString m_xOrgConfFileName; QString m_convertedKeymapPath; - bool m_writeEtcDefaultKeyboard = true; - bool m_useLocale1 = false; + bool m_configureXkb = true; + bool m_configureEtcDefaultKeyboard = true; + bool m_configureLocale1 = false; bool m_guessLayout = false; // The state determines whether we guess settings or preserve them: