Index: Slim/Buttons/ScreenSaver.pm =================================================================== --- Slim/Buttons/ScreenSaver.pm (revision 3599) +++ Slim/Buttons/ScreenSaver.pm (working copy) @@ -24,6 +24,8 @@ Slim::Buttons::Common::addSaver('screensaver', getFunctions(), \&setMode, undef, string('SCREENSAVER_JUMP_BACK_NAME')); Slim::Buttons::Common::addSaver('nosaver', undef, undef, undef, string('SCREENSAVER_NONE')); + Slim::Buttons::Common::addMode('blank', getFunctions(), \&setModeBlank); + # Each button on the remote has a function: %functions = ( 'done' => sub { @@ -82,21 +84,35 @@ $client->brightness($dim); } + my $brightness = $client->brightness(); + if ($client->updateMode() == 2 || $client->animateState() ) { # don't change whilst updates blocked or animating (non scrolling) + } elsif ($mode eq 'block') { # blocked mode handles its own updating of the screen. - } elsif ($saver eq 'nosaver') { - # don't change modes when none (just dim) is the screensaver. + + } elsif (($brightness == 0 && $mode eq 'blank') || $saver eq 'nosaver') { + # don't change modes when in blank mode or nosaver (just dim) is the screensaver. + + } elsif ($brightness == 0 && $mode ne 'blank') { + # brightness 0 - set mode blank to avoid screen updates + Slim::Buttons::Common::pushMode($client,'blank'); + $client->update(); + + } elsif ($brightness != 0 && $mode eq 'blank') { + # brightness changed - exit blank mode + Slim::Buttons::Common::popMode($client); + $client->update(); + } elsif ($timeout && $irtime < $now - $timeout && $mode ne $saver && $mode ne 'screensaver' && # just in case it falls into default, we dont want recursive pushModes - $mode ne 'block' && $client->power()) { # we only go into screensaver mode if we've timed out - # and we're not off or blocked + # and we're not off if ($saver eq 'playlist') { if ($mode eq 'playlist') { Slim::Buttons::Playlist::jump($client); @@ -114,10 +130,20 @@ $client->update(); } elsif (!$client->power()) { + $saver = Slim::Utils::Prefs::clientGet($client,'offsaver'); $saver =~ s/^SCREENSAVER\./OFF\./; - if ($saver eq 'nosaver') { + + if ($mode eq 'off' && $brightness == 0) { + # do nothing - leave in off mode to avoid screen updates while brightness 0 + + } elsif ($mode eq $saver && $brightness == 0) { + # pop mode to get back to off mode while brightness 0 + Slim::Buttons::Common::popMode($client); + + } elsif ($saver eq 'nosaver') { # do nothing + } elsif ($mode ne $saver) { if (Slim::Buttons::Common::validMode($saver)) { Slim::Buttons::Common::pushMode($client, $saver); @@ -127,9 +153,8 @@ } $client->update(); } - } else { - # do nothing - periodic updates handled per client where required } + # Call ourselves again after 1 second Slim::Utils::Timers::setTimer($client, ($now + 1.0), \&screenSaver); } @@ -137,9 +162,15 @@ sub wakeup { my $client = shift; my $button = shift; + + if ($button && $button =~ "brightness") { + if (Slim::Buttons::Common::mode($client) eq 'blank') { + Slim::Buttons::Common::popMode($client); + $client->update(); + } + return; + } - return if ($button && $button =~ "brightness"); - Slim::Hardware::IR::setLastIRTime($client, Time::HiRes::time()); if (!Slim::Utils::Prefs::clientGet($client, 'autobrightness')) { return; }; @@ -181,6 +212,20 @@ return $client->currentSongLines(); } +sub setModeBlank { + my $client = shift; + $::d_time && msg("going into blank screensaver mode - brightness = 0"); + $client->lines(\&linesBlank); +} + +sub linesBlank { + # blank screen display + my $client = shift; + my $parts = {}; + return $parts; +} + + 1; __END__ Index: Slim/Buttons/Power.pm =================================================================== --- Slim/Buttons/Power.pm (revision 3599) +++ Slim/Buttons/Power.pm (working copy) @@ -55,18 +55,24 @@ } } - # this is a date-time screen, so it should get updated every second - $client->param('modeUpdateInterval', 1); - # switch to power off mode # use our last saved brightness $client->brightness(Slim::Utils::Prefs::clientGet($client, "powerOffBrightness")); - $client->update(); + $client->update(); + + # force screenSaver to run almost imediately to start off screensaver if required + if (Slim::Utils::Timers::killTimers($client, \&Slim::Buttons::ScreenSaver::screenSaver)) { + Slim::Utils::Timers::setTimer($client, Time::HiRes::time() + 0.1, + \&Slim::Buttons::ScreenSaver::screenSaver); + } + } sub lines { + # blank screen my $client = shift; - return Slim::Buttons::Common::dateTime($client); + my $parts = {}; + return $parts; } 1; Index: IR/Default.map =================================================================== --- IR/Default.map (revision 3599) +++ IR/Default.map (working copy) @@ -351,3 +351,25 @@ search.* = passback stop.* = passback pause.* = passback + +[blank] +0 = done_passback +1 = done_passback +2 = done_passback +3 = done_passback +4 = done_passback +5 = done_passback +6 = done_passback +7 = done_passback +8 = done_passback +9 = done_passback +arrow_down = done_passback +arrow_left = done_passback +arrow_right = done_passback +arrow_up = done_passback +fwd = done_passback +rew = done_passback +pause.* = done_passback +play = done_passback +add = done_passback +stop = done_passback