xref: /haiku/src/preferences/screensaver/ScreenSaverWindow.cpp (revision 7cae4a1ee0a7e8f1214e6fa410efe9f5a0c7cecb)
1 /*
2  * Copyright 2003-2006, Haiku.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		Michael Phipps
7  *		Jérôme Duval, jerome.duval@free.fr
8  *		Axel Dörfler, axeld@pinc-software.de
9  */
10 
11 
12 #include "MouseAreaView.h"
13 #include "PreviewView.h"
14 #include "ScreenSaverItem.h"
15 #include "ScreenSaverWindow.h"
16 
17 #include <Application.h>
18 #include <Box.h>
19 #include <Button.h>
20 #include <Directory.h>
21 #include <Entry.h>
22 #include <File.h>
23 #include <FindDirectory.h>
24 #include <Font.h>
25 #include <ListView.h>
26 #include <Path.h>
27 #include <Roster.h>
28 #include <Screen.h>
29 #include <ScreenSaver.h>
30 #include <ScrollView.h>
31 #include <Slider.h>
32 #include <StringView.h>
33 #include <TabView.h>
34 
35 #include <stdio.h>
36 
37 #include <Debug.h>
38 #define CALLED() PRINT(("%s\n", __PRETTY_FUNCTION__))
39 
40 
41 const int32 kMsgSaverSelected = 'SSEL';
42 const int32 kMsgTestSaver = 'TEST';
43 const int32 kMsgAddSaver = 'ADD ';
44 const int32 kMsgPasswordCheckBox = 'PWCB';
45 const int32 kMsgRunSliderChanged = 'RSCG';
46 const int32 kMsgPasswordSliderChanged = 'PWCG';
47 const int32 kMsgChangePassword = 'PWBT';
48 const int32 kMsgEnableScreenSaverBox = 'ESCH';
49 
50 const int32 kMsgTurnOffCheckBox = 'TUOF';
51 const int32 kMsgTurnOffSliderChanged = 'TUCG';
52 
53 static const uint32 kTimeSliderChanged = 'tsch';
54 
55 class TimeSlider : public BSlider {
56 	public:
57 		TimeSlider(BRect frame, const char* name, uint32 modificationMessage);
58 		virtual ~TimeSlider();
59 
60 		virtual void AttachedToWindow();
61 		virtual void MessageReceived(BMessage* message);
62 		virtual void SetValue(int32 value);
63 
64 		void SetTime(bigtime_t useconds);
65 		bigtime_t Time();
66 
67 	private:
68 		void _TimeToString(bigtime_t useconds, BString& string);
69 
70 		uint32	fModificationMessage;
71 };
72 
73 class ModulesView : public BView {
74 	public:
75 		ModulesView(BRect frame, const char* name, ScreenSaverPrefs& prefs);
76 		virtual ~ModulesView();
77 
78 		virtual void DetachedFromWindow();
79 		virtual void AttachedToWindow();
80 		virtual void MessageReceived(BMessage* message);
81 
82 		void PopulateScreenSaverList();
83 		void SaveState();
84 
85 	private:
86 		static int _CompareScreenSaverItems(const void* left, const void* right);
87 		BScreenSaver* _ScreenSaver();
88 		void _CloseSaver();
89 		void _OpenSaver();
90 
91 		BFilePanel*		fFilePanel;
92 		BListView*		fListView;
93 		BButton*		fTestButton;
94 		BButton*		fAddButton;
95 
96 		ScreenSaverPrefs& fPrefs;
97 		ScreenSaverRunner* fSaverRunner;
98 		BString			fCurrentName;
99 
100 		BBox*			fSettingsBox;
101 		BView*			fSettingsView;
102 
103 		PreviewView*	fPreviewDisplay;
104 };
105 
106 static const int32 kTimeInUnits[] = {
107 	30,    60,   90,
108 	120,   150,  180,
109 	240,   300,  360,
110 	420,   480,  540,
111 	600,   900,  1200,
112 	1500,  1800, 2400,
113 	3000,  3600, 5400,
114 	7200,  9000, 10800,
115 	14400, 18000
116 };
117 static const int32 kTimeUnitCount = sizeof(kTimeInUnits) / sizeof(kTimeInUnits[0]);
118 
119 
120 TimeSlider::TimeSlider(BRect frame, const char* name, uint32 modificationMessage)
121 	: BSlider(frame, name, "0 minutes", new BMessage(kTimeSliderChanged),
122 		0, kTimeUnitCount - 1, B_TRIANGLE_THUMB),
123 	fModificationMessage(modificationMessage)
124 {
125 	SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
126 	SetModificationMessage(new BMessage(kTimeSliderChanged));
127 	SetBarThickness(10);
128 }
129 
130 
131 TimeSlider::~TimeSlider()
132 {
133 }
134 
135 
136 void
137 TimeSlider::AttachedToWindow()
138 {
139 	SetTarget(this);
140 }
141 
142 
143 void
144 TimeSlider::MessageReceived(BMessage* message)
145 {
146 	switch (message->what) {
147 		case kTimeSliderChanged:
148 			Window()->PostMessage(fModificationMessage);
149 			break;
150 
151 		default:
152 			BSlider::MessageReceived(message);
153 	}
154 }
155 
156 
157 void
158 TimeSlider::SetValue(int32 value)
159 {
160 	int32 oldValue = Value();
161 	BSlider::SetValue(value);
162 
163 	if (oldValue != Value()) {
164 		BString label;
165 		_TimeToString(kTimeInUnits[Value()] * 1000000LL, label);
166 		SetLabel(label.String());
167 	}
168 }
169 
170 
171 void
172 TimeSlider::SetTime(bigtime_t useconds)
173 {
174 	for (int t = 0; t < kTimeUnitCount; t++) {
175 		if (kTimeInUnits[t] * 1000000LL == useconds) {
176 			SetValue(t);
177 			break;
178 		}
179 	}
180 }
181 
182 
183 bigtime_t
184 TimeSlider::Time()
185 {
186 	return 1000000LL * kTimeInUnits[Value()];
187 }
188 
189 
190 void
191 TimeSlider::_TimeToString(bigtime_t useconds, BString& string)
192 {
193 	useconds /= 1000000LL;
194 		// convert to seconds
195 
196 	string = "";
197 
198 	// hours
199 	uint32 hours = useconds / 3600;
200 	if (hours != 0)
201 		string << hours << " hours";
202 
203 	useconds %= 3600;
204 
205 	// minutes
206 	uint32 minutes = useconds / 60;
207 	if (hours != 0)
208 		string << " ";
209 	if (minutes != 0)
210 		string << minutes << " minutes";
211 
212 	useconds %= 60;
213 
214 	// seconds
215 	uint32 seconds = useconds / 60;
216 	if (hours != 0 || minutes != 0)
217 		string << " ";
218 	if (seconds != 0)
219 		string << seconds << " seconds";
220 }
221 
222 
223 //	#pragma mark -
224 
225 
226 ModulesView::ModulesView(BRect rect, const char* name, ScreenSaverPrefs& prefs)
227 	: BView(rect, name, B_FOLLOW_ALL, B_WILL_DRAW),
228 	fPrefs(prefs),
229 	fSaverRunner(NULL),
230 	fSettingsView(NULL)
231 {
232 	SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
233 
234 	AddChild(fSettingsBox = new BBox(BRect(183,11,434,285),
235 		"ModuleSettingsBox", B_FOLLOW_NONE, B_WILL_DRAW));
236 	fSettingsBox->SetLabel("Module settings");
237 
238 	fListView = new BListView(BRect(8,136,156,255), "SaversListView",
239 		B_SINGLE_SELECTION_LIST);
240 	fListView->SetSelectionMessage(new BMessage(kMsgSaverSelected));
241 	AddChild(new BScrollView("scroll_list", fListView,
242 		B_FOLLOW_ALL, 0, false, true));
243 
244 	fTestButton = new BButton(BRect(8,260,88,277), "TestButton", "Test",
245 		new BMessage(kMsgTestSaver));
246 	AddChild(fTestButton);
247 
248 	fAddButton = new BButton(BRect(98,260,173,277), "AddButton", "Add" B_UTF8_ELLIPSIS,
249 		new BMessage(kMsgAddSaver));
250 	AddChild(fAddButton);
251 
252 	AddChild(fPreviewDisplay = new PreviewView(BRect(20, 15, 150, 120), "preview"));
253 
254 	PopulateScreenSaverList();
255 	fFilePanel = new BFilePanel();
256 }
257 
258 
259 ModulesView::~ModulesView()
260 {
261 	delete fFilePanel;
262 }
263 
264 
265 void
266 ModulesView::DetachedFromWindow()
267 {
268 	_CloseSaver();
269 }
270 
271 
272 void
273 ModulesView::AttachedToWindow()
274 {
275 	_OpenSaver();
276 
277 	fListView->SetTarget(this);
278 	fTestButton->SetTarget(this);
279 	fAddButton->SetTarget(this);
280 }
281 
282 
283 void
284 ModulesView::MessageReceived(BMessage* message)
285 {
286 	switch (message->what) {
287 		case kMsgSaverSelected:
288 		{
289 			int selection = fListView->CurrentSelection();
290 			if (selection < 0)
291 				break;
292 
293 			ScreenSaverItem* item = (ScreenSaverItem *)fListView->ItemAt(selection);
294 			if (item == NULL)
295 				break;
296 
297 			if (!strcmp(fPrefs.ModuleName(), "Blackness"))
298 				fPrefs.SetModuleName("");
299 			else
300 				fPrefs.SetModuleName(item->Text());
301 
302 			_CloseSaver();
303 			_OpenSaver();
304 			break;
305 		}
306 
307 		case kMsgTestSaver:
308 			SaveState();
309 			fPrefs.SaveSettings();
310 
311 			be_roster->Launch(SCREEN_BLANKER_SIG, &fPrefs.GetSettings());
312 			break;
313 
314 		case kMsgAddSaver:
315 			fFilePanel->Show();
316 			break;
317 
318 		default:
319 			BView::MessageReceived(message);
320 	}
321 }
322 
323 
324 void
325 ModulesView::SaveState()
326 {
327 	BScreenSaver* saver = _ScreenSaver();
328 	if (saver == NULL)
329 		return;
330 
331 	BMessage state;
332 	if (saver->SaveState(&state) == B_OK)
333 		fPrefs.SetState(fCurrentName.String(), &state);
334 }
335 
336 
337 void
338 ModulesView::PopulateScreenSaverList()
339 {
340  	fListView->DeselectAll();
341 	while (ScreenSaverItem* item = (ScreenSaverItem *)fListView->RemoveItem((int32)0)) {
342 		delete item;
343 	}
344 
345 	// Blackness is a built-in screen saver
346 	fListView->AddItem(new ScreenSaverItem("Blackness", ""));
347 
348 	// Iterate over add-on directories, and add their files to the list view
349 
350 	directory_which which[] = {B_BEOS_ADDONS_DIRECTORY, B_USER_ADDONS_DIRECTORY};
351 	ScreenSaverItem* selectItem = NULL;
352 
353 	for (uint32 i = 0; i < sizeof(which) / sizeof(which[0]); i++) {
354 		BPath basePath;
355 		find_directory(which[i], &basePath);
356 		basePath.Append("Screen Savers", true);
357 
358 		BDirectory dir(basePath.Path());
359 		BEntry entry;
360 		while (dir.GetNextEntry(&entry, true) == B_OK) {
361 			char name[B_FILE_NAME_LENGTH];
362 			if (entry.GetName(name) != B_OK)
363 				continue;
364 
365 			BPath path = basePath;
366 			path.Append(name);
367 
368 			ScreenSaverItem* item = new ScreenSaverItem(name, path.Path());
369 			fListView->AddItem(item);
370 
371 			if (!strcmp(fPrefs.ModuleName(), item->Text())
372 				|| (!strcmp(fPrefs.ModuleName(), "")
373 					&& !strcmp(item->Text(), "Blackness")))
374 				selectItem = item;
375 		}
376 	}
377 
378 	fListView->SortItems(_CompareScreenSaverItems);
379 
380 	fListView->Select(fListView->IndexOf(selectItem));
381 	fListView->ScrollToSelection();
382 }
383 
384 
385 //! sorting function for ScreenSaverItems
386 int
387 ModulesView::_CompareScreenSaverItems(const void* left, const void* right)
388 {
389 	ScreenSaverItem* leftItem  = *(ScreenSaverItem **)left;
390 	ScreenSaverItem* rightItem = *(ScreenSaverItem **)right;
391 
392 	return strcmp(leftItem->Text(), rightItem->Text());
393 }
394 
395 
396 BScreenSaver*
397 ModulesView::_ScreenSaver()
398 {
399 	if (fSaverRunner != NULL)
400 		return fSaverRunner->ScreenSaver();
401 
402 	return NULL;
403 }
404 
405 
406 void
407 ModulesView::_CloseSaver()
408 {
409 	// remove old screen saver preview & config
410 
411 	BScreenSaver* saver = _ScreenSaver();
412 	BView* view = fPreviewDisplay->RemovePreview();
413 	if (fSettingsView != NULL)
414 		fSettingsBox->RemoveChild(fSettingsView);
415 
416 	if (saver != NULL)
417 		saver->StopConfig();
418 
419 	SaveState();
420 
421 	delete view;
422 	delete fSettingsView;
423 	delete fSaverRunner;
424 
425 	fSettingsView = NULL;
426 	fSaverRunner = NULL;
427 }
428 
429 
430 void
431 ModulesView::_OpenSaver()
432 {
433 	// create new screen saver preview & config
434 
435    	BView* view = fPreviewDisplay->AddPreview();
436 	fCurrentName = fPrefs.ModuleName();
437 	fSaverRunner = new ScreenSaverRunner(Window(), view, true, fPrefs);
438 	BScreenSaver* saver = _ScreenSaver();
439 
440 	BRect bnds = fSettingsBox->Bounds();
441 	bnds.left = 3;
442 	bnds.right -= 7;
443 	bnds.top = 21;
444 	bnds.bottom -= 2;
445 	fSettingsView = new BView(bnds,"settingsArea",B_FOLLOW_NONE,B_WILL_DRAW);
446 	fSettingsView->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
447 	fSettingsBox->AddChild(fSettingsView);
448 
449 	if (saver != NULL) {
450 		fSaverRunner->Run();
451 		saver->StartConfig(fSettingsView);
452 	}
453 }
454 
455 
456 //	#pragma mark -
457 
458 
459 ScreenSaverWindow::ScreenSaverWindow()
460 	: BWindow(BRect(50, 50, 496, 375), "Screen Saver",
461 		B_TITLED_WINDOW, B_ASYNCHRONOUS_CONTROLS | B_NOT_ZOOMABLE | B_NOT_RESIZABLE),
462 	fFadeNowString(NULL),
463 	fFadeNowString2(NULL),
464 	fDontFadeString(NULL),
465 	fDontFadeString2(NULL),
466 	fFadeNow(NULL),
467 	fFadeNever(NULL)
468 {
469 	fPrefs.LoadSettings();
470 
471 	BRect rect = Bounds();
472 
473 	// Create a background view
474 	BView *background = new BView(rect, "background", B_FOLLOW_ALL, 0);
475 	background->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
476 	AddChild(background);
477 
478 	// Add the tab view to the background
479 	rect.top += 4;
480 	fTabView = new BTabView(rect, "tab_view");
481 
482 	// Create the controls inside the tabs
483 	rect = fTabView->ContainerView()->Bounds();
484 	_SetupFadeTab(rect);
485 	fModulesView = new ModulesView(rect, "Modules", fPrefs);
486 
487 	fTabView->AddTab(fFadeView);
488 	fTabView->AddTab(fModulesView);
489 	background->AddChild(fTabView);
490 
491 	// Create the password editing window
492 	fPasswordWindow = new PasswordWindow(fPrefs);
493 	fPasswordWindow->Run();
494 
495 	MoveTo(fPrefs.WindowFrame().left, fPrefs.WindowFrame().top);
496 
497 	fEnableCheckBox->SetValue(fPrefs.TimeFlags() & ENABLE_SAVER ? B_CONTROL_ON : B_CONTROL_OFF);
498 	fRunSlider->SetTime(fPrefs.BlankTime());
499 	fTurnOffSlider->SetTime(fPrefs.OffTime());
500 	fFadeNow->SetCorner(fPrefs.GetBlankCorner());
501 	fFadeNever->SetCorner(fPrefs.GetNeverBlankCorner());
502 	fPasswordCheckBox->SetValue(fPrefs.LockEnable());
503 	fPasswordSlider->SetTime(fPrefs.PasswordTime());
504 
505 	fTabView->Select(fPrefs.WindowTab());
506 
507 	_UpdateTurnOffScreen();
508 	_UpdateStatus();
509 }
510 
511 
512 ScreenSaverWindow::~ScreenSaverWindow()
513 {
514 }
515 
516 
517 //! Create the controls for the fade tab
518 void
519 ScreenSaverWindow::_SetupFadeTab(BRect rect)
520 {
521 	fFadeView = new BView(rect, "Fade", B_FOLLOW_ALL, 0);
522 	fFadeView->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
523 
524 	rect.InsetBy(8, 8);
525 /*
526 	font_height fontHeight;
527 	be_plain_font->GetHeight(&fontHeight);
528 	float lineHeight = ceilf(fontHeight.ascent + fontHeight.descent);
529 */
530 	fEnableCheckBox = new BCheckBox(BRect(0, 0, 1, 1), "EnableCheckBox",
531 		"Enable Screen Saver", new BMessage(kMsgEnableScreenSaverBox));
532 	fEnableCheckBox->ResizeToPreferred();
533 
534 	BBox* box = new BBox(rect, "EnableScreenSaverBox", B_FOLLOW_ALL);
535 	box->SetLabel(fEnableCheckBox);
536 	fFadeView->AddChild(box);
537 
538 	// Run Module
539 	rect.top = fEnableCheckBox->Bounds().bottom + 8.0f;
540 	BStringView* stringView = new BStringView(rect, NULL, "Run module");
541 	stringView->ResizeToPreferred();
542 	box->AddChild(stringView);
543 
544 	float topEdge = rect.top;
545 	fRunSlider = new TimeSlider(BRect(135, topEdge, 420, topEdge + 20),
546 		"RunSlider", kMsgRunSliderChanged);
547 	float width, height;
548 	fRunSlider->GetPreferredSize(&width, &height);
549 	fRunSlider->ResizeTo(fRunSlider->Bounds().Width(), height);
550 	box->AddChild(fRunSlider);
551 
552 	// Turn Off
553 	topEdge += fRunSlider->Bounds().Height() + 4.0f;
554 	fTurnOffCheckBox = new BCheckBox(BRect(20, topEdge-2, 127, topEdge + 20),
555 		"TurnOffScreenCheckBox", "Turn off screen", new BMessage(kMsgTurnOffCheckBox));
556 	fTurnOffCheckBox->ResizeToPreferred();
557 	box->AddChild(fTurnOffCheckBox);
558 
559 	fTurnOffSlider = new TimeSlider(BRect(135, topEdge, 420, topEdge + 20),
560 		"TurnOffSlider", kMsgTurnOffSliderChanged);
561 	fTurnOffSlider->ResizeTo(fTurnOffSlider->Bounds().Width(), height);
562 	box->AddChild(fTurnOffSlider);
563 
564 	// Password
565 	topEdge += fTurnOffSlider->Bounds().Height() + 4.0f;
566 	fPasswordCheckBox = new BCheckBox(BRect(20, topEdge - 2, 127, topEdge + 20),
567 		"PasswordCheckbox", "Password lock", new BMessage(kMsgPasswordCheckBox));
568 	fPasswordCheckBox->ResizeToPreferred();
569 	box->AddChild(fPasswordCheckBox);
570 
571 	fPasswordSlider = new TimeSlider(BRect(135, topEdge, 420, topEdge + 20),
572 		"PasswordSlider", kMsgPasswordSliderChanged);
573 	fPasswordSlider->ResizeTo(fPasswordSlider->Bounds().Width(), height);
574 	box->AddChild(fPasswordSlider);
575 
576 	topEdge += fPasswordSlider->Bounds().Height() + 4.0f;
577 	fPasswordButton = new BButton(BRect(390, topEdge, 410, topEdge + 24), "PasswordButton",
578 		"Password" B_UTF8_ELLIPSIS, new BMessage(kMsgChangePassword));
579 	fPasswordButton->ResizeToPreferred();
580 	fPasswordButton->MoveBy(-fPasswordButton->Bounds().Width(), 0);
581 	box->AddChild(fPasswordButton);
582 
583 	// Bottom
584 
585 	box->AddChild(fFadeNow = new MouseAreaView(BRect(20,205,80,260),"fadeNow"));
586 	box->AddChild(fFadeNever = new MouseAreaView(BRect(220,205,280,260),"fadeNever"));
587 
588 	box->AddChild(fFadeNowString = new BStringView(BRect(90,215,193,230),"FadeNowString","Fade now when"));
589 	fFadeNowString->SetText("Fade now when");
590 	fFadeNowString->SetAlignment(B_ALIGN_LEFT);
591 
592 	box->AddChild(fFadeNowString2 = new BStringView(BRect(90,233,193,248),"FadeNowString2","mouse is here"));
593 	fFadeNowString2->SetText("mouse is here");
594 	fFadeNowString2->SetAlignment(B_ALIGN_LEFT);
595 
596 	box->AddChild(fDontFadeString = new BStringView(BRect(290,215,387,230),"DontFadeString","Don't fade when"));
597 	fDontFadeString->SetText("Don't fade when");
598 	fDontFadeString->SetAlignment(B_ALIGN_LEFT);
599 
600 	box->AddChild(fDontFadeString2 = new BStringView(BRect(290,233,387,248),"DontFadeString2","mouse is here"));
601 	fDontFadeString2->SetText("mouse is here");
602 	fDontFadeString2->SetAlignment(B_ALIGN_LEFT);
603 }
604 
605 
606 void
607 ScreenSaverWindow::_UpdateTurnOffScreen()
608 {
609 	bool enabled = (fPrefs.TimeFlags() & ENABLE_DPMS_MASK) != 0;
610 
611 	BScreen screen(this);
612 	uint32 dpmsCapabilities = screen.DPMSCapabilites();
613 
614 	fTurnOffScreenFlags = 0;
615 	if (dpmsCapabilities & B_DPMS_OFF)
616 		fTurnOffScreenFlags |= ENABLE_DPMS_OFF;
617 	if (dpmsCapabilities & B_DPMS_STAND_BY)
618 		fTurnOffScreenFlags |= ENABLE_DPMS_STAND_BY;
619 	if (dpmsCapabilities & B_DPMS_SUSPEND)
620 		fTurnOffScreenFlags |= ENABLE_DPMS_SUSPEND;
621 
622 	fTurnOffCheckBox->SetValue(enabled && fTurnOffScreenFlags != 0
623 		? B_CONTROL_ON : B_CONTROL_OFF);
624 }
625 
626 
627 void
628 ScreenSaverWindow::MessageReceived(BMessage *msg)
629 {
630 	switch (msg->what) {
631 		// "Fade" tab
632 
633 		case kMsgRunSliderChanged:
634 			if (fRunSlider->Value() > fTurnOffSlider->Value())
635 				fTurnOffSlider->SetValue(fRunSlider->Value());
636 
637 			if (fRunSlider->Value() > fPasswordSlider->Value())
638 				fPasswordSlider->SetValue(fRunSlider->Value());
639 			break;
640 
641 		case kMsgTurnOffCheckBox:
642 			fTurnOffSlider->SetEnabled(fTurnOffCheckBox->Value() == B_CONTROL_ON);
643 			break;
644 
645 		case kMsgTurnOffSliderChanged:
646 			if (fRunSlider->Value() > fTurnOffSlider->Value())
647 				fRunSlider->SetValue(fTurnOffSlider->Value());
648 			break;
649 
650 		case kMsgPasswordSliderChanged:
651 			if (fPasswordSlider->Value() < fRunSlider->Value())
652 				fRunSlider->SetValue(fPasswordSlider->Value());
653 			break;
654 
655 		case kMsgPasswordCheckBox:
656 		case kMsgEnableScreenSaverBox:
657 			_UpdateStatus();
658 			break;
659 
660 		case kMsgChangePassword:
661 			fPasswordWindow->Show();
662 			break;
663 
664 		// "Modules" tab
665 
666 		case kMsgUpdateList:
667 			fModulesView->PopulateScreenSaverList();
668 			break;
669   	}
670 	BWindow::MessageReceived(msg);
671 }
672 
673 
674 void
675 ScreenSaverWindow::ScreenChanged(BRect frame, color_space colorSpace)
676 {
677 	_UpdateTurnOffScreen();
678 }
679 
680 
681 bool
682 ScreenSaverWindow::QuitRequested()
683 {
684 	_UpdateStatus();
685 	fModulesView->SaveState();
686 	fPrefs.SaveSettings();
687 
688 	be_app->PostMessage(B_QUIT_REQUESTED);
689 	return true;
690 }
691 
692 
693 void
694 ScreenSaverWindow::_UpdateStatus()
695 {
696 	DisableUpdates();
697 
698 	bool enabled = fEnableCheckBox->Value() == B_CONTROL_ON;
699 	fPasswordCheckBox->SetEnabled(enabled);
700 	fTurnOffCheckBox->SetEnabled(enabled && fTurnOffScreenFlags != 0);
701 	fRunSlider->SetEnabled(enabled);
702 	fTurnOffSlider->SetEnabled(enabled && fTurnOffCheckBox->Value());
703 	fPasswordSlider->SetEnabled(enabled && fPasswordCheckBox->Value());
704 	fPasswordButton->SetEnabled(enabled && fPasswordCheckBox->Value());
705 
706 	EnableUpdates();
707 
708 	// Update the saved preferences
709 	fPrefs.SetWindowFrame(Frame());
710 	fPrefs.SetWindowTab(fTabView->Selection());
711 	fPrefs.SetTimeFlags((enabled ? ENABLE_SAVER : 0)
712 		| (fTurnOffCheckBox->Value() ? fTurnOffScreenFlags : 0));
713 	fPrefs.SetBlankTime(fRunSlider->Time());
714 	fPrefs.SetOffTime(fTurnOffSlider->Time());
715 	fPrefs.SetSuspendTime(fTurnOffSlider->Time());
716 	fPrefs.SetStandbyTime(fTurnOffSlider->Time());
717 	fPrefs.SetBlankCorner(fFadeNow->Corner());
718 	fPrefs.SetNeverBlankCorner(fFadeNever->Corner());
719 	fPrefs.SetLockEnable(fPasswordCheckBox->Value());
720 	fPrefs.SetPasswordTime(fPasswordSlider->Time());
721 
722 	// TODO - Tell the password window to update its stuff
723 }
724 
725