diff --git a/outline.h b/outline.h index bdb447a301..a342454937 100644 --- a/outline.h +++ b/outline.h @@ -23,6 +23,7 @@ along with this program. If not, see . #include "xcbutils.h" #include #include +#include namespace Plasma { class FrameSvg; diff --git a/tabbox/tabbox.h b/tabbox/tabbox.h index 600b37a955..058b202d23 100644 --- a/tabbox/tabbox.h +++ b/tabbox/tabbox.h @@ -30,6 +30,7 @@ along with this program. If not, see . #include "tabbox/tabboxhandler.h" class KActionCollection; +class KConfigGroup; class QKeyEvent; namespace KWin diff --git a/useractions.cpp b/useractions.cpp index 8259e55126..61ffb45672 100755 --- a/useractions.cpp +++ b/useractions.cpp @@ -49,6 +49,7 @@ along with this program. If not, see . #include #endif +#include #include #include @@ -66,9 +67,11 @@ along with this program. If not, see . #include #include #include +#include #include #include #include +#include #include #include #include @@ -822,6 +825,102 @@ void UserActionsMenu::slotToggleOnActivity(QAction *action) #endif } +//**************************************** +// ShortcutDialog +//**************************************** +ShortcutDialog::ShortcutDialog(const QKeySequence& cut) + : _shortcut(cut) +{ + QWidget *vBoxContainer = new QWidget(this); + vBoxContainer->setLayout(new QVBoxLayout(vBoxContainer)); + vBoxContainer->layout()->addWidget(widget = new KKeySequenceWidget(vBoxContainer)); + vBoxContainer->layout()->addWidget(warning = new QLabel(vBoxContainer)); + warning->hide(); + widget->setKeySequence(cut); + + // To not check for conflicting shortcuts. The widget would use a message + // box which brings down kwin. + widget->setCheckForConflictsAgainst(KKeySequenceWidget::None); + // It's a global shortcut so don't allow multikey shortcuts + widget->setMultiKeyShortcutsAllowed(false); + + // Listen to changed shortcuts + connect( + widget, SIGNAL(keySequenceChanged(QKeySequence)), + SLOT(keySequenceChanged(QKeySequence))); + + setMainWidget(vBoxContainer); + widget->setFocus(); + + // make it a popup, so that it has the grab + XSetWindowAttributes attrs; + attrs.override_redirect = True; + XChangeWindowAttributes(display(), winId(), CWOverrideRedirect, &attrs); + setWindowFlags(Qt::Popup); +} + +void ShortcutDialog::accept() +{ + QKeySequence seq = shortcut(); + if (!seq.isEmpty()) { + if (seq[0] == Qt::Key_Escape) { + reject(); + return; + } + if (seq[0] == Qt::Key_Space + || (seq[0] & Qt::KeyboardModifierMask) == 0) { + // clear + widget->clearKeySequence(); + KDialog::accept(); + return; + } + } + KDialog::accept(); +} + +void ShortcutDialog::done(int r) +{ + KDialog::done(r); + emit dialogDone(r == Accepted); +} + +void ShortcutDialog::keySequenceChanged(const QKeySequence &seq) +{ + activateWindow(); // where is the kbd focus lost? cause of popup state? + if (_shortcut == seq) + return; // don't try to update the same + + if (seq.isEmpty()) { // clear + _shortcut = seq; + return; + } + + // Check if the key sequence is used currently + QString sc = seq.toString(); + // NOTICE - seq.toString() & the entries in "conflicting" randomly get invalidated after the next call (if no sc has been set & conflicting isn't empty?!) + QList conflicting = KGlobalAccel::getGlobalShortcutsByKey(seq); + if (!conflicting.isEmpty()) { + const KGlobalShortcutInfo &conflict = conflicting.at(0); + warning->setText(i18nc("'%1' is a keyboard shortcut like 'ctrl+w'", + "%1 is already in use", sc)); + warning->setToolTip(i18nc("keyboard shortcut '%1' is used by action '%2' in application '%3'", + "%1 is used by %2 in %3", sc, conflict.friendlyName(), conflict.componentFriendlyName())); + warning->show(); + widget->setKeySequence(shortcut()); + } else if (seq != _shortcut) { + warning->hide(); + if (KPushButton *ok = button(KDialog::Ok)) + ok->setFocus(); + } + + _shortcut = seq; +} + +QKeySequence ShortcutDialog::shortcut() const +{ + return _shortcut; +} + //**************************************** // Workspace //**************************************** diff --git a/useractions.h b/useractions.h index 33fcc334b0..3c71c4779c 100644 --- a/useractions.h +++ b/useractions.h @@ -20,10 +20,15 @@ along with this program. If not, see . #ifndef KWIN_USERACTIONS_H #define KWIN_USERACTIONS_H +// KDE +#include +// Qt #include #include +class KKeySequenceWidget; class QAction; +class QLabel; class QMenu; class QRect; @@ -254,6 +259,27 @@ private: **/ QWeakPointer m_client; }; + +class ShortcutDialog + : public KDialog +{ + Q_OBJECT +public: + explicit ShortcutDialog(const QKeySequence& cut); + virtual void accept(); + QKeySequence shortcut() const; +public Q_SLOTS: + void keySequenceChanged(const QKeySequence &seq); +signals: + void dialogDone(bool ok); +protected: + virtual void done(int r); +private: + KKeySequenceWidget* widget; + QKeySequence _shortcut; + QLabel *warning; +}; + } // namespace #endif // KWIN_USERACTIONS_H diff --git a/utils.cpp b/utils.cpp index 16c7619606..9c7f31db04 100644 --- a/utils.cpp +++ b/utils.cpp @@ -29,23 +29,15 @@ along with this program. If not, see . #include #include -#include -#include #ifndef KCMRULES -#include -#include #include #include -#include -#include #include -#include #include #include #include -#include #include @@ -407,102 +399,6 @@ Qt::KeyboardModifiers x11ToQtKeyboardModifiers(int state) } #endif - -#ifndef KCMRULES -ShortcutDialog::ShortcutDialog(const QKeySequence& cut) - : _shortcut(cut) -{ - QWidget *vBoxContainer = new QWidget(this); - vBoxContainer->setLayout(new QVBoxLayout(vBoxContainer)); - vBoxContainer->layout()->addWidget(widget = new KKeySequenceWidget(vBoxContainer)); - vBoxContainer->layout()->addWidget(warning = new QLabel(vBoxContainer)); - warning->hide(); - widget->setKeySequence(cut); - - // To not check for conflicting shortcuts. The widget would use a message - // box which brings down kwin. - widget->setCheckForConflictsAgainst(KKeySequenceWidget::None); - // It's a global shortcut so don't allow multikey shortcuts - widget->setMultiKeyShortcutsAllowed(false); - - // Listen to changed shortcuts - connect( - widget, SIGNAL(keySequenceChanged(QKeySequence)), - SLOT(keySequenceChanged(QKeySequence))); - - setMainWidget(vBoxContainer); - widget->setFocus(); - - // make it a popup, so that it has the grab - XSetWindowAttributes attrs; - attrs.override_redirect = True; - XChangeWindowAttributes(display(), winId(), CWOverrideRedirect, &attrs); - setWindowFlags(Qt::Popup); -} - -void ShortcutDialog::accept() -{ - QKeySequence seq = shortcut(); - if (!seq.isEmpty()) { - if (seq[0] == Qt::Key_Escape) { - reject(); - return; - } - if (seq[0] == Qt::Key_Space - || (seq[0] & Qt::KeyboardModifierMask) == 0) { - // clear - widget->clearKeySequence(); - KDialog::accept(); - return; - } - } - KDialog::accept(); -} - -void ShortcutDialog::done(int r) -{ - KDialog::done(r); - emit dialogDone(r == Accepted); -} - -void ShortcutDialog::keySequenceChanged(const QKeySequence &seq) -{ - activateWindow(); // where is the kbd focus lost? cause of popup state? - if (_shortcut == seq) - return; // don't try to update the same - - if (seq.isEmpty()) { // clear - _shortcut = seq; - return; - } - - // Check if the key sequence is used currently - QString sc = seq.toString(); - // NOTICE - seq.toString() & the entries in "conflicting" randomly get invalidated after the next call (if no sc has been set & conflicting isn't empty?!) - QList conflicting = KGlobalAccel::getGlobalShortcutsByKey(seq); - if (!conflicting.isEmpty()) { - const KGlobalShortcutInfo &conflict = conflicting.at(0); - warning->setText(i18nc("'%1' is a keyboard shortcut like 'ctrl+w'", - "%1 is already in use", sc)); - warning->setToolTip(i18nc("keyboard shortcut '%1' is used by action '%2' in application '%3'", - "%1 is used by %2 in %3", sc, conflict.friendlyName(), conflict.componentFriendlyName())); - warning->show(); - widget->setKeySequence(shortcut()); - } else if (seq != _shortcut) { - warning->hide(); - if (KPushButton *ok = button(KDialog::Ok)) - ok->setFocus(); - } - - _shortcut = seq; -} - -QKeySequence ShortcutDialog::shortcut() const -{ - return _shortcut; -} - -#endif //KCMRULES } // namespace #ifndef KCMRULES diff --git a/utils.h b/utils.h index 5fa103b166..d24c425ce1 100644 --- a/utils.h +++ b/utils.h @@ -29,10 +29,11 @@ along with this program. If not, see . // kwin #include // KDE -#include #include #include // Qt +#include +#include #include // X #include @@ -40,10 +41,6 @@ along with this program. If not, see . // system #include -// forward declarations -class KKeySequenceWidget; -class QLabel; - namespace KWin { @@ -179,7 +176,7 @@ public: // property. If it explicitly requests that decorations be shown // or hidden, 'got_noborder' is set to true and 'noborder' is set // appropriately. - static void readFlags(WId w, bool& got_noborder, bool& noborder, + static void readFlags(Window w, bool& got_noborder, bool& noborder, bool& resize, bool& move, bool& minimize, bool& maximize, bool& close); struct MwmHints { @@ -244,7 +241,7 @@ public: ScopedCPointer(T *p = 0) : QScopedPointer(p) {} }; -QByteArray getStringProperty(WId w, Atom prop, char separator = 0); +QByteArray getStringProperty(Window w, Atom prop, char separator = 0); void updateXTime(); void grabXServer(); void ungrabXServer(); @@ -340,30 +337,6 @@ Qt::KeyboardModifiers x11ToQtKeyboardModifiers(int state); void checkNonExistentClients(); -#ifndef KCMRULES -// Qt dialogs emit no signal when closed :( -class ShortcutDialog - : public KDialog -{ - Q_OBJECT -public: - explicit ShortcutDialog(const QKeySequence& cut); - virtual void accept(); - QKeySequence shortcut() const; -public Q_SLOTS: - void keySequenceChanged(const QKeySequence &seq); -signals: - void dialogDone(bool ok); -protected: - virtual void done(int r); -private: - KKeySequenceWidget* widget; - QKeySequence _shortcut; - QLabel *warning; -}; - -#endif //KCMRULES - } // namespace // Must be outside namespace diff --git a/workspace.h b/workspace.h index 0593865c6d..22f2f0aea2 100644 --- a/workspace.h +++ b/workspace.h @@ -53,6 +53,7 @@ class Client; class KillWindow; class RootInfo; class Rules; +class ShortcutDialog; class UserActionsMenu; class WindowRules; class Compositor; diff --git a/xcbutils.h b/xcbutils.h index 336db9f4fc..51b9357d73 100644 --- a/xcbutils.h +++ b/xcbutils.h @@ -24,6 +24,8 @@ along with this program. If not, see . #include "utils.h" #include +#include +#include #include #include