* Desktop::_UpdateFloating() and Desktop::_UpdateSubsetWorkspaces() both
assumed that there was only a single window that was responsible for the workspaces of a floating/subset window. Of course, any number of windows can make up the workspaces of those. This fixes bug #2506. * Added a Window::InSubsetWorkspace() method to complement SubsetWorkspaces(). * Minor cleanup. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26371 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
+15
-16
@@ -1106,14 +1106,17 @@ Desktop::_UpdateFloating(int32 previousWorkspace, int32 nextWorkspace,
|
|||||||
&& floating->Feel() != B_FLOATING_APP_WINDOW_FEEL)
|
&& floating->Feel() != B_FLOATING_APP_WINDOW_FEEL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (fFront != NULL && fFront->IsNormal() && floating->HasInSubset(fFront)) {
|
if (fFront != NULL && fFront->IsNormal()
|
||||||
|
&& floating->HasInSubset(fFront)) {
|
||||||
// is now visible
|
// is now visible
|
||||||
if (_Windows(previousWorkspace).HasWindow(floating)
|
if (_Windows(previousWorkspace).HasWindow(floating)
|
||||||
&& previousWorkspace != nextWorkspace) {
|
&& previousWorkspace != nextWorkspace
|
||||||
|
&& !floating->InSubsetWorkspace(previousWorkspace)) {
|
||||||
// but no longer on the previous workspace
|
// but no longer on the previous workspace
|
||||||
_Windows(previousWorkspace).RemoveWindow(floating);
|
_Windows(previousWorkspace).RemoveWindow(floating);
|
||||||
floating->SetCurrentWorkspace(-1);
|
floating->SetCurrentWorkspace(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!_Windows(nextWorkspace).HasWindow(floating)) {
|
if (!_Windows(nextWorkspace).HasWindow(floating)) {
|
||||||
// but wasn't before
|
// but wasn't before
|
||||||
_Windows(nextWorkspace).AddWindow(floating,
|
_Windows(nextWorkspace).AddWindow(floating,
|
||||||
@@ -1122,11 +1125,11 @@ Desktop::_UpdateFloating(int32 previousWorkspace, int32 nextWorkspace,
|
|||||||
if (mouseEventWindow != fFront)
|
if (mouseEventWindow != fFront)
|
||||||
_ShowWindow(floating);
|
_ShowWindow(floating);
|
||||||
|
|
||||||
// TODO:
|
// TODO: put the floating last in the floating window list to
|
||||||
// put the floating last in the floating window list to preserve
|
// preserve the on screen window order
|
||||||
// the on screen window order
|
|
||||||
}
|
}
|
||||||
} else if (_Windows(previousWorkspace).HasWindow(floating)) {
|
} else if (_Windows(previousWorkspace).HasWindow(floating)
|
||||||
|
&& !floating->InSubsetWorkspace(previousWorkspace)) {
|
||||||
// was visible, but is no longer
|
// was visible, but is no longer
|
||||||
|
|
||||||
_Windows(previousWorkspace).RemoveWindow(floating);
|
_Windows(previousWorkspace).RemoveWindow(floating);
|
||||||
@@ -1140,8 +1143,7 @@ Desktop::_UpdateFloating(int32 previousWorkspace, int32 nextWorkspace,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*! Search the visible windows for a valid back window
|
||||||
Search the visible windows for a valid back window
|
|
||||||
(only desktop windows can't be back windows)
|
(only desktop windows can't be back windows)
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
@@ -1160,8 +1162,7 @@ Desktop::_UpdateBack()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*! Search the visible windows for a valid front window
|
||||||
Search the visible windows for a valid front window
|
|
||||||
(only normal and modal windows can be front windows)
|
(only normal and modal windows can be front windows)
|
||||||
|
|
||||||
The only place where you don't want to update floating windows is
|
The only place where you don't want to update floating windows is
|
||||||
@@ -1915,8 +1916,7 @@ Desktop::SetWindowDecoratorSettings(Window* window, const BMessage& settings)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*! Updates the workspaces of all subset windows with regard to the
|
||||||
Updates the workspaces of all subset windows with regard to the
|
|
||||||
specifed window.
|
specifed window.
|
||||||
If newIndex is not -1, it will move all subset windows that belong to
|
If newIndex is not -1, it will move all subset windows that belong to
|
||||||
the specifed window to the new workspace; this form is only called by
|
the specifed window to the new workspace; this form is only called by
|
||||||
@@ -1950,10 +1950,6 @@ Desktop::_UpdateSubsetWorkspaces(Window* window, int32 previousIndex,
|
|||||||
|
|
||||||
if (subset->HasInSubset(window)) {
|
if (subset->HasInSubset(window)) {
|
||||||
// adopt the workspace change
|
// adopt the workspace change
|
||||||
if (newIndex != -1) {
|
|
||||||
_Windows(newIndex).AddWindow(subset);
|
|
||||||
_Windows(previousIndex).RemoveWindow(subset);
|
|
||||||
} else
|
|
||||||
SetWindowWorkspaces(subset, subset->SubsetWorkspaces());
|
SetWindowWorkspaces(subset, subset->SubsetWorkspaces());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1967,6 +1963,9 @@ void
|
|||||||
Desktop::_ChangeWindowWorkspaces(Window* window, uint32 oldWorkspaces,
|
Desktop::_ChangeWindowWorkspaces(Window* window, uint32 oldWorkspaces,
|
||||||
uint32 newWorkspaces)
|
uint32 newWorkspaces)
|
||||||
{
|
{
|
||||||
|
if (oldWorkspaces == newWorkspaces)
|
||||||
|
return;
|
||||||
|
|
||||||
// apply changes to the workspaces' window lists
|
// apply changes to the workspaces' window lists
|
||||||
|
|
||||||
LockAllWindows();
|
LockAllWindows();
|
||||||
|
|||||||
@@ -1606,6 +1606,17 @@ Window::SubsetWorkspaces() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*! Returns wether or not a window is in the subset workspace list with the
|
||||||
|
specified \a index.
|
||||||
|
See SubsetWorkspaces().
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
Window::InSubsetWorkspace(int32 index) const
|
||||||
|
{
|
||||||
|
return (SubsetWorkspaces() & (1UL << index)) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// #pragma mark - static
|
// #pragma mark - static
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -209,6 +209,7 @@ public:
|
|||||||
bool HasInSubset(const Window* window) const;
|
bool HasInSubset(const Window* window) const;
|
||||||
bool SameSubset(Window* window);
|
bool SameSubset(Window* window);
|
||||||
uint32 SubsetWorkspaces() const;
|
uint32 SubsetWorkspaces() const;
|
||||||
|
bool InSubsetWorkspace(int32 index) const;
|
||||||
|
|
||||||
bool HasWorkspacesViews() const
|
bool HasWorkspacesViews() const
|
||||||
{ return fWorkspacesViewCount != 0; }
|
{ return fWorkspacesViewCount != 0; }
|
||||||
|
|||||||
Reference in New Issue
Block a user