kwin/debug_console.h
Vlad Zagorodniy bebe81209c Port QPA away from Wayland
Summary:
So far wayland was used by internal clients to submit raster buffers
and position themselves on the screen. While we didn't have issues with
submitting raster buffers, there were some problems with positioning
task switchers. Mostly, because we had effectively two paths that may
alter geometry.

A better approach to deal with internal clients is to let our QPA use
kwin core api directly. This way we can eliminate unnecessary roundtrips
as well make geometry handling much easier and comprehensible.

The last missing piece is shadows. Both Plasma::Dialog and Breeze widget
style use platform-specific APIs to set and unset shadows. We need to
add shadows API to KWindowSystem. Even though some internal clients lack
drop-shadows at the moment, I don't consider it to be a blocker. We can
add shadows back later on.

CCBUG: 386304

Reviewers: #kwin, davidedmundson, romangg

Reviewed By: #kwin, romangg

Subscribers: romangg, kwin

Tags: #kwin

Maniphest Tasks: T9600

Differential Revision: https://phabricator.kde.org/D22810
2019-09-23 17:28:56 +03:00

185 lines
5.9 KiB
C++

/********************************************************************
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>
#include <config-kwin.h>
#include "input.h"
#include "input_event_spy.h"
#include <QAbstractItemModel>
#include <QStyledItemDelegate>
#include <QVector>
class QTextEdit;
namespace Ui
{
class DebugConsole;
}
namespace KWin
{
class Client;
class InternalClient;
class ShellClient;
class Unmanaged;
class DebugConsoleFilter;
class KWIN_EXPORT DebugConsoleModel : public QAbstractItemModel
{
Q_OBJECT
public:
explicit DebugConsoleModel(QObject *parent = nullptr);
~DebugConsoleModel() override;
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;
InternalClient *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<InternalClient*> m_internalClients;
QVector<Client*> m_x11Clients;
QVector<Unmanaged*> m_unmanageds;
};
class DebugConsoleDelegate : public QStyledItemDelegate
{
Q_OBJECT
public:
explicit DebugConsoleDelegate(QObject *parent = nullptr);
~DebugConsoleDelegate() override;
QString displayText(const QVariant &value, const QLocale &locale) const override;
};
class KWIN_EXPORT DebugConsole : public QWidget
{
Q_OBJECT
public:
DebugConsole();
~DebugConsole() override;
protected:
void showEvent(QShowEvent *event) override;
private:
void initGLTab();
void updateKeyboardTab();
QScopedPointer<Ui::DebugConsole> m_ui;
QScopedPointer<DebugConsoleFilter> m_inputFilter;
};
class SurfaceTreeModel : public QAbstractItemModel
{
Q_OBJECT
public:
explicit SurfaceTreeModel(QObject *parent = nullptr);
~SurfaceTreeModel() override;
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;
};
class DebugConsoleFilter : public InputEventSpy
{
public:
explicit DebugConsoleFilter(QTextEdit *textEdit);
~DebugConsoleFilter() override;
void pointerEvent(MouseEvent *event) override;
void wheelEvent(WheelEvent *event) override;
void keyEvent(KeyEvent *event) override;
void touchDown(qint32 id, const QPointF &pos, quint32 time) override;
void touchMotion(qint32 id, const QPointF &pos, quint32 time) override;
void touchUp(qint32 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;
void switchEvent(SwitchEvent *event) override;
private:
QTextEdit *m_textEdit;
};
namespace LibInput
{
class Device;
}
class InputDeviceModel : public QAbstractItemModel
{
Q_OBJECT
public:
explicit InputDeviceModel(QObject *parent = nullptr);
~InputDeviceModel() override;
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:
void setupDeviceConnections(LibInput::Device *device);
QVector<LibInput::Device*> m_devices;
};
}
#endif