diff options
author | Ivan Vizir <define-true-false@yandex.com> | 2013-03-10 13:16:46 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-07-01 15:56:14 +0200 |
commit | 8f3d85814ac5df01a4b633955d1f7f317248fdca (patch) | |
tree | a6fe11a1abad2d68d2558d8c440570f081652f4d /src/winextras/qwineventfilter.cpp | |
parent | 447815121b25c2de61eba8446ad5db57ae739b50 (diff) |
Jump Lists, overlay icon, progress indicator, DWM.
Implemented the most widely used features and QML wrappers for them.
Change-Id: I0ac1b174b7f4eb355d097e71255e8d123141b369
Reviewed-by: Ivan Vizir <define-true-false@yandex.com>
Reviewed-by: Jake Petroules <jake.petroules@petroules.com>
Reviewed-by: Joerg Bornemann <joerg.bornemann@digia.com>
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>
Diffstat (limited to 'src/winextras/qwineventfilter.cpp')
-rw-r--r-- | src/winextras/qwineventfilter.cpp | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/src/winextras/qwineventfilter.cpp b/src/winextras/qwineventfilter.cpp new file mode 100644 index 0000000..20c4c35 --- /dev/null +++ b/src/winextras/qwineventfilter.cpp @@ -0,0 +1,130 @@ +/**************************************************************************** + ** + ** Copyright (C) 2013 Ivan Vizir <define-true-false@yandex.com> + ** Contact: http://www.qt-project.org/legal + ** + ** This file is part of QtWinExtras in the Qt Toolkit. + ** + ** $QT_BEGIN_LICENSE:LGPL$ + ** Commercial License Usage + ** Licensees holding valid commercial Qt licenses may use this file in + ** accordance with the commercial license agreement provided with the + ** Software or, alternatively, in accordance with the terms contained in + ** a written agreement between you and Digia. For licensing terms and + ** conditions see http://qt.digia.com/licensing. For further information + ** use the contact form at http://qt.digia.com/contact-us. + ** + ** GNU Lesser General Public License Usage + ** Alternatively, this file may be used under the terms of the GNU Lesser + ** General Public License version 2.1 as published by the Free Software + ** Foundation and appearing in the file LICENSE.LGPL included in the + ** packaging of this file. Please review the following information to + ** ensure the GNU Lesser General Public License version 2.1 requirements + ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. + ** + ** In addition, as a special exception, Digia gives you certain additional + ** rights. These rights are described in the Digia Qt LGPL Exception + ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. + ** + ** GNU General Public License Usage + ** Alternatively, this file may be used under the terms of the GNU + ** General Public License version 3.0 as published by the Free Software + ** Foundation and appearing in the file LICENSE.GPL included in the + ** packaging of this file. Please review the following information to + ** ensure the GNU General Public License version 3.0 requirements will be + ** met: http://www.gnu.org/copyleft/gpl.html. + ** + ** + ** $QT_END_LICENSE$ + ** + ****************************************************************************/ + +#include "qwineventfilter_p.h" +#include "qwincolorizationcolorchangeevent.h" +#include "qwincompositionstatechangeevent.h" +#include "qwinthemechangeevent.h" +#include "qwintaskbarbuttoncreatedevent.h" +#include "qwinfunctions.h" +#include <QGuiApplication> +#include <QWindow> + +#ifndef WM_DWMCOLORIZATIONCOLORCHANGED +# define WM_DWMCOLORIZATIONCOLORCHANGED 0x0320 +#endif + +#ifndef WM_DWMCOMPOSITIONCHANGED +# define WM_DWMCOMPOSITIONCHANGED 0x031E +#endif + +QWinEventFilter *QWinEventFilter::instance = 0; + +QWinEventFilter::QWinEventFilter() : + tbButtonCreatedMsgId(RegisterWindowMessageW(L"TaskbarButtonCreated")) +{ +} + +QWinEventFilter::~QWinEventFilter() +{ + instance = 0; +} + +bool QWinEventFilter::nativeEventFilter(const QByteArray &, void *message, long *result) +{ + MSG *msg = static_cast<MSG *>(message); + bool filterOut = false; + + QEvent *event = 0; + QWindow *window = 0; + switch (msg->message) { + case WM_DWMCOLORIZATIONCOLORCHANGED : + event = new QWinColorizationColorChangeEvent(msg->wParam, msg->lParam); + break; + case WM_DWMCOMPOSITIONCHANGED : + event = new QWinCompositionStateChangeEvent(QWinExtras::isCompositionEnabled()); + break; + case WM_THEMECHANGED : + event = new QWinThemeChangeEvent(); + break; + default : + if (tbButtonCreatedMsgId == msg->message) { + event = new QWinTaskbarButtonCreatedEvent; + filterOut = true; + } + break; + } + + if (event) { + window = findWindow(msg->hwnd); + if (window) + qApp->sendEvent(window, event); + else + delete event; + } + + if (filterOut && result) { + *result = 0; + } + + return filterOut; +} + +void QWinEventFilter::setup() +{ + if (!instance) { + instance = new QWinEventFilter; + qApp->installNativeEventFilter(instance); + } +} + +QWindow *QWinEventFilter::findWindow(HWND handle) +{ + QWindow *w = 0; + QWindowList list = qApp->topLevelWindows(); + for (int i = 0; i < list.size(); i++) { + if (list.at(i)->winId() == reinterpret_cast<WId>(handle)) { + w = list.at(i); + break; + } + } + return w; +} |