1 //****************************************************************************************
2 //
3 // File: Prefs.cpp
4 //
5 // Written by: Daniel Switkin
6 //
7 // Copyright 1999, Be Incorporated
8 //
9 //****************************************************************************************
10
11 #include "Prefs.h"
12
13 #include <stdio.h>
14 #include <string.h>
15
16 #include <FindDirectory.h>
17 #include <OS.h>
18 #include <Path.h>
19 #include <Screen.h>
20
21 #include "Common.h"
22 #include "PulseApp.h"
23
24
Prefs()25 Prefs::Prefs()
26 :
27 fFatalError(false)
28 {
29 BPath path;
30 find_directory(B_USER_SETTINGS_DIRECTORY, &path);
31 path.Append("Pulse_settings");
32 fFile = new BFile(path.Path(), B_READ_WRITE | B_CREATE_FILE);
33 if (fFile->InitCheck() != B_OK) {
34 // try to open read-only
35 if (fFile->SetTo(path.Path(), B_READ_ONLY) != B_OK) {
36 fFatalError = true;
37 return;
38 }
39 }
40
41 int i = NORMAL_WINDOW_MODE;
42 if (!GetInt("window_mode", &window_mode, &i)) {
43 fFatalError = true;
44 return;
45 }
46
47 // These three prefs require a connection to the app_server
48 BRect r = GetNormalWindowRect();
49 if (!GetRect("normal_window_rect", &normal_window_rect, &r)) {
50 fFatalError = true;
51 return;
52 }
53 // While normal window position is under user control, size is not.
54 // Width is fixed and height must be dynamically computed each time,
55 // as number of CPUs could change since boot.
56 ComputeNormalWindowSize();
57
58 r = GetMiniWindowRect();
59 if (!GetRect("mini_window_rect", &mini_window_rect, &r)) {
60 fFatalError = true;
61 return;
62 }
63
64 r.Set(100, 100, 415, 329);
65 if (!GetRect("prefs_window_rect", &prefs_window_rect, &r)) {
66 fFatalError = true;
67 return;
68 }
69
70 i = DEFAULT_NORMAL_BAR_COLOR;
71 if (!GetInt("normal_bar_color", &normal_bar_color, &i)) {
72 fFatalError = true;
73 return;
74 }
75
76 i = DEFAULT_MINI_ACTIVE_COLOR;
77 if (!GetInt("mini_active_color", &mini_active_color, &i)) {
78 fFatalError = true;
79 return;
80 }
81
82 i = DEFAULT_MINI_IDLE_COLOR;
83 if (!GetInt("mini_idle_color", &mini_idle_color, &i)) {
84 fFatalError = true;
85 return;
86 }
87
88 i = DEFAULT_MINI_FRAME_COLOR;
89 if (!GetInt("mini_frame_color", &mini_frame_color, &i)) {
90 fFatalError = true;
91 return;
92 }
93
94 i = DEFAULT_DESKBAR_ACTIVE_COLOR;
95 if (!GetInt("deskbar_active_color", &deskbar_active_color, &i)) {
96 fFatalError = true;
97 return;
98 }
99
100 i = DEFAULT_DESKBAR_IDLE_COLOR;
101 if (!GetInt("deskbar_idle_color", &deskbar_idle_color, &i)) {
102 fFatalError = true;
103 return;
104 }
105
106 i = DEFAULT_DESKBAR_FRAME_COLOR;
107 if (!GetInt("deskbar_frame_color", &deskbar_frame_color, &i)) {
108 fFatalError = true;
109 return;
110 }
111
112 bool b = DEFAULT_NORMAL_FADE_COLORS;
113 if (!GetBool("normal_fade_colors", &normal_fade_colors, &b)) {
114 fFatalError = true;
115 return;
116 }
117
118 // Use the default size unless it would prevent having at least
119 // a one pixel wide display per CPU... this will only happen with > quad
120 i = DEFAULT_DESKBAR_ICON_WIDTH;
121 if (i < GetMinimumViewWidth())
122 i = GetMinimumViewWidth();
123 if (!GetInt("deskbar_icon_width", &deskbar_icon_width, &i)) {
124 fFatalError = true;
125 return;
126 }
127 }
128
129
~Prefs()130 Prefs::~Prefs()
131 {
132 delete fFile;
133 }
134
135
136 float
GetNormalWindowHeight()137 Prefs::GetNormalWindowHeight()
138 {
139 system_info sys_info;
140 get_system_info(&sys_info);
141
142 float height = PROGRESS_MTOP + PROGRESS_MBOTTOM
143 + sys_info.cpu_count * ITEM_OFFSET;
144 if (PULSEVIEW_MIN_HEIGHT > height)
145 height = PULSEVIEW_MIN_HEIGHT;
146
147 return height;
148 }
149
150
151 void
ComputeNormalWindowSize()152 Prefs::ComputeNormalWindowSize()
153 {
154 normal_window_rect.right = normal_window_rect.left + PULSEVIEW_WIDTH;
155 normal_window_rect.bottom = normal_window_rect.top + GetNormalWindowHeight();
156 }
157
158
159 BRect
GetNormalWindowRect()160 Prefs::GetNormalWindowRect()
161 {
162 // Dock the window in the lower right hand corner just like the original
163 BRect r(0, 0, PULSEVIEW_WIDTH, GetNormalWindowHeight());
164 BRect screen_rect = BScreen(B_MAIN_SCREEN_ID).Frame();
165 r.OffsetTo(screen_rect.right - r.Width() - 5, screen_rect.bottom - r.Height() - 5);
166 return r;
167 }
168
169
170 BRect
GetMiniWindowRect()171 Prefs::GetMiniWindowRect()
172 {
173 // Lower right hand corner by default
174 BRect screen_rect = BScreen(B_MAIN_SCREEN_ID).Frame();
175 screen_rect.left = screen_rect.right - 30;
176 screen_rect.top = screen_rect.bottom - 150;
177 screen_rect.OffsetBy(-5, -5);
178 return screen_rect;
179 }
180
181
182 bool
GetInt(const char * name,int * value,int * defaultvalue)183 Prefs::GetInt(const char *name, int *value, int *defaultvalue)
184 {
185 status_t err = fFile->ReadAttr(name, B_INT32_TYPE, 0, value, 4);
186 if (err == B_ENTRY_NOT_FOUND) {
187 *value = *defaultvalue;
188 if (fFile->WriteAttr(name, B_INT32_TYPE, 0, defaultvalue, 4) < 0) {
189 printf("WriteAttr on %s died\n", name);
190 fFatalError = true;
191 }
192 } else if (err < 0) {
193 printf("Unknown error reading %s:\n%s\n", name, strerror(err));
194 fFatalError = true;
195 return false;
196 }
197 return true;
198 }
199
200
201 bool
GetBool(const char * name,bool * value,bool * defaultvalue)202 Prefs::GetBool(const char *name, bool *value, bool *defaultvalue)
203 {
204 status_t err = fFile->ReadAttr(name, B_BOOL_TYPE, 0, value, 1);
205 if (err == B_ENTRY_NOT_FOUND) {
206 *value = *defaultvalue;
207 if (fFile->WriteAttr(name, B_BOOL_TYPE, 0, defaultvalue, 1) < 0) {
208 printf("WriteAttr on %s died\n", name);
209 fFatalError = true;
210 }
211 } else if (err < 0) {
212 printf("Unknown error reading %s:\n%s\n", name, strerror(err));
213 fFatalError = true;
214 return false;
215 }
216 return true;
217 }
218
219
220 bool
GetRect(const char * name,BRect * value,BRect * defaultvalue)221 Prefs::GetRect(const char *name, BRect *value, BRect *defaultvalue)
222 {
223 status_t err = fFile->ReadAttr(name, B_RECT_TYPE, 0, value, sizeof(BRect));
224 if (err == B_ENTRY_NOT_FOUND) {
225 *value = *defaultvalue;
226 if (fFile->WriteAttr(name, B_RECT_TYPE, 0, defaultvalue, sizeof(BRect)) < 0) {
227 printf("WriteAttr on %s died\n", name);
228 fFatalError = true;
229 }
230 } else if (err < 0) {
231 printf("Unknown error reading %s:\n%s\n", name, strerror(err));
232 fFatalError = true;
233 return false;
234 }
235 return true;
236 }
237
238
239 bool
PutInt(const char * name,int * value)240 Prefs::PutInt(const char *name, int *value)
241 {
242 status_t err = fFile->WriteAttr(name, B_INT32_TYPE, 0, value, 4);
243 if (err < 0) {
244 printf("Unknown error writing %s:\n%s\n", name, strerror(err));
245 fFatalError = true;
246 return false;
247 }
248 return true;
249 }
250
251
252 bool
PutBool(const char * name,bool * value)253 Prefs::PutBool(const char *name, bool *value)
254 {
255 status_t err = fFile->WriteAttr(name, B_BOOL_TYPE, 0, value, 1);
256 if (err < 0) {
257 printf("Unknown error writing %s:\n%s\n", name, strerror(err));
258 fFatalError = true;
259 return false;
260 }
261 return true;
262 }
263
264
265 bool
PutRect(const char * name,BRect * value)266 Prefs::PutRect(const char *name, BRect *value)
267 {
268 status_t err = fFile->WriteAttr(name, B_RECT_TYPE, 0, value, sizeof(BRect));
269 if (err < 0) {
270 printf("Unknown error writing %s:\n%s\n", name, strerror(err));
271 fFatalError = true;
272 return false;
273 }
274 return true;
275 }
276
277
278 bool
Save()279 Prefs::Save()
280 {
281 if (fFatalError)
282 return false;
283
284 if (!PutInt("window_mode", &window_mode)
285 || !PutRect("normal_window_rect", &normal_window_rect)
286 || !PutRect("mini_window_rect", &mini_window_rect)
287 || !PutRect("prefs_window_rect", &prefs_window_rect)
288 || !PutInt("normal_bar_color", &normal_bar_color)
289 || !PutInt("mini_active_color", &mini_active_color)
290 || !PutInt("mini_idle_color", &mini_idle_color)
291 || !PutInt("mini_frame_color", &mini_frame_color)
292 || !PutInt("deskbar_active_color", &deskbar_active_color)
293 || !PutInt("deskbar_idle_color", &deskbar_idle_color)
294 || !PutInt("deskbar_frame_color", &deskbar_frame_color)
295 || !PutBool("normal_fade_colors", &normal_fade_colors)
296 || !PutInt("deskbar_icon_width", &deskbar_icon_width))
297 return false;
298
299 return true;
300 }
301
302