Changeset View
Changeset View
Standalone View
Standalone View
scene.cpp
Show First 20 Lines • Show All 384 Lines • ▼ Show 20 Line(s) | 380 | } else { | |||
---|---|---|---|---|---|
385 | // and the repainted region to the damage history. Otherwise the | 385 | // and the repainted region to the damage history. Otherwise the | ||
386 | // repaint region will grow with every frame until it eventually | 386 | // repaint region will grow with every frame until it eventually | ||
387 | // covers the whole back buffer, at which point we're always doing | 387 | // covers the whole back buffer, at which point we're always doing | ||
388 | // full repaints. | 388 | // full repaints. | ||
389 | damaged_region = paintedArea - repaintClip; | 389 | damaged_region = paintedArea - repaintClip; | ||
390 | } | 390 | } | ||
391 | } | 391 | } | ||
392 | 392 | | |||
393 | void Scene::windowAdded(Toplevel *c) | 393 | void Scene::addToplevel(Toplevel *c) | ||
394 | { | 394 | { | ||
395 | assert(!m_windows.contains(c)); | 395 | assert(!m_windows.contains(c)); | ||
396 | Scene::Window *w = createWindow(c); | 396 | Scene::Window *w = createWindow(c); | ||
397 | m_windows[ c ] = w; | 397 | m_windows[ c ] = w; | ||
398 | connect(c, SIGNAL(geometryShapeChanged(KWin::Toplevel*,QRect)), SLOT(windowGeometryShapeChanged(KWin::Toplevel*))); | 398 | connect(c, SIGNAL(geometryShapeChanged(KWin::Toplevel*,QRect)), SLOT(windowGeometryShapeChanged(KWin::Toplevel*))); | ||
399 | connect(c, SIGNAL(windowClosed(KWin::Toplevel*,KWin::Deleted*)), SLOT(windowClosed(KWin::Toplevel*,KWin::Deleted*))); | 399 | connect(c, SIGNAL(windowClosed(KWin::Toplevel*,KWin::Deleted*)), SLOT(windowClosed(KWin::Toplevel*,KWin::Deleted*))); | ||
400 | //A change of scale won't affect the geometry in compositor co-ordinates, but will affect the window quads. | 400 | //A change of scale won't affect the geometry in compositor co-ordinates, but will affect the window quads. | ||
401 | if (c->surface()) { | 401 | if (c->surface()) { | ||
402 | connect(c->surface(), &KWayland::Server::SurfaceInterface::scaleChanged, this, std::bind(&Scene::windowGeometryShapeChanged, this, c)); | 402 | connect(c->surface(), &KWayland::Server::SurfaceInterface::scaleChanged, this, std::bind(&Scene::windowGeometryShapeChanged, this, c)); | ||
403 | } | 403 | } | ||
404 | connect(c, &Toplevel::screenScaleChanged, std::bind(&Scene::windowGeometryShapeChanged, this, c)); | 404 | connect(c, &Toplevel::screenScaleChanged, std::bind(&Scene::windowGeometryShapeChanged, this, c)); | ||
405 | c->effectWindow()->setSceneWindow(w); | 405 | c->effectWindow()->setSceneWindow(w); | ||
406 | c->getShadow(); | 406 | c->getShadow(); | ||
407 | w->updateShadow(c->shadow()); | 407 | w->updateShadow(c->shadow()); | ||
408 | connect(c, &Toplevel::shadowChanged, this, | 408 | connect(c, &Toplevel::shadowChanged, this, | ||
409 | [w] { | 409 | [w] { | ||
410 | w->invalidateQuadsCache(); | 410 | w->invalidateQuadsCache(); | ||
411 | } | 411 | } | ||
412 | ); | 412 | ); | ||
413 | } | 413 | } | ||
414 | 414 | | |||
415 | void Scene::windowClosed(Toplevel *c, Deleted *deleted) | 415 | void Scene::removeToplevel(Toplevel *toplevel) | ||
416 | { | 416 | { | ||
417 | assert(m_windows.contains(c)); | 417 | Q_ASSERT(m_windows.contains(toplevel)); | ||
418 | if (deleted != NULL) { | 418 | delete m_windows.take(toplevel); | ||
419 | // replace c with deleted | 419 | toplevel->effectWindow()->setSceneWindow(nullptr); | ||
420 | Window* w = m_windows.take(c); | | |||
421 | w->updateToplevel(deleted); | | |||
422 | if (w->shadow()) { | | |||
423 | w->shadow()->setToplevel(deleted); | | |||
424 | } | | |||
425 | m_windows[ deleted ] = w; | | |||
426 | } else { | | |||
427 | delete m_windows.take(c); | | |||
428 | c->effectWindow()->setSceneWindow(NULL); | | |||
429 | } | | |||
430 | } | 420 | } | ||
431 | 421 | | |||
432 | void Scene::windowDeleted(Deleted *c) | 422 | void Scene::windowClosed(Toplevel *toplevel, Deleted *deleted) | ||
433 | { | 423 | { | ||
434 | assert(m_windows.contains(c)); | 424 | if (!deleted) { | ||
435 | delete m_windows.take(c); | 425 | removeToplevel(toplevel); | ||
436 | c->effectWindow()->setSceneWindow(NULL); | 426 | return; | ||
427 | } | ||||
428 | | ||||
429 | Q_ASSERT(m_windows.contains(toplevel)); | ||||
430 | Window *window = m_windows.take(toplevel); | ||||
431 | window->updateToplevel(deleted); | ||||
432 | if (window->shadow()) { | ||||
433 | window->shadow()->setToplevel(deleted); | ||||
434 | } | ||||
435 | m_windows[deleted] = window; | ||||
437 | } | 436 | } | ||
438 | 437 | | |||
439 | void Scene::windowGeometryShapeChanged(Toplevel *c) | 438 | void Scene::windowGeometryShapeChanged(Toplevel *c) | ||
440 | { | 439 | { | ||
441 | if (!m_windows.contains(c)) // this is ok, shape is not valid by default | 440 | if (!m_windows.contains(c)) // this is ok, shape is not valid by default | ||
442 | return; | 441 | return; | ||
443 | Window *w = m_windows[ c ]; | 442 | Window *w = m_windows[ c ]; | ||
444 | w->discardShape(); | 443 | w->discardShape(); | ||
▲ Show 20 Lines • Show All 714 Lines • Show Last 20 Lines |