From 725bfb9be06a867a32b22d5a50acefd33eb688cc Mon Sep 17 00:00:00 2001 From: Thilo Graf Date: Thu, 13 Oct 2016 09:23:54 +0200 Subject: [PATCH 1/6] CComponentsText: add missing member to get current font Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/1e388d848c75d5bbec91a03f350fe4d54a79aa9b Author: Thilo Graf Date: 2016-10-13 (Thu, 13 Oct 2016) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/gui/components/cc_item_text.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/gui/components/cc_item_text.h b/src/gui/components/cc_item_text.h index c29e3a9ae..dd26f02ad 100644 --- a/src/gui/components/cc_item_text.h +++ b/src/gui/components/cc_item_text.h @@ -173,6 +173,9 @@ class CComponentsText : public CCTextScreen, public CComponentsItem, public CBox ///returns current text content of text/label object as std::string virtual std::string getText(){return ct_text;}; + ///return current font + Font* getFont(){return ct_font;} + ///set screen x-position, parameter as int virtual void setXPos(const int& xpos); ///set screen y-position, parameter as int From 37df58d673e89c2cb31287f5f961bf921f857ba9 Mon Sep 17 00:00:00 2001 From: Michael Liebmann Date: Fri, 7 Oct 2016 08:53:49 +0200 Subject: [PATCH 2/6] COPKGManager::hasOpkgSupport: Disable directory check If directory /var/lib/opkg resp. /opt/opkg does not exist, it is created by opkg itself Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/1f24e5725a6921c944205cd775fbf9c975bfbd4a Author: Michael Liebmann Date: 2016-10-07 (Fri, 07 Oct 2016) Origin message was: ------------------ COPKGManager::hasOpkgSupport: Disable directory check If directory /var/lib/opkg resp. /opt/opkg does not exist, it is created by opkg itself ------------------ This commit was generated by Migit --- src/gui/opkg_manager.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/gui/opkg_manager.cpp b/src/gui/opkg_manager.cpp index 91e6320ef..cd14a7590 100644 --- a/src/gui/opkg_manager.cpp +++ b/src/gui/opkg_manager.cpp @@ -609,19 +609,22 @@ int COPKGManager::showMenu() bool COPKGManager::hasOpkgSupport() { - string deps[] = {"/var/lib/opkg", /*"/bin/opkg-check-config", "/bin/update-alternatives", "/share/opkg/intercept"*/}; - if (find_executable(OPKG_CL).empty()) { dprintf(DEBUG_NORMAL, "[COPKGManager] [%s - %d]" OPKG_CL " executable not found\n", __func__, __LINE__); return false; } + +#if 0 + /* If directory /var/lib/opkg resp. /opt/opkg + does not exist, it is created by opkg itself */ + string deps[] = {"/var/lib/opkg", /*"/bin/opkg-check-config", "/bin/update-alternatives", "/share/opkg/intercept"*/}; for(size_t i=0; i Date: Fri, 7 Oct 2016 08:53:53 +0200 Subject: [PATCH 3/6] COPKGManager: Fix display description for locally installed packages Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/a0a09f1f7c4ca1fd1d74a7e20e12c4b28fdc752b Author: Michael Liebmann Date: 2016-10-07 (Fri, 07 Oct 2016) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/gui/opkg_manager.cpp | 85 +++++++++++++++++++++++++++++++++++++++- src/gui/opkg_manager.h | 3 ++ 2 files changed, 86 insertions(+), 2 deletions(-) diff --git a/src/gui/opkg_manager.cpp b/src/gui/opkg_manager.cpp index cd14a7590..a0605f430 100644 --- a/src/gui/opkg_manager.cpp +++ b/src/gui/opkg_manager.cpp @@ -628,6 +628,74 @@ bool COPKGManager::hasOpkgSupport() return true; } +string COPKGManager::getInfoDir() +{ + /* /opt/opkg/... is path in patched opkg, /var/lib/opkg/... is original path */ + string dirs[] = {TARGET_PREFIX"/opt/opkg/info", TARGET_PREFIX"/var/lib/opkg/info"}; + for (size_t i = 0; i < sizeof(dirs) / sizeof(dirs[0]); i++) { + if (access(dirs[i].c_str(), R_OK) == 0) + return dirs[i]; + } + dprintf(DEBUG_NORMAL, "[COPKGManager] [%s - %d] InfoDir not found\n", __func__, __LINE__); + return ""; +} + +string COPKGManager::getPkgDescription(std::string pkgName, std::string pkgDesc) +{ + static string infoPath; + if (infoPath.empty()) + infoPath = getInfoDir(); + if (infoPath.empty()) + return pkgDesc; + + string infoFile = infoPath + "/" + pkgName + ".control"; + if (file_exists(infoFile.c_str())) { + FILE* fd = fopen(infoFile.c_str(), "r"); + if (fd == NULL) + return pkgDesc; + + fpos_t fz; + fseek(fd, 0, SEEK_END); + fgetpos(fd, &fz); + fseek(fd, 0, SEEK_SET); + if (fz.__pos == 0) + return pkgDesc; + + char buf[512]; + string package, version, description; + while (fgets(buf, sizeof(buf), fd)) { + if (buf[0] == ' ') + continue; + string line(buf); + trim(line, " "); + string tmp; + /* When pkgDesc is empty, return description only for OM_INFO */ + if (!pkgDesc.empty()) { + tmp = getKeyInfo(line, "Package:", " "); + if (!tmp.empty()) + package = tmp; + tmp = getKeyInfo(line, "Version:", " "); + if (!tmp.empty()) + version = tmp; + } + tmp = getKeyInfo(line, "Description:", " "); + if (!tmp.empty()) + description = tmp; + } + fclose(fd); + + if (pkgDesc.empty()) + return description; + + string desc = package + " - " + version; + if (!description.empty()) + desc += " - " + description; + + return desc; + } + return pkgDesc; +} + void COPKGManager::getPkgData(const int pkg_content_id) { dprintf(DEBUG_INFO, "[COPKGManager] [%s - %d] executing %s\n", __func__, __LINE__, pkg_types[pkg_content_id].c_str()); @@ -675,12 +743,16 @@ void COPKGManager::getPkgData(const int pkg_content_id) continue; switch (pkg_content_id) { - case OM_LIST: + case OM_LIST: { /* do not even put "bad" packages into the list to save memory */ if (badpackage(name)) continue; pkg_map[name] = pkg(name, line, line); + map::iterator it = pkg_map.find(name); + if (it != pkg_map.end()) + it->second.desc = getPkgDescription(name, line); break; + } case OM_LIST_INSTALLED: { map::iterator it = pkg_map.find(name); if (it != pkg_map.end()) @@ -725,8 +797,17 @@ string COPKGManager::getPkgInfo(const string& pkg_name, const string& pkg_key, b execCmd(pkg_types[current_status ? OM_STATUS : OM_INFO] + pkg_name, CShellWindow::QUIET); dprintf(DEBUG_INFO, "[COPKGManager] [%s - %d] [data: %s]\n", __func__, __LINE__, tmp_str.c_str()); - if (pkg_key.empty()) + if (pkg_key.empty()) { + /* When description is empty, read data from InfoDir */ + string tmp = getKeyInfo(tmp_str, "Description:", " "); + if (tmp.empty()) { + tmp = getPkgDescription(pkg_name); + if (!tmp.empty()) { + tmp_str += (string)"\nDescription: " + tmp + "\n"; + } + } return tmp_str; + } return getKeyInfo(tmp_str, pkg_key, ":"); } diff --git a/src/gui/opkg_manager.h b/src/gui/opkg_manager.h index 75865a047..a01894c75 100644 --- a/src/gui/opkg_manager.h +++ b/src/gui/opkg_manager.h @@ -150,6 +150,9 @@ class COPKGManager : public CMenuTarget int doUpdate(); void handleShellOutput(std::string* cur_line, int* res, bool* ok); + std::string getInfoDir(); + std::string getPkgDescription(std::string pkgName, std::string pkgDesc=""); + struct pkg { std::string name; std::string version; From 55a4cee8a94dcae120f7be3f7d54e5e09a0b9f2f Mon Sep 17 00:00:00 2001 From: vanhofen Date: Thu, 13 Oct 2016 15:12:15 +0200 Subject: [PATCH 4/6] settings.h: activate OFFSET defines Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/c4ee6375dacd5754571d95f38340086cf58e7661 Author: vanhofen Date: 2016-10-13 (Thu, 13 Oct 2016) Origin message was: ------------------ - settings.h: activate OFFSET defines ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/system/settings.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/system/settings.h b/src/system/settings.h index 9b9df04ff..3128c4c16 100644 --- a/src/system/settings.h +++ b/src/system/settings.h @@ -887,9 +887,9 @@ const time_settings_struct_t timing_setting[SNeutrinoSettings::TIMING_SETTING_CO // offsets #define OFFSET_SHADOW 6 #define OFFSET_INTER 6 -//#define OFFSET_INNER_LARGE 20 -//#define OFFSET_INNER_MID 10 -//#define OFFSET_INNER_SMALL 5 +#define OFFSET_INNER_LARGE 20 +#define OFFSET_INNER_MID 10 +#define OFFSET_INNER_SMALL 5 struct SglobalInfo From 9c4c93456aa143090de9cd37e510427e00ef97c9 Mon Sep 17 00:00:00 2001 From: vanhofen Date: Thu, 13 Oct 2016 15:12:52 +0200 Subject: [PATCH 5/6] textbox: use OFFSET defines Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/af7643a28592ec63e2e3eb8cbd90f80732bf9f00 Author: vanhofen Date: 2016-10-13 (Thu, 13 Oct 2016) Origin message was: ------------------ - textbox: use OFFSET defines ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/gui/widget/textbox.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gui/widget/textbox.cpp b/src/gui/widget/textbox.cpp index 362ab79e7..53f687c8f 100644 --- a/src/gui/widget/textbox.cpp +++ b/src/gui/widget/textbox.cpp @@ -160,8 +160,8 @@ void CTextBox::initVar(void) m_nLinesPerPage = 0; m_nCurrentLine = 0; m_nCurrentPage = 0; - text_Hborder_width = 8; //border left and right - text_Vborder_width = 8; //border top and buttom + text_Hborder_width = OFFSET_INNER_MID; //border left and right + text_Vborder_width = OFFSET_INNER_MID; //border top and buttom m_cFrame.iX = m_old_x = g_settings.screen_StartX + ((g_settings.screen_EndX - g_settings.screen_StartX - MIN_WINDOW_WIDTH) >>1); m_cFrame.iWidth = m_old_dx = MIN_WINDOW_WIDTH; From 1f4372fd030e5d235fc6c925278966f5657fc3be Mon Sep 17 00:00:00 2001 From: vanhofen Date: Thu, 13 Oct 2016 15:14:03 +0200 Subject: [PATCH 6/6] upnpbrowser: use OFFSET defines; fix color under cursor; minor cleanups Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/c915f857d72ce3e139220171e8afe6523523e51c Author: vanhofen Date: 2016-10-13 (Thu, 13 Oct 2016) Origin message was: ------------------ - upnpbrowser: use OFFSET defines; fix color under cursor; minor cleanups ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/gui/upnpbrowser.cpp | 86 +++++++++++++++++++++++------------------ src/gui/upnpbrowser.h | 7 ++-- 2 files changed, 52 insertions(+), 41 deletions(-) diff --git a/src/gui/upnpbrowser.cpp b/src/gui/upnpbrowser.cpp index 53f5f07ad..83f714faf 100644 --- a/src/gui/upnpbrowser.cpp +++ b/src/gui/upnpbrowser.cpp @@ -4,6 +4,7 @@ UPnP Browser (c) 2007 by Jochen Friedrich (c) 2009-2011,2016 Stefan Seyfried (c) 2016 Thilo Graf + (c) 2016 Sven Hoefer License: GPL @@ -46,9 +47,10 @@ #include #include #include -#include #include #include +#include +#include #include #include @@ -117,8 +119,8 @@ void CUpnpBrowserGui::Init() m_header_height = _title_height; m_footer_height = _title_height; - m_topbox_height = _top_height*3 + 10; // topbox: 3 lines + inner offset + shadow - m_infobox_height = _info_height*2 + 20; // infobox/timebox: 2 lines + inner offset + shadow + m_topbox_height = _top_height*3 + OFFSET_INNER_MID; // topbox: 3 lines + inner offset + m_infobox_height = _info_height*2 + OFFSET_INNER_LARGE; // infobox/timebox: 2 lines + inner offset /* From top to bottom we have: * @@ -188,8 +190,7 @@ int CUpnpBrowserGui::exec(CMenuTarget* parent, const std::string & /*actionKey*/ selectDevice(); - if (CAudioPlayer::getInstance()->getState() != CBaseDec::STOP) - CAudioPlayer::getInstance()->stop(); + stopAudio(); // Start Sectionsd g_Sectionsd->setPauseScanning(false); @@ -854,9 +855,8 @@ bool CUpnpBrowserGui::selectItem(std::string id) m_playid++; } else if (msg == CRCInput::RC_yellow) { - if (CAudioPlayer::getInstance()->getState() != CBaseDec::STOP) - CAudioPlayer::getInstance()->stop(); m_folderplay = false; + stopAudio(); } else if (m_folderplay && msg == (neutrino_msg_t) CRCInput::RC_stop) { timeout = 0; @@ -872,8 +872,7 @@ bool CUpnpBrowserGui::selectItem(std::string id) } else if (m_folderplay && msg == (neutrino_msg_t) CRCInput::RC_next) { timeout = 0; - if (CAudioPlayer::getInstance()->getState() != CBaseDec::STOP) - CAudioPlayer::getInstance()->stop(); + stopAudio(); } else if (msg == NeutrinoMessages::RECORD_START || msg == NeutrinoMessages::ZAPTO || @@ -905,6 +904,17 @@ bool CUpnpBrowserGui::selectItem(std::string id) } } +#if 0 + /* + maybe it's better to stop audio here, + because infobox and timebox will never been painted and updated + */ + if (endall) + { + stopAudio(); + } +#endif + delete entries; timeout = 0; m_frameBuffer->Clear(); @@ -945,8 +955,8 @@ void CUpnpBrowserGui::paintDevice(unsigned int _pos) unsigned int pos = m_deviceliststart + _pos; if (pos == m_selecteddevice) { - color = COL_MENUCONTENT_TEXT_PLUS_2; - bgcolor = COL_MENUCONTENT_PLUS_2; + color = COL_MENUCONTENTSELECTED_TEXT; + bgcolor = COL_MENUCONTENTSELECTED_PLUS_0; paintDeviceInfo(); } else @@ -959,17 +969,12 @@ void CUpnpBrowserGui::paintDevice(unsigned int _pos) if (pos >= m_devices.size()) return; - char sNr[20]; - sprintf(sNr, "%2d", pos + 1); - std::string num = sNr; - + std::string num = to_string(pos + 1); std::string name = m_devices[pos].friendlyname; - int w = g_Font[font_item]->getRenderWidth(name) + 5; - g_Font[font_item]->RenderString(m_x + 10, ypos + m_item_height, m_width - 30 - w, - num, color, m_item_height); - g_Font[font_item]->RenderString(m_x + m_width - 15 - w, ypos + m_item_height, - w, name, color, m_item_height); + int w = g_Font[font_item]->getRenderWidth(name); + g_Font[font_item]->RenderString(m_x + OFFSET_INNER_MID, ypos + m_item_height, m_width - 15 - OFFSET_INNER_MID - w, num, color, m_item_height); + g_Font[font_item]->RenderString(m_x + m_width - 15 - OFFSET_INNER_MID - w, ypos + m_item_height, w, name, color, m_item_height); } void CUpnpBrowserGui::paintDevices() @@ -1007,7 +1012,7 @@ void CUpnpBrowserGui::paintDevices() // Foot footer.paintButtons(m_x, m_footer_y, m_width, m_footer_height, 1, &RescanButton, m_width/2); - paintItem2DetailsLine (-1); // clear it + paintItem2DetailsLine(-1); // clear it } void CUpnpBrowserGui::paintItem(std::vector *entries, unsigned int pos, unsigned int selected) @@ -1038,9 +1043,9 @@ void CUpnpBrowserGui::paintItem(std::vector *entries, unsigned int po paintItemInfo(entry); paintDetails(entry); if (entry->isdir) - paintItem2DetailsLine (-1); // clear it + paintItem2DetailsLine(-1); // clear it else - paintItem2DetailsLine (pos); + paintItem2DetailsLine(pos); } int preferred=entry->preferred; @@ -1066,7 +1071,7 @@ void CUpnpBrowserGui::paintItem(std::vector *entries, unsigned int po } std::string name = entry->title; - char tmp_time[] = "00:00:00.0"; + char tmp_time[] = "0:00:00.00"; int w = g_Font[font_item]->getRenderWidth(tmp_time); int icon_w = 0; @@ -1075,11 +1080,11 @@ void CUpnpBrowserGui::paintItem(std::vector *entries, unsigned int po m_frameBuffer->getIconSize(fileicon.c_str(), &icon_w, &icon_h); if (icon_w && icon_h) { - icon_o = icon_w + 10; - m_frameBuffer->paintIcon(fileicon, m_x + 10, ypos + (m_item_height - icon_h) / 2); + icon_o = icon_w + OFFSET_INNER_MID; + m_frameBuffer->paintIcon(fileicon, m_x + OFFSET_INNER_MID, ypos + (m_item_height - icon_h)/2); } - g_Font[font_item]->RenderString(m_x + m_width - 15 - 10 - w, ypos + m_item_height, w, info, color, m_item_height); - g_Font[font_item]->RenderString(m_x + 10 + icon_o, ypos + m_item_height, m_width - icon_o - 15 - 2*10 - w, name, color, m_item_height); + g_Font[font_item]->RenderString(m_x + OFFSET_INNER_MID + icon_o, ypos + m_item_height, m_width - 15 - OFFSET_INNER_MID - w, name, color, m_item_height); + g_Font[font_item]->RenderString(m_x + m_width - 15 - OFFSET_INNER_MID - w, ypos + m_item_height, w, info, color, m_item_height); } void CUpnpBrowserGui::paintItemInfo(UPnPEntry *entry) @@ -1125,7 +1130,7 @@ void CUpnpBrowserGui::paintItemInfo(UPnPEntry *entry) int h_image = infobox.getHeight() - OFFSET_INTER - infobox.getCornerRadius(); int y_image = infobox.getYPos() + infobox.getHeight()/2 - h_image/2; if (!image){ - image = new CComponentsPicture(100, y_image, tmpname, NULL, CC_SHADOW_OFF, COL_MENUCONTENTDARK_PLUS_0); + image = new CComponentsPicture(0, y_image, tmpname, NULL, CC_SHADOW_OFF, COL_MENUCONTENTDARK_PLUS_0); image->doPaintBg(false); image->SetTransparent(CFrameBuffer::TM_BLACK); } @@ -1161,7 +1166,6 @@ void CUpnpBrowserGui::paintItems(std::vector *entry, unsigned int sel CComponentsHeader header(m_x, m_header_y, m_width, m_header_height, name, NEUTRINO_ICON_UPNP); if (CNeutrinoApp::getInstance()->isMuted()) header.setContextButton(NEUTRINO_ICON_BUTTON_MUTE_SMALL); - //header.enableShadow(); header.paint(CC_SAVE_SCREEN_NO); // Items @@ -1179,25 +1183,23 @@ void CUpnpBrowserGui::paintItems(std::vector *entry, unsigned int sel sbh = 2; m_frameBuffer->paintBoxRel(m_x + m_width - 13, m_item_y + 2 + sbs*((sb-4)/sbc+sbh), 11, (sb-4)/sbc + sbh, COL_SCROLLBAR_ACTIVE_PLUS_0); - //shadow - //m_frameBuffer->paintBoxRel(m_x + m_width, m_item_y + OFFSET_SHADOW, OFFSET_SHADOW, sb, COL_SHADOW_PLUS_0); - // Foot buttons size_t numbuttons = sizeof(BrowseButtons)/sizeof(BrowseButtons[0]); - footer.paintButtons(m_x, m_footer_y, m_width, m_footer_height, numbuttons, BrowseButtons, m_width/numbuttons); } void CUpnpBrowserGui::paintDetails(UPnPEntry *entry, bool use_playing) { // Foot info - int timebox_width = m_infobox_height; // maybe not enough + char tmp_time[] = "000:00"; + int timebox_width = timebox.getFont()->getRenderWidth(tmp_time) + OFFSET_INNER_MID*2; infobox.setDimensionsAll(m_x, m_infobox_y, m_width - OFFSET_SHADOW - OFFSET_INTER - timebox_width, m_infobox_height); - timebox.setDimensionsAll(m_x + m_width - timebox_width, infobox.getYPos(), m_infobox_height, timebox_width); + timebox.setDimensionsAll(m_x + m_width - timebox_width, infobox.getYPos(), timebox_width, m_infobox_height); printf("paintDetails: use_playing %d shown %d\n", use_playing, m_playing_entry_is_shown); if ((!use_playing) && entry->isdir){ infobox.kill(); + timebox.kill(); m_playing_entry_is_shown = false; }else{ string text = ""; @@ -1226,7 +1228,7 @@ void CUpnpBrowserGui::paintDetails(UPnPEntry *entry, bool use_playing) } } -void CUpnpBrowserGui::paintItem2DetailsLine (int pos) +void CUpnpBrowserGui::paintItem2DetailsLine(int pos) { if (pos < 0) return; @@ -1239,7 +1241,7 @@ void CUpnpBrowserGui::paintItem2DetailsLine (int pos) if (!dline) dline = new CComponentsDetailLine(); - dline->setDimensionsAll(xpos, ypos1a, ypos2, m_item_height/2, infobox.getHeight()-RADIUS_LARGE*2); + dline->setDimensionsAll(xpos, ypos1a, ypos2, m_item_height/2, infobox.getHeight() - RADIUS_LARGE*2); dline->paint(); } @@ -1274,6 +1276,14 @@ void CUpnpBrowserGui::playAudio(std::string name, int type) CNeutrinoApp::getInstance()->handleMsg(NeutrinoMessages::CHANGEMODE, NeutrinoMessages::mode_upnp | NeutrinoMessages::norezap); } +void CUpnpBrowserGui::stopAudio() +{ + if (CAudioPlayer::getInstance()->getState() != CBaseDec::STOP) + { + CAudioPlayer::getInstance()->stop(); + } +} + void CUpnpBrowserGui::showPicture(std::string name) { CNeutrinoApp::getInstance()->handleMsg(NeutrinoMessages::CHANGEMODE, NeutrinoMessages::mode_pic); diff --git a/src/gui/upnpbrowser.h b/src/gui/upnpbrowser.h index 5c768d018..2ab2df4e5 100644 --- a/src/gui/upnpbrowser.h +++ b/src/gui/upnpbrowser.h @@ -105,7 +105,7 @@ class CUpnpBrowserGui : public CMenuTarget, public CListHelpers bool discoverDevices(); void splitProtocol(std::string &protocol, std::string &prot, std::string &network, std::string &mime, std::string &additional); - bool getResults(std::string id, unsigned int start, unsigned int count, std::list &results); + bool getResults(std::string id, unsigned int start, unsigned int count, std::list &results); std::vector *decodeResult(std::string); void Init(); void updateDeviceSelection(int newpos); @@ -119,13 +119,14 @@ class CUpnpBrowserGui : public CMenuTarget, public CListHelpers bool updateItemSelection(std::string id, std::vector * &entries, int newpos, unsigned int &selected, unsigned int &liststart); bool selectItem(std::string); void paintItems(std::vector *entry, unsigned int selected, unsigned int max, unsigned int offset); - void paintItem (std::vector *entry, unsigned int pos, unsigned int selected); + void paintItem(std::vector *entry, unsigned int pos, unsigned int selected); void paintItemInfo(UPnPEntry *entry); void paintDetails(UPnPEntry *entry, bool use_playing = false); - void paintItem2DetailsLine (int pos); + void paintItem2DetailsLine(int pos); void updateTimes(const bool force = false); void playAudio(std::string name, int type); + void stopAudio(); void showPicture(std::string name); void playVideo(std::string name, std::string url); };