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