* 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 bool
Desktop::_WindowHasModal(WindowLayer* window) Desktop::_WindowHasModal(WindowLayer* window)
{ {
if (window == NULL || window->IsFloating()) if (window == NULL)
return false; return false;
for (WindowLayer* modal = fSubsetWindows.FirstWindow(); modal != NULL; for (WindowLayer* modal = fSubsetWindows.FirstWindow(); modal != NULL;
+19 -11
View File
@@ -1327,10 +1327,9 @@ WindowLayer::Backmost(WindowLayer* window, int32 workspace)
if (workspace == -1) if (workspace == -1)
workspace = fCurrentWorkspace; workspace = fCurrentWorkspace;
// Desktop windows are always backmost
if (fFeel == kDesktopWindowFeel) if (fFeel == kDesktopWindowFeel)
return NULL; return NULL;
else if (fFeel == B_FLOATING_ALL_WINDOW_FEEL)
return window ? window : PreviousWindow(workspace);
if (window == NULL) if (window == NULL)
window = PreviousWindow(workspace); window = PreviousWindow(workspace);
@@ -1361,7 +1360,8 @@ WindowLayer::Frontmost(WindowLayer* first, int32 workspace)
if (fFeel == kDesktopWindowFeel) if (fFeel == kDesktopWindowFeel)
return first ? first : NextWindow(workspace); 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; return NULL;
if (first == NULL) if (first == NULL)
@@ -1372,9 +1372,8 @@ WindowLayer::Frontmost(WindowLayer* first, int32 workspace)
if (window->IsHidden() || window == this) if (window->IsHidden() || window == this)
continue; continue;
// no one can be in front of a floating all window // no one can be in front of a menu window
if (window->Feel() == B_FLOATING_ALL_WINDOW_FEEL if (window->Feel() == kMenuWindowFeel)
|| window->Feel() == kMenuWindowFeel)
return window; return window;
if (window->HasInSubset(this)) if (window->HasInSubset(this))
@@ -1402,14 +1401,23 @@ WindowLayer::RemoveFromSubset(WindowLayer* window)
bool bool
WindowLayer::HasInSubset(WindowLayer* window) WindowLayer::HasInSubset(WindowLayer* window)
{ {
if (fFeel == B_MODAL_APP_WINDOW_FEEL && window->Feel() == B_MODAL_ALL_WINDOW_FEEL if (fFeel == window->Feel() || fFeel == B_NORMAL_WINDOW_FEEL)
|| fFeel == B_NORMAL_WINDOW_FEEL
|| fFeel == window->Feel())
return false; return false;
if (fFeel == B_FLOATING_ALL_WINDOW_FEEL if (fFeel == kMenuWindowFeel)
|| fFeel == B_MODAL_ALL_WINDOW_FEEL)
return true; 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 if (fFeel == B_FLOATING_APP_WINDOW_FEEL
|| fFeel == B_MODAL_APP_WINDOW_FEEL) || fFeel == B_MODAL_APP_WINDOW_FEEL)