ref: be8076a6e66cb4a2ac911eb65712b669f6df509a
parent: d07eb2ea3a85913edb826a3e9c3ffc8abda71771
author: Simon Tatham <[email protected]>
date: Wed Dec 27 06:05:20 EST 2006
Actually introduce the ability to build the Windows icons into the Windows puzzle binaries. This checkin involves several distinct changes: - mkfiles.pl now has an extra feature: if an object file is listed in Recipe with a trailing question mark, it will be considered optional, and silently dropped from the makefile if its primary source file isn't present at the time mkfiles.pl runs. This means people who check out the puzzles from Subversion and just run mkfiles.pl shouldn't get build failures; they just won't get the icons. - all the .R files now use this feature to include an optional Windows resource file. - the .rc resource source files are built by icons/Makefile. - windows.c finds the icon if present and uses it in place of the standard Windows application icon. [originally from svn r7020]
--- a/Recipe
+++ b/Recipe
@@ -13,6 +13,8 @@
!makefile cygwin Makefile.cyg
!makefile osx Makefile.osx
+!srcdir icons/
+
WINDOWS = windows printing
+ user32.lib gdi32.lib comctl32.lib comdlg32.lib winspool.lib
COMMON = midend drawing misc malloc random version
--- a/blackbox.R
+++ b/blackbox.R
@@ -2,7 +2,7 @@
blackbox : [X] GTK COMMON blackbox
-blackbox : [G] WINDOWS COMMON blackbox
+blackbox : [G] WINDOWS COMMON blackbox blackbox.res?
ALL += blackbox
--- a/bridges.R
+++ b/bridges.R
@@ -4,7 +4,7 @@
bridges : [X] GTK COMMON BRIDGES
-bridges : [G] WINDOWS COMMON BRIDGES
+bridges : [G] WINDOWS COMMON BRIDGES bridges.res?
ALL += BRIDGES
--- a/cube.R
+++ b/cube.R
@@ -2,7 +2,7 @@
cube : [X] GTK COMMON cube
-cube : [G] WINDOWS COMMON cube
+cube : [G] WINDOWS COMMON cube cube.res?
ALL += cube
--- a/dominosa.R
+++ b/dominosa.R
@@ -2,7 +2,7 @@
dominosa : [X] GTK COMMON dominosa
-dominosa : [G] WINDOWS COMMON dominosa
+dominosa : [G] WINDOWS COMMON dominosa dominosa.res?
ALL += dominosa
--- a/fifteen.R
+++ b/fifteen.R
@@ -2,7 +2,7 @@
fifteen : [X] GTK COMMON fifteen
-fifteen : [G] WINDOWS COMMON fifteen
+fifteen : [G] WINDOWS COMMON fifteen fifteen.res?
ALL += fifteen
--- a/flip.R
+++ b/flip.R
@@ -4,7 +4,7 @@
flip : [X] GTK COMMON FLIP
-flip : [G] WINDOWS COMMON FLIP
+flip : [G] WINDOWS COMMON FLIP flip.res?
ALL += FLIP
--- a/guess.R
+++ b/guess.R
@@ -2,7 +2,7 @@
guess : [X] GTK COMMON guess
-guess : [G] WINDOWS COMMON guess
+guess : [G] WINDOWS COMMON guess guess.res?
ALL += guess
--- a/icons/Makefile
+++ b/icons/Makefile
@@ -19,6 +19,7 @@
P16D8 = $(patsubst %,%-16d8.png,$(PUZZLES))
P16D4 = $(patsubst %,%-16d4.png,$(PUZZLES))
ICONS = $(patsubst %,%.ico,$(PUZZLES))
+RC = $(patsubst %,%.rc,$(PUZZLES))
BIN = ../
PIC = ./
@@ -26,7 +27,7 @@
base: $(BASE)
web: $(WEB)
pngicons: $(P48D24) $(P32D24) $(P16D24)
-icons: $(ICONS)
+winicons: $(ICONS) $(RC)
# Build the base puzzle screenshots from which all the other images
# are derived. Some of them involve showing a move animation
@@ -108,12 +109,16 @@
convert -colors 16 -map $(PIC)win16pal.xpm tmp2.png $@
rm -f tmp.png tmp2.png
-# And build the actual icons themselves, by feeding all those PNGs
-# to my icon builder script.
+# Build the actual Windows icons themselves, by feeding all those
+# PNGs to my icon builder script.
$(ICONS): %.ico: %-48d24.png %-48d8.png %-48d4.png \
%-32d24.png %-32d8.png %-32d4.png \
%-16d24.png %-16d8.png %-16d4.png
$(PIC)icon.pl $? > $@
+# Build the .RC files which bind the icons into the applications.
+$(RC): %.rc:
+ echo '200 ICON "$*.ico"' > $@
+
clean:
- rm -f *.png *.ico
+ rm -f *.png *.ico *.rc
--- a/inertia.R
+++ b/inertia.R
@@ -2,7 +2,7 @@
inertia : [X] GTK COMMON inertia
-inertia : [G] WINDOWS COMMON inertia
+inertia : [G] WINDOWS COMMON inertia inertia.res?
ALL += inertia
--- a/lightup.R
+++ b/lightup.R
@@ -4,7 +4,7 @@
lightup : [X] GTK COMMON LIGHTUP
-lightup : [G] WINDOWS COMMON LIGHTUP
+lightup : [G] WINDOWS COMMON LIGHTUP lightup.res?
lightupsolver : [U] lightup[STANDALONE_SOLVER] combi STANDALONE
lightupsolver : [C] lightup[STANDALONE_SOLVER] combi STANDALONE
--- a/loopy.R
+++ b/loopy.R
@@ -4,7 +4,7 @@
loopy : [X] GTK COMMON LOOPY
-loopy : [G] WINDOWS COMMON LOOPY
+loopy : [G] WINDOWS COMMON LOOPY loopy.res?
ALL += LOOPY
--- a/map.R
+++ b/map.R
@@ -4,7 +4,7 @@
map : [X] GTK COMMON MAP
-map : [G] WINDOWS COMMON MAP
+map : [G] WINDOWS COMMON MAP map.res?
mapsolver : [U] map[STANDALONE_SOLVER] dsf STANDALONE m.lib
mapsolver : [C] map[STANDALONE_SOLVER] dsf STANDALONE
--- a/mines.R
+++ b/mines.R
@@ -4,7 +4,7 @@
mines : [X] GTK COMMON MINES
-mines : [G] WINDOWS COMMON MINES
+mines : [G] WINDOWS COMMON MINES mines.res?
mineobfusc : [U] mines[STANDALONE_OBFUSCATOR] tree234 STANDALONE
mineobfusc : [C] mines[STANDALONE_OBFUSCATOR] tree234 STANDALONE
--- a/mkfiles.pl
+++ b/mkfiles.pl
@@ -130,8 +130,17 @@
$i eq "[X]" or $i eq "[U]" or $i eq "[MX]") and defined $prog) {
$type = substr($i,1,(length $i)-2);
} else {
- push @$listref, $i;
- push @allobjs, $i;
+ if ($i =~ /\?$/) {
+ # Source files with a trailing question mark are optional:
+ # the build can proceed fine without them, so we only use
+ # them if they're present.
+ $i =~ s/\?$//;
+ $i = undef unless defined &finddep($i);
+ }
+ if (defined $i) {
+ push @$listref, $i;
+ push @allobjs, $i;
+ }
}
}
if ($prog and $type) {
@@ -192,25 +201,10 @@
$programs{$i} = [@list];
foreach $jj (@list) {
$j = $srcname{$jj};
- # Dependencies for "x" start with "x.c" or "x.m" (depending on
- # which one exists).
- # Dependencies for "x.res" start with "x.rc".
- # Dependencies for "x.rsrc" start with "x.r".
- # Both types of file are pushed on the list of files to scan.
- # Libraries (.lib) don't have dependencies at all.
- if ($j =~ /^(.*)\.res$/) {
- $file = "$1.rc";
+ $file = &finddep($j);
+ if (defined $file) {
$depends{$jj} = [$file];
push @scanlist, $file;
- } elsif ($j =~ /^(.*)\.rsrc$/) {
- $file = "$1.r";
- $depends{$jj} = [$file];
- push @scanlist, $file;
- } elsif ($j !~ /\./) {
- $file = "$j.c";
- $file = "$j.m" unless &findfile($file);
- $depends{$jj} = [$file];
- push @scanlist, $file;
}
}
}
@@ -315,6 +309,32 @@
return $findfilecache{$name};
}
+sub finddep {
+ my $j = shift @_;
+ my $file;
+ # Find the first dependency of an object.
+
+ # Dependencies for "x" start with "x.c" or "x.m" (depending on
+ # which one exists).
+ # Dependencies for "x.res" start with "x.rc".
+ # Dependencies for "x.rsrc" start with "x.r".
+ # Both types of file are pushed on the list of files to scan.
+ # Libraries (.lib) don't have dependencies at all.
+ if ($j =~ /^(.*)\.res$/) {
+ $file = "$1.rc";
+ } elsif ($j =~ /^(.*)\.rsrc$/) {
+ $file = "$1.r";
+ } elsif ($j !~ /\./) {
+ $file = "$j.c";
+ $file = "$j.m" unless &findfile($file);
+ } else {
+ # For everything else, we assume it's its own dependency.
+ $file = $j;
+ }
+ $file = undef unless &findfile($file);
+ return $file;
+}
+
sub objects {
my ($prog, $otmpl, $rtmpl, $ltmpl, $prefix, $dirsep) = @_;
my @ret;
@@ -655,7 +675,7 @@
"\n";
if ($d->{obj} =~ /\.res$/) {
print "\trc \$(FWHACK) \$(RCFL) -r -DWIN32 -D_WIN32 ".
- "-DWINVER=0x0400 ".$d->{deps}->[0]."\n";
+ "-DWINVER=0x0400 -fo".$d->{obj}." ".$d->{deps}->[0]."\n";
} else {
$deflist = join "", map { " /D$_" } @{$d->{defs}};
print "\tcl \$(COMPAT) \$(FWHACK) \$(CFLAGS) \$(XFLAGS)$deflist".
--- a/net.R
+++ b/net.R
@@ -6,7 +6,7 @@
# The Windows Net shouldn't be called `net.exe' since Windows
# already has a reasonably important utility program by that name!
-netgame : [G] WINDOWS COMMON NET
+netgame : [G] WINDOWS COMMON NET net.res?
ALL += NET
--- a/netslide.R
+++ b/netslide.R
@@ -4,7 +4,7 @@
netslide : [X] GTK COMMON NETSLIDE
-netslide : [G] WINDOWS COMMON NETSLIDE
+netslide : [G] WINDOWS COMMON NETSLIDE netslide.res?
ALL += NETSLIDE
--- a/pattern.R
+++ b/pattern.R
@@ -2,7 +2,7 @@
pattern : [X] GTK COMMON pattern
-pattern : [G] WINDOWS COMMON pattern
+pattern : [G] WINDOWS COMMON pattern pattern.res?
patternsolver : [U] pattern[STANDALONE_SOLVER] STANDALONE
patternsolver : [C] pattern[STANDALONE_SOLVER] STANDALONE
--- a/pegs.R
+++ b/pegs.R
@@ -4,7 +4,7 @@
pegs : [X] GTK COMMON PEGS
-pegs : [G] WINDOWS COMMON PEGS
+pegs : [G] WINDOWS COMMON PEGS pegs.res?
ALL += PEGS
--- a/rect.R
+++ b/rect.R
@@ -2,7 +2,7 @@
rect : [X] GTK COMMON rect
-rect : [G] WINDOWS COMMON rect
+rect : [G] WINDOWS COMMON rect rect.res?
ALL += rect
--- a/samegame.R
+++ b/samegame.R
@@ -2,7 +2,7 @@
samegame : [X] GTK COMMON samegame
-samegame : [G] WINDOWS COMMON samegame
+samegame : [G] WINDOWS COMMON samegame samegame.res?
ALL += samegame
--- a/sixteen.R
+++ b/sixteen.R
@@ -2,7 +2,7 @@
sixteen : [X] GTK COMMON sixteen
-sixteen : [G] WINDOWS COMMON sixteen
+sixteen : [G] WINDOWS COMMON sixteen sixteen.res?
ALL += sixteen
--- a/slant.R
+++ b/slant.R
@@ -4,7 +4,7 @@
slant : [X] GTK COMMON SLANT
-slant : [G] WINDOWS COMMON SLANT
+slant : [G] WINDOWS COMMON SLANT slant.res?
slantsolver : [U] slant[STANDALONE_SOLVER] dsf STANDALONE
slantsolver : [C] slant[STANDALONE_SOLVER] dsf STANDALONE
--- a/solo.R
+++ b/solo.R
@@ -2,7 +2,7 @@
solo : [X] GTK COMMON solo
-solo : [G] WINDOWS COMMON solo
+solo : [G] WINDOWS COMMON solo solo.res?
solosolver : [U] solo[STANDALONE_SOLVER] STANDALONE
solosolver : [C] solo[STANDALONE_SOLVER] STANDALONE
--- a/tents.R
+++ b/tents.R
@@ -4,7 +4,7 @@
tents : [X] GTK COMMON TENTS
-tents : [G] WINDOWS COMMON TENTS
+tents : [G] WINDOWS COMMON TENTS tents.res?
ALL += TENTS
--- a/twiddle.R
+++ b/twiddle.R
@@ -2,7 +2,7 @@
twiddle : [X] GTK COMMON twiddle
-twiddle : [G] WINDOWS COMMON twiddle
+twiddle : [G] WINDOWS COMMON twiddle twiddle.res?
ALL += twiddle
--- a/untangle.R
+++ b/untangle.R
@@ -4,7 +4,7 @@
untangle : [X] GTK COMMON UNTANGLE
-untangle : [G] WINDOWS COMMON UNTANGLE
+untangle : [G] WINDOWS COMMON UNTANGLE untangle.res?
ALL += UNTANGLE
--- a/windows.c
+++ b/windows.c
@@ -2441,7 +2441,9 @@
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = inst;
- wndclass.hIcon = LoadIcon(inst, IDI_APPLICATION);
+ wndclass.hIcon = LoadIcon(inst, MAKEINTRESOURCE(200));
+ if (!wndclass.hIcon) /* in case resource file is absent */
+ wndclass.hIcon = LoadIcon(inst, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = NULL;
wndclass.lpszMenuName = NULL;