1 /* 2 * Copyright 2005-2009, Haiku. 3 * Distributed under the terms of the MIT License. 4 * 5 * Authors: 6 * Stephan Aßmus <superstippi@gmx.de> 7 * Axel Dörfler, axeld@pinc-software.de 8 * Andrej Spielmann, <andrej.spielmann@seh.ox.ac.uk> 9 */ 10 11 12 #include "DesktopSettings.h" 13 #include "DesktopSettingsPrivate.h" 14 15 #include <Directory.h> 16 #include <File.h> 17 #include <FindDirectory.h> 18 #include <Path.h> 19 20 #include <DefaultColors.h> 21 #include <ServerReadOnlyMemory.h> 22 23 #include "Desktop.h" 24 #include "FontCache.h" 25 #include "FontCacheEntry.h" 26 #include "FontManager.h" 27 #include "GlobalSubpixelSettings.h" 28 #include "ServerConfig.h" 29 30 31 DesktopSettingsPrivate::DesktopSettingsPrivate(server_read_only_memory* shared) 32 : 33 fShared(*shared) 34 { 35 // if the on-disk settings are not complete, the defaults will be kept 36 _SetDefaults(); 37 _Load(); 38 } 39 40 41 DesktopSettingsPrivate::~DesktopSettingsPrivate() 42 { 43 } 44 45 46 void 47 DesktopSettingsPrivate::_SetDefaults() 48 { 49 fPlainFont = *gFontManager->DefaultPlainFont(); 50 fBoldFont = *gFontManager->DefaultBoldFont(); 51 fFixedFont = *gFontManager->DefaultFixedFont(); 52 53 fMouseMode = B_NORMAL_MOUSE; 54 fFocusFollowsMouseMode = B_NORMAL_FOCUS_FOLLOWS_MOUSE; 55 fAcceptFirstClick = false; 56 fShowAllDraggers = true; 57 58 // init scrollbar info 59 fScrollBarInfo.proportional = true; 60 fScrollBarInfo.double_arrows = false; 61 fScrollBarInfo.knob = 1; 62 // look of the knob (R5: (0, 1, 2), 1 = default) 63 fScrollBarInfo.min_knob_size = 15; 64 65 // init menu info 66 strlcpy(fMenuInfo.f_family, fPlainFont.Family(), B_FONT_FAMILY_LENGTH); 67 strlcpy(fMenuInfo.f_style, fPlainFont.Style(), B_FONT_STYLE_LENGTH); 68 fMenuInfo.font_size = fPlainFont.Size(); 69 fMenuInfo.background_color.set_to(216, 216, 216); 70 71 fMenuInfo.separator = 0; 72 // look of the separator (R5: (0, 1, 2), default 0) 73 fMenuInfo.click_to_open = true; // always true 74 fMenuInfo.triggers_always_shown = false; 75 76 fWorkspacesColumns = 2; 77 fWorkspacesRows = 2; 78 79 memcpy(fShared.colors, BPrivate::kDefaultColors, 80 sizeof(rgb_color) * kNumColors); 81 82 gSubpixelAntialiasing = false; 83 gDefaultHintingMode = HINTING_MODE_ON; 84 gSubpixelAverageWeight = 120; 85 gSubpixelOrderingRGB = true; 86 } 87 88 89 status_t 90 DesktopSettingsPrivate::_GetPath(BPath& path) 91 { 92 status_t status = find_directory(B_USER_SETTINGS_DIRECTORY, &path); 93 if (status < B_OK) 94 return status; 95 96 status = path.Append("system/app_server"); 97 if (status < B_OK) 98 return status; 99 100 return create_directory(path.Path(), 0755); 101 } 102 103 104 status_t 105 DesktopSettingsPrivate::_Load() 106 { 107 // TODO: add support for old app_server_settings file as well 108 109 BPath basePath; 110 status_t status = _GetPath(basePath); 111 if (status < B_OK) 112 return status; 113 114 // read workspaces settings 115 116 BPath path(basePath); 117 path.Append("workspaces"); 118 119 BFile file; 120 status = file.SetTo(path.Path(), B_READ_ONLY); 121 if (status == B_OK) { 122 BMessage settings; 123 status = settings.Unflatten(&file); 124 if (status == B_OK) { 125 int32 columns; 126 int32 rows; 127 if (settings.FindInt32("columns", &columns) == B_OK 128 && settings.FindInt32("rows", &rows) == B_OK) { 129 _ValidateWorkspacesLayout(columns, rows); 130 fWorkspacesColumns = columns; 131 fWorkspacesRows = rows; 132 } 133 134 int32 i = 0; 135 while (i < kMaxWorkspaces && settings.FindMessage("workspace", 136 i, &fWorkspaceMessages[i]) == B_OK) { 137 i++; 138 } 139 } 140 } 141 142 // read font settings 143 144 path = basePath; 145 path.Append("fonts"); 146 147 status = file.SetTo(path.Path(), B_READ_ONLY); 148 if (status == B_OK) { 149 BMessage settings; 150 status = settings.Unflatten(&file); 151 if (status == B_OK && gFontManager->Lock()) { 152 const char* family; 153 const char* style; 154 float size; 155 156 if (settings.FindString("plain family", &family) == B_OK 157 && settings.FindString("plain style", &style) == B_OK 158 && settings.FindFloat("plain size", &size) == B_OK) { 159 FontStyle* fontStyle = gFontManager->GetStyle(family, style); 160 fPlainFont.SetStyle(fontStyle); 161 fPlainFont.SetSize(size); 162 } 163 164 if (settings.FindString("bold family", &family) == B_OK 165 && settings.FindString("bold style", &style) == B_OK 166 && settings.FindFloat("bold size", &size) == B_OK) { 167 FontStyle* fontStyle = gFontManager->GetStyle(family, style); 168 fBoldFont.SetStyle(fontStyle); 169 fBoldFont.SetSize(size); 170 } 171 172 if (settings.FindString("fixed family", &family) == B_OK 173 && settings.FindString("fixed style", &style) == B_OK 174 && settings.FindFloat("fixed size", &size) == B_OK) { 175 FontStyle* fontStyle = gFontManager->GetStyle(family, style); 176 if (fontStyle != NULL && fontStyle->IsFixedWidth()) 177 fFixedFont.SetStyle(fontStyle); 178 fFixedFont.SetSize(size); 179 } 180 181 int32 hinting; 182 if (settings.FindInt32("hinting", &hinting) == B_OK) 183 gDefaultHintingMode = hinting; 184 185 gFontManager->Unlock(); 186 } 187 } 188 189 // read mouse settings 190 191 path = basePath; 192 path.Append("mouse"); 193 194 status = file.SetTo(path.Path(), B_READ_ONLY); 195 if (status == B_OK) { 196 BMessage settings; 197 status = settings.Unflatten(&file); 198 if (status == B_OK) { 199 int32 mode; 200 if (settings.FindInt32("mode", &mode) == B_OK) 201 fMouseMode = (mode_mouse)mode; 202 203 int32 focusFollowsMouseMode; 204 if (settings.FindInt32("focus follows mouse mode", 205 &focusFollowsMouseMode) == B_OK) { 206 fFocusFollowsMouseMode 207 = (mode_focus_follows_mouse)focusFollowsMouseMode; 208 } 209 210 bool acceptFirstClick; 211 if (settings.FindBool("accept first click", &acceptFirstClick) 212 == B_OK) { 213 fAcceptFirstClick = acceptFirstClick; 214 } 215 } 216 } 217 218 // read appearance settings 219 220 path = basePath; 221 path.Append("appearance"); 222 223 status = file.SetTo(path.Path(), B_READ_ONLY); 224 if (status == B_OK) { 225 BMessage settings; 226 status = settings.Unflatten(&file); 227 if (status == B_OK) { 228 // menus 229 float fontSize; 230 if (settings.FindFloat("font size", &fontSize) == B_OK) 231 fMenuInfo.font_size = fontSize; 232 233 const char* fontFamily; 234 if (settings.FindString("font family", &fontFamily) == B_OK) 235 strlcpy(fMenuInfo.f_family, fontFamily, B_FONT_FAMILY_LENGTH); 236 237 const char* fontStyle; 238 if (settings.FindString("font style", &fontStyle) == B_OK) 239 strlcpy(fMenuInfo.f_style, fontStyle, B_FONT_STYLE_LENGTH); 240 241 rgb_color bgColor; 242 if (settings.FindInt32("bg color", (int32*)&bgColor) == B_OK) 243 fMenuInfo.background_color = bgColor; 244 245 int32 separator; 246 if (settings.FindInt32("separator", &separator) == B_OK) 247 fMenuInfo.separator = separator; 248 249 bool clickToOpen; 250 if (settings.FindBool("click to open", &clickToOpen) == B_OK) 251 fMenuInfo.click_to_open = clickToOpen; 252 253 bool triggersAlwaysShown; 254 if (settings.FindBool("triggers always shown", &triggersAlwaysShown) 255 == B_OK) { 256 fMenuInfo.triggers_always_shown = triggersAlwaysShown; 257 } 258 259 // scrollbars 260 bool proportional; 261 if (settings.FindBool("proportional", &proportional) == B_OK) 262 fScrollBarInfo.proportional = proportional; 263 264 bool doubleArrows; 265 if (settings.FindBool("double arrows", &doubleArrows) == B_OK) 266 fScrollBarInfo.double_arrows = doubleArrows; 267 268 int32 knob; 269 if (settings.FindInt32("knob", &knob) == B_OK) 270 fScrollBarInfo.knob = knob; 271 272 int32 minKnobSize; 273 if (settings.FindInt32("min knob size", &minKnobSize) == B_OK) 274 fScrollBarInfo.min_knob_size = minKnobSize; 275 276 // subpixel font rendering 277 bool subpix; 278 if (settings.FindBool("subpixel antialiasing", &subpix) == B_OK) 279 gSubpixelAntialiasing = subpix; 280 281 int8 averageWeight; 282 if (settings.FindInt8("subpixel average weight", &averageWeight) 283 == B_OK) { 284 gSubpixelAverageWeight = averageWeight; 285 } 286 287 bool subpixelOrdering; 288 if (settings.FindBool("subpixel ordering", &subpixelOrdering) 289 == B_OK) { 290 gSubpixelOrderingRGB = subpixelOrdering; 291 } 292 293 // colors 294 for (int32 i = 0; i < kNumColors; i++) { 295 char colorName[12]; 296 snprintf(colorName, sizeof(colorName), "color%ld", 297 (int32)index_to_color_which(i)); 298 299 settings.FindInt32(colorName, (int32*)&fShared.colors[i]); 300 } 301 } 302 } 303 304 // read dragger settings 305 306 path = basePath; 307 path.Append("dragger"); 308 309 status = file.SetTo(path.Path(), B_READ_ONLY); 310 if (status == B_OK) { 311 BMessage settings; 312 status = settings.Unflatten(&file); 313 if (status == B_OK) { 314 if (settings.FindBool("show", &fShowAllDraggers) != B_OK) 315 fShowAllDraggers = true; 316 } 317 } 318 319 return B_OK; 320 } 321 322 323 status_t 324 DesktopSettingsPrivate::Save(uint32 mask) 325 { 326 #if TEST_MODE 327 return B_OK; 328 #endif 329 330 BPath basePath; 331 status_t status = _GetPath(basePath); 332 if (status != B_OK) 333 return status; 334 335 if (mask & kWorkspacesSettings) { 336 BPath path(basePath); 337 if (path.Append("workspaces") == B_OK) { 338 BMessage settings('asws'); 339 settings.AddInt32("columns", fWorkspacesColumns); 340 settings.AddInt32("rows", fWorkspacesRows); 341 342 for (int32 i = 0; i < kMaxWorkspaces; i++) { 343 settings.AddMessage("workspace", &fWorkspaceMessages[i]); 344 } 345 346 BFile file; 347 status = file.SetTo(path.Path(), B_CREATE_FILE | B_ERASE_FILE 348 | B_READ_WRITE); 349 if (status == B_OK) { 350 status = settings.Flatten(&file, NULL); 351 } 352 } 353 } 354 355 if (mask & kFontSettings) { 356 BPath path(basePath); 357 if (path.Append("fonts") == B_OK) { 358 BMessage settings('asfn'); 359 360 settings.AddString("plain family", fPlainFont.Family()); 361 settings.AddString("plain style", fPlainFont.Style()); 362 settings.AddFloat("plain size", fPlainFont.Size()); 363 364 settings.AddString("bold family", fBoldFont.Family()); 365 settings.AddString("bold style", fBoldFont.Style()); 366 settings.AddFloat("bold size", fBoldFont.Size()); 367 368 settings.AddString("fixed family", fFixedFont.Family()); 369 settings.AddString("fixed style", fFixedFont.Style()); 370 settings.AddFloat("fixed size", fFixedFont.Size()); 371 372 settings.AddInt32("hinting", gDefaultHintingMode); 373 374 BFile file; 375 status = file.SetTo(path.Path(), B_CREATE_FILE | B_ERASE_FILE 376 | B_READ_WRITE); 377 if (status == B_OK) { 378 status = settings.Flatten(&file, NULL); 379 } 380 } 381 } 382 383 if (mask & kMouseSettings) { 384 BPath path(basePath); 385 if (path.Append("mouse") == B_OK) { 386 BMessage settings('asms'); 387 settings.AddInt32("mode", (int32)fMouseMode); 388 settings.AddInt32("focus follows mouse mode", 389 (int32)fFocusFollowsMouseMode); 390 settings.AddBool("accept first click", fAcceptFirstClick); 391 392 BFile file; 393 status = file.SetTo(path.Path(), B_CREATE_FILE | B_ERASE_FILE 394 | B_READ_WRITE); 395 if (status == B_OK) { 396 status = settings.Flatten(&file, NULL); 397 } 398 } 399 } 400 401 if (mask & kDraggerSettings) { 402 BPath path(basePath); 403 if (path.Append("dragger") == B_OK) { 404 BMessage settings('asdg'); 405 settings.AddBool("show", fShowAllDraggers); 406 407 BFile file; 408 status = file.SetTo(path.Path(), B_CREATE_FILE | B_ERASE_FILE 409 | B_READ_WRITE); 410 if (status == B_OK) { 411 status = settings.Flatten(&file, NULL); 412 } 413 } 414 } 415 416 if (mask & kAppearanceSettings) { 417 BPath path(basePath); 418 if (path.Append("appearance") == B_OK) { 419 BMessage settings('aslk'); 420 settings.AddFloat("font size", fMenuInfo.font_size); 421 settings.AddString("font family", fMenuInfo.f_family); 422 settings.AddString("font style", fMenuInfo.f_style); 423 settings.AddInt32("bg color", 424 (const int32&)fMenuInfo.background_color); 425 settings.AddInt32("separator", fMenuInfo.separator); 426 settings.AddBool("click to open", fMenuInfo.click_to_open); 427 settings.AddBool("triggers always shown", 428 fMenuInfo.triggers_always_shown); 429 430 settings.AddBool("proportional", fScrollBarInfo.proportional); 431 settings.AddBool("double arrows", fScrollBarInfo.double_arrows); 432 settings.AddInt32("knob", fScrollBarInfo.knob); 433 settings.AddInt32("min knob size", fScrollBarInfo.min_knob_size); 434 435 settings.AddBool("subpixel antialiasing", gSubpixelAntialiasing); 436 settings.AddInt8("subpixel average weight", gSubpixelAverageWeight); 437 settings.AddBool("subpixel ordering", gSubpixelOrderingRGB); 438 439 for (int32 i = 0; i < kNumColors; i++) { 440 char colorName[12]; 441 snprintf(colorName, sizeof(colorName), "color%ld", 442 (int32)index_to_color_which(i)); 443 settings.AddInt32(colorName, (const int32&)fShared.colors[i]); 444 } 445 446 BFile file; 447 status = file.SetTo(path.Path(), B_CREATE_FILE | B_ERASE_FILE 448 | B_READ_WRITE); 449 if (status == B_OK) { 450 status = settings.Flatten(&file, NULL); 451 } 452 } 453 } 454 455 return status; 456 } 457 458 459 void 460 DesktopSettingsPrivate::SetDefaultPlainFont(const ServerFont &font) 461 { 462 fPlainFont = font; 463 Save(kFontSettings); 464 } 465 466 467 const ServerFont & 468 DesktopSettingsPrivate::DefaultPlainFont() const 469 { 470 return fPlainFont; 471 } 472 473 474 void 475 DesktopSettingsPrivate::SetDefaultBoldFont(const ServerFont &font) 476 { 477 fBoldFont = font; 478 Save(kFontSettings); 479 } 480 481 482 const ServerFont & 483 DesktopSettingsPrivate::DefaultBoldFont() const 484 { 485 return fBoldFont; 486 } 487 488 489 void 490 DesktopSettingsPrivate::SetDefaultFixedFont(const ServerFont &font) 491 { 492 fFixedFont = font; 493 Save(kFontSettings); 494 } 495 496 497 const ServerFont & 498 DesktopSettingsPrivate::DefaultFixedFont() const 499 { 500 return fFixedFont; 501 } 502 503 504 void 505 DesktopSettingsPrivate::SetScrollBarInfo(const scroll_bar_info& info) 506 { 507 fScrollBarInfo = info; 508 Save(kAppearanceSettings); 509 } 510 511 512 const scroll_bar_info& 513 DesktopSettingsPrivate::ScrollBarInfo() const 514 { 515 return fScrollBarInfo; 516 } 517 518 519 void 520 DesktopSettingsPrivate::SetMenuInfo(const menu_info& info) 521 { 522 fMenuInfo = info; 523 // Also update the ui_color 524 SetUIColor(B_MENU_BACKGROUND_COLOR, info.background_color); 525 // SetUIColor already saves the settings 526 } 527 528 529 const menu_info& 530 DesktopSettingsPrivate::MenuInfo() const 531 { 532 return fMenuInfo; 533 } 534 535 536 void 537 DesktopSettingsPrivate::SetMouseMode(const mode_mouse mode) 538 { 539 fMouseMode = mode; 540 Save(kMouseSettings); 541 } 542 543 544 void 545 DesktopSettingsPrivate::SetFocusFollowsMouseMode(mode_focus_follows_mouse mode) 546 { 547 fFocusFollowsMouseMode = mode; 548 Save(kMouseSettings); 549 } 550 551 552 mode_mouse 553 DesktopSettingsPrivate::MouseMode() const 554 { 555 return fMouseMode; 556 } 557 558 559 mode_focus_follows_mouse 560 DesktopSettingsPrivate::FocusFollowsMouseMode() const 561 { 562 return fFocusFollowsMouseMode; 563 } 564 565 566 void 567 DesktopSettingsPrivate::SetAcceptFirstClick(const bool acceptFirstClick) 568 { 569 fAcceptFirstClick = acceptFirstClick; 570 Save(kMouseSettings); 571 } 572 573 574 bool 575 DesktopSettingsPrivate::AcceptFirstClick() const 576 { 577 return fAcceptFirstClick; 578 } 579 580 581 bool 582 DesktopSettingsPrivate::FocusFollowsMouse() const 583 { 584 return MouseMode() == B_FOCUS_FOLLOWS_MOUSE; 585 } 586 587 588 void 589 DesktopSettingsPrivate::SetShowAllDraggers(bool show) 590 { 591 fShowAllDraggers = show; 592 Save(kDraggerSettings); 593 } 594 595 596 bool 597 DesktopSettingsPrivate::ShowAllDraggers() const 598 { 599 return fShowAllDraggers; 600 } 601 602 603 void 604 DesktopSettingsPrivate::SetWorkspacesLayout(int32 columns, int32 rows) 605 { 606 _ValidateWorkspacesLayout(columns, rows); 607 fWorkspacesColumns = columns; 608 fWorkspacesRows = rows; 609 610 Save(kWorkspacesSettings); 611 } 612 613 614 int32 615 DesktopSettingsPrivate::WorkspacesCount() const 616 { 617 return fWorkspacesColumns * fWorkspacesRows; 618 } 619 620 621 int32 622 DesktopSettingsPrivate::WorkspacesColumns() const 623 { 624 return fWorkspacesColumns; 625 } 626 627 628 int32 629 DesktopSettingsPrivate::WorkspacesRows() const 630 { 631 return fWorkspacesRows; 632 } 633 634 635 void 636 DesktopSettingsPrivate::SetWorkspacesMessage(int32 index, BMessage& message) 637 { 638 if (index < 0 || index >= kMaxWorkspaces) 639 return; 640 641 fWorkspaceMessages[index] = message; 642 } 643 644 645 const BMessage* 646 DesktopSettingsPrivate::WorkspacesMessage(int32 index) const 647 { 648 if (index < 0 || index >= kMaxWorkspaces) 649 return NULL; 650 651 return &fWorkspaceMessages[index]; 652 } 653 654 655 void 656 DesktopSettingsPrivate::SetUIColor(color_which which, const rgb_color color) 657 { 658 // 659 int32 index = color_which_to_index(which); 660 if (index < 0 || index >= kNumColors) 661 return; 662 fShared.colors[index] = color; 663 // TODO: deprecate the background_color member of the menu_info struct, 664 // otherwise we have to keep this duplication... 665 if (which == B_MENU_BACKGROUND_COLOR) 666 fMenuInfo.background_color = color; 667 Save(kAppearanceSettings); 668 } 669 670 671 rgb_color 672 DesktopSettingsPrivate::UIColor(color_which which) const 673 { 674 static const rgb_color invalidColor = {0, 0, 0, 0}; 675 int32 index = color_which_to_index(which); 676 if (index < 0 || index >= kNumColors) 677 return invalidColor; 678 return fShared.colors[index]; 679 } 680 681 682 void 683 DesktopSettingsPrivate::SetSubpixelAntialiasing(bool subpix) 684 { 685 gSubpixelAntialiasing = subpix; 686 Save(kAppearanceSettings); 687 } 688 689 690 bool 691 DesktopSettingsPrivate::SubpixelAntialiasing() const 692 { 693 return gSubpixelAntialiasing; 694 } 695 696 697 void 698 DesktopSettingsPrivate::SetHinting(uint8 hinting) 699 { 700 gDefaultHintingMode = hinting; 701 Save(kFontSettings); 702 } 703 704 705 uint8 706 DesktopSettingsPrivate::Hinting() const 707 { 708 return gDefaultHintingMode; 709 } 710 711 712 void 713 DesktopSettingsPrivate::SetSubpixelAverageWeight(uint8 averageWeight) 714 { 715 gSubpixelAverageWeight = averageWeight; 716 Save(kAppearanceSettings); 717 } 718 719 720 uint8 721 DesktopSettingsPrivate::SubpixelAverageWeight() const 722 { 723 return gSubpixelAverageWeight; 724 } 725 726 727 void 728 DesktopSettingsPrivate::SetSubpixelOrderingRegular(bool subpixelOrdering) 729 { 730 gSubpixelOrderingRGB = subpixelOrdering; 731 Save(kAppearanceSettings); 732 } 733 734 735 bool 736 DesktopSettingsPrivate::IsSubpixelOrderingRegular() const 737 { 738 return gSubpixelOrderingRGB; 739 } 740 741 742 void 743 DesktopSettingsPrivate::_ValidateWorkspacesLayout(int32& columns, 744 int32& rows) const 745 { 746 if (columns < 1) 747 columns = 1; 748 if (rows < 1) 749 rows = 1; 750 751 if (columns * rows > kMaxWorkspaces) { 752 // Revert to defaults in case of invalid settings 753 columns = 2; 754 rows = 2; 755 } 756 } 757 758 759 // #pragma mark - read access 760 761 762 DesktopSettings::DesktopSettings(Desktop* desktop) 763 : 764 fSettings(desktop->fSettings) 765 { 766 767 } 768 769 770 void 771 DesktopSettings::GetDefaultPlainFont(ServerFont &font) const 772 { 773 font = fSettings->DefaultPlainFont(); 774 } 775 776 777 void 778 DesktopSettings::GetDefaultBoldFont(ServerFont &font) const 779 { 780 font = fSettings->DefaultBoldFont(); 781 } 782 783 784 void 785 DesktopSettings::GetDefaultFixedFont(ServerFont &font) const 786 { 787 font = fSettings->DefaultFixedFont(); 788 } 789 790 791 void 792 DesktopSettings::GetScrollBarInfo(scroll_bar_info& info) const 793 { 794 info = fSettings->ScrollBarInfo(); 795 } 796 797 798 void 799 DesktopSettings::GetMenuInfo(menu_info& info) const 800 { 801 info = fSettings->MenuInfo(); 802 } 803 804 805 mode_mouse 806 DesktopSettings::MouseMode() const 807 { 808 return fSettings->MouseMode(); 809 } 810 811 812 mode_focus_follows_mouse 813 DesktopSettings::FocusFollowsMouseMode() const 814 { 815 return fSettings->FocusFollowsMouseMode(); 816 } 817 818 819 bool 820 DesktopSettings::FocusFollowsMouse() const 821 { 822 return fSettings->FocusFollowsMouse(); 823 } 824 825 826 bool 827 DesktopSettings::AcceptFirstClick() const 828 { 829 return fSettings->AcceptFirstClick(); 830 } 831 832 833 bool 834 DesktopSettings::ShowAllDraggers() const 835 { 836 return fSettings->ShowAllDraggers(); 837 } 838 839 840 int32 841 DesktopSettings::WorkspacesCount() const 842 { 843 return fSettings->WorkspacesCount(); 844 } 845 846 847 int32 848 DesktopSettings::WorkspacesColumns() const 849 { 850 return fSettings->WorkspacesColumns(); 851 } 852 853 854 int32 855 DesktopSettings::WorkspacesRows() const 856 { 857 return fSettings->WorkspacesRows(); 858 } 859 860 861 const BMessage* 862 DesktopSettings::WorkspacesMessage(int32 index) const 863 { 864 return fSettings->WorkspacesMessage(index); 865 } 866 867 868 rgb_color 869 DesktopSettings::UIColor(color_which which) const 870 { 871 return fSettings->UIColor(which); 872 } 873 874 875 bool 876 DesktopSettings::SubpixelAntialiasing() const 877 { 878 return fSettings->SubpixelAntialiasing(); 879 } 880 881 882 uint8 883 DesktopSettings::Hinting() const 884 { 885 return fSettings->Hinting(); 886 } 887 888 889 uint8 890 DesktopSettings::SubpixelAverageWeight() const 891 { 892 return fSettings->SubpixelAverageWeight(); 893 } 894 895 896 bool 897 DesktopSettings::IsSubpixelOrderingRegular() const 898 { 899 // True corresponds to RGB, false means BGR 900 return fSettings->IsSubpixelOrderingRegular(); 901 } 902 903 // #pragma mark - write access 904 905 906 LockedDesktopSettings::LockedDesktopSettings(Desktop* desktop) 907 : 908 DesktopSettings(desktop), 909 fDesktop(desktop) 910 { 911 #if DEBUG 912 if (desktop->fWindowLock.IsReadLocked()) 913 debugger("desktop read locked when trying to change settings"); 914 #endif 915 916 fDesktop->LockAllWindows(); 917 } 918 919 920 LockedDesktopSettings::~LockedDesktopSettings() 921 { 922 fDesktop->UnlockAllWindows(); 923 } 924 925 926 void 927 LockedDesktopSettings::SetDefaultPlainFont(const ServerFont &font) 928 { 929 fSettings->SetDefaultPlainFont(font); 930 } 931 932 933 void 934 LockedDesktopSettings::SetDefaultBoldFont(const ServerFont &font) 935 { 936 fSettings->SetDefaultBoldFont(font); 937 fDesktop->BroadcastToAllWindows(AS_SYSTEM_FONT_CHANGED); 938 } 939 940 941 void 942 LockedDesktopSettings::SetDefaultFixedFont(const ServerFont &font) 943 { 944 fSettings->SetDefaultFixedFont(font); 945 } 946 947 948 void 949 LockedDesktopSettings::SetScrollBarInfo(const scroll_bar_info& info) 950 { 951 fSettings->SetScrollBarInfo(info); 952 } 953 954 955 void 956 LockedDesktopSettings::SetMenuInfo(const menu_info& info) 957 { 958 fSettings->SetMenuInfo(info); 959 } 960 961 962 void 963 LockedDesktopSettings::SetMouseMode(const mode_mouse mode) 964 { 965 fSettings->SetMouseMode(mode); 966 } 967 968 969 void 970 LockedDesktopSettings::SetFocusFollowsMouseMode(mode_focus_follows_mouse mode) 971 { 972 fSettings->SetFocusFollowsMouseMode(mode); 973 } 974 975 976 void 977 LockedDesktopSettings::SetAcceptFirstClick(const bool acceptFirstClick) 978 { 979 fSettings->SetAcceptFirstClick(acceptFirstClick); 980 } 981 982 983 void 984 LockedDesktopSettings::SetShowAllDraggers(bool show) 985 { 986 fSettings->SetShowAllDraggers(show); 987 } 988 989 990 void 991 LockedDesktopSettings::SetUIColor(color_which which, const rgb_color color) 992 { 993 fSettings->SetUIColor(which, color); 994 } 995 996 997 void 998 LockedDesktopSettings::SetSubpixelAntialiasing(bool subpix) 999 { 1000 fSettings->SetSubpixelAntialiasing(subpix); 1001 } 1002 1003 1004 void 1005 LockedDesktopSettings::SetHinting(uint8 hinting) 1006 { 1007 fSettings->SetHinting(hinting); 1008 } 1009 1010 1011 void 1012 LockedDesktopSettings::SetSubpixelAverageWeight(uint8 averageWeight) 1013 { 1014 fSettings->SetSubpixelAverageWeight(averageWeight); 1015 } 1016 1017 void 1018 LockedDesktopSettings::SetSubpixelOrderingRegular(bool subpixelOrdering) 1019 { 1020 fSettings->SetSubpixelOrderingRegular(subpixelOrdering); 1021 } 1022 1023