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 }