WorkspacesSettings::WorkspacesSettings() : fAutoRaising(false), fAlwaysOnTop(false), fHasTitle(true), fHasBorder(true), fSwitchOnWheel(false), fLoaded(false) { UpdateScreenFrame(); BScreen screen; BFile file; if (_Open(file, B_READ_ONLY) == B_OK) { BMessage settings; if (settings.Unflatten(&file) == B_OK) { if (settings.FindRect("window", &fWindowFrame) == B_OK && settings.FindRect("screen", &fScreenFrame) == B_OK) fLoaded = true; settings.FindBool("auto-raise", &fAutoRaising); settings.FindBool("always on top", &fAlwaysOnTop); if (settings.FindBool("has title", &fHasTitle) != B_OK) fHasTitle = true; if (settings.FindBool("has border", &fHasBorder) != B_OK) fHasBorder = true; if (settings.FindBool("switch on wheel", &fSwitchOnWheel) != B_OK) fSwitchOnWheel = false; } } else { // try reading BeOS compatible settings BPath path; if (find_directory(B_USER_SETTINGS_DIRECTORY, &path) == B_OK) { path.Append(kOldSettingFile); BFile file(path.Path(), B_READ_ONLY); if (file.InitCheck() == B_OK && file.Read(&fWindowFrame, sizeof(BRect)) == sizeof(BRect)) { // we now also store the frame of the screen to know // in which context the window frame has been chosen BRect frame; if (file.Read(&frame, sizeof(BRect)) == sizeof(BRect)) fScreenFrame = frame; else fScreenFrame = screen.Frame(); fLoaded = true; } } } if (fLoaded) { // if the current screen frame is different from the one // just loaded, we need to alter the window frame accordingly if (fScreenFrame != screen.Frame()) UpdateFramesForScreen(screen.Frame()); } }
WorkspacesSettings::WorkspacesSettings() : fAutoRaising(false), fAlwaysOnTop(false), fHasTitle(true), fHasBorder(true) { UpdateScreenFrame(); bool loaded = false; BScreen screen; BFile file; if (_Open(file, B_READ_ONLY) == B_OK) { BMessage settings; if (settings.Unflatten(&file) == B_OK) { if (settings.FindRect("window", &fWindowFrame) == B_OK && settings.FindRect("screen", &fScreenFrame) == B_OK) loaded = true; settings.FindBool("auto-raise", &fAutoRaising); settings.FindBool("always on top", &fAlwaysOnTop); if (settings.FindBool("has title", &fHasTitle) != B_OK) fHasTitle = true; if (settings.FindBool("has border", &fHasBorder) != B_OK) fHasBorder = true; } } else { // try reading BeOS compatible settings BPath path; if (find_directory(B_USER_SETTINGS_DIRECTORY, &path) == B_OK) { path.Append(kOldSettingFile); BFile file(path.Path(), B_READ_ONLY); if (file.InitCheck() == B_OK && file.Read(&fWindowFrame, sizeof(BRect)) == sizeof(BRect)) { // we now also store the frame of the screen to know // in which context the window frame has been chosen BRect frame; if (file.Read(&frame, sizeof(BRect)) == sizeof(BRect)) fScreenFrame = frame; else fScreenFrame = screen.Frame(); loaded = true; } } } if (loaded) { // if the current screen frame is different from the one // just loaded, we need to alter the window frame accordingly if (fScreenFrame != screen.Frame()) UpdateFramesForScreen(screen.Frame()); } if (!loaded || !(screen.Frame().right + 5 >= fWindowFrame.right && screen.Frame().bottom + 5 >= fWindowFrame.bottom && screen.Frame().left - 5 <= fWindowFrame.left && screen.Frame().top - 5 <= fWindowFrame.top)) { // set to some usable defaults float screenWidth = screen.Frame().Width(); float screenHeight = screen.Frame().Height(); float aspectRatio = screenWidth / screenHeight; uint32 columns, rows; BPrivate::get_workspaces_layout(&columns, &rows); // default size of ~1/10 of screen width float workspaceWidth = screenWidth / 10; float workspaceHeight = workspaceWidth / aspectRatio; float width = floor(workspaceWidth * columns); float height = floor(workspaceHeight * rows); float tabHeight = 20; // TODO: find tabHeight without being a window // shrink to fit more while (width + 2 * kScreenBorderOffset > screenWidth || height + 2 * kScreenBorderOffset + tabHeight > screenHeight) { width = floor(0.95 * width); height = floor(0.95 * height); } fWindowFrame = fScreenFrame; fWindowFrame.OffsetBy(-kScreenBorderOffset, -kScreenBorderOffset); fWindowFrame.left = fWindowFrame.right - width; fWindowFrame.top = fWindowFrame.bottom - height; } }