From 995ab7b3c6a636cd658df3d7d13a616d91ffb2d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Thu, 9 Feb 2006 18:28:29 +0000 Subject: [PATCH] The server now differentiates between hidden and minimized - that concept somehow got lost, before. It might not work 100% correctly yet, but it works good enough to hide the Tracker status window from the Deskbar, and thus, fixing bug #133. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@16314 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/private/app/ServerProtocol.h | 2 +- src/kits/interface/Window.cpp | 12 +++---- src/servers/app/ServerWindow.cpp | 48 +++++++++++++--------------- src/servers/app/WindowLayer.cpp | 11 +++++++ src/servers/app/WindowLayer.h | 6 +++- 5 files changed, 44 insertions(+), 35 deletions(-) diff --git a/headers/private/app/ServerProtocol.h b/headers/private/app/ServerProtocol.h index 7dc75a63f3..caa3288bed 100644 --- a/headers/private/app/ServerProtocol.h +++ b/headers/private/app/ServerProtocol.h @@ -72,6 +72,7 @@ enum { // Window definitions AS_SHOW_WINDOW, AS_HIDE_WINDOW, + AS_MINIMIZE_WINDOW, AS_QUIT_WINDOW, AS_SEND_BEHIND, AS_SET_LOOK, @@ -93,7 +94,6 @@ enum { AS_WINDOW_MOVE, AS_SET_SIZE_LIMITS, AS_ACTIVATE_WINDOW, - AS_WINDOW_MINIMIZE, AS_UPDATE_IF_NEEDED, // BPicture definitions diff --git a/src/kits/interface/Window.cpp b/src/kits/interface/Window.cpp index af137d9b99..c8d2a500fa 100644 --- a/src/kits/interface/Window.cpp +++ b/src/kits/interface/Window.cpp @@ -463,21 +463,17 @@ BWindow::ChildAt(int32 index) const void BWindow::Minimize(bool minimize) { - if (IsModal()) + if (IsModal() || IsFloating() || fMinimized == minimize) return; - if (IsFloating()) - return; - - if (fMinimized == minimize) - return; + Lock(); fMinimized = minimize; - Lock(); - fLink->StartMessage(AS_WINDOW_MINIMIZE); + fLink->StartMessage(AS_MINIMIZE_WINDOW); fLink->Attach(minimize); fLink->Flush(); + Unlock(); } diff --git a/src/servers/app/ServerWindow.cpp b/src/servers/app/ServerWindow.cpp index fe14052da9..a03294b64e 100644 --- a/src/servers/app/ServerWindow.cpp +++ b/src/servers/app/ServerWindow.cpp @@ -407,33 +407,16 @@ ServerWindow::NotifyQuitRequested() void ServerWindow::NotifyMinimize(bool minimize) { - // NOTE: if you do something else, other than sending a port message, PLEASE lock - // This function doesn't need much -- check to make sure that we should and - // send the message to the client. According to the BeBook, the BWindow hook function - // does all the heavy lifting for us. :) - bool sendMessages = false; + // The client is responsible for the actual minimization - if (minimize) { - if (!fWindowLayer->IsHidden()) { - Hide(); - sendMessages = true; - } - } else { - if (fWindowLayer->IsHidden()) { - Show(); - sendMessages = true; - } - } + BMessage msg(B_MINIMIZE); + msg.AddInt64("when", real_time_clock_usecs()); + msg.AddBool("minimize", minimize); - if (sendMessages) { - BMessage msg(B_MINIMIZE); - msg.AddInt64("when", real_time_clock_usecs()); - msg.AddBool("minimize", minimize); - - SendMessageToClient(&msg); - } + SendMessageToClient(&msg); } + //! Sends a message to the client to perform a Zoom void ServerWindow::NotifyZoom() @@ -463,8 +446,8 @@ ServerWindow::GetInfo(window_info& info) info.window_right = (int)floor(fWindowLayer->Frame().right); info.window_bottom = (int)floor(fWindowLayer->Frame().bottom); - info.show_hide_level = fWindowLayer->IsHidden() ? 1 : -1; // ??? - info.is_mini = fWindowLayer->IsHidden(); + info.show_hide_level = fWindowLayer->IsHidden() ? 1 : 0; // ??? + info.is_mini = fWindowLayer->IsMinimized(); } @@ -586,6 +569,21 @@ ServerWindow::_DispatchMessage(int32 code, BPrivate::LinkReceiver &link) Hide(); break; + case AS_MINIMIZE_WINDOW: + { + DTRACE(("ServerWindow %s: Message AS_MINIMIZE_WINDOW\n", Title())); + bool minimize; + if (link.Read(&minimize) == B_OK) { + if (minimize && !fWindowLayer->IsHidden()) + Hide(); + else if (!minimize && fWindowLayer->IsHidden()) + Show(); + + fWindowLayer->SetMinimized(minimize); + } + break; + } + case AS_ACTIVATE_WINDOW: { DTRACE(("ServerWindow %s: Message AS_ACTIVATE_WINDOW: ViewLayer: %s\n", Title(), fCurrentLayer->Name())); diff --git a/src/servers/app/WindowLayer.cpp b/src/servers/app/WindowLayer.cpp index 33d08b0251..63db26d7de 100644 --- a/src/servers/app/WindowLayer.cpp +++ b/src/servers/app/WindowLayer.cpp @@ -108,6 +108,7 @@ WindowLayer::WindowLayer(const BRect& frame, const char *name, // windows start hidden fHidden(true), + fMinimized(false), fIsFocus(false), fLook(look), @@ -1091,6 +1092,16 @@ WindowLayer::SetHidden(bool hidden) } +void +WindowLayer::SetMinimized(bool minimized) +{ + if (minimized == fMinimized) + return; + + fMinimized = minimized; +} + + bool WindowLayer::IsVisible() const { diff --git a/src/servers/app/WindowLayer.h b/src/servers/app/WindowLayer.h index 36ff98e537..f4f73c4dae 100644 --- a/src/servers/app/WindowLayer.h +++ b/src/servers/app/WindowLayer.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001-2005, Haiku, Inc. + * Copyright (c) 2001-2006, Haiku, Inc. * Distributed under the terms of the MIT license. * * Author: DarkWyrm @@ -139,6 +139,9 @@ class WindowLayer { void SetHidden(bool hidden); inline bool IsHidden() const { return fHidden; } + void SetMinimized(bool minimized); + inline bool IsMinimized() const { return fMinimized; } + void SetCurrentWorkspace(int32 index) { fCurrentWorkspace = index; } bool IsVisible() const; @@ -302,6 +305,7 @@ class WindowLayer { bool fInUpdate; bool fHidden; + bool fMinimized; bool fIsFocus; window_look fLook;