do the hide-is-move dance w/ desktopgrid buttons
the (old) button effect windows used to be unreferenced with the re-invocation of the effect. because we stopped deleting/recreating the window, this approach failed and the effect window was never deleted. Unreferencing the window at proper occasion (see new hide location) coked up - guess what - the exact same "texture is junk" issue as for the QtQuick close button in present windows... So we resort to the exact same stupid "hide by moving" solution as we have there. BUG: 348577 FIXED-IN: 5.4 REVIEW: 124136
This commit is contained in:
parent
269e275cb0
commit
c240f7a012
2 changed files with 46 additions and 18 deletions
|
@ -278,8 +278,16 @@ void DesktopGridEffect::paintWindow(EffectWindow* w, int mask, QRegion region, W
|
|||
if (isUsingPresentWindows() && w == windowMove && wasWindowMove) {
|
||||
return; // will be painted on top of all other windows
|
||||
}
|
||||
if (m_desktopButtonsViews.values().contains(w))
|
||||
return; // will be painted on top of all other windows
|
||||
for (QHash< DesktopButtonsView*, EffectWindow*>::const_iterator it = m_desktopButtonsViews.constBegin(),
|
||||
end = m_desktopButtonsViews.constEnd();
|
||||
it != end; ++it) {
|
||||
if (it.value() == w) {
|
||||
if (!activated && timeline.currentValue() < 0.05) {
|
||||
it.key()->hide();
|
||||
}
|
||||
return; // will be painted on top of all other windows
|
||||
}
|
||||
}
|
||||
|
||||
qreal xScale = data.xScale();
|
||||
qreal yScale = data.yScale();
|
||||
|
@ -416,13 +424,6 @@ void DesktopGridEffect::slotWindowClosed(EffectWindow* w)
|
|||
}
|
||||
}
|
||||
}
|
||||
for (QHash< DesktopButtonsView*, EffectWindow*>::iterator it = m_desktopButtonsViews.begin();
|
||||
it != m_desktopButtonsViews.end(); ++it) {
|
||||
if (it.value() && it.value() == w) {
|
||||
w->refWindow();
|
||||
break;
|
||||
}
|
||||
}
|
||||
effects->addRepaintFull();
|
||||
}
|
||||
|
||||
|
@ -433,8 +434,7 @@ void DesktopGridEffect::slotWindowDeleted(EffectWindow* w)
|
|||
for (QHash< DesktopButtonsView*, EffectWindow*>::iterator it = m_desktopButtonsViews.begin();
|
||||
it != m_desktopButtonsViews.end(); ++it) {
|
||||
if (it.value() && it.value() == w) {
|
||||
it.key()->deleteLater();
|
||||
m_desktopButtonsViews.erase(it);
|
||||
it.value() = nullptr;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -1053,10 +1053,6 @@ void DesktopGridEffect::setActive(bool active)
|
|||
}
|
||||
}
|
||||
setHighlightedDesktop(effects->currentDesktop()); // Ensure selected desktop is highlighted
|
||||
for (QHash< DesktopButtonsView*, EffectWindow*>::iterator it = m_desktopButtonsViews.begin();
|
||||
it != m_desktopButtonsViews.end(); ++it) {
|
||||
it.key()->hide();
|
||||
}
|
||||
}
|
||||
effects->addRepaintFull();
|
||||
}
|
||||
|
@ -1134,14 +1130,12 @@ void DesktopGridEffect::setup()
|
|||
view->setAddDesktopEnabled(enableAdd);
|
||||
view->setRemoveDesktopEnabled(enableRemove);
|
||||
const QRect screenRect = effects->clientArea(FullScreenArea, i, 1);
|
||||
view->show(); // pseudo show must happen before geometry changes
|
||||
view->setGeometry(screenRect.right() + 1 - view->width(),
|
||||
screenRect.bottom() + 1 - view->height(),
|
||||
view->width(), view->height());
|
||||
view->show();
|
||||
}
|
||||
while (it != m_desktopButtonsViews.end()) {
|
||||
if (*it && (*it)->isDeleted())
|
||||
(*it)->unrefWindow();
|
||||
DesktopButtonsView *view = it.key();
|
||||
it = m_desktopButtonsViews.erase(it);
|
||||
view->deleteLater();
|
||||
|
@ -1402,6 +1396,8 @@ bool DesktopGridEffect::isRelevantWithPresentWindows(EffectWindow *w) const
|
|||
************************************************/
|
||||
DesktopButtonsView::DesktopButtonsView(QWindow *parent)
|
||||
: QQuickView(parent)
|
||||
, m_visible(false)
|
||||
, m_posIsValid(false)
|
||||
{
|
||||
setFlags(Qt::X11BypassWindowManagerHint);
|
||||
setColor(Qt::transparent);
|
||||
|
@ -1440,6 +1436,31 @@ void DesktopButtonsView::setRemoveDesktopEnabled(bool enable)
|
|||
rootContext()->setContextProperty(QStringLiteral("remove"), QVariant(enable));
|
||||
}
|
||||
|
||||
bool DesktopButtonsView::isVisible() const
|
||||
{
|
||||
return m_visible;
|
||||
}
|
||||
|
||||
void DesktopButtonsView::show()
|
||||
{
|
||||
if (!m_visible && m_posIsValid) {
|
||||
setPosition(m_pos);
|
||||
m_posIsValid = false;
|
||||
}
|
||||
m_visible = true;
|
||||
QQuickView::show();
|
||||
}
|
||||
|
||||
void DesktopButtonsView::hide()
|
||||
{
|
||||
if (!m_posIsValid) {
|
||||
m_pos = position();
|
||||
m_posIsValid = true;
|
||||
setPosition(-width(), -height());
|
||||
}
|
||||
m_visible = false;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
#include "desktopgrid.moc"
|
||||
|
|
|
@ -40,9 +40,16 @@ public:
|
|||
void windowInputMouseEvent(QMouseEvent* e);
|
||||
void setAddDesktopEnabled(bool enable);
|
||||
void setRemoveDesktopEnabled(bool enable);
|
||||
bool isVisible() const;
|
||||
void show();
|
||||
void hide();
|
||||
Q_SIGNALS:
|
||||
void addDesktop();
|
||||
void removeDesktop();
|
||||
private:
|
||||
bool m_visible;
|
||||
QPoint m_pos;
|
||||
bool m_posIsValid;
|
||||
};
|
||||
|
||||
class DesktopGridEffect
|
||||
|
|
Loading…
Reference in a new issue