From 7c5525e83489cc80600bc31d1a8be774bccd34c0 Mon Sep 17 00:00:00 2001 From: Clemens Zeidler Date: Tue, 26 Jul 2011 04:37:27 +0000 Subject: [PATCH] Only allow windows with a normal thick border to S&T. Fixes #6647. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@42492 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../decorators/SATDecorator/SATWindow.cpp | 8 +++++ .../decorators/SATDecorator/SATWindow.h | 1 + .../decorators/SATDecorator/StackAndTile.cpp | 13 ++++++-- .../decorators/SATDecorator/StackAndTile.h | 5 +-- .../decorators/SATDecorator/Stacking.cpp | 29 +++++++++++++++++ .../decorators/SATDecorator/Stacking.h | 3 +- .../decorators/SATDecorator/Tiling.cpp | 32 +++++++++++++++++++ src/add-ons/decorators/SATDecorator/Tiling.h | 3 ++ src/servers/app/Desktop.cpp | 2 ++ src/servers/app/DesktopListener.cpp | 13 ++++++++ src/servers/app/DesktopListener.h | 4 +++ src/servers/app/Window.cpp | 3 +- 12 files changed, 110 insertions(+), 6 deletions(-) diff --git a/src/add-ons/decorators/SATDecorator/SATWindow.cpp b/src/add-ons/decorators/SATDecorator/SATWindow.cpp index 5c6b43c719..a1846d0810 100644 --- a/src/add-ons/decorators/SATDecorator/SATWindow.cpp +++ b/src/add-ons/decorators/SATDecorator/SATWindow.cpp @@ -427,6 +427,14 @@ SATWindow::RemovedFromArea(WindowArea* area) } +void +SATWindow::WindowLookChanged(window_look look) +{ + for (int i = 0; i < fSATSnappingBehaviourList.CountItems(); i++) + fSATSnappingBehaviourList.ItemAt(i)->WindowLookChanged(look); +} + + void SATWindow::FindSnappingCandidates() { diff --git a/src/add-ons/decorators/SATDecorator/SATWindow.h b/src/add-ons/decorators/SATDecorator/SATWindow.h index e322b0d459..5de5990fc8 100644 --- a/src/add-ons/decorators/SATDecorator/SATWindow.h +++ b/src/add-ons/decorators/SATDecorator/SATWindow.h @@ -99,6 +99,7 @@ public: bool RemovedFromGroup(SATGroup* group, bool stayBelowMouse); void RemovedFromArea(WindowArea* area); + void WindowLookChanged(window_look look); bool StackWindow(SATWindow* child); diff --git a/src/add-ons/decorators/SATDecorator/StackAndTile.cpp b/src/add-ons/decorators/SATDecorator/StackAndTile.cpp index 32a6f5be73..b2a4ef1625 100644 --- a/src/add-ons/decorators/SATDecorator/StackAndTile.cpp +++ b/src/add-ons/decorators/SATDecorator/StackAndTile.cpp @@ -382,10 +382,19 @@ StackAndTile::SizeLimitsChanged(Window* window, int32 minWidth, int32 maxWidth, void StackAndTile::WindowLookChanged(Window* window, window_look look) { - // if the decorator has been removed remove it from the stacking group - if (look != B_NO_BORDER_WINDOW_LOOK) + SATWindow* satWindow = GetSATWindow(window); + if (!satWindow) return; + satWindow->WindowLookChanged(look); +} + +void +StackAndTile::WindowFeelChanged(Window* window, window_feel feel) +{ + // check if it is still a compatible feel + if (feel != B_NORMAL_WINDOW_FEEL) + return; SATWindow* satWindow = GetSATWindow(window); if (!satWindow) return; diff --git a/src/add-ons/decorators/SATDecorator/StackAndTile.h b/src/add-ons/decorators/SATDecorator/StackAndTile.h index ee701c66c3..198fe655cf 100644 --- a/src/add-ons/decorators/SATDecorator/StackAndTile.h +++ b/src/add-ons/decorators/SATDecorator/StackAndTile.h @@ -80,6 +80,8 @@ public: int32 minHeight, int32 maxHeight); virtual void WindowLookChanged(Window* window, window_look look); + virtual void WindowFeelChanged(Window* window, + window_feel feel); virtual bool SetDecoratorSettings(Window* window, const BMessage& settings); @@ -166,8 +168,7 @@ public: /*! Update the window tab values, solve the layout and move all windows in the group accordantly. */ virtual void RemovedFromArea(WindowArea* area) {} - virtual void TabLocationMoved(float location, bool shifting) - {} + virtual void WindowLookChanged(window_look look) {} }; diff --git a/src/add-ons/decorators/SATDecorator/Stacking.cpp b/src/add-ons/decorators/SATDecorator/Stacking.cpp index bad0324c5c..15392c2ce8 100644 --- a/src/add-ons/decorators/SATDecorator/Stacking.cpp +++ b/src/add-ons/decorators/SATDecorator/Stacking.cpp @@ -239,6 +239,9 @@ SATStacking::FindSnappingCandidates(SATGroup* group) Window* win = satWindow->GetWindow(); if (win == window || !win->Decorator()) continue; + if (_IsStackableWindow(win) == false + || _IsStackableWindow(window) == false) + continue; Decorator::Tab* tab = win->Decorator()->TabAt(win->PositionInStack()); if (tab == NULL) continue; @@ -276,6 +279,32 @@ SATStacking::RemovedFromArea(WindowArea* area) } +void +SATStacking::WindowLookChanged(window_look look) +{ + Window* window = fSATWindow->GetWindow(); + WindowStack* stack = window->GetWindowStack(); + if (stack == NULL) + return; + SATGroup* group = fSATWindow->GetGroup(); + if (group == NULL) + return; + if (stack->CountWindows() > 1 && _IsStackableWindow(window) == false) + group->RemoveWindow(fSATWindow); +} + + +bool +SATStacking::_IsStackableWindow(Window* window) +{ + if (window->Look() == B_DOCUMENT_WINDOW_LOOK) + return true; + if (window->Look() == B_TITLED_WINDOW_LOOK) + return true; + return false; +} + + void SATStacking::_ClearSearchResult() { diff --git a/src/add-ons/decorators/SATDecorator/Stacking.h b/src/add-ons/decorators/SATDecorator/Stacking.h index 6934ba36ae..c5b7ad3c87 100644 --- a/src/add-ons/decorators/SATDecorator/Stacking.h +++ b/src/add-ons/decorators/SATDecorator/Stacking.h @@ -34,8 +34,9 @@ public: void DoWindowLayout(); void RemovedFromArea(WindowArea* area); - + void WindowLookChanged(window_look look); private: + bool _IsStackableWindow(Window* window); void _ClearSearchResult(); void _HighlightWindows(bool highlight = true); diff --git a/src/add-ons/decorators/SATDecorator/Tiling.cpp b/src/add-ons/decorators/SATDecorator/Tiling.cpp index 4e63655656..57b1c2d703 100644 --- a/src/add-ons/decorators/SATDecorator/Tiling.cpp +++ b/src/add-ons/decorators/SATDecorator/Tiling.cpp @@ -46,6 +46,10 @@ SATTiling::FindSnappingCandidates(SATGroup* group) { _ResetSearchResults(); + if (_IsTileableWindow(fSATWindow->GetWindow()) == false + || (group->CountItems() == 1 + && _IsTileableWindow(group->WindowAt(0)->GetWindow()) == false)) + return false; if (fSATWindow->GetGroup() == group) return false; @@ -78,6 +82,34 @@ SATTiling::JoinCandidates() } +void +SATTiling::WindowLookChanged(window_look look) +{ + SATGroup* group = fSATWindow->GetGroup(); + if (group == NULL) + return; + if (_IsTileableWindow(fSATWindow->GetWindow()) == false) + group->RemoveWindow(fSATWindow); +} + + +bool +SATTiling::_IsTileableWindow(Window* window) +{ + if (window->Look() == B_DOCUMENT_WINDOW_LOOK) + return true; + if (window->Look() == B_TITLED_WINDOW_LOOK) + return true; + if (window->Look() == B_FLOATING_WINDOW_LOOK) + return true; + if (window->Look() == B_MODAL_WINDOW_LOOK) + return true; + if (window->Look() == B_BORDERED_WINDOW_LOOK) + return true; + return false; +} + + bool SATTiling::_FindFreeAreaInGroup(SATGroup* group) { diff --git a/src/add-ons/decorators/SATDecorator/Tiling.h b/src/add-ons/decorators/SATDecorator/Tiling.h index 08c555c539..1eeeb47f3d 100644 --- a/src/add-ons/decorators/SATDecorator/Tiling.h +++ b/src/add-ons/decorators/SATDecorator/Tiling.h @@ -25,7 +25,10 @@ public: bool FindSnappingCandidates(SATGroup* group); bool JoinCandidates(); + void WindowLookChanged(window_look look); private: + bool _IsTileableWindow(Window* window); + bool _FindFreeAreaInGroup(SATGroup* group); bool _FindFreeAreaInGroup(SATGroup* group, Corner::position_t corner); diff --git a/src/servers/app/Desktop.cpp b/src/servers/app/Desktop.cpp index a0abb3a4c2..b99e446d42 100644 --- a/src/servers/app/Desktop.cpp +++ b/src/servers/app/Desktop.cpp @@ -1724,6 +1724,8 @@ Desktop::SetWindowFeel(Window* window, window_feel newFeel) if (window == FocusWindow() && !window->IsVisible()) SetFocusWindow(); + NotifyWindowFeelChanged(window, newFeel); + UnlockAllWindows(); } diff --git a/src/servers/app/DesktopListener.cpp b/src/servers/app/DesktopListener.cpp index 37cc38b8ee..b87e975dda 100644 --- a/src/servers/app/DesktopListener.cpp +++ b/src/servers/app/DesktopListener.cpp @@ -284,6 +284,19 @@ DesktopObservable::NotifyWindowLookChanged(Window* window, window_look look) } +void +DesktopObservable::NotifyWindowFeelChanged(Window* window, window_feel feel) +{ + if (fWeAreInvoking) + return; + InvokeGuard invokeGuard(fWeAreInvoking); + + for (DesktopListener* listener = fDesktopListenerList.First(); + listener != NULL; listener = fDesktopListenerList.GetNext(listener)) + listener->WindowFeelChanged(window, feel); +} + + bool DesktopObservable::SetDecoratorSettings(Window* window, const BMessage& settings) diff --git a/src/servers/app/DesktopListener.h b/src/servers/app/DesktopListener.h index 1b89b9da08..0a257dce31 100644 --- a/src/servers/app/DesktopListener.h +++ b/src/servers/app/DesktopListener.h @@ -65,6 +65,8 @@ public: int32 minHeight, int32 maxHeight) = 0; virtual void WindowLookChanged(Window* window, window_look look) = 0; + virtual void WindowFeelChanged(Window* window, + window_feel feel) = 0; virtual bool SetDecoratorSettings(Window* window, const BMessage& settings) = 0; @@ -119,6 +121,8 @@ public: int32 minHeight, int32 maxHeight); void NotifyWindowLookChanged(Window* window, window_look look); + void NotifyWindowFeelChanged(Window* window, + window_feel feel); bool SetDecoratorSettings(Window* window, const BMessage& settings); diff --git a/src/servers/app/Window.cpp b/src/servers/app/Window.cpp index d8b9bdd552..b4a5c62ab6 100644 --- a/src/servers/app/Window.cpp +++ b/src/servers/app/Window.cpp @@ -2100,6 +2100,8 @@ Window::DetachFromWindowStack(bool ownStackNeeded) decorator->SetDrawingEngine(remainingTop->fDrawingEngine); // propagate focus to the decorator remainingTop->SetFocus(remainingTop->IsFocus()); + remainingTop->SetFeel(remainingTop->Feel()); + remainingTop->SetLook(remainingTop->Look(), &dirty); } fCurrentStack = NULL; @@ -2185,7 +2187,6 @@ Window::GetWindowStack() } - bool Window::MoveToTopStackLayer() {