diff options
45 files changed, 264 insertions, 152 deletions
diff --git a/addons/resource.language.en_gb/resources/strings.po b/addons/resource.language.en_gb/resources/strings.po index abfc92bd5a..da55803602 100644 --- a/addons/resource.language.en_gb/resources/strings.po +++ b/addons/resource.language.en_gb/resources/strings.po @@ -16646,7 +16646,7 @@ msgstr "" #. Description of setting with label #14091 "Character set" #: system/settings/settings.xml msgctxt "#36116" -msgid "Choose which character set is used for displaying text in the user interface." +msgid "Choose which character set is used for displaying text in the user interface. This doesn't change the character set used for subtitles, for that go to Player > Language." msgstr "" #. Description of setting with label #14079 "Timezone country" @@ -19654,7 +19654,21 @@ msgctxt "#38111" msgid "This category contains other settings for the GUI interface" msgstr "" -#empty strings from id 38112 to 38999 +#empty strings from id 38112 to 38206 + +#. Description of setting "Pictures -> Show EXIF picture information" with label #38207 +#: system/settings/settings.xml +msgctxt "#38207" +msgid "Show EXIF picture information" +msgstr "" + +#. Help text of setting "Pictures -> Show EXIF picture information" with label #38208 +#: system/settings/settings.xml +msgctxt "#38208" +msgid "If EXIF information exists (date, time, camera used, etc.), it will be displayed." +msgstr "" + +#empty strings from id 38209 to 38999 #: system/settings/settings.xml msgctxt "#39000" diff --git a/addons/skin.estuary/xml/AddonBrowser.xml b/addons/skin.estuary/xml/AddonBrowser.xml index f3ee214b28..dd211bcc78 100644 --- a/addons/skin.estuary/xml/AddonBrowser.xml +++ b/addons/skin.estuary/xml/AddonBrowser.xml @@ -63,7 +63,7 @@ <control type="group"> <height>78</height> <bottom>0</bottom> - <visible>$EXP[sidebar_focused]</visible> + <visible>$EXP[sidebar_visible]</visible> <animation effect="fade" time="300">VisibleChange</animation> <include content="LeftAlignedInfo"> <param name="main_label" value="$INFO[Window(AddonBrowser).Property(Updated)]" /> diff --git a/addons/skin.estuary/xml/Constants_1920.xml b/addons/skin.estuary/xml/Constants_1920.xml index d85f2d53d2..f9b714beff 100644 --- a/addons/skin.estuary/xml/Constants_1920.xml +++ b/addons/skin.estuary/xml/Constants_1920.xml @@ -7,5 +7,5 @@ <constant name="tvrecordings_width">1060</constant> <constant name="eventloglist_width">1430</constant> <constant name="playlisteditorlist_width">770</constant> - <constant name="playlistlist_width">904</constant> + <constant name="playlistlist_width">896</constant> </includes> diff --git a/addons/skin.estuary/xml/Constants_2560.xml b/addons/skin.estuary/xml/Constants_2560.xml index fea8fc5886..ba83217abd 100644 --- a/addons/skin.estuary/xml/Constants_2560.xml +++ b/addons/skin.estuary/xml/Constants_2560.xml @@ -7,5 +7,5 @@ <constant name="tvrecordings_width">1700</constant> <constant name="eventloglist_width">2070</constant> <constant name="playlisteditorlist_width">1410</constant> - <constant name="playlistlist_width">1544</constant> + <constant name="playlistlist_width">1536</constant> </includes> diff --git a/addons/skin.estuary/xml/DialogMusicInfo.xml b/addons/skin.estuary/xml/DialogMusicInfo.xml index 4f895ab4e2..08940cc059 100644 --- a/addons/skin.estuary/xml/DialogMusicInfo.xml +++ b/addons/skin.estuary/xml/DialogMusicInfo.xml @@ -31,7 +31,7 @@ <height>567</height> <aspectratio aligny="top">scale</aspectratio> <fadetime>300</fadetime> - <texture background="true" fallback="DefaultAudio.png">$INFO[ListItem.Art(thumb)]</texture> + <texture background="true">$VAR[MusicInfoThumbVar]</texture> </control> </control> <control type="group"> diff --git a/addons/skin.estuary/xml/Includes.xml b/addons/skin.estuary/xml/Includes.xml index 03935c9f19..9d297c84a9 100644 --- a/addons/skin.estuary/xml/Includes.xml +++ b/addons/skin.estuary/xml/Includes.xml @@ -34,7 +34,7 @@ <constant name="list_y_offset">0</constant> <constant name="list_item_height">80</constant> <expression name="infodialog_active">Window.IsActive(musicinformation) | Window.IsActive(songinformation) | Window.IsActive(movieinformation) | Window.IsActive(addoninformation) | Window.IsActive(pvrguideinfo) | Window.IsActive(pvrrecordinginfo) | Window.IsActive(pictureinfo) | Window.IsVisible(script-script.extendedinfo-DialogVideoInfo.xml) | Window.IsVisible(script-script.extendedinfo-DialogInfo.xml) | Window.IsVisible(script-script.extendedinfo-VideoList.xml)</expression> - <expression name="sidebar_focused">ControlGroup(9000).HasFocus | Control.HasFocus(6130)</expression> + <expression name="sidebar_visible">ControlGroup(9000).HasFocus | Control.HasFocus(6130) | Window.IsActive(MyPlaylist.xml)</expression> <include name="CommonScrollbars"> <control type="group"> <animation effect="fade" start="100" end="0" time="150">WindowClose</animation> @@ -320,6 +320,7 @@ <font>$PARAM[font]</font> <aligny>center</aligny> <label>$INFO[ListItem.Label]</label> + <scroll>true</scroll> </control> </focusedlayout> </definition> diff --git a/addons/skin.estuary/xml/Includes_MediaMenu.xml b/addons/skin.estuary/xml/Includes_MediaMenu.xml index baa5f59b5f..650121f68d 100644 --- a/addons/skin.estuary/xml/Includes_MediaMenu.xml +++ b/addons/skin.estuary/xml/Includes_MediaMenu.xml @@ -200,7 +200,7 @@ <onleft>14100</onleft> <onup>8</onup> <ondown>6056</ondown> - <visible>Player.HasMedia + [$EXP[sidebar_focused]]</visible> + <visible>Player.HasMedia + [$EXP[sidebar_visible]]</visible> <visible>!System.HasModalDialog</visible> <include content="BottomMainMenuToggleItem"> <param name="control_id" value="14101" /> @@ -243,7 +243,7 @@ <include>OpenClose_Left</include> <depth>DepthSideBlade</depth> <left>-520</left> - <animation type="Conditional" condition="$EXP[sidebar_focused]" reversible="true"> + <animation type="Conditional" condition="$EXP[sidebar_visible]" reversible="true"> <effect type="slide" start="0" end="520" time="400" tween="cubic" easing="out" /> </animation> <control type="image"> @@ -251,7 +251,7 @@ <height>100%</height> <aspectratio>scale</aspectratio> <texture colordiffuse="80FFFFFF">colors/black.png</texture> - <visible>$EXP[sidebar_focused] + !System.HasModalDialog</visible> + <visible>$EXP[sidebar_visible] + !System.HasModalDialog</visible> <animation effect="fade" time="200">VisibleChange</animation> </control> <control type="image"> @@ -271,41 +271,44 @@ </control> </include> <include name="MediaMenuNowPlaying"> - <control type="grouplist" id="14100"> - <animation effect="fade" start="0" end="100" time="400">WindowOpen</animation> - <animation effect="fade" start="100" end="0" time="300">WindowClose</animation> - <animation effect="fade" time="300">VisibleChange</animation> - <orientation>horizontal</orientation> - <itemgap>-17</itemgap> - <left>5</left> - <onleft>14100</onleft> - <width>450</width> - <visible>Player.HasMedia + [$EXP[sidebar_focused]]</visible> - <visible>!System.HasModalDialog</visible> - <include content="BottomMainMenuToggleItem"> - <param name="control_id" value="14101" /> - <param name="onclick" value="PlayerControl(Play)" /> - <param name="icon_on" value="icons/now-playing/play.png" /> - <param name="icon_off" value="icons/now-playing/pause.png" /> - <param name="selected" value="Player.Paused" /> - </include> - <include content="IconButton"> - <param name="control_id" value="14102" /> - <param name="onclick" value="Stop" /> - <param name="onclick_2" value="SetFocus(50)" /> - <param name="icon" value="icons/now-playing/stop.png" /> - </include> - <include content="IconButton"> - <param name="control_id" value="14104" /> - <param name="onclick" value="PlayerControl(Next)" /> - <param name="icon" value="icons/now-playing/next.png" /> - </include> - <include content="IconButton"> - <param name="control_id" value="14105" /> - <param name="onclick" value="Fullscreen" /> - <param name="icon" value="icons/now-playing/fullscreen.png" /> - </include> - </control> + <param name="left">5</param> + <definition> + <control type="grouplist" id="14100"> + <animation effect="fade" start="0" end="100" time="400">WindowOpen</animation> + <animation effect="fade" start="100" end="0" time="300">WindowClose</animation> + <animation effect="fade" time="300">VisibleChange</animation> + <orientation>horizontal</orientation> + <itemgap>-17</itemgap> + <left>$PARAM[left]</left> + <onleft>14100</onleft> + <width>450</width> + <visible>Player.HasMedia + [$EXP[sidebar_visible]]</visible> + <visible>!System.HasModalDialog</visible> + <include content="BottomMainMenuToggleItem"> + <param name="control_id" value="14101" /> + <param name="onclick" value="PlayerControl(Play)" /> + <param name="icon_on" value="icons/now-playing/play.png" /> + <param name="icon_off" value="icons/now-playing/pause.png" /> + <param name="selected" value="Player.Paused" /> + </include> + <include content="IconButton"> + <param name="control_id" value="14102" /> + <param name="onclick" value="Stop" /> + <param name="onclick_2" value="SetFocus(50)" /> + <param name="icon" value="icons/now-playing/stop.png" /> + </include> + <include content="IconButton"> + <param name="control_id" value="14104" /> + <param name="onclick" value="PlayerControl(Next)" /> + <param name="icon" value="icons/now-playing/next.png" /> + </include> + <include content="IconButton"> + <param name="control_id" value="14105" /> + <param name="onclick" value="Fullscreen" /> + <param name="icon" value="icons/now-playing/fullscreen.png" /> + </include> + </control> + </definition> </include> <include name="MediaMenuListCommon"> <definition> @@ -345,7 +348,6 @@ </control> <control type="button" id="19"> <visible>Container.CanFilter + !Container.CanFilterAdvanced</visible> - <visible>!Container.Content()</visible> <include>MediaMenuItemsCommon</include> <label>$LOCALIZE[137]</label> </control> diff --git a/addons/skin.estuary/xml/MyPlaylist.xml b/addons/skin.estuary/xml/MyPlaylist.xml index 51361f04c8..f66dc10734 100644 --- a/addons/skin.estuary/xml/MyPlaylist.xml +++ b/addons/skin.estuary/xml/MyPlaylist.xml @@ -10,9 +10,9 @@ <control type="group"> <include>OpenClose_Left</include> <control type="fixedlist" id="50"> - <left>402</left> + <left>410</left> <top>list_y_offset</top> - <right>594</right> + <right>586</right> <bottom>list_y_offset</bottom> <scrolltime tween="cubic" easing="out">500</scrolltime> <orientation>vertical</orientation> @@ -79,7 +79,7 @@ <control type="group"> <depth>DepthContentPanel</depth> <include content="ContentPanel"> - <param name="width" value="462" /> + <param name="width" value="470" /> </include> <control type="grouplist" id="700"> <orientation>vertical</orientation> @@ -90,9 +90,9 @@ <ondown>700</ondown> <onleft>50</onleft> <onright>50</onright> - <width>402</width> + <width>410</width> <control type="radiobutton" id="20"> - <width>402</width> + <width>410</width> <height>110</height> <align>left</align> <aligny>top</aligny> @@ -115,6 +115,9 @@ <param name="control_id" value="22" /> <param name="label" value="$LOCALIZE[192]" /> </include> + <include content="MediaMenuNowPlaying"> + <param name="left" value="-5" /> + </include> </control> </control> </control> diff --git a/addons/skin.estuary/xml/MyVideoNav.xml b/addons/skin.estuary/xml/MyVideoNav.xml index 8b2b8f8da3..ea67f8e956 100644 --- a/addons/skin.estuary/xml/MyVideoNav.xml +++ b/addons/skin.estuary/xml/MyVideoNav.xml @@ -138,7 +138,7 @@ <include>MediaMenuItemsCommon</include> <label>$LOCALIZE[31056]</label> <onclick>ActivateWindow(videoplaylist)</onclick> - <visible>IntegerGreaterThan(Playlist.Length(video),0)</visible> + <visible>Integer.IsGreater(Playlist.Length(video),0)</visible> </control> <control type="button" id="621"> <description>Get more</description> diff --git a/addons/skin.estuary/xml/Variables.xml b/addons/skin.estuary/xml/Variables.xml index a1f306bcc3..f41d2bdb63 100644 --- a/addons/skin.estuary/xml/Variables.xml +++ b/addons/skin.estuary/xml/Variables.xml @@ -65,6 +65,12 @@ <value condition="ListItem.IsFolder + String.IsEmpty(ListItem.Thumb)">DefaultFolderSquare.png</value> <value>$INFO[ListItem.Thumb]</value> </variable> + <variable name="MusicInfoThumbVar"> + <value condition="!String.IsEmpty(Listitem.Art(thumb))">$INFO[Listitem.Art(thumb)]</value> + <value condition="String.IsEqual(listitem.dbtype,artist)">DefaultArtist.png</value> + <value condition="String.IsEqual(listitem.dbtype,album)">DefaultAlbumCover.png</value> + <value>DefaultAudio.png</value> + </variable> <variable name="InfoWallThumbVar"> <value condition="!String.IsEmpty(Listitem.Art(poster))">$INFO[Listitem.Art(poster)]</value> <value>$INFO[ListItem.Icon]</value> diff --git a/addons/skin.estuary/xml/View_55_WideList.xml b/addons/skin.estuary/xml/View_55_WideList.xml index 7ae03461b3..c567df747a 100644 --- a/addons/skin.estuary/xml/View_55_WideList.xml +++ b/addons/skin.estuary/xml/View_55_WideList.xml @@ -37,7 +37,7 @@ <aligny>center</aligny> <label>$INFO[ListItem.Year]</label> <shadowcolor>text_shadow</shadowcolor> - <visible>!Container.Content(tvshows) + !Container.Content(seasons) + !Container.Content(episodes) + !Container.Content(movies)</visible> + <visible>!Container.Content(tvshows) + !Container.Content(seasons) + !Container.Content(episodes) + !Container.Content(movies) + !Container.Content(videos)</visible> </control> <control type="image"> <left>35</left> @@ -45,7 +45,7 @@ <width>32</width> <height>32</height> <texture>$VAR[ListWatchedIconVar]</texture> - <visible>Container.Content(tvshows) | Container.Content(seasons) | Container.Content(episodes) | Container.Content(movies) | String.IsEmpty(ListItem.Year)</visible> + <visible>Container.Content(tvshows) | Container.Content(seasons) | Container.Content(episodes) | Container.Content(movies) | Container.Content(videos) | String.IsEmpty(ListItem.Year)</visible> </control> <control type="label"> <left>105</left> @@ -78,7 +78,7 @@ <label>$INFO[ListItem.Year]</label> <textcolor>button_focus</textcolor> <shadowcolor>text_shadow</shadowcolor> - <visible>!Container.Content(tvshows) + !Container.Content(seasons) + !Container.Content(episodes) + !Container.Content(movies)</visible> + <visible>!Container.Content(tvshows) + !Container.Content(seasons) + !Container.Content(episodes) + !Container.Content(movies) + !Container.Content(videos)</visible> </control> <control type="image"> <left>35</left> @@ -86,7 +86,7 @@ <width>32</width> <height>32</height> <texture colordiffuse="grey">$VAR[ListWatchedIconVar]</texture> - <visible>Container.Content(tvshows) | Container.Content(seasons) | Container.Content(episodes) | Container.Content(movies) | String.IsEmpty(ListItem.Year)</visible> + <visible>Container.Content(tvshows) | Container.Content(seasons) | Container.Content(episodes) | Container.Content(movies) | Container.Content(videos) | String.IsEmpty(ListItem.Year)</visible> </control> <control type="label"> <left>105</left> diff --git a/codegenerator.mk b/codegenerator.mk index 5f8bdd97de..dc93280d1a 100644 --- a/codegenerator.mk +++ b/codegenerator.mk @@ -69,3 +69,4 @@ else #build json builder - ".." because makefile is in the parent dir of "bin" $(MAKE) -C $(abspath $(@D)/..) endif +$(shell touch $(TOPDIR)/xbmc/cores/AudioEngine/AEDefines_override.h) diff --git a/project/BuildDependencies/scripts/0_package.list b/project/BuildDependencies/scripts/0_package.list index e9dfdd61c6..7330562ae6 100644 --- a/project/BuildDependencies/scripts/0_package.list +++ b/project/BuildDependencies/scripts/0_package.list @@ -6,7 +6,7 @@ ; -> sqlite-3.7.12.1-win32\system\sqlite3.dll ; -> ... ;PLEASE KEEP THIS LIST IN ALPHABETICAL ORDER! -cpluff-2b8e20-win32-vc140.7z +cpluff-ed7874fc-win32-vc140.7z crossguid-8f399e-win32-vc140-v3.7z curl-7.48-win32-vc140.7z dnssd-541-win32.zip diff --git a/project/cmake/addons/bootstrap/CMakeLists.txt b/project/cmake/addons/bootstrap/CMakeLists.txt index c20b97efca..66b7e3d16c 100644 --- a/project/cmake/addons/bootstrap/CMakeLists.txt +++ b/project/cmake/addons/bootstrap/CMakeLists.txt @@ -50,7 +50,6 @@ function(bootstrap_repo repo_id repo_url repo_revision) -DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH} -DPROJECT_SOURCE_DIR=<SOURCE_DIR> -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} - -DADDONS_TO_BUILD=${ADDONS_TO_BUILD} -P ${PROJECT_SOURCE_DIR}/Bootstrap.cmake ) endfunction() diff --git a/project/cmake/installdata/common/common.txt b/project/cmake/installdata/common/common.txt index c1e52f0ee5..a9d19234e3 100644 --- a/project/cmake/installdata/common/common.txt +++ b/project/cmake/installdata/common/common.txt @@ -2,7 +2,6 @@ media/* sounds/* system/keymaps/* system/library/* -system/players/VideoPlayer/etc/* system/shaders/* system/settings/* userdata/* diff --git a/project/cmake/installdata/ios/fontconfig.txt b/project/cmake/installdata/ios/fontconfig.txt new file mode 100644 index 0000000000..1f1bd9d50b --- /dev/null +++ b/project/cmake/installdata/ios/fontconfig.txt @@ -0,0 +1 @@ +system/players/VideoPlayer/etc/* diff --git a/project/cmake/modules/FindLibDvd.cmake b/project/cmake/modules/FindLibDvd.cmake index 59c6f9638b..a083ddc4ed 100644 --- a/project/cmake/modules/FindLibDvd.cmake +++ b/project/cmake/modules/FindLibDvd.cmake @@ -123,9 +123,9 @@ if(NOT WIN32) set_target_properties(dvdcss PROPERTIES FOLDER "External Projects") endif() - set(DVDREAD_CFLAGS "-D_XBMC") + set(DVDREAD_CFLAGS "-D_XBMC -I${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/libdvd/include") if(ENABLE_DVDCSS) - set(DVDREAD_CFLAGS "${DVDREAD_CFLAGS} -DHAVE_DVDCSS_DVDCSS_H -I${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/libdvd/include") + set(DVDREAD_CFLAGS "${DVDREAD_CFLAGS} -DHAVE_DVDCSS_DVDCSS_H") endif() set(DVDREAD_LIBRARY ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/libdvd/lib/libdvdread.a) diff --git a/project/cmake/scripts/common/Macros.cmake b/project/cmake/scripts/common/Macros.cmake index 6b5a2f1a7e..d8cdce9ce2 100644 --- a/project/cmake/scripts/common/Macros.cmake +++ b/project/cmake/scripts/common/Macros.cmake @@ -584,6 +584,7 @@ function(core_find_git_rev stamp) else() find_package(Git) if(GIT_FOUND AND EXISTS ${CORE_SOURCE_DIR}/.git) + execute_process(COMMAND ${GIT_EXECUTABLE} update-index --ignore-submodules --refresh -q) execute_process(COMMAND ${GIT_EXECUTABLE} diff-files --ignore-submodules --quiet -- RESULT_VARIABLE status_code WORKING_DIRECTORY ${CORE_SOURCE_DIR}) diff --git a/system/settings/settings.xml b/system/settings/settings.xml index c3804da962..f28f5daa81 100644 --- a/system/settings/settings.xml +++ b/system/settings/settings.xml @@ -581,6 +581,11 @@ </category> <category id="pictures" label="14217" help="38105"> <group id="1" label="108"> + <setting id="pictures.usetags" type="boolean" label="38207" help="38208"> + <level>1</level> + <default>true</default> + <control type="toggle" /> + </setting> <setting id="slideshow.staytime" type="integer" label="12378" help="36312"> <level>0</level> <default>5</default> @@ -665,13 +670,24 @@ <control type="spinner" format="integer" delayed="true"/> </setting> <setting id="subtitles.font" type="string" label="14089" help="36185"> - <level>3</level> + <level>1</level> <default>arial.ttf</default> <constraints> <options>fonts</options> </constraints> <control type="list" format="string" /> </setting> + <setting id="subtitles.charset" type="string" parent="subtitles.font" label="735" help="36189"> + <level>1</level> + <default>DEFAULT</default> + <constraints> + <options>charsets</options> + </constraints> + <dependencies> + <dependency type="enable" on="property" name="IsUsingTTFSubtitles" setting="subtitles.font" /> + </dependencies> + <control type="list" format="string" /> + </setting> <setting id="subtitles.height" type="integer" parent="subtitles.font" label="289" help="36186"> <level>3</level> <default>28</default> @@ -721,17 +737,6 @@ </dependencies> <control type="list" format="string" /> </setting> - <setting id="subtitles.charset" type="string" parent="subtitles.font" label="735" help="36189"> - <level>3</level> - <default>DEFAULT</default> - <constraints> - <options>charsets</options> - </constraints> - <dependencies> - <dependency type="enable" on="property" name="IsUsingTTFSubtitles" setting="subtitles.font" /> - </dependencies> - <control type="list" format="string" /> - </setting> <setting id="subtitles.overrideassfonts" type="boolean" label="21368" help="36190"> <level>3</level> <default>false</default> diff --git a/tools/android/packaging/Makefile.in b/tools/android/packaging/Makefile.in index b34fa6c282..fb8b20b21b 100644 --- a/tools/android/packaging/Makefile.in +++ b/tools/android/packaging/Makefile.in @@ -117,6 +117,7 @@ res: cp -fp media/drawable-mdpi/ic_launcher.png xbmc/res/drawable-mdpi/ic_launcher.png cp -fp media/drawable-xhdpi/ic_launcher.png xbmc/res/drawable-xhdpi/ic_launcher.png cp -fp media/drawable-xxhdpi/ic_launcher.png xbmc/res/drawable-xxhdpi/ic_launcher.png + cp -fp $(CORE_SOURCE_DIR)/media/Splash.png xbmc/res/drawable-xxxhdpi/splash.png cp -fp media/drawable-xxxhdpi/ic_launcher.png xbmc/res/drawable-xxxhdpi/ic_launcher.png cp -fp media/drawable-xhdpi/banner.png xbmc/res/drawable-xhdpi/banner.png cp xbmc/strings.xml xbmc/res/values/ diff --git a/xbmc/Application.cpp b/xbmc/Application.cpp index b12b8e8283..c6ef0c0e08 100644 --- a/xbmc/Application.cpp +++ b/xbmc/Application.cpp @@ -4655,6 +4655,11 @@ const std::string& CApplication::CurrentFile() return m_itemCurrentFile->GetPath(); } +std::shared_ptr<CFileItem> CApplication::CurrentFileItemPtr() +{ + return m_itemCurrentFile; +} + CFileItem& CApplication::CurrentFileItem() { return *m_itemCurrentFile; diff --git a/xbmc/Application.h b/xbmc/Application.h index 580fdce547..8d5876e03d 100644 --- a/xbmc/Application.h +++ b/xbmc/Application.h @@ -164,6 +164,7 @@ public: void ReloadSkin(bool confirm = false); const std::string& CurrentFile(); CFileItem& CurrentFileItem(); + std::shared_ptr<CFileItem> CurrentFileItemPtr(); void SetCurrentFileItem(const CFileItem &item); CFileItem& CurrentUnstackedItem(); virtual bool OnMessage(CGUIMessage& message) override; diff --git a/xbmc/ContextMenuManager.cpp b/xbmc/ContextMenuManager.cpp index 4329c542d3..92688728be 100644 --- a/xbmc/ContextMenuManager.cpp +++ b/xbmc/ContextMenuManager.cpp @@ -43,7 +43,13 @@ CContextMenuManager::CContextMenuManager(CAddonMgr& addonMgr) CContextMenuManager::~CContextMenuManager() { + Deinit(); +} + +void CContextMenuManager::Deinit() +{ m_addonMgr.Events().Unsubscribe(this); + m_items.clear(); } CContextMenuManager& CContextMenuManager::GetInstance() diff --git a/xbmc/ContextMenuManager.h b/xbmc/ContextMenuManager.h index 3a96b8a765..7f613b1687 100644 --- a/xbmc/ContextMenuManager.h +++ b/xbmc/ContextMenuManager.h @@ -40,6 +40,7 @@ public: static CContextMenuManager& GetInstance(); void Init(); + void Deinit(); ContextMenuView GetItems(const CFileItem& item, const CContextMenuItem& root = MAIN) const; diff --git a/xbmc/addons/FilesystemInstaller.cpp b/xbmc/addons/FilesystemInstaller.cpp index bd4a93171d..81b83e46d5 100644 --- a/xbmc/addons/FilesystemInstaller.cpp +++ b/xbmc/addons/FilesystemInstaller.cpp @@ -26,8 +26,35 @@ #include "utils/StringUtils.h" #include "utils/URIUtils.h" +#ifdef TARGET_POSIX +#include "XTimeUtils.h" +#endif + using namespace XFILE; +namespace +{ + +bool renameOrRetry(const std::string & source, const std::string & dest, const char * description) +{ + auto count = 1; + auto result = false; + do + { + result = CFile::Rename(source, dest); + if (!result) + { + CLog::Log(LOGERROR, "Failed to move %s addon files from '%s' to '%s', retrying in 500ms", + description, source.c_str(), dest.c_str()); + Sleep(500); + } + } while (!result && count++ < 4); + + return result; +} + +} // end namespace unnamed + CFilesystemInstaller::CFilesystemInstaller() { m_addonFolder = CSpecialProtocol::TranslatePath("special://home/addons/"); @@ -52,18 +79,12 @@ bool CFilesystemInstaller::InstallToFilesystem(const std::string& archive, const bool hasOldData = CDirectory::Exists(addonFolder); if (hasOldData) { - if (!CFile::Rename(addonFolder, oldAddonData)) - { - CLog::Log(LOGERROR, "Failed to move old addon files from '%s' to '%s'", addonFolder.c_str(), oldAddonData.c_str()); + if (!renameOrRetry(addonFolder, oldAddonData, "old")) return false; - } } - if (!CFile::Rename(newAddonData, addonFolder)) - { - CLog::Log(LOGERROR, "Failed to move new addon files from '%s' to '%s'", newAddonData.c_str(), addonFolder.c_str()); + if (!renameOrRetry(newAddonData, addonFolder, "new")) return false; - } if (hasOldData) { diff --git a/xbmc/cores/AudioEngine/Makefile.in b/xbmc/cores/AudioEngine/Makefile.in index 9a3d486dcb..edb6b110bf 100644 --- a/xbmc/cores/AudioEngine/Makefile.in +++ b/xbmc/cores/AudioEngine/Makefile.in @@ -83,6 +83,5 @@ SRCS += Utils/AELimiter.cpp SRCS += Encoders/AEEncoderFFmpeg.cpp LIB = audioengine.a -$(shell touch AEDefines_override.h) include @abs_top_srcdir@/Makefile.include -include $(patsubst %.cpp,%.P,$(patsubst %.c,%.P,$(SRCS))) diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp index 7149b34d66..1698b2f782 100644 --- a/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp +++ b/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp @@ -469,7 +469,10 @@ bool CAESinkAUDIOTRACK::Initialize(AEAudioFormat &format, std::string &device) Deinitialize(); return false; } - CLog::Log(LOGDEBUG, "CAESinkAUDIOTRACK::Initialize returned: m_sampleRate %u; format:%s; min_buffer_size %u; m_frames %u; m_frameSize %u; channels: %d", m_sink_sampleRate, CAEUtil::DataFormatToStr(m_format.m_dataFormat), m_min_buffer_size, m_format.m_frames, m_format.m_frameSize, m_format.m_channelLayout.Count()); + const char* method = m_passthrough ? (m_info.m_wantsIECPassthrough ? "IEC (PT)" : "RAW (PT)") : "PCM"; + CLog::Log(LOGNOTICE, "CAESinkAUDIOTRACK::Initializing with: m_sampleRate: %u format: %s (AE) method: %s stream-type: %s min_buffer_size: %u m_frames: %u m_frameSize: %u channels: %d", + m_sink_sampleRate, CAEUtil::DataFormatToStr(m_format.m_dataFormat), method, m_passthrough ? CAEUtil::StreamTypeToStr(m_format.m_streamInfo.m_type) : "PCM-STREAM", + m_min_buffer_size, m_format.m_frames, m_format.m_frameSize, m_format.m_channelLayout.Count()); } format = m_format; diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.cpp index 17c428cb28..420b5b5d8e 100644 --- a/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.cpp +++ b/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.cpp @@ -236,8 +236,8 @@ bool CRenderManager::Configure(DVDVideoPicture& picture, float fps, unsigned fla m_NumberBuffers = buffers; m_renderState = STATE_CONFIGURING; m_stateEvent.Reset(); - - CheckEnableClockSync(); + m_clockSync.Reset(); + m_dvdClock.SetVsyncAdjust(0); CSingleLock lock2(m_presentlock); m_presentstep = PRESENT_READY; @@ -318,7 +318,7 @@ bool CRenderManager::Configure() m_renderedOverlay = false; m_renderDebug = false; m_clockSync.Reset(); - CheckEnableClockSync(); + m_dvdClock.SetVsyncAdjust(0); m_renderState = STATE_CONFIGURED; @@ -383,6 +383,8 @@ void CRenderManager::FrameMove() CApplicationMessenger::GetInstance().PostMsg(TMSG_SWITCHTOFULLSCREEN); } } + + CheckEnableClockSync(); } { CSingleLock lock2(m_presentlock); @@ -1080,8 +1082,6 @@ void CRenderManager::UpdateResolution() RESOLUTION res = CResolutionUtils::ChooseBestResolution(m_fps, m_width, CONF_FLAGS_STEREO_MODE_MASK(m_flags)); g_graphicsContext.SetVideoResolution(res); UpdateDisplayLatency(); - - CheckEnableClockSync(); } m_bTriggerUpdateResolution = false; m_playerPort->VideoParamsChange(); diff --git a/xbmc/epg/EpgContainer.cpp b/xbmc/epg/EpgContainer.cpp index 85820b1a9b..f597fa0697 100644 --- a/xbmc/epg/EpgContainer.cpp +++ b/xbmc/epg/EpgContainer.cpp @@ -411,12 +411,24 @@ CEpgInfoTagPtr CEpgContainer::GetTagById(const CPVRChannelPtr &channel, unsigned { CEpgInfoTagPtr retval; - if (!channel || iBroadcastId == EPG_TAG_INVALID_UID) + if (iBroadcastId == EPG_TAG_INVALID_UID) return retval; - const CEpgPtr epg(channel->GetEPG()); - if (epg) - retval = epg->GetTagByBroadcastId(iBroadcastId); + if (channel) + { + const CEpgPtr epg(channel->GetEPG()); + if (epg) + retval = epg->GetTagByBroadcastId(iBroadcastId); + } + else + { + for (const auto &epgEntry : m_epgs) + { + retval = epgEntry.second->GetTagByBroadcastId(iBroadcastId); + if (retval) + break; + } + } return retval; } diff --git a/xbmc/filesystem/FavouritesDirectory.cpp b/xbmc/filesystem/FavouritesDirectory.cpp index fc42ed3d5b..dd50787016 100644 --- a/xbmc/filesystem/FavouritesDirectory.cpp +++ b/xbmc/filesystem/FavouritesDirectory.cpp @@ -197,8 +197,13 @@ std::string CFavouritesDirectory::GetExecutePath(const CFileItem &item, const st execute = StringUtils::Format("ActivateWindow(%s,%s,return)", contextWindow.c_str(), StringUtils::Paramify(item.GetPath()).c_str()); } //! @todo STRING_CLEANUP - else if (item.IsScript() && item.GetPath().size() > 9) // plugin://<foo> + else if (item.IsScript() && item.GetPath().size() > 9) // script://<foo> execute = StringUtils::Format("RunScript(%s)", StringUtils::Paramify(item.GetPath().substr(9)).c_str()); + else if (item.IsAddonsPath() && item.GetPath().size() > 9) // addons://<foo> + { + CURL url(item.GetPath()); + execute = StringUtils::Format("RunAddon(%s)", url.GetFileName().c_str()); + } else if (item.IsAndroidApp() && item.GetPath().size() > 26) // androidapp://sources/apps/<foo> execute = StringUtils::Format("StartAndroidActivity(%s)", StringUtils::Paramify(item.GetPath().substr(26)).c_str()); else // assume a media file diff --git a/xbmc/guilib/Resolution.cpp b/xbmc/guilib/Resolution.cpp index b86110cfe5..8c19be8151 100644 --- a/xbmc/guilib/Resolution.cpp +++ b/xbmc/guilib/Resolution.cpp @@ -224,11 +224,13 @@ RESOLUTION CResolutionUtils::FindClosestResolution(float fps, int width, bool is // evaluate all higher modes and evalute them // concerning dimension and refreshrate weight // skip lower resolutions + // don't change resolutions when 3D is wanted if ((width < orig.iScreenWidth) || // orig res large enough (info.iScreenWidth < orig.iScreenWidth) || // new res is smaller (info.iScreenHeight < orig.iScreenHeight) || // new height would be smaller (info.dwFlags & D3DPRESENTFLAG_MODEMASK) != (curr.dwFlags & D3DPRESENTFLAG_MODEMASK) || // don't switch to interlaced modes - (info.iScreen != curr.iScreen)) // skip not current displays + (info.iScreen != curr.iScreen) || // skip not current displays + is3D) // skip res changing when doing 3D { continue; } diff --git a/xbmc/interfaces/json-rpc/PVROperations.cpp b/xbmc/interfaces/json-rpc/PVROperations.cpp index 0ebca7547f..6fbd6e2be7 100644 --- a/xbmc/interfaces/json-rpc/PVROperations.cpp +++ b/xbmc/interfaces/json-rpc/PVROperations.cpp @@ -337,34 +337,12 @@ JSONRPC_STATUS CPVROperations::GetTimerDetails(const std::string &method, ITrans return OK; } -CFileItemPtr CPVROperations::GetBroadcastFromBroadcastid(unsigned int broadcastid) -{ - EpgSearchFilter filter; - filter.Reset(); - filter.m_iUniqueBroadcastId = broadcastid; - - CFileItemList broadcasts; - int resultSize = g_EpgContainer.GetEPGSearch(broadcasts, filter); - - if (resultSize != 1) - return CFileItemPtr(); - - return broadcasts.Get(0); -} - JSONRPC_STATUS CPVROperations::AddTimer(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result) { if (!g_PVRManager.IsStarted()) return FailedToExecute; - CFileItemPtr broadcast = CPVROperations::GetBroadcastFromBroadcastid(parameterObject["broadcastid"].asUnsignedInteger()); - if (!broadcast) - return InvalidParams; - - if (!broadcast->HasEPGInfoTag()) - return InvalidParams; - - CEpgInfoTagPtr epgTag = broadcast->GetEPGInfoTag(); + const CEpgInfoTagPtr epgTag = g_EpgContainer.GetTagById(CPVRChannelPtr(), parameterObject["broadcastid"].asUnsignedInteger()); if (!epgTag) return InvalidParams; @@ -406,14 +384,7 @@ JSONRPC_STATUS CPVROperations::ToggleTimer(const std::string &method, ITransport if (!g_PVRManager.IsStarted()) return FailedToExecute; - CFileItemPtr broadcast = CPVROperations::GetBroadcastFromBroadcastid(parameterObject["broadcastid"].asUnsignedInteger()); - if (!broadcast) - return InvalidParams; - - if (!broadcast->HasEPGInfoTag()) - return InvalidParams; - - CEpgInfoTagPtr epgTag = broadcast->GetEPGInfoTag(); + const CEpgInfoTagPtr epgTag = g_EpgContainer.GetTagById(CPVRChannelPtr(), parameterObject["broadcastid"].asUnsignedInteger()); if (!epgTag) return InvalidParams; diff --git a/xbmc/interfaces/json-rpc/PVROperations.h b/xbmc/interfaces/json-rpc/PVROperations.h index 96c262b2f2..12ab532991 100644 --- a/xbmc/interfaces/json-rpc/PVROperations.h +++ b/xbmc/interfaces/json-rpc/PVROperations.h @@ -51,7 +51,5 @@ namespace JSONRPC private: static JSONRPC_STATUS GetPropertyValue(const std::string &property, CVariant &result); static void FillChannelGroupDetails(const PVR::CPVRChannelGroupPtr &channelGroup, const CVariant ¶meterObject, CVariant &result, bool append = false); - - static CFileItemPtr GetBroadcastFromBroadcastid(unsigned int broadcastid); }; } diff --git a/xbmc/music/dialogs/GUIDialogMusicOSD.cpp b/xbmc/music/dialogs/GUIDialogMusicOSD.cpp index 865d29b86f..c8c2b95ca0 100644 --- a/xbmc/music/dialogs/GUIDialogMusicOSD.cpp +++ b/xbmc/music/dialogs/GUIDialogMusicOSD.cpp @@ -91,7 +91,7 @@ bool CGUIDialogMusicOSD::OnAction(const CAction &action) for (int i = 1; i <= 10; i++) dialog->Add(StringUtils::Format("%s: %i", g_localizeStrings.Get(563).c_str(), i)); - auto track = std::make_shared<CFileItem>(g_application.CurrentFileItem()); + auto track = g_application.CurrentFileItemPtr(); dialog->SetSelected(track->GetMusicInfoTag()->GetUserrating()); dialog->Open(); diff --git a/xbmc/pictures/GUIWindowPictures.cpp b/xbmc/pictures/GUIWindowPictures.cpp index 4b5ec502a4..5be32ff4a2 100644 --- a/xbmc/pictures/GUIWindowPictures.cpp +++ b/xbmc/pictures/GUIWindowPictures.cpp @@ -203,7 +203,7 @@ void CGUIWindowPictures::OnPrepareFileItems(CFileItemList& items) if (StringUtils::EqualsNoCase(items[i]->GetLabel(), "folder.jpg")) items.Remove(i); - if (items.GetFolderCount() == items.Size()) + if (items.GetFolderCount()==items.Size() || !CSettings::GetInstance().GetBool(CSettings::SETTING_PICTURES_USETAGS)) return; // Start the music info loader thread diff --git a/xbmc/pictures/PictureInfoLoader.cpp b/xbmc/pictures/PictureInfoLoader.cpp index dd3347277c..05304f9fc4 100644 --- a/xbmc/pictures/PictureInfoLoader.cpp +++ b/xbmc/pictures/PictureInfoLoader.cpp @@ -43,6 +43,7 @@ void CPictureInfoLoader::OnLoaderStart() m_mapFileItems->SetFastLookup(true); m_tagReads = 0; + m_loadTags = CSettings::GetInstance().GetBool(CSettings::SETTING_PICTURES_USETAGS); if (m_pProgressCallback) m_pProgressCallback->SetProgressMax(m_pVecItems->GetFileCount()); @@ -87,8 +88,11 @@ bool CPictureInfoLoader::LoadItemLookup(CFileItem* pItem) if (pItem->HasPictureInfoTag()) return false; - pItem->GetPictureInfoTag()->Load(pItem->GetPath()); - m_tagReads++; + if (m_loadTags) + { // Nothing found, load tag from file + pItem->GetPictureInfoTag()->Load(pItem->GetPath()); + m_tagReads++; + } return true; } diff --git a/xbmc/pictures/PictureInfoLoader.h b/xbmc/pictures/PictureInfoLoader.h index 000b54fe1b..2a022ff0ff 100644 --- a/xbmc/pictures/PictureInfoLoader.h +++ b/xbmc/pictures/PictureInfoLoader.h @@ -39,5 +39,6 @@ protected: CFileItemList* m_mapFileItems; unsigned int m_tagReads; + bool m_loadTags; }; diff --git a/xbmc/pvr/PVRManager.cpp b/xbmc/pvr/PVRManager.cpp index d88593161a..53f3571dcb 100644 --- a/xbmc/pvr/PVRManager.cpp +++ b/xbmc/pvr/PVRManager.cpp @@ -424,6 +424,13 @@ void CPVRManager::Stop(void) if (IsStopped()) return; + /* stop playback if needed */ + if (IsPlaying()) + { + CLog::Log(LOGNOTICE,"PVRManager - %s - stopping PVR playback", __FUNCTION__); + CApplicationMessenger::GetInstance().SendMsg(TMSG_MEDIA_STOP); + } + SetState(ManagerStateStopping); m_pendingUpdates.Stop(); @@ -433,13 +440,6 @@ void CPVRManager::Stop(void) CLog::Log(LOGNOTICE, "PVRManager - stopping"); - /* stop playback if needed */ - if (IsPlaying()) - { - CLog::Log(LOGNOTICE,"PVRManager - %s - stopping PVR playback", __FUNCTION__); - CApplicationMessenger::GetInstance().SendMsg(TMSG_MEDIA_STOP); - } - /* stop all update threads */ SetState(ManagerStateInterrupted); diff --git a/xbmc/pvr/addons/PVRClients.cpp b/xbmc/pvr/addons/PVRClients.cpp index e68d9fee63..7fea6d32ae 100644 --- a/xbmc/pvr/addons/PVRClients.cpp +++ b/xbmc/pvr/addons/PVRClients.cpp @@ -179,9 +179,13 @@ int CPVRClients::GetFirstConnectedClientID(void) int CPVRClients::EnabledClientAmount(void) const { int iReturn(0); - CSingleLock lock(m_critSection); + PVR_CLIENTMAP clientMap; + { + CSingleLock lock(m_critSection); + clientMap = m_clientMap; + } - for (const auto &client : m_clientMap) + for (const auto &client : clientMap) if (!CAddonMgr::GetInstance().IsAddonDisabled(client.second->ID())) ++iReturn; @@ -190,7 +194,13 @@ int CPVRClients::EnabledClientAmount(void) const bool CPVRClients::HasEnabledClients(void) const { - for (const auto &client : m_clientMap) + PVR_CLIENTMAP clientMap; + { + CSingleLock lock(m_critSection); + clientMap = m_clientMap; + } + + for (const auto &client : clientMap) if (!CAddonMgr::GetInstance().IsAddonDisabled(client.second->ID())) return true; return false; @@ -198,8 +208,9 @@ bool CPVRClients::HasEnabledClients(void) const bool CPVRClients::StopClient(AddonPtr client, bool bRestart) { - /* stop playback */ - CApplicationMessenger::GetInstance().SendMsg(TMSG_MEDIA_STOP); + /* stop playback if needed */ + if (IsPlaying()) + CApplicationMessenger::GetInstance().SendMsg(TMSG_MEDIA_STOP); CSingleLock lock(m_critSection); int iId = GetClientId(client); diff --git a/xbmc/pvr/channels/PVRChannelGroup.cpp b/xbmc/pvr/channels/PVRChannelGroup.cpp index 3f2fd656a2..f117f54ce2 100644 --- a/xbmc/pvr/channels/PVRChannelGroup.cpp +++ b/xbmc/pvr/channels/PVRChannelGroup.cpp @@ -31,6 +31,7 @@ #include "settings/lib/Setting.h" #include "settings/Settings.h" #include "threads/SingleLock.h" +#include "utils/JobManager.h" #include "utils/log.h" #include "utils/StringUtils.h" @@ -265,26 +266,37 @@ bool CPVRChannelGroup::MoveChannel(unsigned int iOldChannelNumber, unsigned int void CPVRChannelGroup::SearchAndSetChannelIcons(bool bUpdateDb /* = false */) { + // searching and setting channel icons may take some time, and (more important) + // it triggers GUI which might lead to deadlocks if directly called. + PVR_CHANNEL_GROUP_MEMBERS groupMembers; + { + CSingleLock lock(m_critSection); + groupMembers = m_members; + } + + CJobManager::GetInstance().AddJob(new CPVRSearchAndSetChannelIcons(groupMembers, bUpdateDb), nullptr); +} + +bool CPVRSearchAndSetChannelIcons::DoWork() +{ std::string iconPath = CSettings::GetInstance().GetString(CSettings::SETTING_PVRMENU_ICONPATH); if (iconPath.empty()) - return; + return true; const CPVRDatabasePtr database(g_PVRManager.GetTVDatabase()); if (!database) - return; + return false; /* fetch files in icon path for fast lookup */ CFileItemList fileItemList; XFILE::CDirectory::GetDirectory(iconPath, fileItemList, ".jpg|.png|.tbn"); if (fileItemList.IsEmpty()) - return; + return true; CGUIDialogExtendedProgressBar* dlgProgress = (CGUIDialogExtendedProgressBar*)g_windowManager.GetWindow(WINDOW_DIALOG_EXT_PROGRESS); CGUIDialogProgressBarHandle* dlgProgressHandle = dlgProgress ? dlgProgress->GetHandle(g_localizeStrings.Get(19287)) : NULL; - CSingleLock lock(m_critSection); - /* create a map for fast lookup of normalized file base name */ std::map<std::string, std::string> fileItemMap; const VECFILEITEMS &items = fileItemList.GetList(); @@ -298,14 +310,14 @@ void CPVRChannelGroup::SearchAndSetChannelIcons(bool bUpdateDb /* = false */) int channelIndex = 0; CPVRChannelPtr channel; - for(PVR_CHANNEL_GROUP_MEMBERS::const_iterator it = m_members.begin(); it != m_members.end(); ++it) + for(const auto &groupMember : m_groupMembers) { - channel = it->second.channel; + channel = groupMember.second.channel; /* update progress dialog */ if (dlgProgressHandle) { - dlgProgressHandle->SetProgress(channelIndex++, m_members.size()); + dlgProgressHandle->SetProgress(channelIndex++, m_groupMembers.size()); dlgProgressHandle->SetText(channel->ChannelName()); } @@ -330,7 +342,7 @@ void CPVRChannelGroup::SearchAndSetChannelIcons(bool bUpdateDb /* = false */) channel->SetIconPath(itItem->second, g_advancedSettings.m_bPVRAutoScanIconsUserSet); } - if (bUpdateDb) + if (m_bUpdateDb) channel->Persist(); //! @todo start channel icon scraper here if nothing was found @@ -338,6 +350,8 @@ void CPVRChannelGroup::SearchAndSetChannelIcons(bool bUpdateDb /* = false */) if (dlgProgressHandle) dlgProgressHandle->MarkFinished(); + + return true; } /********** sort methods **********/ diff --git a/xbmc/pvr/channels/PVRChannelGroup.h b/xbmc/pvr/channels/PVRChannelGroup.h index dd2ede596a..90b9ef5291 100644 --- a/xbmc/pvr/channels/PVRChannelGroup.h +++ b/xbmc/pvr/channels/PVRChannelGroup.h @@ -546,4 +546,18 @@ namespace PVR private: CPVRChannelGroupPtr m_group; }; + + class CPVRSearchAndSetChannelIcons : public CJob + { + public: + CPVRSearchAndSetChannelIcons(const PVR_CHANNEL_GROUP_MEMBERS &groupMembers, bool bUpdateDb) + : m_groupMembers(groupMembers), m_bUpdateDb(bUpdateDb) {} + virtual ~CPVRSearchAndSetChannelIcons() {} + virtual const char *GetType() const { return "pvr-channelgroup-searchandsetchannelicons"; } + + virtual bool DoWork(); + private: + PVR_CHANNEL_GROUP_MEMBERS m_groupMembers; + const bool m_bUpdateDb; + }; } diff --git a/xbmc/settings/Settings.cpp b/xbmc/settings/Settings.cpp index 9940b6aac8..6e13ba61b9 100644 --- a/xbmc/settings/Settings.cpp +++ b/xbmc/settings/Settings.cpp @@ -296,6 +296,7 @@ const std::string CSettings::SETTING_AUDIOCDS_SETTINGS = "audiocds.settings"; const std::string CSettings::SETTING_AUDIOCDS_EJECTONRIP = "audiocds.ejectonrip"; const std::string CSettings::SETTING_MYMUSIC_SONGTHUMBINVIS = "mymusic.songthumbinvis"; const std::string CSettings::SETTING_MYMUSIC_DEFAULTLIBVIEW = "mymusic.defaultlibview"; +const std::string CSettings::SETTING_PICTURES_USETAGS = "pictures.usetags"; const std::string CSettings::SETTING_PICTURES_GENERATETHUMBS = "pictures.generatethumbs"; const std::string CSettings::SETTING_PICTURES_SHOWVIDEOS = "pictures.showvideos"; const std::string CSettings::SETTING_PICTURES_DISPLAYRESOLUTION = "pictures.displayresolution"; diff --git a/xbmc/settings/Settings.h b/xbmc/settings/Settings.h index 482f61db8a..269a3a7413 100644 --- a/xbmc/settings/Settings.h +++ b/xbmc/settings/Settings.h @@ -253,6 +253,7 @@ public: static const std::string SETTING_AUDIOCDS_EJECTONRIP; static const std::string SETTING_MYMUSIC_SONGTHUMBINVIS; static const std::string SETTING_MYMUSIC_DEFAULTLIBVIEW; + static const std::string SETTING_PICTURES_USETAGS; static const std::string SETTING_PICTURES_GENERATETHUMBS; static const std::string SETTING_PICTURES_SHOWVIDEOS; static const std::string SETTING_PICTURES_DISPLAYRESOLUTION; diff --git a/xbmc/utils/StringUtils.cpp b/xbmc/utils/StringUtils.cpp index d30fbf2530..1ba64076d5 100644 --- a/xbmc/utils/StringUtils.cpp +++ b/xbmc/utils/StringUtils.cpp @@ -944,6 +944,8 @@ long StringUtils::TimeStringToSeconds(const std::string &timeString) std::string StringUtils::SecondsToTimeString(long lSeconds, TIME_FORMAT format) { + bool isNegative = lSeconds < 0; + lSeconds = abs(lSeconds); int hh = lSeconds / 3600; lSeconds = lSeconds % 3600; int mm = lSeconds / 60; @@ -960,6 +962,8 @@ std::string StringUtils::SecondsToTimeString(long lSeconds, TIME_FORMAT format) strHMS += StringUtils::Format(strHMS.empty() ? "%2.2i" : ":%2.2i", mm); if (format & TIME_FORMAT_SS) strHMS += StringUtils::Format(strHMS.empty() ? "%2.2i" : ":%2.2i", ss); + if (isNegative) + strHMS = "-" + strHMS; return strHMS; } diff --git a/xbmc/windows/GUIWindowLoginScreen.cpp b/xbmc/windows/GUIWindowLoginScreen.cpp index 5efb4b2052..63fb648c49 100644 --- a/xbmc/windows/GUIWindowLoginScreen.cpp +++ b/xbmc/windows/GUIWindowLoginScreen.cpp @@ -272,6 +272,8 @@ CFileItemPtr CGUIWindowLoginScreen::GetCurrentListItem(int offset) void CGUIWindowLoginScreen::LoadProfile(unsigned int profile) { + CServiceBroker::GetContextMenuManager().Deinit(); + // stop service addons and give it some time before we start it again ADDON::CAddonMgr::GetInstance().StopServices(true); @@ -322,6 +324,9 @@ void CGUIWindowLoginScreen::LoadProfile(unsigned int profile) JSONRPC::CJSONRPC::Initialize(); #endif + // Restart context menu manager + CServiceBroker::GetContextMenuManager().Init(); + // restart PVR services CServiceBroker::GetPVRManager().Reinit(); |