diff --git a/headers/private/app/ServerProtocol.h b/headers/private/app/ServerProtocol.h index 8702a9c9fa..0a7c5dab7b 100644 --- a/headers/private/app/ServerProtocol.h +++ b/headers/private/app/ServerProtocol.h @@ -175,12 +175,12 @@ enum { AS_ACTIVATE_WORKSPACE, AS_GET_SCROLLBAR_INFO, AS_SET_SCROLLBAR_INFO, + 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_FOCUS_FOLLOWS_MOUSE, - AS_FOCUS_FOLLOWS_MOUSE, AS_SET_MOUSE_MODE, AS_GET_MOUSE_MODE, diff --git a/src/servers/app/Desktop.cpp b/src/servers/app/Desktop.cpp index ed7a42eb1f..c565248385 100644 --- a/src/servers/app/Desktop.cpp +++ b/src/servers/app/Desktop.cpp @@ -30,6 +30,8 @@ #include "ServerWindow.h" #include "WinBorder.h" #include "Workspace.h" +#include "DesktopSettingsPrivate.h" + #ifdef __HAIKU__ # define USE_ACCELERANT 1 @@ -55,28 +57,11 @@ Desktop::Desktop() - : fWinBorderList(64), - fActiveScreen(NULL), - fMouseMode(B_NORMAL_MOUSE), - fFFMouseMode(false) + : + fSettings(new DesktopSettings::Private()), + fWinBorderList(64), + fActiveScreen(NULL) { - // init scrollbar info - fScrollBarInfo.proportional = true; - fScrollBarInfo.double_arrows = false; - // look of the knob (R5: (0, 1, 2), 1 = default) - fScrollBarInfo.knob = 1; - fScrollBarInfo.min_knob_size = 15; - - // init menu info - fMenuInfo.font_size = 12.0; -// TODO: ... -// fMenuInfo.f_family; -// fMenuInfo.f_style; -// fMenuInfo.background_color = gColorSet->menu_background; - // look of the separator (R5: (0, 1, 2), default ?) - fMenuInfo.separator = 0; - fMenuInfo.click_to_open = true; - fMenuInfo.triggers_always_shown = false; } @@ -86,13 +71,14 @@ Desktop::~Desktop() delete border; delete fRootLayer; + delete fSettings; } void Desktop::Init() { - fVirtualScreen.RestoreConfiguration(*this); + fVirtualScreen.RestoreConfiguration(*this, fSettings->WorkspacesMessage(0)); // TODO: temporary workaround, fActiveScreen will be removed fActiveScreen = fVirtualScreen.ScreenAt(0); @@ -397,64 +383,3 @@ Desktop::WriteWindowInfo(int32 serverToken, BPrivate::LinkSender& sender) sender.Flush(); } - -//--------------------------------------------------------------------------- -// Methods for various desktop stuff handled by the server -//--------------------------------------------------------------------------- - - -void -Desktop::SetScrollBarInfo(const scroll_bar_info &info) -{ - fScrollBarInfo = info; -} - - -scroll_bar_info -Desktop::ScrollBarInfo(void) const -{ - return fScrollBarInfo; -} - - -void -Desktop::SetMenuInfo(const menu_info &info) -{ - fMenuInfo = info; -} - - -menu_info -Desktop::MenuInfo(void) const -{ - return fMenuInfo; -} - - -void -Desktop::UseFFMouse(const bool &useffm) -{ - fFFMouseMode = useffm; -} - - -bool -Desktop::FFMouseInUse(void) const -{ - return fFFMouseMode; -} - - -void -Desktop::SetFFMouseMode(const mode_mouse &value) -{ - fMouseMode = value; -} - - -mode_mouse -Desktop::FFMouseMode(void) const -{ - return fMouseMode; -} - diff --git a/src/servers/app/Desktop.h b/src/servers/app/Desktop.h index 4a583b4e62..dbf600998a 100644 --- a/src/servers/app/Desktop.h +++ b/src/servers/app/Desktop.h @@ -14,6 +14,7 @@ #include "ScreenManager.h" #include "ServerScreen.h" #include "VirtualScreen.h" +#include "DesktopSettings.h" #include #include @@ -84,29 +85,15 @@ class Desktop : public BLocker, public ScreenOwner { void WriteWindowList(team_id team, BPrivate::LinkSender& sender); void WriteWindowInfo(int32 serverToken, BPrivate::LinkSender& sender); - // Methods for various desktop stuff handled by the server - void SetScrollBarInfo(const scroll_bar_info &info); - scroll_bar_info ScrollBarInfo() const; - - void SetMenuInfo(const menu_info &info); - menu_info MenuInfo() const; - - void UseFFMouse(const bool &useffm); - bool FFMouseInUse() const; - void SetFFMouseMode(const mode_mouse &value); - mode_mouse FFMouseMode() const; - private: + friend class DesktopSettings; + ::VirtualScreen fVirtualScreen; + DesktopSettings::Private* fSettings; BList fWinBorderList; RootLayer* fRootLayer; Screen* fActiveScreen; - - scroll_bar_info fScrollBarInfo; - menu_info fMenuInfo; - mode_mouse fMouseMode; - bool fFFMouseMode; }; extern Desktop *gDesktop; diff --git a/src/servers/app/DesktopSettings.cpp b/src/servers/app/DesktopSettings.cpp new file mode 100644 index 0000000000..d5c94917ef --- /dev/null +++ b/src/servers/app/DesktopSettings.cpp @@ -0,0 +1,252 @@ +/* + * Copyright 2005, Haiku. + * Distributed under the terms of the MIT License. + * + * Authors: + * Stephan Aßmus + * Axel Dörfler, axeld@pinc-software.de + */ + + +#include "DesktopSettings.h" +#include "DesktopSettingsPrivate.h" +#include "Desktop.h" + + +DesktopSettings::Private::Private() + : BLocker("desktop settings") +{ + // if the on-disk settings are not complete, the defaults will be kept + _SetDefaults(); + _Load(); +} + + +DesktopSettings::Private::~Private() +{ +} + + +void +DesktopSettings::Private::_SetDefaults() +{ + fMouseMode = B_NORMAL_MOUSE; + + // init scrollbar info + fScrollBarInfo.proportional = true; + fScrollBarInfo.double_arrows = false; + // look of the knob (R5: (0, 1, 2), 1 = default) + fScrollBarInfo.knob = 1; + fScrollBarInfo.min_knob_size = 15; + + // init menu info + fMenuInfo.font_size = 12.0; +// TODO: ... +// fMenuInfo.f_family; +// fMenuInfo.f_style; +// fMenuInfo.background_color = gColorSet->menu_background; + // look of the separator (R5: (0, 1, 2), default ?) + fMenuInfo.separator = 0; + fMenuInfo.click_to_open = true; + fMenuInfo.triggers_always_shown = false; + + fWorkspacesCount = 1; +} + + +status_t +DesktopSettings::Private::_Load() +{ + // TODO: add support for old app_server_settings file as well + return B_ERROR; +} + + +status_t +DesktopSettings::Private::Save() +{ + return B_ERROR; +} + + +void +DesktopSettings::Private::SetScrollBarInfo(const scroll_bar_info& info) +{ + fScrollBarInfo = info; +} + + +const scroll_bar_info& +DesktopSettings::Private::ScrollBarInfo() const +{ + return fScrollBarInfo; +} + + +void +DesktopSettings::Private::SetMenuInfo(const menu_info& info) +{ + fMenuInfo = info; +} + + +const menu_info& +DesktopSettings::Private::MenuInfo() const +{ + return fMenuInfo; +} + + +void +DesktopSettings::Private::SetMouseMode(const mode_mouse mode) +{ + fMouseMode = mode; +} + + +mode_mouse +DesktopSettings::Private::MouseMode() const +{ + return fMouseMode; +} + + +bool +DesktopSettings::Private::FocusFollowsMouse() const +{ + return MouseMode() != B_NORMAL_MOUSE; +} + + +void +DesktopSettings::Private::SetWorkspacesCount(int32 number) +{ + if (number < 1) + number = 1; + else if (number > kMaxWorkspaces) + number = kMaxWorkspaces; + + fWorkspacesCount = number; +} + + +int32 +DesktopSettings::Private::WorkspacesCount() const +{ + return fWorkspacesCount; +} + + +void +DesktopSettings::Private::SetWorkspacesMessage(int32 index, BMessage& message) +{ + if (index < 0 || index > kMaxWorkspaces) + return; + + fWorkspaceMessages[index] = message; +} + + +const BMessage* +DesktopSettings::Private::WorkspacesMessage(int32 index) const +{ + if (index < 0 || index > kMaxWorkspaces) + return NULL; + + return &fWorkspaceMessages[index]; +} + + + +// #pragma mark - + + +DesktopSettings::DesktopSettings(Desktop* desktop) +{ + fSettings = desktop->fSettings; + fSettings->Lock(); +} + + +DesktopSettings::~DesktopSettings() +{ + fSettings->Unlock(); +} + + +void +DesktopSettings::SetScrollBarInfo(const scroll_bar_info& info) +{ + fSettings->SetScrollBarInfo(info); +} + + +void +DesktopSettings::GetScrollBarInfo(scroll_bar_info& info) const +{ + info = fSettings->ScrollBarInfo(); +} + + +void +DesktopSettings::SetMenuInfo(const menu_info& info) +{ + fSettings->SetMenuInfo(info); +} + + +void +DesktopSettings::GetMenuInfo(menu_info& info) const +{ + info = fSettings->MenuInfo(); +} + + +void +DesktopSettings::SetMouseMode(const mode_mouse mode) +{ + fSettings->SetMouseMode(mode); +} + + +mode_mouse +DesktopSettings::MouseMode() const +{ + return fSettings->MouseMode(); +} + + +bool +DesktopSettings::FocusFollowsMouse() const +{ + return fSettings->FocusFollowsMouse(); +} + + +void +DesktopSettings::SetWorkspacesCount(int32 number) +{ + fSettings->SetWorkspacesCount(number); +} + + +int32 +DesktopSettings::WorkspacesCount() const +{ + return fSettings->WorkspacesCount(); +} + + +void +DesktopSettings::SetWorkspacesMessage(int32 index, BMessage& message) +{ + fSettings->SetWorkspacesMessage(index, message); +} + + +const BMessage* +DesktopSettings::WorkspacesMessage(int32 index) const +{ + return fSettings->WorkspacesMessage(index); +} + diff --git a/src/servers/app/DesktopSettings.h b/src/servers/app/DesktopSettings.h new file mode 100644 index 0000000000..045c138993 --- /dev/null +++ b/src/servers/app/DesktopSettings.h @@ -0,0 +1,52 @@ +/* + * Copyright 2001-2005, Haiku. + * Distributed under the terms of the MIT License. + * + * Authors: + * Axel Dörfler, axeld@pinc-software.de + */ +#ifndef DESKTOP_SETTINGS_H +#define DESKTOP_SETTINGS_H + + +#include +#include +#include + +class Desktop; + + +static const int32 kMaxWorkspaces = 32; + + +class DesktopSettings { + public: + DesktopSettings(Desktop* desktop); + ~DesktopSettings(); + + status_t Save(); + + void SetScrollBarInfo(const scroll_bar_info& info); + void GetScrollBarInfo(scroll_bar_info& info) const; + + void SetMenuInfo(const menu_info& info); + void GetMenuInfo(menu_info& info) const; + + void SetMouseMode(mode_mouse mode); + mode_mouse MouseMode() const; + bool FocusFollowsMouse() const; + + void SetWorkspacesCount(int32 number); + int32 WorkspacesCount() const; + + void SetWorkspacesMessage(int32 index, BMessage& message); + const BMessage* WorkspacesMessage(int32 index) const; + + private: + class Private; + friend class Desktop; + + Private* fSettings; +}; + +#endif /* DESKTOP_SETTINGS_H */ diff --git a/src/servers/app/DesktopSettingsPrivate.h b/src/servers/app/DesktopSettingsPrivate.h new file mode 100644 index 0000000000..eec42c92c8 --- /dev/null +++ b/src/servers/app/DesktopSettingsPrivate.h @@ -0,0 +1,51 @@ +/* + * Copyright 2001-2005, Haiku. + * Distributed under the terms of the MIT License. + * + * Authors: + * Axel Dörfler, axeld@pinc-software.de + */ +#ifndef DESKTOP_SETTINGS_PRIVATE_H +#define DESKTOP_SETTINGS_PRIVATE_H + + +#include "DesktopSettings.h" + +#include + + +class DesktopSettings::Private : public BLocker { + public: + Private(); + ~Private(); + + status_t Save(); + + void SetScrollBarInfo(const scroll_bar_info &info); + const scroll_bar_info& ScrollBarInfo() const; + + void SetMenuInfo(const menu_info &info); + const menu_info& MenuInfo() const; + + void SetMouseMode(mode_mouse mode); + mode_mouse MouseMode() const; + bool FocusFollowsMouse() const; + + void SetWorkspacesCount(int32 number); + int32 WorkspacesCount() const; + + void SetWorkspacesMessage(int32 index, BMessage& message); + const BMessage* WorkspacesMessage(int32 index) const; + + private: + void _SetDefaults(); + status_t _Load(); + + scroll_bar_info fScrollBarInfo; + menu_info fMenuInfo; + mode_mouse fMouseMode; + int32 fWorkspacesCount; + BMessage fWorkspaceMessages[kMaxWorkspaces]; +}; + +#endif /* DESKTOP_SETTINGS_PRIVATE_H */ diff --git a/src/servers/app/Jamfile b/src/servers/app/Jamfile index 4063acbde5..8ad95660a4 100644 --- a/src/servers/app/Jamfile +++ b/src/servers/app/Jamfile @@ -78,14 +78,17 @@ Server app_server : RAMLinkMsgReader.cpp # Manager Classes - AppServer.cpp CursorManager.cpp - Desktop.cpp - ServerApp.cpp - ServerWindow.cpp DecorManager.cpp ScreenManager.cpp + AppServer.cpp + Desktop.cpp + DesktopSettings.cpp + + ServerApp.cpp + ServerWindow.cpp + # DisplayDriver Classes $(VIEW_DRIVER_SOURCES) diff --git a/src/servers/app/ServerApp.cpp b/src/servers/app/ServerApp.cpp index 66fe27c3c4..f586871d77 100644 --- a/src/servers/app/ServerApp.cpp +++ b/src/servers/app/ServerApp.cpp @@ -1117,7 +1117,9 @@ ServerApp::_DispatchMessage(int32 code, BPrivate::LinkReceiver &link) case AS_GET_SCROLLBAR_INFO: { STRACE(("ServerApp %s: Get ScrollBar info\n", Signature())); - scroll_bar_info info = gDesktop->ScrollBarInfo(); + scroll_bar_info info; + DesktopSettings settings(gDesktop); + settings.GetScrollBarInfo(info); fLink.StartMessage(SERVER_TRUE); fLink.Attach(info); @@ -1130,50 +1132,67 @@ ServerApp::_DispatchMessage(int32 code, BPrivate::LinkReceiver &link) // Attached Data: // 1) scroll_bar_info scroll bar info structure scroll_bar_info info; - if (link.Read(&info) == B_OK) - gDesktop->SetScrollBarInfo(info); - - fLink.StartMessage(SERVER_TRUE); - fLink.Flush(); - break; - } - case AS_FOCUS_FOLLOWS_MOUSE: - { - STRACE(("ServerApp %s: query Focus Follow Mouse in use\n", Signature())); + if (link.Read(&info) == B_OK) { + DesktopSettings settings(gDesktop); + settings.SetScrollBarInfo(info); + } fLink.StartMessage(SERVER_TRUE); - fLink.Attach(gDesktop->FFMouseInUse()); fLink.Flush(); break; } - case AS_SET_FOCUS_FOLLOWS_MOUSE: + + case AS_GET_MENU_INFO: { - STRACE(("ServerApp %s: Set Focus Follows Mouse in use\n", Signature())); - bool follow; - if (link.Read(&follow) == B_OK) - gDesktop->UseFFMouse(follow); + STRACE(("ServerApp %s: Get menu info\n", Signature())); + menu_info info; + DesktopSettings settings(gDesktop); + settings.GetMenuInfo(info); + + fLink.StartMessage(B_OK); + fLink.Attach(info); + fLink.Flush(); break; } + case AS_SET_MENU_INFO: + { + STRACE(("ServerApp %s: Set menu info\n", Signature())); + menu_info info; + if (link.Read(&info) == B_OK) { + DesktopSettings settings(gDesktop); + settings.SetMenuInfo(info); + // TODO: SetMenuInfo() should do some validity check, so + // that the answer we're giving can actually be useful + } + + fLink.StartMessage(B_OK); + fLink.Flush(); + break; + } + case AS_SET_MOUSE_MODE: { STRACE(("ServerApp %s: Set Focus Follows Mouse mode\n", Signature())); // Attached Data: // 1) enum mode_mouse FFM mouse mode - mode_mouse mmode; - if (link.Read(&mmode) == B_OK) - gDesktop->SetFFMouseMode(mmode); + mode_mouse mouseMode; + if (link.Read(&mouseMode) == B_OK) { + DesktopSettings settings(gDesktop); + settings.SetMouseMode(mouseMode); + } break; } case AS_GET_MOUSE_MODE: { STRACE(("ServerApp %s: Get Focus Follows Mouse mode\n", Signature())); - mode_mouse mmode = gDesktop->FFMouseMode(); + DesktopSettings settings(gDesktop); fLink.StartMessage(SERVER_TRUE); - fLink.Attach(mmode); + fLink.Attach(settings.MouseMode()); fLink.Flush(); break; } + case AS_GET_UI_COLORS: { // Client application is asking for all the system colors at once diff --git a/src/servers/app/VirtualScreen.cpp b/src/servers/app/VirtualScreen.cpp index 5723df1096..8084bb5b48 100644 --- a/src/servers/app/VirtualScreen.cpp +++ b/src/servers/app/VirtualScreen.cpp @@ -27,14 +27,38 @@ VirtualScreen::VirtualScreen() VirtualScreen::~VirtualScreen() { + _Reset(); +} + + +void +VirtualScreen::_Reset() +{ + ScreenList list; + for (int32 i = 0; i < fScreenList.CountItems(); i++) { + screen_item* item = fScreenList.ItemAt(i); + + list.AddItem(item->screen); + } + + gScreenManager->ReleaseScreens(list); + fScreenList.MakeEmpty(); + fSettings.MakeEmpty(); + + fFrame.Set(0, 0, 0, 0); + fDisplayDriver = NULL; + fHWInterface = NULL; } status_t -VirtualScreen::RestoreConfiguration(Desktop& desktop) +VirtualScreen::RestoreConfiguration(Desktop& desktop, const BMessage* settings) { - // Copy current Desktop settings - //fSettings = desktop.Settings(); + _Reset(); + + // Copy current Desktop workspace settings + if (settings) + fSettings = *settings; ScreenList list; status_t status = gScreenManager->AcquireScreens(&desktop, NULL, 0, false, list); diff --git a/src/servers/app/VirtualScreen.h b/src/servers/app/VirtualScreen.h index 1225a49b73..c2136401d5 100644 --- a/src/servers/app/VirtualScreen.h +++ b/src/servers/app/VirtualScreen.h @@ -31,7 +31,7 @@ class VirtualScreen { ::HWInterface* HWInterface() const { return fHWInterface; } - status_t RestoreConfiguration(Desktop& desktop); + status_t RestoreConfiguration(Desktop& desktop, const BMessage* settings); status_t StoreConfiguration(BMessage& settings); status_t AddScreen(Screen* screen); @@ -49,6 +49,7 @@ class VirtualScreen { private: status_t _FindConfiguration(Screen* screen, BMessage& settings); + void _Reset(); struct screen_item { Screen* screen;