From cf2aeb201fe3785161bb0502effba053b0d76879 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Wed, 21 Feb 2007 07:57:21 +0000 Subject: [PATCH] * Implemented BDragger::{Show|Hide}AllDraggers() and its backend in the app_server. This fixes bug #242. The value is currently stored in a separate file. * Removed some unused codes from ServerProtocol.h. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20188 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/os/interface/Dragger.h | 5 + headers/private/app/ServerProtocol.h | 17 ++-- headers/private/interface/DraggerPrivate.h | 23 +++++ src/kits/app/Application.cpp | 40 ++++---- src/kits/interface/Dragger.cpp | 102 +++++++++++++++------ src/servers/app/DesktopSettings.cpp | 56 +++++++++-- src/servers/app/DesktopSettings.h | 16 ++-- src/servers/app/DesktopSettingsPrivate.h | 6 +- src/servers/app/ServerApp.cpp | 55 ++++++++++- 9 files changed, 243 insertions(+), 77 deletions(-) create mode 100644 headers/private/interface/DraggerPrivate.h diff --git a/headers/os/interface/Dragger.h b/headers/os/interface/Dragger.h index c33aee3880..52224e919a 100644 --- a/headers/os/interface/Dragger.h +++ b/headers/os/interface/Dragger.h @@ -67,18 +67,23 @@ class BDragger : public BView { virtual BBitmap* DragBitmap(BPoint* offset, drawing_mode *mode); + class Private; + protected: bool IsVisibilityChanging() const; private: friend class BPrivate::ShelfContainerViewFilter; friend class BPrivate::replicant_data; + friend class Private; friend class BShelf; virtual void _ReservedDragger2(); virtual void _ReservedDragger3(); virtual void _ReservedDragger4(); + static void _UpdateShowAllDraggers(bool visible); + BDragger& operator=(const BDragger& other); void _AddToList(); diff --git a/headers/private/app/ServerProtocol.h b/headers/private/app/ServerProtocol.h index 8295d220b5..c50d1fd1d9 100644 --- a/headers/private/app/ServerProtocol.h +++ b/headers/private/app/ServerProtocol.h @@ -17,9 +17,9 @@ // Server port names. The input port is the port which is used to receive // input messages from the Input Server. The other is the "main" port for // the server and is utilized mostly by BApplication objects. -#define SERVER_PORT_NAME "OBappserver" +#define SERVER_PORT_NAME "haiku app_server" #if TEST_MODE -# define SERVER_INPUT_PORT "OBinputport" +# define SERVER_INPUT_PORT "haiku input port" #endif #define AS_REQUEST_COLOR_KEY 0x00010000 @@ -29,8 +29,10 @@ enum { // NOTE: all defines have to start with "AS_" to let the "code_to_name" // utility work correctly - AS_REGISTER_INPUT_SERVER = 1, AS_GET_DESKTOP, + AS_REGISTER_INPUT_SERVER = 1, + AS_EVENT_STREAM_CLOSED, + // Notification of event stream closing to restart input_server // Desktop definitions (through the ServerApp, though) AS_GET_WINDOW_LIST, @@ -93,7 +95,6 @@ enum { AS_SET_SIZE_LIMITS, AS_ACTIVATE_WINDOW, AS_IS_FRONT_WINDOW, - AS_UPDATE_IF_NEEDED, // BPicture definitions AS_CREATE_PICTURE, @@ -176,14 +177,13 @@ enum { AS_GET_MENU_INFO, AS_SET_MENU_INFO, AS_IDLE_TIME, - AS_SELECT_PRINTER_PANEL, - AS_ADD_PRINTER_PANEL, - AS_RUN_BE_ABOUT, AS_SET_MOUSE_MODE, AS_GET_MOUSE_MODE, AS_GET_MOUSE, AS_SET_DECORATOR_SETTINGS, AS_GET_DECORATOR_SETTINGS, + AS_GET_SHOW_ALL_DRAGGERS, + AS_SET_SHOW_ALL_DRAGGERS, // Graphics calls AS_SET_HIGH_COLOR, @@ -289,9 +289,6 @@ enum { AS_DIRECT_WINDOW_GET_SYNC_DATA, AS_DIRECT_WINDOW_SET_FULLSCREEN, - // Notification of event stream closing to restart input_server - AS_EVENT_STREAM_CLOSED, - AS_LAST_CODE }; diff --git a/headers/private/interface/DraggerPrivate.h b/headers/private/interface/DraggerPrivate.h new file mode 100644 index 0000000000..357efe53f4 --- /dev/null +++ b/headers/private/interface/DraggerPrivate.h @@ -0,0 +1,23 @@ +/* + * Copyright 2007, Haiku, Inc. All Rights Reserved. + * Distributed under the terms of the MIT License. + */ +#ifndef _DRAGGER_PRIVATE_H +#define _DRAGGER_PRIVATE_H + + +#include + + +class BDragger::Private { + public: + Private(BDragger* dragger) : fDragger(dragger) {} + + static void UpdateShowAllDraggers(bool visible) + { BDragger::_UpdateShowAllDraggers(visible); } + + private: + BDragger* fDragger; +}; + +#endif // _DRAGGER_PRIVATE_H diff --git a/src/kits/app/Application.cpp b/src/kits/app/Application.cpp index c94c1519e1..8e4922739e 100644 --- a/src/kits/app/Application.cpp +++ b/src/kits/app/Application.cpp @@ -9,16 +9,20 @@ */ -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include #include -#include #include #include #include @@ -30,20 +34,16 @@ #include #include #include -#include #include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include using namespace BPrivate; -// Globals --------------------------------------------------------------------- BApplication *be_app = NULL; BMessenger be_app_messenger; @@ -953,12 +953,14 @@ BApplication::DispatchMessage(BMessage *message, BHandler *handler) case _SHOW_DRAG_HANDLES_: { - bool visible = false; - message->FindBool("visible", &visible); - // TODO: Call the registrar or whoever is responsible for this + bool show; + if (message->FindBool("show", &show) != B_OK) + break; + + BDragger::Private::UpdateShowAllDraggers(show); break; } - + // TODO: Handle these as well case _DISPOSE_DRAG_: case _PING_: diff --git a/src/kits/interface/Dragger.cpp b/src/kits/interface/Dragger.cpp index 945ec39e05..1e2885a3e9 100644 --- a/src/kits/interface/Dragger.cpp +++ b/src/kits/interface/Dragger.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2006, Haiku. + * Copyright 2001-2007, Haiku. * Distributed under the terms of the MIT License. * * Authors: @@ -8,6 +8,9 @@ //! BDragger represents a replicant "handle". + +#include +#include #include #include @@ -46,14 +49,14 @@ kHandBitmap[] = { BDragger::BDragger(BRect bounds, BView *target, uint32 rmask, uint32 flags) - : BView(bounds, "_dragger_", rmask, flags), - fTarget(target), - fRelation(TARGET_UNKNOWN), - fShelf(NULL), - fTransition(false), - fIsZombie(false), - fErrCount(0), - fPopUp(NULL) + : BView(bounds, "_dragger_", rmask, flags), + fTarget(target), + fRelation(TARGET_UNKNOWN), + fShelf(NULL), + fTransition(false), + fIsZombie(false), + fErrCount(0), + fPopUp(NULL) { fBitmap = new BBitmap(BRect(0.0f, 0.0f, 7.0f, 7.0f), B_CMAP8, false, false); fBitmap->SetBits(kHandBitmap, fBitmap->BitsLength(), 0, B_CMAP8); @@ -61,14 +64,14 @@ BDragger::BDragger(BRect bounds, BView *target, uint32 rmask, uint32 flags) BDragger::BDragger(BMessage *data) - : BView(data), - fTarget(NULL), - fRelation(TARGET_UNKNOWN), - fShelf(NULL), - fTransition(false), - fIsZombie(false), - fErrCount(0), - fPopUp(NULL) + : BView(data), + fTarget(NULL), + fRelation(TARGET_UNKNOWN), + fShelf(NULL), + fTransition(false), + fIsZombie(false), + fErrCount(0), + fPopUp(NULL) { data->FindInt32("_rel", (int32 *)&fRelation); @@ -270,8 +273,8 @@ BDragger::MessageReceived(BMessage *msg) "Can't delete this replicant from its original application. Life goes on.", "OK", NULL, NULL, B_WIDTH_FROM_WIDEST, B_WARNING_ALERT))->Go(NULL); } - } else if (msg->what == B_SCREEN_CHANGED) { - // TODO: this code is to be called whenever the "are draggers drawn" option is changed + } else if (msg->what == _SHOW_DRAG_HANDLES_) { + // this code is used whenever the "are draggers drawn" option is changed if (fRelation == TARGET_IS_CHILD) { fTransition = true; Invalidate(); @@ -306,16 +309,34 @@ BDragger::FrameResized(float newWidth, float newHeight) status_t BDragger::ShowAllDraggers() { - // TODO: Implement. Should ask the registrar or the app server - return B_OK; + BPrivate::AppServerLink link; + link.StartMessage(AS_SET_SHOW_ALL_DRAGGERS); + link.Attach(true); + + status_t status = link.Flush(); + if (status == B_OK) { + sVisible = true; + sVisibleInitialized = true; + } + + return status; } status_t BDragger::HideAllDraggers() { - // TODO: Implement. Should ask the registrar or the app server - return B_OK; + BPrivate::AppServerLink link; + link.StartMessage(AS_SET_SHOW_ALL_DRAGGERS); + link.Attach(false); + + status_t status = link.Flush(); + if (status == B_OK) { + sVisible = false; + sVisibleInitialized = true; + } + + return status; } @@ -325,10 +346,17 @@ BDragger::AreDraggersDrawn() BAutolock _(sLock); if (!sVisibleInitialized) { - // TODO: Implement. Should ask the registrar or the app server - sVisible = true; - sVisibleInitialized = true; + BPrivate::AppServerLink link; + link.StartMessage(AS_GET_SHOW_ALL_DRAGGERS); + + status_t status; + if (link.FlushWithReply(status) == B_OK && status == B_OK) { + link.Read(&sVisible); + sVisibleInitialized = true; + } else + return false; } + return sVisible; } @@ -451,6 +479,22 @@ BDragger::operator=(const BDragger &) } +/*static*/ void +BDragger::_UpdateShowAllDraggers(bool visible) +{ + BAutolock _(sLock); + + sVisibleInitialized = true; + sVisible = visible; + + for (int32 i = sList.CountItems(); i-- > 0;) { + BDragger* dragger = (BDragger*)sList.ItemAt(i); + BMessenger target(dragger); + target.SendMessage(_SHOW_DRAG_HANDLES_); + } +} + + void BDragger::_AddToList() { @@ -482,8 +526,6 @@ BDragger::_RemoveFromList() status_t BDragger::_DetermineRelationship() { - status_t err = B_OK; - if (fTarget) { if (fTarget == Parent()) fRelation = TARGET_IS_PARENT; @@ -497,10 +539,10 @@ BDragger::_DetermineRelationship() else if (fRelation == TARGET_IS_CHILD) fTarget = ChildAt(0); else - err = B_ERROR; + return B_ERROR; } - return err; + return B_OK; } diff --git a/src/servers/app/DesktopSettings.cpp b/src/servers/app/DesktopSettings.cpp index 8304b93f7d..384acf0403 100644 --- a/src/servers/app/DesktopSettings.cpp +++ b/src/servers/app/DesktopSettings.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2005-2006, Haiku. + * Copyright 2005-2007, Haiku. * Distributed under the terms of the MIT License. * * Authors: @@ -46,12 +46,13 @@ DesktopSettingsPrivate::_SetDefaults() fFixedFont = *gFontManager->DefaultFixedFont(); fMouseMode = B_NORMAL_MOUSE; + fShowAllDraggers = true; // init scrollbar info fScrollBarInfo.proportional = true; fScrollBarInfo.double_arrows = false; - // look of the knob (R5: (0, 1, 2), 1 = default) fScrollBarInfo.knob = 1; + // look of the knob (R5: (0, 1, 2), 1 = default) fScrollBarInfo.min_knob_size = 15; // init menu info @@ -60,9 +61,8 @@ DesktopSettingsPrivate::_SetDefaults() fMenuInfo.font_size = fPlainFont.Size(); fMenuInfo.background_color.set_to(216, 216, 216); - // look of the separator (R5: (0, 1, 2), default 0) - // TODO: we could just choose a nice one and remove the others fMenuInfo.separator = 0; + // look of the separator (R5: (0, 1, 2), default 0) fMenuInfo.click_to_open = true; // always true fMenuInfo.triggers_always_shown = false; @@ -288,6 +288,20 @@ DesktopSettingsPrivate::Save(uint32 mask) } } + if (mask & kDraggerSettings) { + BPath path(basePath); + if (path.Append("dragger") == B_OK) { + BMessage settings('asdg'); + settings.AddBool("show", fShowAllDraggers); + + BFile file; + status = file.SetTo(path.Path(), B_CREATE_FILE | B_ERASE_FILE | B_READ_WRITE); + if (status == B_OK) { + status = settings.Flatten(&file, NULL); + } + } + } + if (mask & kAppearanceSettings) { BPath path(basePath); if (path.Append("appearance") == B_OK) { @@ -410,6 +424,21 @@ DesktopSettingsPrivate::FocusFollowsMouse() const } +void +DesktopSettingsPrivate::SetShowAllDraggers(bool show) +{ + fShowAllDraggers = show; + Save(kDraggerSettings); +} + + +bool +DesktopSettingsPrivate::ShowAllDraggers() const +{ + return fShowAllDraggers; +} + + void DesktopSettingsPrivate::SetWorkspacesCount(int32 number) { @@ -513,6 +542,13 @@ DesktopSettings::FocusFollowsMouse() const } +bool +DesktopSettings::ShowAllDraggers() const +{ + return fSettings->ShowAllDraggers(); +} + + int32 DesktopSettings::WorkspacesCount() const { @@ -531,12 +567,10 @@ DesktopSettings::WorkspacesMessage(int32 index) const LockedDesktopSettings::LockedDesktopSettings(Desktop* desktop) - : - fSettings(desktop->fSettings), + : DesktopSettings(desktop), fDesktop(desktop) { - // TODO: this only works in MultiLocker's DEBUG mode -#if 0 +#if DEBUG if (desktop->fWindowLock.IsReadLocked()) debugger("desktop read locked when trying to change settings"); #endif @@ -593,3 +627,9 @@ LockedDesktopSettings::SetMouseMode(const mode_mouse mode) } +void +LockedDesktopSettings::SetShowAllDraggers(bool show) +{ + fSettings->SetShowAllDraggers(show); +} + diff --git a/src/servers/app/DesktopSettings.h b/src/servers/app/DesktopSettings.h index 98683a863a..4e326a0ecc 100644 --- a/src/servers/app/DesktopSettings.h +++ b/src/servers/app/DesktopSettings.h @@ -1,5 +1,5 @@ /* - * Copyright 2001-2005, Haiku. + * Copyright 2001-2007, Haiku. * Distributed under the terms of the MIT License. * * Authors: @@ -26,6 +26,7 @@ enum { kFontSettings = 0x02, kAppearanceSettings = 0x04, kMouseSettings = 0x08, + kDraggerSettings = 0x10, }; class DesktopSettings { @@ -44,16 +45,16 @@ class DesktopSettings { mode_mouse MouseMode() const; bool FocusFollowsMouse() const; + bool ShowAllDraggers() const; + int32 WorkspacesCount() const; const BMessage* WorkspacesMessage(int32 index) const; - private: -// friend class Desktop; - + protected: DesktopSettingsPrivate* fSettings; }; -class LockedDesktopSettings { +class LockedDesktopSettings : public DesktopSettings { public: LockedDesktopSettings(Desktop* desktop); ~LockedDesktopSettings(); @@ -67,10 +68,9 @@ class LockedDesktopSettings { void SetMouseMode(mode_mouse mode); - private: -// friend class Desktop; + void SetShowAllDraggers(bool show); - DesktopSettingsPrivate* fSettings; + private: Desktop* fDesktop; }; diff --git a/src/servers/app/DesktopSettingsPrivate.h b/src/servers/app/DesktopSettingsPrivate.h index 7375faf968..11893aace6 100644 --- a/src/servers/app/DesktopSettingsPrivate.h +++ b/src/servers/app/DesktopSettingsPrivate.h @@ -1,5 +1,5 @@ /* - * Copyright 2005-2006, Haiku. + * Copyright 2005-2007, Haiku. * Distributed under the terms of the MIT License. * * Authors: @@ -43,6 +43,9 @@ class DesktopSettingsPrivate { mode_mouse MouseMode() const; bool FocusFollowsMouse() const; + void SetShowAllDraggers(bool show); + bool ShowAllDraggers() const; + void SetWorkspacesCount(int32 number); int32 WorkspacesCount() const; @@ -61,6 +64,7 @@ class DesktopSettingsPrivate { scroll_bar_info fScrollBarInfo; menu_info fMenuInfo; mode_mouse fMouseMode; + bool fShowAllDraggers; int32 fWorkspacesCount; BMessage fWorkspaceMessages[kMaxWorkspaces]; diff --git a/src/servers/app/ServerApp.cpp b/src/servers/app/ServerApp.cpp index 561e716cb9..d6473009ac 100644 --- a/src/servers/app/ServerApp.cpp +++ b/src/servers/app/ServerApp.cpp @@ -77,6 +77,7 @@ using std::nothrow; +static const uint32 kMsgUpdateShowAllDraggers = '_adg'; static const uint32 kMsgAppQuit = 'appQ'; @@ -1022,7 +1023,7 @@ ServerApp::_DispatchMessage(int32 code, BPrivate::LinkReceiver& link) case AS_GET_MOUSE_MODE: { STRACE(("ServerApp %s: Get Focus Follows Mouse mode\n", Signature())); - + if (fDesktop->LockSingleWindow()) { DesktopSettings settings(fDesktop); @@ -1037,6 +1038,58 @@ ServerApp::_DispatchMessage(int32 code, BPrivate::LinkReceiver& link) break; } + case AS_GET_SHOW_ALL_DRAGGERS: + { + STRACE(("ServerApp %s: Get Show All Draggers\n", Signature())); + + if (fDesktop->LockSingleWindow()) { + DesktopSettings settings(fDesktop); + + fLink.StartMessage(B_OK); + fLink.Attach(settings.ShowAllDraggers()); + + fDesktop->UnlockSingleWindow(); + } else + fLink.StartMessage(B_ERROR); + + fLink.Flush(); + break; + } + + case AS_SET_SHOW_ALL_DRAGGERS: + { + STRACE(("ServerApp %s: Set Show All Draggers\n", Signature())); + + bool changed = false; + bool show; + if (link.Read(&show) == B_OK) { + LockedDesktopSettings settings(fDesktop); + if (show != settings.ShowAllDraggers()) { + settings.SetShowAllDraggers(show); + changed = true; + } + } + + if (changed) + fDesktop->BroadcastToAllApps(kMsgUpdateShowAllDraggers); + break; + } + + case kMsgUpdateShowAllDraggers: + { + bool show = false; + if (fDesktop->LockSingleWindow()) { + DesktopSettings settings(fDesktop); + show = settings.ShowAllDraggers(); + fDesktop->UnlockSingleWindow(); + } + BMessage update(_SHOW_DRAG_HANDLES_); + update.AddBool("show", show); + + SendMessageToClient(&update); + break; + } + /* font messages */ case AS_SET_SYSTEM_FONT: