kwin/globalshortcuts.h
Martin Gräßlin 24b23dfc01 Beginning of global shortcut handling inside KWin
A new GlobalShortcutsManager is introduced which is responsible for
holding the registered shortcuts and triggering the matching action.

The InputRedirection checks with the GlobalShortcutManager whether a key
press event triggers a global shortcut and stops processing the event in
that case.

At the moment the GlobalShortcutsManager only supports the very basics
for KWin internal usage. External applications can not yet make usage of
the global shortcut system inside KWin.
2014-03-19 14:14:56 +01:00

118 lines
3.5 KiB
C++

/********************************************************************
KWin - the KDE window manager
This file is part of the KDE project.
Copyright (C) 2013 Martin Gräßlin <mgraesslin@kde.org>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*********************************************************************/
#ifndef KWIN_GLOBALSHORTCUTS_H
#define KWIN_GLOBALSHORTCUTS_H
// KDE
#include <KSharedConfig>
// Qt
#include <QKeySequence>
class QAction;
namespace KWin
{
class GlobalShortcut;
/**
* @brief Manager for the global shortcut system inside KWin.
*
* This class is responsible for holding all the global shortcuts and to process a key press event.
* That is trigger a shortcut if there is a match.
*
* For internal shortcut handling (those which are delivered inside KWin) QActions are used and
* triggered if the shortcut matches. For external shortcut handling a DBus interface is used.
**/
class GlobalShortcutsManager : public QObject
{
Q_OBJECT
public:
explicit GlobalShortcutsManager(QObject *parent = nullptr);
virtual ~GlobalShortcutsManager();
/**
* @brief Registers an internal global shortcut
*
* @param action The action to trigger if the shortcut is pressed
* @param shortcut The key sequence which triggers this shortcut
*/
void registerShortcut(QAction *action, const QKeySequence &shortcut);
/**
* @brief Processes a key event to decide whether a shortcut needs to be triggered.
*
* If a shortcut triggered this method returns @c true to indicate to the caller that the event
* should not be further processed. If there is no shortcut which triggered for the key, then
* @c false is returned.
*
* @param modifiers The current hold modifiers
* @param key The keysymbol which has been pressed
* @return @c true if a shortcut triggered, @c false otherwise
*/
bool processKey(Qt::KeyboardModifiers modifiers, uint32_t key);
private:
void objectDeleted(QObject *object);
QKeySequence getShortcutForAction(const QString &componentName, const QString &actionName, const QKeySequence &defaultShortcut);
QHash<Qt::KeyboardModifiers, QHash<uint32_t, GlobalShortcut*> > m_shortcuts;
KSharedConfigPtr m_config;
};
class GlobalShortcut
{
public:
virtual ~GlobalShortcut();
const QKeySequence &shortcut() const;
virtual void invoke() = 0;
protected:
GlobalShortcut(const QKeySequence &shortcut);
private:
QKeySequence m_shortcut;
};
class InternalGlobalShortcut : public GlobalShortcut
{
public:
InternalGlobalShortcut(const QKeySequence &shortcut, QAction *action);
virtual ~InternalGlobalShortcut();
void invoke() override;
QAction *action() const;
private:
QAction *m_action;
};
inline
QAction *InternalGlobalShortcut::action() const
{
return m_action;
}
inline
const QKeySequence &GlobalShortcut::shortcut() const
{
return m_shortcut;
}
} // namespace
#endif