From 8866e7b70937e501264723c09c18679fd32e8cf9 Mon Sep 17 00:00:00 2001 From: Adi Oanca Date: Sun, 13 Mar 2005 19:53:44 +0000 Subject: [PATCH] RootLayer.h: introduced a method for highlighting window tab when focus changes. RootLayer.cpp: window tab was properly lit only when changing focus with the mouse. Now the same happens when showing or hidding windows. Desktop.cpp: normal windows created after floating windows did not had B_FLOATING_APP_WINDOW_FEEL windows in their internal list, thus when such a window was selected to become the front most it did not show floating app windows in front of it. Fixed that now. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@11710 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/servers/app/server/Desktop.cpp | 11 +++++-- src/servers/app/server/RootLayer.cpp | 49 ++++++++++++++++------------ src/servers/app/server/RootLayer.h | 1 + 3 files changed, 38 insertions(+), 23 deletions(-) diff --git a/src/servers/app/server/Desktop.cpp b/src/servers/app/server/Desktop.cpp index 797917d55e..14e2fb95ad 100644 --- a/src/servers/app/server/Desktop.cpp +++ b/src/servers/app/server/Desktop.cpp @@ -257,19 +257,24 @@ void Desktop::AddWinBorder(WinBorder *winBorder) // add FLOATING_APP windows to the local list of all normal windows. // This is to keep the order all floating windows (app or subset) when we go from // one normal window to another. - if (feel == B_FLOATING_APP_WINDOW_FEEL) + if (feel == B_FLOATING_APP_WINDOW_FEEL || feel == B_NORMAL_WINDOW_FEEL) { WinBorder *wb = NULL; int32 count = fWinBorderList.CountItems(); + int32 feelToLookFor = (feel == B_NORMAL_WINDOW_FEEL ? + B_FLOATING_APP_WINDOW_FEEL : + B_NORMAL_WINDOW_FEEL); for(int32 i = 0; i < count; i++) { wb = (WinBorder*)fWinBorderList.ItemAt(i); if (wb->App()->ClientTeamID() == winBorder->App()->ClientTeamID() - && wb->Window()->Feel() == B_NORMAL_WINDOW_FEEL) + && wb->Window()->Feel() == feelToLookFor) // R2: RootLayer comparison is needed. { - wb->fFMWList.AddWinBorder(winBorder); + feel == B_NORMAL_WINDOW_FEEL ? + winBorder->fFMWList.AddWinBorder(wb) : + wb->fFMWList.AddWinBorder(winBorder); } } } diff --git a/src/servers/app/server/RootLayer.cpp b/src/servers/app/server/RootLayer.cpp index 27cfaf63a1..222ef9a960 100644 --- a/src/servers/app/server/RootLayer.cpp +++ b/src/servers/app/server/RootLayer.cpp @@ -916,24 +916,7 @@ void RootLayer::MouseEventHandler(int32 code, BPortLink& msg) invalidate_layer(this, fFull); } - WinBorder *focus = FocusWinBorder(); - if (exFocus || focus) - { - if (exFocus && exFocus != focus && exFocus->fDecorator) - exFocus->fDecorator->SetFocus(false); - if (focus && exFocus != focus && focus->fDecorator) - focus->fDecorator->SetFocus(true); - - if (exFocus && focus != exFocus) - { - // TODO: this line is a hack, decorator is drawn twice. - BRegion reg(exFocus->fVisible); - if (focus) - reg.Include(&focus->fVisible); - - redraw_layer(this, reg); - } - } + draw_window_tab(exFocus, FocusWinBorder()); if (action == DEC_DRAG) { @@ -1555,6 +1538,7 @@ void RootLayer::show_winBorder(WinBorder *winBorder) { bool invalidate = false; bool invalid; + WinBorder *exFocus = FocusWinBorder(); winBorder->Show(false); @@ -1576,18 +1560,22 @@ void RootLayer::show_winBorder(WinBorder *winBorder) } get_workspace_windows(); + if (invalidate) { // TODO: should it be improved by calling with region of hidden windows // plus the full regions of new windows??? invalidate_layer(this, fFull); } + + draw_window_tab(exFocus, FocusWinBorder()); } void RootLayer::hide_winBorder(WinBorder *winBorder) { - bool invalidate = false; - bool invalid; + bool invalidate = false; + bool invalid; + WinBorder *exFocus = FocusWinBorder(); winBorder->Hide(false); @@ -1610,6 +1598,8 @@ void RootLayer::hide_winBorder(WinBorder *winBorder) // plus the full regions of new windows??? invalidate_layer(this, fFull); } + + draw_window_tab(exFocus, FocusWinBorder()); } void RootLayer::get_workspace_windows() @@ -1636,3 +1626,22 @@ void RootLayer::get_workspace_windows() //printf("Adi: get_workspace_windows DONE\n"); } +void RootLayer::draw_window_tab(WinBorder *exFocus, WinBorder *focus) +{ + if (exFocus || focus) + { + if (exFocus && exFocus != focus && exFocus->fDecorator) + exFocus->fDecorator->SetFocus(false); + if (focus && exFocus != focus && focus->fDecorator) + focus->fDecorator->SetFocus(true); + + if (exFocus && focus != exFocus) + { + // TODO: this line is a hack, decorator is drawn twice. + BRegion reg(exFocus->fVisible); + if (focus) + reg.Include(&focus->fVisible); + redraw_layer(this, reg); + } + } +} diff --git a/src/servers/app/server/RootLayer.h b/src/servers/app/server/RootLayer.h index 1a76e736d4..1cc8940143 100644 --- a/src/servers/app/server/RootLayer.h +++ b/src/servers/app/server/RootLayer.h @@ -137,6 +137,7 @@ friend class Desktop; void hide_winBorder(WinBorder* winBorder); void get_workspace_windows(); + void draw_window_tab(WinBorder *exFocus, WinBorder *focus); void invalidate_layer(Layer *layer, const BRegion ®ion); void redraw_layer(Layer *layer, const BRegion ®ion);