File indexing completed on 2024-05-12 05:35:41

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 
0029     QAction *lastUsedLayoutAction = addAction(QStringLiteral("Switch to Last-Used Keyboard Layout"));
0030     lastUsedLayoutAction->setText(i18n("Switch to Last-Used Keyboard Layout"));
0031     KGlobalAccel::self()->setShortcut(lastUsedLayoutAction, QList<QKeySequence>() << QKeySequence(Qt::META | Qt::ALT | Qt::Key_L), KGlobalAccel::Autoloading);
0032 
0033     if (configAction) {
0034         toggleAction->setProperty("isConfigurationAction", true);
0035         lastUsedLayoutAction->setProperty("isConfigurationAction", true);
0036     }
0037 }
0038 
0039 KeyboardLayoutActionCollection::~KeyboardLayoutActionCollection()
0040 {
0041     clear();
0042 }
0043 
0044 QAction *KeyboardLayoutActionCollection::getToggleAction()
0045 {
0046     return action(0);
0047 }
0048 
0049 QAction *KeyboardLayoutActionCollection::getLastUsedLayoutAction()
0050 {
0051     return action(1);
0052 }
0053 
0054 QAction *KeyboardLayoutActionCollection::createLayoutShortcutActon(const LayoutUnit &layoutUnit, int layoutIndex, const Rules *rules, bool autoload)
0055 {
0056     QString longLayoutName = Flags::getLongText(layoutUnit, rules);
0057     QString actionName = QStringLiteral("Switch keyboard layout to ");
0058     actionName += longLayoutName;
0059     QAction *action = addAction(actionName);
0060     action->setText(i18n("Switch keyboard layout to %1", longLayoutName));
0061     KGlobalAccel::GlobalShortcutLoading loading = autoload ? KGlobalAccel::Autoloading : KGlobalAccel::NoAutoloading;
0062     QList<QKeySequence> shortcuts;
0063     if (!autoload) {
0064         shortcuts << layoutUnit.getShortcut();
0065     }
0066     KGlobalAccel::self()->setShortcut(action, shortcuts, loading);
0067     action->setData(layoutIndex);
0068     if (configAction) {
0069         action->setProperty("isConfigurationAction", true);
0070     }
0071     return action;
0072 }
0073 
0074 void KeyboardLayoutActionCollection::setToggleShortcut(const QKeySequence &keySequence)
0075 {
0076     KGlobalAccel::self()->setShortcut(getToggleAction(), QList<QKeySequence>() << keySequence, KGlobalAccel::NoAutoloading);
0077 }
0078 
0079 void KeyboardLayoutActionCollection::setLastUsedLayoutShortcut(const QKeySequence &keySequence)
0080 {
0081     KGlobalAccel::self()->setShortcut(getLastUsedLayoutAction(), QList<QKeySequence>() << keySequence, KGlobalAccel::NoAutoloading);
0082 }
0083 
0084 void KeyboardLayoutActionCollection::setLayoutShortcuts(QList<LayoutUnit> &layoutUnits, const Rules *rules)
0085 {
0086     for (int i = 0; i < layoutUnits.size(); ++i) {
0087         const LayoutUnit &layoutUnit = layoutUnits.at(i);
0088         if (!layoutUnit.getShortcut().isEmpty()) {
0089             createLayoutShortcutActon(layoutUnit, i, rules, false);
0090         }
0091     }
0092     qCDebug(KCM_KEYBOARD) << "Cleaning component shortcuts on save" << KGlobalAccel::cleanComponent(QStringLiteral("KDE Keyboard Layout Switcher"));
0093 }
0094 
0095 void KeyboardLayoutActionCollection::loadLayoutShortcuts(QList<LayoutUnit> &layoutUnits, const Rules *rules)
0096 {
0097     for (int i = 0; i < layoutUnits.size(); ++i) {
0098         LayoutUnit &layoutUnit = layoutUnits[i];
0099         QAction *action = createLayoutShortcutActon(layoutUnit, i, rules, true);
0100         const auto shortcut = KGlobalAccel::self()->shortcut(action);
0101         if (!shortcut.isEmpty()) {
0102             qCDebug(KCM_KEYBOARD, ) << "Restored shortcut for" << layoutUnit.toString() << shortcut.first();
0103             layoutUnit.setShortcut(shortcut.first());
0104         } else {
0105             qCDebug(KCM_KEYBOARD, ) << "Skipping empty shortcut for" << layoutUnit.toString();
0106             removeAction(action);
0107         }
0108     }
0109     qCDebug(KCM_KEYBOARD) << "Cleaning component shortcuts on load" << KGlobalAccel::cleanComponent(QStringLiteral("KDE Keyboard Layout Switcher"));
0110 }
0111 
0112 void KeyboardLayoutActionCollection::resetLayoutShortcuts()
0113 {
0114     for (int i = 2; i < actions().size(); i++) {
0115         KGlobalAccel::self()->setShortcut(action(i), QList<QKeySequence>(), KGlobalAccel::NoAutoloading);
0116         KGlobalAccel::self()->setDefaultShortcut(action(i), QList<QKeySequence>(), KGlobalAccel::NoAutoloading);
0117     }
0118 }