diff options
Diffstat (limited to 'devel/bin/create-wm-config.pl')
-rw-r--r-- | devel/bin/create-wm-config.pl | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/devel/bin/create-wm-config.pl b/devel/bin/create-wm-config.pl new file mode 100644 index 0000000..fe25a6a --- /dev/null +++ b/devel/bin/create-wm-config.pl @@ -0,0 +1,97 @@ +#! /usr/bin/perl -w + +# This script parses the template for the given window manager. +# +# GPL'ed by Mikhael Goikhman. + +# If a sum of sizes for an icon set is not greater than this limit, +# it is considered as mini (say 25x22), otherwise as norm (say 23x26). +$MINI_SIZE_LIMIT = 48; +$ICONS_DIR = '../../icons'; + +# chdir to the script's directory +$0 =~ m!^(.*)/[^/]+$!; chdir($1) if defined $1; + +my $wm = shift; +unless (defined $wm) { + print("Usage: $0 fvwm1|fvwm2|fvwm95|scvm\n"); + exit(-1); +} + +my $confName = shift || "wm-icons"; +my $wmTemplateFile = "../template/${wm}rc-$confName"; +unless (-f $wmTemplateFile) { + print("No $wm template $wmTemplateFile\n"); + exit(-2); +} + +my $styleIconsFile = "../conf/style-icons.cfg"; +unless (-f $styleIconsFile) { + print("No style icons configuration $styleIconsFile\n"); + exit(-3); +} + +my $outputFile = "../../etc/${wm}rc-$confName.in"; my $OUT; +unless (open(OUT, ">$outputFile")) { + print("Can't write to $outputFile\n"); + exit(-4); +} + +# must be rewritten not to use backquotes +my $wmTemplate = `cat $wmTemplateFile`; +my $styleIcons = `cat $styleIconsFile`; + +# remove non-strict (devel) comments +$styleIcons =~ s/^(#[^ ]|\t).*?\n//mg; + +my $defineAllIcons = ""; + +my @allNames = (); +foreach (`ls $ICONS_DIR/01x01-template`) { + /.*\.xpm$/ && push @allNames, $_; + /_symlinks.lst$/ && + push @allNames, `cut -d" " -f2 $ICONS_DIR/01x01-template/$_`; +} +my @allIcons = map { + chomp; ("menu/$_", "mini/$_", "norm/$_"); +} sort @allNames; + +my $maxIconLen = 0; map { /([^\/]+)\.xpm$/; $maxIconLen = length($1) if length($1) > $maxIconLen; } @allIcons; +my $adjustIcon = sub ($) { " " x ($maxIconLen - length(shift())) }; + +if ($wm eq 'fvwm1' || $wm eq 'fvwm2' || $wm eq 'fvwm95') { + my $miniIconCommand = $wm eq 'fvwm95'? 'TitleIcon': 'MiniIcon'; + my $miniIconPart = sub { $wm eq 'fvwm1'? '': + ", " . &$adjustIcon($_[0]) . "$miniIconCommand mini/$_[0].xpm"; + }; + $styleIcons =~ s{(".*?")( +)([\w\-]+)$} + {Style $1$2Icon norm\/$3.xpm${\&$miniIconPart($3)}}mg; +} elsif ($wm eq 'scwm') { + $styleIcons =~ s{(".*?")( +)([\w\-]+)$} + {(window-style $1$2#:icon wmi-norm-$3 #:mini-icon wmi-mini-$3)}mg; + $styleIcons =~ s/^#/;;/mg; + $defineAllIcons = join("", map { + $_ =~ m|^(\w+)/(.*)\.xpm$|; + qq{(define wmi-$1-$2 ${\&$adjustIcon($2)}(make-image "$_"))\n}; + } @allIcons); +} + +my @allIconSets = `ls $ICONS_DIR | grep 'x.*-'`; chomp(@allIconSets); +shift @allIconSets if $allIconSets[0] =~ /^01x01-/; +my @miniIconSets = grep(/^(\d+)x(\d+)/ && $1 + $2 <= $MINI_SIZE_LIMIT, @allIconSets); +my @normIconSets = grep(/^(\d+)x(\d+)/ && $1 + $2 > $MINI_SIZE_LIMIT, @allIconSets); + +my $maxIconSetLen = 0; map { $maxIconSetLen = length($_) if length($_) > $maxIconSetLen; } @allIconSets; +my $substitudeIconSet = sub ($$) { my ($str, $set) = @_; $str =~ s/\@ICON_SET\@/$set/sg; $str =~ s/\@ADJUST\@/" " x ($maxIconSetLen - length($set))/seg; $str }; + +$wmTemplate =~ s/{{STYLE_ICONS}}\n/$styleIcons/s; +$wmTemplate =~ s/{{DEFINE_ALL_ICONS}}\n/$defineAllIcons/s; +$wmTemplate =~ s/{{ICON_SET_ITERATOR\("\n?(.*?)"\)}}\n/ join('', map { &$substitudeIconSet($1, $_) } @allIconSets)/sge; +$wmTemplate =~ s/{{MINI_ICON_SET_ITERATOR\("\n?(.*?)"\)}}\n/join('', map { &$substitudeIconSet($1, $_) } @miniIconSets)/sge; +$wmTemplate =~ s/{{NORM_ICON_SET_ITERATOR\("\n?(.*?)"\)}}\n/join('', map { &$substitudeIconSet($1, $_) } @normIconSets)/sge; +$wmTemplate =~ s/{{SIZE_ICON_SET_ITERATOR\("(\d+x\d+)", "\n?(.*?)"\)}}\n/join('', map { &$substitudeIconSet($2, $_) } grep(m:^$1:, @allIconSets))/sge; + +print(OUT $wmTemplate); +close(OUT); + +exit(0); |