Cache workspace geometry in Workspace
This allows us to drop obsolete Screens class. Currently, the Screens class is a thin wrapper around platform outputs + some extra tracked state, e.g. active output, workspace geometry, etc.
This commit is contained in:
parent
d9686a0caa
commit
71aeb5528a
2 changed files with 26 additions and 16 deletions
|
@ -2062,11 +2062,17 @@ void Workspace::checkTransients(xcb_window_t w)
|
||||||
*/
|
*/
|
||||||
void Workspace::desktopResized()
|
void Workspace::desktopResized()
|
||||||
{
|
{
|
||||||
QRect geom = screens()->geometry();
|
const auto outputs = kwinApp()->platform()->enabledOutputs();
|
||||||
|
|
||||||
|
m_geometry = QRect();
|
||||||
|
for (const AbstractOutput *output : outputs) {
|
||||||
|
m_geometry = m_geometry.united(output->geometry());
|
||||||
|
}
|
||||||
|
|
||||||
if (rootInfo()) {
|
if (rootInfo()) {
|
||||||
NETSize desktop_geometry;
|
NETSize desktop_geometry;
|
||||||
desktop_geometry.width = geom.width();
|
desktop_geometry.width = m_geometry.width();
|
||||||
desktop_geometry.height = geom.height();
|
desktop_geometry.height = m_geometry.height();
|
||||||
rootInfo()->setDesktopGeometry(desktop_geometry);
|
rootInfo()->setDesktopGeometry(desktop_geometry);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2079,7 +2085,7 @@ void Workspace::desktopResized()
|
||||||
|
|
||||||
void Workspace::saveOldScreenSizes()
|
void Workspace::saveOldScreenSizes()
|
||||||
{
|
{
|
||||||
olddisplaysize = screens()->displaySize();
|
olddisplaysize = m_geometry.size();
|
||||||
oldscreensizes.clear();
|
oldscreensizes.clear();
|
||||||
for( int i = 0;
|
for( int i = 0;
|
||||||
i < screens()->count();
|
i < screens()->count();
|
||||||
|
@ -2122,7 +2128,7 @@ QRect Workspace::adjustClientArea(AbstractClient *client, const QRect &area) con
|
||||||
// HACK: workarea handling is not xinerama aware, so if this strut
|
// HACK: workarea handling is not xinerama aware, so if this strut
|
||||||
// reserves place at a xinerama edge that's inside the virtual screen,
|
// reserves place at a xinerama edge that's inside the virtual screen,
|
||||||
// ignore the strut for workspace setting.
|
// ignore the strut for workspace setting.
|
||||||
if (area == QRect(QPoint(0, 0), screens()->displaySize())) {
|
if (area == QRect(QPoint(0, 0), m_geometry.size())) {
|
||||||
if (strutLeft.left() < screenArea.left()) {
|
if (strutLeft.left() < screenArea.left()) {
|
||||||
strutLeft = QRect();
|
strutLeft = QRect();
|
||||||
}
|
}
|
||||||
|
@ -2179,13 +2185,8 @@ void Workspace::updateClientArea()
|
||||||
QHash<const VirtualDesktop *, StrutRects> restrictedAreas;
|
QHash<const VirtualDesktop *, StrutRects> restrictedAreas;
|
||||||
QHash<const VirtualDesktop *, QHash<const AbstractOutput *, QRect>> screenAreas;
|
QHash<const VirtualDesktop *, QHash<const AbstractOutput *, QRect>> screenAreas;
|
||||||
|
|
||||||
QRect desktopArea;
|
|
||||||
for (const AbstractOutput *output : outputs) {
|
|
||||||
desktopArea |= output->geometry();
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const VirtualDesktop *desktop : desktops) {
|
for (const VirtualDesktop *desktop : desktops) {
|
||||||
workAreas[desktop] = desktopArea;
|
workAreas[desktop] = m_geometry;
|
||||||
|
|
||||||
for (const AbstractOutput *output : outputs) {
|
for (const AbstractOutput *output : outputs) {
|
||||||
screenAreas[desktop][output] = output->geometry();
|
screenAreas[desktop][output] = output->geometry();
|
||||||
|
@ -2196,7 +2197,7 @@ void Workspace::updateClientArea()
|
||||||
if (!client->hasStrut()) {
|
if (!client->hasStrut()) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
QRect r = adjustClientArea(client, desktopArea);
|
QRect r = adjustClientArea(client, m_geometry);
|
||||||
|
|
||||||
// This happens sometimes when the workspace size changes and the
|
// This happens sometimes when the workspace size changes and the
|
||||||
// struted clients haven't repositioned yet
|
// struted clients haven't repositioned yet
|
||||||
|
@ -2208,7 +2209,7 @@ void Workspace::updateClientArea()
|
||||||
for (const AbstractOutput *output : outputs) {
|
for (const AbstractOutput *output : outputs) {
|
||||||
if (!r.intersects(output->geometry())) {
|
if (!r.intersects(output->geometry())) {
|
||||||
qCDebug(KWIN_CORE) << "Adjusted client area would exclude a complete screen, ignore";
|
qCDebug(KWIN_CORE) << "Adjusted client area would exclude a complete screen, ignore";
|
||||||
r = desktopArea;
|
r = m_geometry;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2278,7 +2279,6 @@ void Workspace::updateClientArea()
|
||||||
*/
|
*/
|
||||||
QRect Workspace::clientArea(clientAreaOption opt, const AbstractOutput *output, const VirtualDesktop *desktop) const
|
QRect Workspace::clientArea(clientAreaOption opt, const AbstractOutput *output, const VirtualDesktop *desktop) const
|
||||||
{
|
{
|
||||||
const QSize displaySize = screens()->displaySize();
|
|
||||||
QRect workArea;
|
QRect workArea;
|
||||||
|
|
||||||
const AbstractOutput *effectiveOutput = output;
|
const AbstractOutput *effectiveOutput = output;
|
||||||
|
@ -2299,7 +2299,7 @@ QRect Workspace::clientArea(clientAreaOption opt, const AbstractOutput *output,
|
||||||
} else {
|
} else {
|
||||||
workArea = m_workAreas[desktop];
|
workArea = m_workAreas[desktop];
|
||||||
if (workArea.isNull()) {
|
if (workArea.isNull()) {
|
||||||
workArea = QRect(0, 0, displaySize.width(), displaySize.height());
|
workArea = QRect(QPoint(0, 0), m_geometry.size());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2318,7 +2318,7 @@ QRect Workspace::clientArea(clientAreaOption opt, const AbstractOutput *output,
|
||||||
else
|
else
|
||||||
return workArea;
|
return workArea;
|
||||||
case FullArea:
|
case FullArea:
|
||||||
return QRect(0, 0, displaySize.width(), displaySize.height());
|
return QRect(QPoint(0, 0), m_geometry.size());
|
||||||
|
|
||||||
default:
|
default:
|
||||||
Q_UNREACHABLE();
|
Q_UNREACHABLE();
|
||||||
|
@ -2363,6 +2363,11 @@ QRect Workspace::clientArea(clientAreaOption opt, const Toplevel *window, const
|
||||||
return clientArea(opt, screens()->number(pos), window->desktop());
|
return clientArea(opt, screens()->number(pos), window->desktop());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QRect Workspace::geometry() const
|
||||||
|
{
|
||||||
|
return m_geometry;
|
||||||
|
}
|
||||||
|
|
||||||
static QRegion strutsToRegion(StrutAreas areas, const StrutRects &strut)
|
static QRegion strutsToRegion(StrutAreas areas, const StrutRects &strut)
|
||||||
{
|
{
|
||||||
QRegion region;
|
QRegion region;
|
||||||
|
|
|
@ -146,6 +146,10 @@ public:
|
||||||
QRect clientArea(clientAreaOption, const Toplevel *window, const QPoint &pos) const;
|
QRect clientArea(clientAreaOption, const Toplevel *window, const QPoint &pos) const;
|
||||||
QRect clientArea(clientAreaOption, int screen, int desktop) const;
|
QRect clientArea(clientAreaOption, int screen, int desktop) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the geometry of this Workspace, i.e. the bounding rectangle of all outputs.
|
||||||
|
*/
|
||||||
|
QRect geometry() const;
|
||||||
QRegion restrictedMoveArea(const VirtualDesktop *desktop, StrutAreas areas = StrutAreaAll) const;
|
QRegion restrictedMoveArea(const VirtualDesktop *desktop, StrutAreas areas = StrutAreaAll) const;
|
||||||
|
|
||||||
bool initializing() const;
|
bool initializing() const;
|
||||||
|
@ -656,6 +660,7 @@ private:
|
||||||
QHash<const VirtualDesktop *, QRect> m_workAreas;
|
QHash<const VirtualDesktop *, QRect> m_workAreas;
|
||||||
QHash<const VirtualDesktop *, StrutRects> m_restrictedAreas;
|
QHash<const VirtualDesktop *, StrutRects> m_restrictedAreas;
|
||||||
QHash<const VirtualDesktop *, QHash<const AbstractOutput *, QRect>> m_screenAreas;
|
QHash<const VirtualDesktop *, QHash<const AbstractOutput *, QRect>> m_screenAreas;
|
||||||
|
QRect m_geometry;
|
||||||
|
|
||||||
QVector< QRect > oldscreensizes; // array of previous sizes of xinerama screens
|
QVector< QRect > oldscreensizes; // array of previous sizes of xinerama screens
|
||||||
QSize olddisplaysize; // previous sizes od displayWidth()/displayHeight()
|
QSize olddisplaysize; // previous sizes od displayWidth()/displayHeight()
|
||||||
|
|
Loading…
Reference in a new issue