X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=tools%2Ffmt-bindings;h=d2dd1adfca5e19b92ee56723d40123df05922d9a;hb=5b80a6ba0447406f5ddf61a1ec5ed0f002ee0a05;hp=aa76afe72f370d2f6873084ab812ed89032357b7;hpb=ced4378d0914bcfb926267772c45d1d23f3bed38;p=ardour.git diff --git a/tools/fmt-bindings b/tools/fmt-bindings index aa76afe72f..d2dd1adfca 100755 --- a/tools/fmt-bindings +++ b/tools/fmt-bindings @@ -2,7 +2,9 @@ # import module use Getopt::Long; - +use File::Basename; +use File::Spec; + $semicolon = ";"; # help out stupid emacs $title = "Ardour Shortcuts"; $in_group_def = 0; @@ -12,6 +14,8 @@ $group_key; $group_number = 0; %group_names; %group_text; +%owner_bindings; +%group_owners; %group_bindings; %modifier_map; %group_numbering; @@ -19,8 +23,8 @@ $group_number = 0; $platform = linux; $winkey = 'Win'; -$make_cheatsheet = 1; -$make_accelmap = 0; +$make_cheatsheet = 0; +$make_accelmap = 1; $merge_from = ""; $html = 0; @@ -31,20 +35,12 @@ GetOptions ("platform=s" => \$platform, "merge=s" => \$merge_from, "html" => \$html); -# -# The use of a separate @WINDOW@ meta-modifier was a mistake and needs to be removed from the bindings.in file. -# There is no separate key/modifier we can use for this, so inevitably it will be the same modifier as one of -# the other meta-modifiers. This means, for example, that @WINDOW@-b could be same as @SECONDARY@-b with no -# warnings given. One of the bindings will work, one won't. -# - if ($platform eq "darwin") { $gtk_modifier_map{'PRIMARY'} = 'Primary'; # GTK supports Primary to allow platform-independent binding to the "primary" modifier, which on OS X is Command $gtk_modifier_map{'SECONDARY'} = 'Control'; $gtk_modifier_map{'TERTIARY'} = 'Shift'; $gtk_modifier_map{'LEVEL4'} = 'Mod1'; - $gtk_modifier_map{'WINDOW'} = 'Control'; # cs_modifier_map == "Cheat Sheet Modifier Map" # Used to control what gets shown in the @@ -54,7 +50,6 @@ if ($platform eq "darwin") { $cs_modifier_map{'SECONDARY'} = 'Control'; $cs_modifier_map{'TERTIARY'} = 'Shift'; $cs_modifier_map{'LEVEL4'} = 'Opt'; - $cs_modifier_map{'WINDOW'} = 'Control'; # used to display what gets shown in the # cheat sheet for mouse bindings. Differs @@ -65,7 +60,6 @@ if ($platform eq "darwin") { $mouse_modifier_map{'SECONDARY'} = 'Ctrl'; $mouse_modifier_map{'TERTIARY'} = 'Shift'; $mouse_modifier_map{'LEVEL4'} = 'Opt'; - $mouse_modifier_map{'WINDOW'} = 'Ctrl'; } else { @@ -73,7 +67,6 @@ if ($platform eq "darwin") { $gtk_modifier_map{'SECONDARY'} = 'Alt'; $gtk_modifier_map{'TERTIARY'} = 'Shift'; $gtk_modifier_map{'LEVEL4'} = $winkey; # something like "Mod4>\n"; } -while (<>) { +$bindings_name = basename ($ARGV[0]); +$bindings_name =~ s/.bindings\.in$//; + +open SOURCE, "<", $ARGV[0] or die $!; + +while () { next if /^$semicolon/; if (/^\$/) { @@ -214,7 +210,13 @@ while (<>) { s/^%//; chop; - ($group_key,$group_name) = split (/\s+/, $_, 2); + ($group_key,$owner,$group_name) = split (/\s+/, $_, 3); + if ($make_accelmap) { + if (!exists ($owner_bindings{$owner})) { + $owner_bindings{$owner} = [ [] ]; + } + $group_owners{$group_key} = $owner; + } $group_number++; $group_text = ""; $in_group_def = 1; @@ -240,6 +242,10 @@ while (<>) { chop; ($key,$action,$binding,$text) = split (/\|/, $_, 4); + $gkey = $key; + $gkey =~ s/^-//; + $owner = $group_owners{$gkey}; + # substitute bindings $gtk_binding = $binding; @@ -258,18 +264,28 @@ while (<>) { } } - # print the accelmap output + # store the accelmap output if ($key =~ /^\+/) { # remove + and don't print it in the accelmap $key =~ s/^\+//; } else { - # include this in the accelmap - if (!$merge_from && $make_accelmap) { - foreach $k (keys %gtk_modifier_map) { - $gtk_binding =~ s/\@$k\@/$gtk_modifier_map{$k}/; - } - print "(gtk_accel_path \"/$action\" \"$gtk_binding\")\n"; + # include this in the accelmap if it is part of a group that has an "owner" + if (!$merge_from && $make_accelmap && exists ($owner_bindings{$owner})) { + + $b = $binding; + $b =~ s/<@//g; + $b =~ s/@>//g; + $b =~ s/PRIMARY/Primary-/; + $b =~ s/SECONDARY/Secondary-/; + $b =~ s/TERTIARY/Tertiary-/; + $b =~ s/LEVEL4/Level4-/; + + $g = $group_names{$gkey}; + $g =~ s/\\&/&/g; + + $bref = $owner_bindings{$owner}; + push (@$bref, [ $action, $b, $g]); } } @@ -281,12 +297,43 @@ while (<>) { $bref = $group_bindings{$key}; push (@$bref, [$binding, $text]); + $sref = $section_text{$key}; + push (@$sref, [$owner]); + next; } next; } +if ($make_accelmap) { + print "\n"; + + foreach $owner (keys %owner_bindings) { + print " \n \n"; + $bindings = $owner_bindings{$owner}; + shift (@$bindings); # remove initial empty element + for my $binding (@$bindings) { + print ' \n"; + } + print " \n \n"; + } + + # merge in the "fixed" bindings that are not defined by the argument given to this program + # this covers things like the step editor, monitor and processor box bindings + + foreach $hardcoded_bindings ("mixer.bindings", "step_editing.bindings", "monitor.bindings", "processor_box.bindings") { + $path = File::Spec->catfile (dirname ($ARGV[0]), $hardcoded_bindings); + open HARDCODED, "<", $path or die $!; + while () { + print $_; + } + close HARDCODED; + } + + print "\n"; +} + if ($make_accelmap || !$make_cheatsheet) { exit 0; }