1 Author: Ben Hutchings <ben@decadent.org.uk>
2 Description: Combine puzzles into a single executable
4 Link all the puzzles into a single executable and use argv[0]
5 to decide which to run. This saves a large amount of disk
6 space due to the large amount of code that is otherwise
7 statically linked into multiple executables.
12 * gtk.c: GTK front end for my puzzle collection.
22 /* #undef USE_CAIRO */
23 /* #define NO_THICK_LINE */
26 +static const gameindex *thegameindex;
27 +#define thegame (*thegameindex->game)
28 +#define xpm_icons (thegameindex->xpm_icons)
29 +#define n_xpm_icons (*thegameindex->n_xpm_icons)
33 static FILE *debug_fp = NULL;
35 @@ -2190,8 +2200,6 @@ static frontend *new_window(char *arg, i
39 - extern char *const *const xpm_icons[];
40 - extern const int n_xpm_icons;
44 @@ -2585,7 +2593,8 @@ char *fgetline(FILE *fp)
46 int main(int argc, char **argv)
48 - char *pname = argv[0];
52 int ngenerate = 0, print = FALSE, px = 1, py = 1;
53 int time_generation = FALSE, test_solve = FALSE, list_presets = FALSE;
54 @@ -2601,6 +2610,28 @@ int main(int argc, char **argv)
59 + pname = strrchr(argv[0], '/');
64 + if (!strncmp(pname, "sgt-", 4))
66 + for (i = 0; i < gamecount; i++) {
67 + size_t len = strlen(gamelist[i].name);
68 + if (!strncmp(pname, gamelist[i].name, len) &&
69 + (pname[len] == 0 || !strcmp(pname + len, "game"))) {
70 + thegameindex = &gamelist[i];
74 + if (!thegameindex) {
75 + fprintf(stderr, "puzzles: unknown puzzle '%s'\n", pname);
81 * Command line parsing in this function is rather fiddly,
82 * because GTK wants to have a go at argc/argv _first_ - and
85 @@ -23,7 +23,7 @@ WINDOWS_COMMON = printing
86 + user32.lib gdi32.lib comctl32.lib comdlg32.lib winspool.lib
87 WINDOWS = windows WINDOWS_COMMON
88 COMMON = midend drawing misc malloc random version
89 -GTK = gtk printing ps
90 +GTK = gtk[COMBINED] printing ps
91 # Objects needed for auxiliary command-line programs.
92 STANDALONE = nullfe random misc malloc
94 @@ -39,6 +39,7 @@ ALL = list
95 * it directly, or the changes will be lost next time mkfiles.pl runs.
96 * Instead, edit Recipe and/or its *.R subfiles.
100 #define GAMELIST(A) \
102 @@ -49,10 +50,13 @@ ALL = list
103 # Then we finish up list.c as follows:
106 -#define DECL(x) extern const game x;
109 +extern const game x; \
110 +extern const char *const *const x##_xpm_icons[]; \
111 +extern const int x##_n_xpm_icons;
112 +#define REF(x) { #x, &x, x##_xpm_icons, &x##_n_xpm_icons },
114 -const game *gamelist[] = { GAMELIST(REF) };
115 +const gameindex gamelist[] = { GAMELIST(REF) };
116 const int gamecount = lenof(gamelist);
119 @@ -92,6 +96,12 @@ Puzzles.dmg: Puzzles
120 rm -f raw.dmg devicename
123 +# Gtk unified application containing all the puzzles.
124 +puzzles : [X] GTK COMMON ALL ALL_ICONS
126 +%-icon.o : override CFLAGS += -Dxpm_icons=$(@:%-icon.o=%)_xpm_icons -Dn_xpm_icons=$(@:%-icon.o=%)_n_xpm_icons
129 # Version management.
132 @@ -177,8 +187,11 @@ version2.def: FORCE
133 # make install for Unix.
136 + mkdir -p $(DESTDIR)$(libdir)/sgt-puzzles
137 + $(INSTALL_PROGRAM) -m 755 puzzles \
138 + $(DESTDIR)$(libdir)/sgt-puzzles/puzzles
139 for i in $(GAMES); do \
140 - $(INSTALL_PROGRAM) -m 755 $(BINPREFIX)$$i $(DESTDIR)$(gamesdir)/$(BINPREFIX)$$i \
141 + ln -s $(libdir)/sgt-puzzles/puzzles $(DESTDIR)$(gamesdir)/$(BINPREFIX)$$i \
147 @@ -1126,6 +1126,7 @@ if (defined $makefiles{'gtk'}) {
149 "exec_prefix=\$(prefix)\n",
150 "bindir=\$(exec_prefix)/bin\n",
151 + "libdir=\$(exec_prefix)/lib\n",
152 "gamesdir=\$(exec_prefix)/games\n",
153 "sharedir=\$(prefix)/share\n",
154 "mandir=\$(sharedir)/man\n",
157 @@ -581,7 +581,13 @@ struct drawing_api {
158 * there's a list of all available puzzles in array form.
161 -extern const game *gamelist[];
165 + const char *const *const *xpm_icons;
166 + const int *n_xpm_icons;
168 +extern const gameindex gamelist[];
169 extern const int gamecount;
171 extern const game thegame;
174 @@ -5,6 +5,7 @@ blackbox : [X] GTK COMMON blackbox black
175 blackbox : [G] WINDOWS COMMON blackbox blackbox.res|noicon.res
177 ALL += blackbox[COMBINED]
178 +ALL_ICONS += blackbox-icon
184 @@ -7,6 +7,7 @@ bridges : [X] GTK COMMON bridges BRIDGE
185 bridges : [G] WINDOWS COMMON bridges BRIDGES_EXTRA bridges.res|noicon.res
187 ALL += bridges[COMBINED] BRIDGES_EXTRA
188 +ALL_ICONS += bridges-icon
194 @@ -5,6 +5,7 @@ cube : [X] GTK COMMON cube cube-icon
195 cube : [G] WINDOWS COMMON cube cube.res|noicon.res
197 ALL += cube[COMBINED]
198 +ALL_ICONS += cube-icon
204 @@ -7,6 +7,7 @@ dominosa : [X] GTK COMMON dominosa DOMIN
205 dominosa : [G] WINDOWS COMMON dominosa DOMINOSA_EXTRA dominosa.res|noicon.res
207 ALL += dominosa[COMBINED] DOMINOSA_EXTRA
208 +ALL_ICONS += dominosa-icon
214 @@ -5,6 +5,7 @@ fifteen : [X] GTK COMMON fifteen fiftee
215 fifteen : [G] WINDOWS COMMON fifteen fifteen.res|noicon.res
217 ALL += fifteen[COMBINED]
218 +ALL_ICONS += fifteen-icon
224 @@ -10,6 +10,7 @@ filling : [X] GTK COMMON filling FILLING
225 filling : [G] WINDOWS COMMON filling FILLING_EXTRA filling.res|noicon.res
227 ALL += filling[COMBINED] FILLING_EXTRA
228 +ALL_ICONS += filling-icon
234 @@ -7,6 +7,7 @@ flip : [X] GTK COMMON flip FLIP_EXTR
235 flip : [G] WINDOWS COMMON flip FLIP_EXTRA flip.res|noicon.res
237 ALL += flip[COMBINED] FLIP_EXTRA
238 +ALL_ICONS += flip-icon
244 @@ -14,6 +14,7 @@ galaxiespicture : [U] galaxies[STANDALON
245 galaxiespicture : [C] galaxies[STANDALONE_PICTURE_GENERATOR] GALAXIES_EXTRA STANDALONE
247 ALL += galaxies[COMBINED] GALAXIES_EXTRA
248 +ALL_ICONS += galaxies-icon
254 @@ -5,6 +5,7 @@ guess : [X] GTK COMMON guess guess-ic
255 guess : [G] WINDOWS COMMON guess guess.res|noicon.res
257 ALL += guess[COMBINED]
258 +ALL_ICONS += guess-icon
264 @@ -5,6 +5,7 @@ inertia : [X] GTK COMMON inertia inerti
265 inertia : [G] WINDOWS COMMON inertia inertia.res|noicon.res
267 ALL += inertia[COMBINED]
268 +ALL_ICONS += inertia-icon
274 @@ -10,6 +10,7 @@ lightupsolver : [U] lightup[STANDALONE_S
275 lightupsolver : [C] lightup[STANDALONE_SOLVER] LIGHTUP_EXTRA STANDALONE
277 ALL += lightup[COMBINED] LIGHTUP_EXTRA
278 +ALL_ICONS += lightup-icon
284 @@ -17,6 +17,7 @@ loopysolver : [C] loopy[STANDALONE_SOL
287 ALL += loopy[COMBINED] LOOPY_EXTRA
288 +ALL_ICONS += loopy-icon
294 @@ -10,6 +10,7 @@ mapsolver : [U] map[STANDALONE_SOLVE
295 mapsolver : [C] map[STANDALONE_SOLVER] MAP_EXTRA STANDALONE
297 ALL += map[COMBINED] MAP_EXTRA
298 +ALL_ICONS += map-icon
304 @@ -10,6 +10,7 @@ mineobfusc : [U] mines[STANDALONE_OBF
305 mineobfusc : [C] mines[STANDALONE_OBFUSCATOR] MINES_EXTRA STANDALONE
307 ALL += mines[COMBINED] MINES_EXTRA
308 +ALL_ICONS += mines-icon
314 @@ -9,6 +9,7 @@ net : [X] GTK COMMON net NET_EXTRA
315 netgame : [G] WINDOWS COMMON net NET_EXTRA net.res|noicon.res
317 ALL += net[COMBINED] NET_EXTRA
318 +ALL_ICONS += net-icon
324 @@ -7,6 +7,7 @@ netslide : [X] GTK COMMON netslide NETSL
325 netslide : [G] WINDOWS COMMON netslide NETSLIDE_EXTRA netslide.res|noicon.res
327 ALL += netslide[COMBINED] NETSLIDE_EXTRA
328 +ALL_ICONS += netslide-icon
334 @@ -8,6 +8,7 @@ patternsolver : [U] pattern[STANDALONE_S
335 patternsolver : [C] pattern[STANDALONE_SOLVER] STANDALONE
337 ALL += pattern[COMBINED]
338 +ALL_ICONS += pattern-icon
344 @@ -7,6 +7,7 @@ pegs : [X] GTK COMMON pegs PEGS_EXTR
345 pegs : [G] WINDOWS COMMON pegs PEGS_EXTRA pegs.res|noicon.res
347 ALL += pegs[COMBINED] PEGS_EXTRA
348 +ALL_ICONS += pegs-icon
354 @@ -5,6 +5,7 @@ rect : [X] GTK COMMON rect rect-icon
355 rect : [G] WINDOWS COMMON rect rect.res|noicon.res
357 ALL += rect[COMBINED]
358 +ALL_ICONS += rect-icon
364 @@ -5,6 +5,7 @@ samegame : [X] GTK COMMON samegame sameg
365 samegame : [G] WINDOWS COMMON samegame samegame.res|noicon.res
367 ALL += samegame[COMBINED]
368 +ALL_ICONS += samegame-icon
374 @@ -5,6 +5,7 @@ sixteen : [X] GTK COMMON sixteen sixtee
375 sixteen : [G] WINDOWS COMMON sixteen sixteen.res|noicon.res
377 ALL += sixteen[COMBINED]
378 +ALL_ICONS += sixteen-icon
384 @@ -10,6 +10,7 @@ slantsolver : [U] slant[STANDALONE_SOL
385 slantsolver : [C] slant[STANDALONE_SOLVER] SLANT_EXTRA STANDALONE
387 ALL += slant[COMBINED] SLANT_EXTRA
388 +ALL_ICONS += slant-icon
394 @@ -10,6 +10,7 @@ solosolver : [U] solo[STANDALONE_SOLV
395 solosolver : [C] solo[STANDALONE_SOLVER] SOLO_EXTRA STANDALONE
397 ALL += solo[COMBINED] SOLO_EXTRA
398 +ALL_ICONS += solo-icon
404 @@ -7,6 +7,7 @@ tents : [X] GTK COMMON tents TENTS_EX
405 tents : [G] WINDOWS COMMON tents TENTS_EXTRA tents.res|noicon.res
407 ALL += tents[COMBINED] TENTS_EXTRA
408 +ALL_ICONS += tents-icon
410 tentssolver : [U] tents[STANDALONE_SOLVER] TENTS_EXTRA STANDALONE
411 tentssolver : [C] tents[STANDALONE_SOLVER] TENTS_EXTRA STANDALONE
414 @@ -5,6 +5,7 @@ twiddle : [X] GTK COMMON twiddle twiddl
415 twiddle : [G] WINDOWS COMMON twiddle twiddle.res|noicon.res
417 ALL += twiddle[COMBINED]
418 +ALL_ICONS += twiddle-icon
424 @@ -13,6 +13,7 @@ latincheck : [U] latin[STANDALONE_LATIN_
425 latincheck : [C] latin[STANDALONE_LATIN_TEST] tree234 maxflow STANDALONE
427 ALL += unequal[COMBINED] UNEQUAL_EXTRA
428 +ALL_ICONS += unequal-icon
434 @@ -7,6 +7,7 @@ untangle : [X] GTK COMMON untangle UNTAN
435 untangle : [G] WINDOWS COMMON untangle UNTANGLE_EXTRA untangle.res|noicon.res
437 ALL += untangle[COMBINED] UNTANGLE_EXTRA
438 +ALL_ICONS += untangle-icon
444 @@ -11,6 +11,7 @@ keensolver : [U] keen[STANDALONE_SOLVER]
445 keensolver : [C] keen[STANDALONE_SOLVER] latin[STANDALONE_SOLVER] KEEN_LATIN_EXTRA STANDALONE
447 ALL += keen[COMBINED] KEEN_EXTRA
448 +ALL_ICONS += keen-icon
454 @@ -10,6 +10,7 @@ magnetssolver : [U] magnets[STANDALO
455 magnetssolver : [C] magnets[STANDALONE_SOLVER] MAGNETS_EXTRA STANDALONE
457 ALL += magnets[COMBINED] MAGNETS_EXTRA
458 +ALL_ICONS += magnets-icon
464 @@ -6,6 +6,7 @@ singles : [X] GTK COMMON singles SINGLES
465 singles : [G] WINDOWS COMMON singles SINGLES_EXTRA singles.res|noicon.res
467 ALL += singles[COMBINED] SINGLES_EXTRA
468 +ALL_ICONS += singles-icon
470 singlessolver : [U] singles[STANDALONE_SOLVER] SINGLES_EXTRA STANDALONE
471 singlessolver : [C] singles[STANDALONE_SOLVER] SINGLES_EXTRA STANDALONE
474 @@ -11,6 +11,7 @@ towerssolver : [U] towers[STANDALONE_SOL
475 towerssolver : [C] towers[STANDALONE_SOLVER] latin[STANDALONE_SOLVER] TOWERS_LATIN_EXTRA STANDALONE
477 ALL += towers[COMBINED] TOWERS_EXTRA
478 +ALL_ICONS += towers-icon
484 @@ -9,6 +9,7 @@ signpostsolver : [U] signpost[STANDALONE
485 signpostsolver : [C] signpost[STANDALONE_SOLVER] SIGNPOST_EXTRA STANDALONE
487 ALL += signpost[COMBINED] SIGNPOST_EXTRA
488 +ALL_ICONS += signpost-icon
494 @@ -5,6 +5,7 @@ range : [X] GTK COMMON range range-ic
495 range : [G] WINDOWS COMMON range range.res|noicon.res
497 ALL += range[COMBINED]
498 +ALL_ICONS += range-icon
504 @@ -9,6 +9,7 @@ pearlbench : [U] pearl[STANDALONE_SO
505 pearlbench : [C] pearl[STANDALONE_SOLVER] PEARL_EXTRA STANDALONE
507 ALL += pearl[COMBINED] PEARL_EXTRA
508 +ALL_ICONS += pearl-icon
514 @@ -4,6 +4,7 @@ undead : [X] GTK COMMON undead undead-ic
515 undead : [G] WINDOWS COMMON undead undead.res|noicon.res
517 ALL += undead[COMBINED]
518 +ALL_ICONS += undead-icon
524 @@ -7,6 +7,7 @@ unrulysolver : [U] unruly[STANDALONE_SOL
525 unrulysolver : [C] unruly[STANDALONE_SOLVER] STANDALONE
527 ALL += unruly[COMBINED]
528 +ALL_ICONS += unruly-icon