-Make Windows private again and lock the iteration over the windows when reloading the decorators.

- Make the used decorator persistent.



git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37816 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Clemens Zeidler 2010-07-30 01:19:20 +00:00
parent dc3d140e3b
commit 0265102f8b
4 changed files with 111 additions and 64 deletions

View File

@ -12,6 +12,7 @@
#include <Directory.h> #include <Directory.h>
#include <Entry.h> #include <Entry.h>
#include <File.h> #include <File.h>
#include <FindDirectory.h>
#include <Message.h> #include <Message.h>
#include <Path.h> #include <Path.h>
#include <Rect.h> #include <Rect.h>
@ -122,24 +123,9 @@ DecorManager::DecorManager()
// Add any on disk // Add any on disk
RescanDecorators(); RescanDecorators();
#if 0
// Find out which one should be the active one _LoadSettingsFromDisk();
BDirectory dir;
if (dir.SetTo(SERVER_SETTINGS_DIR) == B_ENTRY_NOT_FOUND)
create_directory(SERVER_SETTINGS_DIR, 0777);
BMessage settings;
BFile file(SERVER_SETTINGS_DIR "decorator_settings", B_READ_ONLY);
// Fallback to the default decorator if something goes wrong
if (file.InitCheck() == B_OK && settings.Unflatten(&file) == B_OK) {
BString itemtext;
if (settings.FindString("decorator", &itemtext) == B_OK) {
fCurrentDecor = _FindDecor(itemtext.String());
}
}
#endif
if (!fCurrentDecor) if (!fCurrentDecor)
fCurrentDecor = (DecorInfo*)fDecorList.ItemAt(0L); fCurrentDecor = (DecorInfo*)fDecorList.ItemAt(0L);
} }
@ -239,7 +225,8 @@ DecorManager::SetDecorator(int32 index, Desktop* desktop)
if (newDecInfo) { if (newDecInfo) {
fCurrentDecor = newDecInfo; fCurrentDecor = newDecInfo;
_UpdateWindows(desktop); desktop->ReloadAllDecorators();
_SaveSettingsToDisk();
return true; return true;
} }
@ -311,12 +298,65 @@ DecorManager::_FindDecor(const char *name)
} }
void static const char* kSettingsDir = "system/app_server";
DecorManager::_UpdateWindows(Desktop* desktop) static const char* kSettingsFile = "decorator_settings";
bool
DecorManager::_LoadSettingsFromDisk()
{ {
for (int32 i = 0; i < kMaxWorkspaces; i++) { // get the user settings directory
for (Window* window = desktop->Windows(i).LastWindow(); window; BPath path;
window = window->PreviousWindow(i)) status_t error = find_directory(B_USER_SETTINGS_DIRECTORY, &path, true);
desktop->ReloadDecorator(window); if (error != B_OK)
return false;
path.Append(kSettingsDir);
path.Append(kSettingsFile);
BFile file(path.Path(), B_READ_ONLY);
if (file.InitCheck() != B_OK)
return false;
BMessage settings;
if (settings.Unflatten(&file) == B_OK) {
BString itemtext;
if (settings.FindString("decorator", &itemtext) == B_OK) {
DecorInfo* decor = _FindDecor(itemtext.String());
if (decor) {
fCurrentDecor = decor;
return true;
}
}
} }
return false;
} }
bool
DecorManager::_SaveSettingsToDisk()
{
// get the user settings directory
BPath path;
status_t error = find_directory(B_USER_SETTINGS_DIRECTORY, &path, true);
if (error != B_OK)
return false;
path.Append(kSettingsDir);
if (create_directory(path.Path(), 777) != B_OK)
return false;
path.Append(kSettingsFile);
BFile file(path.Path(), B_READ_WRITE | B_CREATE_FILE | B_ERASE_FILE);
if (file.InitCheck() != B_OK)
return false;
BMessage settings;
if (settings.AddString("decorator", fCurrentDecor->Name()) != B_OK)
return false;
if (settings.Flatten(&file) != B_OK)
return false;
return true;
}

View File

