+%group_bindings;
+%modifier_map;
+%group_numbering;
+%merge_bindings;
+
+$platform = linux;
+$winkey = 'Win';
+$make_cheatsheet = 1;
+$make_accelmap = 0;
+$merge_from = "";
+$html = 0;
+
+GetOptions ("platform=s" => \$platform,
+ "winkey=s" => \$winkey,
+ "cheatsheet" => \$make_cheatsheet,
+ "accelmap" => \$make_accelmap,
+ "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
+ # cheat sheet for a given (meta)-modifier
+
+ $cs_modifier_map{'PRIMARY'} = 'Cmd';
+ $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
+ # from cs_modifier map in using shorter
+ # abbreviations.
+
+ $mouse_modifier_map{'PRIMARY'} = 'Cmd';
+ $mouse_modifier_map{'SECONDARY'} = 'Ctrl';
+ $mouse_modifier_map{'TERTIARY'} = 'Shift';
+ $mouse_modifier_map{'LEVEL4'} = 'Opt';
+ $mouse_modifier_map{'WINDOW'} = 'Ctrl';
+
+} else {
+
+ $gtk_modifier_map{'PRIMARY'} = 'Control';
+ $gtk_modifier_map{'SECONDARY'} = 'Alt';
+ $gtk_modifier_map{'TERTIARY'} = 'Shift';
+ $gtk_modifier_map{'LEVEL4'} = $winkey; # something like "Mod4><Super"
+ $gtk_modifier_map{'WINDOW'} = 'Alt';
+
+ # cs_modifier_map == "Cheat Sheet Modifier Map"
+ # Used to control what gets shown in the
+ # cheat sheet for a given (meta)-modifier
+
+ $cs_modifier_map{'PRIMARY'} = 'Control';
+ $cs_modifier_map{'SECONDARY'} = 'Alt';
+ $cs_modifier_map{'TERTIARY'} = 'Shift';
+ $cs_modifier_map{'LEVEL4'} = 'Win';
+ $cs_modifier_map{'WINDOW'} = 'Alt';
+
+ # used to display what gets shown in the
+ # cheat sheet for mouse bindings. Differs
+ # from cs_modifier map in using shorter
+ # abbreviations.
+
+ $mouse_modifier_map{'PRIMARY'} = 'Ctl';
+ $mouse_modifier_map{'SECONDARY'} = 'Alt';
+ $mouse_modifier_map{'TERTIARY'} = 'Shift';
+ $mouse_modifier_map{'LEVEL4'} = 'Win';
+ $mouse_modifier_map{'WINDOW'} = 'Alt';
+}
+
+%keycodes = ();
+
+if ($html) {
+ %keycodes = (
+ 'asciicircum' => '^',
+ 'apostrophe' => '\'',
+ 'bracketleft' => '[',
+ 'bracketright' => ']',
+ 'braceleft' => '{',
+ 'braceright' => '}',
+ 'backslash' => '\\',
+ 'slash' => '/',
+ 'rightanglebracket' => '>',
+ 'leftanglebracket' => '<',
+ 'ampersand' => '&',
+ 'comma' => ',',
+ 'period' => '.',
+ 'semicolon' => ';',
+ 'colon' => ':',
+ 'equal' => '=',
+ 'minus' => '-',
+ 'plus' => '+',
+ 'grave' => '`',
+ 'rightarrow' => '→',
+ 'leftarrow' => '←',
+ 'uparrow' => '↑',
+ 'downarrow' => '↓',
+ 'Page_Down' => 'PageDown',
+ 'Page_Up' => 'PageUp',
+ 'space' => 'space',
+ 'KP_Right' => 'KP-→',
+ 'KP_Left' => 'KP-←',
+ 'KP_Up' => 'KP-↑',
+ 'KP_Down' => 'KP-↓',
+ 'KP_0' => 'KP-0;',
+ 'greater' => '>',
+ 'less' => '<',
+ );
+} else {
+
+ %keycodes = (
+ 'asciicircum' => '\\verb=^=',
+ 'apostrophe' => '\'',
+ 'bracketleft' => '[',
+ 'bracketright' => ']',
+ 'braceleft' => '\\{',
+ 'braceright' => '\\}',
+ 'backslash' => '$\\backslash$',
+ 'slash' => '/',
+ 'rightanglebracket' => '>',
+ 'leftanglebracket' => '<',
+ 'ampersand' => '\\&',
+ 'comma' => ',',
+ 'period' => '.',
+ 'semicolon' => ';',
+ 'colon' => ':',
+ 'equal' => '=',
+ 'minus' => '-',
+ 'plus' => '+',
+ 'grave' => '`',
+ 'rightarrow' => '$\rightarrow$',
+ 'leftarrow' => '$\\leftarrow$',
+ 'uparrow' => '$\\uparrow$',
+ 'downarrow' => '$\\downarrow$',
+ 'Page_Down' => 'Page Down',
+ 'Page_Up' => 'Page Up',
+ 'space' => 'space',
+ 'KP_' => 'KP$\_$',
+ 'greater' => '>',
+ 'less' => '<',
+ );
+}
+
+if ($merge_from) {
+ open (BINDINGS, $merge_from) || die ("merge from bindings: file not readable");
+ while (<BINDINGS>) {
+ next if (/^$semicolon/);
+ if (/^\(gtk_accel/) {
+ chop; # newline
+ chop; # closing parenthesis
+ s/"//g;
+ ($junk, $action, $binding) = split;
+ $merge_bindings{$action} = $binding;
+ }
+ }
+ close (BINDINGS);
+}
+
+if ($make_accelmap && !$merge_from) {
+ print ";; this accelmap was produced by tools/fmt-bindings\n";
+}