1 /*
2 * Copyright 2005-2009, Haiku.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 * Axel Dörfler, axeld@pinc-software.de
7 */
8
9
10 #include "Workspace.h"
11
12 #include <math.h>
13 #include <stdio.h>
14 #include <stdlib.h>
15
16 #include <Debug.h>
17
18 #include "Desktop.h"
19 #include "WorkspacePrivate.h"
20 #include "Window.h"
21
22
23 static rgb_color kDefaultColor = (rgb_color){ 51, 102, 152, 255 };
24
25
Private()26 Workspace::Private::Private()
27 {
28 _SetDefaults();
29 }
30
31
~Private()32 Workspace::Private::~Private()
33 {
34 }
35
36
37 void
SetDisplaysFromDesktop(Desktop * desktop)38 Workspace::Private::SetDisplaysFromDesktop(Desktop* desktop)
39 {
40 }
41
42
43 void
SetColor(const rgb_color & color)44 Workspace::Private::SetColor(const rgb_color& color)
45 {
46 fColor = color;
47 }
48
49
50 void
RestoreConfiguration(const BMessage & settings)51 Workspace::Private::RestoreConfiguration(const BMessage& settings)
52 {
53 rgb_color color;
54 if (settings.FindInt32("color", (int32 *)&color) == B_OK)
55 fColor = color;
56
57 fStoredScreenConfiguration.Restore(settings);
58 fCurrentScreenConfiguration.Restore(settings);
59 }
60
61
62 /*! \brief Store the workspace configuration in a message
63 */
64 void
StoreConfiguration(BMessage & settings)65 Workspace::Private::StoreConfiguration(BMessage& settings)
66 {
67 fStoredScreenConfiguration.Store(settings);
68 settings.AddInt32("color", *(int32 *)&fColor);
69 }
70
71
72 void
_SetDefaults()73 Workspace::Private::_SetDefaults()
74 {
75 fColor = kDefaultColor;
76 }
77
78
79 // #pragma mark -
80
81
Workspace(Desktop & desktop,int32 index,bool readOnly)82 Workspace::Workspace(Desktop& desktop, int32 index, bool readOnly)
83 :
84 fWorkspace(desktop.WorkspaceAt(index)),
85 fDesktop(desktop),
86 fCurrentWorkspace(index == desktop.CurrentWorkspace())
87 {
88 ASSERT(desktop.WindowLocker().IsWriteLocked()
89 || ( readOnly && desktop.WindowLocker().IsReadLocked()));
90 RewindWindows();
91 }
92
93
~Workspace()94 Workspace::~Workspace()
95 {
96 }
97
98
99 const rgb_color&
Color() const100 Workspace::Color() const
101 {
102 return fWorkspace.Color();
103 }
104
105
106 void
SetColor(const rgb_color & color,bool makeDefault)107 Workspace::SetColor(const rgb_color& color, bool makeDefault)
108 {
109 if (color == Color())
110 return;
111
112 fWorkspace.SetColor(color);
113 fDesktop.RedrawBackground();
114 if (makeDefault)
115 fDesktop.StoreWorkspaceConfiguration(fWorkspace.Index());
116 }
117
118
119 status_t
GetNextWindow(Window * & _window,BPoint & _leftTop)120 Workspace::GetNextWindow(Window*& _window, BPoint& _leftTop)
121 {
122 if (fCurrent == NULL)
123 fCurrent = fWorkspace.Windows().FirstWindow();
124 else
125 fCurrent = fCurrent->NextWindow(fWorkspace.Index());
126
127 if (fCurrent == NULL)
128 return B_ENTRY_NOT_FOUND;
129
130 _window = fCurrent;
131
132 if (fCurrentWorkspace)
133 _leftTop = fCurrent->Frame().LeftTop();
134 else
135 _leftTop = fCurrent->Anchor(fWorkspace.Index()).position;
136
137 return B_OK;
138 }
139
140
141 status_t
GetPreviousWindow(Window * & _window,BPoint & _leftTop)142 Workspace::GetPreviousWindow(Window*& _window, BPoint& _leftTop)
143 {
144 if (fCurrent == NULL)
145 fCurrent = fWorkspace.Windows().LastWindow();
146 else
147 fCurrent = fCurrent->PreviousWindow(fWorkspace.Index());
148
149 if (fCurrent == NULL)
150 return B_ENTRY_NOT_FOUND;
151
152 _window = fCurrent;
153
154 if (fCurrentWorkspace)
155 _leftTop = fCurrent->Frame().LeftTop();
156 else
157 _leftTop = fCurrent->Anchor(fWorkspace.Index()).position;
158
159 return B_OK;
160 }
161
162
163 void
RewindWindows()164 Workspace::RewindWindows()
165 {
166 fCurrent = NULL;
167 }
168
169