hrev44520 adds 2 changesets to branch 'master' old head: 15ed6a1e56f3c1a61c8aff7b310a0665f97e1c95 new head: 1a59d9dbeb966f507fa9f5899d2728821df4b010 ---------------------------------------------------------------------------- 96cabf5: Sync BWindow fShowLevel with the app_server. Implementing the window_info.show_hide_level in terms of this solves the problem of minimized windows also being considered hidden, when really they are just hidden in the app_server. window_info.show_hide_level is still defined backwards with a comment making that clear. Also removed sending fShowLevel in the minimize request since it is now maintained in the app_server. Fixes #4127. 1a59d9d: Improve Deskbar's WindowShouldBeListed utility function. It now has all the knowledge about whether a window should be shown or not. Since I fixed #4127, ORing with is_mini is no longer needed. [ Ryan Leavengood <leavengood@xxxxxxxxx> ] ---------------------------------------------------------------------------- 7 files changed, 48 insertions(+), 24 deletions(-) src/apps/deskbar/ExpandoMenuBar.cpp | 4 +--- src/apps/deskbar/WindowMenu.cpp | 13 ++++++------ src/apps/deskbar/WindowMenu.h | 3 ++- src/kits/interface/Window.cpp | 3 ++- src/servers/app/ServerWindow.cpp | 34 ++++++++++++++++++++----------- src/servers/app/Window.cpp | 11 ++++++++++ src/servers/app/Window.h | 4 ++++ ############################################################################ Commit: 96cabf581a611e030a1156d9569ca8a11524cb61 URL: http://cgit.haiku-os.org/haiku/commit/?id=96cabf5 Author: Ryan Leavengood <leavengood@xxxxxxxxx> Date: Sun Aug 12 14:30:10 2012 UTC Ticket: https://dev.haiku-os.org/ticket/4127 Sync BWindow fShowLevel with the app_server. Implementing the window_info.show_hide_level in terms of this solves the problem of minimized windows also being considered hidden, when really they are just hidden in the app_server. window_info.show_hide_level is still defined backwards with a comment making that clear. Also removed sending fShowLevel in the minimize request since it is now maintained in the app_server. Fixes #4127. ---------------------------------------------------------------------------- diff --git a/src/kits/interface/Window.cpp b/src/kits/interface/Window.cpp index 8292e52..6f86831 100644 --- a/src/kits/interface/Window.cpp +++ b/src/kits/interface/Window.cpp @@ -596,7 +596,6 @@ BWindow::Minimize(bool minimize) fLink->StartMessage(AS_MINIMIZE_WINDOW); fLink->Attach<bool>(minimize); - fLink->Attach<int32>(fShowLevel); fLink->Flush(); Unlock(); @@ -2612,6 +2611,7 @@ BWindow::Show() if (fShowLevel == 1) { fLink->StartMessage(AS_SHOW_WINDOW); + fLink->Attach<int32>(fShowLevel); fLink->Flush(); } @@ -2645,6 +2645,7 @@ BWindow::Hide() if (fShowLevel == 0) { fLink->StartMessage(AS_HIDE_WINDOW); + fLink->Attach<int32>(fShowLevel); fLink->Flush(); } diff --git a/src/servers/app/ServerWindow.cpp b/src/servers/app/ServerWindow.cpp index 8ffea24..dd93b57 100644 --- a/src/servers/app/ServerWindow.cpp +++ b/src/servers/app/ServerWindow.cpp @@ -481,7 +481,9 @@ ServerWindow::GetInfo(window_info& info) info.window_right = (int)floor(fWindow->Frame().right); info.window_bottom = (int)floor(fWindow->Frame().bottom); - info.show_hide_level = fWindow->IsHidden() ? 1 : 0; // ??? + // This is essentially opposite of the ShowLevel, meaning a window is + // hidden if it is 1 or more, and shown if it is 0 or less. + info.show_hide_level = fWindow->ShowLevel() <= 0 ? 1 : 0; info.is_mini = fWindow->IsMinimized(); } @@ -595,32 +597,40 @@ ServerWindow::_DispatchMessage(int32 code, BPrivate::LinkReceiver& link) { switch (code) { case AS_SHOW_WINDOW: + { DTRACE(("ServerWindow %s: Message AS_SHOW_WINDOW\n", Title())); _Show(); + + int32 showLevel; + if (link.Read<int32>(&showLevel) == B_OK) { + fWindow->SetShowLevel(showLevel); + } break; + } case AS_HIDE_WINDOW: + { DTRACE(("ServerWindow %s: Message AS_HIDE_WINDOW\n", Title())); _Hide(); - break; + int32 showLevel; + if (link.Read<int32>(&showLevel) == B_OK) { + fWindow->SetShowLevel(showLevel); + } + break; + } case AS_MINIMIZE_WINDOW: { - int32 showLevel; bool minimize; - link.Read<bool>(&minimize); - if (link.Read<int32>(&showLevel) == B_OK) { + if (link.Read<bool>(&minimize) == B_OK) { DTRACE(("ServerWindow %s: Message AS_MINIMIZE_WINDOW, " - "showLevel: %ld, minimize: %d\n", Title(), showLevel, - minimize)); + "minimize: %d\n", Title(), minimize)); - if (showLevel <= 0) { - // window is currently hidden - ignore the minimize request + if (fWindow->ShowLevel() <= 0) { + // Window is currently hidden - ignore the minimize + // request, but keep the state in sync. fWindow->SetMinimized(minimize); - // TODO: commenting this out makes BWindow::fMinimized - // and Window::fMinimized go out of sync. However, not - // doing it currently causes #4127. break; } diff --git a/src/servers/app/Window.cpp b/src/servers/app/Window.cpp index ffc7556..3cbb520 100644 --- a/src/servers/app/Window.cpp +++ b/src/servers/app/Window.cpp @@ -104,6 +104,7 @@ Window::Window(const BRect& frame, const char *name, // windows start hidden fHidden(true), + fShowLevel(0), fMinimized(false), fIsFocus(false), @@ -1080,6 +1081,16 @@ Window::SetHidden(bool hidden) void +Window::SetShowLevel(int32 showLevel) +{ + if (showLevel == fShowLevel) + return; + + fShowLevel = showLevel; +} + + +void Window::SetMinimized(bool minimized) { if (minimized == fMinimized) diff --git a/src/servers/app/Window.h b/src/servers/app/Window.h index 887f2d8..6817df2 100644 --- a/src/servers/app/Window.h +++ b/src/servers/app/Window.h @@ -210,6 +210,9 @@ public: void SetHidden(bool hidden); inline bool IsHidden() const { return fHidden; } + void SetShowLevel(int32 showLevel); + inline int32 ShowLevel() const { return fShowLevel; } + void SetMinimized(bool minimized); inline bool IsMinimized() const { return fMinimized; } @@ -410,6 +413,7 @@ protected: bool fUpdatesEnabled : 1; bool fHidden : 1; + int32 fShowLevel; bool fMinimized : 1; bool fIsFocus : 1; ############################################################################ Revision: hrev44520 Commit: 1a59d9dbeb966f507fa9f5899d2728821df4b010 URL: http://cgit.haiku-os.org/haiku/commit/?id=1a59d9d Author: Ryan Leavengood <leavengood@xxxxxxxxx> Date: Sun Aug 12 14:37:00 2012 UTC Ticket: https://dev.haiku-os.org/ticket/4127 Improve Deskbar's WindowShouldBeListed utility function. It now has all the knowledge about whether a window should be shown or not. Since I fixed #4127, ORing with is_mini is no longer needed. ---------------------------------------------------------------------------- diff --git a/src/apps/deskbar/ExpandoMenuBar.cpp b/src/apps/deskbar/ExpandoMenuBar.cpp index a13d2c3..15d724f 100644 --- a/src/apps/deskbar/ExpandoMenuBar.cpp +++ b/src/apps/deskbar/ExpandoMenuBar.cpp @@ -859,9 +859,7 @@ TExpandoMenuBar::monitor_team_windows(void* arg) if (wInfo == NULL) continue; - if (TWindowMenu::WindowShouldBeListed(wInfo->feel) - && (wInfo->show_hide_level <= 0 - || wInfo->is_mini)) { + if (TWindowMenu::WindowShouldBeListed(wInfo)) { // Check if we have a matching window item... item = teamItem->ExpandedWindowItem( wInfo->server_token); diff --git a/src/apps/deskbar/WindowMenu.cpp b/src/apps/deskbar/WindowMenu.cpp index 65d98f2..dbde4ac 100644 --- a/src/apps/deskbar/WindowMenu.cpp +++ b/src/apps/deskbar/WindowMenu.cpp @@ -67,12 +67,12 @@ const int32 kSystemFloater = 6; #define B_TRANSLATION_CONTEXT "WindowMenu" bool -TWindowMenu::WindowShouldBeListed(uint32 behavior) +TWindowMenu::WindowShouldBeListed(client_window_info* info) { - if (behavior == kNormalWindow || behavior == kWindowScreen) - return true; - - return false; + return ((info->feel == kNormalWindow || info->feel == kWindowScreen) + // Window has the right feel + && info->show_hide_level <= 0); + // Window is not hidden } @@ -129,8 +129,7 @@ TWindowMenu::AttachedToWindow() if (wInfo == NULL) continue; - if (WindowShouldBeListed(wInfo->feel) - && (wInfo->show_hide_level <= 0 || wInfo->is_mini)) { + if (WindowShouldBeListed(wInfo)) { // Don't add new items if we're expanded. We've already done // this, they've just been moved. int32 numItems = CountItems(); diff --git a/src/apps/deskbar/WindowMenu.h b/src/apps/deskbar/WindowMenu.h index d479453..c75dfff 100644 --- a/src/apps/deskbar/WindowMenu.h +++ b/src/apps/deskbar/WindowMenu.h @@ -43,6 +43,7 @@ All rights reserved. #include <Menu.h> #include <String.h> +#include <WindowInfo.h> class TWindowMenu : public BMenu { @@ -54,7 +55,7 @@ class TWindowMenu : public BMenu { BPoint ScreenLocation(); void SetExpanded(bool status, int addAtIndex); - static bool WindowShouldBeListed(uint32 behavior); + static bool WindowShouldBeListed(client_window_info* info); private: const BList *fTeam;