* Changed window hierarchy: menu windows are now always on top, then come modal

all windows, and after them floating all windows. This is different from BeOS
  (where floating all windows are on top of modal all windows), but the way its
  now seems to be more logical. This fixes bug #453 - there remains a problem
  with open menus, though, but that has to be solved differently by introducing
  a new feel.
* Also, modal app windows are now blocking floating app windows.
* Simplified WindowLayer::Frontmost() and Backmost() a bit, moving more stuff
  into HasInSubset().


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@17119 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2006-04-13 11:49:42 +00:00
parent a0b6c232be
commit b527dedcdd
2 changed files with 20 additions and 12 deletions
+1 -1
View File
@@ -987,7 +987,7 @@ Desktop::_UpdateFronts(bool updateFloating)
bool
Desktop::_WindowHasModal(WindowLayer* window)
{
if (window == NULL || window->IsFloating())
if (window == NULL)
return false;
for (WindowLayer* modal = fSubsetWindows.FirstWindow(); modal != NULL;
+19 -11
View File
@@ -1327,10 +1327,9 @@ WindowLayer::Backmost(WindowLayer* window, int32 workspace)
if (workspace == -1)
workspace = fCurrentWorkspace;
// Desktop windows are always backmost
if (fFeel == kDesktopWindowFeel)
return NULL;
else if (fFeel == B_FLOATING_ALL_WINDOW_FEEL)
return window ? window : PreviousWindow(workspace);
if (window == NULL)
window = PreviousWindow(workspace);
@@ -1361,7 +1360,8 @@ WindowLayer::Frontmost(WindowLayer* first, int32 workspace)
if (fFeel == kDesktopWindowFeel)
return first ? first : NextWindow(workspace);
if (fFeel == B_FLOATING_ALL_WINDOW_FEEL || fFeel == kMenuWindowFeel)
// menu windows are always on top
if (fFeel == kMenuWindowFeel)
return NULL;
if (first == NULL)
@@ -1372,9 +1372,8 @@ WindowLayer::Frontmost(WindowLayer* first, int32 workspace)
if (window->IsHidden() || window == this)
continue;
// no one can be in front of a floating all window
if (window->Feel() == B_FLOATING_ALL_WINDOW_FEEL
|| window->Feel() == kMenuWindowFeel)
// no one can be in front of a menu window
if (window->Feel() == kMenuWindowFeel)
return window;
if (window->HasInSubset(this))
@@ -1402,14 +1401,23 @@ WindowLayer::RemoveFromSubset(WindowLayer* window)
bool
WindowLayer::HasInSubset(WindowLayer* window)
{
if (fFeel == B_MODAL_APP_WINDOW_FEEL && window->Feel() == B_MODAL_ALL_WINDOW_FEEL
|| fFeel == B_NORMAL_WINDOW_FEEL
|| fFeel == window->Feel())
if (fFeel == window->Feel() || fFeel == B_NORMAL_WINDOW_FEEL)
return false;
if (fFeel == B_FLOATING_ALL_WINDOW_FEEL
|| fFeel == B_MODAL_ALL_WINDOW_FEEL)
if (fFeel == kMenuWindowFeel)
return true;
if (window->Feel() == kMenuWindowFeel)
return false;
if (fFeel == B_MODAL_ALL_WINDOW_FEEL)
return true;
if (window->Feel() == B_MODAL_ALL_WINDOW_FEEL)
return false;
if (fFeel == B_FLOATING_ALL_WINDOW_FEEL)
return true;
if (window->Feel() == B_FLOATING_ALL_WINDOW_FEEL)
return false;
if (fFeel == B_FLOATING_APP_WINDOW_FEEL
|| fFeel == B_MODAL_APP_WINDOW_FEEL)