diff --git a/data/icons/Makefile.am b/data/icons/Makefile.am index 3224dad8e..8e519e47d 100644 --- a/data/icons/Makefile.am +++ b/data/icons/Makefile.am @@ -212,6 +212,7 @@ install_DATA += \ radiotextget.png \ radiotextoff.png \ radiotextwait.png \ + rclock.png \ rec.png \ rec_event_marker.png \ rec_gray.png \ diff --git a/data/icons/rclock.png b/data/icons/rclock.png new file mode 100644 index 000000000..1736df521 Binary files /dev/null and b/data/icons/rclock.png differ diff --git a/data/locale/deutsch.locale b/data/locale/deutsch.locale index 824805be2..d27f14d5b 100644 --- a/data/locale/deutsch.locale +++ b/data/locale/deutsch.locale @@ -1991,10 +1991,11 @@ plugintype.game Spiel plugintype.lua Lua-Plugin plugintype.script Skript plugintype.tool Werkzeug -rclock.lockmsg Die Fernbedienung wird gesperrt.\n Um die Sperre aufzuheben, bitte\n und auf der Fernbedienung\n drücken. +rclock.locked Gesperrt +rclock.lockmsg Die Fernbedienung wird gesperrt.\nUm die Sperre aufzuheben, bitte\n[rot] gefolgt von [%s]\nauf der Fernbedienung drücken. rclock.menueadd FB sperren rclock.title Fernbedienung sperren -rclock.unlockmsg Fernbedienung reaktiviert... +rclock.unlockmsg Fernbedienung reaktiviert recording.is_running Folgende Aufnahme läuft bereits! Neue Aufnahme starten? recording.start Starte Aufnahme, bitte warten...! recording.startstop_msg Meldung bei Aufnahme Start/Ende diff --git a/data/locale/english.locale b/data/locale/english.locale index c6dff7ca6..0232977a6 100644 --- a/data/locale/english.locale +++ b/data/locale/english.locale @@ -1991,10 +1991,10 @@ plugintype.game Game plugintype.lua Lua plugin plugintype.script Script plugintype.tool Tool -rclock.lockmsg Your box remote control will be locked.\n To unlock it, press \n and on your remote control. -rclock.menueadd Lock RC -rclock.title Lock Remote Control -rclock.unlockmsg Remote control reactivated. +rclock.locked Locked +rclock.lockmsg Remote control will be locked.\nTo unlock, press\n[red] followed by [%s]\non your remote control. +rclock.title Lock remote control +rclock.unlockmsg Remote control unlocked recording.is_running This channel already recording. Start new record? recording.start Start recording, please wait...! recording.startstop_msg Message when recording is start/stop diff --git a/src/driver/vfd.cpp b/src/driver/vfd.cpp index 2f338bee2..cee79f32f 100644 --- a/src/driver/vfd.cpp +++ b/src/driver/vfd.cpp @@ -404,8 +404,18 @@ void CVFD::showTime(bool force) recstatus = tmp_recstatus; } -void CVFD::showRCLock(int /*duration*/) +void CVFD::showRCLock(int duration) { + if (!has_lcd) + { + sleep(duration); + return; + } + + std::string _text = text; + ShowText(g_Locale->getText(LOCALE_RCLOCK_LOCKED)); + sleep(duration); + ShowText(_text.c_str()); } void CVFD::showVolume(const char vol, const bool force_update) diff --git a/src/gui/rc_lock.cpp b/src/gui/rc_lock.cpp index 58776aeb7..a7db6be1d 100644 --- a/src/gui/rc_lock.cpp +++ b/src/gui/rc_lock.cpp @@ -1,11 +1,8 @@ /* Neutrino-GUI - DBoxII-Project - Diese GUI wurde von Grund auf neu programmiert und sollte nun vom - Aufbau und auch den Ausbaumoeglichkeiten gut aussehen. Neutrino basiert - auf der Client-Server Idee, diese GUI ist also von der direkten DBox- - Steuerung getrennt. Diese wird dann von Daemons uebernommen. - + Copyright (C) 2001 Steffen Hehn 'McClean' + Copyright (C) 2015 Sven Hoefer (svenhoefer) License: GPL @@ -35,41 +32,63 @@ #include #include -#include #include -#include -const std::string CRCLock::NO_USER_INPUT = "noUserInput"; -bool CRCLock::locked = false; +const std::string CRCLock::NO_USER_INPUT = "NO_USER_INPUT"; -// -- Menue Handler Interface -// -- Infinite Loop to lock remote control (until release lock key pressed) -// -- 2003-12-01 rasc +CRCLock::CRCLock() +{ + locked = false; + lockIcon = NULL; +} + +CRCLock::~CRCLock() +{ + if (lockIcon) + { + delete lockIcon; + lockIcon = NULL; + } +} + +CRCLock* CRCLock::getInstance() +{ + static CRCLock* me = NULL; + if (!me) + me = new CRCLock(); + return me; +} int CRCLock::exec(CMenuTarget* parent, const std::string &actionKey) { - if(locked) + if (locked) + { + printf("CRCLock::%s: already locked; exiting\n", __func__); return menu_return::RETURN_EXIT_ALL; + } if (parent) parent->hide(); bool no_input = (actionKey == NO_USER_INPUT); - if (ShowMsg(LOCALE_RCLOCK_TITLE, LOCALE_RCLOCK_LOCKMSG, - CMessageBox::mbrYes, CMessageBox::mbYes | CMessageBox::mbCancel, - NEUTRINO_ICON_INFO,450,no_input ? 5 : -1,no_input) == CMessageBox::mbrCancel) + std::string key_unlock = CRCInput::getKeyName((neutrino_msg_t) g_settings.key_unlock); + char lock_msg[1024]; + snprintf(lock_msg, sizeof(lock_msg)-1, g_Locale->getText(LOCALE_RCLOCK_LOCKMSG), key_unlock.c_str()); + + if (ShowMsg(LOCALE_RCLOCK_TITLE, lock_msg, CMessageBox::mbrYes, CMessageBox::mbYes | CMessageBox::mbCancel, + NEUTRINO_ICON_INFO, 450, no_input ? 5 : -1, no_input) == CMessageBox::mbrCancel) return menu_return::RETURN_EXIT_ALL; - // -- Lockup Box locked = true; - lockBox(); + lockRC(); locked = false; - ShowMsg(LOCALE_RCLOCK_TITLE, LOCALE_RCLOCK_UNLOCKMSG, CMessageBox::mbrBack, CMessageBox::mbBack, NEUTRINO_ICON_INFO,450, no_input ? 5 : -1); + ShowMsg(LOCALE_RCLOCK_TITLE, LOCALE_RCLOCK_UNLOCKMSG, CMessageBox::mbrBack, CMessageBox::mbBack, + NEUTRINO_ICON_INFO, 450, no_input ? 5 : -1); return menu_return::RETURN_EXIT_ALL; } -void CRCLock::lockBox() +void CRCLock::lockRC() { neutrino_msg_t msg; neutrino_msg_data_t data; @@ -77,36 +96,53 @@ void CRCLock::lockBox() uint64_t timeoutEnd; // -- Loop until release key pressed - // -- Key sequence: within 5 secs - while (1) { - + // -- Release key sequence: [red] [g_settings.key_unlock] within 5 secs + printf("CRCLock::%s: locking remote control\n", __func__); + while (1) + { timeoutEnd = CRCInput::calcTimeoutEnd(9999999); g_RCInput->getMsgAbsoluteTimeout(&msg, &data, &timeoutEnd); if (msg == NeutrinoMessages::UNLOCK_RC) break; - if (msg == CRCInput::RC_red) { + if (msg == CRCInput::RC_red) + { timeoutEnd = CRCInput::calcTimeoutEnd(5); g_RCInput->getMsgAbsoluteTimeout(&msg, &data, &timeoutEnd); - //if (msg == CRCInput::RC_setup) break; - if (msg == (neutrino_msg_t) g_settings.key_unlock) break; + if (msg == (neutrino_msg_t) g_settings.key_unlock) + break; } - if (msg == CRCInput::RC_timeout) continue; + if (msg == CRCInput::RC_timeout) + continue; - // -- Zwen told me: Eating only RC events would be nice - // -- so be it... - - if (msg > CRCInput::RC_MaxRC) { + if (msg > CRCInput::RC_MaxRC) + { CNeutrinoApp::getInstance()->handleMsg(msg, data); - } else { + } + else + { + if (lockIcon == NULL) + { + lockIcon = new CComponentsPicture( + g_settings.screen_StartX + 10, + g_settings.screen_StartY + 10, + NEUTRINO_ICON_RCLOCK); + lockIcon->doPaintBg(false); + } + lockIcon->paint(CC_SAVE_SCREEN_YES); + CVFD::getInstance()->showRCLock(); - // Since showRCLock blocks 2secs for each key we eat all - // messages created during this time. Hopefully this ok... + // showRCLock blocks box for 2 seconds, + // so we eat all messages created during this time. g_RCInput->clearRCMsg(); + + lockIcon->hide(); } } + printf("CRCLock::%s: unlocking remote control\n", __func__); + return; } diff --git a/src/gui/rc_lock.h b/src/gui/rc_lock.h index bd32757d0..e75152e75 100644 --- a/src/gui/rc_lock.h +++ b/src/gui/rc_lock.h @@ -1,7 +1,8 @@ /* Neutrino-GUI - DBoxII-Project - + Copyright (C) 2001 Steffen Hehn 'McClean' + Copyright (C) 2015 Sven Hoefer (svenhoefer) License: GPL @@ -21,28 +22,30 @@ */ -#ifndef _remoteLock_ -#define _remoteLock_ +#ifndef _rc_lock_ +#define _rc_lock_ #include #include - -// -// -- Implements RemoteControl Locking... -// -- ... usefull, if you want to protect your box against unintented zapping -// -- 2003-12-01 rasc -// class CRCLock: public CMenuTarget { private: - void lockBox(); + bool locked; + CComponentsPicture *lockIcon; + + void lockRC(); public: - static const std::string NO_USER_INPUT; - int exec(CMenuTarget* parent, const std::string & actionKey); - static bool locked; + CRCLock(); + ~CRCLock(); + static CRCLock* getInstance(); + + static const std::string NO_USER_INPUT; + + int isLocked() { return locked; } + int exec(CMenuTarget* parent, const std::string & actionKey); }; #endif diff --git a/src/gui/user_menue.cpp b/src/gui/user_menue.cpp index 45cbfde0c..e178031eb 100644 --- a/src/gui/user_menue.cpp +++ b/src/gui/user_menue.cpp @@ -225,7 +225,7 @@ bool CUserMenu::showUserMenu(neutrino_msg_t msg) break; case SNeutrinoSettings::ITEM_REMOTE: keyhelper.get(&key,&icon,feat_key[g_settings.personalize[SNeutrinoSettings::P_FEAT_KEY_RC_LOCK]].key); //CRCInput::RC_nokey); - menu_item = new CMenuDForwarder(LOCALE_RCLOCK_MENUEADD, true, NULL, new CRCLock, "-1" , key, icon ); + menu_item = new CMenuForwarder(LOCALE_RCLOCK_TITLE, true, NULL, CRCLock::getInstance(), "-1" , key, icon ); // FIXME menu_item->setHint("", NONEXISTANT_LOCALE); break; case SNeutrinoSettings::ITEM_EPG_SUPER: diff --git a/src/gui/user_menue_setup.cpp b/src/gui/user_menue_setup.cpp index d2232b9cf..c5a2df4b5 100644 --- a/src/gui/user_menue_setup.cpp +++ b/src/gui/user_menue_setup.cpp @@ -87,7 +87,7 @@ static keyvals usermenu_items[] = { SNeutrinoSettings::ITEM_INETPLAY, LOCALE_INETRADIO_NAME, usermenu_show }, { SNeutrinoSettings::ITEM_MOVIEPLAYER_MB, LOCALE_MOVIEBROWSER_HEAD, usermenu_show }, { SNeutrinoSettings::ITEM_TIMERLIST, LOCALE_TIMERLIST_NAME, usermenu_show }, - { SNeutrinoSettings::ITEM_REMOTE, LOCALE_RCLOCK_MENUEADD, usermenu_show }, + { SNeutrinoSettings::ITEM_REMOTE, LOCALE_RCLOCK_TITLE, usermenu_show }, { SNeutrinoSettings::ITEM_FAVORITS, LOCALE_FAVORITES_MENUEADD, usermenu_show }, { SNeutrinoSettings::ITEM_TECHINFO, LOCALE_EPGMENU_STREAMINFO, usermenu_show }, { SNeutrinoSettings::ITEM_PLUGIN_TYPES, LOCALE_USERMENU_ITEM_PLUGIN_TYPES, usermenu_show }, diff --git a/src/gui/widget/icons.h b/src/gui/widget/icons.h index 60e2cf912..2b5264475 100644 --- a/src/gui/widget/icons.h +++ b/src/gui/widget/icons.h @@ -158,6 +158,7 @@ #define NEUTRINO_ICON_NETWORK "network" #define NEUTRINO_ICON_LCD "lcd" #define NEUTRINO_ICON_VOLUME "volume" +#define NEUTRINO_ICON_RCLOCK "rclock" #define NEUTRINO_ICON_RESOLUTION_1920 "res_1920" #define NEUTRINO_ICON_RESOLUTION_1080 "res_1080" #define NEUTRINO_ICON_RESOLUTION_1440 "res_1440" diff --git a/src/neutrino.cpp b/src/neutrino.cpp index f9b2899a1..357c0fdba 100644 --- a/src/neutrino.cpp +++ b/src/neutrino.cpp @@ -2603,14 +2603,10 @@ int CNeutrinoApp::showChannelList(const neutrino_msg_t _msg, bool from_menu) //_show: if(msg == CRCInput::RC_ok) { - if (g_settings.channellist_new_zap_mode > 0) /* allow or active */ - g_audioMute->enableMuteIcon(false); if( !bouquetList->Bouquets.empty() && bouquetList->Bouquets[old_b]->channelList->getSize() > 0) nNewChannel = bouquetList->Bouquets[old_b]->channelList->exec();//with ZAP! else nNewChannel = bouquetList->exec(true); - if (g_settings.channellist_new_zap_mode > 0) /* allow or active */ - g_audioMute->enableMuteIcon(true); } else if(msg == CRCInput::RC_sat) { SetChannelMode(LIST_MODE_SAT); nNewChannel = bouquetList->exec(true); @@ -3303,8 +3299,7 @@ int CNeutrinoApp::handleMsg(const neutrino_msg_t _msg, neutrino_msg_data_t data) } else if (msg == NeutrinoMessages::LOCK_RC) { - CRCLock rcLock; - rcLock.exec(NULL,CRCLock::NO_USER_INPUT); + CRCLock::getInstance()->exec(NULL, CRCLock::NO_USER_INPUT); return messages_return::handled; } else if( msg == NeutrinoMessages::CHANGEMODE ) { diff --git a/src/nhttpd/tuxboxapi/controlapi.cpp b/src/nhttpd/tuxboxapi/controlapi.cpp index b19b43c88..7a288014d 100644 --- a/src/nhttpd/tuxboxapi/controlapi.cpp +++ b/src/nhttpd/tuxboxapi/controlapi.cpp @@ -500,14 +500,15 @@ void CControlAPI::RCCGI(CyhookHandler *hh) { if (!(hh->ParamList.empty())) { + bool locked = CRCLock::getInstance()->isLocked(); + if (hh->ParamList["1"] == "lock"){ // lock remote control - if(!CRCLock::locked) + if (!locked) NeutrinoAPI->EventServer->sendEvent(NeutrinoMessages::LOCK_RC, CEventServer::INITID_HTTPD); } else if (hh->ParamList["1"] == "unlock"){// unlock remote control - if(CRCLock::locked) + if (locked) NeutrinoAPI->EventServer->sendEvent(NeutrinoMessages::UNLOCK_RC, CEventServer::INITID_HTTPD); - } else{ hh->SendError(); diff --git a/src/system/locals.h b/src/system/locals.h index 4a3123646..5fe1c56e8 100644 --- a/src/system/locals.h +++ b/src/system/locals.h @@ -2018,8 +2018,8 @@ typedef enum LOCALE_PLUGINTYPE_LUA, LOCALE_PLUGINTYPE_SCRIPT, LOCALE_PLUGINTYPE_TOOL, + LOCALE_RCLOCK_LOCKED, LOCALE_RCLOCK_LOCKMSG, - LOCALE_RCLOCK_MENUEADD, LOCALE_RCLOCK_TITLE, LOCALE_RCLOCK_UNLOCKMSG, LOCALE_RECORDING_IS_RUNNING, diff --git a/src/system/locals_intern.h b/src/system/locals_intern.h index a5dd56ea8..33ac965be 100644 --- a/src/system/locals_intern.h +++ b/src/system/locals_intern.h @@ -2018,8 +2018,8 @@ const char * locale_real_names[] = "plugintype.lua", "plugintype.script", "plugintype.tool", + "rclock.locked", "rclock.lockmsg", - "rclock.menueadd", "rclock.title", "rclock.unlockmsg", "recording.is_running",