The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/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 (<HDR>)
{
	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";