radiotext: rework radiotext handling

Radiotext moved into a separate class and will be shown with screensaver.


Origin commit data
------------------
Commit: d995d2b8f8
Author: Thilo Graf <dbt@novatux.de>
Date: 2020-01-05 (Sun, 05 Jan 2020)
This commit is contained in:
2020-01-05 22:22:22 +01:00
committed by vanhofen
parent de56424c45
commit 05d59d08ce
12 changed files with 741 additions and 189 deletions

View File

@@ -58,7 +58,7 @@
#include <pthread.h>
#include <ctype.h>
#include <config.h>
#include <system/debug.h>
#include <global.h>
#include <system/settings.h>
#include <system/set_threadname.h>
@@ -67,6 +67,7 @@
#include "radiotext.h"
#include "radiotools.h"
#include <gui/radiotext_window.h>
rtp_classes rtp_content;
@@ -396,8 +397,17 @@ fprintf(stderr, "MEC=0x%02x DSN=0x%02x PSN=0x%02x MEL=%02d STATUS=0x%02x MFL=%02
S_RtOsd = 1;
RT_Info = (RT_Info > 0) ? RT_Info : 1;
RadioStatusMsg();
if (!OnAfterDecodeLine.empty()) {
if (!OnAfterDecodeLine.blocked()){
dprintf(DEBUG_DEBUG, "\033[36m[CRadioText] %s - %d: signal OnAfterDecodeLine contains %d slot(s)\033[0m\n", __func__, __LINE__, (int)OnAfterDecodeLine.size());
OnAfterDecodeLine();
}
else{
dprintf(DEBUG_DEBUG, "\033[31m[CRadioText] %s - %d: signal OnAfterDecodeLine blocked\033[0m\n", __func__, __LINE__);
}
}
}
else if (RTP_TToggle > 0 && mtext[5] == 0x46 && S_RtFunc >= 2) { // RTplus tags V2.0, only if RT
if (mtext[6] > leninfo-2 || mtext[6] != 8) { // byte 6 = MEL, only 8 byte for 2 tags
@@ -670,6 +680,10 @@ CRadioText::~CRadioText(void)
radiotext_stop();
cond.broadcast();
OpenThreads::Thread::join();
if (g_RadiotextWin){
delete g_RadiotextWin;
g_RadiotextWin = NULL;
}
printf("CRadioText::~CRadioText done\n");
}
@@ -722,6 +736,10 @@ void CRadioText::radiotext_stop(void)
void CRadioText::setPid(uint inPid)
{
printf("CRadioText::setPid: ###################### old pid 0x%x new pid 0x%x ######################\n", pid, inPid);
if (!g_RadiotextWin){
g_RadiotextWin = new CRadioTextGUI();
g_RadiotextWin->allowPaint(false);
}
if (pid != inPid) {
mutex.lock();
pid = inPid;

View File

@@ -95,6 +95,8 @@ class CVideoSettings;
NEUTRINO_CPP CVideoSettings *g_videoSettings;
class CRadioText;
NEUTRINO_CPP CRadioText *g_Radiotext;
class CRadioTextGUI;
NEUTRINO_CPP CRadioTextGUI *g_RadiotextWin;
#ifndef DISABLE_GUI_MOUNT
#define ENABLE_GUI_MOUNT

View File

@@ -90,6 +90,7 @@ libneutrino_gui_a_SOURCES = \
plugins.cpp \
plugins_hide.cpp \
proxyserver_setup.cpp \
radiotext_window.cpp \
rc_lock.cpp \
record_setup.cpp \
scan.cpp \

View File

@@ -277,7 +277,7 @@ void CInfoViewer::initClock()
clock->setClockFormat("%H:%M", "%H %M");
}
CInfoClock::getInstance()->disableInfoClock();
CInfoClock::getInstance()->block();
clock->clear();
clock->enableColBodyGradient(gradient_top, COL_INFOBAR_PLUS_0);
clock->doPaintBg(!gradient_top);
@@ -589,10 +589,6 @@ void CInfoViewer::showMovieTitle(const int playState, const t_channel_id &Channe
zap_mode = _zap_mode;
reset_allScala();
if (g_settings.radiotext_enable && g_Radiotext) {
g_Radiotext->RT_MsgShow = true;
}
if(!is_visible)
fader.StartFadeIn();
@@ -945,7 +941,7 @@ void CInfoViewer::showTitle(CZapitChannel * channel, const bool calledFromNumZap
if (CNeutrinoApp::getInstance()->getMode() == NeutrinoModes::mode_radio || CNeutrinoApp::getInstance()->getMode() == NeutrinoModes::mode_webradio)
{
if ((g_settings.radiotext_enable) && (!recordModeActive) && (!calledFromNumZap))
showRadiotext();
enableRadiotext();
else if (showButtonBar)
infoViewerBB->showIcon_RadioText(false);
}
@@ -1241,7 +1237,7 @@ void CInfoViewer::loop(bool show_dot)
show_dot = !show_dot;
showInfoFile();
if ((g_settings.radiotext_enable) && (CNeutrinoApp::getInstance()->getMode() == NeutrinoModes::mode_radio))
showRadiotext();
enableRadiotext();
infoViewerBB->showIcon_16_9();
//infoViewerBB->paint_ca_icons(0);
@@ -1448,111 +1444,12 @@ void CInfoViewer::showMotorMoving (int duration)
ShowHint (LOCALE_MESSAGEBOX_INFO, text, g_Font[SNeutrinoSettings::FONT_TYPE_MENU]->getRenderWidth(text) + 2*OFFSET_INNER_MID, duration);
}
void CInfoViewer::killRadiotext()
void CInfoViewer::enableRadiotext() //TODO: remove this roundabout way
{
if (g_Radiotext->S_RtOsd)
frameBuffer->paintBackgroundBoxRel(rt_x, rt_y, rt_w + OFFSET_SHADOW, rt_h + OFFSET_SHADOW);
rt_x = rt_y = rt_h = rt_w = 0;
CInfoClock::getInstance()->enableInfoClock(true);
//NI InfoIcons
if (!g_settings.mode_icons && g_settings.mode_icons_skin == INFOICONS_INFOVIEWER)
CInfoIcons::getInstance()->paintIcons(true);
else
CInfoIcons::getInstance()->enableInfoIcons(true);
}
void CInfoViewer::showRadiotext()
{
/*
Maybe there's a nice CComponents solution with user's gradients.
*/
if (g_Radiotext == NULL)
return;
OnEnableRadiotext();
if (showButtonBar)
infoViewerBB->showIcon_RadioText(g_Radiotext->haveRadiotext());
char stext[3][100];
bool RTisUTF8 = false;
if (g_Radiotext->S_RtOsd)
{
CInfoClock::getInstance()->enableInfoClock(false);
//NI InfoIcons
if (!g_settings.mode_icons && g_settings.mode_icons_skin == INFOICONS_INFOVIEWER)
CInfoIcons::getInstance()->hideIcons();
else
CInfoIcons::getInstance()->enableInfoIcons(false);
int rt_font = SNeutrinoSettings::FONT_TYPE_INFOBAR_INFO;
int item_h = g_Font[rt_font]->getHeight();
// dimensions of radiotext window
rt_x = BoxStartX;
rt_y = g_settings.screen_StartY + OFFSET_INNER_MID;
rt_w = BoxEndX - BoxStartX;
rt_h = (g_Radiotext->S_RtOsdRows + 1)*item_h + 4*OFFSET_INNER_SMALL;
int item_x = rt_x + OFFSET_INNER_MID;
int item_y = rt_y + OFFSET_INNER_SMALL + item_h;
int item_w = rt_w - 2*OFFSET_INNER_MID;
int item = 0;
int lines = 0;
for (int i = 0; i < g_Radiotext->S_RtOsdRows; i++)
{
if (g_Radiotext->RT_Text[i][0] != '\0')
lines++;
}
if (lines == 0)
frameBuffer->paintBackgroundBoxRel(rt_x, rt_y, rt_w + OFFSET_SHADOW, rt_h + OFFSET_SHADOW);
if (g_Radiotext->RT_MsgShow)
{
// Title
if (g_Radiotext->S_RtOsdTitle == 1)
{
if (lines || g_Radiotext->RT_PTY != 0)
{
sprintf(stext[0], g_Radiotext->RT_PTY == 0 ? "%s %s%s" : "%s (%s)%s", tr("Radiotext"), g_Radiotext->RT_PTY == 0 ? g_Radiotext->RDS_PTYN : g_Radiotext->ptynr2string(g_Radiotext->RT_PTY), ":");
int title_w = g_Font[rt_font]->getRenderWidth(stext[0]) + 2*OFFSET_INNER_MID;
frameBuffer->paintBoxRel(rt_x + OFFSET_SHADOW, rt_y + OFFSET_SHADOW, title_w, 2*OFFSET_INNER_SMALL + item_h, COL_SHADOW_PLUS_0, RADIUS_LARGE, CORNER_TOP);
frameBuffer->paintBoxRel(rt_x, rt_y, title_w, 2*OFFSET_INNER_SMALL + item_h, COL_INFOBAR_PLUS_0, RADIUS_LARGE, CORNER_TOP);
g_Font[rt_font]->RenderString(item_x, item_y, title_w, stext[0], COL_INFOBAR_TEXT, 0, RTisUTF8);
}
item = 1;
}
// Body
if (lines)
{
frameBuffer->paintBoxRel(rt_x + OFFSET_SHADOW, rt_y + 2*OFFSET_INNER_SMALL + item_h + OFFSET_SHADOW, rt_w, item_h*g_Radiotext->S_RtOsdRows + 2*OFFSET_INNER_SMALL, COL_SHADOW_PLUS_0, RADIUS_LARGE, item == 1 ? CORNER_TOP_RIGHT|CORNER_BOTTOM : CORNER_ALL);
frameBuffer->paintBoxRel(rt_x, rt_y + 2*OFFSET_INNER_SMALL + item_h, rt_w, item_h*g_Radiotext->S_RtOsdRows + 2*OFFSET_INNER_SMALL, COL_INFOBAR_PLUS_0, RADIUS_LARGE, item == 1 ? CORNER_TOP_RIGHT|CORNER_BOTTOM : CORNER_ALL);
item_y += 2*OFFSET_INNER_SMALL;
// RT-Text roundloop
int index = (g_Radiotext->RT_Index == 0) ? g_Radiotext->S_RtOsdRows - 1 : g_Radiotext->RT_Index - 1;
if (g_Radiotext->S_RtOsdLoop == 1) // latest bottom
{
for (int i = index + 1; i < g_Radiotext->S_RtOsdRows; i++)
g_Font[rt_font]->RenderString(item_x, item_y + (item++)*item_h, item_w, g_Radiotext->RT_Text[i], COL_INFOBAR_TEXT, 0, RTisUTF8);
for (int i = 0; i <= index; i++)
g_Font[rt_font]->RenderString(item_x, item_y + (item++)*item_h, item_w, g_Radiotext->RT_Text[i], COL_INFOBAR_TEXT, 0, RTisUTF8);
}
else // latest top
{
for (int i = index; i >= 0; i--)
g_Font[rt_font]->RenderString(item_x, item_y + (item++)*item_h, item_w, g_Radiotext->RT_Text[i], COL_INFOBAR_TEXT, 0, RTisUTF8);
for (int i = g_Radiotext->S_RtOsdRows - 1; i > index; i--)
g_Font[rt_font]->RenderString(item_x, item_y + (item++)*item_h, item_w, g_Radiotext->RT_Text[i], COL_INFOBAR_TEXT, 0, RTisUTF8);
}
}
}
}
g_Radiotext->RT_MsgShow = false;
}
int CInfoViewer::handleMsg (const neutrino_msg_t msg, neutrino_msg_data_t data)
@@ -2271,8 +2168,11 @@ void CInfoViewer::killTitle()
//printf("killTitle(%d, %d, %d, %d)\n", BoxStartX, BoxStartY, BoxEndX + OFFSET_SHADOW, BoxEndY);
//frameBuffer->paintBackgroundBox(BoxStartX, BoxStartY, BoxEndX + OFFSET_SHADOW, BoxEndY);
}
showButtonBar = false;
CInfoClock::getInstance()->enableInfoClock();
OnAfterKillTitle();
}
#if 0

View File

@@ -44,7 +44,7 @@
class CFrameBuffer;
class COSDFader;
class CInfoViewerBB;
class CInfoViewer
class CInfoViewer : public sigc::trackable
{
private:
@@ -133,8 +133,7 @@ class CInfoViewer
void showMotorMoving(int duration);
void showLcdPercentOver();
int showChannelLogo(const t_channel_id logo_channel_id, const int channel_number_width);
void showRadiotext();
void killRadiotext();
void enableRadiotext();
//small infobox, shows a small textbox with a short message text,
//text must be located in a file named /tmp/infobar.txt
@@ -224,5 +223,7 @@ class CInfoViewer
inline t_channel_id get_current_channel_id(void) { return current_channel_id; }
void ResetModules();
bool hasTimeout();
sigc::signal<void> OnAfterKillTitle;
sigc::signal<void> OnEnableRadiotext;
};
#endif

View File

@@ -13,6 +13,7 @@
#include <gui/timeosd.h>
#include <gui/volumebar.h>
#include <gui/osd_helpers.h>
#include <gui/radiotext_window.h>
#include <hardware/video.h>
@@ -41,6 +42,7 @@ COsdHelpers* COsdHelpers::getInstance()
#ifdef ENABLE_CHANGE_OSD_RESOLUTION
void COsdHelpers::changeOsdResolution(uint32_t mode, bool automode/*=false*/, bool forceOsdReset/*=false*/)
{
OnBeforeChangeResolution();
size_t idx = 0;
bool resetOsd = false;
uint32_t modeNew;
@@ -97,7 +99,7 @@ void COsdHelpers::changeOsdResolution(uint32_t mode, bool automode/*=false*/, bo
//printf("\n>>>>>[%s:%d] New res: %dx%dx%d\n \n", __func__, __LINE__, resW, resH, bpp);
g_settings.osd_resolution = modeNew;
if (InfoClock)
InfoClock->disableInfoClock();
InfoClock->StopInfoClock(true);
frameBuffer->Clear();
if (resetOsd) {
CNeutrinoApp::getInstance()->setScreenSettings();
@@ -122,6 +124,11 @@ void COsdHelpers::changeOsdResolution(uint32_t mode, bool automode/*=false*/, bo
g_InfoViewer->showTitle(CNeutrinoApp::getInstance()->channelList->getActiveChannel(), true, 0, true);
CNeutrinoApp::getInstance()->StartSubtitles();
}
if (g_RadiotextWin) {
delete g_RadiotextWin;
g_RadiotextWin = new CRadioTextGUI();
g_RadiotextWin->allowPaint(false);
}
}
OnAfterChangeResolution();
}

View File

@@ -54,6 +54,7 @@
#include <gui/widget/icons.h>
#include <gui/widget/colorchooser.h>
#include <gui/widget/stringinput.h>
#include <gui/radiotext_window.h>
#include <driver/screen_max.h>
#include <driver/neutrinofonts.h>
@@ -176,7 +177,9 @@ const SNeutrinoSettings::FONT_TYPES other_font_sizes[] =
SNeutrinoSettings::FONT_TYPE_WINDOW_GENERAL,
SNeutrinoSettings::FONT_TYPE_SUBTITLES,
SNeutrinoSettings::FONT_TYPE_FILEBROWSER_ITEM,
SNeutrinoSettings::FONT_TYPE_BUTTON_TEXT
SNeutrinoSettings::FONT_TYPE_BUTTON_TEXT,
SNeutrinoSettings::FONT_TYPE_WINDOW_RADIOTEXT_TITLE,
SNeutrinoSettings::FONT_TYPE_WINDOW_RADIOTEXT_DESC
};
size_t other_font_items = sizeof(other_font_sizes)/sizeof(other_font_sizes[0]);
@@ -234,7 +237,9 @@ font_sizes_struct neutrino_font[SNeutrinoSettings::FONT_TYPE_COUNT] =
{LOCALE_FONTSIZE_SUBTITLES , 25, CNeutrinoFonts::FONT_STYLE_BOLD , 0},
{LOCALE_FONTSIZE_MESSAGE_TEXT , 20, CNeutrinoFonts::FONT_STYLE_BOLD , 0},
{LOCALE_FONTSIZE_BUTTON_TEXT , 14, CNeutrinoFonts::FONT_STYLE_REGULAR, 0},
{LOCALE_FONTSIZE_GENERAL_WINDOW_TEXT, 20, CNeutrinoFonts::FONT_STYLE_REGULAR, 1}
{LOCALE_FONTSIZE_GENERAL_WINDOW_TEXT, 20, CNeutrinoFonts::FONT_STYLE_REGULAR, 1},
{LOCALE_FONTSIZE_WINDOW_RADIOTEXT_DESC0, 22, CNeutrinoFonts::FONT_STYLE_REGULAR, 1},
{LOCALE_FONTSIZE_WINDOW_RADIOTEXT_DESC1 , 17, CNeutrinoFonts::FONT_STYLE_REGULAR, 1}
};
int COsdSetup::exec(CMenuTarget* parent, const std::string &actionKey)
@@ -1659,10 +1664,20 @@ bool COsdSetup::changeNotify(const neutrino_locale_t OptionName, void * data)
void COsdSetup::resetRadioText()
{
if (getenv("SIMULATE_FE")){
dprintf(DEBUG_NORMAL, "\033[33m[COsdSetup][%s - %d] SIMULATE_FE is set, no radiotext function availavble \033[0m\n", __func__, __LINE__);
return;
}
if (g_settings.radiotext_enable) {
if (g_Radiotext == NULL)
g_Radiotext = new CRadioText;
if (g_Radiotext && ((CNeutrinoApp::getInstance()->getMode()) == NeutrinoModes::mode_radio)){
if (g_RadiotextWin){
delete g_RadiotextWin;
g_RadiotextWin = NULL;
}
unsigned int pid = 0;
if(!g_RemoteControl->current_PIDs.APIDs.empty())
pid = g_RemoteControl->current_PIDs.APIDs[g_RemoteControl->current_PIDs.PIDs.selected_apid].pid;

View File

@@ -0,0 +1,378 @@
/*
Based up Neutrino-GUI - Tuxbox-Project
Copyright (C) 2001 by Steffen Hehn 'McClean'
Class for radio text handling
Copyright (C) 2019, Thilo Graf 'dbt'
License: GPL
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <global.h>
#include <neutrino.h>
#include "radiotext_window.h"
#include "infoclock.h"
#include "screensaver.h"
#include "infoviewer.h"
#include <driver/radiotext.h>
#include <driver/fontrenderer.h>
#include <zapit/zapit.h>
#include <system/helpers.h>
#include <system/debug.h>
#include <mutex>
#include <stdexcept>
#define MAX_TITLE_LINES 1
#define MAX_DESC_LINES 2
using namespace std;
CRadioTextGUI::CRadioTextGUI() : CComponentsWindow(0, 0, CFrameBuffer::getInstance()->getScreenWidth() - 2*OFFSET_INNER_MID, 0, "")
{
Init();
}
CRadioTextGUI::~CRadioTextGUI()
{
dprintf(DEBUG_DEBUG, "\033[32m[CRadioTextGUI] %s - %d delete radiotext window instance\033[0m\n", __func__, __LINE__);
}
void CRadioTextGUI::Init()
{
cc_item_type.name = "radiotext_window";
if (!g_Radiotext)
return;
dprintf(DEBUG_DEBUG, "\033[32m[CRadioTextGUI] %s - %d init radiotext window handler\033[0m\n", __func__, __LINE__);
initSlots();
font1 = g_Font[SNeutrinoSettings::FONT_TYPE_WINDOW_RADIOTEXT_TITLE];
font2 = g_Font[SNeutrinoSettings::FONT_TYPE_WINDOW_RADIOTEXT_DESC];
height = (MAX_DESC_LINES * font1->getHeight()) + (ccw_head->getHeight() + 2*OFFSET_INNER_MID);
shadow = CC_SHADOW_ON;
ccw_show_footer = false;
shadow_force = true;
channel_id_pair.first = CZapit::getInstance()->GetCurrentChannelID();
channel_id_pair.second = 0;
#if 0 // gradient mode for header with infobar properties
ccw_head->setColorBody(g_settings.theme.infobar_gradient_top ? COL_MENUHEAD_PLUS_0 : COL_INFOBAR_PLUS_0);
ccw_head->enableColBodyGradient(g_settings.theme.infobar_gradient_top, COL_INFOBAR_PLUS_0, g_settings.theme.infobar_gradient_top_direction);
#endif
ccw_body->setColorBody(g_settings.theme.infobar_gradient_body ? COL_MENUHEAD_PLUS_0 : COL_INFOBAR_PLUS_0);
ccw_body->enableColBodyGradient(g_settings.theme.infobar_gradient_body, COL_INFOBAR_PLUS_0, g_settings.theme.infobar_gradient_body_direction);
}
void CRadioTextGUI::initSlots()
{
// paint rt window if any decoded lines are available
sl_after_decode_line = sigc::bind(sigc::mem_fun(*this, &CRadioTextGUI::paint), false);
g_Radiotext->OnAfterDecodeLine.connect(sl_after_decode_line);
// unblock paint of rt window if screensaver is started
sl_on_start_screensaver = sigc::bind(sigc::mem_fun(*this, &CRadioTextGUI::allowPaint), true);
CScreenSaver::getInstance()->OnAfterStart.connect(sl_on_start_screensaver);
// block paint of screensaver if screensaver was sopped
sl_on_stop_screensaver = sigc::bind(sigc::mem_fun(*this, &CRadioTextGUI::allowPaint), false);
CScreenSaver::getInstance()->OnAfterStop.connect(sl_on_stop_screensaver);
// reset position of rt window if screensaver was stopped, because rt window position would be changed inside screensaver
sl_on_stop_screensaver = sigc::mem_fun(*this, &CRadioTextGUI::resetPos);
CScreenSaver::getInstance()->OnAfterStop.connect(sl_on_stop_screensaver);
// cleanup saved background while stopping screensaver
sl_on_stop_screensaver = sigc::mem_fun(*this, (&CRadioTextGUI::_clearSavedScreen));
CScreenSaver::getInstance()->OnAfterStop.connect(sl_on_stop_screensaver);
// remove rt window from screen if infoviewer was closed
sl_on_after_kill_infobar = sigc::bind(sigc::mem_fun(*this, &CRadioTextGUI::kill), COL_BACKGROUND_PLUS_0, -1, ~CC_FBDATA_TYPES);
g_InfoViewer->OnAfterKillTitle.connect(sl_on_after_kill_infobar);
// allow paint of rt window if infoviewer gives commands
sl_on_show_radiotext = sigc::bind(sigc::mem_fun(*this, &CRadioTextGUI::allowPaint), true);
g_InfoViewer->OnEnableRadiotext.connect(sl_on_show_radiotext);
}
bool CRadioTextGUI::GetData()
{
if (g_Radiotext == NULL)
return false;
// if (showButtonBar)
// infoViewerBB->showIcon_RadioText(g_Radiotext->haveRadiotext()); ///callback???
//
std::mutex mutex;
std::lock_guard<std::mutex> lg(mutex);
char stext[3][100];
// cleanup lines on changed channel and clean up cached lines
channel_id_pair.first = CZapit::getInstance()->GetCurrentChannelID();
if (channel_id_pair.first != channel_id_pair.second){
clearLines();
channel_id_pair.second = CZapit::getInstance()->GetCurrentChannelID();
}
if (g_Radiotext->S_RtOsd)
{
int lines = 0;
for (int i = 0; i < g_Radiotext->S_RtOsdRows; i++)
{
if (g_Radiotext->RT_Text[i][0] != '\0')
lines++;
}
// if (lines)
// {
// clean up title before generate new lines
// clearLines()
// }
if (g_Radiotext->RT_MsgShow) // TODO: remove unused desc lines from vector, maybe more than one lines are not really sensefully
{
// title line(s)
if (g_Radiotext->S_RtOsdTitle == 1)
{
if (lines || g_Radiotext->RT_PTY != 0)
{
snprintf(stext[0], sizeof(stext[0]),g_Radiotext->RT_PTY == 0 ? "%s %s%s" : "%s (%s)%s", tr("Radiotext"), g_Radiotext->RT_PTY == 0 ? g_Radiotext->RDS_PTYN : g_Radiotext->ptynr2string(g_Radiotext->RT_PTY), ":");
if (!isDubLine(v_lines_title, stext[0]))
addLine(v_lines_title, stext[0]);
}
}
// collecting...
if (lines)
{
// RT-Text roundloop
int index = (g_Radiotext->RT_Index == 0) ? g_Radiotext->S_RtOsdRows - 1 : g_Radiotext->RT_Index - 1;
if (g_Radiotext->S_RtOsdLoop == 1) // ...description lines, latest bottom
{
for (int i = index + 1; i < g_Radiotext->S_RtOsdRows; i++)
{
if (!string(g_Radiotext->RT_Text[i]).empty())
if (!isDubLine(v_lines_desc, g_Radiotext->RT_Text[i]))
addLine(v_lines_desc, g_Radiotext->RT_Text[i]);
}
for (int i = 0; i <= index; i++)
{
if (!string(g_Radiotext->RT_Text[i]).empty())
if (!isDubLine(v_lines_desc, g_Radiotext->RT_Text[i]))
addLine(v_lines_desc, g_Radiotext->RT_Text[i]);
}
}
else // ...title line(s), latest top
{
for (int i = index; i >= 0; i--)
{
if (!string(g_Radiotext->RT_Text[i]).empty())
if (!isDubLine(v_lines_desc, g_Radiotext->RT_Text[i]))
addLine(v_lines_desc, g_Radiotext->RT_Text[i]);
}
for (int i = g_Radiotext->S_RtOsdRows - 1; i > index; i--)
{
if (!string(g_Radiotext->RT_Text[i]).empty())
if (!isDubLine(v_lines_desc, g_Radiotext->RT_Text[i]))
addLine(v_lines_desc, g_Radiotext->RT_Text[i]);
}
}
}
}
}
// clean up last description line that not to use
if (v_lines_desc.size() > MAX_DESC_LINES)
v_lines_desc.erase(v_lines_desc.begin());
g_Radiotext->RT_MsgShow = false;
if (hasDescription() && hasTitle())
return true;
return false;
}
bool CRadioTextGUI::isDubLine(vector<string>& vec, const string& to_compare_str)
{
for (size_t i = 0; i < vec.size(); i++)
if (vec.at(i) == to_compare_str)
return true;
return false;
}
void CRadioTextGUI::addLine(std::vector<std::string>& vec, std::string str)
{
vec.push_back(iso_8859_1_to_utf8(str));
}
void CRadioTextGUI::clearLines()
{
if (hasTitle())
v_lines_title.clear();
if (hasDescription())
v_lines_desc.clear();
ccw_body->clear();
}
bool CRadioTextGUI::hasDescription()
{
return !v_lines_desc.empty();
}
bool CRadioTextGUI::hasTitle()
{
return !v_lines_title.empty();
}
void CRadioTextGUI::InitInfoItems()
{
//get and checkup required informations
if ((!GetData() && !hasLines()) || !cc_allow_paint)
return;
//define size and position
int x_info = OFFSET_INNER_MID;
int y_info = OFFSET_INNER_MID;
int h_info = font1->getHeight(); //default height
int w_info = width-2*x_info;
//init text items
if (ccw_body->empty())
{
// add required text objects
for (int i = 0; i < MAX_DESC_LINES; i++)
{
static CComponentsTextTransp* item = NULL;
item = new CComponentsTextTransp(NULL, OFFSET_INNER_MID, y_info, w_info, h_info, "");
item->setItemName("desc" + to_string(i));
addWindowItem(item);
y_info += h_info;
}
}
// fill text items with text
if (!v_lines_desc.empty())
{
reverse(v_lines_desc.begin(),v_lines_desc.end()); // we need synchron order
for (size_t i = 0; i < v_lines_desc.size(); i++)
{
if (i < MAX_DESC_LINES) // use only required entries
{
if (ccw_body->getCCItem(i))
{
if (ccw_body->getCCItem(i)->getItemType() == CC_ITEMTYPE_TEXT)
{
try
{
string s_tmp = v_lines_desc.at(i);
if (i > 0)
{
if (s_tmp == v_lines_desc.at(i-1))
s_tmp = "";
}
dprintf(DEBUG_INFO, "\033[36m[CRadioTextGUI] %s - %d: set line: %d text: %s\033[0m\n", __func__, __LINE__, (int)i, s_tmp.c_str());
static CComponentsTextTransp* item = NULL;
item = static_cast<CComponentsTextTransp*> (ccw_body->getCCItem(i));
item->setText( s_tmp,
CTextBox::AUTO_HIGH | CTextBox::TOP | CTextBox::AUTO_LINEBREAK_NO_BREAKCHARS,
item->getItemName() == "desc0" ? font1 : font2);
}
catch (const std::exception &e)
{
dprintf(DEBUG_NORMAL, "\033[31m[CRadioTextGUI]\[%s - %d], exeption error %s\033[0m\n", __func__, __LINE__, e.what());
return;
}
}
}
}
}
reverse(v_lines_desc.begin(),v_lines_desc.end()); // restore origin order
}
}
void CRadioTextGUI::paint(const bool &do_save_bg)
{
hide();
clearSavedScreen();
if (!g_Radiotext)
return;
if (!g_Radiotext->haveRadiotext())
return;
#if 0
g_Radiotext->S_RtOsd = g_Radiotext->haveRadiotext() ? 1 : 0;
if (g_settings.radiotext_enable)
g_Radiotext->RT_MsgShow = true;
#endif
if (ccw_body->isPainted()){
ccw_body->hideCCItems();
}
InitInfoItems();
#if 0
for (size_t i = 0; i < v_lines_title.size(); i++)
dprintf(DEBUG_NORMAL, "\033[32m[CRadioTextGUI] %s - %d: Title: %s\033[0m\n", __func__, __LINE__, v_lines_title[i].c_str());
size_t n = v_lines_desc.size()-1;
for (int i = n; i > -1; i--)
dprintf(DEBUG_NORMAL, "\033[32m[CRadioTextGUI] %s - %d: Description line: %s\033[0m\n", __func__, __LINE__, v_lines_desc[i].c_str());
#endif
if (!v_lines_title.empty())
setWindowCaption(v_lines_title.back());
if (cc_allow_paint)
CInfoClock::getInstance()->block();
CComponentsWindow::paint(do_save_bg);
}
void CRadioTextGUI::kill(const fb_pixel_t& bg_color, const int& corner_radius, const int& fblayer_type)
{
int cr = getCornerRadius() != corner_radius ? corner_radius : getCornerRadius();
CComponentsWindow::kill(bg_color, cr, fblayer_type);
allowPaint(false);
ccw_body->clear();
}
void CRadioTextGUI::resetPos()
{
setPos(0, 0);
initWindowSize();
initWindowPos();
}

View File

@@ -0,0 +1,68 @@
/*
Based up Neutrino-GUI - Tuxbox-Project
Copyright (C) 2001 by Steffen Hehn 'McClean'
Class for radio text handling
Copyright (C) 2019, Thilo Graf 'dbt'
License: GPL
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __C_GUI_RADIO_TEXT_H__
#define __C_GUI_RADIO_TEXT_H__
#include <gui/components/cc.h>
#include <sigc++/signal.h>
#include <string>
class CRadioTextGUI : public CComponentsWindow
{
private:
std::vector<std::string> v_lines_title;
std::vector<std::string> v_lines_desc;
Font *font1, *font2;
typedef std::pair <t_channel_id, t_channel_id> channel_id_pairs; //pair = current id, old id
channel_id_pairs channel_id_pair;
bool hasDescription();
bool hasTitle();
bool isDubLine(std::vector<std::string>& vec, const std::string& to_compare_str);
void addLine(std::vector<std::string>& vec, std::string str);
bool GetData();
void initSlots();
void resetPos();
void Init();
void InitInfoItems();
void _clearSavedScreen() {clearSavedScreen();}
public:
CRadioTextGUI();
virtual~CRadioTextGUI();
void kill(const fb_pixel_t& bg_color = COL_BACKGROUND_PLUS_0, const int& corner_radius = -1, const int& fblayer_type = ~CC_FBDATA_TYPES);
void clearLines();
bool hasLines(){ return (hasTitle() || hasDescription());}
void paint(const bool &do_save_bg);
sigc::slot<void>sl_after_decode_line,
sl_on_start_screensaver,
sl_on_stop_screensaver,
sl_on_after_kill_infobar,
sl_on_show_radiotext;
};
#endif

View File

@@ -38,11 +38,14 @@
#include <algorithm> // sort
#include "audiomute.h"
#include "screensaver.h"
#include <driver/radiotext.h>
#include "radiotext_window.h"
#include <system/debug.h>
#include <gui/color_custom.h>
#include <gui/infoclock.h>
#include <zapit/zapit.h>
#include <driver/pictureviewer/pictureviewer.h>
#include <system/set_threadname.h>
#include <hardware/video.h>
extern cVideo * videoDecoder;
@@ -50,32 +53,41 @@ extern cVideo * videoDecoder;
//NI InfoIcons
#include <gui/infoicons.h>
static CComponentsFrmClock *scr_clock = NULL;
using namespace std;
CScreenSaver::CScreenSaver()
{
thrScreenSaver = 0;
thrScreenSaver = NULL;
m_frameBuffer = CFrameBuffer::getInstance();
m_viewer = new CPictureViewer();
index = 0;
status_mute = CAudioMute::getInstance()->getStatus();
status_icons = CInfoIcons::getInstance()->getStatus(); //NI
scr_clock = NULL;
clr.i_color = COL_DARK_GRAY;
pip_channel_id = 0;
idletime = time(NULL);
force_refresh = false;
thr_exit = false;
sl_scr_stop = sigc::mem_fun(*this, &CScreenSaver::thrExit);
CNeutrinoApp::getInstance()->OnBeforeRestart.connect(sl_scr_stop);
CNeutrinoApp::getInstance()->OnShutDown.connect(sl_scr_stop);
}
CScreenSaver::~CScreenSaver()
{
if(thrScreenSaver)
pthread_cancel(thrScreenSaver);
thrScreenSaver = 0;
thrExit();
delete m_viewer;
if (scr_clock)
if (scr_clock){
delete scr_clock;
scr_clock = NULL;
}
}
@@ -88,20 +100,38 @@ CScreenSaver* CScreenSaver::getInstance()
return screenSaver;
}
void CScreenSaver::thrExit()
{
if(thrScreenSaver)
{
dprintf(DEBUG_NORMAL,"[%s] %s: exit screensaver thread\n", __file__, __func__);
thr_exit = true;
thrScreenSaver->join();
delete thrScreenSaver;
thrScreenSaver = NULL;
dprintf(DEBUG_NORMAL,"\033[32m[CScreenSaver] [%s - %d] screensaver thread stopped\033[0m\n", __func__, __LINE__);
}
}
void CScreenSaver::Start()
{
if (!OnBeforeStart.empty())
OnBeforeStart();
status_mute = CAudioMute::getInstance()->getStatus();
CAudioMute::getInstance()->enableMuteIcon(false);
if(!CInfoClock::getInstance()->isBlocked())
CInfoClock::getInstance()->disableInfoClock();
CInfoClock::getInstance()->block();
//NI
status_icons = CInfoIcons::getInstance()->getStatus();
CInfoIcons::getInstance()->enableInfoIcons(false);
if (g_RadiotextWin)
g_Radiotext->OnAfterDecodeLine.block();
#ifdef ENABLE_PIP
pip_channel_id = CZapit::getInstance()->GetPipChannelID();
if (pip_channel_id)
@@ -128,23 +158,27 @@ void CScreenSaver::Start()
if(!thrScreenSaver)
{
//printf("[%s] %s: starting thread\n", __file__, __FUNCTION__);
pthread_create(&thrScreenSaver, NULL, ScreenSaverPrg, (void*) this);
pthread_detach(thrScreenSaver);
dprintf(DEBUG_NORMAL,"[%s] %s: starting thread\n", __file__, __func__);
thr_exit = false;
thrScreenSaver = new std::thread (ScreenSaverPrg, this);
std::string tn = "screen_saver";
set_threadname(tn.c_str());
dprintf(DEBUG_NORMAL,"\033[32m[CScreenSaver] [%s - %d] thread [%p] [%s] started\033[0m\n", __func__, __LINE__, thrScreenSaver, tn.c_str());
}
if (!OnAfterStart.empty())
OnAfterStart();
}
void CScreenSaver::Stop()
{
if(thrScreenSaver)
{
pthread_cancel(thrScreenSaver);
thrScreenSaver = 0;
}
//exit thread
thrExit();
resetIdleTime();
if (scr_clock){
std::lock_guard<std::mutex> g(scr_mutex);
scr_clock->Stop();
delete scr_clock;
scr_clock = NULL;
@@ -161,47 +195,51 @@ void CScreenSaver::Stop()
CInfoIcons::getInstance()->enableInfoIcons(status_icons); //NI
CAudioMute::getInstance()->enableMuteIcon(status_mute);
if (!OnAfterStop.empty()){
OnAfterStop();
}else{
CInfoClock::getInstance()->ClearDisplay(); //provokes reinit
CInfoClock::getInstance()->enableInfoClock();
}
if (g_RadiotextWin)
g_Radiotext->OnAfterDecodeLine.unblock();
if (!OnAfterStop.empty())
OnAfterStop();
}
void* CScreenSaver::ScreenSaverPrg(void* arg)
void CScreenSaver::ScreenSaverPrg(CScreenSaver *scr)
{
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, 0);
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, 0);
CScreenSaver * PScreenSaver = static_cast<CScreenSaver*>(arg);
PScreenSaver->m_frameBuffer->Clear();
scr->m_frameBuffer->Clear();
if (g_settings.screensaver_timeout)
{
while(PScreenSaver)
while(!scr->thr_exit)
{
if (g_settings.screensaver_mode == SCR_MODE_IMAGE)
PScreenSaver->ReadDir();
scr->ReadDir();
PScreenSaver->paint();
int t = g_settings.screensaver_timeout;
while (t--)
scr->paint();
int corr = 1;
#if HAVE_COOL_HARDWARE //time offset
corr = 10;
#endif
int t = 1000/corr * g_settings.screensaver_timeout; //sleep and exit handle
while (t > 0)
{
sleep(1);
if (PScreenSaver->force_refresh)
if (!scr->thr_exit)
this_thread::sleep_for(std::chrono::milliseconds(1));
t--;
if (scr->force_refresh) //NOTE: Do we really need this ?
{
PScreenSaver->force_refresh = false;
scr->force_refresh = false;
break;
}
}
}
}
else
PScreenSaver->paint();
return 0;
scr->paint();
}
bool CScreenSaver::ReadDir()
@@ -245,7 +283,6 @@ bool CScreenSaver::ReadDir()
struct dirent *dirpointer;
DIR *dir;
char curr_ext[5];
int curr_lenght;
bool ret = false;
v_bg_files.clear();
@@ -257,9 +294,9 @@ bool CScreenSaver::ReadDir()
}
/* read complete dir */
while((dirpointer=readdir(dir)) != NULL)
while((dirpointer=readdir(dir)) != NULL) // TODO: use threadsave readdir_r instead readdir
{
curr_lenght = strlen((*dirpointer).d_name);
int curr_lenght = strlen((*dirpointer).d_name);
string str = dir_name;
//printf("%d\n",curr_lenght);
if(curr_lenght > 4)
@@ -309,19 +346,26 @@ void CScreenSaver::paint()
{
if (scr_clock)
{
scr_clock->kill();
scr_clock->allowPaint(false);
if (g_settings.screensaver_mode == SCR_MODE_IMAGE){
if (g_settings.screensaver_mode != SCR_MODE_CLOCK_COLOR && g_settings.screensaver_mode != SCR_MODE_CLOCK)
{
std::lock_guard<std::mutex> g(scr_mutex);
delete scr_clock;
scr_clock = NULL;
}
else
{
scr_clock->kill(0);
scr_clock->clearSavedScreen();
scr_clock->doPaintBg(false);
}
}
if (g_settings.screensaver_mode == SCR_MODE_IMAGE && v_bg_files.empty())
m_frameBuffer->paintBackground();
if (g_settings.screensaver_mode == SCR_MODE_IMAGE && !v_bg_files.empty()){
if( (index >= v_bg_files.size()) || (access(v_bg_files.at(index).c_str(), F_OK)) )
if (g_settings.screensaver_mode == SCR_MODE_IMAGE && !v_bg_files.empty())
{
if( (index >= v_bg_files.size()) || (access(v_bg_files.at(index).c_str(), F_OK)))
{
ReadDir();
index = 0;
@@ -329,45 +373,93 @@ void CScreenSaver::paint()
}
dprintf(DEBUG_INFO, "[CScreenSaver] %s - %d : %s\n", __func__, __LINE__, v_bg_files.at(index).c_str());
#if 0
hideRadioText();
#endif
//m_frameBuffer->showFrame(v_bg_files.at(index), CFrameBuffer::SHOW_FRAME_FALLBACK_MODE_IMAGE);
m_viewer->ShowImage(v_bg_files.at(index).c_str(), false /*unscaled*/);
#if 1
handleRadioText();
#endif
if (!g_settings.screensaver_random)
index++;
else
index = rand() % v_bg_files.size();
index = rand_r(&seed[0]) % v_bg_files.size();
if(index == v_bg_files.size())
index = 0;
}
else{
if (!scr_clock){
scr_clock = new CComponentsFrmClock(1, 1, NULL, "%H:%M:%S", "%H:%M.%S", true, 1, NULL, CC_SHADOW_OFF, COL_BLACK, COL_BLACK);
else
{
if (!scr_clock)
{
scr_clock = new CComponentsFrmClock(1, 1, NULL, "%H:%M:%S", "%H:%M.%S", false, 1, NULL, CC_SHADOW_OFF, COL_BLACK, COL_BLACK);
scr_clock->setItemName("scr_clock");
scr_clock->setCornerType(CORNER_NONE);
scr_clock->setClockFont(g_Font[SNeutrinoSettings::FONT_TYPE_INFOBAR_NUMBER]);
scr_clock->disableSaveBg();
scr_clock->enableSaveBg();
scr_clock->doPaintBg(false);
#if HAVE_COOL_HARDWARE
paintImage("blackscreen.jpg", 0, 0, m_frameBuffer->getScreenWidth(true), m_frameBuffer->getScreenHeight(true));
#endif
}
#if !HAVE_COOL_HARDWARE
#if 0 //example for callback
m_frameBuffer->OnFallbackShowFrame.connect(sigc::bind(sigc::mem_fun(CFrameBuffer::getInstance(),
&CFrameBuffer::paintBoxRel),
scr_clock->getXPos(), scr_clock->getYPos(),
scr_clock->getWidth(), scr_clock->getHeight(),
COL_BLACK,
0,
CORNER_ALL)
);
#endif
m_frameBuffer->showFrame("blackscreen.jpg", CFrameBuffer::SHOW_FRAME_FALLBACK_MODE_CALLBACK | CFrameBuffer::SHOW_FRAME_FALLBACK_MODE_BLACKSCREEN);
#endif
handleRadioText();
if (scr_clock)
{
scr_clock->setTextColor(clr.i_color);
//check position and size use only possible available screen size
int x_cl, y_cl, w_cl, h_cl;
scr_clock->getDimensions(&x_cl, &y_cl, &w_cl, &h_cl);
int x_random = rand() % ((g_settings.screen_EndX - w_cl - g_settings.screen_StartX) + 1) + g_settings.screen_StartX;
int y_random = rand() % ((g_settings.screen_EndY - h_cl - g_settings.screen_StartY) + 1) + g_settings.screen_StartY;
int x_random = rand_r(&seed[1]) % ((g_settings.screen_EndX - w_cl - g_settings.screen_StartX) + 1) + g_settings.screen_StartX;
int y_random = rand_r(&seed[2]) % ((g_settings.screen_EndY - h_cl - g_settings.screen_StartY) + 1) + g_settings.screen_StartY;
if (g_RadiotextWin)
{
// avoid overlapping of clock and radio text window
int y_min = g_RadiotextWin->getYPos() - scr_clock->getHeight();
int y_max = g_RadiotextWin->getYPos() + g_RadiotextWin->getHeight();
while (y_random > (y_min - scr_clock->getHeight()) && y_random < y_max)
y_random = rand_r(&seed[2]) % ((g_settings.screen_EndY - h_cl - g_settings.screen_StartY) + 1) + g_settings.screen_StartY;
}
scr_clock->setPos(x_random, y_random);
scr_clock->allowPaint(true);
if (!scr_clock->isRun())
scr_clock->Start();
else
scr_clock->paint(true);
if (g_settings.screensaver_mode == SCR_MODE_CLOCK_COLOR) {
if (g_RadiotextWin)
scr_clock->allowPaint(g_RadiotextWin->isPainted());
else
scr_clock->allowPaint(true);
}
if (g_settings.screensaver_mode == SCR_MODE_CLOCK_COLOR)
{
srand (time(NULL));
uint32_t brightness;
// sorcery, no darkness
do {
clr.i_color = rand();
clr.i_color = rand_r(&seed[3]);
brightness = (unsigned int)clr.uc_color.r * 19595 + (unsigned int)clr.uc_color.g * 38469 + (unsigned int)clr.uc_color.b * 7471;
//printf("[%s] %s: brightness: %d\n", __file__, __FUNCTION__, brightness>> 16);
}
@@ -381,6 +473,54 @@ void CScreenSaver::paint()
}
}
void CScreenSaver::handleRadioText()
{
if (!g_RadiotextWin)
return;
if (g_RadiotextWin->isPainted() || g_settings.screensaver_mode == SCR_MODE_IMAGE)
{
g_RadiotextWin->hide();
g_RadiotextWin->clearSavedScreen();
}
else
g_RadiotextWin->kill(/*COL_BLACK*/); //ensure black paintBackground before repaint
//check position and size, use only possible available screen size
int x_rt, y_rt, w_rt, h_rt;
g_RadiotextWin->getDimensions(&x_rt, &y_rt, &w_rt, &h_rt);
int rt_x_random = rand_r(&seed[4]) % ((g_settings.screen_EndX - w_rt - g_settings.screen_StartX - OFFSET_SHADOW) + 1) + g_settings.screen_StartX;
int rt_y_random = rand_r(&seed[5]) % ((g_settings.screen_EndY - h_rt - g_settings.screen_StartY - OFFSET_SHADOW) + 1) + g_settings.screen_StartY;
g_RadiotextWin->setPos(rt_x_random, rt_y_random);
g_RadiotextWin->allowPaint(true);
if (g_RadiotextWin->hasLines())
{
if (scr_clock)
scr_clock->cl_sl_show.block();
g_RadiotextWin->CRadioTextGUI::paint(CC_SAVE_SCREEN_YES);
if (scr_clock)
scr_clock->cl_sl_show.unblock();
}
}
void CScreenSaver::hideRadioText()
{
if (!g_RadiotextWin)
return;
g_RadiotextWin->sl_after_decode_line.block();
if (scr_clock)
scr_clock->cl_sl_show.block();
g_RadiotextWin->kill();
g_RadiotextWin->hide();
if (scr_clock)
scr_clock->cl_sl_show.unblock();
}
bool CScreenSaver::canStart()
{
if (g_settings.screensaver_delay && (time(NULL) - idletime > g_settings.screensaver_delay*60))
@@ -412,5 +552,11 @@ bool CScreenSaver::ignoredMsg(neutrino_msg_t msg)
|| msg == NeutrinoMessages::EVT_BACK_ZAP_COMPLETE
)
return true;
return false;
}
CComponentsFrmClock* CScreenSaver::getClockObject()
{
return scr_clock;
}

View File

@@ -28,6 +28,9 @@
#include <vector>
#include <string>
#include <gui/components/cc.h>
#include <mutex>
#include <thread>
class CFrameBuffer;
class CPictureViewer;
@@ -36,15 +39,22 @@ class CScreenSaver : public sigc::trackable
private:
CFrameBuffer *m_frameBuffer;
CPictureViewer *m_viewer;
CComponentsFrmClock *scr_clock;
pthread_t thrScreenSaver;
static void* ScreenSaverPrg(void *arg);
std::thread *thrScreenSaver;
static void ScreenSaverPrg(CScreenSaver *scr);
bool thr_exit;
std::mutex scr_mutex;
std::vector<std::string> v_bg_files;
unsigned int index;
t_channel_id pip_channel_id;
bool force_refresh;
bool status_mute;
bool status_icons; //NI
uint seed[6];
void handleRadioText();
void hideRadioText();
bool ReadDir();
void paint();
@@ -59,6 +69,8 @@ class CScreenSaver : public sigc::trackable
};
u_color clr;
void thrExit();
sigc::slot<void> sl_scr_stop;
public:
enum
@@ -76,11 +88,13 @@ class CScreenSaver : public sigc::trackable
void Stop();
bool ignoredMsg(neutrino_msg_t msg);
sigc::signal<void> OnBeforeStart;
sigc::signal<void> OnAfterStart;
sigc::signal<void> OnAfterStop;
void resetIdleTime() { idletime = time(NULL); }
time_t getIdleTime() { return idletime; }
void forceRefresh() { force_refresh = true; }
static CComponentsFrmClock* getClockObject();
};
#endif // __CSCREENSAVER_H__

View File

@@ -778,6 +778,8 @@ struct SNeutrinoSettings
FONT_TYPE_MESSAGE_TEXT,
FONT_TYPE_BUTTON_TEXT,
FONT_TYPE_WINDOW_GENERAL,
FONT_TYPE_WINDOW_RADIOTEXT_TITLE,
FONT_TYPE_WINDOW_RADIOTEXT_DESC,
FONT_TYPE_COUNT
};