in message <20030425235341.01011CAA5_at_dane-2.cc.telcordia.com>,
wrote Dan Espen thusly...
>
> parv <parv_fm_at_fastmail.fm> writes:
> > 
> > A crude way is to create permutations (or is it combinations?) of
> > all the keys & mouse buttons mapping to '-'; stick them in a file of
> > its own; then 'Read' it in before normal key bindings.
> > 
> > Here is one untested way to generate the syntax which are bound by
> > single modifier & in single context for ASCII values in [33,126] ...
( some code )
> That would miss keys like "Help" (Sun keyboard).
That is true; as i said 'untested way'... here is slightly better
one (supply appropriate locale/font/keyboard type as they appear in
X11 keysymdef.h if 'latin1' default is not desired) ...
  #!/usr/local/bin/perl -w
  use strict;
  #  X11 file containing key symbol definitions
  my $keysym = '/usr/X11R6/include/X11/keysymdef.h';
  make_noop( find_keysym($keysym) );
  #  create no-op key bindings
  sub make_noop
  {
    #  see fvwm(1) man page for what it is context & what is modifier
    #  following collection is from version 2.5.6
    my _at_context = (0..9 , qw/A R T F W D S [ ] - _ < > ^ v I/);
    my _at_modifiers = (1..5 , qw/M S C N A L/);
    for my $context ( _at_context )
    { for my $mod ( _at_modifiers )
      { for my $key ( _at_{$_[0]} )
        { printf "key %s %s %s -\n" , $key , $context , $mod;
        }
      }
    }
  }
  #  set keyboard types to search for (as they occur in keysymdef.h)
  sub kbd_type
  { my $regex = shift;
    return ( scalar _at_ARGV
            ? map { s/$regex/$1/; $_; } _at_ARGV
            : qw(latin1)
          );
  }
  #  returns key symbols w/o 'XK_' prefix from a given file, most likely needs
  #  to be as X11 keysymdef.h
  sub find_keysym
  {
    my $keysym = shift;
    open KEYSYM , '<' , $keysym or die "cannot open $keysym: $!\n";
    #  save the key symbol matching pattern as it is used in more than one place
    my $sym = qr/[_[:alnum:]]+/;
    my $xk_sym   = qr/(?i:XK_) ($sym)/x;
    my $xk_opt_sym = qr/(?i:XK_)? ($sym)/x;
    #  create regex to find the (starting of) appropriate #ifdef section(s)
    my $start =
      '(?i:'
      .  join( '|'
            , map { 'XK_' . $_ } ('MISCELLANY', kbd_type($xk_opt_sym))
            )
      . ')';
    $start = qr/^ \#ifdef \s+ $start/x;
    #  regex to search & extract the 'XK_' lines/keys
    my $extract = qr/^ \#define \s+ $xk_sym/x;
    my _at_keys;
    while ( defined (my $line = <KEYSYM>) )
    { if ( ($line =~ /$start/) .. ($line =~ /^#endif/) )
      { next unless $line =~ m/$extract/;
        push _at_keys , $1;
      }
    }
    close KEYSYM or die "cannot close $keysym: $!\n";
    return \_at_keys;
  }
  __END__
...Mind you, if above is run over all the extracted '#define's in
keysymdef.h, about 11 MB output is generated.
> A little less extreme is a PipeRead script reading and extracting
> all the "Key" commands from ConfigFvwmDefaults, but its not like a
> new builtin keybinding is added every day.
How about this then (just to remove the bindings)...
  #!/usr/local/bin/perl -w
  use strict;
  #  fvwm default key bindings
  my $key_file = '/usr/X11R6/share/fvwm/ConfigFvwmDefaults';
  make_noop( find_keys($key_file) );
  #  create no-op key bindings
  sub make_noop
  { printf "%s -\n" , $_ for _at_{$_[0]};
  }
  #  returns key bindings minus the binded action from fvwm default key
  #  bindings
  sub find_keys
  {
    my $key_file = shift;
    open FILE , '<' , $key_file or die "cannot open $key_file: $!\n";
    #  regex to extract (save) key binding (until the binded action)
    my $extract = qr{^\s*( (?:Silent \s+)?
                          (key|mouse) \s+ \w+ \s+ \w+ \s+ \w+
                        ) .+
                    }ix;
    my _at_keys;
    while ( defined (my $line = <FILE>) )
    { next unless $line =~ m/$extract/;
      chomp($line);
      push _at_keys , $1;
    }
    close FILE or die "cannot close $key_file: $!\n";
    return \_at_keys;
  }
  __END__
  - parv
-- 
--
Visit the official FVWM web page at <URL: http://www.fvwm.org/>.
To unsubscribe from the list, send "unsubscribe fvwm" in the body of a
message to majordomo_at_fvwm.org.
To report problems, send mail to fvwm-owner_at_fvwm.org.
Received on Sat Apr 26 2003 - 00:05:35 BST