56#include "compositor.h" 
   87    : 
Scene(std::move(renderer))
 
   88    , m_containerItem(std::make_unique<
Item>(this))
 
 
  105void WorkspaceScene::createDndIconItem()
 
  111    m_dndIcon = std::make_unique<DragAndDropIconItem>(dragIcon, 
this);
 
  113        auto updatePosition = [
this]() {
 
  115            m_dndIcon->setPosition(pointerPos);
 
  116            m_dndIcon->setOutput(
workspace()->outputAt(pointerPos));
 
  122        auto updatePosition = [
this]() {
 
  124            m_dndIcon->setPosition(touchPos);
 
  125            m_dndIcon->setOutput(
workspace()->outputAt(touchPos));
 
  133void WorkspaceScene::destroyDndIconItem()
 
  140    return m_containerItem.get();
 
 
  145    const QList<Item *> children = item->
childItems();
 
  146    if (children.isEmpty()) {
 
  149        return findTopMostSurface(
static_cast<SurfaceItem *
>(children.constLast()));
 
  172                if (topMost->
position() != QPoint(0, 0)) {
 
  176                if (!topMost->
opaque().contains(QRect(0, 0, window->
width(), window->
height()))) {
 
 
  191        const std::chrono::milliseconds frameTime =
 
  194        const QList<Item *> items = m_containerItem->sortedChildItems();
 
  195        for (
Item *item : items) {
 
  203            if (
auto surface = window->
surface()) {
 
  207                        frame->addFeedback(std::move(feedback));
 
  214            if (
auto surface = m_dndIcon->surface()) {
 
  218                        frame->addFeedback(std::move(feedback));
 
 
  238    const std::chrono::milliseconds presentTime =
 
  241    if (presentTime > m_expectedPresentTimestamp) {
 
  242        m_expectedPresentTimestamp = presentTime;
 
  249    prePaintData.
mask = 0;
 
  257    m_paintContext.
mask = prePaintData.
mask;
 
  266    return m_paintContext.
damage.translated(-delegate->
viewport().topLeft());
 
 
  274    for (
Item *childItem : childItems) {
 
  275        resetRepaintsHelper(childItem, delegate);
 
  279static void accumulateRepaints(Item *item, SceneDelegate *delegate, QRegion *repaints)
 
  281    *repaints += item->repaints(delegate);
 
  282    item->resetRepaints(delegate);
 
  284    const auto childItems = item->childItems();
 
  285    for (Item *childItem : childItems) {
 
  286        accumulateRepaints(childItem, delegate, repaints);
 
  314        Window *window = windowItem->window();
 
  320        if (window->
opacity() == 1.0) {
 
  321            const SurfaceItem *surfaceItem = windowItem->surfaceItem();
 
  322            if (Q_LIKELY(surfaceItem)) {
 
  326            const DecorationItem *decorationItem = windowItem->decorationItem();
 
  327            if (decorationItem) {
 
  335            .region = data.
paint,
 
  343    for (
int i = m_paintContext.
phase2Data.size() - 1; i >= 0; --i) {
 
  344        const auto &paintData = m_paintContext.
phase2Data.at(i);
 
  345        m_paintContext.
damage += paintData.region - opaque;
 
  347            opaque += paintData.opaque;
 
 
  372    m_renderer->beginFrame(renderTarget, viewport);
 
  375    m_paintScreenCount = 0;
 
 
  384    m_paintScreenCount++;
 
 
  397        if (m_paintScreenCount == 1) {
 
  405        paintWindow(renderTarget, viewport, paintData.item, paintData.mask, paintData.region);
 
 
  415    QRegion visible = region;
 
  416    for (
int i = m_paintContext.
phase2Data.size() - 1; i >= 0; --i) {
 
  429    m_renderer->renderBackground(renderTarget, viewport, visible);
 
  432        paintWindow(renderTarget, viewport, paintData.item, paintData.mask, paintData.region);
 
  436        const QRegion repaint = region & m_dndIcon->mapToGlobal(m_dndIcon->boundingRect()).toRect();
 
  437        if (!repaint.isEmpty()) {
 
 
  445    QList<Item *> items = m_containerItem->sortedChildItems();
 
  446    for (
Item *item : std::as_const(items)) {
 
 
  461    if (region.isEmpty()) { 
 
 
  497#include "moc_workspacescene.cpp" 
@ OperationModeX11
KWin uses only X11 for managing windows and compositing.
QRegion opaque() const override final
Representation of a window used by/for Effect classes.
WindowItem * windowItem() const
void drawWindow(const RenderTarget &renderTarget, const RenderViewport &viewport, EffectWindow *w, int mask, const QRegion ®ion, WindowPaintData &data)
void paintScreen(const RenderTarget &renderTarget, const RenderViewport &viewport, int mask, const QRegion ®ion, Output *screen)
bool blocksDirectScanout() const
bool makeOpenGLContextCurrent()
Makes the OpenGL compositing context current.
void paintWindow(const RenderTarget &renderTarget, const RenderViewport &viewport, EffectWindow *w, int mask, const QRegion ®ion, WindowPaintData &data)
void prePaintScreen(ScreenPrePaintData &data, std::chrono::milliseconds presentTime)
void prePaintWindow(EffectWindow *w, WindowPrePaintData &data, std::chrono::milliseconds presentTime)
void postPaintWindow(EffectWindow *w)
virtual QRegion opaque() const
QRectF boundingRect() const
QRegion mapToGlobal(const QRegion ®ion) const
void resetRepaints(SceneDelegate *delegate)
QList< Item * > childItems() const
virtual RenderLoop * renderLoop() const =0
std::chrono::nanoseconds lastPresentationTimestamp() const
std::chrono::nanoseconds nextPresentationTimestamp() const
QMatrix4x4 projectionMatrix() const
void setGeometry(const QRect &rect)
@ PAINT_WINDOW_TRANSLUCENT
@ PAINT_SCREEN_TRANSFORMED
@ PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS
@ PAINT_SCREEN_BACKGROUND_FIRST
@ PAINT_WINDOW_TRANSFORMED
std::unique_ptr< ItemRenderer > m_renderer
QPointF pointerPos() const
void touchMoved(qint32 id, quint32 serial, const QPointF &globalPosition)
QPointF firstTouchPointPosition() const
void pointerPosChanged(const QPointF &pos)
DragAndDropIcon * dragIcon() const
Resource representing a wl_surface.
std::unique_ptr< PresentationFeedback > takePresentationFeedback(Output *output)
void frameRendered(quint32 msec)
SeatInterface * seat() const
virtual bool isClient() const
SurfaceInterface * surface() const
virtual bool isFullScreen() const
bool isOnOutput(Output *output) const
SurfaceItem * surfaceItem() const
EffectWindow * effectWindow() const
QList< Output * > outputs() const
void frame(SceneDelegate *delegate, OutputFrame *frame) override
QRegion prePaint(SceneDelegate *delegate) override
SurfaceItem * scanoutCandidate() const override
QList< WindowItem * > stacking_order
virtual bool makeOpenGLContextCurrent()
void paintWindow(const RenderTarget &renderTarget, const RenderViewport &viewport, WindowItem *w, int mask, const QRegion ®ion)
virtual bool supportsNativeFence() const
void clearStackingOrder()
void preparePaintGenericScreen()
Item * containerItem() const
void finalPaintScreen(const RenderTarget &renderTarget, const RenderViewport &viewport, int mask, const QRegion ®ion, Output *screen)
void paintGenericScreen(const RenderTarget &renderTarget, const RenderViewport &viewport, int mask, Output *screen)
void paintSimpleScreen(const RenderTarget &renderTarget, const RenderViewport &viewport, int mask, const QRegion ®ion)
void finalDrawWindow(const RenderTarget &renderTarget, const RenderViewport &viewport, EffectWindow *w, int mask, const QRegion ®ion, WindowPaintData &data)
virtual void doneOpenGLContextCurrent()
void finalPaintWindow(const RenderTarget &renderTarget, const RenderViewport &viewport, EffectWindow *w, int mask, const QRegion ®ion, WindowPaintData &data)
void createStackingOrder()
WorkspaceScene(std::unique_ptr< ItemRenderer > renderer)
SceneDelegate * painted_delegate
void preparePaintSimpleScreen()
~WorkspaceScene() override
void paint(const RenderTarget &renderTarget, const QRegion ®ion) override
void postPaint() override
KWayland::Client::Seat * seat
KWIN_EXPORT QRect infiniteRegion()
WaylandServer * waylandServer()
QList< Phase2Data > phase2Data