void CPVRGUIInfo::Process(void) { unsigned int iLoop = 0; int toggleInterval = CServiceBroker::GetSettingsComponent()->GetAdvancedSettings()->m_iPVRInfoToggleInterval / 1000; /* updated on request */ CServiceBroker::GetPVRManager().RegisterObserver(this); UpdateTimersCache(); /* update the backend cache once initially */ m_updateBackendCacheRequested = true; while (!g_application.m_bStop && !m_bStop) { if (!m_bRegistered) { CGUIComponent* gui = CServiceBroker::GetGUI(); if (gui) { gui->GetInfoManager().RegisterInfoProvider(this); m_bRegistered = true; } } if (!m_bStop) UpdateQualityData(); Sleep(0); if (!m_bStop) UpdateDescrambleData(); Sleep(0); if (!m_bStop) UpdateMisc(); Sleep(0); if (!m_bStop) UpdateTimeshiftData(); Sleep(0); if (!m_bStop) UpdateTimersToggle(); Sleep(0); if (!m_bStop) UpdateNextTimer(); Sleep(0); // Update the backend cache every toggleInterval seconds if (!m_bStop && iLoop % toggleInterval == 0) UpdateBackendCache(); if (++iLoop == 1000) iLoop = 0; if (!m_bStop) Sleep(500); } }
void CPVRGUIInfo::Stop(void) { StopThread(); CServiceBroker::GetPVRManager().UnregisterObserver(this); CGUIComponent* gui = CServiceBroker::GetGUI(); if (gui) { gui->GetInfoManager().UnregisterInfoProvider(this); m_bRegistered = false; } }
bool CProfilesManager::DeleteProfile(size_t index) { CSingleLock lock(m_critical); const CProfile *profile = GetProfile(index); if (profile == NULL) return false; CGUIDialogYesNo* dlgYesNo = CServiceBroker::GetGUI()->GetWindowManager().GetWindow<CGUIDialogYesNo>(WINDOW_DIALOG_YES_NO); if (dlgYesNo == NULL) return false; std::string str = g_localizeStrings.Get(13201); dlgYesNo->SetHeading(CVariant{13200}); dlgYesNo->SetLine(0, CVariant{StringUtils::Format(str.c_str(), profile->getName().c_str())}); dlgYesNo->SetLine(1, CVariant{""}); dlgYesNo->SetLine(2, CVariant{""}); dlgYesNo->Open(); if (!dlgYesNo->IsConfirmed()) return false; // fall back to master profile if necessary if ((int)index == m_autoLoginProfile) m_autoLoginProfile = 0; // delete profile std::string strDirectory = profile->getDirectory(); m_profiles.erase(m_profiles.begin() + index); // fall back to master profile if necessary if (index == m_currentProfile) { LoadProfile(0); m_settings.Save(); } CFileItemPtr item = CFileItemPtr(new CFileItem(URIUtils::AddFileToFolder(GetUserDataFolder(), strDirectory))); item->SetPath(URIUtils::AddFileToFolder(GetUserDataFolder(), strDirectory + "/")); item->m_bIsFolder = true; item->Select(true); CGUIComponent *gui = CServiceBroker::GetGUI(); if (gui && gui->ConfirmDelete(item->GetPath())) CFileUtils::DeleteItem(item); return Save(); }
void CMediaManager::AddAutoSource(const CMediaSource &share, bool bAutorun) { CMediaSourceSettings::GetInstance().AddShare("files", share); CMediaSourceSettings::GetInstance().AddShare("video", share); CMediaSourceSettings::GetInstance().AddShare("pictures", share); CMediaSourceSettings::GetInstance().AddShare("music", share); CMediaSourceSettings::GetInstance().AddShare("programs", share); CGUIMessage msg(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_UPDATE_SOURCES); CGUIComponent *gui = CServiceBroker::GetGUI(); if (gui) gui->GetWindowManager().SendThreadMessage( msg ); #ifdef HAS_DVD_DRIVE if(bAutorun) MEDIA_DETECT::CAutorun::ExecuteAutorun(share.strPath); #endif }
void CWinSystemRpiGLESContext::PresentRenderImpl(bool rendered) { CGUIComponent *gui = CServiceBroker::GetGUI(); if (gui) CWinSystemRpi::SetVisible(gui->GetWindowManager().HasVisibleControls() || g_application.GetAppPlayer().IsRenderingGuiLayer()); if (m_delayDispReset && m_dispResetTimer.IsTimePast()) { m_delayDispReset = false; CSingleLock lock(m_resourceSection); // tell any shared resources for (std::vector<IDispResource *>::iterator i = m_resources.begin(); i != m_resources.end(); ++i) (*i)->OnResetDisplay(); } if (!rendered) return; if (!m_pGLContext.TrySwapBuffers()) { CEGLUtils::LogError("eglSwapBuffers failed"); throw std::runtime_error("eglSwapBuffers failed"); } }
void CGraphicContext::SetVideoResolutionInternal(RESOLUTION res, bool forceUpdate) { RESOLUTION lastRes = m_Resolution; // If the user asked us to guess, go with desktop if (!IsValidResolution(res)) { res = RES_DESKTOP; } // If we are switching to the same resolution and same window/full-screen, no need to do anything if (!forceUpdate && res == lastRes && m_bFullScreenRoot == CServiceBroker::GetSettingsComponent()->GetAdvancedSettings()->m_fullScreen) { return; } if (res >= RES_DESKTOP) { CServiceBroker::GetSettingsComponent()->GetAdvancedSettings()->m_fullScreen = true; m_bFullScreenRoot = true; } else { CServiceBroker::GetSettingsComponent()->GetAdvancedSettings()->m_fullScreen = false; m_bFullScreenRoot = false; } CSingleLock lock(*this); // FIXME Wayland windowing needs some way to "deny" resolution updates since what Kodi // requests might not get actually set by the compositor. // So in theory, m_iScreenWidth etc. would not need to be updated at all before the // change is confirmed. // But other windowing code expects these variables to be already set when // SetFullScreen() is called, so set them anyway and remember the old values. int origScreenWidth = m_iScreenWidth; int origScreenHeight = m_iScreenHeight; float origFPSOverride = m_fFPSOverride; UpdateInternalStateWithResolution(res); RESOLUTION_INFO info_org = CDisplaySettings::GetInstance().GetResolutionInfo(res); bool switched = false; if (CServiceBroker::GetSettingsComponent()->GetAdvancedSettings()->m_fullScreen) { #if defined (TARGET_DARWIN) || defined (TARGET_WINDOWS) bool blankOtherDisplays = CServiceBroker::GetSettingsComponent()->GetSettings()->GetBool(CSettings::SETTING_VIDEOSCREEN_BLANKDISPLAYS); switched = CServiceBroker::GetWinSystem()->SetFullScreen(true, info_org, blankOtherDisplays); #else switched = CServiceBroker::GetWinSystem()->SetFullScreen(true, info_org, false); #endif } else if (lastRes >= RES_DESKTOP ) switched = CServiceBroker::GetWinSystem()->SetFullScreen(false, info_org, false); else switched = CServiceBroker::GetWinSystem()->ResizeWindow(info_org.iWidth, info_org.iHeight, -1, -1); if (switched) { m_scissors.SetRect(0, 0, (float)m_iScreenWidth, (float)m_iScreenHeight); // make sure all stereo stuff are correctly setup SetStereoView(RENDER_STEREO_VIEW_OFF); // update anyone that relies on sizing information CServiceBroker::GetInputManager().SetMouseResolution(info_org.iWidth, info_org.iHeight, 1, 1); CGUIComponent *gui = CServiceBroker::GetGUI(); if (gui) gui->GetWindowManager().SendMessage(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_WINDOW_RESIZE); } else { // Reset old state m_iScreenWidth = origScreenWidth; m_iScreenHeight = origScreenHeight; m_fFPSOverride = origFPSOverride; if (IsValidResolution(lastRes)) { m_Resolution = lastRes; } else { // FIXME Resolution has become invalid // This happens e.g. when switching monitors and the new monitor has fewer // resolutions than the old one. Fall back to RES_DESKTOP and hope that // the real resolution is set soon. // Again, must be fixed as part of a greater refactor. m_Resolution = RES_DESKTOP; } } }
bool CProfilesManager::LoadProfile(size_t index) { CSingleLock lock(m_critical); // check if the index is valid or not if (index >= m_profiles.size()) return false; // check if the profile is already active if (m_currentProfile == index) return true; // save any settings of the currently used skin but only if the (master) // profile hasn't just been loaded as a temporary profile for login if (g_SkinInfo != nullptr && !m_profileLoadedForLogin) g_SkinInfo->SaveSettings(); // unload any old settings CServiceBroker::GetSettings().Unload(); SetCurrentProfileId(index); m_profileLoadedForLogin = false; // load the new settings if (!CServiceBroker::GetSettings().Load()) { CLog::Log(LOGFATAL, "CProfilesManager: unable to load settings for profile \"%s\"", m_profiles.at(index).getName().c_str()); return false; } CServiceBroker::GetSettings().SetLoaded(); CreateProfileFolders(); CServiceBroker::GetDatabaseManager().Initialize(); CServiceBroker::GetInputManager().LoadKeymaps(); CServiceBroker::GetInputManager().SetMouseEnabled(CServiceBroker::GetSettings().GetBool(CSettings::SETTING_INPUT_ENABLEMOUSE)); CGUIComponent* gui = CServiceBroker::GetGUI(); if (gui) { CGUIInfoManager& infoMgr = gui->GetInfoManager(); infoMgr.ResetCache(); infoMgr.GetInfoProviders().GetGUIControlsInfoProvider().ResetContainerMovingCache(); infoMgr.GetInfoProviders().GetLibraryInfoProvider().ResetLibraryBools(); } if (m_currentProfile != 0) { CXBMCTinyXML doc; if (doc.LoadFile(URIUtils::AddFileToFolder(GetUserDataFolder(), "guisettings.xml"))) { CServiceBroker::GetSettings().LoadSetting(doc.RootElement(), CSettings::SETTING_MASTERLOCK_MAXRETRIES); CServiceBroker::GetSettings().LoadSetting(doc.RootElement(), CSettings::SETTING_MASTERLOCK_STARTUPLOCK); } } CPasswordManager::GetInstance().Clear(); // to set labels - shares are reloaded #if !defined(TARGET_WINDOWS) && defined(HAS_DVD_DRIVE) MEDIA_DETECT::CDetectDVDMedia::UpdateState(); #endif // init windows CGUIMessage msg(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_WINDOW_RESET); CServiceBroker::GetGUI()->GetWindowManager().SendMessage(msg); CUtil::DeleteDirectoryCache(); g_directoryCache.Clear(); return true; }
bool CGUIWindowMusicNav::OnContextButton(int itemNumber, CONTEXT_BUTTON button) { CFileItemPtr item; if (itemNumber >= 0 && itemNumber < m_vecItems->Size()) item = m_vecItems->Get(itemNumber); switch (button) { case CONTEXT_BUTTON_INFO: { if (!item->IsVideoDb()) return CGUIWindowMusicBase::OnContextButton(itemNumber,button); // music videos - artists if (StringUtils::StartsWithNoCase(item->GetPath(), "videodb://musicvideos/artists/")) { long idArtist = m_musicdatabase.GetArtistByName(item->GetLabel()); if (idArtist == -1) return false; std::string path = StringUtils::Format("musicdb://artists/%ld/", idArtist); CArtist artist; m_musicdatabase.GetArtist(idArtist, artist, false); *item = CFileItem(artist); item->SetPath(path); CGUIWindowMusicBase::OnContextButton(itemNumber,button); Refresh(); m_viewControl.SetSelectedItem(itemNumber); return true; } // music videos - albums if (StringUtils::StartsWithNoCase(item->GetPath(), "videodb://musicvideos/albums/")) { long idAlbum = m_musicdatabase.GetAlbumByName(item->GetLabel()); if (idAlbum == -1) return false; std::string path = StringUtils::Format("musicdb://albums/%ld/", idAlbum); CAlbum album; m_musicdatabase.GetAlbum(idAlbum, album, false); *item = CFileItem(path,album); item->SetPath(path); CGUIWindowMusicBase::OnContextButton(itemNumber,button); Refresh(); m_viewControl.SetSelectedItem(itemNumber); return true; } if (item->HasVideoInfoTag() && !item->GetVideoInfoTag()->m_strTitle.empty()) { CGUIDialogVideoInfo::ShowFor(*item); Refresh(); } return true; } case CONTEXT_BUTTON_INFO_ALL: OnItemInfoAll(m_vecItems->GetPath()); return true; case CONTEXT_BUTTON_SET_DEFAULT: CServiceBroker::GetSettings()->SetString(CSettings::SETTING_MYMUSIC_DEFAULTLIBVIEW, GetQuickpathName(item->GetPath())); CServiceBroker::GetSettings()->Save(); return true; case CONTEXT_BUTTON_CLEAR_DEFAULT: CServiceBroker::GetSettings()->SetString(CSettings::SETTING_MYMUSIC_DEFAULTLIBVIEW, ""); CServiceBroker::GetSettings()->Save(); return true; case CONTEXT_BUTTON_GO_TO_ARTIST: { std::string strPath; CVideoDatabase database; database.Open(); strPath = StringUtils::Format("videodb://musicvideos/artists/%i/", database.GetMatchingMusicVideo(item->GetMusicInfoTag()->GetArtistString())); CServiceBroker::GetGUI()->GetWindowManager().ActivateWindow(WINDOW_VIDEO_NAV,strPath); return true; } case CONTEXT_BUTTON_PLAY_OTHER: { CVideoDatabase database; database.Open(); CVideoInfoTag details; database.GetMusicVideoInfo("", details, database.GetMatchingMusicVideo(item->GetMusicInfoTag()->GetArtistString(), item->GetMusicInfoTag()->GetAlbum(), item->GetMusicInfoTag()->GetTitle())); CApplicationMessenger::GetInstance().PostMsg(TMSG_MEDIA_PLAY, 0, 0, static_cast<void*>(new CFileItem(details))); return true; } case CONTEXT_BUTTON_RENAME: if (!item->IsVideoDb() && !item->IsReadOnly()) OnRenameItem(itemNumber); CGUIDialogVideoInfo::UpdateVideoItemTitle(item); CUtil::DeleteVideoDatabaseDirectoryCache(); Refresh(); return true; case CONTEXT_BUTTON_DELETE: if (item->IsPlayList() || item->IsSmartPlayList()) { item->m_bIsFolder = false; CGUIComponent *gui = CServiceBroker::GetGUI(); if (gui && gui->ConfirmDelete(item->GetPath())) CFileUtils::DeleteItem(item); } else if (!item->IsVideoDb()) OnDeleteItem(itemNumber); else { CGUIDialogVideoInfo::DeleteVideoItemFromDatabase(item); CUtil::DeleteVideoDatabaseDirectoryCache(); } Refresh(); return true; case CONTEXT_BUTTON_SET_CONTENT: return ManageInfoProvider(item); default: break; } return CGUIWindowMusicBase::OnContextButton(itemNumber, button); }