Share implementation for adding shortcut (keyboard/pointer/axis)

Using templated function instead of copy and pasted code.
This commit is contained in:
Martin Gräßlin 2013-07-16 18:50:10 +02:00
parent 19c5a06fe9
commit c5def47bf5
2 changed files with 21 additions and 32 deletions

View file

@ -58,10 +58,11 @@ GlobalShortcut::~GlobalShortcut()
{ {
} }
InternalGlobalShortcut::InternalGlobalShortcut(const QKeySequence &shortcut, QAction *action) InternalGlobalShortcut::InternalGlobalShortcut(Qt::KeyboardModifiers modifiers, const QKeySequence &shortcut, QAction *action)
: GlobalShortcut(shortcut) : GlobalShortcut(shortcut)
, m_action(action) , m_action(action)
{ {
Q_UNUSED(modifiers)
} }
InternalGlobalShortcut::InternalGlobalShortcut(Qt::KeyboardModifiers pointerButtonModifiers, Qt::MouseButtons pointerButtons, QAction *action) InternalGlobalShortcut::InternalGlobalShortcut(Qt::KeyboardModifiers pointerButtonModifiers, Qt::MouseButtons pointerButtons, QAction *action)
@ -133,6 +134,21 @@ void GlobalShortcutsManager::objectDeleted(QObject *object)
handleDestroyedAction(object, m_axisShortcuts); handleDestroyedAction(object, m_axisShortcuts);
} }
template <typename T, typename R>
void addShortcut(T &shortcuts, QAction *action, Qt::KeyboardModifiers modifiers, R value)
{
GlobalShortcut *cut = new InternalGlobalShortcut(modifiers, value, action);
auto it = shortcuts.find(modifiers);
if (it != shortcuts.end()) {
// TODO: check if shortcut already exists
(*it).insert(value, cut);
} else {
QHash<R, GlobalShortcut*> s;
s.insert(value, cut);
shortcuts.insert(modifiers, s);
}
}
void GlobalShortcutsManager::registerShortcut(QAction *action, const QKeySequence &shortcut) void GlobalShortcutsManager::registerShortcut(QAction *action, const QKeySequence &shortcut)
{ {
QKeySequence s = getShortcutForAction(KWIN_NAME, action->objectName(), shortcut); QKeySequence s = getShortcutForAction(KWIN_NAME, action->objectName(), shortcut);
@ -158,46 +174,19 @@ void GlobalShortcutsManager::registerShortcut(QAction *action, const QKeySequenc
if (!KKeyServer::keyQtToSymX(keys, &keysym)) { if (!KKeyServer::keyQtToSymX(keys, &keysym)) {
return; return;
} }
GlobalShortcut *cut = new InternalGlobalShortcut(s, action); addShortcut(m_shortcuts, action, mods, static_cast<uint32_t>(keysym));
auto it = m_shortcuts.find(mods);
if (it != m_shortcuts.end()) {
// TODO: check if key already exists?
(*it).insert(keysym, cut);
} else {
QHash<uint32_t, GlobalShortcut*> shortcuts;
shortcuts.insert(keysym, cut);
m_shortcuts.insert(mods, shortcuts);
}
connect(action, &QAction::destroyed, this, &GlobalShortcutsManager::objectDeleted); connect(action, &QAction::destroyed, this, &GlobalShortcutsManager::objectDeleted);
} }
void GlobalShortcutsManager::registerPointerShortcut(QAction *action, Qt::KeyboardModifiers modifiers, Qt::MouseButtons pointerButtons) void GlobalShortcutsManager::registerPointerShortcut(QAction *action, Qt::KeyboardModifiers modifiers, Qt::MouseButtons pointerButtons)
{ {
GlobalShortcut *cut = new InternalGlobalShortcut(modifiers, pointerButtons, action); addShortcut(m_pointerShortcuts, action, modifiers, pointerButtons);
auto it = m_pointerShortcuts.find(modifiers);
if (it != m_pointerShortcuts.end()) {
// TODO: check if shortcut already exists
(*it).insert(pointerButtons, cut);
} else {
QHash<Qt::MouseButtons, GlobalShortcut*> shortcuts;
shortcuts.insert(pointerButtons, cut);
m_pointerShortcuts.insert(modifiers, shortcuts);
}
connect(action, &QAction::destroyed, this, &GlobalShortcutsManager::objectDeleted); connect(action, &QAction::destroyed, this, &GlobalShortcutsManager::objectDeleted);
} }
void GlobalShortcutsManager::registerAxisShortcut(QAction *action, Qt::KeyboardModifiers modifiers, PointerAxisDirection axis) void GlobalShortcutsManager::registerAxisShortcut(QAction *action, Qt::KeyboardModifiers modifiers, PointerAxisDirection axis)
{ {
GlobalShortcut *cut = new InternalGlobalShortcut(modifiers, axis, action); addShortcut(m_axisShortcuts, action, modifiers, axis);
auto it = m_axisShortcuts.find(modifiers);
if (it != m_axisShortcuts.end()) {
// TODO: check if shortcut already exists
(*it).insert(axis, cut);
} else {
QHash<PointerAxisDirection, GlobalShortcut*> shortcuts;
shortcuts.insert(axis, cut);
m_axisShortcuts.insert(modifiers, shortcuts);
}
connect(action, &QAction::destroyed, this, &GlobalShortcutsManager::objectDeleted); connect(action, &QAction::destroyed, this, &GlobalShortcutsManager::objectDeleted);
} }

View file

@ -131,7 +131,7 @@ private:
class InternalGlobalShortcut : public GlobalShortcut class InternalGlobalShortcut : public GlobalShortcut
{ {
public: public:
InternalGlobalShortcut(const QKeySequence &shortcut, QAction *action); InternalGlobalShortcut(Qt::KeyboardModifiers modifiers, const QKeySequence &shortcut, QAction *action);
InternalGlobalShortcut(Qt::KeyboardModifiers pointerButtonModifiers, Qt::MouseButtons pointerButtons, QAction *action); InternalGlobalShortcut(Qt::KeyboardModifiers pointerButtonModifiers, Qt::MouseButtons pointerButtons, QAction *action);
InternalGlobalShortcut(Qt::KeyboardModifiers axisModifiers, PointerAxisDirection axis, QAction *action); InternalGlobalShortcut(Qt::KeyboardModifiers axisModifiers, PointerAxisDirection axis, QAction *action);
virtual ~InternalGlobalShortcut(); virtual ~InternalGlobalShortcut();