diff --git a/effects.cpp b/effects.cpp index a3ae537444..1f4e87eb52 100644 --- a/effects.cpp +++ b/effects.cpp @@ -302,7 +302,25 @@ void EffectsHandlerImpl::startPaint() void EffectsHandlerImpl::slotClientMaximized(KWin::Client *c, KDecorationDefines::MaximizeMode maxMode) { - emit windowUserMovedResized(c->effectWindow(), true, true); + bool horizontal = false; + bool vertical = false; + switch (maxMode) { + case KDecorationDefines::MaximizeHorizontal: + horizontal = true; + break; + case KDecorationDefines::MaximizeVertical: + vertical = true; + break; + case KDecorationDefines::MaximizeFull: + horizontal = true; + vertical = true; + break; + case KDecorationDefines::MaximizeRestore: // fall through + default: + // default - nothing to do + break; + } + emit windowMaximizedStateChanged(c->effectWindow(), horizontal, vertical); } void EffectsHandlerImpl::slotWindowUserMovedResized(EffectWindow* c, bool first, bool last) diff --git a/effects/wobblywindows/wobblywindows.cpp b/effects/wobblywindows/wobblywindows.cpp index 529ab644fd..223e7bb54a 100644 --- a/effects/wobblywindows/wobblywindows.cpp +++ b/effects/wobblywindows/wobblywindows.cpp @@ -168,6 +168,7 @@ WobblyWindowsEffect::WobblyWindowsEffect() connect(effects, SIGNAL(windowAdded(EffectWindow*)), this, SLOT(slotWindowAdded(EffectWindow*))); connect(effects, SIGNAL(windowClosed(EffectWindow*)), this, SLOT(slotWindowClosed(EffectWindow*))); connect(effects, SIGNAL(windowUserMovedResized(EffectWindow*,bool,bool)), this, SLOT(slotWindowUserMovedResized(EffectWindow*,bool,bool))); + connect(effects, SIGNAL(windowMaximizedStateChanged(EffectWindow*,bool,bool)), this, SLOT(slotWindowMaximizeStateChanged(EffectWindow*,bool,bool))); } WobblyWindowsEffect::~WobblyWindowsEffect() @@ -390,6 +391,24 @@ void WobblyWindowsEffect::slotWindowUserMovedResized(EffectWindow* w, bool first } } +void WobblyWindowsEffect::slotWindowMaximizeStateChanged(EffectWindow *w, bool horizontal, bool vertical) +{ + if (!m_moveEffectEnabled || w->isSpecialWindow()) + return; + + if (m_moveWobble && m_resizeWobble) { + stepMovedResized(w); + } + + if (windows.contains(w)) { + WindowWobblyInfos& wwi = windows[w]; + QRect rect = w->geometry(); + if (rect.y() != wwi.resize_original_rect.y()) wwi.can_wobble_top = true; + if (rect.x() != wwi.resize_original_rect.x()) wwi.can_wobble_left = true; + if (rect.right() != wwi.resize_original_rect.right()) wwi.can_wobble_right = true; + if (rect.bottom() != wwi.resize_original_rect.bottom()) wwi.can_wobble_bottom = true; + } +} void WobblyWindowsEffect::startMovedResized(EffectWindow* w) { diff --git a/effects/wobblywindows/wobblywindows.h b/effects/wobblywindows/wobblywindows.h index 8e5bb4d2fa..0a469377a3 100644 --- a/effects/wobblywindows/wobblywindows.h +++ b/effects/wobblywindows/wobblywindows.h @@ -60,6 +60,7 @@ public Q_SLOTS: void slotWindowAdded(EffectWindow *w); void slotWindowClosed(EffectWindow *w); void slotWindowUserMovedResized(EffectWindow *w, bool first, bool last); + void slotWindowMaximizeStateChanged(EffectWindow *w, bool horizontal, bool vertical); private: diff --git a/libkwineffects/kwineffects.h b/libkwineffects/kwineffects.h index a6b5e5ff67..bdfc69f160 100644 --- a/libkwineffects/kwineffects.h +++ b/libkwineffects/kwineffects.h @@ -855,6 +855,19 @@ Q_SIGNALS: * @since 4.7 **/ void windowUserMovedResized(EffectWindow *w, bool first, bool last); + /** + * Signal emitted when the maximized state of the window @p w changed. + * A window can be in one of four states: + * @li restored: both @p horizontal and @p vertical are @c false + * @li horizontally maximized: @p horizontal is @c true and @p vertical is @c false + * @li vertically maximized: @p horizontal is @c false and @p vertical is @c true + * @li completely maximized: both @p horizontal and @p vertical are @C true + * @param w The window whose maximized state changed + * @param horizontal If @c true maximized horizontally + * @param vertical If @c true maximized vertically + * @since 4.7 + **/ + void windowMaximizedStateChanged(EffectWindow *w, bool horizontal, bool vertical); /** * Signal emitted when the geometry or shape of a window changed. * This is caused if the window changes geometry without user interaction.