Extracted the settings stuff from the Desktop class. If you now need to access

the desktop's settings, you have to do something like this:
	DesktopSettings settings(desktop);
	settings.SetMouseMode(mode);
The advantage of this is that this object is fully locked, and cannot lead to
corrupted settings anymore. Also, the settings will stay the same until you
delete the object again.
Updated all accesses to use this new API.
Removed no longer used FFM messages.
Implemented AS_{GET|SET}_MENU_INFO for future use.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@13719 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler 2005-07-17 16:25:48 +00:00
parent 223b96641b
commit ef8810f2ad
10 changed files with 446 additions and 132 deletions

View File

@ -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,

View File

@ -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;
}

View File

@ -14,6 +14,7 @@
#include "ScreenManager.h"
#include "ServerScreen.h"
#include "VirtualScreen.h"
#include "DesktopSettings.h"
#include <InterfaceDefs.h>
#include <List.h>
@ -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;

View File

@ -0,0 +1,252 @@
/*
* Copyright 2005, Haiku.
* Distributed under the terms of the MIT License.
*
* Authors:
* Stephan Aßmus <superstippi@gmx.de>
* 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);
}

View File

@ -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 <InterfaceDefs.h>
#include <Menu.h>
#include <Message.h>
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 */

View File

@ -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 <Locker.h>
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 */

View File

@ -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)

View File

@ -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<scroll_bar_info>(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<scroll_bar_info>(&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<scroll_bar_info>(&info) == B_OK) {
DesktopSettings settings(gDesktop);
settings.SetScrollBarInfo(info);
}
fLink.StartMessage(SERVER_TRUE);
fLink.Attach<bool>(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<bool>(&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<menu_info>(info);
fLink.Flush();
break;
}
case AS_SET_MENU_INFO:
{
STRACE(("ServerApp %s: Set menu info\n", Signature()));
menu_info info;
if (link.Read<menu_info>(&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<mode_mouse>(&mmode) == B_OK)
gDesktop->SetFFMouseMode(mmode);
mode_mouse mouseMode;
if (link.Read<mode_mouse>(&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<mode_mouse>(mmode);
fLink.Attach<mode_mouse>(settings.MouseMode());
fLink.Flush();
break;
}
case AS_GET_UI_COLORS:
{
// Client application is asking for all the system colors at once

View File

@ -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);

View File

@ -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;