<%pre> #include <grab.h> #include <setup.h> #include <tools.h> #include <users.h> using namespace std; using namespace vdrlive; </%pre> <%args> int channel = -1; </%args> <%session scope="global"> bool logged_in(false); </%session> <%request scope="page"> cChannel* Channel; </%request> <%include>page_init.eh</%include> <{ if (!logged_in && LiveSetup().UseAuth()) return reply.redirect("login.html"); }> <%cpp> if (!cUser::CurrentUserHasRightTo(UR_USEREMOTE)) throw HtmlError( tr("Sorry, no permission. Please contact your administrator!") ); pageTitle = tr("Remote Control"); #if VDRVERSNUM < 20301 ReadLock channelsLock( Channels ); if ( !channelsLock ) throw HtmlError( tr("Couldn't aquire access to channels, please try again later.") ); #endif // cChannel* Channel; (see %request above) if ( channel > 0 ) { #if VDRVERSNUM >= 20301 LOCK_CHANNELS_READ; Channel = (cChannel *)Channels->GetByNumber( channel ); #else Channel = Channels.GetByNumber( channel ); #endif } else { if (cDevice::CurrentChannel()) { #if VDRVERSNUM >= 20301 LOCK_CHANNELS_READ; Channel = (cChannel *)Channels->GetByNumber(cDevice::CurrentChannel()); #else Channel = Channels.GetByNumber(cDevice::CurrentChannel()); #endif } else { #if VDRVERSNUM >= 20301 LOCK_CHANNELS_READ; Channel = (cChannel *)Channels->Get( Channels->GetNextNormal( -1 ) ); #else Channel = Channels.Get( Channels.GetNextNormal( -1 ) ); #endif } } if ( Channel == 0 ) throw HtmlError( tr("Couldn't find channel or no channels available. Maybe you mistyped your request?") ); </%cpp> <& pageelems.doc_type &> <html> <head> <title>VDR-Live - <$ pageTitle $></title> <& pageelems.stylesheets &> <& pageelems.ajax_js &> <script type="text/javascript"><!-- var newImg = null; var imgsrc = ""; var osdAjax = null; var osdTimeout = -1; var interval = -1; var clkTimer; function changeScreenContent(){ var screenCon= document.getElementsByName('screenCon'); for ( var i=0; i < screenCon.length; i++){ if (screenCon[i].id == 'screenCon_grab'){ if (screenCon[i].checked){ newImg = new Image(); StreamLoad(); ChangeInterval(); StreamLoad(); document.images.vdrlive.style.display= ''; } else { window.clearInterval(interval); document.images.vdrlive.style.display= 'none'; newImg = null; } } else if (screenCon[i].id == 'screenCon_osd'){ if (screenCon[i].checked){ osdAjax= new Ajax('osd.xml', {method: 'get'}); osdAjax.lastUpd= -1; osdAjax.addEvent('onComplete', function(text,xmlDoc){ try{ var upd= parseInt(xmlDoc.firstChild.getAttribute("data-time"),10); if ( osdAjax.lastUpd != upd ){ $('osd').empty().setHTML(text); osdAjax.lastUpd = upd; $$('#screenshot .osdItems')[0].scrollTop= $$('#screenshot .selected')[0].offsetTop - 40; } } catch (e) {} window.clearInterval(osdTimeout); osdTimeout= window.setTimeout("OSDLoad()",1000); }); $('osd').style.display= ''; OSDLoad() } else { $('osd').style.display= 'none'; osdAjax= null; } } } } function StreamLoad() { if (!newImg) return; uniq = new Date(); uniq = uniq.getTime(); document.images.vdrlive.src=newImg.src; newImg.src=imgsrc+"?"+uniq; } function StreamInit() { document.getElementsByName('screenCon')[0].checked= true; if (document.images.vdrlive) imgsrc = document.images.vdrlive.src; FillIntervals(); changeScreenContent(); $('osd').addEvents({ 'click': function(ev){ $clear(clkTimer); clkTimer = (function(){ handleOSD(ev.target, false); }).delay(200, this); }, 'dblclick': function(ev){ $clear(clkTimer); handleOSD(ev.target, true); } }); } function ChangeInterval() { var element = document.getElementsByName('interval').item(0); var timeout = element.value; window.clearInterval(interval); interval = window.setInterval("StreamLoad()", timeout); } function OSDLoad(){ if (osdAjax) osdAjax.request(); } function handleOSD(elem, doEnter){ switch (elem.className){ case 'osdButtonRed': return KeyPress(<$ kRed $>); case 'osdButtonGreen': return KeyPress(<$ kGreen $>); case 'osdButtonYellow': return KeyPress(<$ kYellow $>); case 'osdButtonBlue': return KeyPress(<$ kBlue $>); case 'osdTitle': return KeyPress(<$ kBack $>); case 'osdItem': var hits= 0, cur= elem, keycode= <$ kDown $>; while (cur && cur.className.indexOf('selected') == -1 ){ cur= cur.previousSibling; hits++; }; if ( !cur){ hits= 0; cur= elem; keycode= <$ kUp $>; while (cur && cur.className.indexOf('selected') == -1 ){ cur= cur.nextSibling; hits++; }; } for(;hits > 0; hits--) KeyPress(keycode, true); if ( !doEnter){ OSDLoad(); return false; } case 'osdItem selected': return KeyPress(<$ kOk $>); } return true; } function KeyPress(keycode,DonotLoadOSD) { // LiveSimpleAjaxRequest('keypress.xml', 'keycode', keycode); var req = new Ajax('keypress.xml', { method : 'post'}); if (!DonotLoadOSD && osdAjax) req.addEvent('onComplete', OSDLoad); req.request('keycode=' + keycode + '&async=1'); return false; } function FillIntervals() { var element = document.getElementsByName('interval').item(0); if (!element) return; var items = new Array(1000, 2000, 5000); element.options.length = items.length; for (i = 0; i < items.length; ++i) { element.options[i].value = items[i]; element.options[i].text = (items[i] / 1000) + " s"; if (items[i] == <$ ConvertToString( LiveSetup().GetScreenshotInterval(), locale("C") ) $>) element.selectedIndex = i; } } //--></script> % reply.sout().imbue(locale()); </head> <body onload="StreamInit();"> <& pageelems.logo &> <& menu active="remote" component=("remote.remote_actions")> <div class="inhalt"> <div class="screenshot" id="screenshot"> <{ if (LiveGrabImageManager().CanGrab()) { }> <img src="screenshot.jpg" name="vdrlive" /> <{ } }> <div id="osd"></div> </div> <div> <img src="<$ LiveSetup().GetThemedLink("img", "remotecontrol.jpg") $>" width="162" height="378" border="0" usemap="#remote" alt="" /> <map name="remote"> <area href="#" shape="circle" coords="37,36,10" alt="Power" onclick="return KeyPress(<$ kPower $>)" /> <area href="#" shape="rect" coords="27,60,59,75" alt="1" onclick="return KeyPress(<$ k1 $>)" /> <area href="#" shape="rect" coords="64,59,98,75" alt="2" onclick="return KeyPress(<$ k2 $>)" /> <area href="#" shape="rect" coords="103,59,137,75" alt="3" onclick="return KeyPress(<$ k3 $>)" /> <area href="#" shape="rect" coords="25,82,60,98" alt="4" onclick="return KeyPress(<$ k4 $>)" /> <area href="#" shape="rect" coords="65,82,98,99" alt="5" onclick="return KeyPress(<$ k5 $>)" /> <area href="#" shape="rect" coords="103,83,137,99" alt="6" onclick="return KeyPress(<$ k6 $>)" /> <area href="#" shape="rect" coords="26,106,60,121" alt="7" onclick="return KeyPress(<$ k7 $>)" /> <area href="#" shape="rect" coords="65,105,97,121" alt="8" onclick="return KeyPress(<$ k8 $>)" /> <area href="#" shape="rect" coords="104,106,137,122" alt="9" onclick="return KeyPress(<$ k9 $>)" /> <area href="#" shape="rect" coords="66,128,98,144" alt="0" onclick="return KeyPress(<$ k0 $>)" /> <area href="#" shape="circle" coords="37,157,13" alt="Vol+" onclick="return KeyPress(<$ kVolUp $>)" /> <area href="#" shape="circle" coords="37,190,13" alt="Vol-" onclick="return KeyPress(<$ kVolDn $>)" /> <area href="#" shape="circle" coords="125,157,13" alt="P+" onclick="return KeyPress(<$ kChanUp $>)" /> <area href="#" shape="circle" coords="125,190,13" alt="P-" onclick="return KeyPress(<$ kChanDn $>)" /> <area href="#" shape="circle" coords="81,174,8" alt="Mute" onclick="return KeyPress(<$ kMute $>)" /> <area href="#" shape="circle" coords="81,202,11" alt="Record" onclick="return KeyPress(<$ kRecord $>)" /> <area href="#" shape="poly" coords="39,215,29,227,30,235,39,236,51,222,49,215,43,213" alt="Menu" onclick="return KeyPress(<$ kMenu $>)" /> <area href="#" shape="poly" coords="119,213,127,219,135,230,132,235,127,236,119,231,114,223,113,215" alt="Exit" onclick="return KeyPress(<$ kBack $>)" /> <area href="#" shape="poly" coords="33,289,31,298,43,310,51,308,54,300,41,287" alt="Subtitles" onclick="return KeyPress(<$ kSubtitles $>)" /> <area href="#" shape="poly" coords="131,289,133,298,122,310,112,308,110,300,122,287" alt="Audio" onclick="return KeyPress(<$ kAudio $>)" /> <area href="#" shape="poly" coords="58,230,70,223,82,223,91,223,105,231,96,240,87,237,78,236,69,240,66,241,58,232" alt="Up" onclick="return KeyPress(<$ kUp $>)" /> <area href="#" shape="poly" coords="111,237,119,249,121,259,119,275,113,285,109,284,101,276,104,270,107,260,106,253,101,245" alt="Right" onclick="return KeyPress(<$ kRight $>)" /> <area href="#" shape="poly" coords="66,281,75,285,86,285,95,281,106,291,100,295,87,300,73,300,58,291,57,289,58,289" alt="Down" onclick="return KeyPress(<$ kDown $>)" /> <area href="#" shape="poly" coords="51,236,61,245,56,256,57,266,61,277,52,285,47,278,42,264,43,252,49,240" alt="Left" onclick="return KeyPress(<$ kLeft $>)" /> <area href="#" shape="circle" coords="81,261,17" alt="Ok" onclick="return KeyPress(<$ kOk $>)" /> <area href="#" shape="rect" coords="25,324,52,339" alt="Red" onclick="return KeyPress(<$ kRed $>)" /> <area href="#" shape="rect" coords="53,324,81,339" alt="Green" onclick="return KeyPress(<$ kGreen $>)" /> <area href="#" shape="rect" coords="83,324,109,339" alt="Yellow" onclick="return KeyPress(<$ kYellow $>)" /> <area href="#" shape="rect" coords="110,324,137,339" alt="Blue" onclick="return KeyPress(<$ kBlue $>)" /> </map> </div> </div> </body> </html> <%include>page_exit.eh</%include> <%def remote_actions> <b><$ tr("Selection") $></b>: <{ if ( LiveGrabImageManager().CanGrab()) { }> <input type="radio" name="screenCon" id="screenCon_grab" onchange="changeScreenContent()"/> <label for="screenCon_grab"><$ tr("Snapshot interval") $>:</label> <select name="interval" onchange="ChangeInterval()"></select> <& pageelems.vlc_stream_channel channelId=(Channel->GetChannelID()) &> - <{ } }> <input type="radio" name="screenCon" id="screenCon_osd" onchange="changeScreenContent()" /> <label for="screenCon_osd">OSD</label> - <input type="radio" name="screenCon" id="screenCon_none" onchange="changeScreenContent()" /> <label for="screenCon_osd"><$ tr("Stop") $></label> </%def>