=================================================================== @@@@@@@@@@@@@@ New file: server/IR/nad_sr5_cd.ir @@@@@@@@@@@@@@ ############################################################################### # Button names to IR code mappings # # This mapping is for the NAD SR 5 remote when the mode switch is set to "CD" ############################################################################### # repeatcode = 00000000 # 0 = e13e6897 1 = e13e30cf 2 = e13eb04f 3 = e13e708f 4 = e13ef00f 5 = e13e08f7 6 = e13e8877 7 = e13e48b7 8 = e13ec837 9 = e13ea857 # arrow_down = e13e8b74 arrow_left = e13ecb34 arrow_right = e13e2bd4 arrow_up = e13e4bb4 # #voldown = e13e31ce # only the amplifier should change volume #volup = e13e11ee # jump_rew = e13ea05f jump_fwd = e13e609f scan_fwd = e13ee01f scan_rew = e13e20df # # "+10" key works as "play", as play button is located # very awkward when using the cursor buttons # "Enter" button is dead in mode CD. play = e13eb24d # "+10" play = e13e807f # "play" button pause = e13e52ad stop = e13e40bf # size = e13e10ef # "disp" brightness = e13e12ed # "open/close" # power_on = e13ea45b power_off = e13e13ec # # Functions the remote is missing buttons for. #search = #shuffle = #repeat = #sleep = #now_playing = # # EOF =================================================================== @@@@@@@@@@@@@@ New file: server/IR/nad_sr5_tape.ir @@@@@@@@@@@@@@ ############################################################################### # Button names to IR code mappings # # This mapping is for the NAD SR 5 remote when the mode switch is set to "TAPE" ############################################################################### # repeatcode = 00000000 # 0 = e13ee31c 1 = e13e51ae 2 = e13e718e 3 = e13e49b6 4 = e13e6996 5 = e13ed12e 6 = e13ef10e 7 = e13ec936 8 = e13ee916 9 = e13e19e6 # arrow_down = e13e8b74 arrow_left = e13ecb34 arrow_right = e13e2bd4 arrow_up = e13e4bb4 # #voldown = e13e31ce # only the amplifier should change volume #volup = e13e11ee # # in mode "tape", jump-to-next-song sends "scan" codes.... # so we use the click/hold semantics the SlimDecives remote use. rew = e13e7986 fwd = e13eb946 # # Enter key works as "play", as play button is located # very awkward when using the cursor buttons. # "+10" button is dead in mode tape play = e13ea35c # "enter" play = e13e39c6 # "play" button pause = e13e9966 stop = e13ef906 # size = e13e649b # "disp", mode tape brightness = e13e59a6 # "open/close", mode tape # power_on = e13ea45b power_off = e13e13ec # # Functions the remote is missing buttons for. #search = #shuffle = #repeat = #sleep = #now_playing = # # EOF =================================================================== @@@@@@@@@@@@@@ Rest is cvs diff @@@@@@@@@@@@@@ Index: server/Slim/Hardware/IR.pm =================================================================== RCS file: /cvsroot/slim/server/Slim/Hardware/IR.pm,v retrieving revision 1.22 diff -u -d -r1.22 IR.pm --- server/Slim/Hardware/IR.pm 3 Aug 2004 17:29:14 -0000 1.22 +++ server/Slim/Hardware/IR.pm 11 Aug 2004 10:17:03 -0000 @@ -8,15 +8,21 @@ # version 2. use strict; -use File::Spec::Functions qw(catdir); +use File::Spec::Functions qw(catdir splitpath); use FindBin qw($Bin); use Slim::Buttons::Common; use Slim::Utils::Misc; +use Data::Dumper; -my %irCodes = (); +my %irCodes = (); my %irMap = (); +my $defaultMapName = "Default"; +my $defaultMapFile; +my %irFileInfo = (); +my $irFilesMagic = "(not loaded)\n"; + my @queuedBytes = (); my @queuedTime = (); my @queuedClient = (); @@ -50,16 +56,7 @@ $Slim::Hardware::IR::IRSINGLETIME = 0.256; # 256 ms sub init { - - %irCodes = (); - %irMap = (); - - foreach my $irfile (keys %{irfiles()}) { - loadIRFile($irfile); - } - foreach my $mapfile (keys %{mapfiles()}) { - loadMapFile($mapfile); - } + scanIrDirectories(); } sub IRFileDirs { @@ -73,73 +70,104 @@ return @dirs; } -#returns a reference to a hash of filenames/external names -sub irfiles { - my %irfilelist = (); - foreach my $irfiledir (IRFileDirs()) { - if (opendir(DIR, $irfiledir)) { - foreach my $irfile ( sort(readdir(DIR)) ) { - if ($irfile =~ /(.+)\.ir$/) { - $::d_ir && msg(" irfile entry: $irfile\n"); - $irfilelist{catdir($irfiledir, $irfile)} = $1; - } - } - closedir(DIR); - } - } - return \%irfilelist; +# used by Utils::Prefs +sub defaultMapFile { + return $defaultMapFile; } -sub irfileName { - my $file = shift; - my %files = %{irfiles()}; - return $files{$file}; +sub isEnabledAsDefault { + my ($path) = @_; + my ($vol2, $dir2, $name) = splitpath($path); + my ($vol1, $dir1, undef) = splitpath(catdir($Bin, "IR", "Dummy.txt")); + 0 && msg("isEnabledAsDefault.1: '$vol1', '$dir1', '$name'\n"); + 0 && msg("isEnabledAsDefault.2: '$vol2', '$dir2'\n"); +# if installed locally, make it enabled as default. + return 1 if $vol1 ne $vol2 || $dir1 ne $dir2; +# enabled unless server-provided extras + return $name !~ /^(nad_sr5_cd|nad_sr5_tape)\.ir$/i; } -sub defaultMap { - return "Default"; +sub scanIrDirectories { + my $newMagic = ""; + my %seenFilenames = (); + my @info = (); + foreach my $dir (IRFileDirs()) { + next unless opendir(DIR, $dir); + foreach my $filename (sort(readdir(DIR))) { + next unless $filename =~ /^(.+)\.(ir|map)$/; + my $name = $1; + my $type = $2; + $seenFilenames{$filename}++; + my $path = catdir($dir, $filename); + push(@info, $filename, $type, $name, $path); + $newMagic .= sprintf("age=%-10d path=%s\n", 24 * 3600 * -M $path, $path); + } + closedir(DIR); + } + if ($newMagic eq $irFilesMagic) { + $::d_ir && msg("scanIrDirectories: files not changed\n"); + return; + } + $::d_ir && msg("Reloads IR files:\n$irFilesMagic changed to:\n$newMagic"); + %irFileInfo = (); + $irFilesMagic = $newMagic; + %irCodes = (); + %irMap = (); + while ($#info > 0) { + my $filename = shift(@info); + my $type = shift(@info); + my $name = shift(@info); + my $path = shift(@info); + if ($type eq "map" && $name eq $defaultMapName) { + $defaultMapFile = $path; + } + if ($seenFilenames{$filename} > 1) { + $name = $path; # use full path as name when multiple files have the same name + } + push(@{$irFileInfo{$type}{'path'}}, $path); + $irFileInfo{$type}{'isEnabledAsDefault'}{$path} = isEnabledAsDefault($path) if $type eq "ir"; + if ($type eq "map" && $name eq $defaultMapName) { + $name = Slim::Utils::Strings::string('DEFAULT_MAP'); + } + $irFileInfo{$type}{'pathToName'}{$path} = $name; + loadIRFile($path) if $type eq "ir"; + loadMapFile($path) if $type eq "map"; + } + if ($::d_ir) { + msg("defaultMapName = $defaultMapName\n"); + msg("defaultMapFile = $defaultMapFile\n"); + 1 && msg("irFileInfo: " . Dumper(\%irFileInfo)); + 0 && msg("IrMap: " . Dumper(\%irMap)); + } + Slim::Buttons::Plugins::addDefaultMaps(); } -my $defaultMapFile; - -sub defaultMapFile { - unless (defined($defaultMapFile)) { - $defaultMapFile = catdir((IRFileDirs())[0],defaultMap() . '.map'); - } - return $defaultMapFile; +# used by the web interface for enabling/disable irCodeFiles, so we +# scan the directories for any change. +sub irCodeFilesHash { + scanIrDirectories(); + return $irFileInfo{'ir'}{'pathToName'}; } -#returns a reference to a hash of filenames/external names -sub mapfiles { - my %maplist = (); - foreach my $irfiledir (IRFileDirs()) { - if (opendir(DIR, $irfiledir)) { - foreach my $mapfile ( sort(readdir(DIR)) ) { - if ($mapfile =~ /(.+)\.map$/) { - $::d_ir && msg(" key mapping file entry: $mapfile\n"); - my $path = catdir($irfiledir,$mapfile); - if ($1 eq defaultMap()) { - $maplist{$path} = Slim::Utils::Strings::string('DEFAULT_MAP'); - $defaultMapFile = $path - } else { - $maplist{$path} = $1; - } - } - } - closedir DIR; - } - } - return \%maplist; +# used by the web interface for enabling/disable irMapFiles, so we +# scan the directories for any change. +sub irMapFilesHash { + scanIrDirectories(); + return $irFileInfo{'map'}{'pathToName'}; } sub addModeDefaultMapping { my ($mode,$mapref) = @_; if (exists $irMap{$defaultMapFile}{$mode}) { #don't overwrite existing mappings + $::d_ir && msg("Ignores add default IR mapping for '$mode'\n"); return; } + $::d_ir && msg("Adds IR default mapping for '$mode':\n" . Dumper($mapref)); if (ref $mapref eq 'HASH') { $irMap{$defaultMapFile}{$mode} = $mapref; + } elsif ($::d_ir) { + msg("Non-hash passed to addModeDefaultMapping: " . Dumper($mapref) . "\n"); } } @@ -149,22 +177,26 @@ my $mapfile = shift; my $mode; - $::d_ir && msg("opening map file $mapfile\n"); + $::d_ir && msg("opening IR map file $mapfile\n"); if (-r $mapfile) { delete $irMap{$mapfile}; open(MAP, $mapfile); while () { - if (/\[(.+)\]/) { - $mode = $1; - next; - } chomp; # no newline s/^\s+//; # no leading white s/\s+$//; # no trailing white s/\s*#.*$//; # trim comments (note, no #'s or ='s allowed in button names) next unless length; #anything left? + if (/^\[(.+?)\]/) { + $mode = $1; + next; + } my ($buttonName, $function) = split(/\s*=\s*/, $_, 2); + unless (defined $mode) { + msg("Missing initial [mode] in $mapfile\n"); + $mode = "DummyMode"; + } unless ($buttonName =~ /(.+)\.\*/) { $irMap{$mapfile}{$mode}{$buttonName} = $function; } else { @@ -183,7 +215,7 @@ sub loadIRFile { my $irfile = shift; - $::d_ir && msg("opening IR file $irfile\n"); + $::d_ir && msg("opening IR codefile $irfile\n"); if (-r $irfile) { delete $irCodes{$irfile}; @@ -195,7 +227,9 @@ s/\s*#.*$//; # trim comments (note, no #'s or ='s allowed in button names) next unless length; #anything left? my ($buttonName, $irCode) = split(/\s*=\s*/, $_, 2); - + if ($buttonName eq "repeatcode") { # need reverse mapping + $irCodes{$irfile}{"_repeatcode"} = $irCode; + } $irCodes{$irfile}{$irCode} = $buttonName; } close(IRCODES); @@ -215,14 +249,17 @@ my $modifier = shift; if (defined $code) { - - my %enabled = %{irfiles()}; - foreach (Slim::Utils::Prefs::clientGetArray($client,'disabledirsets')) {delete $enabled{$_}}; + my %disabled = map {$_ => 1} Slim::Utils::Prefs::clientGetArray($client,'irSetsDisabled'); + my %enabled = map {$_ => 1} Slim::Utils::Prefs::clientGetArray($client,'irSetsEnabled'); - foreach my $irset (keys %enabled) { + foreach my $irset (@{$irFileInfo{'ir'}{'path'}}) { + next if $disabled{$irset}; + next unless $enabled{$irset} || $irFileInfo{'ir'}{'isEnabledAsDefault'}{$irset}; if (defined $irCodes{$irset}{$code}) { $::d_ir && msg("found button $irCodes{$irset}{$code} for $code\n"); $code = $irCodes{$irset}{$code}; + my $repeatCode = $irCodes{$irset}{"_repeatcode"} || ''; + $client->repeatircodebytes($repeatCode); last; } } @@ -234,7 +271,7 @@ return lookupFunction($client,$code); } else { $::d_ir && msg("irCode not present\n"); - return ''; + return ('', ''); } } @@ -246,6 +283,7 @@ $mode = Slim::Buttons::Common::mode($client) unless defined($mode); my $map = Slim::Utils::Prefs::clientGet($client,'irmap'); + $::d_ir && msg("IR.lookupFunc, code = $code, mode = $mode, map = $map\n"); assert($client); assert($map); assert($mode); @@ -255,19 +293,19 @@ $::d_ir && msg("found function " . $irMap{$map}{$mode}{$code} . " for button $code in mode $mode from map $map\n"); return $irMap{$map}{$mode}{$code}; } elsif (defined $irMap{$defaultMapFile}{$mode}{$code}) { - $::d_ir && msg("found function " . $irMap{$defaultMapFile}{$mode}{$code} . " for button $code in mode $mode from map " . defaultMap() . "\n"); + $::d_ir && msg("found function " . $irMap{$defaultMapFile}{$mode}{$code} . " for button $code in mode $mode from map $defaultMapName\n"); return $irMap{$defaultMapFile}{$mode}{$code}; } elsif ($mode =~ /(.+)\..+/ && defined $irMap{$map}{lc($1)}{$code}) { $::d_ir && msg("found function " . $irMap{$map}{lc($1)}{$code} . " for button $code in mode class ".lc($1)." from map $map\n"); return $irMap{$map}{lc($1)}{$code}; } elsif ($mode =~ /(.+)\..+/ && defined$irMap{$defaultMapFile}{lc($1)}{$code}) { - $::d_ir && msg("found function " . $irMap{$defaultMapFile}{lc($1)}{$code} . " for button $code in mode class ".lc($1)." from map " . defaultMap() . "\n"); + $::d_ir && msg("found function " . $irMap{$defaultMapFile}{lc($1)}{$code} . " for button $code in mode class ".lc($1)." from map $defaultMapName\n"); return $irMap{$defaultMapFile}{lc($1)}{$code}; } elsif (defined $irMap{$map}{'common'}{$code}) { $::d_ir && msg("found function " . $irMap{$map}{'common'}{$code} . " for button $code in mode common from map $map\n"); return $irMap{$map}{'common'}{$code}; } elsif (defined $irMap{$defaultMapFile}{'common'}{$code}) { - $::d_ir && msg("found function " . $irMap{$defaultMapFile}{'common'}{$code} . " for button $code in mode common from map " . defaultMap() . "\n"); + $::d_ir && msg("found function " . $irMap{$defaultMapFile}{'common'}{$code} . " for button $code in mode common from map $defaultMapName\n"); return $irMap{$defaultMapFile}{'common'}{$code}; } @@ -339,6 +377,12 @@ my $timediff = $irTime - $client->lastirtime(); if ($timediff < 0) {$timediff += (0xffffffff / $client->ticspersec());} + my $repeatircodebytes = $client->repeatircodebytes(); + if (length $repeatircodebytes && $timediff < $Slim::Hardware::IR::IRMINTIME && $irCodeBytes eq $repeatircodebytes) { + $::d_ir && msg("Got repeat code: $irCodeBytes -> $repeatircodebytes\n"); + $irCodeBytes = $client->lastircodebytes; + } + if (($timediff < $Slim::Hardware::IR::IRMINTIME) && ($irCodeBytes ne $client->lastircodebytes)) { #received oddball code in middle of repeat sequence, drop it $::d_ir && msg("Received $irCodeBytes while expecting " . $client->lastircodebytes . ", dropping code\n"); @@ -358,6 +402,8 @@ msg("$irCodeBytes\t$irTime\t".Time::HiRes::time()."\n"); } if ($irCodeBytes eq "00000000") { +# if this repeat was for real, $irCodeBytes would have been changed into the real code by now. +# so this is really spurious. $::d_ir && msg("Ignoring spurious null repeat code.\n"); return; } @@ -383,7 +429,7 @@ Slim::Utils::Timers::setTimer($client,Time::HiRes::time()+($Slim::Hardware::IR::IRSINGLETIME),\&checkRelease ,'single',$irTime,$irCodeBytes,$irTime + $Slim::Hardware::IR::IRSINGLETIME) } - my $irCode = lookup($client,$irCodeBytes); + my $irCode = lookup($client,$irCodeBytes); $::d_ir && msg("irCode = [$irCode] timer = [$irTime] timediff = [" . $client->irtimediff . "] last = [".$client->lastircode()."]\n"); processCode($client, $irCode, $irTime); @@ -545,7 +591,7 @@ &$subref($client,$irCode,$subarg); } else { - $::d_ir && msg("button $irCode not implemented in this mode\n"); + $::d_ir && msg("button '$irCode' not implemented in this mode\n"); } } Index: server/Slim/Player/Client.pm =================================================================== RCS file: /cvsroot/slim/server/Slim/Player/Client.pm,v retrieving revision 1.55 diff -u -d -r1.55 Client.pm --- server/Slim/Player/Client.pm 5 Aug 2004 22:59:51 -0000 1.55 +++ server/Slim/Player/Client.pm 11 Aug 2004 10:17:04 -0000 @@ -344,6 +344,12 @@ =item +repeatircodebytes() - type: string + + the IR code the remote sends to indicate a repeat (from the *.ir file) + +=item + ticspersec() - type: int number of IR tics per second @@ -737,6 +743,7 @@ $client->[90] = undef; # trickSegmentRemaining $client->[91] = undef; # currentPlaylist $client->[92] = undef; # currentPlaylistModified + $client->[93] = undef; # repeatircodebytes $::d_protocol && msg("New client connected: $id\n"); $client->lastirtime(0); @@ -746,6 +753,7 @@ $client->epochirtime(0); $client->irrepeattime(0); $client->irtimediff(0); + $client->repeatircodebytes(''); $client->id($id); $client->prevwptr(-1); @@ -1367,6 +1375,11 @@ sub currentPlaylistModified { my $r = shift; @_ ? ($r->[92] = shift) : $r->[92]; +} + +sub repeatircodebytes { + my $r = shift; + @_ ? ($r->[93] = shift) : $r->[93]; } 1; Index: server/Slim/Utils/Prefs.pm =================================================================== RCS file: /cvsroot/slim/server/Slim/Utils/Prefs.pm,v retrieving revision 1.80 diff -u -d -r1.80 Prefs.pm --- server/Slim/Utils/Prefs.pm 6 Aug 2004 04:16:50 -0000 1.80 +++ server/Slim/Utils/Prefs.pm 11 Aug 2004 10:17:04 -0000 @@ -180,7 +180,8 @@ ,'alarm' => 0 ,'bass' => 50 ,'digitalVolumeControl' => 1 - ,'disabledirsets' => [] + ,'irSetsDisabled' => [] + ,'irSetsEnabled' => [] ,'doublesize' => 0 ,'irmap' => Slim::Hardware::IR::defaultMapFile() ,'maxBitrate' => undef # will be set by the client device OR default to server pref when accessed. @@ -235,8 +236,7 @@ } ,'irmap' => sub { my ($client,$newvalue) = @_; - Slim::Hardware::IR::loadMapFile($newvalue); - if ($newvalue eq Slim::Hardware::IR::defaultMap()) { + if ($newvalue eq Slim::Hardware::IR::defaultMapFile()) { Slim::Buttons::Plugins::addDefaultMaps(); } } Index: server/Slim/Web/Setup.pm =================================================================== RCS file: /cvsroot/slim/server/Slim/Web/Setup.pm,v retrieving revision 1.91 diff -u -d -r1.91 Setup.pm --- server/Slim/Web/Setup.pm 6 Aug 2004 04:16:51 -0000 1.91 +++ server/Slim/Web/Setup.pm 11 Aug 2004 10:17:04 -0000 @@ -431,20 +431,26 @@ } else { $pageref->{'Groups'}{'Default'}{'PrefOrder'}[7] = undef; } - if (scalar(keys %{Slim::Hardware::IR::mapfiles()}) > 1) { + if (scalar(keys %{Slim::Hardware::IR::irMapFilesHash()}) > 1) { $pageref->{'GroupOrder'}[3] = 'IRMap'; - $pageref->{'Prefs'}{'irmap'}{'options'} = Slim::Hardware::IR::mapfiles(); + $pageref->{'Prefs'}{'irmap'}{'options'} = Slim::Hardware::IR::irMapFilesHash(); } else { $pageref->{'GroupOrder'}[3] = undef; } my $i = 0; - my %irsets = map {$_ => 1} Slim::Utils::Prefs::clientGetArray($client,'disabledirsets'); - foreach my $irset (sort(keys %{Slim::Hardware::IR::irfiles()})) { - if (exists $paramref->{"irsetlist$i"} && $paramref->{"irsetlist$i"} == (exists $irsets{$irset} ? 0 : 1)) { - delete $paramref->{"irsetlist$i"}; - } + my %disabled = map {$_ => 1} Slim::Utils::Prefs::clientGetArray($client,'irSetsDisabled'); + my %enabled = map {$_ => 1} Slim::Utils::Prefs::clientGetArray($client,'irSetsEnabled'); + my @values = (); + foreach my $irset (sort(keys %{Slim::Hardware::IR::irCodeFilesHash()})) { + my $oldValue = $enabled{$irset} || (!$disabled{$irset} && Slim::Hardware::IR::isEnabledAsDefault($irset)) || 0; + $paramref->{"irsetlist$i"} = $oldValue unless defined $paramref->{"irsetlist$i"}; + push(@values, $oldValue); $i++; } + $pageref->{'Prefs'}{'irsetlist'}{'currentValue'} = sub { + my ($client,$key,$ind) = @_; + return $values[$ind] ? 1 : 0; + }; $pageref->{'Prefs'}{'irsetlist'}{'arrayMax'} = $i - 1; if (!$paramref->{'playername'}) { $paramref->{'playername'} = $client->name(); @@ -457,16 +463,22 @@ ,'postChange' => sub { my ($client,$paramref,$pageref) = @_; my $i = 0; - my %irsets = map {$_ => 1} Slim::Utils::Prefs::clientGetArray($client,'disabledirsets'); - Slim::Utils::Prefs::clientDelete($client,'disabledirsets'); - foreach my $irset (sort(keys %{Slim::Hardware::IR::irfiles()})) { - if (!exists $paramref->{"irsetlist$i"}) { - $paramref->{"irsetlist$i"} = exists $irsets{$irset} ? 0 : 1; - } - unless ($paramref->{"irsetlist$i"}) { - Slim::Utils::Prefs::clientPush($client,'disabledirsets',$irset); + my %disabled = map {$_ => 1} Slim::Utils::Prefs::clientGetArray($client,'irSetsDisabled'); + my %enabled = map {$_ => 1} Slim::Utils::Prefs::clientGetArray($client,'irSetsEnabled'); + Slim::Utils::Prefs::clientDelete($client,'irSetsDisabled'); + Slim::Utils::Prefs::clientDelete($client,'irSetsEnabled'); + foreach my $irset (sort(keys %{Slim::Hardware::IR::irCodeFilesHash()})) { + my $default = Slim::Hardware::IR::isEnabledAsDefault($irset); + my $enabled; + if (exists $paramref->{"irsetlist$i"}) { + $enabled = $paramref->{"irsetlist$i"}; + } else { + $enabled = $enabled{$irset} || (!$disabled{$irset} && $default) || 0; } - Slim::Hardware::IR::loadIRFile($irset); + next if !$enabled == !$default; + my $prefsSet = $enabled ? 'irSetsEnabled' : 'irSetsDisabled'; + Slim::Utils::Prefs::clientPush($client, $prefsSet, $irset); + } continue { $i++; } } @@ -507,7 +519,7 @@ ,'Prefs' => { 'irmap' => { 'validate' => \&validateInHash - ,'validateArgs' => [\&Slim::Hardware::IR::mapfiles,1] + ,'validateArgs' => [\&Slim::Hardware::IR::irMapFilesHash,1] ,'options' => undef #will be set by preEval }, 'screensaver' => { @@ -552,7 +564,10 @@ ,'externalValue' => sub { my ($client,$value,$key) = @_; if ($key =~ /\D+(\d+)$/) { - return Slim::Hardware::IR::irfileName((sort(keys %{Slim::Hardware::IR::irfiles()}))[$1]); + my $h = Slim::Hardware::IR::irCodeFilesHash(); + my @a = sort keys %$h; + $value = $$h{$a[$1]}; + return $$h{$a[$1]}; } else { return $value; } Index: server/IR/Default.map =================================================================== RCS file: /cvsroot/slim/server/IR/Default.map,v retrieving revision 1.12 diff -u -d -r1.12 Default.map --- server/IR/Default.map 3 Aug 2004 17:29:05 -0000 1.12 +++ server/IR/Default.map 11 Aug 2004 10:17:05 -0000 @@ -23,11 +23,15 @@ arrow_up.repeat = up rew.single = jump_rew rew.hold = scan_rew +jump_rew = jump_rew +scan_rew = scan_rew brightness_down = brightness_down brightness_up = brightness_up brightness = brightness_toggle fwd.single = jump_fwd fwd.hold = scan_fwd +jump_fwd = jump_fwd +scan_fwd = scan_fwd format = titleFormat muting = muting pause.single = pause