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