hrev44543 adds 1 changeset to branch 'master' old head: a4bca8119323c016607b25c3d1dcec2f0d4b0010 new head: 59347b7f1bad11b684ce8c6ed594781f5d2eb4e2 ---------------------------------------------------------------------------- 59347b7: Reverse the meaning of BWindow fShowLevel to match BView. This also matches the client_window_info.show_hide_level field used in Deskbar and other applications. While doing this, keep fShowLevel fully in sync between BWindow and app_server, use one message type for both hiding and showing, and make the decision to show and hide the window in the app_server. Lastly make minimize behave as described in the Be Book: hidden windows cannot be minimized, and minimized windows which get hidden become unminimized. [ Ryan Leavengood <leavengood@xxxxxxxxx> ] ---------------------------------------------------------------------------- Revision: hrev44543 Commit: 59347b7f1bad11b684ce8c6ed594781f5d2eb4e2 URL: http://cgit.haiku-os.org/haiku/commit/?id=59347b7 Author: Ryan Leavengood <leavengood@xxxxxxxxx> Date: Tue Aug 14 05:03:35 2012 UTC ---------------------------------------------------------------------------- 6 files changed, 44 insertions(+), 58 deletions(-) headers/os/interface/Window.h | 1 + headers/private/app/ServerProtocol.h | 4 +- src/kits/interface/Window.cpp | 50 ++++++++++++------------- src/servers/app/ProfileMessageSupport.cpp | 4 +- src/servers/app/ServerWindow.cpp | 38 ++++++------------- src/servers/app/Window.cpp | 5 ++- ---------------------------------------------------------------------------- diff --git a/headers/os/interface/Window.h b/headers/os/interface/Window.h index 03a63e1..f1c406f 100644 --- a/headers/os/interface/Window.h +++ b/headers/os/interface/Window.h @@ -352,6 +352,7 @@ private: void _GetDecoratorSize(float* _borderWidth, float* _tabHeight) const; + void _SendShowOrHideMessage(); private: char* fTitle; diff --git a/headers/private/app/ServerProtocol.h b/headers/private/app/ServerProtocol.h index 9953719..ca6c19a 100644 --- a/headers/private/app/ServerProtocol.h +++ b/headers/private/app/ServerProtocol.h @@ -87,8 +87,8 @@ enum { AS_GET_CURSOR_BITMAP, // Window definitions - AS_SHOW_WINDOW, - AS_HIDE_WINDOW, + AS_SHOW_OR_HIDE_WINDOW, + AS_INTERNAL_HIDE_WINDOW, AS_MINIMIZE_WINDOW, AS_QUIT_WINDOW, AS_SEND_BEHIND, diff --git a/src/kits/interface/Window.cpp b/src/kits/interface/Window.cpp index 6f86831..64ee73a 100644 --- a/src/kits/interface/Window.cpp +++ b/src/kits/interface/Window.cpp @@ -589,7 +589,8 @@ BWindow::ChildAt(int32 index) const void BWindow::Minimize(bool minimize) { - if (IsModal() || IsFloating() || fMinimized == minimize || !Lock()) + if (IsModal() || IsFloating() || IsHidden() || fMinimized == minimize + || !Lock()) return; fMinimized = minimize; @@ -769,10 +770,7 @@ BWindow::MessageReceived(BMessage* msg) // connect all views to the server again fTopView->_CreateSelf(); - if (fShowLevel >= 1) { - fLink->StartMessage(AS_SHOW_WINDOW); - fLink->Flush(); - } + _SendShowOrHideMessage(); } return BLooper::MessageReceived(msg); @@ -2094,10 +2092,6 @@ BWindow::IsMinimized() const if (!locker.IsLocked()) return false; - // Hiding takes precendence over minimization!!! - if (IsHidden()) - return false; - return fMinimized; } @@ -2607,13 +2601,9 @@ BWindow::Show() { bool runCalled = true; if (Lock()) { - fShowLevel++; + fShowLevel--; - if (fShowLevel == 1) { - fLink->StartMessage(AS_SHOW_WINDOW); - fLink->Attach<int32>(fShowLevel); - fLink->Flush(); - } + _SendShowOrHideMessage(); runCalled = fRunCalled; @@ -2638,25 +2628,24 @@ BWindow::Show() void BWindow::Hide() { - if (!Lock()) - return; + if (Lock()) { + // If we are minimized and are about to be hidden, unminimize + if (IsMinimized() && fShowLevel == 0) + Minimize(false); + + fShowLevel++; - fShowLevel--; + _SendShowOrHideMessage(); - if (fShowLevel == 0) { - fLink->StartMessage(AS_HIDE_WINDOW); - fLink->Attach<int32>(fShowLevel); - fLink->Flush(); + Unlock(); } - - Unlock(); } bool BWindow::IsHidden() const { - return fShowLevel <= 0; + return fShowLevel > 0; } @@ -2793,7 +2782,7 @@ BWindow::_InitData(BRect frame, const char* title, window_look look, fInTransaction = bitmapToken >= 0; fUpdateRequested = false; fActive = false; - fShowLevel = 0; + fShowLevel = 1; fTopView = NULL; fFocus = NULL; @@ -4061,6 +4050,15 @@ BWindow::_GetDecoratorSize(float* _borderWidth, float* _tabHeight) const } +void +BWindow::_SendShowOrHideMessage() +{ + fLink->StartMessage(AS_SHOW_OR_HIDE_WINDOW); + fLink->Attach<int32>(fShowLevel); + fLink->Flush(); +} + + // #pragma mark - C++ binary compatibility kludge diff --git a/src/servers/app/ProfileMessageSupport.cpp b/src/servers/app/ProfileMessageSupport.cpp index 5472f04..519ebbf 100644 --- a/src/servers/app/ProfileMessageSupport.cpp +++ b/src/servers/app/ProfileMessageSupport.cpp @@ -66,8 +66,8 @@ string_for_message_code(uint32 code, BString& string) CODE(AS_GET_CURSOR_BITMAP); // Window definitions - CODE(AS_SHOW_WINDOW); - CODE(AS_HIDE_WINDOW); + CODE(AS_SHOW_OR_HIDE_WINDOW); + CODE(AS_INTERNAL_HIDE_WINDOW); CODE(AS_MINIMIZE_WINDOW); CODE(AS_QUIT_WINDOW); CODE(AS_SEND_BEHIND); diff --git a/src/servers/app/ServerWindow.cpp b/src/servers/app/ServerWindow.cpp index dd93b57..04c5a46 100644 --- a/src/servers/app/ServerWindow.cpp +++ b/src/servers/app/ServerWindow.cpp @@ -315,7 +315,7 @@ ServerWindow::_PrepareQuit() _Hide(); fDesktop->UnlockSingleWindow(); } else if (fThread >= B_OK) - PostMessage(AS_HIDE_WINDOW); + PostMessage(AS_INTERNAL_HIDE_WINDOW); } @@ -481,9 +481,7 @@ ServerWindow::GetInfo(window_info& info) info.window_right = (int)floor(fWindow->Frame().right); info.window_bottom = (int)floor(fWindow->Frame().bottom); - // 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.show_hide_level = fWindow->ShowLevel(); info.is_mini = fWindow->IsMinimized(); } @@ -596,44 +594,32 @@ void ServerWindow::_DispatchMessage(int32 code, BPrivate::LinkReceiver& link) { switch (code) { - case AS_SHOW_WINDOW: + case AS_SHOW_OR_HIDE_WINDOW: { - DTRACE(("ServerWindow %s: Message AS_SHOW_WINDOW\n", Title())); - _Show(); - int32 showLevel; if (link.Read<int32>(&showLevel) == B_OK) { + DTRACE(("ServerWindow %s: Message AS_SHOW_OR_HIDE_WINDOW, " + "show level: %d\n", Title(), showLevel)); + fWindow->SetShowLevel(showLevel); + if (showLevel <= 0) + _Show(); + else + _Hide(); } break; - } - case AS_HIDE_WINDOW: - { - DTRACE(("ServerWindow %s: Message AS_HIDE_WINDOW\n", Title())); + // Only for internal use within this class + case AS_INTERNAL_HIDE_WINDOW: _Hide(); - - int32 showLevel; - if (link.Read<int32>(&showLevel) == B_OK) { - fWindow->SetShowLevel(showLevel); - } break; - } case AS_MINIMIZE_WINDOW: { bool minimize; - if (link.Read<bool>(&minimize) == B_OK) { DTRACE(("ServerWindow %s: Message AS_MINIMIZE_WINDOW, " "minimize: %d\n", Title(), minimize)); - if (fWindow->ShowLevel() <= 0) { - // Window is currently hidden - ignore the minimize - // request, but keep the state in sync. - fWindow->SetMinimized(minimize); - break; - } - fDesktop->UnlockSingleWindow(); fDesktop->MinimizeWindow(fWindow, minimize); fDesktop->LockSingleWindow(); diff --git a/src/servers/app/Window.cpp b/src/servers/app/Window.cpp index 3cbb520..117e67a 100644 --- a/src/servers/app/Window.cpp +++ b/src/servers/app/Window.cpp @@ -102,9 +102,10 @@ Window::Window(const BRect& frame, const char *name, fInUpdate(false), fUpdatesEnabled(true), - // windows start hidden + // Windows start hidden fHidden(true), - fShowLevel(0), + // Hidden is 1 or more + fShowLevel(1), fMinimized(false), fIsFocus(false),