File indexing completed on 2024-05-12 17:07:13

0001 /*
0002     SPDX-FileCopyrightText: 2010 Andriy Rysin <rysin@kde.org>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "bindings.h"
0008 #include "debug.h"
0009 
0010 #include <KAboutData>
0011 #include <KGlobalAccel>
0012 #include <KLocalizedString>
0013 
0014 #include <QAction>
0015 #include <QList>
0016 
0017 #include "flags.h"
0018 #include "x11_helper.h"
0019 
0020 KeyboardLayoutActionCollection::KeyboardLayoutActionCollection(QObject *parent, bool configAction_)
0021     : KActionCollection(parent, QStringLiteral("KDE Keyboard Layout Switcher"))
0022     , configAction(configAction_)
0023 {
0024     setComponentDisplayName(i18n("Keyboard Layout Switcher"));
0025     QAction *toggleAction = addAction(QStringLiteral("Switch to Next Keyboard Layout"));
0026     toggleAction->setText(i18n("Switch to Next Keyboard Layout"));
0027     KGlobalAccel::self()->setShortcut(toggleAction, QList<QKeySequence>() << QKeySequence(Qt::META | Qt::ALT | Qt::Key_K), KGlobalAccel::Autoloading);
0028     if (configAction) {
0029         toggleAction->setProperty("isConfigurationAction", true);
0030     }
0031 }
0032 
0033 KeyboardLayoutActionCollection::~KeyboardLayoutActionCollection()
0034 {
0035     clear();
0036 }
0037 
0038 QAction *KeyboardLayoutActionCollection::getToggleAction()
0039 {
0040     return action(0);
0041 }
0042 
0043 QAction *KeyboardLayoutActionCollection::createLayoutShortcutActon(const LayoutUnit &layoutUnit, int layoutIndex, const Rules *rules, bool autoload)
0044 {
0045     QString longLayoutName = Flags::getLongText(layoutUnit, rules);
0046     QString actionName = QStringLiteral("Switch keyboard layout to ");
0047     actionName += longLayoutName;
0048     QAction *action = addAction(actionName);
0049     action->setText(i18n("Switch keyboard layout to %1", longLayoutName));
0050     KGlobalAccel::GlobalShortcutLoading loading = autoload ? KGlobalAccel::Autoloading : KGlobalAccel::NoAutoloading;
0051     QList<QKeySequence> shortcuts;
0052     if (!autoload) {
0053         shortcuts << layoutUnit.getShortcut();
0054     }
0055     KGlobalAccel::self()->setShortcut(action, shortcuts, loading);
0056     action->setData(layoutIndex);
0057     if (configAction) {
0058         action->setProperty("isConfigurationAction", true);
0059     }
0060     return action;
0061 }
0062 
0063 void KeyboardLayoutActionCollection::setToggleShortcut(const QKeySequence &keySequence)
0064 {
0065     KGlobalAccel::self()->setShortcut(getToggleAction(), QList<QKeySequence>() << keySequence, KGlobalAccel::NoAutoloading);
0066 }
0067 
0068 void KeyboardLayoutActionCollection::setLayoutShortcuts(QList<LayoutUnit> &layoutUnits, const Rules *rules)
0069 {
0070     for (int i = 0; i < layoutUnits.size(); ++i) {
0071         const LayoutUnit &layoutUnit = layoutUnits.at(i);
0072         if (!layoutUnit.getShortcut().isEmpty()) {
0073             createLayoutShortcutActon(layoutUnit, i, rules, false);
0074         }
0075     }
0076     qCDebug(KCM_KEYBOARD) << "Cleaning component shortcuts on save" << KGlobalAccel::cleanComponent(QStringLiteral("KDE Keyboard Layout Switcher"));
0077 }
0078 
0079 void KeyboardLayoutActionCollection::loadLayoutShortcuts(QList<LayoutUnit> &layoutUnits, const Rules *rules)
0080 {
0081     for (int i = 0; i < layoutUnits.size(); ++i) {
0082         LayoutUnit &layoutUnit = layoutUnits[i];
0083         QAction *action = createLayoutShortcutActon(layoutUnit, i, rules, true);
0084         const auto shortcut = KGlobalAccel::self()->shortcut(action);
0085         if (!shortcut.isEmpty()) {
0086             qCDebug(KCM_KEYBOARD, ) << "Restored shortcut for" << layoutUnit.toString() << shortcut.first();
0087             layoutUnit.setShortcut(shortcut.first());
0088         } else {
0089             qCDebug(KCM_KEYBOARD, ) << "Skipping empty shortcut for" << layoutUnit.toString();
0090             removeAction(action);
0091         }
0092     }
0093     qCDebug(KCM_KEYBOARD) << "Cleaning component shortcuts on load" << KGlobalAccel::cleanComponent(QStringLiteral("KDE Keyboard Layout Switcher"));
0094 }
0095 
0096 void KeyboardLayoutActionCollection::resetLayoutShortcuts()
0097 {
0098     for (int i = 1; i < actions().size(); i++) {
0099         KGlobalAccel::self()->setShortcut(action(i), QList<QKeySequence>(), KGlobalAccel::NoAutoloading);
0100         KGlobalAccel::self()->setDefaultShortcut(action(i), QList<QKeySequence>(), KGlobalAccel::NoAutoloading);
0101     }
0102 }