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 }