2016-03-14 09:23:52 +00:00
|
|
|
/********************************************************************
|
|
|
|
KWin - the KDE window manager
|
|
|
|
This file is part of the KDE project.
|
|
|
|
|
|
|
|
Copyright (C) 2016 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_DEBUG_CONSOLE_H
|
|
|
|
#define KWIN_DEBUG_CONSOLE_H
|
|
|
|
|
|
|
|
#include <kwin_export.h>
|
[libinput] Add a wrapper class Device for a libinput_device
Summary:
The Device class wraps all the information we can get from libinput
about the device, like whether it's a keyboard, pointer, touch, etc.
In addition some more information is queried to figure out how "useful"
a device is. For a keyboard all alphanumeric keys are checked whether
they exist, for a pointer all (normal) buttons are queried.
All the information is exposed as Q_PROPERTY and used by the
DebugConsole. The DebugConsole gained a new tab "Input Devices" which
renders all devices and their properties in a tree view. When plugging
in/out a device, the model gets reset, so it's always up to date.
The new Device class can be used in future to configure the device,
e.g. disable touch pad, set mouse acceleration, etc.
Reviewers: #plasma
Subscribers: plasma-devel
Projects: #plasma
Differential Revision: https://phabricator.kde.org/D1538
2016-05-04 11:42:26 +00:00
|
|
|
#include <config-kwin.h>
|
2016-03-30 14:23:58 +00:00
|
|
|
#include "input.h"
|
2016-03-14 09:23:52 +00:00
|
|
|
|
|
|
|
#include <QAbstractItemModel>
|
|
|
|
#include <QStyledItemDelegate>
|
|
|
|
#include <QVector>
|
|
|
|
|
2016-03-30 14:23:58 +00:00
|
|
|
class QTextEdit;
|
|
|
|
|
2016-03-14 09:23:52 +00:00
|
|
|
namespace Ui
|
|
|
|
{
|
|
|
|
class DebugConsole;
|
|
|
|
}
|
|
|
|
|
|
|
|
namespace KWin
|
|
|
|
{
|
|
|
|
|
|
|
|
class Client;
|
|
|
|
class ShellClient;
|
|
|
|
class Unmanaged;
|
2016-03-30 14:23:58 +00:00
|
|
|
class DebugConsoleFilter;
|
2016-03-14 09:23:52 +00:00
|
|
|
|
|
|
|
class KWIN_EXPORT DebugConsoleModel : public QAbstractItemModel
|
|
|
|
{
|
|
|
|
Q_OBJECT
|
|
|
|
public:
|
|
|
|
explicit DebugConsoleModel(QObject *parent = nullptr);
|
|
|
|
virtual ~DebugConsoleModel();
|
|
|
|
|
|
|
|
|
|
|
|
int columnCount(const QModelIndex &parent) const override;
|
|
|
|
QVariant data(const QModelIndex &index, int role) const override;
|
|
|
|
QModelIndex index(int row, int column, const QModelIndex & parent) const override;
|
|
|
|
int rowCount(const QModelIndex &parent) const override;
|
|
|
|
QModelIndex parent(const QModelIndex &child) const override;
|
|
|
|
|
|
|
|
private:
|
|
|
|
template <class T>
|
|
|
|
QModelIndex indexForClient(int row, int column, const QVector<T*> &clients, int id) const;
|
|
|
|
template <class T>
|
|
|
|
QModelIndex indexForProperty(int row, int column, const QModelIndex &parent, T *(DebugConsoleModel::*filter)(const QModelIndex&) const) const;
|
|
|
|
template <class T>
|
|
|
|
int propertyCount(const QModelIndex &parent, T *(DebugConsoleModel::*filter)(const QModelIndex&) const) const;
|
|
|
|
QVariant propertyData(QObject *object, const QModelIndex &index, int role) const;
|
|
|
|
template <class T>
|
|
|
|
QVariant clientData(const QModelIndex &index, int role, const QVector<T*> clients) const;
|
|
|
|
template <class T>
|
|
|
|
void add(int parentRow, QVector<T*> &clients, T *client);
|
|
|
|
template <class T>
|
|
|
|
void remove(int parentRow, QVector<T*> &clients, T *client);
|
|
|
|
ShellClient *shellClient(const QModelIndex &index) const;
|
|
|
|
ShellClient *internalClient(const QModelIndex &index) const;
|
|
|
|
Client *x11Client(const QModelIndex &index) const;
|
|
|
|
Unmanaged *unmanaged(const QModelIndex &index) const;
|
|
|
|
int topLevelRowCount() const;
|
|
|
|
|
|
|
|
QVector<ShellClient*> m_shellClients;
|
|
|
|
QVector<ShellClient*> m_internalClients;
|
|
|
|
QVector<Client*> m_x11Clients;
|
|
|
|
QVector<Unmanaged*> m_unmanageds;
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
class DebugConsoleDelegate : public QStyledItemDelegate
|
|
|
|
{
|
|
|
|
Q_OBJECT
|
|
|
|
public:
|
|
|
|
explicit DebugConsoleDelegate(QObject *parent = nullptr);
|
|
|
|
virtual ~DebugConsoleDelegate();
|
|
|
|
|
|
|
|
QString displayText(const QVariant &value, const QLocale &locale) const override;
|
|
|
|
};
|
|
|
|
|
2016-10-04 11:37:25 +00:00
|
|
|
class KWIN_EXPORT DebugConsole : public QWidget
|
2016-03-14 09:23:52 +00:00
|
|
|
{
|
|
|
|
Q_OBJECT
|
|
|
|
public:
|
|
|
|
DebugConsole();
|
|
|
|
virtual ~DebugConsole();
|
|
|
|
|
2016-10-04 12:06:01 +00:00
|
|
|
protected:
|
|
|
|
void showEvent(QShowEvent *event) override;
|
|
|
|
|
2016-03-14 09:23:52 +00:00
|
|
|
private:
|
2016-08-10 06:25:20 +00:00
|
|
|
void initGLTab();
|
2016-11-16 10:18:36 +00:00
|
|
|
void updateKeyboardTab();
|
2016-08-10 06:25:20 +00:00
|
|
|
|
2016-03-14 09:23:52 +00:00
|
|
|
QScopedPointer<Ui::DebugConsole> m_ui;
|
2016-03-30 14:23:58 +00:00
|
|
|
QScopedPointer<DebugConsoleFilter> m_inputFilter;
|
2016-03-14 09:23:52 +00:00
|
|
|
};
|
|
|
|
|
2016-03-23 10:25:58 +00:00
|
|
|
class SurfaceTreeModel : public QAbstractItemModel
|
|
|
|
{
|
|
|
|
Q_OBJECT
|
|
|
|
public:
|
|
|
|
explicit SurfaceTreeModel(QObject *parent = nullptr);
|
|
|
|
virtual ~SurfaceTreeModel();
|
|
|
|
|
|
|
|
int columnCount(const QModelIndex &parent) const override;
|
|
|
|
QVariant data(const QModelIndex &index, int role) const override;
|
|
|
|
QModelIndex index(int row, int column, const QModelIndex & parent) const override;
|
|
|
|
int rowCount(const QModelIndex &parent) const override;
|
|
|
|
QModelIndex parent(const QModelIndex &child) const override;
|
|
|
|
};
|
|
|
|
|
2016-03-30 14:23:58 +00:00
|
|
|
class DebugConsoleFilter : public InputEventFilter
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
explicit DebugConsoleFilter(QTextEdit *textEdit);
|
|
|
|
virtual ~DebugConsoleFilter();
|
|
|
|
|
|
|
|
bool pointerEvent(QMouseEvent *event, quint32 nativeButton) override;
|
|
|
|
bool wheelEvent(QWheelEvent *event) override;
|
|
|
|
bool keyEvent(QKeyEvent *event) override;
|
|
|
|
bool touchDown(quint32 id, const QPointF &pos, quint32 time) override;
|
|
|
|
bool touchMotion(quint32 id, const QPointF &pos, quint32 time) override;
|
|
|
|
bool touchUp(quint32 id, quint32 time) override;
|
|
|
|
|
2016-08-05 12:35:33 +00:00
|
|
|
bool pinchGestureBegin(int fingerCount, quint32 time) override;
|
|
|
|
bool pinchGestureUpdate(qreal scale, qreal angleDelta, const QSizeF &delta, quint32 time) override;
|
|
|
|
bool pinchGestureEnd(quint32 time) override;
|
|
|
|
bool pinchGestureCancelled(quint32 time) override;
|
|
|
|
|
|
|
|
bool swipeGestureBegin(int fingerCount, quint32 time) override;
|
|
|
|
bool swipeGestureUpdate(const QSizeF &delta, quint32 time) override;
|
|
|
|
bool swipeGestureEnd(quint32 time) override;
|
|
|
|
bool swipeGestureCancelled(quint32 time) override;
|
|
|
|
|
2016-03-30 14:23:58 +00:00
|
|
|
private:
|
|
|
|
QTextEdit *m_textEdit;
|
|
|
|
};
|
|
|
|
|
[libinput] Add a wrapper class Device for a libinput_device
Summary:
The Device class wraps all the information we can get from libinput
about the device, like whether it's a keyboard, pointer, touch, etc.
In addition some more information is queried to figure out how "useful"
a device is. For a keyboard all alphanumeric keys are checked whether
they exist, for a pointer all (normal) buttons are queried.
All the information is exposed as Q_PROPERTY and used by the
DebugConsole. The DebugConsole gained a new tab "Input Devices" which
renders all devices and their properties in a tree view. When plugging
in/out a device, the model gets reset, so it's always up to date.
The new Device class can be used in future to configure the device,
e.g. disable touch pad, set mouse acceleration, etc.
Reviewers: #plasma
Subscribers: plasma-devel
Projects: #plasma
Differential Revision: https://phabricator.kde.org/D1538
2016-05-04 11:42:26 +00:00
|
|
|
#if HAVE_INPUT
|
2016-05-06 12:48:25 +00:00
|
|
|
|
|
|
|
namespace LibInput
|
|
|
|
{
|
|
|
|
class Device;
|
|
|
|
}
|
|
|
|
|
[libinput] Add a wrapper class Device for a libinput_device
Summary:
The Device class wraps all the information we can get from libinput
about the device, like whether it's a keyboard, pointer, touch, etc.
In addition some more information is queried to figure out how "useful"
a device is. For a keyboard all alphanumeric keys are checked whether
they exist, for a pointer all (normal) buttons are queried.
All the information is exposed as Q_PROPERTY and used by the
DebugConsole. The DebugConsole gained a new tab "Input Devices" which
renders all devices and their properties in a tree view. When plugging
in/out a device, the model gets reset, so it's always up to date.
The new Device class can be used in future to configure the device,
e.g. disable touch pad, set mouse acceleration, etc.
Reviewers: #plasma
Subscribers: plasma-devel
Projects: #plasma
Differential Revision: https://phabricator.kde.org/D1538
2016-05-04 11:42:26 +00:00
|
|
|
class InputDeviceModel : public QAbstractItemModel
|
|
|
|
{
|
|
|
|
Q_OBJECT
|
|
|
|
public:
|
|
|
|
explicit InputDeviceModel(QObject *parent = nullptr);
|
|
|
|
virtual ~InputDeviceModel();
|
|
|
|
|
|
|
|
int columnCount(const QModelIndex &parent) const override;
|
|
|
|
QVariant data(const QModelIndex &index, int role) const override;
|
|
|
|
QModelIndex index(int row, int column, const QModelIndex & parent) const override;
|
|
|
|
int rowCount(const QModelIndex &parent) const override;
|
|
|
|
QModelIndex parent(const QModelIndex &child) const override;
|
2016-05-06 12:48:25 +00:00
|
|
|
|
|
|
|
private:
|
|
|
|
void setupDeviceConnections(LibInput::Device *device);
|
|
|
|
QVector<LibInput::Device*> m_devices;
|
[libinput] Add a wrapper class Device for a libinput_device
Summary:
The Device class wraps all the information we can get from libinput
about the device, like whether it's a keyboard, pointer, touch, etc.
In addition some more information is queried to figure out how "useful"
a device is. For a keyboard all alphanumeric keys are checked whether
they exist, for a pointer all (normal) buttons are queried.
All the information is exposed as Q_PROPERTY and used by the
DebugConsole. The DebugConsole gained a new tab "Input Devices" which
renders all devices and their properties in a tree view. When plugging
in/out a device, the model gets reset, so it's always up to date.
The new Device class can be used in future to configure the device,
e.g. disable touch pad, set mouse acceleration, etc.
Reviewers: #plasma
Subscribers: plasma-devel
Projects: #plasma
Differential Revision: https://phabricator.kde.org/D1538
2016-05-04 11:42:26 +00:00
|
|
|
};
|
|
|
|
#endif
|
|
|
|
|
2016-03-14 09:23:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|