2016-03-14 12:23:52 +03: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 14:42:26 +03:00
|
|
|
#include <config-kwin.h>
|
2016-03-30 17:23:58 +03:00
|
|
|
#include "input.h"
|
2017-01-01 21:06:04 +03:00
|
|
|
#include "input_event_spy.h"
|
2016-03-14 12:23:52 +03:00
|
|
|
|
|
|
|
#include <QAbstractItemModel>
|
|
|
|
#include <QStyledItemDelegate>
|
|
|
|
#include <QVector>
|
|
|
|
|
2016-03-30 17:23:58 +03:00
|
|
|
class QTextEdit;
|
|
|
|
|
2016-03-14 12:23:52 +03:00
|
|
|
namespace Ui
|
|
|
|
{
|
|
|
|
class DebugConsole;
|
|
|
|
}
|
|
|
|
|
|
|
|
namespace KWin
|
|
|
|
{
|
|
|
|
|
|
|
|
class Client;
|
|
|
|
class ShellClient;
|
|
|
|
class Unmanaged;
|
2016-03-30 17:23:58 +03:00
|
|
|
class DebugConsoleFilter;
|
2016-03-14 12:23:52 +03: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 14:37:25 +03:00
|
|
|
class KWIN_EXPORT DebugConsole : public QWidget
|
2016-03-14 12:23:52 +03:00
|
|
|
{
|
|
|
|
Q_OBJECT
|
|
|
|
public:
|
|
|
|
DebugConsole();
|
|
|
|
virtual ~DebugConsole();
|
|
|
|
|
2016-10-04 15:06:01 +03:00
|
|
|
protected:
|
|
|
|
void showEvent(QShowEvent *event) override;
|
|
|
|
|
2016-03-14 12:23:52 +03:00
|
|
|
private:
|
2016-08-10 09:25:20 +03:00
|
|
|
void initGLTab();
|
2016-11-16 13:18:36 +03:00
|
|
|
void updateKeyboardTab();
|
2016-08-10 09:25:20 +03:00
|
|
|
|
2016-03-14 12:23:52 +03:00
|
|
|
QScopedPointer<Ui::DebugConsole> m_ui;
|
2016-03-30 17:23:58 +03:00
|
|
|
QScopedPointer<DebugConsoleFilter> m_inputFilter;
|
2016-03-14 12:23:52 +03:00
|
|
|
};
|
|
|
|
|
2016-03-23 13:25:58 +03: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;
|
|
|
|
};
|
|
|
|
|
2017-01-01 21:06:04 +03:00
|
|
|
class DebugConsoleFilter : public InputEventSpy
|
2016-03-30 17:23:58 +03:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
explicit DebugConsoleFilter(QTextEdit *textEdit);
|
|
|
|
virtual ~DebugConsoleFilter();
|
|
|
|
|
2017-01-01 21:06:04 +03:00
|
|
|
void pointerEvent(MouseEvent *event) override;
|
|
|
|
void wheelEvent(WheelEvent *event) override;
|
|
|
|
void keyEvent(KeyEvent *event) override;
|
|
|
|
void touchDown(quint32 id, const QPointF &pos, quint32 time) override;
|
|
|
|
void touchMotion(quint32 id, const QPointF &pos, quint32 time) override;
|
|
|
|
void touchUp(quint32 id, quint32 time) override;
|
|
|
|
|
|
|
|
void pinchGestureBegin(int fingerCount, quint32 time) override;
|
|
|
|
void pinchGestureUpdate(qreal scale, qreal angleDelta, const QSizeF &delta, quint32 time) override;
|
|
|
|
void pinchGestureEnd(quint32 time) override;
|
|
|
|
void pinchGestureCancelled(quint32 time) override;
|
|
|
|
|
|
|
|
void swipeGestureBegin(int fingerCount, quint32 time) override;
|
|
|
|
void swipeGestureUpdate(const QSizeF &delta, quint32 time) override;
|
|
|
|
void swipeGestureEnd(quint32 time) override;
|
|
|
|
void swipeGestureCancelled(quint32 time) override;
|
2016-08-05 15:35:33 +03:00
|
|
|
|
2017-12-27 22:25:36 +03:00
|
|
|
void switchEvent(SwitchEvent *event) override;
|
|
|
|
|
2016-03-30 17:23:58 +03: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 14:42:26 +03:00
|
|
|
#if HAVE_INPUT
|
2016-05-06 15:48:25 +03: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 14:42:26 +03: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 15:48:25 +03: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 14:42:26 +03:00
|
|
|
};
|
|
|
|
#endif
|
|
|
|
|
2016-03-14 12:23:52 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|