diff --git a/headers/private/app/ServerProtocol.h b/headers/private/app/ServerProtocol.h index f1a3b9a81b..e9c6fb5d04 100644 --- a/headers/private/app/ServerProtocol.h +++ b/headers/private/app/ServerProtocol.h @@ -178,9 +178,9 @@ enum { AS_GET_DECORATOR_NAME, AS_COUNT_WORKSPACES, - AS_SET_WORKSPACE_COUNT, AS_CURRENT_WORKSPACE, AS_ACTIVATE_WORKSPACE, + AS_SET_WORKSPACE_LAYOUT, AS_GET_WORKSPACE_LAYOUT, AS_GET_SCROLLBAR_INFO, AS_SET_SCROLLBAR_INFO, diff --git a/src/kits/interface/InterfaceDefs.cpp b/src/kits/interface/InterfaceDefs.cpp index 9fa146a3fb..32a6410279 100644 --- a/src/kits/interface/InterfaceDefs.cpp +++ b/src/kits/interface/InterfaceDefs.cpp @@ -717,25 +717,39 @@ keyboard_navigation_color() int32 count_workspaces() { - int32 count = 1; + int32 columns = 1; + int32 rows = 1; BPrivate::AppServerLink link; - link.StartMessage(AS_COUNT_WORKSPACES); + link.StartMessage(AS_GET_WORKSPACE_LAYOUT); status_t status; - if (link.FlushWithReply(status) == B_OK && status == B_OK) - link.Read(&count); + if (link.FlushWithReply(status) == B_OK && status == B_OK) { + link.Read(&columns); + link.Read(&rows); + } - return count; + return columns * rows; } void set_workspace_count(int32 count) { + int32 squareRoot = (int32)sqrt(count); + + int32 rows = 1; + for (int32 i = 2; i <= squareRoot; i++) { + if (count % i == 0) + rows = i; + } + + int32 columns = count / rows; + BPrivate::AppServerLink link; - link.StartMessage(AS_SET_WORKSPACE_COUNT); - link.Attach(count); + link.StartMessage(AS_SET_WORKSPACE_LAYOUT); + link.Attach(columns); + link.Attach(rows); link.Flush(); } diff --git a/src/servers/app/Desktop.cpp b/src/servers/app/Desktop.cpp index 98d7a866ac..4304b4ed7b 100644 --- a/src/servers/app/Desktop.cpp +++ b/src/servers/app/Desktop.cpp @@ -147,7 +147,7 @@ KeyboardFilter::Filter(BMessage* message, EventTarget** _target, && message->FindInt32("key", &key) == B_OK && message->FindInt32("modifiers", &modifiers) == B_OK) { // Check for safe video mode (cmd + ctrl + escape) - if (key == 0x01 && (modifiers & B_COMMAND_KEY) != 0 + if (key == 0x01 && (modifiers & B_COMMAND_KEY) != 0 && (modifiers & B_CONTROL_KEY) != 0) { system("screenmode --fall-back &"); return B_SKIP_MESSAGE; @@ -844,15 +844,16 @@ Desktop::StoreWorkspaceConfiguration(int32 index) status_t -Desktop::SetWorkspacesCount(int32 newCount) +Desktop::SetWorkspacesLayout(int32 newColumns, int32 newRows) { + int32 newCount = newColumns * newRows; if (newCount < 1 || newCount > kMaxWorkspaces) return B_BAD_VALUE; if (!LockAllWindows()) return B_ERROR; - fSettings->SetWorkspacesCount(newCount); + fSettings->SetWorkspacesLayout(newColumns, newRows); // either update the workspaces window, or switch to // the last available workspace - which will update @@ -895,8 +896,7 @@ Desktop::WorkspaceFrame(int32 index) const } -/*! - Changes the current workspace to the one specified by \a index. +/*! Changes the current workspace to the one specified by \a index. */ void Desktop::SetWorkspaceAsync(int32 index) @@ -908,8 +908,7 @@ Desktop::SetWorkspaceAsync(int32 index) } -/*! - Changes the current workspace to the one specified by \a index. +/*! Changes the current workspace to the one specified by \a index. You must not hold any window lock when calling this method. */ void diff --git a/src/servers/app/Desktop.h b/src/servers/app/Desktop.h index af5ea0a504..e1856adb44 100644 --- a/src/servers/app/Desktop.h +++ b/src/servers/app/Desktop.h @@ -1,5 +1,5 @@ /* - * Copyright 2001-2008, Haiku. + * Copyright 2001-2009, Haiku. * Distributed under the terms of the MIT License. * * Authors: @@ -111,7 +111,7 @@ class Desktop : public MessageLooper, public ScreenOwner { { return fCurrentWorkspace; } Workspace::Private& WorkspaceAt(int32 index) { return fWorkspaces[index]; } - status_t SetWorkspacesCount(int32 newCount); + status_t SetWorkspacesLayout(int32 columns, int32 rows); BRect WorkspaceFrame(int32 index) const; // Window methods diff --git a/src/servers/app/DesktopSettings.cpp b/src/servers/app/DesktopSettings.cpp index 1c86421db9..74e6c9fb36 100644 --- a/src/servers/app/DesktopSettings.cpp +++ b/src/servers/app/DesktopSettings.cpp @@ -70,9 +70,11 @@ DesktopSettingsPrivate::_SetDefaults() fMenuInfo.click_to_open = true; // always true fMenuInfo.triggers_always_shown = false; - fWorkspacesCount = 4; + fWorkspacesColumns = 2; + fWorkspacesRows = 2; - memcpy(fShared.colors, BPrivate::kDefaultColors, sizeof(rgb_color) * kNumColors); + memcpy(fShared.colors, BPrivate::kDefaultColors, + sizeof(rgb_color) * kNumColors); gSubpixelAntialiasing = false; gDefaultHintingMode = HINTING_MODE_ON; @@ -117,16 +119,18 @@ DesktopSettingsPrivate::_Load() BMessage settings; status = settings.Unflatten(&file); if (status == B_OK) { - int32 count; - if (settings.FindInt32("count", &count) == B_OK) { - fWorkspacesCount = count; - if (fWorkspacesCount < 1 || fWorkspacesCount > 32) - fWorkspacesCount = 4; + int32 columns; + int32 rows; + if (settings.FindInt32("columns", &columns) == B_OK + && settings.FindInt32("rows", &rows) == B_OK) { + _ValidateWorkspacesLayout(columns, rows); + fWorkspacesColumns = columns; + fWorkspacesRows = rows; } int32 i = 0; - while (i < kMaxWorkspaces - && settings.FindMessage("workspace", i, &fWorkspaceMessages[i]) == B_OK) { + while (i < kMaxWorkspaces && settings.FindMessage("workspace", + i, &fWorkspaceMessages[i]) == B_OK) { i++; } } @@ -293,7 +297,8 @@ DesktopSettingsPrivate::Save(uint32 mask) BPath path(basePath); if (path.Append("workspaces") == B_OK) { BMessage settings('asws'); - settings.AddInt32("count", fWorkspacesCount); + settings.AddInt32("columns", fWorkspacesColumns); + settings.AddInt32("rows", fWorkspacesRows); for (int32 i = 0; i < kMaxWorkspaces; i++) { settings.AddMessage("workspace", &fWorkspaceMessages[i]); @@ -519,14 +524,12 @@ DesktopSettingsPrivate::ShowAllDraggers() const void -DesktopSettingsPrivate::SetWorkspacesCount(int32 number) +DesktopSettingsPrivate::SetWorkspacesLayout(int32 columns, int32 rows) { - if (number < 1) - number = 1; - else if (number > kMaxWorkspaces) - number = kMaxWorkspaces; + _ValidateWorkspacesLayout(columns, rows); + fWorkspacesColumns = columns; + fWorkspacesRows = rows; - fWorkspacesCount = number; Save(kWorkspacesSettings); } @@ -534,7 +537,21 @@ DesktopSettingsPrivate::SetWorkspacesCount(int32 number) int32 DesktopSettingsPrivate::WorkspacesCount() const { - return fWorkspacesCount; + return fWorkspacesColumns * fWorkspacesRows; +} + + +int32 +DesktopSettingsPrivate::WorkspacesColumns() const +{ + return fWorkspacesColumns; +} + + +int32 +DesktopSettingsPrivate::WorkspacesRows() const +{ + return fWorkspacesRows; } @@ -644,6 +661,24 @@ DesktopSettingsPrivate::IsSubpixelOrderingRegular() const return gSubpixelOrderingRGB; } + +void +DesktopSettingsPrivate::_ValidateWorkspacesLayout(int32& columns, + int32& rows) const +{ + if (columns < 1) + columns = 1; + if (rows < 1) + rows = 1; + + if (columns * rows > kMaxWorkspaces) { + // Revert to defaults in case of invalid settings + columns = 2; + rows = 2; + } +} + + // #pragma mark - read access @@ -722,6 +757,20 @@ DesktopSettings::WorkspacesCount() const } +int32 +DesktopSettings::WorkspacesColumns() const +{ + return fSettings->WorkspacesColumns(); +} + + +int32 +DesktopSettings::WorkspacesRows() const +{ + return fSettings->WorkspacesRows(); +} + + const BMessage* DesktopSettings::WorkspacesMessage(int32 index) const { diff --git a/src/servers/app/DesktopSettings.h b/src/servers/app/DesktopSettings.h index e4588cf092..04d9216f52 100644 --- a/src/servers/app/DesktopSettings.h +++ b/src/servers/app/DesktopSettings.h @@ -49,6 +49,8 @@ class DesktopSettings { bool ShowAllDraggers() const; int32 WorkspacesCount() const; + int32 WorkspacesColumns() const; + int32 WorkspacesRows() const; const BMessage* WorkspacesMessage(int32 index) const; rgb_color UIColor(color_which which) const; diff --git a/src/servers/app/DesktopSettingsPrivate.h b/src/servers/app/DesktopSettingsPrivate.h index 719348ba70..0ae2354c3b 100644 --- a/src/servers/app/DesktopSettingsPrivate.h +++ b/src/servers/app/DesktopSettingsPrivate.h @@ -1,5 +1,5 @@ /* - * Copyright 2005-2008, Haiku. + * Copyright 2005-2009, Haiku. * Distributed under the terms of the MIT License. * * Authors: @@ -48,8 +48,10 @@ public: void SetShowAllDraggers(bool show); bool ShowAllDraggers() const; - void SetWorkspacesCount(int32 number); + void SetWorkspacesLayout(int32 columns, int32 rows); int32 WorkspacesCount() const; + int32 WorkspacesColumns() const; + int32 WorkspacesRows() const; void SetWorkspacesMessage(int32 index, BMessage& message); @@ -73,6 +75,8 @@ private: void _SetDefaults(); status_t _Load(); status_t _GetPath(BPath& path); + void _ValidateWorkspacesLayout(int32& columns, + int32& rows) const; ServerFont fPlainFont; ServerFont fBoldFont; @@ -82,7 +86,8 @@ private: menu_info fMenuInfo; mode_mouse fMouseMode; bool fShowAllDraggers; - int32 fWorkspacesCount; + int32 fWorkspacesColumns; + int32 fWorkspacesRows; BMessage fWorkspaceMessages[kMaxWorkspaces]; server_read_only_memory& fShared; diff --git a/src/servers/app/ProfileMessageSupport.cpp b/src/servers/app/ProfileMessageSupport.cpp index 697a386eff..bbbaa9d2c7 100644 --- a/src/servers/app/ProfileMessageSupport.cpp +++ b/src/servers/app/ProfileMessageSupport.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2007-2008, Haiku Inc. All rights reserved. + * Copyright 2007-2009, Haiku Inc. All rights reserved. * Distributed under the terms of the MIT License. * * Authors: @@ -18,9 +18,12 @@ string_for_message_code(uint32 code, BString& string) string = ""; switch (code) { - case AS_GET_DESKTOP: string = "AS_GET_DESKTOP"; break; - case AS_REGISTER_INPUT_SERVER: string = "AS_REGISTER_INPUT_SERVER"; break; - case AS_EVENT_STREAM_CLOSED: string = "AS_EVENT_STREAM_CLOSED"; break; + // Return the exact name for each constant + #define CODE(x) case x: string = #x; break + + CODE(AS_GET_DESKTOP); + CODE(AS_REGISTER_INPUT_SERVER); + CODE(AS_EVENT_STREAM_CLOSED); // Desktop definitions (through the ServerApp, though) case AS_GET_WINDOW_LIST: string = "AS_GET_WINDOW_LIST"; break; @@ -160,8 +163,8 @@ string_for_message_code(uint32 code, BString& string) case AS_COUNT_DECORATORS: string = "AS_COUNT_DECORATORS"; break; case AS_GET_DECORATOR_NAME: string = "AS_GET_DECORATOR_NAME"; break; - case AS_COUNT_WORKSPACES: string = "AS_COUNT_WORKSPACES"; break; - case AS_SET_WORKSPACE_COUNT: string = "AS_SET_WORKSPACE_COUNT"; break; + CODE(AS_SET_WORKSPACE_LAYOUT); + CODE(AS_GET_WORKSPACE_LAYOUT); case AS_CURRENT_WORKSPACE: string = "AS_CURRENT_WORKSPACE"; break; case AS_ACTIVATE_WORKSPACE: string = "AS_ACTIVATE_WORKSPACE"; break; case AS_GET_SCROLLBAR_INFO: string = "AS_GET_SCROLLBAR_INFO"; break; diff --git a/src/servers/app/ServerApp.cpp b/src/servers/app/ServerApp.cpp index e3b5bee7f0..3fe2d7e63c 100644 --- a/src/servers/app/ServerApp.cpp +++ b/src/servers/app/ServerApp.cpp @@ -797,29 +797,6 @@ ServerApp::_DispatchMessage(int32 code, BPrivate::LinkReceiver& link) break; } - case AS_COUNT_WORKSPACES: - { - if (fDesktop->LockSingleWindow()) { - DesktopSettings settings(fDesktop); - - fLink.StartMessage(B_OK); - fLink.Attach(settings.WorkspacesCount()); - fDesktop->UnlockSingleWindow(); - } else - fLink.StartMessage(B_ERROR); - - fLink.Flush(); - break; - } - - case AS_SET_WORKSPACE_COUNT: - { - int32 newCount; - if (link.Read(&newCount) == B_OK) - fDesktop->SetWorkspacesCount(newCount); - break; - } - case AS_CURRENT_WORKSPACE: STRACE(("ServerApp %s: get current workspace\n", Signature())); @@ -845,26 +822,29 @@ ServerApp::_DispatchMessage(int32 code, BPrivate::LinkReceiver& link) break; } + case AS_SET_WORKSPACE_LAYOUT: + { + int32 newColumns; + int32 newRows; + if (link.Read(&newColumns) == B_OK + && link.Read(&newRows) == B_OK) + fDesktop->SetWorkspacesLayout(newColumns, newRows); + break; + } + case AS_GET_WORKSPACE_LAYOUT: { - // TODO: this is taken from WorkspacesView::_GetGrid() - this is - // only a temporary solution - DesktopSettings settings(fDesktop); + if (fDesktop->LockSingleWindow()) { + DesktopSettings settings(fDesktop); - int32 count = settings.WorkspacesCount(); - int32 squareRoot = (int32)sqrt(count); + fLink.StartMessage(B_OK); + fLink.Attach(settings.WorkspacesColumns()); + fLink.Attach(settings.WorkspacesRows()); - int32 rows = 1; - for (int32 i = 2; i <= squareRoot; i++) { - if (count % i == 0) - rows = i; - } + fDesktop->UnlockSingleWindow(); + } else + fLink.StartMessage(B_ERROR); - int32 columns = count / rows; - - fLink.StartMessage(B_OK); - fLink.Attach(columns); - fLink.Attach(rows); fLink.Flush(); break; } diff --git a/src/servers/app/WorkspacesView.cpp b/src/servers/app/WorkspacesView.cpp index fb975c2087..43c82b6d39 100644 --- a/src/servers/app/WorkspacesView.cpp +++ b/src/servers/app/WorkspacesView.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2005-2008, Haiku Inc. + * Copyright 2005-2009, Haiku Inc. * Distributed under the terms of the MIT License. * * Authors: @@ -62,21 +62,12 @@ WorkspacesView::_GetGrid(int32& columns, int32& rows) { DesktopSettings settings(Window()->Desktop()); - int32 count = settings.WorkspacesCount(); - int32 squareRoot = (int32)sqrt(count); - - rows = 1; - for (int32 i = 2; i <= squareRoot; i++) { - if (count % i == 0) - rows = i; - } - - columns = count / rows; + columns = settings.WorkspacesColumns(); + rows = settings.WorkspacesRows(); } -/*! - \brief Returns the frame of the screen for the specified workspace. +/*! \brief Returns the frame of the screen for the specified workspace. */ BRect WorkspacesView::_ScreenFrame(int32 i) @@ -85,8 +76,7 @@ WorkspacesView::_ScreenFrame(int32 i) } -/*! - \brief Returns the frame of the specified workspace within the +/*! \brief Returns the frame of the specified workspace within the workspaces view. */ BRect @@ -119,8 +109,7 @@ WorkspacesView::_WorkspaceAt(int32 i) } -/*! - \brief Returns the workspace frame and index of the workspace +/*! \brief Returns the workspace frame and index of the workspace under \a where. If, for some reason, there is no workspace located under \where,