status_t TouchpadPref::LoadSettings() { BPath path; status_t status = GetSettingsPath(path); if (status != B_OK) return status; BFile settingsFile(path.Path(), B_READ_ONLY); status = settingsFile.InitCheck(); if (status != B_OK) return status; if (settingsFile.Read(&fSettings, sizeof(touchpad_settings)) != sizeof(touchpad_settings)) { LOG("failed to load settings\n"); return B_ERROR; } if (settingsFile.Read(&fWindowPosition, sizeof(BPoint)) != sizeof(BPoint)) { LOG("failed to load settings\n"); return B_ERROR; } return B_OK; }
// called whenever global preferences change or a file is // added or removed from gFileHistory (in order to keep // the list of recently opened documents in sync) bool Save() { // don't save preferences without the proper permission if (!HasPermission(Perm_SavePreferences)) return false; /* mark currently shown files as visible */ for (size_t i = 0; i < gWindows.Count(); i++) { UpdateCurrentFileDisplayStateForWin(gWindows.At(i)); } // remove entries which should (no longer) be remembered gFileHistory.Purge(!gGlobalPrefs->rememberStatePerDocument); // update display mode and zoom fields from internal values str::ReplacePtr(&gGlobalPrefs->defaultDisplayMode, conv::FromDisplayMode(gGlobalPrefs->defaultDisplayModeEnum)); conv::FromZoom(&gGlobalPrefs->defaultZoom, gGlobalPrefs->defaultZoomFloat); ScopedMem<WCHAR> path(GetSettingsPath()); CrashIf(!path); if (!path) return false; size_t prevPrefsDataSize; ScopedMem<char> prevPrefsData(file::ReadAll(path, &prevPrefsDataSize)); if (!gGlobalPrefs->rememberStatePerDocument || !gGlobalPrefs->rememberOpenedFiles) { for (DisplayState **ds = gGlobalPrefs->fileStates->IterStart(); ds; ds = gGlobalPrefs->fileStates->IterNext()) { (*ds)->useDefaultState = true; } // prevent unnecessary settings from being written out uint16_t fieldCount = 0; while (++fieldCount <= dimof(gFileStateFields)) { // count the number of fields up to and including useDefaultState if (gFileStateFields[fieldCount - 1].offset == offsetof(FileState, useDefaultState)) break; } // restore the correct fieldCount ASAP after serialization gFileStateInfo.fieldCount = fieldCount; } size_t prefsDataSize; ScopedMem<char> prefsData(SerializeStruct(&gGlobalPrefsInfo, gGlobalPrefs, prevPrefsData, &prefsDataSize)); if (!gGlobalPrefs->rememberStatePerDocument || !gGlobalPrefs->rememberOpenedFiles) gFileStateInfo.fieldCount = dimof(gFileStateFields); CrashIf(!prefsData || 0 == prefsDataSize); if (!prefsData || 0 == prefsDataSize) return false; // only save if anything's changed at all if (prevPrefsDataSize == prefsDataSize && str::Eq(prefsData, prevPrefsData)) return true; FileTransaction trans; bool ok = trans.WriteAll(path, prefsData, prefsDataSize) && trans.Commit(); if (!ok) return false; gGlobalPrefs->lastPrefUpdate = file::GetModificationTime(path); return true; }
status_t TouchpadPref::SaveSettings() { BPath path; status_t status = GetSettingsPath(path); if (status != B_OK) return status; BFile settingsFile(path.Path(), B_READ_WRITE | B_CREATE_FILE); status = settingsFile.InitCheck(); if (status != B_OK) return status; if (settingsFile.Write(&fSettings, sizeof(touchpad_settings)) != sizeof(touchpad_settings)) { LOG("can't save settings\n"); return B_ERROR; } if (settingsFile.Write(&fWindowPosition, sizeof(BPoint)) != sizeof(BPoint)) { LOG("can't save window position\n"); return B_ERROR; } return B_OK; }
void MainWindowController::QuitRequested() { BPath settingsPath = GetSettingsPath(); BEntry appSettingsPath(settingsPath.Path()); _appSettings->SetFilePath(_makeFileLocation); AppSettings::Save(_appSettings, appSettingsPath); }
void RegisterForFileChanges() { if (!HasPermission(Perm_SavePreferences)) return; CrashIf(gWatchedSettingsFile); // only call me once ScopedMem<WCHAR> path(GetSettingsPath()); gWatchedSettingsFile = FileWatcherSubscribe(path, new SettingsFileObserver()); }
/* Caller needs to prefs::CleanUp() */ bool Load() { CrashIf(gGlobalPrefs); ScopedMem<WCHAR> path(GetSettingsPath()); ScopedMem<char> prefsData(file::ReadAll(path, NULL)); gGlobalPrefs = (GlobalPrefs *)DeserializeStruct(&gGlobalPrefsInfo, prefsData); CrashAlwaysIf(!gGlobalPrefs); #ifdef DISABLE_EBOOK_UI if (!file::Exists(path)) gGlobalPrefs->ebookUI.useFixedPageUI = gGlobalPrefs->chmUI.useFixedPageUI = true; #endif #ifdef DISABLE_TABS if (!file::Exists(path)) gGlobalPrefs->useTabs = false; #endif if (!gGlobalPrefs->uiLanguage || !trans::ValidateLangCode(gGlobalPrefs->uiLanguage)) { // guess the ui language on first start str::ReplacePtr(&gGlobalPrefs->uiLanguage, trans::DetectUserLang()); } gGlobalPrefs->lastPrefUpdate = file::GetModificationTime(path); gGlobalPrefs->defaultDisplayModeEnum = conv::ToDisplayMode(gGlobalPrefs->defaultDisplayMode, DM_AUTOMATIC); gGlobalPrefs->defaultZoomFloat = conv::ToZoom(gGlobalPrefs->defaultZoom, ZOOM_ACTUAL_SIZE); CrashIf(!IsValidZoom(gGlobalPrefs->defaultZoomFloat)); int weekDiff = GetWeekCount() - gGlobalPrefs->openCountWeek; gGlobalPrefs->openCountWeek = GetWeekCount(); if (weekDiff > 0) { // "age" openCount statistics (cut in in half after every week) for (DisplayState **ds = gGlobalPrefs->fileStates->IterStart(); ds; ds = gGlobalPrefs->fileStates->IterNext()) { (*ds)->openCount >>= weekDiff; } } // make sure that zoom levels are in the order expected by DisplayModel gGlobalPrefs->zoomLevels->Sort(cmpFloat); while (gGlobalPrefs->zoomLevels->Count() > 0 && gGlobalPrefs->zoomLevels->At(0) < ZOOM_MIN) { gGlobalPrefs->zoomLevels->PopAt(0); } while (gGlobalPrefs->zoomLevels->Count() > 0 && gGlobalPrefs->zoomLevels->Last() > ZOOM_MAX) { gGlobalPrefs->zoomLevels->Pop(); } // TODO: verify that all states have a non-NULL file path? gFileHistory.UpdateStatesSource(gGlobalPrefs->fileStates); SetDefaultEbookFont(gGlobalPrefs->ebookUI.fontName, gGlobalPrefs->ebookUI.fontSize); if (!file::Exists(path)) Save(); return true; }
// refresh the preferences when a different SumatraPDF process saves them // or if they are edited by the user using a text editor bool Reload() { ScopedMem<WCHAR> path(GetSettingsPath()); if (!file::Exists(path)) return false; // make sure that the settings file is readable - else wait // a short while to prevent accidental dataloss int tryAgainCount = 5; HANDLE h = file::OpenReadOnly(path); while (INVALID_HANDLE_VALUE == h && tryAgainCount-- > 0) { Sleep(200); h = file::OpenReadOnly(path); } if (INVALID_HANDLE_VALUE == h) { // prefer not reloading to resetting all settings return false; } ScopedHandle hScope(h); FILETIME time = file::GetModificationTime(path); if (FileTimeEq(time, gGlobalPrefs->lastPrefUpdate)) return true; ScopedMem<char> uiLanguage(str::Dup(gGlobalPrefs->uiLanguage)); bool showToolbar = gGlobalPrefs->showToolbar; bool invertColors = gGlobalPrefs->fixedPageUI.invertColors; gFileHistory.UpdateStatesSource(NULL); CleanUp(); bool ok = Load(); CrashAlwaysIf(!ok || !gGlobalPrefs); gGlobalPrefs->fixedPageUI.invertColors = invertColors; // TODO: about window doesn't have to be at position 0 if (gWindows.Count() > 0 && gWindows.At(0)->IsAboutWindow()) { gWindows.At(0)->DeleteInfotip(); gWindows.At(0)->staticLinks.Reset(); gWindows.At(0)->RedrawAll(true); } if (!str::Eq(uiLanguage, gGlobalPrefs->uiLanguage)) SetCurrentLanguageAndRefreshUi(gGlobalPrefs->uiLanguage); if (gGlobalPrefs->showToolbar != showToolbar) ShowOrHideToolbarGlobally(); UpdateDocumentColors(); UpdateFavoritesTreeForAllWindows(); return true; }
void MainWindowController::Init() { BPath settingsPath = GetSettingsPath(); BEntry appSettingsPath(settingsPath.Path()); if (!appSettingsPath.Exists()) { _appSettings = std::shared_ptr<AppSettings>(new AppSettings); std::cout << "New app settings" << std::endl; return; } std::cout << "Load app settings" << std::endl; _appSettings = AppSettings::Load(appSettingsPath); BEntry makeFilePath = _appSettings->FilePath(); if (makeFilePath.Exists()) SetMakeFileLocation(makeFilePath); }