kwin/kcmkwin/kwinrules/detectwidget.h
Martin Gräßlin 7d21d612fe [kwinrules] Use native event filter for mouse button release detection
The event filtering on Qt level does not work any more. The information
is not updated properly. Grabbing the mouse through QWidget resets the
cursor shape to the default shape, so it cannot be used.

As we don't want Qt to ever see the events it's a good idea to use a
native event filter to filter the events away before they are delivered
to Qt.

To simplify the handling the grabber widget is put into a QScopedPointer.
2013-09-30 09:53:01 +02:00

91 lines
2.4 KiB
C++

/*
* Copyright (c) 2004 Lubos Lunak <l.lunak@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, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef __DETECTWIDGET_H__
#define __DETECTWIDGET_H__
#include <KDialog>
#include <kwindowsystem.h>
#include <QAbstractNativeEventFilter>
#include "../../rules.h"
//Added by qt3to4:
#include <QEvent>
#include <QByteArray>
#include "ui_detectwidget.h"
namespace KWin
{
class DetectWidget
: public QWidget, public Ui_DetectWidget
{
Q_OBJECT
public:
explicit DetectWidget(QWidget* parent = NULL);
};
class DetectDialog
: public KDialog, public QAbstractNativeEventFilter
{
Q_OBJECT
public:
explicit DetectDialog(QWidget* parent = NULL, const char* name = NULL);
void detect(WId window, int secs = 0);
QByteArray selectedClass() const;
bool selectedWholeClass() const;
QByteArray selectedRole() const;
bool selectedWholeApp() const;
NET::WindowType selectedType() const;
QString selectedTitle() const;
Rules::StringMatch titleMatch() const;
QByteArray selectedMachine() const;
const KWindowInfo& windowInfo() const;
virtual bool nativeEventFilter(const QByteArray& eventType, void* message, long int* result) override;
Q_SIGNALS:
void detectionDone(bool);
private Q_SLOTS:
void selectWindow();
private:
void readWindow(WId window);
void executeDialog();
WId findWindow();
QByteArray wmclass_class;
QByteArray wmclass_name;
QByteArray role;
NET::WindowType type;
QString title;
QByteArray extrarole;
QByteArray machine;
DetectWidget* widget;
QScopedPointer<KDialog> grabber;
KWindowInfo info;
};
inline
const KWindowInfo& DetectDialog::windowInfo() const
{
return info;
}
} // namespace
#endif