#!/usr/bin/perl use strict; use warnings; use ExtUtils::PkgConfig; use Gtk2; # depending on the locale, we may be writing wide characters (translations # of strings from gtk+). according to perldiag, we need to set an encoding # on our filehandles to avoid the "Wide character in %s" warnings. since # we're printing stuff directly from gtk+, which is in utf8... binmode STDOUT, ':utf8'; my @path = map { s/^-I//; $_ } grep /-I/, split /\s+/, {ExtUtils::PkgConfig->find ('gtk+-2.0')}->{cflags}; print "\n"; while ($_ = shift (@path)) { last if (-e "$_/gtk/gtkstock.h"); } my @ids; open HDR, "<$_/gtk/gtkstock.h" or die "unable to open ($_) for input"; while () { push @ids, $1 if (/#define\s+\w+\s+"(.*)"/); } close HDR; @ids = sort @ids; my @widths = (0, 0, 0); my @data; foreach (@ids) { my $info = Gtk2::Stock->lookup ($_); next unless ($info); my $mask = undef; if ($info->{modifier}) { $mask = join (',', @{$info->{modifier}}); $mask =~ s/-mask//g; $mask =~ s/(\w+)/<$1>-/g; $mask .= uc(chr($info->{keyval})); } push @data, [ $_, $info->{label} || '', $mask || '' ]; $widths[0] = length($data[$#data][0]) if (length($data[$#data][0]) > $widths[0]); $widths[1] = length($data[$#data][1]) if (length($data[$#data][1]) > $widths[1]); $widths[2] = length($data[$#data][2]) if (length($data[$#data][2]) > $widths[2]); } my $end = ' +-'.'-'x$widths[0].'-+-'.'-'x$widths[1].'-+-' .'-'x$widths[2]."-+\n"; my $fmt = " | %-$widths[0]s | %-$widths[1]s | %-$widths[2]s |\n"; print "=head1 Stock Items\n\n"; print $end; printf $fmt, 'Stock-Id', 'Label', 'Mod-Key'; print $end; foreach (@data) { printf $fmt, @$_; } print $end."\n=cut\n\n";