Author: czeidler Date: 2011-07-26 06:37:27 +0200 (Tue, 26 Jul 2011) New Revision: 42492 Changeset: https://dev.haiku-os.org/changeset/42492 Ticket: https://dev.haiku-os.org/ticket/6647 Modified: haiku/trunk/src/add-ons/decorators/SATDecorator/SATWindow.cpp haiku/trunk/src/add-ons/decorators/SATDecorator/SATWindow.h haiku/trunk/src/add-ons/decorators/SATDecorator/StackAndTile.cpp haiku/trunk/src/add-ons/decorators/SATDecorator/StackAndTile.h haiku/trunk/src/add-ons/decorators/SATDecorator/Stacking.cpp haiku/trunk/src/add-ons/decorators/SATDecorator/Stacking.h haiku/trunk/src/add-ons/decorators/SATDecorator/Tiling.cpp haiku/trunk/src/add-ons/decorators/SATDecorator/Tiling.h haiku/trunk/src/servers/app/Desktop.cpp haiku/trunk/src/servers/app/DesktopListener.cpp haiku/trunk/src/servers/app/DesktopListener.h haiku/trunk/src/servers/app/Window.cpp Log: Only allow windows with a normal thick border to S&T. Fixes #6647. Modified: haiku/trunk/src/add-ons/decorators/SATDecorator/SATWindow.cpp =================================================================== --- haiku/trunk/src/add-ons/decorators/SATDecorator/SATWindow.cpp 2011-07-26 02:41:56 UTC (rev 42491) +++ haiku/trunk/src/add-ons/decorators/SATDecorator/SATWindow.cpp 2011-07-26 04:37:27 UTC (rev 42492) @@ -428,6 +428,14 @@ void +SATWindow::WindowLookChanged(window_look look) +{ + for (int i = 0; i < fSATSnappingBehaviourList.CountItems(); i++) + fSATSnappingBehaviourList.ItemAt(i)->WindowLookChanged(look); +} + + +void SATWindow::FindSnappingCandidates() { fOngoingSnapping = NULL; Modified: haiku/trunk/src/add-ons/decorators/SATDecorator/SATWindow.h =================================================================== --- haiku/trunk/src/add-ons/decorators/SATDecorator/SATWindow.h 2011-07-26 02:41:56 UTC (rev 42491) +++ haiku/trunk/src/add-ons/decorators/SATDecorator/SATWindow.h 2011-07-26 04:37:27 UTC (rev 42492) @@ -99,6 +99,7 @@ bool RemovedFromGroup(SATGroup* group, bool stayBelowMouse); void RemovedFromArea(WindowArea* area); + void WindowLookChanged(window_look look); bool StackWindow(SATWindow* child); Modified: haiku/trunk/src/add-ons/decorators/SATDecorator/StackAndTile.cpp =================================================================== --- haiku/trunk/src/add-ons/decorators/SATDecorator/StackAndTile.cpp 2011-07-26 02:41:56 UTC (rev 42491) +++ haiku/trunk/src/add-ons/decorators/SATDecorator/StackAndTile.cpp 2011-07-26 04:37:27 UTC (rev 42492) @@ -382,10 +382,19 @@ 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; Modified: haiku/trunk/src/add-ons/decorators/SATDecorator/StackAndTile.h =================================================================== --- haiku/trunk/src/add-ons/decorators/SATDecorator/StackAndTile.h 2011-07-26 02:41:56 UTC (rev 42491) +++ haiku/trunk/src/add-ons/decorators/SATDecorator/StackAndTile.h 2011-07-26 04:37:27 UTC (rev 42492) @@ -80,6 +80,8 @@ 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 @@ /*! 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) {} }; Modified: haiku/trunk/src/add-ons/decorators/SATDecorator/Stacking.cpp =================================================================== --- haiku/trunk/src/add-ons/decorators/SATDecorator/Stacking.cpp 2011-07-26 02:41:56 UTC (rev 42491) +++ haiku/trunk/src/add-ons/decorators/SATDecorator/Stacking.cpp 2011-07-26 04:37:27 UTC (rev 42492) @@ -239,6 +239,9 @@ 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; @@ -277,6 +280,32 @@ 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() { if (!fStackingParent) Modified: haiku/trunk/src/add-ons/decorators/SATDecorator/Stacking.h =================================================================== --- haiku/trunk/src/add-ons/decorators/SATDecorator/Stacking.h 2011-07-26 02:41:56 UTC (rev 42491) +++ haiku/trunk/src/add-ons/decorators/SATDecorator/Stacking.h 2011-07-26 04:37:27 UTC (rev 42492) @@ -34,8 +34,9 @@ void DoWindowLayout(); void RemovedFromArea(WindowArea* area); - + void WindowLookChanged(window_look look); private: + bool _IsStackableWindow(Window* window); void _ClearSearchResult(); void _HighlightWindows(bool highlight = true); Modified: haiku/trunk/src/add-ons/decorators/SATDecorator/Tiling.cpp =================================================================== --- haiku/trunk/src/add-ons/decorators/SATDecorator/Tiling.cpp 2011-07-26 02:41:56 UTC (rev 42491) +++ haiku/trunk/src/add-ons/decorators/SATDecorator/Tiling.cpp 2011-07-26 04:37:27 UTC (rev 42492) @@ -46,6 +46,10 @@ { _ResetSearchResults(); + if (_IsTileableWindow(fSATWindow->GetWindow()) == false + || (group->CountItems() == 1 + && _IsTileableWindow(group->WindowAt(0)->GetWindow()) == false)) + return false; if (fSATWindow->GetGroup() == group) return false; @@ -78,7 +82,35 @@ } +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) { if (_FindFreeAreaInGroup(group, Corner::kLeftTop)) Modified: haiku/trunk/src/add-ons/decorators/SATDecorator/Tiling.h =================================================================== --- haiku/trunk/src/add-ons/decorators/SATDecorator/Tiling.h 2011-07-26 02:41:56 UTC (rev 42491) +++ haiku/trunk/src/add-ons/decorators/SATDecorator/Tiling.h 2011-07-26 04:37:27 UTC (rev 42492) @@ -25,7 +25,10 @@ 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); Modified: haiku/trunk/src/servers/app/Desktop.cpp =================================================================== --- haiku/trunk/src/servers/app/Desktop.cpp 2011-07-26 02:41:56 UTC (rev 42491) +++ haiku/trunk/src/servers/app/Desktop.cpp 2011-07-26 04:37:27 UTC (rev 42492) @@ -1724,6 +1724,8 @@ if (window == FocusWindow() && !window->IsVisible()) SetFocusWindow(); + NotifyWindowFeelChanged(window, newFeel); + UnlockAllWindows(); } Modified: haiku/trunk/src/servers/app/DesktopListener.cpp =================================================================== --- haiku/trunk/src/servers/app/DesktopListener.cpp 2011-07-26 02:41:56 UTC (rev 42491) +++ haiku/trunk/src/servers/app/DesktopListener.cpp 2011-07-26 04:37:27 UTC (rev 42492) @@ -284,6 +284,19 @@ } +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) Modified: haiku/trunk/src/servers/app/DesktopListener.h =================================================================== --- haiku/trunk/src/servers/app/DesktopListener.h 2011-07-26 02:41:56 UTC (rev 42491) +++ haiku/trunk/src/servers/app/DesktopListener.h 2011-07-26 04:37:27 UTC (rev 42492) @@ -65,6 +65,8 @@ 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 @@ 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); Modified: haiku/trunk/src/servers/app/Window.cpp =================================================================== --- haiku/trunk/src/servers/app/Window.cpp 2011-07-26 02:41:56 UTC (rev 42491) +++ haiku/trunk/src/servers/app/Window.cpp 2011-07-26 04:37:27 UTC (rev 42492) @@ -2100,6 +2100,8 @@ 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 @@ } - bool Window::MoveToTopStackLayer() {