kwin/src/item.h
Vlad Zahorodnii 47113e09b8 scene: Introduce window items
Currently, dealing with sub-surfaces is very difficult due to the scene
design being heavily influenced by X11 requirements.

The goal of this change is to re-work scene abstractions to make improving
the wayland support easier.

The Item class is based on the QQuickItem class. My hope is that one day
we will be able to transition to QtQuick for painting scene, but in
meanwhile it makes more sense to have a minimalistic internal item class.

The WindowItem class represents a window. The SurfaceItem class represents
the contents of either an X11, or a Wayland, or an internal surface. The
DecorationItem and the ShadowItem class represent the server-side deco and
drop-shadow, respectively.

At the moment, the SurfaceItem is bound to the scene window, but the long
term plan is to break that connection so we could re-use the SurfaceItem
for things such as software cursors and drag-and-drop additional icons.

One of the responsibilities of the Item is to schedule repaints as needed.
Ideally, there shouldn't be any addRepaint() calls in the core code. The
Item class schedules repaints on geometry updates. In the future, it also
has to request an update if its opacity or visibility changes.
2021-03-31 13:56:55 +00:00

142 lines
3.4 KiB
C++

/*
SPDX-FileCopyrightText: 2021 Vlad Zahorodnii <vlad.zahorodnii@kde.org>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#pragma once
#include "scene.h"
namespace KWin
{
/**
* The Item class is the base class for items in the scene.
*/
class KWIN_EXPORT Item : public QObject
{
Q_OBJECT
public:
explicit Item(Scene::Window *window, Item *parent = nullptr);
~Item() override;
/**
* Returns the x coordinate relative to the top left corner of the parent item.
*/
int x() const;
void setX(int x);
/**
* Returns the y coordinate relative to the top left corner of the parent item.
*/
int y() const;
void setY(int y);
int width() const;
void setWidth(int width);
int height() const;
void setHeight(int height);
QPoint position() const;
void setPosition(const QPoint &point);
QSize size() const;
void setSize(const QSize &size);
/**
* Returns the enclosing rectangle of the item. The rect equals QRect(0, 0, width(), height()).
*/
QRect rect() const;
/**
* Returns the enclosing rectangle of the item and all of its descendants.
*/
QRect boundingRect() const;
/**
* Returns the visual parent of the item. Note that the visual parent differs from
* the QObject parent.
*/
Item *parentItem() const;
void setParentItem(Item *parent);
QList<Item *> childItems() const;
Scene::Window *window() const;
QPoint rootPosition() const;
/**
* Maps the given @a region from the item's coordinate system to the scene's coordinate
* system.
*/
QRegion mapToGlobal(const QRegion &region) const;
/**
* Maps the given @a rect from the item's coordinate system to the scene's coordinate
* system.
*/
QRect mapToGlobal(const QRect &rect) const;
/**
* Moves this item right before the specified @a sibling in the parent's children list.
*/
void stackBefore(Item *sibling);
/**
* Moves this item right after the specified @a sibling in the parent's children list.
*/
void stackAfter(Item *sibling);
/**
* Restacks the child items in the specified order. Note that the specified stacking order
* must be a permutation of childItems().
*/
void stackChildren(const QList<Item *> &children);
void scheduleRepaint(const QRegion &region);
void scheduleRepaint();
Q_SIGNALS:
/**
* This signal is emitted when the x coordinate of this item has changed.
*/
void xChanged();
/**
* This signal is emitted when the y coordinate of this item has changed.
*/
void yChanged();
/**
* This signal is emitted when the width of this item has changed.
*/
void widthChanged();
/**
* This signal is emitted when the height of this item has changed.
*/
void heightChanged();
/**
* This signal is emitted when the rectangle that encloses this item and all of its children
* has changed.
*/
void boundingRectChanged();
protected:
virtual void preprocess();
void discardQuads();
private:
void addChild(Item *item);
void removeChild(Item *item);
void updateBoundingRect();
Scene::Window *m_window;
QPointer<Item> m_parentItem;
QList<Item *> m_childItems;
QRect m_boundingRect;
int m_x = 0;
int m_y = 0;
int m_width = 0;
int m_height = 0;
friend class Scene::Window;
};
} // namespace KWin