Index: Slim/Hardware/IR.pm =================================================================== --- Slim/Hardware/IR.pm (revision 12227) +++ Slim/Hardware/IR.pm (working copy) @@ -251,16 +251,7 @@ sub addModeDefaultMapping { my ($mode, $mapRef) = @_; - if (exists $irMap{$defaultMapFile}{$mode}) { - - # don't overwrite existing mappings - return; - } - - if (ref($mapRef) eq 'HASH') { - - $irMap{$defaultMapFile}{$mode} = $mapRef; - } + addModeMapping($defaultMapFile,$mode,$mapRef); } sub IRPath { @@ -276,6 +267,23 @@ } } +sub addModeMapping { + my ($map, $mode, $mapRef) = @_; + + if (exists $irMap{$map}{$mode} && ref($mapRef) eq 'HASH') { + #Ignore the map if it already exists, else add it + for my $ref (@{$irMap{$map}{$mode}}) { + if($ref eq $mapRef) { + return; + } + } + push @{$irMap{$map}{$mode}},$mapRef; + }elsif (ref($mapRef) eq 'HASH') { + my @maps = ($mapRef); + $irMap{$map}{$mode} = \@maps; + } +} + sub loadMapFile { my $file = shift; my $mode; @@ -300,9 +308,16 @@ delete $irMap{$file}; + my %empty = (); + my $mapRef = \%empty; for (@lines) { if (/\[(.+)\]/) { + if($mode && keys(%$mapRef)>0) { + addModeMapping($file,$mode,$mapRef); + } + my %empty = (); + $mapRef = \%empty; $mode = $1; next; } @@ -321,18 +336,21 @@ if ($buttonName !~ /(.+)\.\*/) { - $irMap{$file}{$mode}{$buttonName} = $function; + $mapRef->{$buttonName} = $function; next; } for my $style (@buttonPressStyles) { - if (!exists($irMap{$file}{$mode}{$1 . $style})) { + if (!exists($mapRef->{$1 . $style})) { - $irMap{$file}{$mode}{$1 . $style} = $function; + $mapRef->{$1 . $style} = $function; } } } + if($mode && keys(%$mapRef)>0) { + addModeMapping($file,$mode,$mapRef); + } } sub loadIRFile { @@ -469,31 +487,31 @@ assert($mode); # assert($code); # FIXME: somhow we keep getting here with no $code. - if ($function = $irMap{$map}{$mode}{$code}) { + if ($function = lookupFunctionFromIrMap($map,$mode,$code)) { $log->info("Found function: $function for button $code in mode $mode from map $map"); - } elsif ($function = $irMap{$defaultMapFile}{$mode}{$code}) { + } elsif ($function = lookupFunctionFromIrMap($defaultMapFile,$mode,$code)) { $log->info("Found function: $function for button $code in mode $mode from map $defaultMapFile"); - } elsif ($mode =~ /^(.+)\..+/ && $irMap{$map}{lc($1)}{$code}) { + } elsif ($mode =~ /^(.+)\..+/ && lookupFunctionFromIrMap($map,lc($1),$code)) { - $function = $irMap{$map}{lc($1)}{$code}; + $function = lookupFunctionFromIrMap($map,lc($1),$code); $log->info("Found function: $function for button $code in mode class \L$1 from map $map"); - } elsif ($mode =~ /^(.+)\..+/ && $irMap{$defaultMapFile}{lc($1)}{$code}) { + } elsif ($mode =~ /^(.+)\..+/ && lookupFunctionFromIrMap($defaultMapFile,lc($1),$code)) { - $function = $irMap{$defaultMapFile}{lc($1)}{$code}; + $function = lookupFunctionFromIrMap($defaultMapFile,lc($1),$code); $log->info("Found function: $function for button $code in mode class \L$1 from map $defaultMapFile"); - } elsif ($function = $irMap{$map}{'common'}{$code}) { + } elsif ($function = lookupFunctionFromIrMap($map,'common',$code)) { $log->info("Found function: $function for button $code in mode common from map $map"); - } elsif ($function = $irMap{$defaultMapFile}{'common'}{$code}) { + } elsif ($function = lookupFunctionFromIrMap($defaultMapFile,'common',$code)) { $log->info("Found function: $function for button $code in mode common from map $defaultMapFile"); } @@ -505,6 +523,21 @@ return $function; } +sub lookupFunctionFromIrMap { + my $map = shift; + my $mode = shift; + my $code = shift; + + if(exists $irMap{$map}{$mode}) { + for my $functionMap (@{$irMap{$map}{$mode}}) { + if(exists $functionMap->{$code}) { + return $functionMap->{$code}; + } + } + } + return undef; +} + # Checks to see if a button has been released, this sub is executed through timers sub checkRelease { my ($client, $releaseType, $startIRTime, $startIRCodeBytes, $estIRTime) = @_;