@ -50,7 +50,8 @@ class DecorManager : public BLocker {
void _EmptyList(); void _EmptyList();
DecorInfo* _FindDecor(const char *name); DecorInfo* _FindDecor(const char *name);
void _UpdateWindows(Desktop* desktop); bool _LoadSettingsFromDisk();
bool _SaveSettingsToDisk();
BObjectList<DecorInfo> fDecorList; BObjectList<DecorInfo> fDecorList;
DecorInfo* fCurrentDecor; DecorInfo* fCurrentDecor;

View File

@ -394,7 +394,7 @@ Desktop::Init()
fSettings = new DesktopSettingsPrivate(fServerReadOnlyMemory); fSettings = new DesktopSettingsPrivate(fServerReadOnlyMemory);
for (int32 i = 0; i < kMaxWorkspaces; i++) { for (int32 i = 0; i < kMaxWorkspaces; i++) {
Windows(i).SetIndex(i); _Windows(i).SetIndex(i);
fWorkspaces[i].RestoreConfiguration(*fSettings->WorkspacesMessage(i)); fWorkspaces[i].RestoreConfiguration(*fSettings->WorkspacesMessage(i));
} }
@ -1519,7 +1519,7 @@ Desktop::SetWindowFeel(Window* window, window_feel newFeel)
if (i == fCurrentWorkspace && window->IsVisible()) if (i == fCurrentWorkspace && window->IsVisible())
visibleBefore = window->VisibleRegion(); visibleBefore = window->VisibleRegion();
Window* backmost = window->Backmost(Windows(i).LastWindow(), i); Window* backmost = window->Backmost(_Windows(i).LastWindow(), i);
if (backmost != NULL) { if (backmost != NULL) {
// check if the backmost window is really behind it // check if the backmost window is really behind it
Window* previous = window->PreviousWindow(i); Window* previous = window->PreviousWindow(i);
@ -1532,13 +1532,13 @@ Desktop::SetWindowFeel(Window* window, window_feel newFeel)
if (previous == NULL) { if (previous == NULL) {
// need to reinsert window before its backmost window // need to reinsert window before its backmost window
Windows(i).RemoveWindow(window); _Windows(i).RemoveWindow(window);
Windows(i).AddWindow(window, backmost->NextWindow(i)); _Windows(i).AddWindow(window, backmost->NextWindow(i));
changed = true; changed = true;
} }
} }
Window* frontmost = window->Frontmost(Windows(i).FirstWindow(), i); Window* frontmost = window->Frontmost(_Windows(i).FirstWindow(), i);
if (frontmost != NULL) { if (frontmost != NULL) {
// check if the frontmost window is really in front of it // check if the frontmost window is really in front of it
Window* next = window->NextWindow(i); Window* next = window->NextWindow(i);
@ -1551,8 +1551,8 @@ Desktop::SetWindowFeel(Window* window, window_feel newFeel)
if (next == NULL) { if (next == NULL) {
// need to reinsert window behind its frontmost window // need to reinsert window behind its frontmost window
Windows(i).RemoveWindow(window); _Windows(i).RemoveWindow(window);
Windows(i).AddWindow(window, frontmost); _Windows(i).AddWindow(window, frontmost);
changed = true; changed = true;
} }
} }
@ -1901,20 +1901,25 @@ Desktop::RedrawBackground()
void void
Desktop::ReloadDecorator(Window* window) Desktop::ReloadAllDecorators()
{ {
AutoWriteLocker _(fWindowLock); AutoWriteLocker _(fWindowLock);
BRegion oldBorder; for (int32 i = 0; i < kMaxWorkspaces; i++) {
window->GetBorderRegion(&oldBorder); for (Window* window = _Windows(i).LastWindow(); window;
window = window->PreviousWindow(i)) {
BRegion oldBorder;
window->GetBorderRegion(&oldBorder);
window->ReloadDecorator(); window->ReloadDecorator();
BRegion border; BRegion border;
window->GetBorderRegion(&border); window->GetBorderRegion(&border);
border.Include(&oldBorder); border.Include(&oldBorder);
_RebuildAndRedrawAfterWindowChange(window, border); _RebuildAndRedrawAfterWindowChange(window, border);
}
}
} }
@ -2087,14 +2092,14 @@ Desktop::WriteWindowOrder(int32 workspace, BPrivate::LinkSender& sender)
return; return;
} }
int32 count = Windows(workspace).Count(); int32 count = _Windows(workspace).Count();
// write list // write list
sender.StartMessage(B_OK); sender.StartMessage(B_OK);
sender.Attach<int32>(count); sender.Attach<int32>(count);
for (Window *window = Windows(workspace).LastWindow(); window != NULL; for (Window *window = _Windows(workspace).LastWindow(); window != NULL;
window = window->PreviousWindow(workspace)) { window = window->PreviousWindow(workspace)) {
sender.Attach<int32>(window->ServerWindow()->ServerToken()); sender.Attach<int32>(window->ServerWindow()->ServerToken());
} }
@ -2137,7 +2142,7 @@ Desktop::WriteApplicationOrder(int32 workspace, BPrivate::LinkSender& sender)
int32 count = 0; int32 count = 0;
for (Window *window = Windows(workspace).LastWindow(); window != NULL; for (Window *window = _Windows(workspace).LastWindow(); window != NULL;
window = window->PreviousWindow(workspace)) { window = window->PreviousWindow(workspace)) {
team_id team = window->ServerWindow()->ClientTeam(); team_id team = window->ServerWindow()->ClientTeam();
if (count > 1) { if (count > 1) {
@ -2446,7 +2451,7 @@ Desktop::CurrentWindows()
WindowList& WindowList&
Desktop::Windows(int32 index) Desktop::_Windows(int32 index)
{ {
return fWorkspaces[index].Windows(); return fWorkspaces[index].Windows();
} }
@ -2471,18 +2476,18 @@ Desktop::_UpdateFloating(int32 previousWorkspace, int32 nextWorkspace,
if (fFront != NULL && fFront->IsNormal() if (fFront != NULL && fFront->IsNormal()
&& floating->HasInSubset(fFront)) { && floating->HasInSubset(fFront)) {
// is now visible // is now visible
if (Windows(previousWorkspace).HasWindow(floating) if (_Windows(previousWorkspace).HasWindow(floating)
&& previousWorkspace != nextWorkspace && previousWorkspace != nextWorkspace
&& !floating->InSubsetWorkspace(previousWorkspace)) { && !floating->InSubsetWorkspace(previousWorkspace)) {
// but no longer on the previous workspace // but no longer on the previous workspace
Windows(previousWorkspace).RemoveWindow(floating); _Windows(previousWorkspace).RemoveWindow(floating);
floating->SetCurrentWorkspace(-1); floating->SetCurrentWorkspace(-1);
} }
if (!Windows(nextWorkspace).HasWindow(floating)) { if (!_Windows(nextWorkspace).HasWindow(floating)) {
// but wasn't before // but wasn't before
Windows(nextWorkspace).AddWindow(floating, _Windows(nextWorkspace).AddWindow(floating,
floating->Frontmost(Windows(nextWorkspace).FirstWindow(), floating->Frontmost(_Windows(nextWorkspace).FirstWindow(),
nextWorkspace)); nextWorkspace));
floating->SetCurrentWorkspace(nextWorkspace); floating->SetCurrentWorkspace(nextWorkspace);
if (mouseEventWindow != fFront) if (mouseEventWindow != fFront)
@ -2491,11 +2496,11 @@ Desktop::_UpdateFloating(int32 previousWorkspace, int32 nextWorkspace,
// TODO: put the floating last in the floating window list to // TODO: put the floating last in the floating window list to
// preserve the on screen window order // preserve the on screen window order
} }
} else if (Windows(previousWorkspace).HasWindow(floating) } else if (_Windows(previousWorkspace).HasWindow(floating)
&& !floating->InSubsetWorkspace(previousWorkspace)) { && !floating->InSubsetWorkspace(previousWorkspace)) {
// was visible, but is no longer // was visible, but is no longer
Windows(previousWorkspace).RemoveWindow(floating); _Windows(previousWorkspace).RemoveWindow(floating);
floating->SetCurrentWorkspace(-1); floating->SetCurrentWorkspace(-1);
_HideWindow(floating); _HideWindow(floating);
@ -2729,7 +2734,7 @@ Desktop::_ChangeWindowWorkspaces(Window* window, uint32 oldWorkspaces,
if (workspace_in_workspaces(i, oldWorkspaces)) { if (workspace_in_workspaces(i, oldWorkspaces)) {
// window is on this workspace, is it anymore? // window is on this workspace, is it anymore?
if (!workspace_in_workspaces(i, newWorkspaces)) { if (!workspace_in_workspaces(i, newWorkspaces)) {
Windows(i).RemoveWindow(window); _Windows(i).RemoveWindow(window);
if (fLastWorkspaceFocus[i] == window) if (fLastWorkspaceFocus[i] == window)
fLastWorkspaceFocus[i] = NULL; fLastWorkspaceFocus[i] = NULL;
@ -2744,8 +2749,8 @@ Desktop::_ChangeWindowWorkspaces(Window* window, uint32 oldWorkspaces,
} else { } else {
// window was not on this workspace, is it now? // window was not on this workspace, is it now?
if (workspace_in_workspaces(i, newWorkspaces)) { if (workspace_in_workspaces(i, newWorkspaces)) {
Windows(i).AddWindow(window, _Windows(i).AddWindow(window,
window->Frontmost(Windows(i).FirstWindow(), i)); window->Frontmost(_Windows(i).FirstWindow(), i));
if (i == CurrentWorkspace()) { if (i == CurrentWorkspace()) {
// make the window visible in current workspace // make the window visible in current workspace
@ -3174,9 +3179,9 @@ Desktop::_SetWorkspace(int32 index, bool moveFocusWindow)
// But only normal windows are following // But only normal windows are following
uint32 oldWorkspaces = movedWindow->Workspaces(); uint32 oldWorkspaces = movedWindow->Workspaces();
Windows(previousIndex).RemoveWindow(movedWindow); _Windows(previousIndex).RemoveWindow(movedWindow);
Windows(index).AddWindow(movedWindow, _Windows(index).AddWindow(movedWindow,
movedWindow->Frontmost(Windows(index).FirstWindow(), movedWindow->Frontmost(_Windows(index).FirstWindow(),
index)); index));
// TODO: subset windows will always flicker this way // TODO: subset windows will always flicker this way
@ -3189,9 +3194,9 @@ Desktop::_SetWorkspace(int32 index, bool moveFocusWindow)
InvokeSetWindowWorkspaces(movedWindow, movedWindow->Workspaces()); InvokeSetWindowWorkspaces(movedWindow, movedWindow->Workspaces());
} else { } else {
// make sure it's frontmost // make sure it's frontmost
Windows(index).RemoveWindow(movedWindow); _Windows(index).RemoveWindow(movedWindow);
Windows(index).AddWindow(movedWindow, _Windows(index).AddWindow(movedWindow,
movedWindow->Frontmost(Windows(index).FirstWindow(), movedWindow->Frontmost(_Windows(index).FirstWindow(),
index)); index));
} }
} }
@ -3242,7 +3247,7 @@ Desktop::_SetWorkspace(int32 index, bool moveFocusWindow)
WindowList windows(kWorkingList); WindowList windows(kWorkingList);
BList previousRegions; BList previousRegions;
for (Window* window = Windows(index).FirstWindow(); for (Window* window = _Windows(index).FirstWindow();
window != NULL; window = window->NextWindow(index)) { window != NULL; window = window->NextWindow(index)) {
BPoint position = window->Anchor(index).position; BPoint position = window->Anchor(index).position;
@ -3296,7 +3301,7 @@ Desktop::_SetWorkspace(int32 index, bool moveFocusWindow)
_RebuildClippingForAllWindows(stillAvailableOnScreen); _RebuildClippingForAllWindows(stillAvailableOnScreen);
_SetBackground(stillAvailableOnScreen); _SetBackground(stillAvailableOnScreen);
for (Window* window = Windows(index).FirstWindow(); window != NULL; for (Window* window = _Windows(index).FirstWindow(); window != NULL;
window = window->NextWindow(index)) { window = window->NextWindow(index)) {
// send B_WORKSPACE_ACTIVATED message // send B_WORKSPACE_ACTIVATED message
window->WorkspaceActivated(index, true); window->WorkspaceActivated(index, true);
@ -3332,7 +3337,7 @@ Desktop::_SetWorkspace(int32 index, bool moveFocusWindow)
// Set new focus, but keep focus to a floating window if still visible // Set new focus, but keep focus to a floating window if still visible
if (movedWindow != NULL) if (movedWindow != NULL)
SetFocusWindow(movedWindow); SetFocusWindow(movedWindow);
else if (!Windows(index).HasWindow(FocusWindow()) else if (!_Windows(index).HasWindow(FocusWindow())
|| (FocusWindow() != NULL && !FocusWindow()->IsFloating())) || (FocusWindow() != NULL && !FocusWindow()->IsFloating()))
SetFocusWindow(fLastWorkspaceFocus[index]); SetFocusWindow(fLastWorkspaceFocus[index]);

View File

@ -233,7 +233,7 @@ public:
void Redraw(); void Redraw();
void RedrawBackground(); void RedrawBackground();
void ReloadDecorator(Window* window); void ReloadAllDecorators();
BRegion& BackgroundRegion() BRegion& BackgroundRegion()
{ return fBackgroundRegion; } { return fBackgroundRegion; }
@ -252,9 +252,10 @@ public:
BPrivate::LinkSender& sender); BPrivate::LinkSender& sender);
WindowList& CurrentWindows(); WindowList& CurrentWindows();
WindowList& Windows(int32 index);
private: private:
WindowList& _Windows(int32 index);
void _LaunchInputServer(); void _LaunchInputServer();
void _GetLooperName(char* name, size_t size); void _GetLooperName(char* name, size_t size);
void _PrepareQuit(); void _PrepareQuit();