summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
author Robbbert <Robbbert@users.noreply.github.com>2023-08-05 21:15:28 +1000
committer Robbbert <Robbbert@users.noreply.github.com>2023-08-05 21:15:28 +1000
commit7798e5c9cf94b874e8ab405c55802e6b608ee78b (patch)
tree4ef3217277539ea7e9df987d05fd6fab631c4bac
parentae6d86839594d4a1fa1b7aae3bb08e2d12de5b7e (diff)
Files for 245.13tag24513
-rw-r--r--docs/release/build/make64.bat3
-rw-r--r--docs/release/docs/hbnew.txt2
-rw-r--r--docs/release/makefile4
-rw-r--r--docs/release/src/hbmame/drivers/arkanoid.cpp25
-rw-r--r--docs/release/src/hbmame/drivers/cps2mis.cpp55
-rw-r--r--docs/release/src/hbmame/drivers/galaxian.cpp20
-rw-r--r--docs/release/src/hbmame/drivers/mhavoc_hb.cpp1
-rw-r--r--docs/release/src/hbmame/drivers/neogeohb.cpp23
-rw-r--r--docs/release/src/hbmame/drivers/puckman.cpp10
-rw-r--r--docs/release/src/hbmame/hbmame.lst7
-rw-r--r--docs/release/src/hbmame/includes/mhavoc_hb.h38
-rw-r--r--docs/release/src/osd/winui/bitmask.cpp1
-rw-r--r--docs/release/src/osd/winui/bitmask.h5
-rw-r--r--docs/release/src/osd/winui/columnedit.h5
-rw-r--r--docs/release/src/osd/winui/datamap.h8
-rw-r--r--docs/release/src/osd/winui/dialogs.cpp1
-rw-r--r--docs/release/src/osd/winui/dijoystick.cpp2
-rw-r--r--docs/release/src/osd/winui/dijoystick.h5
-rw-r--r--docs/release/src/osd/winui/directinput.cpp1
-rw-r--r--docs/release/src/osd/winui/directinput.h5
-rw-r--r--docs/release/src/osd/winui/directories.h1
-rw-r--r--docs/release/src/osd/winui/dirwatch.h5
-rw-r--r--docs/release/src/osd/winui/emu_opts.cpp14
-rw-r--r--docs/release/src/osd/winui/emu_opts.h3
-rw-r--r--docs/release/src/osd/winui/game_opts.h14
-rw-r--r--docs/release/src/osd/winui/hbmameui.rc25
-rw-r--r--docs/release/src/osd/winui/help.cpp3
-rw-r--r--docs/release/src/osd/winui/help.h5
-rw-r--r--docs/release/src/osd/winui/history.cpp31
-rw-r--r--docs/release/src/osd/winui/layout.cpp5
-rw-r--r--docs/release/src/osd/winui/main.cpp1
-rw-r--r--docs/release/src/osd/winui/mameui.rc1463
-rw-r--r--docs/release/src/osd/winui/mkhelp.cpp30
-rw-r--r--docs/release/src/osd/winui/mui_audit.cpp1
-rw-r--r--docs/release/src/osd/winui/mui_audit.h5
-rw-r--r--docs/release/src/osd/winui/mui_main.cpp1
-rw-r--r--docs/release/src/osd/winui/mui_opts.cpp10
-rw-r--r--docs/release/src/osd/winui/mui_opts.h3
-rw-r--r--docs/release/src/osd/winui/mui_util.h5
-rw-r--r--docs/release/src/osd/winui/newui.h5
-rw-r--r--docs/release/src/osd/winui/newuires.h10
-rw-r--r--docs/release/src/osd/winui/picker.cpp65
-rw-r--r--docs/release/src/osd/winui/picker.h8
-rw-r--r--docs/release/src/osd/winui/properties.cpp14
-rw-r--r--docs/release/src/osd/winui/res/mameui.manifest1
-rw-r--r--docs/release/src/osd/winui/resource.h19
-rw-r--r--docs/release/src/osd/winui/resource.hm1
-rw-r--r--docs/release/src/osd/winui/screenshot.h1
-rw-r--r--docs/release/src/osd/winui/splitters.cpp1
-rw-r--r--docs/release/src/osd/winui/splitters.h7
-rw-r--r--docs/release/src/osd/winui/tabview.cpp1
-rw-r--r--docs/release/src/osd/winui/tabview.h5
-rw-r--r--docs/release/src/osd/winui/treeview.cpp2264
-rw-r--r--docs/release/src/osd/winui/treeview.h134
-rw-r--r--docs/release/src/osd/winui/treeview_o.cpp2587
-rw-r--r--docs/release/src/osd/winui/treeview_o.h214
-rw-r--r--docs/release/src/osd/winui/ui_opts.h3
-rw-r--r--docs/release/src/osd/winui/winui.cpp351
-rw-r--r--docs/release/src/osd/winui/winui.h7
-rw-r--r--docs/release/src/version.cpp2
-rw-r--r--makefile4
-rw-r--r--src/version.cpp2
62 files changed, 4329 insertions, 3223 deletions
diff --git a/docs/release/build/make64.bat b/docs/release/build/make64.bat
index 39ef19c26b5..92a8f056e4f 100644
--- a/docs/release/build/make64.bat
+++ b/docs/release/build/make64.bat
@@ -1,5 +1,6 @@
@echo off
-set MINGW64=E:\Mingw\10-1-0\mingw64
+@rem set MINGW64=C:\Mingw\10-1-0\mingw64
+ set MINGW64=C:\Mingw\11-2-0\mingw64
set minpath=%MINGW64%\bin
set oldpath=%Path%
set Path=%minpath%;%oldpath%
diff --git a/docs/release/docs/hbnew.txt b/docs/release/docs/hbnew.txt
index 564f659b9db..78005986047 100644
--- a/docs/release/docs/hbnew.txt
+++ b/docs/release/docs/hbnew.txt
@@ -1,7 +1,7 @@
What's new in HBMAME
====================
-2023-0x-xx 0.245.13
+2023-08-05 0.245.13
- HBMAMEUI: Can save a filter combination as a new filter.
diff --git a/docs/release/makefile b/docs/release/makefile
index 4e38acd89ba..8b5117f1971 100644
--- a/docs/release/makefile
+++ b/docs/release/makefile
@@ -1546,7 +1546,7 @@ endif
ifeq (posix,$(SHELLTYPE))
$(GENDIR)/version.cpp: makefile $(GENDIR)/git_desc | $(GEN_FOLDERS)
- @echo '#define BARE_BUILD_VERSION "0.245.12"' > $@
+ @echo '#define BARE_BUILD_VERSION "0.245.13"' > $@
@echo '#define BARE_VCS_REVISION "$(NEW_GIT_VERSION)"' >> $@
@echo 'extern const char bare_build_version[];' >> $@
@echo 'extern const char bare_vcs_revision[];' >> $@
@@ -1556,7 +1556,7 @@ $(GENDIR)/version.cpp: makefile $(GENDIR)/git_desc | $(GEN_FOLDERS)
@echo 'const char build_version[] = BARE_BUILD_VERSION " (" BARE_VCS_REVISION ")";' >> $@
else
$(GENDIR)/version.cpp: makefile $(GENDIR)/git_desc | $(GEN_FOLDERS)
- @echo #define BARE_BUILD_VERSION "0.245.12" > $@
+ @echo #define BARE_BUILD_VERSION "0.245.13" > $@
@echo #define BARE_VCS_REVISION "$(NEW_GIT_VERSION)" >> $@
@echo extern const char bare_build_version[]; >> $@
@echo extern const char bare_vcs_revision[]; >> $@
diff --git a/docs/release/src/hbmame/drivers/arkanoid.cpp b/docs/release/src/hbmame/drivers/arkanoid.cpp
index 157ddaa0ffb..ebeaaf1a4ab 100644
--- a/docs/release/src/hbmame/drivers/arkanoid.cpp
+++ b/docs/release/src/hbmame/drivers/arkanoid.cpp
@@ -66,9 +66,26 @@ ROM_START( arkll32 )
ROM_LOAD( "a75-09.ic22", 0x0400, 0x0200, CRC(a7c6c277) SHA1(adaa003dcd981576ea1cc5f697d709b2d6b2ea29) )
ROM_END
+ROM_START( arkcrsn5 )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD( "cruisin5.3f", 0x0000, 0x8000, CRC(41ed7668) SHA1(afd1600317d210b6da2c63a65f1614be1f77854b) )
+ ROM_LOAD( "cruisin5.5f", 0x8000, 0x8000, CRC(77e310cc) SHA1(e2638bf6c565df9dab98d92c857d2212b150a2d1) )
+
+ ROM_REGION( 0x18000, "gfx1", 0 )
+ ROM_LOAD( "cruisin5.2c", 0x00000, 0x8000, CRC(7fb9dafc) SHA1(74a312729f10ab4753204b41de59ff41b93e80cb) )
+ ROM_LOAD( "cruisin5.3c", 0x08000, 0x8000, CRC(05229af9) SHA1(76c469506430bc23ee77bbcefbc357478437bba7) )
+ ROM_LOAD( "cruisin5.5c", 0x10000, 0x8000, CRC(a4c1a25f) SHA1(29d49572c1e7c6c8ac428ad2a3e625f0f548f66c) )
+
+ ROM_REGION( 0x0600, "proms", 0 )
+ ROM_LOAD( "ic73.11e", 0x0000, 0x0200, CRC(0af8b289) SHA1(6bc589e8a609b4cf450aebedc8ce02d5d45c970f) )
+ ROM_LOAD( "ic74.12e", 0x0200, 0x0200, CRC(abb002fb) SHA1(c14f56b8ef103600862e7930709d293b0aa97a73) )
+ ROM_LOAD( "ic75.13e", 0x0400, 0x0200, CRC(a7c6c277) SHA1(adaa003dcd981576ea1cc5f697d709b2d6b2ea29) )
+ROM_END
+
-GAME( 2000, akblc2dx, arkanoid, bootleg, arkangc, arkanoid_state, init_arkblock, ROT90, "hack", "Block Deluxe (Game Corporation)", 0 )
-GAME( 2000, akgcdx, arkanoid, bootleg, arkangc, arkanoid_state, init_arkgcbl, ROT90, "hack", "Arkanoid Deluxe (Game Corporation)", 0 )
-GAME( 2000, aktaytdx, arkanoid, bootleg, arktayt2, arkanoid_state, empty_init, ROT90, "hack", "Arkanoid Deluxe (Japan, Tayto)", 0 )
-GAME( 2000, arkll32, arkanoid, p3mcu, arkanoidj, arkanoid_state, empty_init, ROT90, "hack", "Arkanoid LL32", MACHINE_NOT_WORKING ) // broke 2022 after Z80 change
+GAME( 2000, akblc2dx, arkanoid, bootleg, arkangc, arkanoid_state, init_arkblock, ROT90, "hack", "Block Deluxe (Game Corporation)", MACHINE_SUPPORTS_SAVE )
+GAME( 2000, akgcdx, arkanoid, bootleg, arkangc, arkanoid_state, init_arkgcbl, ROT90, "hack", "Arkanoid Deluxe (Game Corporation)", MACHINE_SUPPORTS_SAVE )
+GAME( 2000, aktaytdx, arkanoid, bootleg, arktayt2, arkanoid_state, empty_init, ROT90, "hack", "Arkanoid Deluxe (Japan, Tayto)", MACHINE_SUPPORTS_SAVE )
+GAME( 2000, arkll32, arkanoid, p3mcu, arkanoidj, arkanoid_state, empty_init, ROT90, "hack", "Arkanoid LL32", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // broke 2022 after Z80 change
+GAME( 2023, arkcrsn5, arkanoid, aysnd, arkatayt, arkanoid_state, empty_init, ROT90, "Abyss", "Cruisin 5 (demo)", MACHINE_SUPPORTS_SAVE )
diff --git a/docs/release/src/hbmame/drivers/cps2mis.cpp b/docs/release/src/hbmame/drivers/cps2mis.cpp
index 3b45f92e6c1..e894bd8945c 100644
--- a/docs/release/src/hbmame/drivers/cps2mis.cpp
+++ b/docs/release/src/hbmame/drivers/cps2mis.cpp
@@ -658,13 +658,13 @@ ROM_START( ssf2tnl7 ) // 0.7
ROM_LOAD( "ssf2t.key", 0x00, 0x14, CRC(524d608e) SHA1(fcd2b9a1a640a0dee4a674dc9cfb3975466f7757) )
ROM_END
-ROM_START( ssf2tnl ) // 0.7.1
+ROM_START( ssf2tnl71 ) // 0.7.1
ROM_REGION( CODE_SIZE, "maincpu", 0 )
- ROM_LOAD16_WORD_SWAP( "tnl.p1", 0x000000, 0x80000, CRC(ff8a0f1e) SHA1(ec0f8942445b157a297a699027b6286223603c56) )
- ROM_LOAD16_WORD_SWAP( "tnl.p2", 0x080000, 0x80000, CRC(570b7843) SHA1(e06c64c08bb72d7893bff9b6584034c4270c20a9) )
- ROM_LOAD16_WORD_SWAP( "tnl.p3", 0x100000, 0x80000, CRC(866c980e) SHA1(3ba97699fa0a5442d9b734bbb4856434c538f712) )
- ROM_LOAD16_WORD_SWAP( "tnl.p4", 0x180000, 0x80000, CRC(adb6474e) SHA1(2f88020c9461bee68368a6a7b4ac5cc39e737303) )
- ROM_LOAD16_WORD_SWAP( "tnl.p5", 0x200000, 0x80000, CRC(f4ebe547) SHA1(f9743a860233ad00edac71660ed07ac581b38e6e) )
+ ROM_LOAD16_WORD_SWAP( "tnl71.p1", 0x000000, 0x80000, CRC(ff8a0f1e) SHA1(ec0f8942445b157a297a699027b6286223603c56) )
+ ROM_LOAD16_WORD_SWAP( "tnl71.p2", 0x080000, 0x80000, CRC(570b7843) SHA1(e06c64c08bb72d7893bff9b6584034c4270c20a9) )
+ ROM_LOAD16_WORD_SWAP( "tnl71.p3", 0x100000, 0x80000, CRC(866c980e) SHA1(3ba97699fa0a5442d9b734bbb4856434c538f712) )
+ ROM_LOAD16_WORD_SWAP( "tnl71.p4", 0x180000, 0x80000, CRC(adb6474e) SHA1(2f88020c9461bee68368a6a7b4ac5cc39e737303) )
+ ROM_LOAD16_WORD_SWAP( "tnl71.p5", 0x200000, 0x80000, CRC(f4ebe547) SHA1(f9743a860233ad00edac71660ed07ac581b38e6e) )
ROM_LOAD16_WORD_SWAP( "tnl7.p6", 0x280000, 0x80000, CRC(04462bf4) SHA1(4e62fd11def071f185ad3bfaf080454b183bf4c5) )
ROM_LOAD16_WORD_SWAP( "tnl7.p7", 0x300000, 0x80000, CRC(23d51921) SHA1(d234f50ba8314604a142fa52efefd4821a0afd96) )
@@ -695,7 +695,45 @@ ROM_START( ssf2tnl ) // 0.7.1
ROM_LOAD( "ssf2t.key", 0x00, 0x14, CRC(524d608e) SHA1(fcd2b9a1a640a0dee4a674dc9cfb3975466f7757) )
ROM_END
- /************************************************************
+ROM_START( ssf2tnl ) // 0.8
+ ROM_REGION( CODE_SIZE, "maincpu", 0 )
+ ROM_LOAD16_WORD_SWAP( "tnl.p1", 0x000000, 0x80000, CRC(09b53b58) SHA1(0b27760e4b0d0de08f73c9d4e70c6a66874b6d23) )
+ ROM_LOAD16_WORD_SWAP( "tnl.p2", 0x080000, 0x80000, CRC(71202594) SHA1(ef59591a158000d4770ffeb418917c490c7d4ebf) )
+ ROM_LOAD16_WORD_SWAP( "tnl.p3", 0x100000, 0x80000, CRC(bbbd5ef6) SHA1(4c47553353e89a8a9d849755daee9413bbba2cbf) )
+ ROM_LOAD16_WORD_SWAP( "tnl.p4", 0x180000, 0x80000, CRC(ddb5dee6) SHA1(d7a40359c2e85d8e7040b088021b183de8e9401c) )
+ ROM_LOAD16_WORD_SWAP( "tnl.p5", 0x200000, 0x80000, CRC(7c228198) SHA1(920d63a4ef82c779153e372909694f567a731c22) )
+ ROM_LOAD16_WORD_SWAP( "tnl.p6", 0x280000, 0x80000, CRC(cbbd989b) SHA1(75ee6d619351ddd5e65aeb7d05a6a400868c030d) )
+ ROM_LOAD16_WORD_SWAP( "tnl.p7", 0x300000, 0x80000, CRC(bb18adff) SHA1(597ffa3f34f0566d3160113ee2950f3449367823) )
+
+ ROM_REGION( 0x1000000, "gfx", 0 )
+ ROMX_LOAD( "tnl.c1", 0x000000, 0x200000, CRC(63e77950) SHA1(f52ee73f9417168c6e6603e79427cd8056967094) , ROM_GROUPWORD | ROM_SKIP(6) )
+ ROMX_LOAD( "tnl.c2", 0x000002, 0x200000, CRC(dd35a143) SHA1(5f04a113faee805a4bc828b70c6a9a02be25f779) , ROM_GROUPWORD | ROM_SKIP(6) )
+ ROMX_LOAD( "tnl.c3", 0x000004, 0x200000, CRC(f4ac22f3) SHA1(307ab4f81bff22d6380ef63206266afa1cbe8c43) , ROM_GROUPWORD | ROM_SKIP(6) )
+ ROMX_LOAD( "tnl.c4", 0x000006, 0x200000, CRC(71cf7604) SHA1(fcc79ab169187eec81f64bb1f61d4e6422d95ad9) , ROM_GROUPWORD | ROM_SKIP(6) )
+ ROMX_LOAD( "tnl7.c5", 0x800000, 0x100000, CRC(08c6976b) SHA1(56aa74632b0a6b92b1ff33bc62a150642671b8d1) , ROM_GROUPWORD | ROM_SKIP(6) )
+ ROMX_LOAD( "tnl7.c6", 0x800002, 0x100000, CRC(4d94aee3) SHA1(48b7e01bbf4fba4de0eed51c2016ed9b912c0766) , ROM_GROUPWORD | ROM_SKIP(6) )
+ ROMX_LOAD( "tnl7.c7", 0x800004, 0x100000, CRC(fab6dfd6) SHA1(e60dd3f3570c431955984c124a6499ed139d85f1) , ROM_GROUPWORD | ROM_SKIP(6) )
+ ROMX_LOAD( "tnl7.c8", 0x800006, 0x100000, CRC(5080bc5c) SHA1(4bd20a8566601f14678426d85c76b245a87d8b87) , ROM_GROUPWORD | ROM_SKIP(6) )
+ ROMX_LOAD( "tnl.c9", 0xc00000, 0x100000, CRC(648519f7) SHA1(5810d710dcbbd1b34168a0390176bfa170f49fcf) , ROM_GROUPWORD | ROM_SKIP(6) )
+ ROMX_LOAD( "tnl.c10", 0xc00002, 0x100000, CRC(efd2eb24) SHA1(500311f92817520983bb7f6957cdc5eb9bc3135a) , ROM_GROUPWORD | ROM_SKIP(6) )
+ ROMX_LOAD( "tnl.c11", 0xc00004, 0x100000, CRC(3294c78b) SHA1(8166a2c0434c301f7ef5eec5362f41ce0382a8c1) , ROM_GROUPWORD | ROM_SKIP(6) )
+ ROMX_LOAD( "tnl.c12", 0xc00006, 0x100000, CRC(fc283290) SHA1(ee35fb03fd1e3ca238d9155d3bc8491d38173826) , ROM_GROUPWORD | ROM_SKIP(6) )
+
+ ROM_REGION( QSOUND_SIZE, "audiocpu", 0 )
+ ROM_LOAD( "c51.m1", 0x00000, 0x08000, CRC(b47b8835) SHA1(c8b2d50fe3a329bd0592ea160d505155d873dab1) )
+ ROM_CONTINUE( 0x10000, 0x18000 )
+ ROM_LOAD( "c51.m2", 0x28000, 0x20000, CRC(0022633f) SHA1(cab3afc79da53e3887eb1ccd1f4d19790728e6cd) )
+
+ ROM_REGION( 0x400000, "qsound", 0 )
+ ROM_LOAD16_WORD_SWAP( "c51.q1", 0x000000, 0x200000, CRC(9bdbd476) SHA1(a8520f77f30b97aae36408e0c4ca1ebbde1808a5) )
+ ROM_LOAD16_WORD_SWAP( "c51.q2", 0x200000, 0x200000, CRC(a05e3aab) SHA1(d4eb9cae66c74e956569fea8b815156fbd420f83) )
+
+ ROM_REGION( 0x20, "key", 0 )
+ ROM_LOAD( "ssf2t.key", 0x00, 0x14, CRC(524d608e) SHA1(fcd2b9a1a640a0dee4a674dc9cfb3975466f7757) )
+ROM_END
+
+
+/************************************************************
Super Street Fighter II X: Turbo New Grand Master Challenge
**************************************************************/
ROM_START( ssf2x01 )
@@ -6581,7 +6619,8 @@ GAME( 2020, ssf2tnl4, ssf2t, cps2, cps2_2p6b, cps2_state, init_cps2, R
GAME( 2021, ssf2tnl5, ssf2t, cps2, cps2_2p6b, cps2_state, init_cps2, ROT0, "Born2SPD", "Super Street Fighter II Turbo (New Legacy v0.5 beta, 2021-06-11)", MACHINE_SUPPORTS_SAVE )
GAME( 2022, ssf2tnl6, ssf2t, cps2, cps2_2p6b, cps2_state, init_cps2, ROT0, "Born2SPD", "Super Street Fighter II Turbo (New Legacy v0.6 beta, 2022-02-07)", MACHINE_SUPPORTS_SAVE )
GAME( 2022, ssf2tnl7, ssf2t, cps2, cps2_2p6b, cps2_state, init_cps2, ROT0, "Born2SPD", "Super Street Fighter II Turbo (New Legacy v0.7 beta, 2022-07-19)", MACHINE_SUPPORTS_SAVE )
-GAME( 2022, ssf2tnl, ssf2t, cps2, cps2_2p6b, cps2_state, init_cps2, ROT0, "Born2SPD", "Super Street Fighter II Turbo (New Legacy v0.7.1 beta, 2022-09-06)", MACHINE_SUPPORTS_SAVE )
+GAME( 2022, ssf2tnl71, ssf2t, cps2, cps2_2p6b, cps2_state, init_cps2, ROT0, "Born2SPD", "Super Street Fighter II Turbo (New Legacy v0.7.1 beta, 2022-09-06)", MACHINE_SUPPORTS_SAVE )
+GAME( 2023, ssf2tnl, ssf2t, cps2, cps2_2p6b, cps2_state, init_cps2, ROT0, "Born2SPD", "Super Street Fighter II Turbo (New Legacy v0.8 beta, 2023-07-20)", MACHINE_SUPPORTS_SAVE )
GAME( 2012, ssf2x01, ssf2t, cps2, cps2_2p6b, cps2_state, init_cps2, ROT0, "Pipi899", "Super Street Fighter II X: Grand Master Challenge (940223J, Change FireBall, 2012-01-07)", MACHINE_SUPPORTS_SAVE )
GAME( 1994, ssf2x02, ssf2t, cps2, cps2_2p6b, cps2_state, init_cps2, ROT0, "Blue-Ray", "Super Street Fighter II X: Grand Master Challenge (940223J, Gouki Color Change)", MACHINE_SUPPORTS_SAVE )
GAME( 1994, ssf2x03, ssf2t, cps2, cps2_2p6b, cps2_state, init_cps2, ROT0, "Yumeji", "Super Street Fighter II X: Grand Master Challenge (940223J, Choose hidden characters easier)", MACHINE_SUPPORTS_SAVE )
diff --git a/docs/release/src/hbmame/drivers/galaxian.cpp b/docs/release/src/hbmame/drivers/galaxian.cpp
index 7efdeb4ff7d..237ead316a4 100644
--- a/docs/release/src/hbmame/drivers/galaxian.cpp
+++ b/docs/release/src/hbmame/drivers/galaxian.cpp
@@ -718,6 +718,25 @@ ROM_START( frogtest2 )
ROM_LOAD( "pr-91.6l", 0x0000, 0x0020, CRC(413703bf) SHA1(66648b2b28d3dcbda5bdb2605d1977428939dd3c) )
ROM_END
+ROM_START( froggerp )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD( "frogger.26", 0x0000, 0x1000, CRC(597696d6) SHA1(e7e021776cad00f095a1ebbef407b7c0a8f5d835) )
+ ROM_LOAD( "frogger.27p", 0x1000, 0x1000, CRC(b05c6d06) SHA1(71f17fdd87dff06b252e0d94b62743c5a23fd4f8) )
+ ROM_LOAD( "frsm3.7p", 0x2000, 0x1000, CRC(098a8093) SHA1(6f2e4ceb49e86f608818db93b5cc6a376abebd1e) )
+
+ ROM_REGION( 0x10000, "audiocpu", 0 )
+ ROM_LOAD( "frogger.608", 0x0000, 0x0800, CRC(e8ab0256) SHA1(f090afcfacf5f13cdfa0dfda8e3feb868c6ce8bc) )
+ ROM_LOAD( "frogger.609", 0x0800, 0x0800, CRC(7380a48f) SHA1(75582a94b696062cbdb66a4c5cf0bc0bb94f81ee) )
+ ROM_LOAD( "frogger.610", 0x1000, 0x0800, CRC(31d7eb27) SHA1(2e1d34ae4da385fd7cac94707d25eeddf4604e1a) )
+
+ ROM_REGION( 0x1000, "gfx1", 0 )
+ ROM_LOAD( "frogger.607", 0x0000, 0x0800, CRC(05f7d883) SHA1(78831fd287da18928651a8adb7e578d291493eff) )
+ ROM_LOAD( "frogger.606", 0x0800, 0x0800, CRC(f524ee30) SHA1(dd768967add61467baa08d5929001f157d6cd911) )
+
+ ROM_REGION( 0x0020, "proms", 0 )
+ ROM_LOAD( "pr-91.6l", 0x0000, 0x0020, CRC(413703bf) SHA1(66648b2b28d3dcbda5bdb2605d1977428939dd3c) )
+ROM_END
+
/* Wriggly Beasties - bootleg of WarOfBug */
ROM_START( wbeast )
ROM_REGION( 0x10000, "maincpu", 0 )
@@ -811,6 +830,7 @@ GAME( 1981, kazzy, frogger, frogger, frogger, galaxian_hbmame, init_frog
GAME( 1999, trukker, frogger, frogger, frogger, galaxian_hbmame, init_trukker, ROT90, "Grimlick","Trukker", MACHINE_SUPPORTS_SAVE )
GAME( 2004, frogtest, frogger, tst_frog, frogger, galaxian_hbmame, init_frogger, ROT90, "msmcdoug / JROK", "Frogger Sound Test", MACHINE_SUPPORTS_SAVE )
GAME( 2019, frogtest2, frogger, frogger, frogger, galaxian_hbmame, init_frogger, ROT90, "Phil Murray", "Frogger Test Rom (2019-01-27)", MACHINE_SUPPORTS_SAVE )
+GAME( 2023, froggerp, frogger, frogger, frogger, galaxian_state, init_frogger, ROT90, "philmurr", "Frogger (fixed)", MACHINE_SUPPORTS_SAVE )
// Amidar
diff --git a/docs/release/src/hbmame/drivers/mhavoc_hb.cpp b/docs/release/src/hbmame/drivers/mhavoc_hb.cpp
index 244b5201a1d..ba403aa0cc9 100644
--- a/docs/release/src/hbmame/drivers/mhavoc_hb.cpp
+++ b/docs/release/src/hbmame/drivers/mhavoc_hb.cpp
@@ -1027,3 +1027,4 @@ GAME( 2022, mhavocpede100, mhavoc, mhavocpe_adpcm, mhavocpe_inputs, mhavoc_hbm
GAME( 2022, mhavocpete100, mhavoc, mhavocpe_adpcm, mhavocpe_inputs, mhavoc_hbmame, empty_init, ROT0, "JMA", "Major Havoc - The Promised End - Tournament (v1.00) ENGLISH - ADPCM Speech", MACHINE_SUPPORTS_SAVE )
GAME( 2022, mhavocpefrte100, mhavoc, mhavocpe_adpcm, mhavocpe_inputs, mhavoc_hbmame, empty_init, ROT0, "JMA", "Major Havoc - The Promised End - Tournament (v1.00) FRENCH - ADPCM Speech", MACHINE_SUPPORTS_SAVE )
GAME( 2022, mhavocpedete100, mhavoc, mhavocpe_adpcm, mhavocpe_inputs, mhavoc_hbmame, empty_init, ROT0, "JMA", "Major Havoc - The Promised End - Tournament (v1.00) GERMAN - ADPCM Speech", MACHINE_SUPPORTS_SAVE )
+
diff --git a/docs/release/src/hbmame/drivers/neogeohb.cpp b/docs/release/src/hbmame/drivers/neogeohb.cpp
index f1f1d061404..828dfbe1d66 100644
--- a/docs/release/src/hbmame/drivers/neogeohb.cpp
+++ b/docs/release/src/hbmame/drivers/neogeohb.cpp
@@ -195,7 +195,8 @@ NUM GAME YEAR COMPANY TITLE
497 0993 2021 iq132 Cabal (Neo-Geo port)
498 0052 2021 Kako Eimon Abyssal Infants
499 2048 2021 Nicole Branagan Neo 2048
-500 0993 2022 iq132 Kid no Hore Hore Daisakusen (Neo-Geo port)
+500 0993 2022 iq_132 Kid no Hore Hore Daisakusen (Neo-Geo port)
+501 0282 2023 iq_132 Soldier Girl Amazon (Neo-Geo port)
@@ -1896,6 +1897,25 @@ ROM_START( horekidb3 ) // beta 3, incomplete?
ROM_END
+// 501: Soldier Girl Amazon (port by iq_132)
+ROM_START( amazonn )
+ ROM_REGION( 0x100000, "maincpu", 0 )
+ ROM_LOAD16_WORD_SWAP( "501.p1", 0x000000, 0x020000, CRC(f5f57b9d) SHA1(3c5c902d6db9342a0ad82568af48d34c61af46bb) )
+
+ NEO_SFIX_128K( "501.s1", CRC(128166bb) SHA1(152677c61b3b33f26dad377a9e8c3329a58b8a3c) )
+
+ NEO_BIOS_AUDIO_64K( "501.m1", CRC(681d2398) SHA1(3f5d3832fc8c3470dedc97f8418120895e198fcc) )
+
+ ROM_REGION( 0x1000000, "ymsnd:adpcma", 0 )
+ ROM_LOAD( "501.v1", 0x000000, 0x200000, CRC(1a1a886c) SHA1(36a43396ab04e1d95f9231dc349cf43e59e65a3b) )
+ ROM_LOAD( "501.v2", 0x100000, 0x200000, CRC(86cade60) SHA1(45d6b847675d8e7dadff83abf1a12db17e1da6f3) )
+
+ ROM_REGION( 0x080000, "sprites", 0 )
+ ROM_LOAD16_BYTE( "501.c1", 0x0000000, 0x020000, CRC(901c6ae1) SHA1(d4a98a0467198e2154c7838ebac3513216426310) )
+ ROM_LOAD16_BYTE( "501.c2", 0x0000001, 0x020000, CRC(a02a8679) SHA1(18d785c994630043f822f4a71207f75b1ebe7d48) )
+ROM_END
+
+
// 600 : 240p Test Suite by Artemio Urbina
// No sound
ROM_START( 240ptest )
@@ -3330,6 +3350,7 @@ GAME( 2022, 240ptest, neogeo, neogeo_noslot, neogeo, neogeo_state, init
GAME( 2021, abyssal, neogeo, neogeo_noslot, neogeo, neogeo_state, init_neogeo, ROT0, "Kako Eimon", "Abyssal Infants", MACHINE_SUPPORTS_SAVE )
GAME( 2021, abyssal1, abyssal, neogeo_noslot, neogeo, neogeo_state, init_neogeo, ROT0, "Kako Eimon", "Abyssal Infants (newer version)", MACHINE_SUPPORTS_SAVE )
GAME( 2016, akiradmo, neogeo, neogeo_noslot, neogeo, neogeo_state, init_neogeo, ROT0, "HP Man", "Akira Demo", MACHINE_SUPPORTS_SAVE )
+GAME( 2023, amazonn, neogeo, neogeo_noslot, neogeo, neogeo_state, init_neogeo, ROT270, "iq132", "Soldier Girl Amazon (Neo-Geo port)", MACHINE_SUPPORTS_SAVE )
GAME( 2017, badapple, neogeo, neogeo_noslot, neogeo, neogeo_state, init_neogeo, ROT0, "BEY", "Bad Apple demo (v1)", MACHINE_SUPPORTS_SAVE )
GAME( 2017, badapplea, badapple, neogeo_noslot, neogeo, neogeo_state, init_neogeo, ROT0, "BEY", "Bad Apple demo (v2)", MACHINE_SUPPORTS_SAVE )
GAME( 2017, badappleb, badapple, neogeo_noslot, neogeo, neogeo_state, init_neogeo, ROT0, "HP Man", "Bad Apple demo (Giga Power Edition)", MACHINE_SUPPORTS_SAVE )
diff --git a/docs/release/src/hbmame/drivers/puckman.cpp b/docs/release/src/hbmame/drivers/puckman.cpp
index 96803e0e9c2..29f580ba6a8 100644
--- a/docs/release/src/hbmame/drivers/puckman.cpp
+++ b/docs/release/src/hbmame/drivers/puckman.cpp
@@ -1258,16 +1258,16 @@ ROM_START( homercid )
PACMAN_SOUND_PROMS
ROM_END
-ROM_START( jacman )
+ROM_START( jackman )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "pacman.6e", 0x0000, 0x1000, CRC(c1e6ab10) SHA1(e87e059c5be45753f7e9f33dff851f16d6751181) )
ROM_LOAD( "pacman.6f", 0x1000, 0x1000, CRC(1a6fb2d4) SHA1(674d3a7f00d8be5e38b1fdc208ebef5a92d38329) )
ROM_LOAD( "pacman.6h", 0x2000, 0x1000, CRC(bcdd1beb) SHA1(8e47e8c2c4d6117d174cdac150392042d3e0a881) )
- ROM_LOAD( "jacman.6j", 0x3000, 0x1000, CRC(1f52ef8b) SHA1(0a803352a964de9567bc314f8ace1c612082e3d0) )
+ ROM_LOAD( "jackman.6j", 0x3000, 0x1000, CRC(1f52ef8b) SHA1(0a803352a964de9567bc314f8ace1c612082e3d0) )
ROM_REGION( 0x2000, "gfx1", 0 )
- ROM_LOAD( "jacman.5e", 0x0000, 0x1000, CRC(809bd73e) SHA1(81989a21d089eb76297926905729efcd69abeb87) )
- ROM_LOAD( "jacman.5f", 0x1000, 0x1000, CRC(0509d3e6) SHA1(e589543b9a2f1c81115c03b4b88096ac84826e62) )
+ ROM_LOAD( "jackman.5e", 0x0000, 0x1000, CRC(809bd73e) SHA1(81989a21d089eb76297926905729efcd69abeb87) )
+ ROM_LOAD( "jackman.5f", 0x1000, 0x1000, CRC(0509d3e6) SHA1(e589543b9a2f1c81115c03b4b88096ac84826e62) )
PACMAN_PROMS
ROM_END
@@ -6929,7 +6929,7 @@ GAME( 2014, hellowp, puckman, pacman, pacman, puckman_state, empty_init,
GAME( 1981, hmhearts, puckman, pacman, pacman, puckman_state, empty_init, ROT90, "[Nittoh]", "Hangly-Man (Hearts)", MACHINE_SUPPORTS_SAVE )
GAME( 1981, hmpopey, puckman, pacman, pacman, puckman_state, empty_init, ROT90, "[Nittoh]", "Hangly-Man (Popeye)", MACHINE_SUPPORTS_SAVE )
GAME( 2005, homercid, puckman, pacman, mspacpls, puckman_state, empty_init, ROT90, "David Widel", "Homercide", MACHINE_SUPPORTS_SAVE )
-GAME( 2001, jacman, puckman, pacman, pacman, puckman_state, empty_init, ROT90, "Brent Cobb", "Jacman", MACHINE_SUPPORTS_SAVE )
+GAME( 2001, jackman, puckman, pacman, pacman, puckman_state, empty_init, ROT90, "Brent Cobb", "Jackman", MACHINE_SUPPORTS_SAVE )
GAME( 1980, jpmmunch, puckman, pacman, pacman, puckman_state, empty_init, ROT90, "JPM", "Muncher", MACHINE_SUPPORTS_SAVE )
GAME( 1983, muckpan, puckman, pacman, pacman, puckman_state, empty_init, ROT90, "E.P.", "Muckpan", MACHINE_SUPPORTS_SAVE )
GAME( 1983, newpuc1, puckman, pacman, pacman, puckman_state, empty_init, ROT90, "E.P.", "Newpuc1 (Italian dump)", MACHINE_SUPPORTS_SAVE )
diff --git a/docs/release/src/hbmame/hbmame.lst b/docs/release/src/hbmame/hbmame.lst
index 6050cd62fe5..b7c5f4fe37b 100644
--- a/docs/release/src/hbmame/hbmame.lst
+++ b/docs/release/src/hbmame/hbmame.lst
@@ -49,6 +49,7 @@ akblc2dx /* hack */
akgcdx /* hack */
aktaytdx /* hack */
//arkll32 // broke mid-2022 after Z80 changes
+arkcrsn5
@source:asteroid.cpp
asteroid //parent
@@ -1519,6 +1520,7 @@ ssf2tnl4
ssf2tnl5
ssf2tnl6
ssf2tnl7
+ssf2tnl71
ssf2tnl
ssf2x01
ssf2x02
@@ -1848,6 +1850,7 @@ offender /* Chris Henry hack of scramble */
superdog /* Jerky Hack Hack of scramble */
scratest
frogger //parent
+froggerp
frogtest
frogtest2
kazzy
@@ -4298,6 +4301,7 @@ mhavoc //parent
mhavocrv
@source:mhavoc_hb.cpp
+mhavocrv2
mhavocpex1
mhavocpex2
mhavocpex3
@@ -6016,6 +6020,7 @@ zupapa // 070
abyssal
abyssal1
akiradmo
+amazonn
badapple // BEY
badapplea
badappleb
@@ -8150,7 +8155,7 @@ hmgrenp /* Blue Justice */
hmpopey /* */
hmplus /* Blue Justice */
homercid /* David Widel */
-jacman
+jackman
jpmmunch /* JPM bootleg */
mazeman /* Sil hack of Pac-Man */
muckpan
diff --git a/docs/release/src/hbmame/includes/mhavoc_hb.h b/docs/release/src/hbmame/includes/mhavoc_hb.h
index 9ab0c49db28..894fb725915 100644
--- a/docs/release/src/hbmame/includes/mhavoc_hb.h
+++ b/docs/release/src/hbmame/includes/mhavoc_hb.h
@@ -30,22 +30,22 @@
class mhavoc_hbmame : public driver_device
{
public:
- mhavoc_hbmame(const machine_config &mconfig, device_type type, const char *tag) :
- driver_device(mconfig, type, tag),
- m_zram0(*this, "zram0"),
- m_zram1(*this, "zram1"),
- m_alpha(*this, "alpha"),
- m_gamma(*this, "gamma"),
- m_beta(*this, "beta"),
- m_avg(*this, "avg"),
- m_comram(*this, "comram"),
- m_pokey(*this, "pokey%u", 1U),
- m_tms(*this, "tms"),
- m_oki(*this, "oki"),
- m_lamps(*this, "lamp%u", 0U),
- m_coin(*this, "COIN"),
- m_cabinet(*this, "CABINET"),
- m_service(*this, "SERVICE")
+ mhavoc_hbmame(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_zram0(*this, "zram0")
+ , m_zram1(*this, "zram1")
+ , m_alpha(*this, "alpha")
+ , m_gamma(*this, "gamma")
+ , m_beta(*this, "beta")
+ , m_avg(*this, "avg")
+ , m_comram(*this, "comram")
+ , m_pokey(*this, "pokey%u", 1U)
+ , m_tms(*this, "tms")
+ , m_oki(*this, "oki")
+ , m_lamps(*this, "lamp%u", 0U)
+ , m_coin(*this, "COIN")
+ , m_cabinet(*this, "CABINET")
+ , m_service(*this, "SERVICE")
{ }
void mhavoc_common(machine_config &config);
@@ -53,7 +53,7 @@ public:
void mhavocpe_adpcm(machine_config &config); //HBMAME
DECLARE_CUSTOM_INPUT_MEMBER(coin_service_r);
- DECLARE_CUSTOM_INPUT_MEMBER(coin_cabinet_l);
+ DECLARE_CUSTOM_INPUT_MEMBER(coin_cabinet_l);
DECLARE_READ_LINE_MEMBER(gamma_rcvd_r);
DECLARE_READ_LINE_MEMBER(gamma_xmtd_r);
DECLARE_READ_LINE_MEMBER(gamma_tirdy_r);
@@ -108,8 +108,8 @@ private:
optional_device<okim6295_device> m_oki;
output_finder<2> m_lamps;
optional_ioport m_coin;
- optional_ioport m_cabinet;
- optional_ioport m_service;
+ optional_ioport m_cabinet;
+ optional_ioport m_service;
uint8_t m_alpha_data = 0U;
uint8_t m_alpha_rcvd = 0U;
diff --git a/docs/release/src/osd/winui/bitmask.cpp b/docs/release/src/osd/winui/bitmask.cpp
index 5768cdf963f..c6a37e4daaf 100644
--- a/docs/release/src/osd/winui/bitmask.cpp
+++ b/docs/release/src/osd/winui/bitmask.cpp
@@ -143,4 +143,3 @@ int FindBit(LPBITS lpBits, int nStartPos, BOOL bSet)
return -1;
}
-/* End of source file */
diff --git a/docs/release/src/osd/winui/bitmask.h b/docs/release/src/osd/winui/bitmask.h
index ec583360637..90d500fdea2 100644
--- a/docs/release/src/osd/winui/bitmask.h
+++ b/docs/release/src/osd/winui/bitmask.h
@@ -1,8 +1,8 @@
// For licensing and usage information, read docs/release/winui_license.txt
//****************************************************************************
-#ifndef BITMASK_H
-#define BITMASK_H
+#ifndef WINUI_BITMASK_H
+#define WINUI_BITMASK_H
/* Bit array type */
typedef struct
@@ -31,3 +31,4 @@ typedef struct
/* Linked list functions */
#endif /* BITMASK_H */
+
diff --git a/docs/release/src/osd/winui/columnedit.h b/docs/release/src/osd/winui/columnedit.h
index 63440730033..8f24ea9c2bb 100644
--- a/docs/release/src/osd/winui/columnedit.h
+++ b/docs/release/src/osd/winui/columnedit.h
@@ -1,8 +1,8 @@
// For licensing and usage information, read docs/release/winui_license.txt
//****************************************************************************
-#ifndef COLUMNEDIT_H
-#define COLUMNEDIT_H
+#ifndef WINUI_COLUMNEDIT_H
+#define WINUI_COLUMNEDIT_H
INT_PTR InternalColumnDialogProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam,
int nColumnMax, int *shown, int *order,
@@ -13,3 +13,4 @@ INT_PTR InternalColumnDialogProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lPar
INT_PTR CALLBACK ColumnDialogProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam);
#endif
+
diff --git a/docs/release/src/osd/winui/datamap.h b/docs/release/src/osd/winui/datamap.h
index 587508034dd..c37214a8f6c 100644
--- a/docs/release/src/osd/winui/datamap.h
+++ b/docs/release/src/osd/winui/datamap.h
@@ -7,8 +7,8 @@
//
//============================================================
-#ifndef _DATAMAP_H_
-#define _DATAMAP_H_
+#ifndef WINUI_DATAMAP_H
+#define WINUI_DATAMAP_H
#include "emu.h"
@@ -33,7 +33,6 @@ enum _datamap_callback_type
DCT_READ_CONTROL,
DCT_POPULATE_CONTROL,
DCT_UPDATE_STATUS,
-
DCT_COUNT
};
@@ -70,4 +69,5 @@ void datamap_populate_all_controls(datamap *map, HWND dialog, windows_options &o
void datamap_update_control(datamap *map, HWND dialog, windows_options &opts, int dlgitem);
void datamap_update_all_controls(datamap *map, HWND dialog, windows_options *opts);
-#endif // _DATAMAP_H_
+#endif // DATAMAP_H
+
diff --git a/docs/release/src/osd/winui/dialogs.cpp b/docs/release/src/osd/winui/dialogs.cpp
index da1f38b4888..e38025d5433 100644
--- a/docs/release/src/osd/winui/dialogs.cpp
+++ b/docs/release/src/osd/winui/dialogs.cpp
@@ -854,3 +854,4 @@ static void OnHScroll(HWND hwnd, HWND hwndCtl, UINT code, int pos)
SendDlgItemMessage(hwnd,IDC_SCREENSHOT_BORDERSIZETXT,WM_SETTEXT,0, (WPARAM)tmp);
}
}
+
diff --git a/docs/release/src/osd/winui/dijoystick.cpp b/docs/release/src/osd/winui/dijoystick.cpp
index 6ac0cd916f1..837007b1db6 100644
--- a/docs/release/src/osd/winui/dijoystick.cpp
+++ b/docs/release/src/osd/winui/dijoystick.cpp
@@ -225,7 +225,7 @@ static int DIJoystick_is_joy_pressed(int joycode)
button--;
if (button >= This.joysticks[joy_num].num_buttons
- || GET_JOYCODE_DIR(joycode) != JOYCODE_DIR_BTN)
+ || GET_JOYCODE_DIR(joycode) != JOYCODE_DIR_BTN)
return 0;
return dijs.rgbButtons[button] != 0;
diff --git a/docs/release/src/osd/winui/dijoystick.h b/docs/release/src/osd/winui/dijoystick.h
index 1235c6597b6..a3c944c8af3 100644
--- a/docs/release/src/osd/winui/dijoystick.h
+++ b/docs/release/src/osd/winui/dijoystick.h
@@ -1,8 +1,8 @@
// For licensing and usage information, read docs/release/winui_license.txt
//****************************************************************************
-#ifndef DIJOYSTICK_H
-#define DIJOYSTICK_H
+#ifndef WINUI_DIJOYSTICK_H
+#define WINUI_DIJOYSTICK_H
/*
limits:
@@ -61,3 +61,4 @@ extern int DIJoystick_GetNumPhysicalJoystickAxes(int num_joystick);
extern TCHAR* DIJoystick_GetPhysicalJoystickAxisName(int num_joystick, int num_axis);
#endif
+
diff --git a/docs/release/src/osd/winui/directinput.cpp b/docs/release/src/osd/winui/directinput.cpp
index a9d9af9c6b3..15889f8ceef 100644
--- a/docs/release/src/osd/winui/directinput.cpp
+++ b/docs/release/src/osd/winui/directinput.cpp
@@ -141,3 +141,4 @@ LPDIRECTINPUT GetDirectInput(void)
{
return di;
}
+
diff --git a/docs/release/src/osd/winui/directinput.h b/docs/release/src/osd/winui/directinput.h
index ac246f49a07..1c0fbd87883 100644
--- a/docs/release/src/osd/winui/directinput.h
+++ b/docs/release/src/osd/winui/directinput.h
@@ -1,8 +1,8 @@
// For licensing and usage information, read docs/release/winui_license.txt
//****************************************************************************
-#ifndef DIRECTINPUT_H
-#define DIRECTINPUT_H
+#ifndef WINUI_DIRECTINPUT_H
+#define WINUI_DIRECTINPUT_H
#undef WINNT
#ifdef DIRECTINPUT_VERSION
@@ -21,3 +21,4 @@ extern HRESULT SetDIDwordProperty(LPDIRECTINPUTDEVICE2 pdev, REFGUID guidPropert
LPDIRECTINPUT GetDirectInput(void);
#endif
+
diff --git a/docs/release/src/osd/winui/directories.h b/docs/release/src/osd/winui/directories.h
index 1c84c45dd00..63864ca687f 100644
--- a/docs/release/src/osd/winui/directories.h
+++ b/docs/release/src/osd/winui/directories.h
@@ -81,4 +81,3 @@ INT_PTR CALLBACK DirectoriesDialogProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARA
#endif /* DIRECTORIES_H */
-
diff --git a/docs/release/src/osd/winui/dirwatch.h b/docs/release/src/osd/winui/dirwatch.h
index 3e752026538..52680704165 100644
--- a/docs/release/src/osd/winui/dirwatch.h
+++ b/docs/release/src/osd/winui/dirwatch.h
@@ -1,8 +1,8 @@
// For licensing and usage information, read docs/release/winui_license.txt
//****************************************************************************
-#ifndef DIRWATCHER_H
-#define DIRWATCHER_H
+#ifndef WINUI_DIRWATCHER_H
+#define WINUI_DIRWATCHER_H
#include <string>
typedef struct DirWatcher *PDIRWATCHER;
@@ -12,3 +12,4 @@ BOOL DirWatcher_Watch(PDIRWATCHER pWatcher, WORD nIndex, const std::string t, BO
void DirWatcher_Free(PDIRWATCHER pWatcher);
#endif
+
diff --git a/docs/release/src/osd/winui/emu_opts.cpp b/docs/release/src/osd/winui/emu_opts.cpp
index f2304092f4c..a031c770ef4 100644
--- a/docs/release/src/osd/winui/emu_opts.cpp
+++ b/docs/release/src/osd/winui/emu_opts.cpp
@@ -232,11 +232,8 @@ void load_options(windows_options &opts, OPTIONS_TYPE opt_type, int game_num, bo
}
fname.clear();
- if (opt_type == OPTIONS_COMPUTER)
- fname = GetIniDir() + PATH_SEPARATOR + "computer.ini";
- else
- if (opt_type == OPTIONS_CONSOLE)
- fname = GetIniDir() + PATH_SEPARATOR + "console.ini";
+ if (opt_type == OPTIONS_ARCADE)
+ fname = GetIniDir() + PATH_SEPARATOR + "arcade.ini";
else
if (opt_type == OPTIONS_HORIZONTAL)
fname = GetIniDir() + PATH_SEPARATOR + "horizontal.ini";
@@ -284,11 +281,8 @@ void save_options(windows_options &opts, OPTIONS_TYPE opt_type, int game_num)
const game_driver *driver = NULL;
string fname, filepath;
- if (opt_type == OPTIONS_COMPUTER)
- fname = GetIniDir() + PATH_SEPARATOR + "computer.ini";
- else
- if (opt_type == OPTIONS_CONSOLE)
- fname = GetIniDir() + PATH_SEPARATOR + "console.ini";
+ if (opt_type == OPTIONS_ARCADE)
+ fname = GetIniDir() + PATH_SEPARATOR + "arcade.ini";
else
if (opt_type == OPTIONS_HORIZONTAL)
fname = GetIniDir() + PATH_SEPARATOR + "horizontal.ini";
diff --git a/docs/release/src/osd/winui/emu_opts.h b/docs/release/src/osd/winui/emu_opts.h
index ad95f8b7279..a33f792c28b 100644
--- a/docs/release/src/osd/winui/emu_opts.h
+++ b/docs/release/src/osd/winui/emu_opts.h
@@ -19,9 +19,6 @@ typedef enum {
OPTIONS_VECTOR,
OPTIONS_LCD,
OPTIONS_ARCADE,
- OPTIONS_CONSOLE,
- OPTIONS_COMPUTER,
- OPTIONS_OTHERSYS,
// Local types
OPTIONS_SOURCE,
OPTIONS_GPARENT,
diff --git a/docs/release/src/osd/winui/game_opts.h b/docs/release/src/osd/winui/game_opts.h
index ef522dfe37a..8fae2d31b32 100644
--- a/docs/release/src/osd/winui/game_opts.h
+++ b/docs/release/src/osd/winui/game_opts.h
@@ -251,22 +251,16 @@ public:
const game_driver *drv = 0;
windows_options dummy;
ui_options ui_opts;
- printf("game_opts.cpp::load_file : Rebuilding cache\n");fflush(stdout);
+ printf("game_opts.h::load_file : Rebuilding cache\n");fflush(stdout);
for (uint32_t i = 0; i < m_total; i++)
{
uint32_t t = 0;
- // BITS 0,1 = arcade, console, computer, other
+ // BITS 0,1 = arcade, non-arcade, unused, unused
drv = &driver_list::driver(i);
machine_config config(*drv, dummy);
ui::machine_static_info const info(ui_opts, config);
- if ((info.machine_flags() & machine_flags::MASK_TYPE) == machine_flags::TYPE_CONSOLE)
+ if ((info.machine_flags() & machine_flags::MASK_TYPE) != machine_flags::TYPE_ARCADE)
t = 1;
- else
- if ((info.machine_flags() & machine_flags::MASK_TYPE) == machine_flags::TYPE_COMPUTER)
- t = 2;
- else
- if ((info.machine_flags() & machine_flags::MASK_TYPE) == machine_flags::TYPE_OTHER)
- t = 3;
m_cache = t;
// BIT 2 = SWAP_XY
t = (drv->flags & ORIENTATION_SWAP_XY) ? 0x0004 : 0;
@@ -333,7 +327,7 @@ public:
m_list[i].cache_lower = m_cache;
m_list[i].cache_upper = 0;
}
- printf("game_opts.cpp::load_file : Finished Rebuilding cache\n");fflush(stdout);
+ printf("game_opts.h::load_file : Finished Rebuilding cache\n");fflush(stdout);
}
}
diff --git a/docs/release/src/osd/winui/hbmameui.rc b/docs/release/src/osd/winui/hbmameui.rc
index 6aaa460f0a4..2665f7e793b 100644
--- a/docs/release/src/osd/winui/hbmameui.rc
+++ b/docs/release/src/osd/winui/hbmameui.rc
@@ -70,6 +70,8 @@ BEGIN
MENUITEM "&Refresh Roms\tF5", ID_UPDATE_GAMELIST
MENUITEM "Refresh Cache", ID_UPDATE_CACHE
MENUITEM SEPARATOR
+ MENUITEM "Save filter", ID_FILE_FILTER
+ MENUITEM SEPARATOR
MENUITEM "E&xit", ID_FILE_EXIT
END
POPUP "&View"
@@ -106,11 +108,10 @@ BEGIN
MENUITEM SEPARATOR
MENUITEM "L&arge Icons", ID_VIEW_LARGE_ICON
MENUITEM "S&mall Icons", ID_VIEW_SMALL_ICON
- MENUITEM "&List", ID_VIEW_LIST_MENU
- MENUITEM "&Details", ID_VIEW_DETAIL
- MENUITEM "&Grouped", ID_VIEW_GROUPED
MENUITEM SEPARATOR
- POPUP "Arrange &Icons"
+ MENUITEM "Indent Clones", ID_VIEW_INDENT
+ MENUITEM SEPARATOR
+ POPUP "Sort games list"
BEGIN
MENUITEM "by &Name", ID_VIEW_BYGAME
MENUITEM "by D&irectory", ID_VIEW_BYDIRECTORY
@@ -119,8 +120,6 @@ BEGIN
MENUITEM "by &Type", ID_VIEW_BYTYPE
MENUITEM "by &Date", ID_VIEW_BYYEAR
END
- MENUITEM "Line &Up Icons", ID_VIEW_LINEUPICONS
- MENUITEM SEPARATOR
MENUITEM "&Custom Filters...\tCtrl+F", ID_CONTEXT_FILTERS
MENUITEM "Customi&ze Fields...", ID_CUSTOMIZE_FIELDS
END
@@ -444,7 +443,7 @@ BEGIN
DEFPUSHBUTTON "&OK",IDOK,200,109,50,14,WS_GROUP
CTEXT "HomeBrew MAME",IDC_STATIC,147,7,142,11,NOT WS_GROUP
CTEXT "Version 0",IDC_VERSION,147,18,142,11,NOT WS_GROUP
- CTEXT "Copyright (C) 1997-2022 Robbbert",IDC_STATIC,147,29,142,10,NOT WS_GROUP
+ CTEXT "Copyright (C) 1997-2023 Robbbert",IDC_STATIC,147,29,142,10,NOT WS_GROUP
CTEXT "MAMEUI version by",IDC_STATIC,147,51,142,10,NOT WS_GROUP
CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,147,44,142,1
CTEXT "Christopher Kirmse and the MAMEUI team",IDC_STATIC,147,62,142,9,NOT WS_GROUP
@@ -1032,8 +1031,8 @@ BEGIN
CONTROL "",IDC_DIVIDER,"Static",SS_ETCHEDHORZ,0,5,304,1
CONTROL "Tree1",IDC_TREE,"SysTreeView32",TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_EDITLABELS |
TVS_SHOWSELALWAYS | TVS_FULLROWSELECT | WS_BORDER | WS_TABSTOP,5,28,48,172
- CONTROL "List1",IDC_LIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_AUTOARRANGE |
- LVS_SHAREIMAGELISTS | LVS_OWNERDRAWFIXED | WS_BORDER | WS_TABSTOP,65,28,42,172
+ CONTROL "List1",IDC_LIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS |
+ LVS_SHAREIMAGELISTS | WS_BORDER | WS_TABSTOP,65,28,42,172
GROUPBOX "",IDC_SPLITTER,55,28,8,172,BS_NOTIFY | NOT WS_VISIBLE
GROUPBOX "",IDC_SPLITTER2,109,28,8,172,BS_NOTIFY | NOT WS_VISIBLE
CONTROL "",IDC_SSFRAME,"Static",SS_ETCHEDFRAME | SS_NOTIFY,121,11,181,194
@@ -1383,12 +1382,8 @@ STRINGTABLE DISCARDABLE
BEGIN
IDS_VIEW_LARGEICONS "Display items by using large icons."
IDS_VIEW_SMALLICONS "Display items by using small icons."
- IDS_VIEW_LIST "Displays items in a list."
- IDS_VIEW_DETAILS "Displays detailed information about each item in the window."
- IDS_VIEW_GROUPED "Displays items grouped by parent game"
IDS_VIEW_SPACER4 "Spacer"
IDS_VIEW_ARRANGE "Contains commands for sorting by various columns"
- IDS_VIEW_LINEUPICONS "Arranges icons in a grid"
IDS_VIEW_SPACER5 "Spacer"
IDS_VIEW_REFRESH "Refresh game list"
IDS_VIEW_CONTEXTFILTERS "Allows filtering out games from a folder"
@@ -1402,9 +1397,6 @@ BEGIN
ID_HELP_ABOUT "Displays program and copyright information"
ID_VIEW_LARGE_ICON "Display items by using large icons."
ID_VIEW_SMALL_ICON "Display items by using small icons."
- ID_VIEW_LIST_MENU "Displays items in a list."
- ID_VIEW_DETAIL "Displays detailed information about each item in the window."
- ID_VIEW_GROUPED "Show items grouped by parent game"
ID_OPTIONS_FONT "Set game list and folder list font"
ID_OPTIONS_CLONE_COLOR "Set the clone font color"
ID_OPTIONS_DIR "Set directory configuration"
@@ -1484,7 +1476,6 @@ BEGIN
ID_VIEW_BYYEAR "Sort items by year"
ID_VIEW_BYTYPE "Sort items by type"
ID_VIEW_BYTIMESPLAYED "Sort by number of plays"
- ID_VIEW_LINEUPICONS "Arranges icons in a grid"
ID_UPDATE_GAMELIST "Refresh game list"
ID_SORT_ASCENDING "Sort column in ascending (A-Z) order"
ID_SORT_DESCENDING "Sort column in descending (Z-A) order"
diff --git a/docs/release/src/osd/winui/help.cpp b/docs/release/src/osd/winui/help.cpp
index 4084b5bc0ed..839d6ebafaa 100644
--- a/docs/release/src/osd/winui/help.cpp
+++ b/docs/release/src/osd/winui/help.cpp
@@ -3,7 +3,7 @@
/***************************************************************************
- help.c
+ help.cpp
Help wrapper code.
@@ -105,3 +105,4 @@ static void Help_Load(void)
}
}
}
+
diff --git a/docs/release/src/osd/winui/help.h b/docs/release/src/osd/winui/help.h
index 9532d7afacf..4fc766e1649 100644
--- a/docs/release/src/osd/winui/help.h
+++ b/docs/release/src/osd/winui/help.h
@@ -1,8 +1,8 @@
// For licensing and usage information, read docs/release/winui_license.txt
//****************************************************************************
-#ifndef HELP_H
-#define HELP_H
+#ifndef WINUI_HELP_H
+#define WINUI_HELP_H
#if defined(__GNUC__)
#define HH_DISPLAY_TOPIC 0
@@ -45,3 +45,4 @@ extern void HelpExit(void);
extern HWND HelpFunction(HWND hwndCaller, LPCSTR pszFile, UINT uCommand, DWORD_PTR dwData);
#endif
+
diff --git a/docs/release/src/osd/winui/history.cpp b/docs/release/src/osd/winui/history.cpp
index 2e222129bdd..89a5b057ac2 100644
--- a/docs/release/src/osd/winui/history.cpp
+++ b/docs/release/src/osd/winui/history.cpp
@@ -105,7 +105,7 @@ const size_t npos = std::string::npos;
static void create_index_history(const char* datsdir, std::ifstream &fp, std::string file_line, int filenum)
{
int what_to_do = 0; // 0 = xml not found; 1 = idx not found or version mismatch; 2 = both ok, need to read idx.
- const std::string text1 = "<system name=", text4 = "\"";
+ const std::string text1 = "<system name=", text2 = "<item list=", text4 = "\"";
std::string xml_ver, idx_ver;
size_t quot1 = npos, quot2 = npos;
@@ -174,6 +174,35 @@ static void create_index_history(const char* datsdir, std::ifstream &fp, std::st
final_key = file_line.substr(quot1, quot2-quot1);
}
}
+ else
+ {
+ find = file_line.find(text2);
+ if (find != npos) // found a sw-item
+ {
+ // Find position of the 4 double-quotes
+ quot1 = file_line.find(text4), quot2 = npos;
+ if (quot1 != npos)
+ {
+ quot1++;
+ quot2 = file_line.find(text4, quot1);
+ if (quot2 != npos)
+ {
+ std::string first = file_line.substr(quot1, quot2-quot1);
+ quot1 = file_line.find(text4, quot2+1);
+ if (quot1 != npos)
+ {
+ quot1++;
+ quot2 = file_line.find(text4, quot1);
+ if (quot2 != npos)
+ {
+ std::string second = file_line.substr(quot1, quot2-quot1);
+ final_key = first + std::string(":") + second;
+ }
+ }
+ }
+ }
+ }
+ }
// If we passed the tests we now have the key, find the next text
if (!final_key.empty())
{
diff --git a/docs/release/src/osd/winui/layout.cpp b/docs/release/src/osd/winui/layout.cpp
index 70b61c6bd88..f6e4b2a7747 100644
--- a/docs/release/src/osd/winui/layout.cpp
+++ b/docs/release/src/osd/winui/layout.cpp
@@ -46,7 +46,7 @@ extern const FOLDERDATA g_folderData[] =
{"FPS", "fps", FOLDER_FPS, IDI_FOLDER_FPS, 0, 0, 1, CreateFPSFolders },
{"Horizontal", "horizontal", FOLDER_HORIZONTAL, IDI_FOLDER_HORIZONTAL, F_HORIZONTAL, F_VERTICAL, 0, NULL, DriverIsVertical, FALSE, OPTIONS_HORIZONTAL },
{"Imperfect", "imperfect", FOLDER_DEFICIENCY, IDI_FOLDER_IMPERFECT, 0, 0, 0, CreateDeficiencyFolders },
- {"Lightgun", "Lightgun", FOLDER_LIGHTGUN, IDI_FOLDER_LIGHTGUN, 0, 0, 0, NULL, DriverUsesLightGun, TRUE },
+ {"Lightgun", "lightgun", FOLDER_LIGHTGUN, IDI_FOLDER_LIGHTGUN, 0, 0, 0, NULL, DriverUsesLightGun, TRUE },
{"Manufacturer", "manufacturer", FOLDER_MANUFACTURER, IDI_FOLDER_MANUFACTURER, 0, 0, 1, CreateManufacturerFolders },
{"Mechanical", "mechanical", FOLDER_MECHANICAL, IDI_FOLDER_MECHANICAL, 0, 0, 0, NULL, DriverIsMechanical, TRUE },
{"Modified/Hacked", "modified", FOLDER_MODIFIED, IDI_FOLDER, 0, 0, 0, NULL, DriverIsModified, TRUE },
@@ -119,8 +119,6 @@ extern const FILTER_ITEM g_filterList[] =
{ F_WORKING, IDC_FILTER_WORKING, DriverIsBroken, FALSE },
{ F_HORIZONTAL, IDC_FILTER_HORIZONTAL, DriverIsVertical, FALSE },
{ F_VERTICAL, IDC_FILTER_VERTICAL, DriverIsVertical, TRUE },
- { F_COMPUTER, IDC_FILTER_COMPUTER, DriverIsComputer, TRUE },
- { F_CONSOLE, IDC_FILTER_CONSOLE, DriverIsConsole, TRUE },
{ F_UNAVAILABLE, IDC_FILTER_UNAVAILABLE, FilterAvailable, FALSE },
{ F_MECHANICAL, IDC_FILTER_MECHANICAL, DriverIsMechanical, TRUE },
{ F_ARCADE, IDC_FILTER_ARCADE, DriverIsArcade, TRUE },
@@ -223,3 +221,4 @@ extern const char g_szGameCountString[] = "%d machines";
extern const TCHAR g_szPlayGameString[] = TEXT("&Play %s");
extern const char g_szGameCountString[] = "%d games";
#endif
+
diff --git a/docs/release/src/osd/winui/main.cpp b/docs/release/src/osd/winui/main.cpp
index be6b0e2398f..c253eb61931 100644
--- a/docs/release/src/osd/winui/main.cpp
+++ b/docs/release/src/osd/winui/main.cpp
@@ -29,3 +29,4 @@ int main(Platform::Array<Platform::String^>^)
}
#endif
+
diff --git a/docs/release/src/osd/winui/mameui.rc b/docs/release/src/osd/winui/mameui.rc
deleted file mode 100644
index c7baa1b7b4a..00000000000
--- a/docs/release/src/osd/winui/mameui.rc
+++ /dev/null
@@ -1,1463 +0,0 @@
-// Microsoft Visual C++ generated resource script.
-//
-#include "newuires.h"
-#include "resource.h"
-
-// Generated Help ID header file
-#define APSTUDIO_HIDDEN_SYMBOLS
-#include "resource.hm"
-#undef APSTUDIO_HIDDEN_SYMBOLS
-
-#define APSTUDIO_READONLY_SYMBOLS
-/////////////////////////////////////////////////////////////////////////////
-//
-// Generated from the TEXTINCLUDE 2 resource.
-//
-#include "windows.h"
-#include "commctrl.h"
-
-/////////////////////////////////////////////////////////////////////////////
-#undef APSTUDIO_READONLY_SYMBOLS
-
-/////////////////////////////////////////////////////////////////////////////
-// English (USA) resources
-
-#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
-#ifdef _WIN32
-LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
-#pragma code_page(1252)
-#endif //_WIN32
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Menu
-//
-
-IDR_MAIN_MENU MENU DISCARDABLE
-BEGIN
- POPUP "&File"
- BEGIN
- MENUITEM "&Exit", ID_FILE_EXIT
- END
- POPUP "&Help"
- BEGIN
- MENUITEM "&About MAMEUI", ID_ABOUT
- END
-END
-
-IDR_UI_MENU MENU DISCARDABLE
-BEGIN
- POPUP "&File"
- BEGIN
- MENUITEM "&Play", ID_FILE_PLAY
- MENUITEM SEPARATOR
- MENUITEM "Play and &Record Input...", ID_FILE_PLAY_RECORD
- MENUITEM "P&layback Input...", ID_FILE_PLAY_BACK
- MENUITEM SEPARATOR
- MENUITEM "Play and Record &Wave Output...", ID_FILE_PLAY_RECORD_WAVE
- MENUITEM SEPARATOR
- MENUITEM "Play and Record &MNG Output...", ID_FILE_PLAY_RECORD_MNG
- MENUITEM SEPARATOR
- MENUITEM "Play and Record &uncompressed AVI Output...",
- ID_FILE_PLAY_RECORD_AVI
- MENUITEM SEPARATOR
- MENUITEM "Loa&d Savestate...", ID_FILE_LOADSTATE
- MENUITEM SEPARATOR
-
- MENUITEM "Pr&operties", ID_GAME_PROPERTIES
- MENUITEM SEPARATOR
- MENUITEM "Audi&t existing sets", ID_FILE_AUDIT_X
- MENUITEM "&Audit all sets", ID_FILE_AUDIT
- MENUITEM SEPARATOR
- MENUITEM "E&xit", ID_FILE_EXIT
- END
- POPUP "&View"
- BEGIN
- MENUITEM "&Toolbar\tAlt+T", ID_VIEW_TOOLBARS
- MENUITEM "&Status bar\tAlt+S", ID_VIEW_STATUS
- MENUITEM "Fold&er List\tAlt+D", ID_VIEW_FOLDERS
- MENUITEM "&Picture Area\tAlt+P", ID_VIEW_PICTURE_AREA
- MENUITEM "Screenshot Ta&b\tAlt+B", ID_VIEW_PAGETAB
- MENUITEM SEPARATOR
- MENUITEM "&Fullscreen\tF11", ID_VIEW_FULLSCREEN
- MENUITEM SEPARATOR
- POPUP "S&how Pictures"
- BEGIN
- MENUITEM "&Snapshot", ID_TOGGLE_TAB_SCREENSHOT
- MENUITEM "&Flyer", ID_TOGGLE_TAB_FLYER
- MENUITEM "&Cabinet", ID_TOGGLE_TAB_CABINET
- MENUITEM "&Marquee", ID_TOGGLE_TAB_MARQUEE
- MENUITEM "&Title", ID_TOGGLE_TAB_TITLE
- MENUITEM "Control &Panel", ID_TOGGLE_TAB_CONTROL_PANEL
-
- MENUITEM "PC&B", ID_TOGGLE_TAB_PCB
- MENUITEM "&History", ID_TOGGLE_TAB_HISTORY
- END
- MENUITEM SEPARATOR
- MENUITEM "L&arge Icons", ID_VIEW_LARGE_ICON
- MENUITEM "S&mall Icons", ID_VIEW_SMALL_ICON
- MENUITEM "&List", ID_VIEW_LIST_MENU
- MENUITEM "&Details", ID_VIEW_DETAIL
- MENUITEM "&Grouped", ID_VIEW_GROUPED
- MENUITEM SEPARATOR
- POPUP "Arrange &Icons"
- BEGIN
- MENUITEM "by &Name", ID_VIEW_BYGAME
- MENUITEM "by D&irectory", ID_VIEW_BYDIRECTORY
- MENUITEM "by &Manufacturer", ID_VIEW_BYMANUFACTURER
- MENUITEM "by Times &Played", ID_VIEW_BYTIMESPLAYED
- MENUITEM "by &Type", ID_VIEW_BYTYPE
- MENUITEM "by &Date", ID_VIEW_BYYEAR
- END
- MENUITEM "Line &Up Icons", ID_VIEW_LINEUPICONS
- MENUITEM SEPARATOR
- MENUITEM "&Refresh\tF5", ID_UPDATE_GAMELIST
- MENUITEM "&Custom Filters...\tCtrl+F", ID_CONTEXT_FILTERS
- MENUITEM "Customi&ze Fields...", ID_CUSTOMIZE_FIELDS
- END
- POPUP "&Options"
- BEGIN
- MENUITEM "&Interface Options", ID_OPTIONS_INTERFACE
- MENUITEM "Default Game &Options", ID_OPTIONS_DEFAULTS
- MENUITEM "&Directories", ID_OPTIONS_DIR
- MENUITEM SEPARATOR
- MENUITEM "Game List &Font", ID_OPTIONS_FONT
- MENUITEM "Game List &Clone Color", ID_OPTIONS_CLONE_COLOR
- MENUITEM SEPARATOR
-
- MENUITEM "&Background Image", ID_OPTIONS_BG
- MENUITEM SEPARATOR
- MENUITEM "&Reset to Default", ID_OPTIONS_RESET_DEFAULTS
-
- END
- POPUP "&Help"
- BEGIN
-// MENUITEM "&Contents\tF1", ID_HELP_CONTENTS
-// MENUITEM "&Troubleshooting", ID_HELP_TROUBLE
-// MENUITEM SEPARATOR
-// MENUITEM "&New Game Changes", ID_HELP_WHATS_NEWUI
-// MENUITEM "&Mame Release Notes", ID_HELP_WHATS_NEW
-// MENUITEM SEPARATOR
-// MENUITEM "&About", ID_HELP_ABOUT
-// MENUITEM "&Mess Release Notes", ID_HELP_RELEASE
- MENUITEM "What's New in MAME", ID_HELP_WHATS_NEW
- MENUITEM "&Contents\tF1", ID_HELP_CONTENTS
-// MENUITEM "&Troubleshooting", ID_HELP_TROUBLE
- MENUITEM "&About", ID_HELP_ABOUT
- END
-END
-
-IDR_CONTEXT_MENU MENU
-BEGIN
- POPUP "Context Menu"
- BEGIN
- MENUITEM "&Play", ID_FILE_PLAY
- MENUITEM SEPARATOR
- MENUITEM "Play and &Record Input...", ID_FILE_PLAY_RECORD
- MENUITEM SEPARATOR
- MENUITEM "&Add to Custom Folder...", ID_CONTEXT_ADD_CUSTOM
- MENUITEM "R&emove From This Folder", ID_CONTEXT_REMOVE_CUSTOM
- MENUITEM "&Custom Filters...", ID_CONTEXT_FILTERS
- MENUITEM SEPARATOR
- MENUITEM "&Select Random Game", ID_CONTEXT_SELECT_RANDOM
- MENUITEM SEPARATOR
- MENUITEM "Rese&t Playcount", ID_CONTEXT_RESET_PLAYCOUNT
- MENUITEM "Reset Pla&y Time", ID_CONTEXT_RESET_PLAYTIME
- MENUITEM SEPARATOR
- MENUITEM "A&udit", ID_GAME_AUDIT
- MENUITEM SEPARATOR
- MENUITEM "Pr&operties", ID_GAME_PROPERTIES
- MENUITEM "Source propert&ies", ID_FOLDER_SOURCEPROPERTIES
- MENUITEM "&Vector properties", ID_FOLDER_VECTORPROPERTIES
- END
-END
-
-IDR_CONTEXT_HEADER MENU
-BEGIN
- POPUP "Header Context Menu"
- BEGIN
- MENUITEM "Sort &Ascending", ID_SORT_ASCENDING
- MENUITEM "Sort &Descending", ID_SORT_DESCENDING
- MENUITEM SEPARATOR
- MENUITEM "Customi&ze Fields...", ID_CUSTOMIZE_FIELDS
- END
-END
-
-IDR_CONTEXT_TREE MENU
-BEGIN
- POPUP "Context Menu Tree"
- BEGIN
- MENUITEM "&Rename", ID_CONTEXT_RENAME_CUSTOM
- MENUITEM "&Custom Filters...", ID_CONTEXT_FILTERS
- MENUITEM SEPARATOR
- POPUP "&Show Folders"
- BEGIN
- MENUITEM "overridden by code", ID_CONTEXT_SHOW_FOLDER_START
-
- END
- MENUITEM SEPARATOR
- MENUITEM "&Audit", ID_FOLDER_AUDIT
- MENUITEM SEPARATOR
- MENUITEM "&Properties", ID_FOLDER_PROPERTIES
- END
-END
-
-IDR_CONTEXT_SCREENSHOT MENU
-BEGIN
- POPUP "Context Screen Shot"
- BEGIN
- MENUITEM "Show Tab &Control", ID_VIEW_PAGETAB
- MENUITEM SEPARATOR
- POPUP "S&how Pictures"
- BEGIN
- MENUITEM "&Snapshot", ID_TOGGLE_TAB_SCREENSHOT
- MENUITEM "&Flyer", ID_TOGGLE_TAB_FLYER
- MENUITEM "&Cabinet", ID_TOGGLE_TAB_CABINET
- MENUITEM "&Marquee", ID_TOGGLE_TAB_MARQUEE
- MENUITEM "&Title", ID_TOGGLE_TAB_TITLE
- MENUITEM "Control &Panel", ID_TOGGLE_TAB_CONTROL_PANEL
-
- MENUITEM "PC&B", ID_TOGGLE_TAB_PCB
- MENUITEM "&History", ID_TOGGLE_TAB_HISTORY
- END
- MENUITEM SEPARATOR
- MENUITEM "&Snapshot", ID_VIEW_TAB_SCREENSHOT
- MENUITEM "&Flyer", ID_VIEW_TAB_FLYER
- MENUITEM "&Cabinet", ID_VIEW_TAB_CABINET
- MENUITEM "&Marquee", ID_VIEW_TAB_MARQUEE
- MENUITEM "&Title", ID_VIEW_TAB_TITLE
- MENUITEM "Control &Panel", ID_VIEW_TAB_CONTROL_PANEL
- MENUITEM "PC&B", ID_VIEW_TAB_PCB
- MENUITEM "&History", ID_VIEW_TAB_HISTORY
- END
-END
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Menu
-//
-
-IDR_RUNTIME_MENU MENU
-BEGIN
- POPUP "&File"
- BEGIN
- MENUITEM "&Load State...", ID_FILE_LOADSTATE_NEWUI, GRAYED
- MENUITEM "&Save State", ID_FILE_SAVESTATE, GRAYED
- MENUITEM "S&ave State As...", ID_FILE_SAVESTATE_AS, GRAYED
- MENUITEM SEPARATOR
- MENUITEM "Save Sc&reenshot", ID_FILE_SAVESCREENSHOT
- MENUITEM SEPARATOR
- MENUITEM "&Hide Menubar", ID_FILE_TOGGLEMENUBAR
- MENUITEM "&Full Screen\tAlt+Enter", ID_FILE_FULLSCREEN
- MENUITEM "Partial Keyboard Emulation", ID_FILE_UIACTIVE
- MENUITEM "Show Tab Menu", ID_FILE_OLDUI
- MENUITEM SEPARATOR
- MENUITEM "&Exit", ID_FILE_EXIT_NEWUI
- END
- POPUP "&Edit"
- BEGIN
- MENUITEM "Paste", ID_EDIT_PASTE
- END
- POPUP "&Options"
- BEGIN
- MENUITEM "&Pause", ID_OPTIONS_PAUSE, GRAYED
- MENUITEM "Soft &Reset", ID_OPTIONS_SOFTRESET
- MENUITEM "Ha&rd Reset", ID_OPTIONS_HARDRESET
- MENUITEM SEPARATOR
- POPUP "&Keyboard"
- BEGIN
- MENUITEM "Emulated", ID_KEYBOARD_EMULATED
- MENUITEM "Natural", ID_KEYBOARD_NATURAL
- MENUITEM SEPARATOR
- MENUITEM "Customise Emulated Keyboard...", ID_KEYBOARD_CUSTOMIZE
- END
- MENUITEM "&Joysticks", ID_OPTIONS_JOYSTICKS, GRAYED
- POPUP "&Video"
- BEGIN
- MENUITEM SEPARATOR
- MENUITEM "Rotate 0 degrees", ID_VIDEO_ROTATE_0
- MENUITEM "Rotate 90 degrees", ID_VIDEO_ROTATE_90
- MENUITEM "Rotate 180 degrees", ID_VIDEO_ROTATE_180
- MENUITEM "Rotate 270 degrees", ID_VIDEO_ROTATE_270
- END
- MENUITEM "&Configuration...", ID_OPTIONS_CONFIGURATION
- MENUITEM "&DIP Switches...", ID_OPTIONS_DIPSWITCHES
- MENUITEM "&Miscellaneous Inputs...", ID_OPTIONS_MISCINPUT
- MENUITEM "&Analog Controls...", ID_OPTIONS_ANALOGCONTROLS
- MENUITEM SEPARATOR
- POPUP "&Frameskip"
- BEGIN
- MENUITEM "Auto", ID_FRAMESKIP_AUTO
- END
- POPUP "Maximum &Speed"
- BEGIN
- MENUITEM "50%", ID_THROTTLE_50
- MENUITEM "100%", ID_THROTTLE_100
- MENUITEM "200%", ID_THROTTLE_200
- MENUITEM "500%", ID_THROTTLE_500
- MENUITEM "1000%", ID_THROTTLE_1000
- MENUITEM "Unlimited", ID_THROTTLE_UNTHROTTLED
- END
- MENUITEM "Show &FPS", ID_OPTIONS_TOGGLEFPS
- END
- POPUP "&Media"
- BEGIN
- MENUITEM SEPARATOR
- END
- POPUP "&Help"
- BEGIN
- MENUITEM "About This System...", ID_HELP_ABOUTSYSTEM
- MENUITEM "&About MAME...", ID_HELP_ABOUT_NEWUI
- END
-END
-
-
-#ifdef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// TEXTINCLUDE
-//
-
-1 TEXTINCLUDE MOVEABLE PURE
-BEGIN
- "resource.h\\r\n"
- "newuires.h\0"
-END
-
-2 TEXTINCLUDE MOVEABLE PURE
-BEGIN
- "#define NOWINRES\r\n"
- "#include ""windows.h""\r\n"
- "#include ""commctrl.h""\r\n"
- "\0"
-END
-
-3 TEXTINCLUDE MOVEABLE PURE
-BEGIN
- "#include ""mamevers.rc"" // Version block\r\n"
- "\r\n"
- "\0"
-END
-
-#endif // APSTUDIO_INVOKED
-
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Icon
-//
-
-// Icon with lowest ID value placed first to ensure application icon
-// remains consistent on all systems.
-IDI_MAMEUI_ICON ICON "res\\mameui.ico"
-IDI_WIN_ROMS ICON "res\\win_roms.ico"
-IDI_WIN_NOROMS ICON "res\\win_noro.ico"
-IDI_WIN_UNKNOWN ICON "res\\win_unkn.ico"
-IDI_WIN_CLONE ICON "res\\win_clone.ico"
-IDI_WIN_REDX ICON "res\\win_redx.ico"
-IDI_FOLDER_AVAILABLE ICON "res\\foldavail.ico"
-IDI_FOLDER ICON "res\\folder.ico"
-IDI_FOLDER_MANUFACTURER ICON "res\\foldmanu.ico"
-IDI_FOLDER_OPEN ICON "res\\foldopen.ico"
-IDI_FOLDER_UNAVAILABLE ICON "res\\foldunav.ico"
-IDI_FOLDER_HORIZONTAL ICON "res\\horz.ico"
-IDI_FOLDER_VERTICAL ICON "res\\vert.ico"
-IDI_MANUFACTURER ICON "res\\manufact.ico"
-IDI_FOLDER_YEAR ICON "res\\foldyear.ico"
-IDI_FOLDER_SOURCE ICON "res\\foldsrc.ico"
-IDI_WORKING ICON "res\\working.ico"
-IDI_NONWORKING ICON "res\\nonwork.ico"
-IDI_YEAR ICON "res\\year.ico"
-IDI_KEYBOARD ICON "res\\keyboard.ico"
-IDI_JOYSTICK ICON "res\\joystick.ico"
-IDI_CPU ICON "res\\cpu.ico"
-IDI_SOUND ICON "res\\samples.ico"
-IDI_SOUNDTAB ICON "res\\sound.ico"
-IDI_SOURCE ICON "res\\source.ico"
-IDI_HARDDISK ICON "res\\harddisk.ico"
-IDI_DISPLAY ICON "res\\display.ico"
-IDI_CHECKMARK ICON "res\\checkmark.ico"
-IDI_HEADER_UP ICON "res\\header_up.ico"
-IDI_HEADER_DOWN ICON "res\\header_down.ico"
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Dialog
-//
-
-IDD_ABOUT DIALOG DISCARDABLE 0, 0, 296, 129
-STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
-CAPTION "About MAMEUI"
-FONT 8, "Tahoma"
-BEGIN
- DEFPUSHBUTTON "&OK",IDOK,200,109,50,14,WS_GROUP
- CTEXT "HomeBrew MAME",IDC_STATIC,147,7,142,
- 11,NOT WS_GROUP
- CTEXT "Version 0",IDC_VERSION,147,18,142,11,NOT WS_GROUP
- CTEXT "Copyright (C) 1997-2023 Robbbert",IDC_STATIC,147,
- 29,142,10,NOT WS_GROUP
- CTEXT "MAMEUI version by",IDC_STATIC,147,51,142,10,NOT
- WS_GROUP
- CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,147,44,142,1
- CTEXT "Christopher Kirmse and the MAMEUI team",IDC_STATIC,147,
- 62,142,9,NOT WS_GROUP
- CTEXT "Additional MAMEUI code by",IDC_STATIC,147,74,142,9
- CTEXT "Mike Haaland, Andrew Kirmse, Jeff Miller",IDC_STATIC,
- 147,85,142,9
- CTEXT "John Hardy IV and Michael Soderstrom",IDC_STATIC,147,96,
- 142,9
- CONTROL "",IDC_ABOUT,"Static",SS_BITMAP | SS_SUNKEN,7,7,16,14
-END
-
-IDD_DIRECTX DIALOG DISCARDABLE 0, 0, 236, 69
-STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
-CAPTION "MAMEUI"
-FONT 8, "Tahoma"
-BEGIN
- DEFPUSHBUTTON "Go to Microsoft's DirectX Web Page",IDB_WEB_PAGE,48,52,
- 140,14
- EDITTEXT IDC_DIRECTX_HELP,7,0,222,48,ES_MULTILINE |
- ES_AUTOHSCROLL | ES_READONLY
-END
-
-IDD_AUDIT DIALOG DISCARDABLE 0, 0, 283, 188
-STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
-CAPTION "File Audit"
-FONT 8, "Tahoma"
-BEGIN
- PUSHBUTTON "&Pause",IDPAUSE,98,168,40,14
- PUSHBUTTON "&Cancel",IDCANCEL,144,168,40,14
- GROUPBOX "ROMs",IDC_STATIC,6,4,132,65
- LTEXT "Correct:",IDC_STATIC,51,28,32,8
- CONTROL "Progress1",IDC_ROMS_PROGRESS,"msctls_progress32",PBS_SMOOTH | WS_BORDER,14,16,116,8
- LTEXT "Incorrect:",IDC_STATIC,51,42,32,8
- LTEXT "Total:",IDC_STATIC,51,56,32,8
- LTEXT "0",IDC_ROMS_CORRECT,87,28,20,8
- LTEXT "0",IDC_ROMS_INCORRECT,87,42,20,8
- LTEXT "0",IDC_ROMS_TOTAL,87,56,20,8
- GROUPBOX "Samples",IDC_STATIC,145,4,132,65
- CONTROL "Progress1",IDC_SAMPLES_PROGRESS,"msctls_progress32",PBS_SMOOTH | WS_BORDER,153,16,116,8
- LTEXT "Correct:",IDC_STATIC,191,28,33,8
- LTEXT "Incorrect:",IDC_STATIC,191,42,33,8
- LTEXT "Total:",IDC_STATIC,191,56,33,8
- LTEXT "0",IDC_SAMPLES_CORRECT,227,28,20,8
- LTEXT "0",IDC_SAMPLES_INCORRECT,227,42,20,8
- LTEXT "0",IDC_SAMPLES_TOTAL,227,56,20,8
- GROUPBOX "Details",IDC_STATIC,6,72,271,90
- EDITTEXT IDC_AUDIT_DETAILS,12,82,259,74,ES_MULTILINE | ES_AUTOVSCROLL | WS_VSCROLL | WS_HSCROLL | NOT WS_TABSTOP
-END
-
-IDD_DIRECTORIES DIALOG DISCARDABLE 0, 0, 230, 107
-STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
-CAPTION "Directories"
-FONT 8, "Tahoma"
-BEGIN
- LTEXT "Show directories for:",IDC_STATIC,6,6,67,10
- COMBOBOX IDC_DIR_COMBO,6,18,160,79,CBS_DROPDOWNLIST | CBS_SORT |
- WS_VSCROLL | WS_TABSTOP
- LTEXT "Directories:",IDC_STATIC,6,38,38,10
- CONTROL "List1",IDC_DIR_LIST,"SysListView32",LVS_REPORT |
- LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_EDITLABELS |
- LVS_ALIGNLEFT | LVS_NOCOLUMNHEADER | WS_BORDER |
- WS_TABSTOP,6,50,160,51
- DEFPUSHBUTTON "OK",IDOK,173,8,50,14
- PUSHBUTTON "Cancel",IDCANCEL,173,26,50,14
- PUSHBUTTON "Browse...",IDC_DIR_BROWSE,173,50,50,14
- PUSHBUTTON "Insert",IDC_DIR_INSERT,173,68,50,14
- PUSHBUTTON "Delete",IDC_DIR_DELETE,173,87,50,14
-END
-
-IDD_COLUMNS DIALOG DISCARDABLE 0, 0, 302, 145
-STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
-CAPTION "Customize Fields"
-FONT 8, "Tahoma"
-BEGIN
- LTEXT "Available fields:",IDC_STATIC,6,6,80,10,SS_CENTERIMAGE
- CONTROL "List1",IDC_LISTAVAILABLECOLUMNS,"SysListView32",
- LVS_LIST | LVS_SINGLESEL | LVS_NOCOLUMNHEADER |
- LVS_NOSORTHEADER | WS_BORDER | WS_HSCROLL | WS_TABSTOP,6,
- 18,90,100
- PUSHBUTTON "Add ->",IDC_BUTTONADD,102,18,46,14,WS_DISABLED
- PUSHBUTTON "<- Remove",IDC_BUTTONREMOVE,102,36,46,14,WS_DISABLED
- LTEXT "Show these fields in this order:",IDC_STATIC,154,6,96,
- 10,SS_CENTERIMAGE
- CONTROL "List1",IDC_LISTSHOWCOLUMNS,"SysListView32",LVS_LIST |
- LVS_SINGLESEL | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER |
- WS_BORDER | WS_HSCROLL | WS_TABSTOP,154,18,90,100
- PUSHBUTTON "Move Up",IDC_BUTTONMOVEUP,250,18,46,14,WS_DISABLED
- PUSHBUTTON "Move Down",IDC_BUTTONMOVEDOWN,250,36,46,14,WS_DISABLED
- DEFPUSHBUTTON "OK",IDOK,105,124,44,14
- PUSHBUTTON "Cancel",IDCANCEL,155,124,44,14
-END
-
-IDD_PROP_CONTROLLER DIALOGEX 0, 0, 220, 240
-STYLE DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Controller Mapping"
-FONT 8, "Tahoma"
-BEGIN
- ICON IDI_JOYSTICK,IDC_STATIC,20,10,20,20
- LTEXT "Title\nDirectory\nExtra",IDC_PROP_TITLE,52,9,161,25,
- SS_NOPREFIX
- GROUPBOX "Paddle device",IDC_STATIC,4,40,102,28
- COMBOBOX IDC_PADDLE,10,50,91,62,CBS_DROPDOWNLIST | WS_VSCROLL |
- WS_TABSTOP,0,HIDC_PADDLE
- GROUPBOX "ADStick device",IDC_STATIC,4,71,102,28
- COMBOBOX IDC_ADSTICK,10,80,91,62,CBS_DROPDOWNLIST | WS_VSCROLL |
- WS_TABSTOP,0,HIDC_ADSTICK
- GROUPBOX "Pedal device",IDC_STATIC,4,102,102,28
- COMBOBOX IDC_PEDAL,10,112,91,62,CBS_DROPDOWNLIST | WS_VSCROLL |
- WS_TABSTOP,0,HIDC_PEDAL
- GROUPBOX "Mouse device",IDC_STATIC,4,133,102,28
- COMBOBOX IDC_MOUSE,10,142,90,62,CBS_DROPDOWNLIST | WS_VSCROLL |
- WS_TABSTOP,0,HIDC_MOUSE
- GROUPBOX "Dial device",IDC_STATIC,113,40,102,28
- COMBOBOX IDC_DIAL,119,50,90,62,CBS_DROPDOWNLIST | WS_VSCROLL |
- WS_TABSTOP,0,HIDC_DIAL
- GROUPBOX "Trackball device",IDC_STATIC,113,71,102,28
- COMBOBOX IDC_TRACKBALL,119,80,90,62,CBS_DROPDOWNLIST | WS_VSCROLL |
- WS_TABSTOP,0,HIDC_TRACKBALL
- GROUPBOX "Lightgun device",IDC_STATIC,113,102,102,28
- COMBOBOX IDC_LIGHTGUNDEVICE,119,112,90,62,CBS_DROPDOWNLIST |
- WS_VSCROLL | WS_TABSTOP,0,HIDC_LIGHTGUNDEVICE
- GROUPBOX "Positional device",IDC_STATIC,113,133,102,28
- COMBOBOX IDC_POSITIONAL,119,142,90,62,CBS_DROPDOWNLIST |
- WS_VSCROLL | WS_TABSTOP,0,HIDC_POSITIONAL
- PUSHBUTTON "Reset",IDC_PROP_RESET,4,222,97,14,0,0,HIDC_PROP_RESET
- PUSHBUTTON "Restore Default Settings",IDC_USE_DEFAULT,118,222,97,14,
- 0,0,HIDC_USE_DEFAULT
-END
-
-IDD_PROP_SCREEN DIALOGEX 0, 0, 220, 240
-STYLE WS_CHILD | WS_CAPTION
-CAPTION "Screen"
-FONT 8, "Tahoma"
-BEGIN
- ICON IDI_DISPLAY,IDC_STATIC,20,10,21,20
- LTEXT "Title\nDirectory\nExtra",IDC_PROP_TITLE,52,9,161,25,SS_NOPREFIX
-
- GROUPBOX "Number of screens",IDC_STATIC,4,40,103,24
- CONTROL "GammaSlider",IDC_NUMSCREENS,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,10,50,75,10,0,HIDC_NUMSCREENS
- RTEXT "1",IDC_NUMSCREENSDISP,84,49,14,10,SS_CENTERIMAGE | NOT WS_GROUP
-
- GROUPBOX "Screen",IDC_STATIC,4,66,103,29
- COMBOBOX IDC_SCREEN,10,76,91,64,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP,0,HIDC_SCREEN
-
- GROUPBOX "",IDC_STATIC,4,97,103,28
- CONTROL "Autoselect aspect",IDC_ASPECT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,97,73,10,0,HIDC_ASPECT
- LTEXT "Aspect ratio",IDC_ASPECTRATIOTEXT,17,108,40,11,SS_CENTERIMAGE | NOT WS_GROUP
- EDITTEXT IDC_ASPECTRATION,60,108,14,12,ES_RIGHT | ES_AUTOHSCROLL | ES_NUMBER,0,HIDC_ASPECTRATION
- LTEXT ":",IDC_STATIC,76,108,8,10,SS_CENTERIMAGE | NOT WS_GROUP
- EDITTEXT IDC_ASPECTRATIOD,80,108,14,12,ES_RIGHT | ES_AUTOHSCROLL | ES_NUMBER,0,HIDC_ASPECTRATIOD
-
- GROUPBOX "View",IDC_STATIC,4,128,103,28
- COMBOBOX IDC_VIEW,10,137,91,64,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP,0,HIDC_VIEW
-
- GROUPBOX "Screennumber",IDC_SCREENSELECTTEXT,113,40,102,28
- COMBOBOX IDC_SCREENSELECT,119,50,90,64,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP,0,HIDC_SCREENSELECT
-
- GROUPBOX "Resolution",IDC_STATIC,113,71,102,76,WS_GROUP
- GROUPBOX "Size",IDC_STATIC,119,81,90,28,WS_GROUP
- COMBOBOX IDC_SIZES,126,91,77,70,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP,0,HIDC_SIZES
-
- GROUPBOX "Refresh",IDC_REFRESHTEXT,119,112,90,28,WS_GROUP
- COMBOBOX IDC_REFRESH,126,121,77,76,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP,0,HIDC_REFRESH
- CONTROL "Switch resolutions to fit",IDC_SWITCHRES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,119,151,93,10,0,HIDC_SWITCHRES
-
- PUSHBUTTON "Reset",IDC_PROP_RESET,4,222,97,14,0,0,HIDC_PROP_RESET
- PUSHBUTTON "Restore Default Settings",IDC_USE_DEFAULT,118,222,97,14,0,0,HIDC_USE_DEFAULT
-END
-
-IDD_PROP_GAME DIALOG DISCARDABLE 0, 0, 220, 276
-STYLE WS_CHILD | WS_CAPTION
-CAPTION "General"
-FONT 8, "Tahoma"
-BEGIN
- ICON IDI_MAMEUI_ICON,IDC_GAME_ICON,20,10,21,20
- LTEXT "Title\nDirectory\nExtra",IDC_PROP_TITLE,52,9,161,25,
- SS_NOPREFIX
- CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,18,38,178,1
- LTEXT "Manufactured:",IDC_STATIC,18,43,47,8
- LTEXT "Static",IDC_PROP_MANUFACTURED,65,43,155,9,SS_NOPREFIX
- LTEXT "Status:",IDC_STATIC,18,52,47,8
- LTEXT "Static",IDC_PROP_STATUS,65,52,155,32
- CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,18,85,178,1
- LTEXT "CPU:",IDC_STATIC,18,90,47,8
- LTEXT "Static\nStatic\nStatic\nStatic\nStatic",IDC_PROP_CPU,65,90,155,40
- CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,18,130,178,1
- LTEXT "Sound:",IDC_STATIC,18,135,47,8
- LTEXT "Static\nStatic\nStatic\nStatic\nStatic",IDC_PROP_SOUND,65,135,155,45
- CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,18,181,178,1
- LTEXT "Screen:",IDC_STATIC,18,186,47,8
- LTEXT "Static\nStatic\nStatic",IDC_PROP_SCREEN,65,186,155,27
- CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,18,218,178,1
- LTEXT "Source:",IDC_STATIC,16,223,47,8
- LTEXT "Static",IDC_PROP_SOURCE,65,223,139,8
- LTEXT "Clone of:",IDC_PROP_CLONEOF_TEXT,16,232,50,8
- LTEXT "Static",IDC_PROP_CLONEOF,65,232,130,33
-END
-
-IDD_PROP_AUDIT DIALOG DISCARDABLE 0, 0, 220, 240
-STYLE WS_CHILD | WS_CAPTION
-CAPTION "Audit"
-FONT 8, "Tahoma"
-BEGIN
- ICON IDI_CHECKMARK,IDC_STATIC,20,10,20,20
- LTEXT "Title\nDirectory\nExtra",IDC_PROP_TITLE,52,9,161,25,
- SS_NOPREFIX
- LTEXT "ROM check:",IDC_STATIC,10,40,50,8
- LTEXT "Checking...",IDC_PROP_ROMS,66,40,139,8
- LTEXT "Sample check:",IDC_STATIC,10,52,50,8
- LTEXT "Checking...",IDC_PROP_SAMPLES,66,52,139,8
- GROUPBOX "Details",IDC_STATIC,4,64,211,171
- EDITTEXT IDC_AUDIT_DETAILS_PROP,10,74,199,155,ES_MULTILINE |
- ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_HSCROLL |
- NOT WS_TABSTOP
-END
-
-IDD_PROP_DISPLAY DIALOGEX 0, 0, 220, 240
-STYLE WS_CHILD | WS_CAPTION
-CAPTION "Display"
-FONT 8, "Tahoma"
-BEGIN
- ICON IDI_DISPLAY,IDC_STATIC,20,10,20,20
- LTEXT "Title\nDirectory\nExtra",IDC_PROP_TITLE,52,9,169,25,SS_NOPREFIX
-
- CONTROL "Run in a window",IDC_WINDOWED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,40,69,10,0,HIDC_WINDOWED
- CONTROL "Start out maximized",IDC_MAXIMIZE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,52,74,10,0,HIDC_MAXIMIZE
- CONTROL "Enforce aspect ratio",IDC_KEEPASPECT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,64,77,10,0,HIDC_KEEPASPECT
- CONTROL "Throttle",IDC_THROTTLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,76,39,10,0,HIDC_THROTTLE
-
- GROUPBOX "Bitmap prescaling",IDC_PRESCALETEXT,4,89,103,24
- CONTROL "GammaSlider",IDC_PRESCALE,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,10,99,71,10,0,HIDC_PRESCALE
- RTEXT "1.00",IDC_PRESCALEDISP,84,98,14,11,SS_CENTERIMAGE | NOT WS_GROUP
-
- GROUPBOX "Gamma Correction",IDC_STATIC,4,115,103,24
- CONTROL "GammaSlider",IDC_GAMMA,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,10,125,71,10,0,HIDC_GAMMA
- RTEXT "2.00",IDC_GAMMADISP,84,124,14,10,SS_CENTERIMAGE | NOT WS_GROUP
-
- GROUPBOX "Brightness Correction",IDC_STATIC,4,141,103,24
- CONTROL "GammaSlider",IDC_BRIGHTCORRECT,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,10,151,71,10,0,HIDC_BRIGHTCORRECT
- RTEXT "1.00",IDC_BRIGHTCORRECTDISP,84,150,14,10,SS_CENTERIMAGE | NOT WS_GROUP
-
- GROUPBOX "Contrast Correction",IDC_STATIC,4,167,103,24
- CONTROL "GammaSlider",IDC_CONTRAST,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,10,176,71,10,0,HIDC_CONTRAST
- RTEXT "1.00",IDC_CONTRASTDISP,84,175,14,11,SS_CENTERIMAGE | NOT WS_GROUP
-
- GROUPBOX "Pause Brightness",IDC_STATIC,4,193,103,24
- CONTROL "Slider1",IDC_PAUSEBRIGHT,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,10,203,71,10,0,HIDC_PAUSEBRIGHT
- RTEXT "0.65",IDC_PAUSEBRIGHTDISP,84,202,14,11,SS_CENTERIMAGE | NOT WS_GROUP
-
- GROUPBOX "Video mode",IDC_STATIC,113,40,102,28
- COMBOBOX IDC_VIDEO_MODE,119,50,90,50,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP,0,HIDC_VIDEO_MODE
-
- GROUPBOX "Rotation",IDC_STATIC,113,71,102,55
- COMBOBOX IDC_ROTATE,119,81,90,57,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP,0,HIDC_ROTATE
- CONTROL "Flip screen upside-down",IDC_FLIPY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,119,98,91,10,0,HIDC_FLIPY
- CONTROL "Flip screen left-right",IDC_FLIPX,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,119,110,77,10,0,HIDC_FLIPX
-
- GROUPBOX "Direct3D",IDC_STATIC,113,128,102,57
- CONTROL "Use Bilinear filtering",IDC_D3D_FILTER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,119,138,85,10,0,HIDC_D3D_FILTER
-
-// GROUPBOX "Version",IDC_STATIC,119,150,90,28
-// COMBOBOX IDC_D3D_VERSION,125,160,78,95,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP,0,HIDC_D3D_VERSION
-
-// GROUPBOX "DirectDraw",IDC_STATIC,113,187,102,26
-// CONTROL "Stretch using hardware",IDC_HWSTRETCH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,119,197,85,10,0,HIDC_HWSTRETCH
-
- PUSHBUTTON "Reset",IDC_PROP_RESET,4,222,97,14,0,0,HIDC_PROP_RESET
- PUSHBUTTON "Restore Default Settings",IDC_USE_DEFAULT,118,222,97,14,0,0,HIDC_USE_DEFAULT
-END
-
-IDD_PROP_SOUND DIALOGEX 0, 0, 220, 240
-STYLE WS_CHILD | WS_CAPTION
-CAPTION "Sound"
-FONT 8, "Tahoma"
-BEGIN
- ICON IDI_SOUNDTAB,IDC_STATIC,20,10,20,20
- LTEXT "Title\nDirectory\nExtra",IDC_PROP_TITLE,52,9,161,25,SS_NOPREFIX
-
- GROUPBOX "",IDC_STATIC,4,40,211,155
-
- GROUPBOX "Soundmode",IDC_STATIC,60,50,100,28
- COMBOBOX IDC_SOUND_MODE,66,60,88,50,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP,0,HIDC_VIDEO_MODE
-
- CONTROL "Use samples",IDC_SAMPLES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,60,84,55,10,0,HIDC_SAMPLES
-
- GROUPBOX "Sample rate",IDC_RATETEXT,60,96,100,28
- COMBOBOX IDC_SAMPLERATE,66,106,88,60,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP,0,HIDC_SAMPLERATE
-
- GROUPBOX "Volume attenuation",IDC_VOLUMETEXT,60,127,100,28
- CONTROL "Slider1",IDC_VOLUME,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,66,139,68,10,0,HIDC_VOLUME
- RTEXT "0dB",IDC_VOLUMEDISP,132,138,20,11,SS_CENTERIMAGE
-
- GROUPBOX "Audio latency",IDC_AUDIO_LATENCY_TEXT,60,158,100,28
- CONTROL "Slider1",IDC_AUDIO_LATENCY,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,66,170,68,10,0,HIDC_AUDIO_LATENCY
- RTEXT "1/5",IDC_AUDIO_LATENCY_DISP,132,169,20,11,SS_CENTERIMAGE
-
- PUSHBUTTON "Reset",IDC_PROP_RESET,4,222,97,14,0,0,HIDC_PROP_RESET
- PUSHBUTTON "Restore Default Settings",IDC_USE_DEFAULT,118,222,97,14,0,0,HIDC_USE_DEFAULT
-END
-
-IDD_PROP_ADVANCED DIALOGEX 0, 0, 220, 255
-STYLE DS_FIXEDSYS | WS_CHILD | WS_CAPTION
-CAPTION "Advanced"
-FONT 8, "Tahoma"
-BEGIN
- ICON IDI_DISPLAY,IDC_STATIC,20,10,20,20
- LTEXT "Title\nDirectory\nExtra",IDC_PROP_TITLE,52,9,161,25,SS_NOPREFIX
-
- CONTROL "Triple buffering",IDC_TRIPLE_BUFFER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,40,93,10,0,HIDC_TRIPLE_BUFFER
- CONTROL "Sync to monitor refresh",IDC_SYNCREFRESH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,52,93,10,0,HIDC_SYNCREFRESH
- CONTROL "Wait for vertical sync",IDC_WAITVSYNC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,64,93,10,0,HIDC_WAITVSYNC
- CONTROL "Refresh speed",IDC_REFRESHSPEED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,76,93,10,0,HIDC_REFRESHSPEED
-
- GROUPBOX "Frame skipping",IDC_STATIC,4,104,103,42
- CONTROL "Automatic",IDC_AUTOFRAMESKIP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,114,77,10,0,HIDC_AUTOFRAMESKIP
- COMBOBOX IDC_FRAMESKIP,10,127,91,88,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP,0,HIDC_FRAMESKIP
-
- GROUPBOX "Full screen gamma",IDC_FSGAMMATEXT,113,40,102,24
- CONTROL "Slider1",IDC_FSGAMMA,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,119,50,71,10,0,HIDC_FSGAMMA
- RTEXT "2.00",IDC_FSGAMMADISP,193,49,16,10,SS_CENTERIMAGE | NOT WS_GROUP
-
- GROUPBOX "Full screen brightness",IDC_FSBRIGHTNESSTEXT,113,67,102,24
- CONTROL "Slider1",IDC_FSBRIGHTNESS,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,119,77,71,10,0,HIDC_FSBRIGHTNESS
- RTEXT "2.00",IDC_FSBRIGHTNESSDISP,193,76,16,10,SS_CENTERIMAGE | NOT WS_GROUP
-
- GROUPBOX "Full screen contrast",IDC_FSCONTRASTTEXT,113,94,102,24
- CONTROL "Slider1",IDC_FSCONTRAST,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,119,104,71,10,0,HIDC_FSCONTRAST
- RTEXT "2.00",IDC_FSCONTRASTDISP,193,103,16,11,SS_CENTERIMAGE | NOT WS_GROUP
-
- GROUPBOX "Seconds to run",IDC_SECONDSTORUNTEXT,113,122,102,24
- CONTROL "",IDC_SECONDSTORUN,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,119,132,71,10,0,HIDC_SECONDSTORUN
- RTEXT "60",IDC_SECONDSTORUNDISP,193,130,16,11,SS_CENTERIMAGE | NOT WS_GROUP
-
- GROUPBOX "Emulation speed",IDC_SPEEDTEXT,4,155,211,24
- CONTROL "Slider1",IDC_SPEED,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,12,165,180,10,0,HIDC_SPEED
- RTEXT "1.00",IDC_SPEEDDISP,191,164,20,11,SS_CENTERIMAGE | NOT WS_GROUP
-
- GROUPBOX "Effect",IDC_STATIC,4,182,211,50
- EDITTEXT IDC_EFFECT,12,192,200,14,ES_AUTOHSCROLL | WS_DISABLED
- PUSHBUTTON "Select Effect",IDC_SELECT_EFFECT,12,211,60,14,0,0,HIDC_SELECT_EFFECT
- PUSHBUTTON "Reset Effect",IDC_RESET_EFFECT,152,211,60,14,0,0,HIDC_RESET_EFFECT
-
- PUSHBUTTON "Reset",IDC_PROP_RESET,4,238,97,14,0,0,HIDC_PROP_RESET
- PUSHBUTTON "Restore Default Settings",IDC_USE_DEFAULT,120,238,97,14,0,0,HIDC_USE_DEFAULT
-END
-
-IDD_PROP_DEBUG DIALOGEX 0, 0, 220, 255
-STYLE DS_FIXEDSYS | WS_CHILD | WS_CAPTION
-CAPTION "Debug"
-FONT 8, "Tahoma"
-BEGIN
- ICON IDI_MANUFACTURER,IDC_STATIC,20,10,20,20
- LTEXT "Title\nDirectory\nExtra",IDC_PROP_TITLE,52,9,161,25,SS_NOPREFIX
-
- CONTROL "Output log to Windows Debugger",IDC_OSLOG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,40,124,10,0,HIDC_OSLOG
- CONTROL "Output log to Logfile",IDC_LOG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,52,93,10,0,HIDC_LOG
- CONTROL "Output diagnostic information",IDC_VERBOSE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,64,111,10,0,HIDC_VERBOSE
- CONTROL "Update Main window during paused emulation",IDC_UPDATEINPAUSE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,76,171,10,0,HIDC_UPDATEINPAUSE
- CONTROL "Activate Integrated Debugger",IDC_DEBUG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,88,118,10,0,HIDC_DEBUG
-
- GROUPBOX "Debugscript",IDC_STATIC,6,104,211,50
- EDITTEXT IDC_DEBUGSCRIPT,14,114,200,14,ES_AUTOHSCROLL | WS_DISABLED
- PUSHBUTTON "Select Debugscript",IDC_SELECT_DEBUGSCRIPT,14,133,67,14,0,0,HIDC_SELECT_DEBUGSCRIPT
- PUSHBUTTON "Reset Debugscript",IDC_RESET_DEBUGSCRIPT,149,133,65,14,0,0,HIDC_RESET_DEBUGSCRIPT
-
- PUSHBUTTON "Reset",IDC_PROP_RESET,4,238,97,14,0,0,HIDC_PROP_RESET
- PUSHBUTTON "Restore Default Settings",IDC_USE_DEFAULT,120,238,97,14,0,0,HIDC_USE_DEFAULT
-END
-
-IDD_PROP_INPUT DIALOGEX 0, 0, 220, 240
-STYLE DS_FIXEDSYS | WS_CHILD | WS_CAPTION
-CAPTION "Controllers"
-FONT 8, "Tahoma"
-BEGIN
- ICON IDI_JOYSTICK,IDC_STATIC,20,10,20,20
- LTEXT "Title\nDirectory\nExtra",IDC_PROP_TITLE,52,9,161,25,
- SS_NOPREFIX
- CONTROL "Enable mouse input",IDC_USE_MOUSE,"Button",
- BS_AUTOCHECKBOX | WS_TABSTOP,10,40,86,10,0,
- HIDC_USE_MOUSE
- CONTROL "Enable steadykey support",IDC_STEADYKEY,"Button",
- BS_AUTOCHECKBOX | WS_TABSTOP,10,52,95,10,0,
- HIDC_STEADYKEY
- GROUPBOX "",IDC_STATIC,4,64,103,74
- CONTROL "Enable joystick input",IDC_JOYSTICK,"Button",
- BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,10,64,78,10,0,
- HIDC_JOYSTICK
- GROUPBOX "Joystick deadzone",IDC_JDZTEXT,10,76,91,28
- CONTROL "IntensitySlider",IDC_JDZ,"msctls_trackbar32",TBS_BOTH |
- TBS_NOTICKS | WS_TABSTOP,15,88,60,10,0,HIDC_JDZ
- RTEXT "0.3",IDC_JDZDISP,76,87,16,11,SS_CENTERIMAGE | NOT
- WS_GROUP
- GROUPBOX "Default input layout",IDC_STATIC,113,40,102,28
- COMBOBOX IDC_DEFAULT_INPUT,119,50,90,53,CBS_DROPDOWNLIST |
- WS_VSCROLL | WS_TABSTOP,0,HIDC_DEFAULT_INPUT
- GROUPBOX "",IDC_STATIC,113,71,102,66
- CONTROL "Enable lightgun input",IDC_LIGHTGUN,"Button",
- BS_AUTOCHECKBOX | WS_TABSTOP,119,71,80,10,0,
- HIDC_LIGHTGUN
- CONTROL "Offscreen shots reload",IDC_RELOAD,"Button",
- BS_AUTOCHECKBOX | WS_TABSTOP,119,83,86,10,0,HIDC_RELOAD
- CONTROL "Dual lightguns",IDC_DUAL_LIGHTGUN,"Button",
- BS_AUTOCHECKBOX | WS_TABSTOP,119,96,86,10,0,
- HIDC_DUAL_LIGHTGUN
- CONTROL "Multiple keyboards",IDC_MULTIKEYBOARD,"Button",
- BS_AUTOCHECKBOX | WS_TABSTOP,119,109,75,10,0,
- HIDC_MULTIKEYBOARD
- CONTROL "Multiple mice",IDC_MULTIMOUSE,"Button",BS_AUTOCHECKBOX |
- WS_TABSTOP,119,122,56,10,0,HIDC_MULTIMOUSE
- GROUPBOX "Joystick saturation",IDC_JSATTEXT,10,106,91,28
- CONTROL "IntensitySlider",IDC_JSAT,"msctls_trackbar32",TBS_BOTH |
- TBS_NOTICKS | WS_TABSTOP,16,118,60,10,0,HIDC_JSAT
- RTEXT "0.85",IDC_JSATDISP,76,116,16,11,SS_CENTERIMAGE | NOT
- WS_GROUP
- PUSHBUTTON "Reset",IDC_PROP_RESET,4,222,97,14,0,0,HIDC_PROP_RESET
- PUSHBUTTON "Restore Default Settings",IDC_USE_DEFAULT,118,222,97,14,
- 0,0,HIDC_USE_DEFAULT
- GROUPBOX "Joystickmap",IDC_STATIC,4,143,211,50
- EDITTEXT IDC_JOYSTICKMAP,12,153,200,14,ES_AUTOHSCROLL |
- WS_DISABLED
- PUSHBUTTON "Select Joystickmap",IDC_SELECT_JOYSTICKMAP,12,172,67,14,
- 0,0,HIDC_SELECT_JOYSTICKMAP
- PUSHBUTTON "Reset Joystickmap",IDC_RESET_JOYSTICKMAP,147,172,65,14,
- 0,0,HIDC_RESET_JOYSTICKMAP
-END
-
-IDD_PROP_MISC DIALOGEX 0, 0, 220, 240
-STYLE DS_FIXEDSYS | WS_CHILD | WS_CAPTION
-CAPTION "Miscellaneous"
-FONT 8, "Tahoma"
-BEGIN
- ICON IDI_MAMEUI_ICON,IDC_STATIC,20,10,20,20
- LTEXT "Title\nDirectory\nExtra",IDC_PROP_TITLE,52,9,161,25,
- SS_NOPREFIX
- CONTROL "Enable cheats",IDC_CHEAT,"Button",BS_AUTOCHECKBOX |
- WS_TABSTOP,10,40,86,10,0,HIDC_CHEAT
- CONTROL "Sleep when possible",IDC_SLEEP,"Button",BS_AUTOCHECKBOX |
- WS_TABSTOP,10,52,86,10,0,HIDC_SLEEP
- CONTROL "Skip game info",IDC_SKIP_GAME_INFO,"Button",
- BS_AUTOCHECKBOX | WS_TABSTOP,10,64,96,10,0,
- HIDC_SKIP_GAME_INFO
- CONTROL "Save game state on exit",IDC_ENABLE_AUTOSAVE,"Button",
- BS_AUTOCHECKBOX | WS_TABSTOP,10,76,96,10,0,
- HIDC_ENABLE_AUTOSAVE
- CONTROL "Coin lockout",IDC_COINLOCKOUT,"Button",BS_AUTOCHECKBOX |
- WS_TABSTOP,10,100,96,10,0,HIDC_COINLOCKOUT
- GROUPBOX "Thread Priority",IDC_HIGH_PRIORITY_TEXT,7,112,103,34
- CONTROL "Slider1",IDC_HIGH_PRIORITY,"msctls_trackbar32",TBS_BOTH |
- TBS_NOTICKS | WS_TABSTOP,13,122,75,10,0,
- HIDC_HIGH_PRIORITY
- LTEXT "idle",IDC_STATIC,17,132,12,8
- RTEXT "-15",IDC_HIGH_PRIORITYTXT,87,122,14,10,SS_CENTERIMAGE
- RTEXT "real-time",IDC_STATIC,57,134,28,8
- GROUPBOX "Snapshot view",IDC_STATIC,7,148,103,28
- COMBOBOX IDC_SNAPVIEW,13,158,90,60,CBS_DROPDOWNLIST | WS_VSCROLL |
- WS_TABSTOP,0,HIDC_SNAPVIEW
- GROUPBOX "Artwork options",IDC_STATIC,113,40,102,85
-// CONTROL "Backdrops",IDC_BACKDROPS,"Button",BS_AUTOCHECKBOX |
-// WS_TABSTOP,119,50,86,10,0,HIDC_BACKDROPS
-// CONTROL "Bezels",IDC_BEZELS,"Button",BS_AUTOCHECKBOX |
-// WS_TABSTOP,119,62,86,10,0,HIDC_BEZELS
-// CONTROL "Overlays",IDC_OVERLAYS,"Button",BS_AUTOCHECKBOX |
-// WS_TABSTOP,119,74,84,10,0,HIDC_OVERLAYS
-// CONTROL "CPanels",IDC_CPANELS,"Button",BS_AUTOCHECKBOX |
-// WS_TABSTOP,119,86,84,10,0
-// CONTROL "Marquees",IDC_MARQUEES,"Button",BS_AUTOCHECKBOX |
-// WS_TABSTOP,119,98,84,10,0
- CONTROL "Crop artwork",IDC_ARTWORK_CROP,"Button",BS_AUTOCHECKBOX |
- WS_TABSTOP,119,110,53,10,0,HIDC_ARTWORK_CROP
- GROUPBOX "BIOS",IDC_STATIC,113,128,102,28
- COMBOBOX IDC_BIOS,119,138,90,60,CBS_DROPDOWNLIST | WS_VSCROLL |
- WS_TABSTOP,0,HIDC_BIOS
- GROUPBOX "",IDC_STATIC,7,178,208,28
- CONTROL "Autoselect snapshot size",IDC_SNAPSIZE,"Button",
- BS_AUTOCHECKBOX | WS_TABSTOP,13,178,95,10,0,
- HIDC_SNAPSIZE
- LTEXT "Snapshotsize",IDC_SNAPSIZETEXT,11,189,44,11,
- SS_CENTERIMAGE | NOT WS_GROUP
- EDITTEXT IDC_SNAPSIZEWIDTH,122,187,32,12,ES_RIGHT |
- ES_AUTOHSCROLL | ES_NUMBER,0,HIDC_SNAPSIZEWIDTH
- EDITTEXT IDC_SNAPSIZEHEIGHT,172,187,32,12,ES_RIGHT |
- ES_AUTOHSCROLL | ES_NUMBER,0,HIDC_SNAPSIZEHEIGHT
- LTEXT "x",IDC_SNAPSIZEX,162,189,8,8
- PUSHBUTTON "Reset",IDC_PROP_RESET,4,222,97,14,0,0,HIDC_PROP_RESET
- PUSHBUTTON "Restore Default Settings",IDC_USE_DEFAULT,118,222,97,14,
- 0,0,HIDC_USE_DEFAULT
- CONTROL "Show Menu",IDC_SHOW_MENU,"Button",
- BS_AUTOCHECKBOX | WS_TABSTOP,119,160,86,10,0
-END
-
-IDD_PROP_VECTOR DIALOGEX 0, 0, 220, 240
-STYLE WS_CHILD | WS_CAPTION
-CAPTION "Vector"
-FONT 8, "Tahoma"
-BEGIN
- ICON IDI_MAMEUI_ICON,IDC_STATIC,20,10,20,20
- LTEXT "Title\nDirectory\nExtra",IDC_PROP_TITLE,52,9,161,25,
- SS_NOPREFIX
-// CONTROL "Draw antialiased vectors",IDC_ANTIALIAS,"Button",
-// BS_AUTOCHECKBOX | WS_TABSTOP,10,40,92,10,0,
-// HIDC_ANTIALIAS
- GROUPBOX "Beam width",IDC_BEAMTEXT,60,53,100,28
- CONTROL "BeamSlider",IDC_BEAM,"msctls_trackbar32",TBS_BOTH |
- TBS_NOTICKS | WS_TABSTOP,66,65,64,10,0,HIDC_BEAM
- RTEXT "16.00",IDC_BEAMDISP,132,64,20,11,SS_CENTERIMAGE
- GROUPBOX "Flicker",IDC_FLICKERTEXT,60,84,100,28
- CONTROL "FlickerSlider",IDC_FLICKER,"msctls_trackbar32",TBS_BOTH |
- TBS_NOTICKS | WS_TABSTOP,66,96,64,10,0,HIDC_FLICKER
- RTEXT "100.00",IDC_FLICKERDISP,128,95,24,11,SS_CENTERIMAGE |
- NOT WS_GROUP
- PUSHBUTTON "Reset",IDC_PROP_RESET,4,222,97,14,0,0,HIDC_PROP_RESET
- PUSHBUTTON "Restore Default Settings",IDC_USE_DEFAULT,118,222,97,14,
- 0,0,HIDC_USE_DEFAULT
-END
-
-IDD_MAIN DIALOGEX 0, 0, 364, 206
-STYLE DS_3DLOOK | DS_NOFAILCREATE | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | DS_SETFONT
-EXSTYLE WS_EX_CONTROLPARENT
-CAPTION "MAMEUI - overwritten at runtime"
-CLASS "MainClass"
-FONT 8, "Verdana"
-BEGIN
- CONTROL "",IDC_DIVIDER,"Static",SS_ETCHEDHORZ,0,5,304,1
- CONTROL "Tree1",IDC_TREE,"SysTreeView32",TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_EDITLABELS |
- TVS_SHOWSELALWAYS | TVS_FULLROWSELECT | WS_BORDER | WS_TABSTOP,5,28,48,172
- CONTROL "List1",IDC_LIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_AUTOARRANGE |
- LVS_SHAREIMAGELISTS | LVS_OWNERDRAWFIXED | WS_BORDER | WS_TABSTOP,65,28,42,172
- GROUPBOX "",IDC_SPLITTER,55,28,8,172,BS_NOTIFY | NOT WS_VISIBLE
- GROUPBOX "",IDC_SPLITTER2,109,28,8,172,BS_NOTIFY | NOT WS_VISIBLE
- CONTROL "",IDC_SSFRAME,"Static",SS_ETCHEDFRAME | SS_NOTIFY,121,11,181,194
- CONTROL "",IDC_SSTAB,"SysTabControl32",TCS_HOTTRACK,121,0,181,18
- CONTROL "",IDC_SSPICTURE,"Static",SS_BITMAP | NOT WS_VISIBLE,141,18,141,127
- EDITTEXT IDC_HISTORY,129,150,167,49,ES_MULTILINE | ES_READONLY | NOT WS_BORDER | WS_VSCROLL | NOT WS_TABSTOP,0,HIDC_HISTORY
-END
-
-IDD_FILTERS DIALOGEX 0, 0, 190, 196
-STYLE DS_MODALFRAME | DS_CENTER | DS_3DLOOK | WS_POPUP | WS_CAPTION |
- WS_SYSMENU
-EXSTYLE WS_EX_CONTEXTHELP
-CAPTION "Game Filters"
-FONT 8, "Tahoma"
-BEGIN
- GROUPBOX "Game filters",IDC_STATIC,6,4,178,99
- CONTROL "&Vector Graphics",IDC_FILTER_VECTOR,"Button",
- BS_AUTOCHECKBOX | WS_TABSTOP,14,16,70,10,0,
- HIDC_FILTER_VECTOR
- CONTROL "C&lones",IDC_FILTER_CLONES,"Button",BS_AUTOCHECKBOX |
- WS_TABSTOP,14,30,41,10,0,HIDC_FILTER_CLONES
- CONTROL "Non-Wor&king",IDC_FILTER_NONWORKING,"Button",
- BS_AUTOCHECKBOX | WS_TABSTOP,14,44,61,10,0,
- HIDC_FILTER_NONWORKING
- CONTROL "&Horizontal",IDC_FILTER_HORIZONTAL,"Button",
- BS_AUTOCHECKBOX | WS_TABSTOP,14,58,57,10,0,
- HIDC_FILTER_HORIZONTAL
- CONTROL "&Unavailable",IDC_FILTER_UNAVAILABLE,"Button",
- BS_AUTOCHECKBOX | WS_TABSTOP,14,72,57,10,0,
- HIDC_FILTER_UNAVAILABLE
- CONTROL "Arcade",IDC_FILTER_ARCADE,"Button",
- BS_AUTOCHECKBOX | WS_TABSTOP,14,86,57,10,0
- CONTROL "&Raster Graphics",IDC_FILTER_RASTER,"Button",
- BS_AUTOCHECKBOX | WS_TABSTOP,100,16,70,10,0,
- HIDC_FILTER_RASTER
- CONTROL "Ori&ginals",IDC_FILTER_ORIGINALS,"Button",
- BS_AUTOCHECKBOX | WS_TABSTOP,100,30,47,10,0,
- HIDC_FILTER_ORIGINALS
- CONTROL "&Working",IDC_FILTER_WORKING,"Button",BS_AUTOCHECKBOX |
- WS_TABSTOP,100,44,47,10,0,HIDC_FILTER_WORKING
- CONTROL "&Vertical",IDC_FILTER_VERTICAL,"Button",BS_AUTOCHECKBOX |
- WS_TABSTOP,100,58,47,10,0,HIDC_FILTER_VERTICAL
- CONTROL "&Mechanical",IDC_FILTER_MECHANICAL,"Button",BS_AUTOCHECKBOX |
- WS_TABSTOP,100,72,58,10,0,HIDC_FILTER_MECHANICAL
- CONTROL "MESS",IDC_FILTER_MESS,"Button",BS_AUTOCHECKBOX |
- WS_TABSTOP,100,86,58,10,0,HIDC_FILTER_MECHANICAL
- LTEXT "(*) = inherited from parent folder",IDC_INHERITED,14,72,
- 99,10
- CTEXT "Game filters allow customizing the games that are displayed in each folder by hiding games that match the filters applied.",
- IDC_STATIC,6,108,178,27
- GROUPBOX "&Description filter",IDC_STATIC,6,136,178,33
- EDITTEXT IDC_FILTER_EDIT,14,148,162,13,ES_AUTOHSCROLL,0,
- HIDC_FILTER_EDIT
- DEFPUSHBUTTON "&OK",IDOK,42,175,50,14
- PUSHBUTTON "&Cancel",IDCANCEL,98,175,50,14
-END
-
-IDD_RESET DIALOGEX 0, 0, 190, 122
-STYLE DS_MODALFRAME | DS_CENTER | DS_3DLOOK | WS_POPUP | WS_CAPTION | WS_SYSMENU
-EXSTYLE WS_EX_CONTEXTHELP
-CAPTION "Reset Options"
-FONT 8, "Tahoma"
-BEGIN
- GROUPBOX "Categories",IDC_STATIC,6,4,178,70
- CONTROL "&User Interface (Fonts, Colors, Sizes)",IDC_RESET_UI,
- "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,16,146,10,0,
- HIDC_RESET_UI
- CONTROL "&Default game options",IDC_RESET_DEFAULT,"Button",
- BS_AUTOCHECKBOX | WS_TABSTOP,14,30,146,10,0,
- HIDC_RESET_DEFAULT
- CONTROL "&All games to use default options",IDC_RESET_GAMES,
- "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,44,146,10,0,
- HIDC_RESET_GAMES
- CONTROL "&Folder 'filters'",IDC_RESET_FILTERS,"Button",
- BS_AUTOCHECKBOX | WS_TABSTOP,14,58,146,10,0,
- HIDC_RESET_FILTERS
- CTEXT "Select the options to be restored to the default settings.",
- IDC_STATIC,6,79,178,20
- DEFPUSHBUTTON "&OK",IDOK,42,101,50,14
- PUSHBUTTON "&Cancel",IDCANCEL,98,101,50,14
-END
-
-
-IDD_INTERFACE_OPTIONS DIALOGEX 0, 0, 378, 225
-STYLE DS_MODALFRAME | DS_CENTER | DS_3DLOOK | WS_POPUP | WS_CAPTION | WS_SYSMENU
-EXSTYLE WS_EX_CONTEXTHELP
-CAPTION "Interface Options"
-FONT 8, "Tahoma"
-BEGIN
- GROUPBOX "Game Selection",IDC_STATIC,6,4,189,194
- CONTROL "&Search for new games on start",IDC_START_GAME_CHECK,
- "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,16,111,10,0,
- HIDC_START_GAME_CHECK
- CONTROL "Allow game selection by a &joystick (requires restart)",
- IDC_JOY_GUI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,30,
- 174,10,0,HIDC_JOY_GUI
- CONTROL "Allow game selection by custom &key sequences",
- IDC_KEY_GUI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,44,
- 166,10
- CONTROL "Hide &mouse cursor (requires restart)",IDC_HIDE_MOUSE,
- "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,86,126,10,0,
- HIDC_HIDE_MOUSE
- CONTROL "Inheritable Filters",IDC_FILTER_INHERIT,"Button",
- BS_AUTOCHECKBOX | WS_TABSTOP,14,100,68,10
- CONTROL "No offset for clones missing parent in view",
- IDC_NOOFFSET_CLONES,"Button",BS_AUTOCHECKBOX |
- WS_TABSTOP,14,114,148,10
- GROUPBOX "Show History on Tab",IDC_STATIC,14,128,173,28
- COMBOBOX IDC_HISTORY_TAB,57,138,88,50,CBS_DROPDOWNLIST |
- WS_VSCROLL | WS_TABSTOP
- GROUPBOX "Snapshot Pattern",IDC_STATIC,202,4,170,28
- GROUPBOX "Bookkeeping",IDC_STATIC,202,36,170,43
- CONTROL "Reset all Playcounts",IDC_RESET_PLAYCOUNT,"Button",
- BS_AUTOCHECKBOX | WS_TABSTOP,210,48,80,10
- CONTROL "Reset all Play Times",IDC_RESET_PLAYTIME,"Button",
- BS_AUTOCHECKBOX | WS_TABSTOP,210,62,79,10
- GROUPBOX "Screenshot Area",IDC_STATIC,202,83,170,115
- CONTROL "S&tretch screenshot larger than natural size",
- IDC_STRETCH_SCREENSHOT_LARGER,"Button",BS_AUTOCHECKBOX |
- WS_TABSTOP,210,95,148,10,0,
- HIDC_STRETCH_SCREENSHOT_LARGER
- GROUPBOX "Screenshot Cycletime in Seconds",IDC_STATIC,210,109,154,
- 28
- CONTROL "Slider1",IDC_CYCLETIMESEC,"msctls_trackbar32",TBS_BOTH |
- TBS_NOTICKS | WS_TABSTOP,218,121,120,10,0,
- HIDC_CYCLETIMESEC
- RTEXT "60",IDC_CYCLETIMESECTXT,340,120,13,10,SS_CENTERIMAGE
- GROUPBOX "Screenshot Bordersize",IDC_STATIC,210,141,154,28
- CONTROL "Slider1",IDC_SCREENSHOT_BORDERSIZE,"msctls_trackbar32",
- TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,218,153,120,10
- RTEXT "100",IDC_SCREENSHOT_BORDERSIZETXT,340,152,13,10,
- SS_CENTERIMAGE
- PUSHBUTTON "Set Screenshot Border Color",IDC_SCREENSHOT_BORDERCOLOR,
- 210,176,154,14
- DEFPUSHBUTTON "&OK",IDOK,136,204,50,14
- PUSHBUTTON "&Cancel",IDCANCEL,192,204,50,14
- COMBOBOX IDC_SNAPNAME,209,14,155,60,CBS_DROPDOWNLIST | WS_VSCROLL |
- WS_TABSTOP,0,HIDC_SNAPNAME
-END
-
-IDD_CUSTOM_FILE DIALOG DISCARDABLE 0, 0, 190, 135
-STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
-CAPTION "Add Game To Custom Folder"
-FONT 8, "Tahoma"
-BEGIN
- LTEXT "",IDC_CUSTOMFILE_GAME,6,6,175,10,SS_NOPREFIX |
- SS_CENTERIMAGE
- CONTROL "CustomTree",IDC_CUSTOM_TREE,"SysTreeView32",
- TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT |
- TVS_DISABLEDRAGDROP | TVS_SHOWSELALWAYS |
- TVS_FULLROWSELECT | WS_BORDER | WS_TABSTOP,6,18,178,90
- DEFPUSHBUTTON "OK",IDOK,42,114,50,14
- PUSHBUTTON "Cancel",IDCANCEL,98,114,50,14
-END
-
-
-
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Accelerator
-//
-
-IDA_TAB_KEYS ACCELERATORS MOVEABLE PURE
-BEGIN
- "1", ID_VIEW_TAB_SCREENSHOT, VIRTKEY, ALT, NOINVERT
- "2", ID_VIEW_TAB_FLYER, VIRTKEY, ALT, NOINVERT
- "3", ID_VIEW_TAB_CABINET, VIRTKEY, ALT, NOINVERT
- "4", ID_VIEW_TAB_MARQUEE, VIRTKEY, ALT, NOINVERT
- "5", ID_VIEW_TAB_TITLE, VIRTKEY, ALT, NOINVERT
- "6", ID_VIEW_TAB_CONTROL_PANEL, VIRTKEY, ALT, NOINVERT
- "7", ID_VIEW_TAB_PCB, VIRTKEY, ALT, NOINVERT
- "8", ID_VIEW_TAB_HISTORY, VIRTKEY, ALT, NOINVERT
- "A", ID_GAME_AUDIT, VIRTKEY, ALT, NOINVERT
- "B", ID_VIEW_PAGETAB, VIRTKEY, ALT, NOINVERT
- "D", ID_VIEW_FOLDERS, VIRTKEY, ALT, NOINVERT
- "E", ID_TOOLBAR_EDIT, VIRTKEY, CONTROL, NOINVERT
- "F", ID_CONTEXT_FILTERS, VIRTKEY, CONTROL, NOINVERT
- "U", ID_FOLDER_AUDIT, VIRTKEY, ALT, NOINVERT
- "P", ID_VIEW_PICTURE_AREA, VIRTKEY, ALT, NOINVERT
- "R", ID_CONTEXT_SELECT_RANDOM, VIRTKEY, CONTROL, NOINVERT
- "S", ID_VIEW_STATUS, VIRTKEY, ALT, NOINVERT
- "T", ID_VIEW_TOOLBARS, VIRTKEY, ALT, NOINVERT
- VK_F1, ID_HELP_CONTENTS, VIRTKEY, NOINVERT
- VK_F11, ID_VIEW_FULLSCREEN, VIRTKEY, NOINVERT
- VK_F5, ID_UPDATE_GAMELIST, VIRTKEY, NOINVERT
- VK_NEXT, ID_UI_HISTORY_DOWN, VIRTKEY, CONTROL, NOINVERT
- VK_PRIOR, ID_UI_HISTORY_UP, VIRTKEY, CONTROL, NOINVERT
- VK_RETURN, ID_GAME_PROPERTIES, VIRTKEY, ALT, NOINVERT
-END
-
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// DESIGNINFO
-//
-
-#ifdef APSTUDIO_INVOKED
-GUIDELINES DESIGNINFO MOVEABLE PURE
-BEGIN
- IDD_ABOUT, DIALOG
- BEGIN
- LEFTMARGIN, 7
- RIGHTMARGIN, 289
- TOPMARGIN, 7
- BOTTOMMARGIN, 123
- END
-
- IDD_DIRECTX, DIALOG
- BEGIN
- LEFTMARGIN, 7
- RIGHTMARGIN, 229
- TOPMARGIN, 7
- BOTTOMMARGIN, 62
- END
-
- IDD_AUDIT, DIALOG
- BEGIN
- LEFTMARGIN, 7
- RIGHTMARGIN, 280
- TOPMARGIN, 7
- BOTTOMMARGIN, 187
- HORZGUIDE, 19
- END
-
- IDD_DIRECTORIES, DIALOG
- BEGIN
- LEFTMARGIN, 7
- RIGHTMARGIN, 224
- TOPMARGIN, 7
- BOTTOMMARGIN, 98
- END
-
- IDD_COLUMNS, DIALOG
- BEGIN
- LEFTMARGIN, 7
- RIGHTMARGIN, 301
- TOPMARGIN, 7
- BOTTOMMARGIN, 143
- END
-
- IDD_PROP_CONTROLLER, DIALOG
- BEGIN
- RIGHTMARGIN, 210
- BOTTOMMARGIN, 154
- END
-
- IDD_PROP_SCREEN, DIALOG
- BEGIN
- LEFTMARGIN, 4
- VERTGUIDE, 7
- VERTGUIDE, 123
- BOTTOMMARGIN, 199
- HORZGUIDE, 179
- END
-
- IDD_PROP_GAME, DIALOG
- BEGIN
- LEFTMARGIN, 7
- RIGHTMARGIN, 213
- VERTGUIDE, 19
- VERTGUIDE, 66
- VERTGUIDE, 74
- VERTGUIDE, 201
- BOTTOMMARGIN, 268
- END
-
- IDD_PROP_AUDIT, DIALOG
- BEGIN
- LEFTMARGIN, 7
- RIGHTMARGIN, 213
- VERTGUIDE, 12
- VERTGUIDE, 208
- BOTTOMMARGIN, 198
- HORZGUIDE, 38
- END
-
- IDD_PROP_DISPLAY, DIALOG
- BEGIN
- LEFTMARGIN, 4
- VERTGUIDE, 7
- VERTGUIDE, 123
- HORZGUIDE, 179
- END
-
- IDD_PROP_SOUND, DIALOG
- BEGIN
- LEFTMARGIN, 7
- RIGHTMARGIN, 213
- VERTGUIDE, 50
- BOTTOMMARGIN, 198
- END
-
- IDD_PROP_ADVANCED, DIALOG
- BEGIN
- LEFTMARGIN, 10
- BOTTOMMARGIN, 240
- END
-
- IDD_PROP_INPUT, DIALOG
- BEGIN
- LEFTMARGIN, 4
- RIGHTMARGIN, 215
- VERTGUIDE, 50
- VERTGUIDE, 170
- END
-
- IDD_PROP_MISC, DIALOG
- BEGIN
- LEFTMARGIN, 7
- RIGHTMARGIN, 213
- VERTGUIDE, 25
- VERTGUIDE, 40
- VERTGUIDE, 104
- VERTGUIDE, 114
- VERTGUIDE, 204
- BOTTOMMARGIN, 236
- END
-
- IDD_PROP_VECTOR, DIALOG
- BEGIN
- LEFTMARGIN, 7
- RIGHTMARGIN, 213
- VERTGUIDE, 50
- BOTTOMMARGIN, 198
- END
-
- IDD_FILTERS, DIALOG
- BEGIN
- LEFTMARGIN, 7
- TOPMARGIN, 7
- BOTTOMMARGIN, 178
- END
-
- IDD_RESET, DIALOG
- BEGIN
- LEFTMARGIN, 7
- RIGHTMARGIN, 175
- VERTGUIDE, 18
- VERTGUIDE, 164
- TOPMARGIN, 7
- END
-END
-#endif // APSTUDIO_INVOKED
-
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Bitmap
-//
-
-
-
-
-IDB_ABOUT BITMAP "res\\about.bmp"
-IDB_TOOLBAR BITMAP "res\\toolbar.bmp"
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Cursor
-//
-
-IDC_CURSOR_HSPLIT CURSOR "res\\splith.cur"
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// RT_MANIFEST
-//
-
-1 RT_MANIFEST "res\\mameui.manifest"
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// String Table
-//
-
-STRINGTABLE DISCARDABLE
-BEGIN
- IDS_UI_FILE "Contains commands for working with the selected items"
- IDS_UI_VIEW "Contains commands for manipulating the view"
- IDS_UI_OPTIONS "Contains commands for user interface options"
-END
-
-STRINGTABLE DISCARDABLE
-BEGIN
- IDS_UI_HELP "Contains commands for displaying help"
- IDS_VIEW_TOOLBAR "Show or hide the toolbar"
- IDS_VIEW_STATUSBAR "Show or hide the status bar"
- IDS_VIEW_FOLDERLIST "Show or hide the folder list"
- IDS_VIEW_SCREENSHOT "Show or hide the screen shot"
- IDS_VIEW_PICTURETABS "Show or hide tabs in the picture area"
- IDS_VIEW_SPACER1 "Spacer"
- IDS_VIEW_FULLSCREEN "Toggle full screen mode"
- IDS_VIEW_SPACER2 "Spacer"
- IDS_VIEW_SHOWPICTURES "Contains commands to select tabs shown in the picture area"
- IDS_VIEW_SPACER3 "Spacer"
-END
-
-STRINGTABLE DISCARDABLE
-BEGIN
- IDS_VIEW_LARGEICONS "Display items by using large icons."
- IDS_VIEW_SMALLICONS "Display items by using small icons."
- IDS_VIEW_LIST "Displays items in a list."
- IDS_VIEW_DETAILS "Displays detailed information about each item in the window."
- IDS_VIEW_GROUPED "Displays items grouped by parent game"
- IDS_VIEW_SPACER4 "Spacer"
- IDS_VIEW_ARRANGE "Contains commands for sorting by various columns"
- IDS_VIEW_LINEUPICONS "Arranges icons in a grid"
- IDS_VIEW_SPACER5 "Spacer"
- IDS_VIEW_REFRESH "Refresh game list"
- IDS_VIEW_CONTEXTFILTERS "Allows filtering out games from a folder"
- IDS_VIEW_CUSTOMIZEFIELDS
- "Customize which columns are used in the game list"
-END
-
-STRINGTABLE DISCARDABLE
-BEGIN
- ID_FILE_EXIT "Exit the application"
- ID_FILE_PLAY "Play currently selected game"
- ID_HELP_ABOUT "Displays program and copyright information"
- ID_VIEW_LARGE_ICON "Display items by using large icons."
- ID_VIEW_SMALL_ICON "Display items by using small icons."
- ID_VIEW_LIST_MENU "Displays items in a list."
- ID_VIEW_DETAIL "Displays detailed information about each item in the window."
- ID_VIEW_GROUPED "Show items grouped by parent game"
- ID_OPTIONS_FONT "Set game list and folder list font"
- ID_OPTIONS_CLONE_COLOR "Set the clone font color"
- ID_OPTIONS_DIR "Set directory configuration"
- ID_OPTIONS_DEFAULTS "Set default game options"
-END
-
-STRINGTABLE DISCARDABLE
-BEGIN
- ID_OPTIONS_RESET_DEFAULTS "Allow restoring options to 'sane' values."
- ID_OPTIONS_INTERFACE "Customize interface options."
- ID_FILE_AUDIT "Audit ROM and samples sets"
- ID_FILE_PLAY_RECORD "Record a game for later playback"
- ID_FILE_PLAY_BACK "Playback a recorded game"
- ID_FILE_PLAY_RECORD_WAVE "Record the audio output of a game"
- ID_FILE_PLAY_RECORD_MNG "Record the video output of a game"
- ID_FILE_PLAY_RECORD_AVI "Record the complete output of a game"
- ID_VIEW_PICTURE_AREA "Show or hide the picture area"
- ID_HELP_CONTENTS "Display help contents"
- ID_HELP_WHATS_NEWUI "New game changes"
- ID_HELP_TROUBLE "Troubleshooting Documentation"
- ID_HELP_RELEASE "MAME release notes"
- ID_HELP_WHATS_NEW "What's new in MAME"
- ID_HELP_CHEATS "How cheats work"
-END
-
-STRINGTABLE DISCARDABLE
-BEGIN
- ID_CONTEXT_RESET_PLAYTIME "Reset time played for selected item"
- ID_CONTEXT_RESET_PLAYCOUNT "Reset number of plays for selected item"
- ID_FOLDER_PROPERTIES "Display folder properties"
- ID_FOLDER_AUDIT "Audit items in this folder"
- ID_FILE_LOADSTATE "Play a game starting with the given savestate"
-END
-
-STRINGTABLE DISCARDABLE
-BEGIN
- ID_VIEW_TAB_CABINET "Select Cabinet tab"
- ID_VIEW_TAB_MARQUEE "Select Marquee tab"
- ID_VIEW_TAB_TITLE "Select Title tab"
- ID_VIEW_TAB_CONTROL_PANEL "Select Control panel tab"
- ID_VIEW_TAB_PCB "Select PCB tab"
- ID_VIEW_TAB_HISTORY "Select History tab"
- ID_OPTIONS_BG "Set the background image"
- ID_TOGGLE_TAB_SCREENSHOT "Enable the screenshot tab"
- ID_TOGGLE_TAB_FLYER "Enable the flyer tab"
- ID_TOGGLE_TAB_CABINET "Enable the cabinet tab"
- ID_TOGGLE_TAB_MARQUEE "Enable the marquee tab"
- ID_TOGGLE_TAB_TITLE "Enable the title tab"
- ID_TOGGLE_TAB_CONTROL_PANEL "Enable the control panel tab"
- ID_TOGGLE_TAB_PCB "Enable the PCB tab"
- ID_TOGGLE_TAB_HISTORY "Enable the history tab"
- ID_VIEW_FULLSCREEN "Toggle Fullscreen mode"
-END
-
-STRINGTABLE DISCARDABLE
-BEGIN
- ID_CUSTOMIZE_FIELDS "Customize which columns are used in the game list"
- ID_GAME_PROPERTIES "Display the properties of the selected item"
- ID_VIEW_PAGETAB "Show or hide the tabs in the picture area"
- ID_VIEW_FOLDERS "Show or hide the folder list"
- ID_VIEW_TOOLBARS "Show or hide the toolbar"
- ID_VIEW_STATUS "Show or hide the status bar"
- ID_CONTEXT_FILTERS "Allows filtering out games from a folder"
- ID_CONTEXT_RENAME_CUSTOM "Rename this folder"
- ID_CONTEXT_ADD_CUSTOM "Add selected item to custom folder"
- ID_CONTEXT_REMOVE_CUSTOM "Remove selected item from this folder"
- ID_GAME_AUDIT "Audit the selected item"
- ID_CONTEXT_SELECT_RANDOM "Randomly select a game."
- ID_VIEW_TAB_SCREENSHOT "Select Snapshot tab"
- ID_VIEW_TAB_FLYER "Select Flyer tab"
-END
-
-STRINGTABLE DISCARDABLE
-BEGIN
- ID_VIEW_BYGAME "Sort items by game description"
- ID_VIEW_BYDIRECTORY "Sort items by name"
- ID_VIEW_BYMANUFACTURER "Sort items by manufacturer"
- ID_VIEW_BYYEAR "Sort items by year"
- ID_VIEW_BYTYPE "Sort items by type"
- ID_VIEW_BYTIMESPLAYED "Sort by number of plays"
- ID_VIEW_LINEUPICONS "Arranges icons in a grid"
- ID_UPDATE_GAMELIST "Refresh game list"
- ID_SORT_ASCENDING "Sort column in ascending (A-Z) order"
- ID_SORT_DESCENDING "Sort column in descending (Z-A) order"
-END
-
-STRINGTABLE DISCARDABLE
-BEGIN
- ID_FOLDER_SOURCEPROPERTIES
- "Display properties for all games in this source file"
- ID_FOLDER_VECTORPROPERTIES "Display properties for all vector based games"
- ID_OPTIONS_HISTORY "Set the History file to use"
- ID_OPTIONS_MAMEINFO "Set the Mameinfo file to use"
-END
-
-#endif // English (USA) resources
-/////////////////////////////////////////////////////////////////////////////
-
-
-
-#ifndef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// Generated from the TEXTINCLUDE 3 resource.
-//
-#include "mamevers.rc" // Version block
-
-
-/////////////////////////////////////////////////////////////////////////////
-#endif // not APSTUDIO_INVOKED
-
diff --git a/docs/release/src/osd/winui/mkhelp.cpp b/docs/release/src/osd/winui/mkhelp.cpp
index 4e25a23c185..aad8c31e0ed 100644
--- a/docs/release/src/osd/winui/mkhelp.cpp
+++ b/docs/release/src/osd/winui/mkhelp.cpp
@@ -103,28 +103,30 @@ static void extract_help_ids(const char *buffer, FILE *fp)
const char *ptr = buffer;
char **help_ids = (char **)malloc(500 * sizeof(char *));
int num_help_id = 0;
- int i;
//memset(help_ids, '\0', sizeof(*help_ids));
memset(help_ids, 0, 500);
- while(*ptr) {
- if (strncmp("HIDC_", ptr, 5) == 0) {
+ while(*ptr)
+ {
+ if (strncmp("HIDC_", ptr, 5) == 0)
+ {
char id_name[128];
char *end = id_name;
char *id;
memset(id_name, '\0', sizeof(id_name));
- while (*ptr && *ptr != '\x0d' && *ptr != '\x0a' ) {
+
+ while (*ptr && *ptr != '\x0d' && *ptr != '\x0a' )
*end++ = *ptr++;
- }
+
id = (char *)malloc(strlen(id_name));
memset(id, '\0', strlen(id_name));
memcpy(id, &id_name[1], strlen(&id_name[1]));
help_ids[num_help_id] = id;
num_help_id++;
- } else {
- ptr++;
}
+ else
+ ptr++;
}
/* Sort using Quicksort algorithm: */
@@ -132,21 +134,21 @@ static void extract_help_ids(const char *buffer, FILE *fp)
// Now print them out.
ptr = help_ids[0];
- for (i = 0; i < num_help_id; i++) {
- if (i > 0) {
- if (strcmp(ptr, help_ids[i]) == 0) {
+ for (int i = 0; i < num_help_id; i++)
+ {
+ if (i > 0)
+ if (strcmp(ptr, help_ids[i]) == 0)
continue;
- }
- }
+
fprintf(fp, "\t%-30s,H%s,\n", help_ids[i], help_ids[i]);
ptr = help_ids[i];
}
fprintf(fp, "\t%-30i,%i\n", 0, 0);
// free our allocations.
- for (i = 0; i < num_help_id; i++) {
+ for (int i = 0; i < num_help_id; i++)
free(help_ids[i]);
- }
+
free (help_ids);
}
diff --git a/docs/release/src/osd/winui/mui_audit.cpp b/docs/release/src/osd/winui/mui_audit.cpp
index 8f96340157e..1e767d19be9 100644
--- a/docs/release/src/osd/winui/mui_audit.cpp
+++ b/docs/release/src/osd/winui/mui_audit.cpp
@@ -493,3 +493,4 @@ static const char * StatusString(int iStatus)
return ptr;
}
+
diff --git a/docs/release/src/osd/winui/mui_audit.h b/docs/release/src/osd/winui/mui_audit.h
index 585d657277b..83f038e3375 100644
--- a/docs/release/src/osd/winui/mui_audit.h
+++ b/docs/release/src/osd/winui/mui_audit.h
@@ -1,8 +1,8 @@
// For licensing and usage information, read docs/release/winui_license.txt
//****************************************************************************
-#ifndef MUI_AUDIT_H
-#define MUI_AUDIT_H
+#ifndef WINUI_MUI_AUDIT_H
+#define WINUI_MUI_AUDIT_H
void AuditDialog(HWND hParent, int choice);
@@ -19,3 +19,4 @@ BOOL IsAuditResultYes(int audit_result);
BOOL IsAuditResultNo(int audit_result);
#endif
+
diff --git a/docs/release/src/osd/winui/mui_main.cpp b/docs/release/src/osd/winui/mui_main.cpp
index a03e657770d..e24cef1c803 100644
--- a/docs/release/src/osd/winui/mui_main.cpp
+++ b/docs/release/src/osd/winui/mui_main.cpp
@@ -20,3 +20,4 @@ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLi
{
return MameUIMain(hInstance, lpCmdLine, nCmdShow);
}
+
diff --git a/docs/release/src/osd/winui/mui_opts.cpp b/docs/release/src/osd/winui/mui_opts.cpp
index 3083835e1e3..c545624eccc 100644
--- a/docs/release/src/osd/winui/mui_opts.cpp
+++ b/docs/release/src/osd/winui/mui_opts.cpp
@@ -236,6 +236,16 @@ int GetViewMode(void)
return settings.int_value(MUIOPTION_LIST_MODE);
}
+void SetEnableIndent(bool value)
+{
+ settings.setter(MUIOPTION_VIEW_INDENT, value);
+}
+
+bool GetEnableIndent()
+{
+ return settings.bool_value(MUIOPTION_VIEW_INDENT);
+}
+
void SetGameCheck(BOOL game_check)
{
settings.setter(MUIOPTION_CHECK_GAME, game_check);
diff --git a/docs/release/src/osd/winui/mui_opts.h b/docs/release/src/osd/winui/mui_opts.h
index 4fb53baeaff..7618141a068 100644
--- a/docs/release/src/osd/winui/mui_opts.h
+++ b/docs/release/src/osd/winui/mui_opts.h
@@ -103,6 +103,9 @@ const char * GetImageTabShortName(int tab_index);
void SetViewMode(int val);
int GetViewMode(void);
+void SetEnableIndent(bool value);
+bool GetEnableIndent();
+
void SetGameCheck(BOOL game_check);
BOOL GetGameCheck(void);
diff --git a/docs/release/src/osd/winui/mui_util.h b/docs/release/src/osd/winui/mui_util.h
index 5b2fc25ef15..66fe414c5ab 100644
--- a/docs/release/src/osd/winui/mui_util.h
+++ b/docs/release/src/osd/winui/mui_util.h
@@ -1,8 +1,8 @@
// For licensing and usage information, read docs/release/winui_license.txt
//****************************************************************************
-#ifndef MUI_UTIL_H
-#define MUI_UTIL_H
+#ifndef WINUI_MUI_UTIL_H
+#define WINUI_MUI_UTIL_H
#include "emucore.h"
@@ -66,6 +66,7 @@ HANDLE win_create_file_utf8(const char* filename, DWORD desiredmode, DWORD share
DWORD flagsandattributes, HANDLE templatehandle);
DWORD win_get_current_directory_utf8(DWORD bufferlength, char* buffer);
HANDLE win_find_first_file_utf8(const char* filename, LPWIN32_FIND_DATA findfiledata);
+void ErrorMessageBox(const char *fmt, ...);
// wstring_from_utf8
//============================================================
diff --git a/docs/release/src/osd/winui/newui.h b/docs/release/src/osd/winui/newui.h
index 549947012f2..8134c5ab577 100644
--- a/docs/release/src/osd/winui/newui.h
+++ b/docs/release/src/osd/winui/newui.h
@@ -6,8 +6,8 @@
//
//============================================================
-#ifndef NEWUI_H
-#define NEWUI_H
+#ifndef WINUI_NEWUI_H
+#define WINUI_NEWUI_H
///// INCLUDES /////
@@ -36,3 +36,4 @@ LRESULT CALLBACK winwindow_video_window_proc_ui(HWND wnd, UINT message, WPARAM w
int win_create_menu(running_machine &machine, HMENU *menus);
#endif /* NEWUI_H */
+
diff --git a/docs/release/src/osd/winui/newuires.h b/docs/release/src/osd/winui/newuires.h
index aca0d2baccb..126294eb90c 100644
--- a/docs/release/src/osd/winui/newuires.h
+++ b/docs/release/src/osd/winui/newuires.h
@@ -52,13 +52,3 @@
#define IDI_ICON_SNAP 3206
#define IDR_RUNTIME_MENU 3300
-// Next default values for new objects
-//
-#ifdef APSTUDIO_INVOKED
-#ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NEXT_RESOURCE_VALUE 3144
-#define _APS_NEXT_COMMAND_VALUE 40008
-#define _APS_NEXT_CONTROL_VALUE 3306
-#define _APS_NEXT_SYMED_VALUE 101
-#endif
-#endif
diff --git a/docs/release/src/osd/winui/picker.cpp b/docs/release/src/osd/winui/picker.cpp
index 8ce6c6a7a50..1464f04ba9b 100644
--- a/docs/release/src/osd/winui/picker.cpp
+++ b/docs/release/src/osd/winui/picker.cpp
@@ -3,7 +3,6 @@
//****************************************************************************
// standard windows headers
-#define _WIN32_IE 0x0501
#include <windows.h>
#include <windowsx.h>
#include <commctrl.h>
@@ -184,10 +183,10 @@ static BOOL ListViewContextMenu(HWND hwndPicker, LPARAM lParam)
GetCursorPos(&pt);
// Figure out which header column was clicked, if at all
- int nViewID = Picker_GetViewID(hwndPicker);
+ //int nViewID = Picker_GetViewID(hwndPicker);
int nColumn = -1;
- if ((nViewID == VIEW_REPORT) || (nViewID == VIEW_GROUPED))
+ //if ((nViewID == VIEW_REPORT) || (nViewID == VIEW_GROUPED))
{
HWND hwndHeader = ListView_GetHeader(hwndPicker);
POINT headerPt = pt;
@@ -556,53 +555,6 @@ void Picker_SetViewID(HWND hwndPicker, int nViewID)
if (pPickerInfo->pCallbacks->pfnSetViewMode)
pPickerInfo->pCallbacks->pfnSetViewMode(pPickerInfo->nCurrentViewID);
- // Change the ListView flags in accordance
- LONG_PTR nListViewStyle;
- switch(nViewID)
- {
- case VIEW_LARGE_ICONS:
- nListViewStyle = LVS_ICON;
- break;
- case VIEW_SMALL_ICONS:
- nListViewStyle = LVS_SMALLICON;
- break;
- case VIEW_INLIST:
- nListViewStyle = LVS_LIST;
- break;
- case VIEW_GROUPED:
- case VIEW_REPORT:
- default:
- nListViewStyle = LVS_REPORT;
- break;
- }
-
- DWORD dwStyle = GetWindowLong(hwndPicker, GWL_STYLE);
- if (GetUseXPControl())
- {
- // RS Microsoft must have changed something in the Ownerdraw handling with Version 6 of the Common Controls
- // as on all other OSes it works without this...
- if (nViewID == VIEW_LARGE_ICONS || nViewID == VIEW_SMALL_ICONS)
- {
- // remove Ownerdraw style for Icon views
- dwStyle &= ~LVS_OWNERDRAWFIXED;
- if( nViewID == VIEW_SMALL_ICONS )
- {
- // to properly get them to arrange, otherwise the entries might overlap
- // we have to call SetWindowLong to get it into effect !!
- // It's no use just setting the Style, as it's changed again further down...
- SetWindowLong(hwndPicker, GWL_STYLE, (GetWindowLong(hwndPicker, GWL_STYLE) & ~LVS_TYPEMASK) | LVS_ICON);
- }
- }
- else
- {
- // add again..
- dwStyle |= LVS_OWNERDRAWFIXED;
- }
- }
-
- dwStyle &= ~LVS_TYPEMASK;
- dwStyle |= nListViewStyle;
- SetWindowLong(hwndPicker, GWL_STYLE, dwStyle);
RedrawWindow(hwndPicker, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_FRAME);
}
@@ -713,19 +665,11 @@ static void Picker_ResetHeaderSortIcon(HWND hwndPicker)
if (i != pPickerInfo->pCallbacks->pfnGetSortColumn())
res = Header_SetItem(hwndHeader, Picker_GetViewColumnFromRealColumn(hwndPicker, i), &hdi);
- if (GetUseXPControl())
{
// use built in sort arrows
hdi.mask = HDI_FORMAT;
hdi.fmt = HDF_STRING | (pPickerInfo->pCallbacks->pfnGetSortReverse() ? HDF_SORTDOWN : HDF_SORTUP);
}
- else
- {
- // put our arrow icon next to the text
- hdi.mask = HDI_FORMAT | HDI_IMAGE;
- hdi.fmt = HDF_STRING | HDF_IMAGE | HDF_BITMAP_ON_RIGHT;
- hdi.iImage = pPickerInfo->pCallbacks->pfnGetSortReverse() ? 1 : 0;
- }
int nViewColumn = Picker_GetViewColumnFromRealColumn(hwndPicker, pPickerInfo->pCallbacks->pfnGetSortColumn());
res = Header_SetItem(hwndHeader, nViewColumn, &hdi);
@@ -773,7 +717,7 @@ static int CALLBACK Picker_CompareProc(LPARAM index1, LPARAM index2, LPARAM nPar
TCHAR szBuffer1[256], szBuffer2[256];
const TCHAR *s1, *s2;
- if (pcpp->nViewMode == VIEW_GROUPED)
+ if (GetEnableIndent())
{
// do our fancy compare, with clones grouped under parents
// first thing we need to do is identify both item's parents
@@ -1216,7 +1160,7 @@ void Picker_HandleDrawItem(HWND hWnd, LPDRAWITEMSTRUCT lpDrawItemStruct)
nParent = pPickerInfo->pCallbacks->pfnFindItemParent(hWnd, lvi.lParam);
else
nParent = -1;
- bDrawAsChild = (pPickerInfo->pCallbacks->pfnGetViewMode() == VIEW_GROUPED && (nParent >= 0));
+ //bDrawAsChild = (pPickerInfo->pCallbacks->pfnGetViewMode() == VIEW_GROUPED && (nParent >= 0));
/* only indent if parent is also in this view */
#if 1 // minimal listview flickering.
@@ -1580,3 +1524,4 @@ done:
res++;
return bSuccess;
}
+
diff --git a/docs/release/src/osd/winui/picker.h b/docs/release/src/osd/winui/picker.h
index 001804ee320..e62688187a0 100644
--- a/docs/release/src/osd/winui/picker.h
+++ b/docs/release/src/osd/winui/picker.h
@@ -1,8 +1,8 @@
// For licensing and usage information, read docs/release/winui_license.txt
//****************************************************************************
-#ifndef PICKER_H
-#define PICKER_H
+#ifndef WINUI_PICKER_H
+#define WINUI_PICKER_H
#include <stdint.h>
@@ -49,9 +49,6 @@ enum
{
VIEW_LARGE_ICONS = 0,
VIEW_SMALL_ICONS,
- VIEW_INLIST,
- VIEW_REPORT,
- VIEW_GROUPED,
VIEW_MAX
};
@@ -87,3 +84,4 @@ int Picker_GetColumnCount(HWND hwndPicker);
const LPCTSTR *Picker_GetColumnNames(HWND hwndPicker);
#endif // PICKER_H
+
diff --git a/docs/release/src/osd/winui/properties.cpp b/docs/release/src/osd/winui/properties.cpp
index e2725687526..bae40e5f37f 100644
--- a/docs/release/src/osd/winui/properties.cpp
+++ b/docs/release/src/osd/winui/properties.cpp
@@ -599,11 +599,8 @@ void InitPropertyPageToPage(HINSTANCE hInst, HWND hWnd, HICON hIcon, OPTIONS_TYP
case OPTIONS_GLOBAL:
t_description = ui_wstring_from_utf8("Default Settings");
break;
- case OPTIONS_COMPUTER:
- t_description = ui_wstring_from_utf8("Default properties for computers");
- break;
- case OPTIONS_CONSOLE:
- t_description = ui_wstring_from_utf8("Default properties for consoles");
+ case OPTIONS_ARCADE:
+ t_description = ui_wstring_from_utf8("Default properties for games");
break;
case OPTIONS_HORIZONTAL:
t_description = ui_wstring_from_utf8("Default properties for horizontal screens");
@@ -1001,11 +998,8 @@ char *GameInfoTitle(OPTIONS_TYPE opt_type, UINT nIndex)
case OPTIONS_SOURCE:
sprintf(buf, "Properties for machines in %s", GetDriverFilename(nIndex));
break;
- case OPTIONS_COMPUTER:
- sprintf(buf, "Default properties for computers");
- break;
- case OPTIONS_CONSOLE:
- sprintf(buf, "Default properties for consoles");
+ case OPTIONS_ARCADE:
+ sprintf(buf, "Default properties for games");
break;
case OPTIONS_HORIZONTAL:
sprintf(buf, "Default properties for horizontal screens");
diff --git a/docs/release/src/osd/winui/res/mameui.manifest b/docs/release/src/osd/winui/res/mameui.manifest
index 824b9841bef..f8a43351bc9 100644
--- a/docs/release/src/osd/winui/res/mameui.manifest
+++ b/docs/release/src/osd/winui/res/mameui.manifest
@@ -10,6 +10,7 @@
<asmv3:application>
<asmv3:windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
+ <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">true</dpiAwareness>
<longPathAware xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">true</longPathAware>
</asmv3:windowsSettings>
</asmv3:application>
diff --git a/docs/release/src/osd/winui/resource.h b/docs/release/src/osd/winui/resource.h
index 51cbb976819..faaa2fdb8e8 100644
--- a/docs/release/src/osd/winui/resource.h
+++ b/docs/release/src/osd/winui/resource.h
@@ -19,12 +19,9 @@
#define IDS_VIEW_SPACER3 79
#define IDS_VIEW_LARGEICONS 80
#define IDS_VIEW_SMALLICONS 81
-#define IDS_VIEW_LIST 82
-#define IDS_VIEW_DETAILS 83
-#define IDS_VIEW_GROUPED 84
+#define IDS_VIEW_INDENT 84
#define IDS_VIEW_SPACER4 85
#define IDS_VIEW_ARRANGE 86
-#define IDS_VIEW_LINEUPICONS 87
#define IDS_VIEW_SPACER5 88
#define IDS_VIEW_REFRESH 89
#define IDS_VIEW_CONTEXTFILTERS 90
@@ -88,6 +85,7 @@
#define IDI_CHECKMARK 155
#define IDI_HEADER_UP 156
#define IDI_HEADER_DOWN 157
+#define IDI_FOLDER_ARCADE 158
//#define IDI_AUDIT_PASS 160
//#define IDI_AUDIT_FAIL 161
//#define IDI_SYSTRAY 162
@@ -114,7 +112,11 @@
#define IDI_WIN_CYLN 188
#define IDI_WIN_PTAP 189
#define IDI_WIN_PCRD 190
-#define IDI_WIN_MIDI 191
+#define IDI_WIN_MEMC 191
+#define IDI_WIN_MIDI 192
+#define IDI_WIN_CDRM 193
+#define IDI_WIN_MTAP 194
+#define IDI_WIN_CART 195
#define IDB_ABOUT 200
#define IDB_TOOLBAR 201
#define IDB_SPLASH 202
@@ -524,8 +526,6 @@
#define IDC_SWTAB 2001
#define IDC_SWLIST 2002
#define IDC_SWDEVVIEW 2003
-#define IDC_FILTER_COMPUTER 2004
-#define IDC_FILTER_CONSOLE 2005
#define IDC_FILTER_MODIFIED 2006
#define IDC_RAM_COMBOBOX 2008
#define IDC_RAM_CAPTION 2009
@@ -540,9 +540,7 @@
#define ID_HELP_ABOUT 40006
#define ID_VIEW_LARGE_ICON 40007
#define ID_VIEW_SMALL_ICON 40008
-#define ID_VIEW_LIST_MENU 40009
-#define ID_VIEW_DETAIL 40010
-#define ID_VIEW_GROUPED 40011
+#define ID_VIEW_INDENT 40011
#define ID_OPTIONS_FONT 40012
#define ID_OPTIONS_CLONE_COLOR 40013
#define ID_OPTIONS_DIR 40014
@@ -608,6 +606,7 @@
#define ID_OPTIONS_MAMEINFO 40100
#define ID_OPTIONS_HISTORY 40101
#define ID_VIEW_SOFTWARE_AREA 40102
+#define ID_FILE_FILTER 40104
#define ID_MANUAL 40108
#define ID_VIDEO_SNAP 40109
#define ID_PLAY_VIDEO 40110
diff --git a/docs/release/src/osd/winui/resource.hm b/docs/release/src/osd/winui/resource.hm
index 0934c33b73d..a9199be1c89 100644
--- a/docs/release/src/osd/winui/resource.hm
+++ b/docs/release/src/osd/winui/resource.hm
@@ -48,6 +48,7 @@
#define HIDC_HIDE_MOUSE 0x80ad04a1 // IDD_INTERFACE_OPTIONS [English (U.S.)]
#define HIDC_HIGH_PRIORITY 0x809e049f // IDD_PROP_MISC [English (U.S.)]
#define HIDC_HISTORY 0x806504cb // IDD_MAIN [English (U.S.)]
+#define HIDC_HLSL_ON 0x806504cc // IDD_PROP_ADVANCED [English (U.S.)]
#define HIDC_HWSTRETCH 0x809a046c // IDD_PROP_DISPLAY [English (U.S.)]
#define HIDC_JDZ 0x809d0487 // IDD_PROP_INPUT [English (U.S.)]
#define HIDC_JOYSTICK 0x809d03eb // IDD_PROP_INPUT [English (U.S.)]
diff --git a/docs/release/src/osd/winui/screenshot.h b/docs/release/src/osd/winui/screenshot.h
index 5d305c56bbf..ca4cb2c5506 100644
--- a/docs/release/src/osd/winui/screenshot.h
+++ b/docs/release/src/osd/winui/screenshot.h
@@ -58,3 +58,4 @@ const SSINFO m_ssInfo[] =
#endif
#endif
+
diff --git a/docs/release/src/osd/winui/splitters.cpp b/docs/release/src/osd/winui/splitters.cpp
index 00aa01d750d..5ae1ffb24ac 100644
--- a/docs/release/src/osd/winui/splitters.cpp
+++ b/docs/release/src/osd/winui/splitters.cpp
@@ -368,4 +368,3 @@ int GetSplitterCount(void)
return nSplitterCount;
}
-/* End of file */
diff --git a/docs/release/src/osd/winui/splitters.h b/docs/release/src/osd/winui/splitters.h
index 8a578f37983..37d271061f3 100644
--- a/docs/release/src/osd/winui/splitters.h
+++ b/docs/release/src/osd/winui/splitters.h
@@ -4,8 +4,8 @@
/* Written by Mike Haaland <mhaaland@hypertech.com> */
-#ifndef SPLITTER_H
-#define SPLITTER_H
+#ifndef WINUI_SPLITTER_H
+#define WINUI_SPLITTER_H
#if !defined(MAX)
#define MIN(a, b) ((a) < (b) ? (a) : (b))
@@ -61,7 +61,7 @@ typedef struct
const SPLITTERINFO g_splitterInfo[] =
{
{ 0.15, IDC_SPLITTER, IDC_TREE, IDC_LIST, AdjustSplitter1Rect },
- { 0.8, IDC_SPLITTER2, IDC_LIST, IDC_SWTAB, AdjustSplitter1Rect },
+ { 0.5, IDC_SPLITTER2, IDC_LIST, IDC_SWTAB, AdjustSplitter1Rect },
{ 0.9, IDC_SPLITTER3, IDC_SWTAB, IDC_SSFRAME, AdjustSplitter2Rect },
{ -1 }
};
@@ -78,3 +78,4 @@ const SPLITTERINFO g_splitterInfo[] =
#endif /* SPLITTER_H */
+
diff --git a/docs/release/src/osd/winui/tabview.cpp b/docs/release/src/osd/winui/tabview.cpp
index ce0a2f8180c..41dd9be5c21 100644
--- a/docs/release/src/osd/winui/tabview.cpp
+++ b/docs/release/src/osd/winui/tabview.cpp
@@ -267,4 +267,3 @@ BOOL SetupTabView(HWND hwndTabView, const struct TabViewOptions *pOptions)
return true;
}
-
diff --git a/docs/release/src/osd/winui/tabview.h b/docs/release/src/osd/winui/tabview.h
index 9e08ad366c0..5ec10fb6f6b 100644
--- a/docs/release/src/osd/winui/tabview.h
+++ b/docs/release/src/osd/winui/tabview.h
@@ -1,8 +1,8 @@
// For licensing and usage information, read docs/release/winui_license.txt
//****************************************************************************
-#ifndef TABVIEW_H
-#define TABVIEW_H
+#ifndef WINUI_TABVIEW_H
+#define WINUI_TABVIEW_H
struct TabViewCallbacks
{
@@ -42,3 +42,4 @@ void TabView_UpdateSelection(HWND hwndTabView);
BOOL TabView_HandleNotify(LPNMHDR lpNmHdr);
#endif // TABVIEW_H
+
diff --git a/docs/release/src/osd/winui/treeview.cpp b/docs/release/src/osd/winui/treeview.cpp
index cd132629536..eb8b560fc72 100644
--- a/docs/release/src/osd/winui/treeview.cpp
+++ b/docs/release/src/osd/winui/treeview.cpp
@@ -1,13 +1,5 @@
+// license:BSD-3-Clause
// For licensing and usage information, read docs/release/winui_license.txt
-//****************************************************************************
-
-/***************************************************************************
-
- treeview.c
-
- TreeView support routines - MSH 11/19/1998
-
-***************************************************************************/
// standard windows headers
#include <windows.h>
@@ -28,6 +20,7 @@
#include "treeview.h"
#include "resource.h"
#include "mui_opts.h"
+#include "mui_util.h"
#include "emu_opts.h"
#include "dialogs.h"
#include "winutf8.h"
@@ -35,47 +28,47 @@
#include "drivenum.h"
#include "corestr.h"
-#ifdef _MSC_VER
-#define snprintf _snprintf
-#endif
+HANDLE winui2_find_first_file_utf8(const char* filename, WIN32_FIND_DATA *findfiledata)
+{
+ wchar_t *t_filename = ui_wstring_from_utf8(filename);
-#define MAX_EXTRA_FOLDERS 256
+ if (!t_filename)
+ return NULL;
-/***************************************************************************
- public structures
- ***************************************************************************/
+ HANDLE result = FindFirstFile(t_filename, findfiledata);
+ free(t_filename);
+ return result;
+}
+
+bool winui_move_file_utf8(const char* existingfilename, const char* newfilename)
+{
+ bool result = false;
+
+ wchar_t *t_existingfilename = ui_wstring_from_utf8(existingfilename);
-#define ICON_MAX (sizeof(treeIconNames) / sizeof(treeIconNames[0]))
+ if (!t_existingfilename)
+ return result;
-/* Name used for user-defined custom icons */
-/* external *.ico file to look for. */
+ wchar_t *t_newfilename = ui_wstring_from_utf8(newfilename);
-typedef struct
-{
- int nResourceID;
- LPCSTR lpName;
-} TREEICON;
+ if (!t_newfilename)
+ {
+ free(t_existingfilename);
+ return result;
+ }
-static TREEICON treeIconNames[] =
+ result = MoveFile(t_existingfilename, t_newfilename);
+ free(t_newfilename);
+ free(t_existingfilename);
+ return result;
+}
+
+const char* GetFolderDir()
{
- { IDI_FOLDER_OPEN, "foldopen" },
- { IDI_FOLDER, "folder" },
- { IDI_FOLDER_AVAILABLE, "foldavail" },
- { IDI_FOLDER_MANUFACTURER, "foldmanu" },
- { IDI_FOLDER_UNAVAILABLE, "foldunav" },
- { IDI_FOLDER_YEAR, "foldyear" },
- { IDI_FOLDER_SOURCE, "foldsrc" },
- { IDI_FOLDER_HORIZONTAL, "horz" },
- { IDI_FOLDER_VERTICAL, "vert" },
- { IDI_MANUFACTURER, "manufact" },
- { IDI_FOLDER_WORKING, "working" },
- { IDI_FOLDER_NONWORKING, "nonwork" },
- { IDI_YEAR, "year" },
- { IDI_SOUND, "sound" },
- { IDI_CPU, "cpu" },
- { IDI_FOLDER_HARDDISK, "harddisk" },
- { IDI_SOURCE, "source" }
-};
+ string a = dir_get_value(24);
+ return a.c_str();
+}
+
/***************************************************************************
private variables
@@ -83,20 +76,18 @@ static TREEICON treeIconNames[] =
/* this has an entry for every folder eventually in the UI, including subfolders */
static TREEFOLDER **treeFolders = 0;
-static UINT numFolders = 0; /* Number of folder in the folder array */
-static UINT next_folder_id = MAX_FOLDERS;
-static UINT folderArrayLength = 0; /* Size of the folder array */
+static UINT numFolders = 0; /* Number of folder in the folder array */
+static UINT next_folder_id = MAX_FOLDERS;
+static UINT folderArrayLength = 0; /* Size of the folder array */
static LPTREEFOLDER lpCurrentFolder = 0; /* Currently selected folder */
-static UINT nCurrentFolder = 0; /* Current folder ID */
-static WNDPROC g_lpTreeWndProc = 0; /* for subclassing the TreeView */
-static HIMAGELIST hTreeSmall = 0; /* TreeView Image list of icons */
-
+static UINT nCurrentFolder = 0; /* Current folder ID */
+static WNDPROC g_lpTreeWndProc = 0; /* for subclassing the TreeView */
+static HIMAGELIST hTreeSmall = 0; /* TreeView Image list of icons */
/* this only has an entry for each TOP LEVEL extra folder + SubFolders*/
LPEXFOLDERDATA ExtraFolderData[MAX_EXTRA_FOLDERS * MAX_EXTRA_SUBFOLDERS];
static int numExtraFolders = 0;
static int numExtraIcons = 0;
static char *ExtraFolderIcons[MAX_EXTRA_FOLDERS];
-
// built in folders and filters
static LPCFOLDERDATA g_lpFolderData;
static LPCFILTER_ITEM g_lpFilterList;
@@ -105,73 +96,86 @@ static LPCFILTER_ITEM g_lpFilterList;
private function prototypes
***************************************************************************/
-extern BOOL InitFolders(void);
-static BOOL CreateTreeIcons(void);
-static void TreeCtrlOnPaint(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
-static const char *ParseManufacturer(const char *s, int *pParsedChars );
-static const char *TrimManufacturer(const char *s);
-static BOOL AddFolder(LPTREEFOLDER lpFolder);
+static bool InitFolders(void);
+static bool CreateTreeIcons(void);
+static void CreateAllChildFolders(void);
+static bool AddFolder(LPTREEFOLDER lpFolder);
static LPTREEFOLDER NewFolder(const char *lpTitle, UINT nFolderId, int nParent, UINT nIconId, DWORD dwFlags);
static void DeleteFolder(LPTREEFOLDER lpFolder);
static LRESULT CALLBACK TreeWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
static int InitExtraFolders(void);
static void FreeExtraFolders(void);
static void SetExtraIcons(char *name, int *id);
-static BOOL TryAddExtraFolderAndChildren(int parent_index);
-static BOOL TrySaveExtraFolder(LPTREEFOLDER lpFolder);
-static void SaveExternalFolders(int parent_index, const char *fname);
+static bool TryAddExtraFolderAndChildren(int parent_index);
+static bool TrySaveExtraFolder(LPTREEFOLDER lpFolder);
+static void LoadExternalFolders(int parent_index, int id);
+static void SaveExternalFolders(int parent_index);
+//static bool FilterAvailable(int driver_index);
/***************************************************************************
- public functions
+ Functions to build builtin folder lists
+ ***************************************************************************/
+#if 0
+static void CreateManufacturerFolders(int parent_index);
+static void CreateYearFolders(int parent_index);
+static void CreateSourceFolders(int parent_index);
+static void CreateDeficiencyFolders(int parent_index);
+static void CreateBIOSFolders(int parent_index);
+static void CreateCPUFolders(int parent_index);
+static void CreateSoundFolders(int parent_index);
+static void CreateScreenFolders(int parent_index);
+static void CreateFPSFolders(int parent_index);
+static void CreateResolutionFolders(int parent_index);
+static void CreateSaveStateFolders(int parent_index);
+static void CreateDumpingFolders(int parent_index);
+#endif
+/***************************************************************************
+ public structures
***************************************************************************/
-BOOL win_move_file_utf8(const char *existingfilename, const char *newfilename)
-{
- BOOL result = false;
-
- TCHAR *t_existingfilename = ui_wstring_from_utf8(existingfilename);
- if( !t_existingfilename )
- return result;
-
- TCHAR *t_newfilename = ui_wstring_from_utf8(newfilename);
- if( !t_newfilename ) {
- free(t_existingfilename);
- return result;
- }
-
- result = MoveFile(t_existingfilename, t_newfilename);
-
- free(t_newfilename);
- free(t_existingfilename);
-
- return result;
-}
-
-/**************************************************************************
- * ci_strncmp - case insensitive character array compare
- *
- * Returns zero if the first n characters of s1 and s2 are equal,
- * ignoring case.
- * stolen from datafile.c
- **************************************************************************/
-static int ci_strncmp (const char *s1, const char *s2, int n)
+static const TREEICON treeIconNames[] =
{
- int c1 = 0, c2 = 0;
- while (n)
- {
- if ((c1 = tolower (*s1)) != (c2 = tolower (*s2)))
- return (c1 - c2);
- else
- if (!c1)
- break;
- --n;
- s1++;
- s2++;
- }
- return 0;
-}
-
+// { IDI_FOLDER_OPEN, "foldopen" },
+ { IDI_FOLDER, "folder" },
+ { IDI_FOLDER_ALLGAMES, "allgames" },
+ { IDI_FOLDER_AVAILABLE, "foldavail" },
+ { IDI_FOLDER_BIOS, "foldcsb" },
+ { IDI_FOLDER_CLONES, "foldclone" },
+ { IDI_FOLDER_CPU, "foldcsb" },
+ { IDI_FOLDER_DUMP, "foldcsb" },
+ { IDI_FOLDER_FPS, "foldfps" },
+ { IDI_FOLDER_HARDDISK, "harddisk" },
+ { IDI_FOLDER_HORIZONTAL, "horz" },
+ { IDI_FOLDER_IMPERFECT, "foldimp" },
+ { IDI_FOLDER_LIGHTGUN, "foldgun" },
+ { IDI_FOLDER_MANUFACTURER, "foldmanu" },
+ { IDI_FOLDER_MECHANICAL, "mechanical" },
+ { IDI_FOLDER_MONITOR, "multimon" },
+ { IDI_FOLDER_NONWORKING, "nonwork" },
+ { IDI_FOLDER_ORIGINALS, "foldorig" },
+ { IDI_FOLDER_RASTER, "foldrast" },
+ { IDI_FOLDER_RESOL, "foldres" },
+ { IDI_FOLDER_SAMPLES, "foldsamp" },
+ { IDI_FOLDER_SAVESTATE, "savestate" },
+ { IDI_FOLDER_SOUND, "foldsamp" },
+ { IDI_FOLDER_SOURCE, "foldsrc" },
+ { IDI_SOURCE, "source" },
+ { IDI_FOLDER_TRACKBALL, "foldball" },
+ { IDI_FOLDER_UNAVAILABLE, "foldunav" },
+ { IDI_FOLDER_VECTOR, "foldvect" },
+ { IDI_FOLDER_VERTICAL, "vert" },
+ { IDI_FOLDER_WORKING, "working" },
+ { IDI_FOLDER_YEAR, "foldyear" },
+ { IDI_BIOS, "bios" },
+ { IDI_CHIP, "chip" },
+ { IDI_MANUFACTURER, "manufact" },
+ { IDI_MONITOR, "monitor" },
+ { IDI_YEAR, "year" },
+};
+/***************************************************************************
+ public functions
+ ***************************************************************************/
/* De-allocate all folder memory */
void FreeFolders(void)
@@ -190,9 +194,11 @@ void FreeFolders(void)
treeFolders[i] = NULL;
numFolders--;
}
+
free(treeFolders);
treeFolders = NULL;
}
+
numFolders = 0;
}
@@ -210,7 +216,6 @@ void InitTree(LPCFOLDERDATA lpFolderData, LPCFILTER_ITEM lpFilterList)
g_lpFilterList = lpFilterList;
InitFolders();
-
/* this will subclass the treeview (where WM_DRAWITEM gets sent for the header control) */
LONG_PTR l = GetWindowLongPtr(GetTreeView(), GWLP_WNDPROC);
g_lpTreeWndProc = (WNDPROC)l;
@@ -245,9 +250,11 @@ LPTREEFOLDER GetFolder(UINT nFolder)
LPTREEFOLDER GetFolderByID(UINT nID)
{
- for (UINT i = 0; i < numFolders; i++)
+ for (int i = 0; i < numFolders; i++)
+ {
if (treeFolders[i]->m_nFolderId == nID)
return treeFolders[i];
+ }
return (LPTREEFOLDER)0;
}
@@ -271,23 +278,22 @@ int FindGame(LPTREEFOLDER lpFolder, int nGame)
// Called to re-associate games with folders
void ResetWhichGamesInFolders(void)
{
- int nGames = driver_list::total();
-
- for (UINT i = 0; i < numFolders; i++)
+ for (int i = 0; i < numFolders; i++)
{
LPTREEFOLDER lpFolder = treeFolders[i];
// setup the games in our built-in folders
- for (UINT k = 0; g_lpFolderData[k].m_lpTitle; k++)
+ for (int k = 0; g_lpFolderData[k].m_lpTitle; k++)
{
if (lpFolder->m_nFolderId == g_lpFolderData[k].m_nFolderId)
{
if (g_lpFolderData[k].m_pfnQuery || g_lpFolderData[k].m_bExpectedResult)
{
SetAllBits(lpFolder->m_lpGameBits, false);
- for (UINT jj = 0; jj < nGames; jj++)
+
+ for (int jj = 0; jj < driver_list::total(); jj++)
{
// invoke the query function
- BOOL b = g_lpFolderData[k].m_pfnQuery ? g_lpFolderData[k].m_pfnQuery(jj) : true;
+ bool b = g_lpFolderData[k].m_pfnQuery ? g_lpFolderData[k].m_pfnQuery(jj) : true;
// if we expect false, flip the result
if (!g_lpFolderData[k].m_bExpectedResult)
@@ -304,32 +310,33 @@ void ResetWhichGamesInFolders(void)
}
}
-
/* Used to build the GameList */
-BOOL GameFiltered(int nGame, DWORD dwMask)
+bool GameFiltered(int nGame, DWORD dwMask)
{
LPTREEFOLDER lpFolder = GetCurrentFolder();
- LPTREEFOLDER lpParent = NULL;
//Filter out the Bioses on all Folders, except for the Bios Folder
- if( lpFolder->m_nFolderId != FOLDER_BIOS )
+ if(lpFolder && lpFolder->m_nFolderId != FOLDER_BIOS)
{
-// if( !( (driver_list::driver(nGame).flags & MACHINE_IS_BIOS_ROOT ) == 0) )
-// return true;
- if( driver_list::driver(nGame).name[0] == '_' )
+ if(DriverIsBios(nGame))
return true;
}
+
+ if(driver_list::driver(nGame).name[0] == '_')
+ return true;
+
// Filter games--return true if the game should be HIDDEN in this view
- if( GetFilterInherit() )
+ if(GetFilterInherit())
{
- if( lpFolder )
+ if(lpFolder)
{
- lpParent = GetFolder( lpFolder->m_nParent );
- if( lpParent )
+ LPTREEFOLDER lpParent = GetFolder(lpFolder->m_nParent);
+
+ if(lpParent)
{
- /* Check the Parent Filters and inherit them on child,
- * The inherited filters don't display on the custom Filter Dialog for the Child folder
- * No need to promote all games to parent folder, works as is */
+ /* Check the Parent Filters and inherit them on child,
+ * The inherited filters don't display on the custom Filter Dialog for the Child folder
+ * No need to promote all games to parent folder, works as is */
dwMask |= lpParent->m_dwFlags;
}
}
@@ -345,9 +352,8 @@ BOOL GameFiltered(int nGame, DWORD dwMask)
MyStrStrI(driver_list::driver(nGame).name,GetFilterText()) == NULL &&
MyStrStrI(driver_list::driver(nGame).type.source(),GetFilterText()) == NULL &&
MyStrStrI(driver_list::driver(nGame).manufacturer,GetFilterText()) == NULL)
- {
return true;
- }
+
// Are there filters set on this folder?
if ((dwMask & F_MASK) == 0)
return false;
@@ -365,11 +371,11 @@ BOOL GameFiltered(int nGame, DWORD dwMask)
}
/* Get the parent of game in this view */
-BOOL GetParentFound(int nGame) // not used
+bool GetParentFound(int nGame)
{
LPTREEFOLDER lpFolder = GetCurrentFolder();
- if( lpFolder )
+ if(lpFolder)
{
int nParentIndex = GetParentIndex(&driver_list::driver(nGame));
@@ -399,513 +405,224 @@ LPCFILTER_ITEM GetFilterList(void)
/***************************************************************************
private functions
***************************************************************************/
-
+//#if 0
void CreateSourceFolders(int parent_index)
{
- int i, k=0;
- int nGames = driver_list::total();
+ int i = 0;
int start_folder = numFolders;
LPTREEFOLDER lpFolder = treeFolders[parent_index];
+ LPTREEFOLDER lpTemp;
// no games in top level folder
- SetAllBits(lpFolder->m_lpGameBits,false);
- for (int jj = 0; jj < nGames; jj++)
+ SetAllBits(lpFolder->m_lpGameBits, false);
+
+ for (int jj = 0; jj < driver_list::total(); jj++)
{
- const char *s = GetDriverFilename(jj);
-
- if (s == NULL || s[0] == '\0')
- continue;
+ const char *source = GetDriverFilename(jj);
// look for an existant source treefolder for this game
// (likely to be the previous one, so start at the end)
- for (i=numFolders-1;i>=start_folder;i--)
+ for (i = numFolders - 1; i >= start_folder; i--)
{
- if (strcmp(treeFolders[i]->m_lpTitle,s) == 0)
+ if (strcmp(treeFolders[i]->m_lpTitle, source) == 0)
{
AddGame(treeFolders[i], jj);
break;
}
}
- if (i == start_folder-1)
+ if (i == start_folder - 1)
{
// nope, it's a source file we haven't seen before, make it.
- LPTREEFOLDER lpTemp = NewFolder(s, next_folder_id, parent_index, IDI_SOURCE, GetFolderFlags(numFolders));
- ExtraFolderData[next_folder_id] = (EXFOLDERDATA*)malloc(sizeof(EXFOLDERDATA));
- memset(ExtraFolderData[next_folder_id], 0, sizeof(EXFOLDERDATA));
-
- ExtraFolderData[next_folder_id]->m_nFolderId = next_folder_id;
- ExtraFolderData[next_folder_id]->m_nIconId = IDI_SOURCE;
- ExtraFolderData[next_folder_id]->m_nParent = lpFolder->m_nFolderId;
- ExtraFolderData[next_folder_id]->m_nSubIconId = -1;
- strcpy( ExtraFolderData[next_folder_id]->m_szTitle, s );
- ExtraFolderData[next_folder_id]->m_dwFlags = 0;
-
- // Increment next_folder_id here in case code is added above
- next_folder_id++;
-
+ lpTemp = NewFolder(source, next_folder_id++, parent_index, IDI_SOURCE, GetFolderFlags(numFolders));
AddFolder(lpTemp);
AddGame(lpTemp, jj);
}
}
- SetNumOptionFolders(k-1);
- const char *fname = "Source";
- SaveExternalFolders(parent_index, fname);
+
+ SetNumOptionFolders(-1);
}
-void CreateScreenFolders(int parent_index)
+void CreateManufacturerFolders(int parent_index)
{
- int i, k=0;
- int nGames = driver_list::total();
+ int i = 0;
int start_folder = numFolders;
LPTREEFOLDER lpFolder = treeFolders[parent_index];
+ LPTREEFOLDER lpTemp;
// no games in top level folder
- SetAllBits(lpFolder->m_lpGameBits,false);
- for (int jj = 0; jj < nGames; jj++)
+ SetAllBits(lpFolder->m_lpGameBits, false);
+
+ for (int jj = 0; jj < driver_list::total(); jj++)
{
- int screens = DriverNumScreens(jj);
- char s[2];
- itoa(screens, s, 10);
+ const char *made = driver_list::driver(jj).manufacturer;
- // look for an existant screens treefolder for this game
+ // look for an existant manufacturer treefolder for this game
// (likely to be the previous one, so start at the end)
- for (i=numFolders-1;i>=start_folder;i--)
+ for (i = numFolders - 1; i >= start_folder; i--)
{
- if (strcmp(treeFolders[i]->m_lpTitle,s) == 0)
+ if (strcmp(treeFolders[i]->m_lpTitle, made) == 0)
{
AddGame(treeFolders[i], jj);
break;
}
}
- if (i == start_folder-1)
+ if (i == start_folder - 1)
{
- // nope, it's a screen file we haven't seen before, make it.
- LPTREEFOLDER lpTemp = NewFolder(s, next_folder_id, parent_index, IDI_SCREEN, GetFolderFlags(numFolders));
- ExtraFolderData[next_folder_id] = (EXFOLDERDATA*)malloc(sizeof(EXFOLDERDATA));
- memset(ExtraFolderData[next_folder_id], 0, sizeof(EXFOLDERDATA));
-
- ExtraFolderData[next_folder_id]->m_nFolderId = next_folder_id;
- ExtraFolderData[next_folder_id]->m_nIconId = IDI_SCREEN;
- ExtraFolderData[next_folder_id]->m_nParent = lpFolder->m_nFolderId;
- ExtraFolderData[next_folder_id]->m_nSubIconId = -1;
- strcpy( ExtraFolderData[next_folder_id]->m_szTitle, s );
- ExtraFolderData[next_folder_id]->m_dwFlags = 0;
-
- // Increment next_folder_id here in case code is added above
- next_folder_id++;
-
+ // nope, it's a manufacturer we haven't seen before, make it.
+ lpTemp = NewFolder(made, next_folder_id++, parent_index, IDI_MANUFACTURER, GetFolderFlags(numFolders));
AddFolder(lpTemp);
AddGame(lpTemp, jj);
}
}
- SetNumOptionFolders(k-1);
- const char *fname = "Screen";
- SaveExternalFolders(parent_index, fname);
}
-
-void CreateManufacturerFolders(int parent_index)
+void CreateDeficiencyFolders(int parent_index)
{
- int i;
- int nGames = driver_list::total();
- int start_folder = numFolders;
LPTREEFOLDER lpFolder = treeFolders[parent_index];
+ LPTREEFOLDER lpWrongCol, lpImpCol, lpImpGraph, lpMissSnd, lpImpSnd, lpIncomplete, lpNoSndHw;
// no games in top level folder
- SetAllBits(lpFolder->m_lpGameBits,false);
+ SetAllBits(lpFolder->m_lpGameBits, false);
+ // create our subfolders
+ lpWrongCol = NewFolder("Wrong Colors", next_folder_id++, parent_index, IDI_FOLDER, GetFolderFlags(numFolders));
+ lpImpCol = NewFolder("Imperfect Colors", next_folder_id++, parent_index, IDI_FOLDER, GetFolderFlags(numFolders));
+ lpImpGraph = NewFolder("Imperfect Graphics", next_folder_id++, parent_index, IDI_FOLDER, GetFolderFlags(numFolders));
+ lpMissSnd = NewFolder("Missing Sound", next_folder_id++, parent_index, IDI_FOLDER, GetFolderFlags(numFolders));
+ lpImpSnd = NewFolder("Imperfect Sound", next_folder_id++, parent_index, IDI_FOLDER, GetFolderFlags(numFolders));
+ lpIncomplete = NewFolder("Incomplete Prototype", next_folder_id++, parent_index, IDI_FOLDER, GetFolderFlags(numFolders));
+ lpNoSndHw = NewFolder("No Sound Hardware", next_folder_id++, parent_index, IDI_FOLDER, GetFolderFlags(numFolders));
+ AddFolder(lpWrongCol);
+ AddFolder(lpImpCol);
+ AddFolder(lpImpGraph);
+ AddFolder(lpMissSnd);
+ AddFolder(lpImpSnd);
+ AddFolder(lpIncomplete);
+ AddFolder(lpNoSndHw);
- for (int jj = 0; jj < nGames; jj++)
+ for (int jj = 0; jj < driver_list::total(); jj++)
{
- const char *manufacturer = driver_list::driver(jj).manufacturer;
- int iChars = 0;
- while( manufacturer != NULL && manufacturer[0] != '\0' )
- {
- const char *s = ParseManufacturer(manufacturer, &iChars);
- manufacturer += iChars;
- //shift to next start char
- if( s != NULL && *s != 0 )
- {
- const char *t = TrimManufacturer(s);
- for (i=numFolders-1;i>=start_folder;i--)
- {
- //RS Made it case insensitive
- if (ci_strncmp(treeFolders[i]->m_lpTitle,t,20) == 0 )
- {
- AddGame(treeFolders[i],jj);
- break;
- }
- }
+ uint32_t cache = GetDriverCacheLower(jj);
+ if (BIT(cache, 21))
+ AddGame(lpWrongCol, jj);
- if (i == start_folder-1)
- {
- // nope, it's a manufacturer we haven't seen before, make it.
- LPTREEFOLDER lpTemp = NewFolder(t, next_folder_id, parent_index, IDI_MANUFACTURER, GetFolderFlags(numFolders));
- ExtraFolderData[next_folder_id] = (EXFOLDERDATA*)malloc(sizeof(EXFOLDERDATA));
- memset(ExtraFolderData[next_folder_id], 0, sizeof(EXFOLDERDATA));
-
- ExtraFolderData[next_folder_id]->m_nFolderId = next_folder_id;
- ExtraFolderData[next_folder_id]->m_nIconId = IDI_MANUFACTURER;
- ExtraFolderData[next_folder_id]->m_nParent = lpFolder->m_nFolderId;
- ExtraFolderData[next_folder_id]->m_nSubIconId = -1;
- strcpy( ExtraFolderData[next_folder_id]->m_szTitle, s );
- ExtraFolderData[next_folder_id++]->m_dwFlags = 0;
- AddFolder(lpTemp);
- AddGame(lpTemp,jj);
- }
- }
- }
- }
- const char *fname = "Manufacturer";
- SaveExternalFolders(parent_index, fname);
-}
+ if (BIT(cache, 20))
+ AddGame(lpImpCol, jj);
-/* Make a reasonable name out of the one found in the driver array */
-static const char *ParseManufacturer(const char *s, int *pParsedChars )
-{
- static char tmp[256];
- char *ptmp;
- char *t;
- *pParsedChars= 0;
+ if (BIT(cache, 18))
+ AddGame(lpImpGraph, jj);
- if ( *s == '?' || *s == '<' || s[3] == '?' )
- {
- (*pParsedChars) = strlen(s);
- return "<unknown>";
+ if (BIT(cache, 17))
+ AddGame(lpMissSnd, jj);
+
+ if (BIT(cache, 16))
+ AddGame(lpImpSnd, jj);
+
+ if (BIT(cache, 15))
+ AddGame(lpIncomplete, jj);
+
+ if (BIT(cache, 13))
+ AddGame(lpNoSndHw, jj);
}
+}
- ptmp = tmp;
- /*if first char is a space, skip it*/
- if( *s == ' ' )
+void CreateYearFolders(int parent_index)
+{
+ if (!RequiredDriverCache())
{
- (*pParsedChars)++;
- ++s;
+ LoadExternalFolders(parent_index, IDI_YEAR);
+ return;
}
- while( *s )
- {
- /* combinations where to end string */
- if (
- ( (*s == ' ') && ( s[1] == '(' || s[1] == '/' || s[1] == '+' ) ) ||
- ( *s == ']' ) || ( *s == '/' ) || ( *s == '?' ) )
- {
- (*pParsedChars)++;
- if( s[1] == '/' || s[1] == '+' )
- (*pParsedChars)++;
- break;
- }
- if( s[0] == ' ' && s[1] == '?' )
- {
- (*pParsedChars) += 2;
- s+=2;
- }
+ int i = 0;
+ int nGames = driver_list::total();
+ int start_folder = numFolders;
+ LPTREEFOLDER lpFolder = treeFolders[parent_index];
- /* skip over opening braces*/
+ // no games in top level folder
+ SetAllBits(lpFolder->m_lpGameBits, false);
- if ( *s != '[' )
- {
- *ptmp++ = *s;
- }
- (*pParsedChars)++;
- /*for "distributed by" and "supported by" handling*/
- if( ( (s[1] == ',') && (s[2] == ' ') && ( (s[3] == 's') || (s[3] == 'd') ) ) )
- {
- //*ptmp++ = *s;
- ++s;
- break;
- }
- ++s;
- }
- *ptmp = '\0';
- t = tmp;
- if( tmp[0] == '(' || tmp[strlen(tmp)-1] == ')' || tmp[0] == ',')
+ for (int jj = 0; jj < nGames; jj++)
{
- ptmp = strchr( tmp,'(' );
- if ( ptmp == NULL )
- {
- ptmp = strchr( tmp,',' );
- if( ptmp != NULL)
- {
- //parse the new "supported by" and "distributed by"
- ptmp++;
+ char s[16];
+ int t1 = sizeof(s);
+ memset(s, '\0', sizeof(s));
+ int t2 = sizeof(driver_list::driver(jj).year)+1;
+ if (t2 > t1)
+ t2 = t1;
+ if (t2)
+ strcpy_s(s, t2, driver_list::driver(jj).year);
- if (ci_strncmp(ptmp, " supported by", 13) == 0)
- {
- ptmp += 13;
- }
- else if (ci_strncmp(ptmp, " distributed by", 15) == 0)
- {
- ptmp += 15;
- }
- else
- {
- return NULL;
- }
- }
- else
- {
- ptmp = tmp;
- if ( ptmp == NULL )
- {
- return NULL;
- }
- }
- }
- if( tmp[0] == '(' || tmp[0] == ',')
- {
- ptmp++;
- }
- if (ci_strncmp(ptmp, "licensed from ", 14) == 0)
- {
- ptmp += 14;
- }
- // for the licenced from case
- if (ci_strncmp(ptmp, "licenced from ", 14) == 0)
- {
- ptmp += 14;
- }
+ if (s[0] == '\0' || s[0] == '?')
+ continue;
- while ( (*ptmp != ')' ) && (*ptmp != '/' ) && *ptmp != '\0')
+ if (s[4] == '?')
+ s[4] = '\0';
+
+ // look for an extant year treefolder for this game
+ // (likely to be the previous one, so start at the end)
+ for (i=numFolders-1;i>=start_folder;i--)
{
- if (*ptmp == ' ' && ci_strncmp(ptmp, " license", 8) == 0)
- {
- break;
- }
- if (*ptmp == ' ' && ci_strncmp(ptmp, " licence", 8) == 0)
+ if (strncmp(treeFolders[i]->m_lpTitle, s, 4) == 0)
{
+ AddGame(treeFolders[i], jj);
break;
}
- *t++ = *ptmp++;
}
-
- *t = '\0';
- }
-
- *ptmp = '\0';
- return tmp;
-}
-
-/* Analyze Manufacturer Names for typical patterns, that don't distinguish between companies (e.g. Co., Ltd., Inc., etc. */
-static const char *TrimManufacturer(const char *s)
-{
- //Also remove Country specific suffixes (e.g. Japan, Italy, America, USA, ...)
- char strTemp[256];
- static char strTemp2[256];
- int j, k ,l;
- memset(strTemp, '\0', 256 );
- memset(strTemp2, '\0', 256 );
- //start analyzing from the back, as these are usually suffixes
- for(int i = strlen(s)-1; i>=0; i-- )
- {
- l = strlen(strTemp);
- for(k=l; k>=0; k--)
- strTemp[k+1] = strTemp[k];
- strTemp[0] = s[i];
- strTemp[++l] = '\0';
- switch (l)
+ if (i == start_folder-1)
{
- case 2:
- if( ci_strncmp(strTemp, "co", 2) == 0 )
- {
- j=l;
- while( s[strlen(s)-j-1] == ' ' || s[strlen(s)-j-1] == ',' )
- {
- j++;
- }
- if( j!=l)
- {
- memset(strTemp2, '\0', 256 );
- strncpy(strTemp2, s, strlen(s)-j );
- }
- }
- break;
- case 3:
- if( ci_strncmp(strTemp, "co.", 3) == 0 || ci_strncmp(strTemp, "ltd", 3) == 0 || ci_strncmp(strTemp, "inc", 3) == 0 || ci_strncmp(strTemp, "SRL", 3) == 0 || ci_strncmp(strTemp, "USA", 3) == 0)
- {
- j=l;
- while( s[strlen(s)-j-1] == ' ' || s[strlen(s)-j-1] == ',' )
- {
- j++;
- }
- if( j!=l)
- {
- memset(strTemp2, '\0', 256 );
- strncpy(strTemp2, s, strlen(s)-j );
- }
- }
- break;
- case 4:
- if( ci_strncmp(strTemp, "inc.", 4) == 0 || ci_strncmp(strTemp, "ltd.", 4) == 0 || ci_strncmp(strTemp, "corp", 4) == 0 || ci_strncmp(strTemp, "game", 4) == 0)
- {
- j=l;
- while( s[strlen(s)-j-1] == ' ' || s[strlen(s)-j-1] == ',' )
- {
- j++;
- }
- if( j!=l)
- {
- memset(strTemp2, '\0', 256 );
- strncpy(strTemp2, s, strlen(s)-j );
- }
- }
- break;
- case 5:
- if( ci_strncmp(strTemp, "corp.", 5) == 0 || ci_strncmp(strTemp, "Games", 5) == 0 || ci_strncmp(strTemp, "Italy", 5) == 0 || ci_strncmp(strTemp, "Japan", 5) == 0)
- {
- j=l;
- while( s[strlen(s)-j-1] == ' ' || s[strlen(s)-j-1] == ',' )
- {
- j++;
- }
- if( j!=l)
- {
- memset(strTemp2, '\0', 256 );
- strncpy(strTemp2, s, strlen(s)-j );
- }
- }
- break;
- case 6:
- if( ci_strncmp(strTemp, "co-ltd", 6) == 0 || ci_strncmp(strTemp, "S.R.L.", 6) == 0)
- {
- j=l;
- while( s[strlen(s)-j-1] == ' ' || s[strlen(s)-j-1] == ',' )
- {
- j++;
- }
- if( j!=l)
- {
- memset(strTemp2, '\0', 256 );
- strncpy(strTemp2, s, strlen(s)-j );
- }
- }
- break;
- case 7:
- if( ci_strncmp(strTemp, "co. ltd", 7) == 0 || ci_strncmp(strTemp, "America", 7) == 0)
- {
- j=l;
- while( s[strlen(s)-j-1] == ' ' || s[strlen(s)-j-1] == ',' )
- {
- j++;
- }
- if( j!=l)
- {
- memset(strTemp2, '\0', 256 );
- strncpy(strTemp2, s, strlen(s)-j );
- }
- }
- break;
- case 8:
- if( ci_strncmp(strTemp, "co. ltd.", 8) == 0 )
- {
- j=l;
- while( s[strlen(s)-j-1] == ' ' || s[strlen(s)-j-1] == ',' )
- {
- j++;
- }
- if( j!=l)
- {
- memset(strTemp2, '\0', 256 );
- strncpy(strTemp2, s, strlen(s)-j );
- }
- }
- break;
- case 9:
- if( ci_strncmp(strTemp, "co., ltd.", 9) == 0 || ci_strncmp(strTemp, "gmbh & co", 9) == 0 )
- {
- j=l;
- while( s[strlen(s)-j-1] == ' ' || s[strlen(s)-j-1] == ',' )
- {
- j++;
- }
- if( j!=l)
- {
- memset(strTemp2, '\0', 256 );
- strncpy(strTemp2, s, strlen(s)-j );
- }
- }
- break;
- case 10:
- if( ci_strncmp(strTemp, "corp, ltd.", 10) == 0 || ci_strncmp(strTemp, "industries", 10) == 0 || ci_strncmp(strTemp, "of America", 10) == 0)
- {
- j=l;
- while( s[strlen(s)-j-1] == ' ' || s[strlen(s)-j-1] == ',' )
- {
- j++;
- }
- if( j!=l)
- {
- memset(strTemp2, '\0', 256 );
- strncpy(strTemp2, s, strlen(s)-j );
- }
- }
- break;
- case 11:
- if( ci_strncmp(strTemp, "corporation", 11) == 0 || ci_strncmp(strTemp, "enterprises", 11) == 0 )
- {
- j=l;
- while( s[strlen(s)-j-1] == ' ' || s[strlen(s)-j-1] == ',' )
- {
- j++;
- }
- if( j!=l)
- {
- memset(strTemp2, '\0', 256 );
- strncpy(strTemp2, s, strlen(s)-j );
- }
- }
- break;
- case 16:
- if( ci_strncmp(strTemp, "industries japan", 16) == 0 )
- {
- j=l;
- while( s[strlen(s)-j-1] == ' ' || s[strlen(s)-j-1] == ',' )
- {
- j++;
- }
- if( j!=l)
- {
- memset(strTemp2, '\0', 256 );
- strncpy(strTemp2, s, strlen(s)-j );
- }
- }
- break;
- default:
- break;
+ // nope, it's a year we haven't seen before, make it.
+ //printf("%s ",s);
+ LPTREEFOLDER lpTemp = NewFolder(s, next_folder_id, parent_index, IDI_YEAR, GetFolderFlags(numFolders));
+ ExtraFolderData[next_folder_id] = (EXFOLDERDATA*)malloc(sizeof(EXFOLDERDATA));
+ memset(ExtraFolderData[next_folder_id], 0, sizeof(EXFOLDERDATA));
+ ExtraFolderData[next_folder_id]->m_nFolderId = next_folder_id;
+ ExtraFolderData[next_folder_id]->m_nIconId = IDI_YEAR;
+ ExtraFolderData[next_folder_id]->m_nParent = lpFolder->m_nFolderId;
+ ExtraFolderData[next_folder_id]->m_nSubIconId = -1;
+ strcpy( ExtraFolderData[next_folder_id]->m_szTitle, s );
+ ExtraFolderData[next_folder_id++]->m_dwFlags = 0;
+ AddFolder(lpTemp);
+ AddGame(lpTemp, jj);
}
}
- if( *strTemp2 == 0 )
- return s;
- return strTemp2;
+
+ SaveExternalFolders(parent_index);
}
void CreateBIOSFolders(int parent_index)
{
- int i, nGames = driver_list::total();
+ int i = 0;
int start_folder = numFolders;
const game_driver *drv;
int nParentIndex = -1;
LPTREEFOLDER lpFolder = treeFolders[parent_index];
+ LPTREEFOLDER lpTemp;
// no games in top level folder
SetAllBits(lpFolder->m_lpGameBits, false);
- for (int jj = 0; jj < nGames; jj++)
+ for (int jj = 0; jj < driver_list::total(); jj++)
{
- if ( DriverIsClone(jj) )
+ if (DriverIsClone(jj))
{
nParentIndex = GetParentIndex(&driver_list::driver(jj));
- if (nParentIndex < 0) return;
+
+ if (nParentIndex < 0)
+ return;
+
drv = &driver_list::driver(nParentIndex);
}
else
drv = &driver_list::driver(jj);
+
nParentIndex = GetParentIndex(drv);
if (nParentIndex < 0 || !driver_list::driver(nParentIndex).type.fullname())
continue;
- for (i = numFolders-1; i >= start_folder; i--)
+ for (i = numFolders - 1; i >= start_folder; i--)
{
if (strcmp(treeFolders[i]->m_lpTitle, driver_list::driver(nParentIndex).type.fullname()) == 0)
{
@@ -914,573 +631,616 @@ void CreateBIOSFolders(int parent_index)
}
}
- if (i == start_folder-1)
+ if (i == start_folder - 1)
{
- LPTREEFOLDER lpTemp = NewFolder(driver_list::driver(nParentIndex).type.fullname(), next_folder_id++, parent_index, IDI_CPU, GetFolderFlags(numFolders));
+ lpTemp = NewFolder(driver_list::driver(nParentIndex).type.fullname(), next_folder_id++, parent_index, IDI_BIOS, GetFolderFlags(numFolders));
AddFolder(lpTemp);
AddGame(lpTemp, jj);
}
}
- const char *fname = "BIOS";
- SaveExternalFolders(parent_index, fname);
}
-void CreateCPUFolders(int parent_index)
+void CreateScreenFoldersIni(int parent_index)
{
- int device_folder_count = 0;
- LPTREEFOLDER device_folders[1024];
- LPTREEFOLDER folder;
- int nFolder = numFolders;
+ int i = 0;
+ int start_folder = numFolders;
+ LPTREEFOLDER lpFolder = treeFolders[parent_index];
+ LPTREEFOLDER lpTemp;
- for (int i = 0; i < driver_list::total(); i++)
+ // no games in top level folder
+ SetAllBits(lpFolder->m_lpGameBits, false);
+
+ for (int jj = 0; jj < driver_list::total(); jj++)
{
- machine_config config(driver_list::driver(i),MameUIGlobal());
+ char screen[4];
+ snprintf(screen, std::size(screen), "%d", DriverNumScreens(jj));
+
+ // look for an existant screen treefolder for this game
+ // (likely to be the previous one, so start at the end)
+ for (i = numFolders - 1; i >= start_folder; i--)
+ {
+ if (strcmp(treeFolders[i]->m_lpTitle, screen) == 0)
+ {
+ AddGame(treeFolders[i], jj);
+ break;
+ }
+ }
+
+ if (i == start_folder - 1)
+ {
+ // nope, it's a screen we haven't seen before, make it.
+ lpTemp = NewFolder(screen, next_folder_id++, parent_index, IDI_MONITOR, GetFolderFlags(numFolders));
+ AddFolder(lpTemp);
+ AddGame(lpTemp, jj);
+ }
+ }
+}
+
+void CreateCPUFoldersIni(int parent_index)
+{
+ int i = 0;
+ int start_folder = numFolders;
+ LPTREEFOLDER lpFolder = treeFolders[parent_index];
+ LPTREEFOLDER lpTemp;
+
+ // no games in top level folder
+ SetAllBits(lpFolder->m_lpGameBits, false);
+
+ for (int jj = 0; jj < driver_list::total(); jj++)
+ {
+ machine_config config(driver_list::driver(jj), MameUIGlobal());
// enumerate through all devices
for (device_execute_interface &device : execute_interface_enumerator(config.root_device()))
{
// get the name
- const char* dev_name = device.device().name();
+ const char *cpu = device.device().name();
- if (dev_name)
+ // look for an existant CPU treefolder for this game
+ // (likely to be the previous one, so start at the end)
+ for (i = numFolders - 1; i >= start_folder; i--)
{
- // do we have a folder for this device?
- folder = NULL;
- for (int j = 0; j < device_folder_count; j++)
- {
- if (strcmp(dev_name, device_folders[j]->m_lpTitle)==0)
- {
- folder = device_folders[j];
- break;
- }
- }
-
- // are we forced to create a folder?
- if (folder == NULL)
+ if (strcmp(treeFolders[i]->m_lpTitle, cpu) == 0)
{
- LPTREEFOLDER lpTemp = NewFolder(dev_name, next_folder_id, parent_index, IDI_CPU, GetFolderFlags(numFolders));
- ExtraFolderData[next_folder_id] = (EXFOLDERDATA*)malloc(sizeof(EXFOLDERDATA));
- memset(ExtraFolderData[next_folder_id], 0, sizeof(EXFOLDERDATA));
- ExtraFolderData[next_folder_id]->m_nFolderId = next_folder_id;
- ExtraFolderData[next_folder_id]->m_nIconId = IDI_CPU;
- ExtraFolderData[next_folder_id]->m_nParent = treeFolders[parent_index]->m_nFolderId;
- ExtraFolderData[next_folder_id]->m_nSubIconId = -1;
- strcpy( ExtraFolderData[next_folder_id]->m_szTitle, dev_name );
- ExtraFolderData[next_folder_id++]->m_dwFlags = 0;
- AddFolder(lpTemp);
- folder = treeFolders[nFolder++];
-
- // record that we found this folder
- device_folders[device_folder_count++] = folder;
- if (device_folder_count >= std::size(device_folders))
- {
- printf("CreateCPUFolders buffer overrun: %d\n",device_folder_count);
- fflush(stdout);
- }
+ AddGame(treeFolders[i], jj);
+ break;
}
+ }
- // cpu type #'s are one-based
- AddGame(folder, i);
+ if (i == start_folder - 1)
+ {
+ // nope, it's a CPU we haven't seen before, make it.
+ lpTemp = NewFolder(cpu, next_folder_id++, parent_index, IDI_CHIP, GetFolderFlags(numFolders));
+ AddFolder(lpTemp);
+ AddGame(lpTemp, jj);
}
}
}
- const char *fname = "CPU";
- SaveExternalFolders(parent_index, fname);
}
-void CreateSoundFolders(int parent_index)
+void CreateSoundFoldersIni(int parent_index)
{
- int device_folder_count = 0;
- LPTREEFOLDER device_folders[512];
- LPTREEFOLDER folder;
- int nFolder = numFolders;
+ int i = 0;
+ int start_folder = numFolders;
+ LPTREEFOLDER lpFolder = treeFolders[parent_index];
+ LPTREEFOLDER lpTemp;
- for (int i = 0; i < driver_list::total(); i++)
+ // no games in top level folder
+ SetAllBits(lpFolder->m_lpGameBits, false);
+
+ for (int jj = 0; jj < driver_list::total(); jj++)
{
- machine_config config(driver_list::driver(i),MameUIGlobal());
+ machine_config config(driver_list::driver(jj), MameUIGlobal());
// enumerate through all devices
-
for (device_sound_interface &device : sound_interface_enumerator(config.root_device()))
{
// get the name
- const char* dev_name = device.device().name();
+ const char *sound = device.device().name();
- if (dev_name)
+ // look for an existant sound chip treefolder for this game
+ // (likely to be the previous one, so start at the end)
+ for (i = numFolders - 1; i >= start_folder; i--)
{
- // do we have a folder for this device?
- folder = NULL;
- for (int j = 0; j < device_folder_count; j++)
- {
- if (strcmp(dev_name, device_folders[j]->m_lpTitle)==0)
- {
- folder = device_folders[j];
- break;
- }
- }
-
- // are we forced to create a folder?
- if (folder == NULL)
+ if (strcmp(treeFolders[i]->m_lpTitle, sound) == 0)
{
- LPTREEFOLDER lpTemp = NewFolder(dev_name, next_folder_id, parent_index, IDI_SOUND, GetFolderFlags(numFolders));
- ExtraFolderData[next_folder_id] = (EXFOLDERDATA*)malloc(sizeof(EXFOLDERDATA));
- memset(ExtraFolderData[next_folder_id], 0, sizeof(EXFOLDERDATA));
-
- ExtraFolderData[next_folder_id]->m_nFolderId = next_folder_id;
- ExtraFolderData[next_folder_id]->m_nIconId = IDI_SOUND;
- ExtraFolderData[next_folder_id]->m_nParent = treeFolders[parent_index]->m_nFolderId;
- ExtraFolderData[next_folder_id]->m_nSubIconId = -1;
- strcpy( ExtraFolderData[next_folder_id]->m_szTitle, dev_name );
- ExtraFolderData[next_folder_id++]->m_dwFlags = 0;
- AddFolder(lpTemp);
- folder = treeFolders[nFolder++];
-
- // record that we found this folder
- device_folders[device_folder_count++] = folder;
- if (device_folder_count >= std::size(device_folders))
- {
- printf("CreateSoundFolders buffer overrun: %d\n",device_folder_count);
- fflush(stdout);
- }
+ AddGame(treeFolders[i], jj);
+ break;
}
+ }
- // cpu type #'s are one-based
- AddGame(folder, i);
+ if (i == start_folder - 1)
+ {
+ // nope, it's a sound chip we haven't seen before, make it.
+ lpTemp = NewFolder(sound, next_folder_id++, parent_index, IDI_CHIP, GetFolderFlags(numFolders));
+ AddFolder(lpTemp);
+ AddGame(lpTemp, jj);
}
}
}
- const char *fname = "Sound";
- SaveExternalFolders(parent_index, fname);
}
-void CreateDeficiencyFolders(int parent_index)
+void CreateSaveStateFolders(int parent_index)
{
- int nGames = driver_list::total();
LPTREEFOLDER lpFolder = treeFolders[parent_index];
+ LPTREEFOLDER lpSupported, lpUnsupported;
- // create our subfolders
- LPTREEFOLDER lpProt, lpWrongCol, lpImpCol, lpImpGraph, lpMissSnd, lpImpSnd, lpFlip, lpArt;
- lpProt = NewFolder("Unemulated Protection", next_folder_id, parent_index, IDI_FOLDER, GetFolderFlags(numFolders));
- ExtraFolderData[next_folder_id] = (EXFOLDERDATA*)malloc(sizeof(EXFOLDERDATA));
- memset(ExtraFolderData[next_folder_id], 0, sizeof(EXFOLDERDATA));
-
- ExtraFolderData[next_folder_id]->m_nFolderId = next_folder_id;
- ExtraFolderData[next_folder_id]->m_nIconId = IDI_FOLDER;
- ExtraFolderData[next_folder_id]->m_nParent = lpFolder->m_nFolderId;
- ExtraFolderData[next_folder_id]->m_nSubIconId = -1;
- strcpy( ExtraFolderData[next_folder_id]->m_szTitle, "Unemulated Protection" );
- ExtraFolderData[next_folder_id++]->m_dwFlags = 0;
- AddFolder(lpProt);
- lpWrongCol = NewFolder("Wrong Colors", next_folder_id, parent_index, IDI_FOLDER, GetFolderFlags(numFolders));
- ExtraFolderData[next_folder_id] = (EXFOLDERDATA*)malloc(sizeof(EXFOLDERDATA));
- memset(ExtraFolderData[next_folder_id], 0, sizeof(EXFOLDERDATA));
-
- ExtraFolderData[next_folder_id]->m_nFolderId = next_folder_id;
- ExtraFolderData[next_folder_id]->m_nIconId = IDI_FOLDER;
- ExtraFolderData[next_folder_id]->m_nParent = lpFolder->m_nFolderId;
- ExtraFolderData[next_folder_id]->m_nSubIconId = -1;
- strcpy( ExtraFolderData[next_folder_id]->m_szTitle, "Wrong Colors" );
- ExtraFolderData[next_folder_id++]->m_dwFlags = 0;
- AddFolder(lpWrongCol);
+ // no games in top level folder
+ SetAllBits(lpFolder->m_lpGameBits,false);
+ // create our two subfolders
+ lpSupported = NewFolder("Supported", next_folder_id++, parent_index, IDI_FOLDER, GetFolderFlags(numFolders));
+ lpUnsupported = NewFolder("Unsupported", next_folder_id++, parent_index, IDI_FOLDER, GetFolderFlags(numFolders));
+ AddFolder(lpSupported);
+ AddFolder(lpUnsupported);
- lpImpCol = NewFolder("Imperfect Colors", next_folder_id, parent_index, IDI_FOLDER, GetFolderFlags(numFolders));
- ExtraFolderData[next_folder_id] = (EXFOLDERDATA*)malloc(sizeof(EXFOLDERDATA));
- memset(ExtraFolderData[next_folder_id], 0, sizeof(EXFOLDERDATA));
+ for (int jj = 0; jj < driver_list::total(); jj++)
+ {
+ if (DriverSupportsSaveState(jj))
+ AddGame(lpSupported, jj);
+ else
+ AddGame(lpUnsupported, jj);
+ }
+}
- ExtraFolderData[next_folder_id]->m_nFolderId = next_folder_id;
- ExtraFolderData[next_folder_id]->m_nIconId = IDI_FOLDER;
- ExtraFolderData[next_folder_id]->m_nParent = lpFolder->m_nFolderId;
- ExtraFolderData[next_folder_id]->m_nSubIconId = -1;
- strcpy( ExtraFolderData[next_folder_id]->m_szTitle, "Imperfect Colors" );
- ExtraFolderData[next_folder_id++]->m_dwFlags = 0;
- AddFolder(lpImpCol);
+void CreateResolutionFoldersIni(int parent_index)
+{
+ int i = 0;
+ int start_folder = numFolders;
+ LPTREEFOLDER lpFolder = treeFolders[parent_index];
+ LPTREEFOLDER lpTemp, lpVectorH, lpVectorV, lpScreenless;
- lpImpGraph = NewFolder("Imperfect Graphics", next_folder_id, parent_index, IDI_FOLDER, GetFolderFlags(numFolders));
- ExtraFolderData[next_folder_id] = (EXFOLDERDATA*)malloc(sizeof(EXFOLDERDATA));
- memset(ExtraFolderData[next_folder_id], 0, sizeof(EXFOLDERDATA));
+ // no games in top level folder
+ SetAllBits(lpFolder->m_lpGameBits, false);
+ // create our two subfolders
+ lpVectorH = NewFolder("Vector (H)", next_folder_id++, parent_index, IDI_FOLDER, GetFolderFlags(numFolders));
+ lpVectorV = NewFolder("Vector (V)", next_folder_id++, parent_index, IDI_FOLDER, GetFolderFlags(numFolders));
+ lpScreenless = NewFolder("Screenless", next_folder_id++, parent_index, IDI_FOLDER, GetFolderFlags(numFolders));
+ AddFolder(lpVectorH);
+ AddFolder(lpVectorV);
+ AddFolder(lpScreenless);
+
+ for (int jj = 0; jj < driver_list::total(); jj++)
+ {
+ machine_config config(driver_list::driver(jj), MameUIGlobal());
+ char res[32];
- ExtraFolderData[next_folder_id]->m_nFolderId = next_folder_id;
- ExtraFolderData[next_folder_id]->m_nIconId = IDI_FOLDER;
- ExtraFolderData[next_folder_id]->m_nParent = lpFolder->m_nFolderId;
- ExtraFolderData[next_folder_id]->m_nSubIconId = -1;
- strcpy( ExtraFolderData[next_folder_id]->m_szTitle, "Imperfect Graphics" );
- ExtraFolderData[next_folder_id++]->m_dwFlags = 0;
- AddFolder(lpImpGraph);
+ if (DriverIsVector(jj))
+ {
+ if (DriverIsVertical(jj))
+ {
+ AddGame(lpVectorV, jj);
+ continue;
+ }
+ else
+ {
+ AddGame(lpVectorH, jj);
+ continue;
+ }
+ }
- lpMissSnd = NewFolder("Missing Sound", next_folder_id, parent_index, IDI_FOLDER, GetFolderFlags(numFolders));
- ExtraFolderData[next_folder_id] = (EXFOLDERDATA*)malloc(sizeof(EXFOLDERDATA));
- memset(ExtraFolderData[next_folder_id], 0, sizeof(EXFOLDERDATA));
+ const screen_device *screen = screen_device_enumerator(config.root_device()).first();
- ExtraFolderData[next_folder_id]->m_nFolderId = next_folder_id;
- ExtraFolderData[next_folder_id]->m_nIconId = IDI_FOLDER;
- ExtraFolderData[next_folder_id]->m_nParent = lpFolder->m_nFolderId;
- ExtraFolderData[next_folder_id]->m_nSubIconId = -1;
- strcpy( ExtraFolderData[next_folder_id]->m_szTitle, "Missing Sound" );
- ExtraFolderData[next_folder_id++]->m_dwFlags = 0;
- AddFolder(lpMissSnd);
+ if (screen == nullptr)
+ {
+ AddGame(lpScreenless, jj);
+ continue;
+ }
- lpImpSnd = NewFolder("Imperfect Sound", next_folder_id, parent_index, IDI_FOLDER, GetFolderFlags(numFolders));
- ExtraFolderData[next_folder_id] = (EXFOLDERDATA*)malloc(sizeof(EXFOLDERDATA));
- memset(ExtraFolderData[next_folder_id], 0, sizeof(EXFOLDERDATA));
+ const rectangle &visarea = screen->visible_area();
- ExtraFolderData[next_folder_id]->m_nFolderId = next_folder_id;
- ExtraFolderData[next_folder_id]->m_nIconId = IDI_FOLDER;
- ExtraFolderData[next_folder_id]->m_nParent = lpFolder->m_nFolderId;
- ExtraFolderData[next_folder_id]->m_nSubIconId = -1;
- strcpy( ExtraFolderData[next_folder_id]->m_szTitle, "Imperfect Sound" );
- ExtraFolderData[next_folder_id++]->m_dwFlags = 0;
- AddFolder(lpImpSnd);
+ if (DriverIsVertical(jj))
+ snprintf(res, std::size(res), "%d x %d (V)", visarea.width(), visarea.height());
+ else
+ snprintf(res, std::size(res), "%d x %d (H)", visarea.width(), visarea.height());
- lpFlip = NewFolder("No Cocktail", next_folder_id, parent_index, IDI_FOLDER, GetFolderFlags(numFolders));
- ExtraFolderData[next_folder_id] = (EXFOLDERDATA*)malloc(sizeof(EXFOLDERDATA));
- memset(ExtraFolderData[next_folder_id], 0, sizeof(EXFOLDERDATA));
-
- ExtraFolderData[next_folder_id]->m_nFolderId = next_folder_id;
- ExtraFolderData[next_folder_id]->m_nIconId = IDI_FOLDER;
- ExtraFolderData[next_folder_id]->m_nParent = lpFolder->m_nFolderId;
- ExtraFolderData[next_folder_id]->m_nSubIconId = -1;
- strcpy( ExtraFolderData[next_folder_id]->m_szTitle, "No Cocktail" );
- ExtraFolderData[next_folder_id++]->m_dwFlags = 0;
- AddFolder(lpFlip);
-
- lpArt = NewFolder("Requires Artwork", next_folder_id, parent_index, IDI_FOLDER, GetFolderFlags(numFolders));
- ExtraFolderData[next_folder_id] = (EXFOLDERDATA*)malloc(sizeof(EXFOLDERDATA) );
- memset(ExtraFolderData[next_folder_id], 0, sizeof(EXFOLDERDATA));
-
- ExtraFolderData[next_folder_id]->m_nFolderId = next_folder_id;
- ExtraFolderData[next_folder_id]->m_nIconId = IDI_FOLDER;
- ExtraFolderData[next_folder_id]->m_nParent = lpFolder->m_nFolderId;
- ExtraFolderData[next_folder_id]->m_nSubIconId = -1;
- strcpy( ExtraFolderData[next_folder_id]->m_szTitle, "Requires Artwork" );
- ExtraFolderData[next_folder_id++]->m_dwFlags = 0;
- AddFolder(lpArt);
- // no games in top level folder
- SetAllBits(lpFolder->m_lpGameBits,false);
+ // look for an existant resolution treefolder for this game
+ // (likely to be the previous one, so start at the end)
+ for (i = numFolders - 1; i >= start_folder; i--)
+ {
+ if (strcmp(treeFolders[i]->m_lpTitle, res) == 0)
+ {
+ AddGame(treeFolders[i], jj);
+ break;
+ }
+ }
- for (int jj = 0; jj < nGames; jj++)
- {
- uint32_t cache = GetDriverCacheLower(jj);
- if (BIT(cache, 21))
- AddGame(lpWrongCol,jj);
+ if (i == start_folder - 1)
+ {
+ // nope, it's a resolution we haven't seen before, make it.
+ lpTemp = NewFolder(res, next_folder_id++, parent_index, IDI_FOLDER, GetFolderFlags(numFolders));
+ AddFolder(lpTemp);
+ AddGame(lpTemp, jj);
+ }
+ }
+}
- if (BIT(cache, 22))
- AddGame(lpProt,jj);
+void CreateFPSFoldersIni(int parent_index)
+{
+ int i = 0;
+ int start_folder = numFolders;
+ LPTREEFOLDER lpFolder = treeFolders[parent_index];
+ LPTREEFOLDER lpTemp, lpVector, lpScreenless;
- if (BIT(cache, 20))
- AddGame(lpImpCol,jj);
+ // no games in top level folder
+ SetAllBits(lpFolder->m_lpGameBits, false);
+ // create our two subfolders
+ lpVector = NewFolder("Vector", next_folder_id++, parent_index, IDI_FOLDER, GetFolderFlags(numFolders));
+ lpScreenless = NewFolder("Screenless", next_folder_id++, parent_index, IDI_FOLDER, GetFolderFlags(numFolders));
+ AddFolder(lpVector);
+ AddFolder(lpScreenless);
- if (BIT(cache, 18))
- AddGame(lpImpGraph,jj);
+ for (int jj = 0; jj < driver_list::total(); jj++)
+ {
+ machine_config config(driver_list::driver(jj), MameUIGlobal());
+ char fps[16];
+
+ if (DriverIsVector(jj))
+ {
+ AddGame(lpVector, jj);
+ continue;
+ }
- if (BIT(cache, 17))
- AddGame(lpMissSnd,jj);
+ const screen_device *screen = screen_device_enumerator(config.root_device()).first();
- if (BIT(cache, 16))
- AddGame(lpImpSnd,jj);
+ if (screen == nullptr)
+ {
+ AddGame(lpScreenless, jj);
+ continue;
+ }
- if (BIT(cache, 8))
- AddGame(lpFlip,jj);
+ snprintf(fps, std::size(fps), "%f Hz", ATTOSECONDS_TO_HZ(screen->refresh_attoseconds()));
- if (BIT(cache, 10))
- AddGame(lpArt,jj);
+ // look for an existant refresh treefolder for this game
+ // (likely to be the previous one, so start at the end)
+ for (i = numFolders - 1; i >= start_folder; i--)
+ {
+ if (strcmp(treeFolders[i]->m_lpTitle, fps) == 0)
+ {
+ AddGame(treeFolders[i], jj);
+ break;
+ }
+ }
+
+ if (i == start_folder - 1)
+ {
+ // nope, it's a refresh we haven't seen before, make it.
+ lpTemp = NewFolder(fps, next_folder_id++, parent_index, IDI_FOLDER, GetFolderFlags(numFolders));
+ AddFolder(lpTemp);
+ AddGame(lpTemp, jj);
+ }
}
}
-void CreateDumpingFolders(int parent_index)
+void CreateDumpingFoldersIni(int parent_index)
{
- BOOL bBadDump = false;
- BOOL bNoDump = false;
- int nGames = driver_list::total();
LPTREEFOLDER lpFolder = treeFolders[parent_index];
- const rom_entry *rom;
- const game_driver *gamedrv;
-
- // create our two subfolders
- LPTREEFOLDER lpBad, lpNo;
- lpBad = NewFolder("Bad Dump", next_folder_id, parent_index, IDI_FOLDER_DUMP, GetFolderFlags(numFolders));
- ExtraFolderData[next_folder_id] = (EXFOLDERDATA*)malloc(sizeof(EXFOLDERDATA));
- memset(ExtraFolderData[next_folder_id], 0, sizeof(EXFOLDERDATA));
-
- ExtraFolderData[next_folder_id]->m_nFolderId = next_folder_id;
- ExtraFolderData[next_folder_id]->m_nIconId = IDI_FOLDER_DUMP;
- ExtraFolderData[next_folder_id]->m_nParent = lpFolder->m_nFolderId;
- ExtraFolderData[next_folder_id]->m_nSubIconId = -1;
- strcpy( ExtraFolderData[next_folder_id]->m_szTitle, "Bad Dump" );
- ExtraFolderData[next_folder_id++]->m_dwFlags = 0;
- AddFolder(lpBad);
- lpNo = NewFolder("No Dump", next_folder_id, parent_index, IDI_FOLDER_DUMP, GetFolderFlags(numFolders));
- ExtraFolderData[next_folder_id] = (EXFOLDERDATA*)malloc(sizeof(EXFOLDERDATA));
- memset(ExtraFolderData[next_folder_id], 0, sizeof(EXFOLDERDATA));
-
- ExtraFolderData[next_folder_id]->m_nFolderId = next_folder_id;
- ExtraFolderData[next_folder_id]->m_nIconId = IDI_FOLDER_DUMP;
- ExtraFolderData[next_folder_id]->m_nParent = lpFolder->m_nFolderId;
- ExtraFolderData[next_folder_id]->m_nSubIconId = -1;
- strcpy( ExtraFolderData[next_folder_id]->m_szTitle, "No Dump" );
- ExtraFolderData[next_folder_id++]->m_dwFlags = 0;
- AddFolder(lpNo);
+ LPTREEFOLDER lpBadDump, lpNoDump, lpGoodDump;
// no games in top level folder
SetAllBits(lpFolder->m_lpGameBits,false);
-
- for (int jj = 0; jj < nGames; jj++)
+ // create our two subfolders
+ lpNoDump = NewFolder("No Dump", next_folder_id, parent_index, IDI_FOLDER, GetFolderFlags(numFolders));
+ lpBadDump = NewFolder("Bad Dump", next_folder_id, parent_index, IDI_FOLDER, GetFolderFlags(numFolders));
+ lpGoodDump = NewFolder("Good Dump", next_folder_id, parent_index, IDI_FOLDER, GetFolderFlags(numFolders));
+ AddFolder(lpNoDump);
+ AddFolder(lpBadDump);
+ AddFolder(lpGoodDump);
+
+ for (int jj = 0; jj < driver_list::total(); jj++)
{
- gamedrv = &driver_list::driver(jj);
+ machine_config config(driver_list::driver(jj), MameUIGlobal());
+ bool bBadDump = false;
+ bool bNoDump = false;
- if (!gamedrv->rom)
+ if (!DriverUsesRoms(jj))
continue;
- bBadDump = false;
- bNoDump = false;
- /* Allocate machine config */
- machine_config config(*gamedrv,MameUIGlobal());
for (device_t &device : device_enumerator(config.root_device()))
{
- for (const rom_entry *region = rom_first_region(device); region; region = rom_next_region(region))
+ for (const rom_entry *region = rom_first_region(device); region != nullptr; region = rom_next_region(region))
{
- for (rom = rom_first_file(region); rom; rom = rom_next_file(rom))
+ for (const rom_entry *rom = rom_first_file(region); rom != nullptr; rom = rom_next_file(rom))
{
- if (ROMREGION_ISROMDATA(region) || ROMREGION_ISDISKDATA(region) )
+ if (ROMREGION_ISROMDATA(region) || ROMREGION_ISDISKDATA(region))
{
- //name = ROM_GETNAME(rom);
util::hash_collection hashes(rom->hashdata());
- if (hashes.flag(util::hash_collection::FLAG_BAD_DUMP))
- bBadDump = true;
+
if (hashes.flag(util::hash_collection::FLAG_NO_DUMP))
bNoDump = true;
+
+ if (hashes.flag(util::hash_collection::FLAG_BAD_DUMP))
+ bBadDump = true;
}
}
}
}
- if (bBadDump)
- AddGame(lpBad,jj);
if (bNoDump)
- AddGame(lpNo,jj);
+ {
+ AddGame(lpNoDump, jj);
+ continue;
+ }
+
+ if (bBadDump)
+ {
+ AddGame(lpBadDump, jj);
+ continue;
+ }
+
+ AddGame(lpGoodDump, jj);
}
- const char *fname = "Dumping";
- SaveExternalFolders(parent_index, fname);
}
+void CreateCPUFolders(int parent_index)
+{
+ if (RequiredDriverCache())
+ {
+ CreateCPUFoldersIni(parent_index);
+ SaveExternalFolders(parent_index);
+ }
+ else
+ LoadExternalFolders(parent_index, IDI_CHIP);
+
+ SendMessage(GetProgressBar(), PBM_SETPOS, 20, 0);
+}
-void CreateYearFolders(int parent_index)
+void CreateSoundFolders(int parent_index)
{
- int i,jj;
- int nGames = driver_list::total();
- int start_folder = numFolders;
- LPTREEFOLDER lpFolder = treeFolders[parent_index];
+ if (RequiredDriverCache())
+ {
+ CreateSoundFoldersIni(parent_index);
+ SaveExternalFolders(parent_index);
+ }
+ else
+ LoadExternalFolders(parent_index, IDI_CHIP);
- // no games in top level folder
- SetAllBits(lpFolder->m_lpGameBits, false);
+ SendMessage(GetProgressBar(), PBM_SETPOS, 95, 0);
+}
- for (jj = 0; jj < nGames; jj++)
+void CreateScreenFolders(int parent_index)
+{
+ if (RequiredDriverCache())
{
- char s[strlen(driver_list::driver(jj).year)+1];
- strcpy(s,driver_list::driver(jj).year);
+ CreateScreenFoldersIni(parent_index);
+ SaveExternalFolders(parent_index);
+ }
+ else
+ LoadExternalFolders(parent_index, IDI_MONITOR);
- if (s[0] == '\0' || s[0] == '?')
- continue;
+ SendMessage(GetProgressBar(), PBM_SETPOS, 80, 0);
+}
- if (s[4] == '?')
- s[4] = '\0';
+void CreateResolutionFolders(int parent_index)
+{
+ if (RequiredDriverCache())
+ {
+ CreateResolutionFoldersIni(parent_index);
+ SaveExternalFolders(parent_index);
+ }
+ else
+ LoadExternalFolders(parent_index, IDI_FOLDER);
- // look for an extant year treefolder for this game
- // (likely to be the previous one, so start at the end)
- for (i=numFolders-1;i>=start_folder;i--)
- {
- if (strncmp(treeFolders[i]->m_lpTitle, s, 4) == 0)
- {
- AddGame(treeFolders[i], jj);
- break;
- }
- }
- if (i == start_folder-1)
- {
- // nope, it's a year we haven't seen before, make it.
- LPTREEFOLDER lpTemp;
- lpTemp = NewFolder(s, next_folder_id, parent_index, IDI_YEAR, GetFolderFlags(numFolders));
- ExtraFolderData[next_folder_id] = (EXFOLDERDATA*)malloc(sizeof(EXFOLDERDATA));
- memset(ExtraFolderData[next_folder_id], 0, sizeof(EXFOLDERDATA));
+ SendMessage(GetProgressBar(), PBM_SETPOS, 65, 0);
+}
- ExtraFolderData[next_folder_id]->m_nFolderId = next_folder_id;
- ExtraFolderData[next_folder_id]->m_nIconId = IDI_YEAR;
- ExtraFolderData[next_folder_id]->m_nParent = lpFolder->m_nFolderId;
- ExtraFolderData[next_folder_id]->m_nSubIconId = -1;
- strcpy( ExtraFolderData[next_folder_id]->m_szTitle, s );
- ExtraFolderData[next_folder_id++]->m_dwFlags = 0;
- AddFolder(lpTemp);
- AddGame(lpTemp, jj);
- }
+void CreateFPSFolders(int parent_index)
+{
+ if (RequiredDriverCache())
+ {
+ CreateFPSFoldersIni(parent_index);
+ SaveExternalFolders(parent_index);
}
- const char *fname = "Year";
- SaveExternalFolders(parent_index, fname);
+ else
+ LoadExternalFolders(parent_index, IDI_FOLDER);
+
+ SendMessage(GetProgressBar(), PBM_SETPOS, 50, 0);
}
-void CreateResolutionFolders(int parent_index)
+void CreateDumpingFolders(int parent_index)
{
- int i,jj;
- int nGames = driver_list::total();
- int start_folder = numFolders;
- char Screen[2048];
- const game_driver *gamedrv;
+ if (RequiredDriverCache())
+ {
+ CreateDumpingFoldersIni(parent_index);
+ SaveExternalFolders(parent_index);
+ }
+ else
+ LoadExternalFolders(parent_index, IDI_FOLDER);
+
+ SendMessage(GetProgressBar(), PBM_SETPOS, 35, 0);
+}
+
+static void LoadExternalFolders(int parent_index, int id)
+{
+ const char* fname = NULL;
LPTREEFOLDER lpFolder = treeFolders[parent_index];
- // no games in top level folder
- SetAllBits(lpFolder->m_lpGameBits, false);
+ for (int j = 0; g_lpFolderData[j].m_lpTitle; j++)
+ if (strcmp(lpFolder->m_lpTitle, g_lpFolderData[j].m_lpTitle)==0)
+ fname = g_lpFolderData[j].short_name;
- for (jj = 0; jj < nGames; jj++)
- {
- gamedrv = &driver_list::driver(jj);
- /* Allocate machine config */
- machine_config config(*gamedrv,MameUIGlobal());
+ if (fname == NULL)
+ return;
- if (isDriverVector(&config))
- sprintf(Screen, "Vector");
- else
+ char filename[MAX_PATH];
+ snprintf(filename, std::size(filename), "%s\\%s.ini", GetFolderDir(), fname);
+ FILE *f = fopen(filename, "r");
+
+ if (f == NULL)
+ return;
+
+ char readbuf[256];
+ char *name = NULL;
+ LPTREEFOLDER lpTemp = NULL;
+ int current_id = lpFolder->m_nFolderId;
+
+ while (fgets(readbuf, 256, f))
+ {
+ /* do we have [...] ? */
+ if (readbuf[0] == '[')
{
- screen_device_enumerator iter(config.root_device());
- const screen_device *screen = iter.first();
- if (screen == NULL)
- strcpy(Screen, "Screenless Game");
+ char *p = strchr(readbuf, ']');
+
+ if (p == NULL)
+ continue;
+
+ *p = '\0';
+ name = &readbuf[1];
+
+ /* is it [FOLDER_SETTINGS]? */
+ if (strcmp(name, "FOLDER_SETTINGS") == 0)
+ {
+ current_id = -1;
+ continue;
+ }
else
{
- for (screen_device &screen : screen_device_enumerator(config.root_device()))
+ /* is it [ROOT_FOLDER]? */
+ if (!strcmp(name, "ROOT_FOLDER"))
{
- const rectangle &visarea = screen.visible_area();
-
- sprintf(Screen,"%d x %d (%c)", visarea.max_y - visarea.min_y + 1, visarea.max_x - visarea.min_x + 1,
- (driver_list::driver(jj).flags & ORIENTATION_SWAP_XY) ? 'V':'H');
-
- // look for an existant screen treefolder for this game
- // (likely to be the previous one, so start at the end)
- for (i=numFolders-1;i>=start_folder;i--)
- {
- if (strcmp(treeFolders[i]->m_lpTitle, Screen) == 0)
- {
- AddGame(treeFolders[i],jj);
- break;
- }
- }
- if (i == start_folder-1)
- {
- // nope, it's a screen we haven't seen before, make it.
- LPTREEFOLDER lpTemp = NewFolder(Screen, next_folder_id++, parent_index, IDI_SCREEN, GetFolderFlags(numFolders));
- ExtraFolderData[next_folder_id] = (EXFOLDERDATA*)malloc(sizeof(EXFOLDERDATA));
- memset(ExtraFolderData[next_folder_id], 0, sizeof(EXFOLDERDATA));
-
- ExtraFolderData[next_folder_id]->m_nFolderId = next_folder_id;
- ExtraFolderData[next_folder_id]->m_nIconId = IDI_SCREEN;
- ExtraFolderData[next_folder_id]->m_nParent = lpFolder->m_nFolderId;
- ExtraFolderData[next_folder_id]->m_nSubIconId = -1;
- strcpy( ExtraFolderData[next_folder_id]->m_szTitle, Screen );
- ExtraFolderData[next_folder_id++]->m_dwFlags = 0;
- AddFolder(lpTemp);
- AddGame(lpTemp,jj);
- }
+ current_id = lpFolder->m_nFolderId;
+ lpTemp = lpFolder;
}
+ else
+ {
+ current_id = next_folder_id++;
+ lpTemp = NewFolder(name, current_id, parent_index, id, GetFolderFlags(numFolders));
+ AddFolder(lpTemp);
+ }
+ }
+ }
+ else if (current_id != -1)
+ {
+ /* string on a line by itself -- game name */
+ name = strtok(readbuf, " \t\r\n");
+
+ if (name == NULL)
+ {
+ current_id = -1;
+ continue;
}
+
+ AddGame(lpTemp, GetGameNameIndex(name));
}
}
- const char *fname = "Resolution";
- SaveExternalFolders(parent_index, fname);
+
+ fclose(f);
}
-void CreateFPSFolders(int parent_index)
+static void SaveExternalFolders(int parent_index)
{
- int i,jj;
- int nGames = driver_list::total();
- int start_folder = numFolders;
- char Screen[2048];
- const game_driver *gamedrv;
+ const char* fname = NULL;
LPTREEFOLDER lpFolder = treeFolders[parent_index];
- // no games in top level folder
- SetAllBits(lpFolder->m_lpGameBits, false);
+ for (int j = 0; g_lpFolderData[j].m_lpTitle; j++)
+ if (strcmp(lpFolder->m_lpTitle, g_lpFolderData[j].m_lpTitle)==0)
+ fname = g_lpFolderData[j].short_name;
+
+ if (fname == NULL)
+ return;
+
+ char filename[MAX_PATH];
+ snprintf(filename, std::size(filename), "%s\\%s.ini", GetFolderDir(), fname);
+ wchar_t *temp = ui_wstring_from_utf8(GetFolderDir());
+ CreateDirectory(temp, NULL);
+ free(temp);
+ FILE *f = fopen(filename, "w");
+
+ if (f == NULL)
+ return;
+
+ fprintf(f, "[FOLDER_SETTINGS]\n");
+ fprintf(f, "RootFolderIcon custom\n");
+ fprintf(f, "SubFolderIcon custom\n");
+
+ /* need to loop over all our TREEFOLDERs--first the root one, then each child.
+ start with the root */
+ TREEFOLDER *folder_data = lpFolder;
+ fprintf(f, "\n[ROOT_FOLDER]\n");
+
+ for (int i = 0; i < driver_list::total(); i++)
+ if (TestBit(folder_data->m_lpGameBits, i))
+ fprintf(f, "%s\n", driver_list::driver(i).name);
- for (jj = 0; jj < nGames; jj++)
+ /* look through the custom folders for ones with our root as parent */
+ for (int jj = 0; jj < numFolders; jj++)
{
- gamedrv = &driver_list::driver(jj);
- /* Allocate machine config */
- machine_config config(*gamedrv,MameUIGlobal());
+ folder_data = treeFolders[jj];
- if (isDriverVector(&config))
- sprintf(Screen, "Vector");
- else
+ if (folder_data->m_nParent >= 0 && treeFolders[folder_data->m_nParent] == lpFolder)
{
- screen_device_enumerator iter(config.root_device());
- const screen_device *screen = iter.first();
- if (screen == NULL)
- strcpy(Screen, "Screenless Game");
- else
- {
- for (screen_device &screen : screen_device_enumerator(config.root_device()))
- {
- sprintf(Screen,"%f Hz", ATTOSECONDS_TO_HZ(screen.refresh_attoseconds()));
+ fprintf(f, "\n[%s]\n", folder_data->m_lpTitle);
- // look for an existant screen treefolder for this game
- // (likely to be the previous one, so start at the end)
- for (i=numFolders-1;i>=start_folder;i--)
- {
- if (strcmp(treeFolders[i]->m_lpTitle, Screen) == 0)
- {
- AddGame(treeFolders[i],jj);
- break;
- }
- }
- if (i == start_folder-1)
- {
- // nope, it's a screen we haven't seen before, make it.
- LPTREEFOLDER lpTemp = NewFolder(Screen, next_folder_id++, parent_index, IDI_SCREEN, GetFolderFlags(numFolders));
- ExtraFolderData[next_folder_id] = (EXFOLDERDATA*)malloc(sizeof(EXFOLDERDATA));
- memset(ExtraFolderData[next_folder_id], 0, sizeof(EXFOLDERDATA));
-
- ExtraFolderData[next_folder_id]->m_nFolderId = next_folder_id;
- ExtraFolderData[next_folder_id]->m_nIconId = IDI_SCREEN;
- ExtraFolderData[next_folder_id]->m_nParent = lpFolder->m_nFolderId;
- ExtraFolderData[next_folder_id]->m_nSubIconId = -1;
- strcpy( ExtraFolderData[next_folder_id]->m_szTitle, Screen );
- ExtraFolderData[next_folder_id++]->m_dwFlags = 0;
- AddFolder(lpTemp);
- AddGame(lpTemp,jj);
- }
- }
- }
+ for (int i = 0; i < driver_list::total(); i++)
+ if (TestBit(folder_data->m_lpGameBits, i))
+ fprintf(f, "%s\n", driver_list::driver(i).name);
}
}
- const char *fname = "Refresh";
- SaveExternalFolders(parent_index, fname);
+
+ fclose(f);
}
+// creates child folders of all the top level folders, including custom ones
+void CreateAllChildFolders(void)
+{
+ int num_top_level_folders = numFolders;
+
+ for (int i = 0; i < num_top_level_folders; i++)
+ {
+ LPTREEFOLDER lpFolder = treeFolders[i];
+ LPCFOLDERDATA lpFolderData = NULL;
+
+ for (int j = 0; g_lpFolderData[j].m_lpTitle; j++)
+ {
+ if (g_lpFolderData[j].m_nFolderId == lpFolder->m_nFolderId)
+ {
+ lpFolderData = &g_lpFolderData[j];
+ break;
+ }
+ }
-#pragma GCC diagnostic ignored "-Wunused-but-set-variable"
+ if (lpFolderData)
+ {
+ if (lpFolderData->m_pfnCreateFolders)
+ lpFolderData->m_pfnCreateFolders(i);
+ }
+ else
+ {
+ if ((lpFolder->m_dwFlags & F_CUSTOM) == 0)
+ continue;
+
+ // load the extra folder files, which also adds children
+ if (TryAddExtraFolderAndChildren(i) == false)
+ lpFolder->m_nFolderId = FOLDER_NONE;
+ }
+ }
+}
// adds these folders to the treeview
void ResetTreeViewFolders(void)
{
HWND hTreeView = GetTreeView();
+ TVITEM tvi;
+ TVINSERTSTRUCT tvs;
// currently "cached" parent
- HTREEITEM shti, hti_parent = NULL;
+ HTREEITEM hti_parent = NULL;
int index_parent = -1;
- BOOL res = TreeView_DeleteAllItems(hTreeView);
-
- //printf("Adding folders to tree ui indices %i to %i\n",start_index,end_index);
-
- TVINSERTSTRUCT tvs;
- tvs.hInsertAfter = TVI_SORT;
+ (void)TreeView_DeleteAllItems(hTreeView);
+ tvs.hInsertAfter = TVI_LAST; // main items inserted according to g_folderData[] array
- TVITEM tvi;
- for (int i=0; i<numFolders; i++)
+ for (int i = 0; i < numFolders; i++)
{
LPTREEFOLDER lpFolder = treeFolders[i];
if (lpFolder->m_nParent == -1)
{
if (lpFolder->m_nFolderId < MAX_FOLDERS)
+ {
// it's a built in folder, let's see if we should show it
if (GetShowFolder(lpFolder->m_nFolderId) == false)
continue;
+ }
tvi.mask = TVIF_TEXT | TVIF_PARAM | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
tvs.hParent = TVI_ROOT;
@@ -1492,15 +1252,14 @@ void ResetTreeViewFolders(void)
// Add root branch
hti_parent = TreeView_InsertItem(hTreeView, &tvs);
-
continue;
}
// not a top level branch, so look for parent
if (treeFolders[i]->m_nParent != index_parent)
{
-
hti_parent = TreeView_GetRoot(hTreeView);
+
while (1)
{
if (hti_parent == NULL)
@@ -1510,11 +1269,13 @@ void ResetTreeViewFolders(void)
tvi.hItem = hti_parent;
tvi.mask = TVIF_PARAM;
- res = TreeView_GetItem(hTreeView,&tvi);
+
+ (void)TreeView_GetItem(hTreeView, &tvi);
+
if (((LPTREEFOLDER)tvi.lParam) == treeFolders[treeFolders[i]->m_nParent])
break;
- hti_parent = TreeView_GetNextSibling(hTreeView,hti_parent);
+ hti_parent = TreeView_GetNextSibling(hTreeView, hti_parent);
}
// if parent is not shown, then don't show the child either obviously!
@@ -1533,50 +1294,49 @@ void ResetTreeViewFolders(void)
tvs.item = tvi;
// Add it to this tree branch
- shti = TreeView_InsertItem(hTreeView, &tvs); // for current child branches
+ tvs.hInsertAfter = TVI_SORT; // sub items always sorted
+ (void)TreeView_InsertItem(hTreeView, &tvs);
+ tvs.hInsertAfter = TVI_LAST; // restore for next main item
}
}
-#pragma GCC diagnostic error "-Wunused-but-set-variable"
void SelectTreeViewFolder(int folder_id)
{
- BOOL res = false;
HWND hTreeView = GetTreeView();
- HTREEITEM hti;
+ HTREEITEM hti = TreeView_GetRoot(hTreeView);
TVITEM tvi;
- memset(&tvi,0,sizeof(tvi));
- hti = TreeView_GetRoot(hTreeView);
+ memset(&tvi, 0, sizeof(TVITEM));
while (hti != NULL)
{
- HTREEITEM hti_next;
-
tvi.hItem = hti;
tvi.mask = TVIF_PARAM;
- res = TreeView_GetItem(hTreeView,&tvi);
- if (tvi.lParam)
+ (void)TreeView_GetItem(hTreeView, &tvi);
+
+ if (((LPTREEFOLDER)tvi.lParam)->m_nFolderId == folder_id)
{
- if (((LPTREEFOLDER)tvi.lParam)->m_nFolderId == folder_id)
- {
- res = TreeView_SelectItem(hTreeView,tvi.hItem);
- SetCurrentFolder((LPTREEFOLDER)tvi.lParam);
- return;
- }
+ (void)TreeView_SelectItem(hTreeView,tvi.hItem);
+ SetCurrentFolder((LPTREEFOLDER)tvi.lParam);
+ return;
}
- hti_next = TreeView_GetChild(hTreeView,hti);
+ HTREEITEM hti_next = TreeView_GetChild(hTreeView, hti);
+
if (hti_next == NULL)
{
- hti_next = TreeView_GetNextSibling(hTreeView,hti);
+ hti_next = TreeView_GetNextSibling(hTreeView, hti);
+
if (hti_next == NULL)
{
- hti_next = TreeView_GetParent(hTreeView,hti);
+ hti_next = TreeView_GetParent(hTreeView, hti);
+
if (hti_next != NULL)
- hti_next = TreeView_GetNextSibling(hTreeView,hti_next);
+ hti_next = TreeView_GetNextSibling(hTreeView, hti_next);
}
}
+
hti = hti_next;
}
@@ -1584,10 +1344,11 @@ void SelectTreeViewFolder(int folder_id)
// make sure we select something
tvi.hItem = TreeView_GetRoot(hTreeView);
tvi.mask = TVIF_PARAM;
- res = TreeView_GetItem(hTreeView,&tvi);
- res = TreeView_SelectItem(hTreeView,tvi.hItem);
+
+ (void)TreeView_GetItem(hTreeView, &tvi);
+ (void)TreeView_SelectItem(hTreeView, tvi.hItem);
SetCurrentFolder((LPTREEFOLDER)tvi.lParam);
- res++;
+
}
/*
@@ -1595,8 +1356,18 @@ void SelectTreeViewFolder(int folder_id)
* Currently only true for FOLDER_VECTOR and children
* of FOLDER_SOURCE.
*/
-static BOOL FolderHasIni(LPTREEFOLDER lpFolder)
+static bool FolderHasIni(LPTREEFOLDER lpFolder)
{
+#if 0
+ if (FOLDER_RASTER == lpFolder->m_nFolderId || FOLDER_VECTOR == lpFolder->m_nFolderId ||
+ FOLDER_VERTICAL == lpFolder->m_nFolderId || FOLDER_HORIZONTAL == lpFolder->m_nFolderId)
+ return true;
+
+ if (lpFolder->m_nParent != -1 && FOLDER_SOURCE == treeFolders[lpFolder->m_nParent]->m_nFolderId)
+ return true;
+
+ return false;
+#endif
LPCFOLDERDATA data = FindFilter(lpFolder->m_nFolderId);
if (data)
if (data->m_opttype < OPTIONS_MAX)
@@ -1609,21 +1380,25 @@ static BOOL FolderHasIni(LPTREEFOLDER lpFolder)
}
/* Add a folder to the list. Does not allocate */
-static BOOL AddFolder(LPTREEFOLDER lpFolder)
+static bool AddFolder(LPTREEFOLDER lpFolder)
{
TREEFOLDER **tmpTree = NULL;
UINT oldFolderArrayLength = folderArrayLength;
+
if (numFolders + 1 >= folderArrayLength)
{
folderArrayLength += 500;
tmpTree = (TREEFOLDER **)malloc(sizeof(TREEFOLDER **) * folderArrayLength);
- memcpy(tmpTree,treeFolders,sizeof(TREEFOLDER **) * oldFolderArrayLength);
- if (treeFolders) free(treeFolders);
+ memcpy(tmpTree, treeFolders, sizeof(TREEFOLDER **) * oldFolderArrayLength);
+
+ if (treeFolders)
+ free(treeFolders);
+
treeFolders = tmpTree;
}
/* Is there an folder.ini that can be edited? */
- if (FolderHasIni(lpFolder))
+ if (FolderHasIni(lpFolder))
lpFolder->m_dwFlags |= F_INIEDIT;
treeFolders[numFolders] = lpFolder;
@@ -1635,9 +1410,9 @@ static BOOL AddFolder(LPTREEFOLDER lpFolder)
static LPTREEFOLDER NewFolder(const char *lpTitle, UINT nFolderId, int nParent, UINT nIconId, DWORD dwFlags)
{
LPTREEFOLDER lpFolder = (LPTREEFOLDER)malloc(sizeof(TREEFOLDER));
- memset(lpFolder, '\0', sizeof (TREEFOLDER));
- lpFolder->m_lpTitle = (LPSTR)malloc(strlen(lpTitle) + 1);
- strcpy((char *)lpFolder->m_lpTitle,lpTitle);
+ memset(lpFolder, 0, sizeof(TREEFOLDER));
+ lpFolder->m_lpTitle = (char *)malloc(strlen(lpTitle) + 1);
+ strcpy((char *)lpFolder->m_lpTitle, lpTitle);
lpFolder->m_lptTitle = ui_wstring_from_utf8(lpFolder->m_lpTitle);
lpFolder->m_lpGameBits = NewBits(driver_list::total());
lpFolder->m_nFolderId = nFolderId;
@@ -1657,21 +1432,22 @@ static void DeleteFolder(LPTREEFOLDER lpFolder)
DeleteBits(lpFolder->m_lpGameBits);
lpFolder->m_lpGameBits = 0;
}
+
free(lpFolder->m_lptTitle);
lpFolder->m_lptTitle = 0;
free(lpFolder->m_lpTitle);
lpFolder->m_lpTitle = 0;
free(lpFolder);
- lpFolder = 0;
}
}
/* Can be called to re-initialize the array of treeFolders */
-BOOL InitFolders(void)
+static bool InitFolders(void)
{
int i = 0;
- DWORD dwFolderFlags;
- if (treeFolders != NULL)
+ DWORD dwFolderFlags = 0;
+
+ if (treeFolders)
{
for (i = numFolders - 1; i >= 0; i--)
{
@@ -1680,94 +1456,52 @@ BOOL InitFolders(void)
numFolders--;
}
}
+
numFolders = 0;
+
if (folderArrayLength == 0)
{
folderArrayLength = 200;
treeFolders = (TREEFOLDER **)malloc(sizeof(TREEFOLDER **) * folderArrayLength);
+
if (!treeFolders)
{
folderArrayLength = 0;
return 0;
}
else
- memset(treeFolders,'\0', sizeof(TREEFOLDER **) * folderArrayLength);
+ memset(treeFolders, 0, sizeof(TREEFOLDER **) * folderArrayLength);
}
+
// built-in top level folders
for (i = 0; g_lpFolderData[i].m_lpTitle; i++)
{
- if (RequiredDriverCache() || (!RequiredDriverCache() && !g_lpFolderData[i].m_process))
- {
- LPCFOLDERDATA fData = &g_lpFolderData[i];
- /* get the saved folder flags */
- dwFolderFlags = GetFolderFlags(numFolders);
- /* create the folder */
- AddFolder(NewFolder(fData->m_lpTitle, fData->m_nFolderId, -1, fData->m_nIconId, dwFolderFlags));
- }
+ LPCFOLDERDATA fData = &g_lpFolderData[i];
+ /* get the saved folder flags */
+ dwFolderFlags = GetFolderFlags(numFolders);
+ /* create the folder */
+ AddFolder(NewFolder(fData->m_lpTitle, fData->m_nFolderId, -1, fData->m_nIconId, dwFolderFlags));
}
numExtraFolders = InitExtraFolders();
for (i = 0; i < numExtraFolders; i++)
{
- LPEXFOLDERDATA fExData = ExtraFolderData[i];
+ LPEXFOLDERDATA fExData = ExtraFolderData[i];
// OR in the saved folder flags
dwFolderFlags = fExData->m_dwFlags | GetFolderFlags(numFolders);
- // create the folder, but if we are building the cache, the name must not be a pre-built one
+ // create the folder
int k = 0;
- if (RequiredDriverCache())
+ //if (RequiredDriverCache())
for (int j = 0; g_lpFolderData[j].m_lpTitle; j++)
- if (strcmp(fExData->m_szTitle, g_lpFolderData[j].m_lpTitle)==0)
+ if (strcmp(fExData->m_szTitle, g_lpFolderData[j].short_name)==0)
k++;
if (k == 0)
- AddFolder(NewFolder(fExData->m_szTitle,fExData->m_nFolderId,fExData->m_nParent, fExData->m_nIconId,dwFolderFlags));
- }
-
-// creates child folders of all the top level folders, including custom ones
- int num_top_level_folders = numFolders;
-
- for (int i = 0; i < num_top_level_folders; i++)
- {
- LPTREEFOLDER lpFolder = treeFolders[i];
- LPCFOLDERDATA lpFolderData = NULL;
-
- for (int j = 0; g_lpFolderData[j].m_lpTitle; j++)
- {
- if (g_lpFolderData[j].m_nFolderId == lpFolder->m_nFolderId)
- {
- lpFolderData = &g_lpFolderData[j];
- break;
- }
- }
-
- if (lpFolderData)
- {
- if (lpFolderData->m_pfnCreateFolders)
- {
- if (RequiredDriverCache() && lpFolderData->m_process) // rebuild cache
- lpFolderData->m_pfnCreateFolders(i);
- else
- if (!lpFolderData->m_process) // build every time (CreateDeficiencyFolders)
- lpFolderData->m_pfnCreateFolders(i);
- }
- }
- else
- {
- if ((lpFolder->m_dwFlags & F_CUSTOM) == 0)
- {
- printf("Internal inconsistency with non-built-in folder, but not custom\n");
- continue;
- }
-
- //printf("Loading custom folder %i %i\n",i,lpFolder->m_nFolderId);
-
- // load the extra folder files, which also adds children
- if (TryAddExtraFolderAndChildren(i) == false)
- lpFolder->m_nFolderId = FOLDER_NONE;
- }
+ AddFolder(NewFolder(fExData->m_szTitle, fExData->m_nFolderId, fExData->m_nParent, fExData->m_nIconId, dwFolderFlags));
}
+ CreateAllChildFolders();
CreateTreeIcons();
ResetWhichGamesInFolders();
ResetTreeViewFolders();
@@ -1777,38 +1511,36 @@ BOOL InitFolders(void)
}
// create iconlist and Treeview control
-static BOOL CreateTreeIcons()
+static bool CreateTreeIcons(void)
{
- HICON hIcon;
- INT i;
- HINSTANCE hInst = GetModuleHandle(0);
-
+ HICON hIcon = NULL;
+ HINSTANCE hInst = GetModuleHandle(NULL);
int numIcons = ICON_MAX + numExtraIcons;
+
hTreeSmall = ImageList_Create (16, 16, ILC_COLORDDB | ILC_MASK, numIcons, numIcons);
- //printf("Trying to load %i normal icons\n",ICON_MAX);
- for (i = 0; i < ICON_MAX; i++)
+ for (int i = 0; i < ICON_MAX; i++)
{
hIcon = LoadIconFromFile(treeIconNames[i].lpName);
+
if (!hIcon)
hIcon = LoadIcon(hInst, MAKEINTRESOURCE(treeIconNames[i].nResourceID));
- if (ImageList_AddIcon (hTreeSmall, hIcon) == -1)
+ if (ImageList_AddIcon(hTreeSmall, hIcon) == -1)
{
- ErrorMsg("Error creating icon on regular folder, %i %i",i,hIcon != NULL);
+ ErrorMessageBox("Error creating icon on regular folder, %i %i", i, hIcon != NULL);
return false;
}
}
- //printf("Trying to load %i extra custom-folder icons\n",numExtraIcons);
- for (i = 0; i < numExtraIcons; i++)
+ for (int i = 0; i < numExtraIcons; i++)
{
if ((hIcon = LoadIconFromFile(ExtraFolderIcons[i])) == 0)
- hIcon = LoadIcon (hInst, MAKEINTRESOURCE(IDI_FOLDER));
+ hIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_FOLDER));
if (ImageList_AddIcon(hTreeSmall, hIcon) == -1)
{
- ErrorMsg("Error creating icon on extra folder, %i %i",i,hIcon != NULL);
+ ErrorMessageBox("Error creating icon on extra folder, %i %i", i, hIcon != NULL);
return false;
}
}
@@ -1816,25 +1548,22 @@ static BOOL CreateTreeIcons()
// Be sure that all the small icons were added.
if (ImageList_GetImageCount(hTreeSmall) < numIcons)
{
- ErrorMsg("Error with icon list--too few images. %i %i", ImageList_GetImageCount(hTreeSmall),numIcons);
+ ErrorMessageBox("Error with icon list--too few images. %i %i", ImageList_GetImageCount(hTreeSmall), numIcons);
return false;
}
// Be sure that all the small icons were added.
-
if (ImageList_GetImageCount (hTreeSmall) < ICON_MAX)
{
- ErrorMsg("Error with icon list--too few images. %i < %i", ImageList_GetImageCount(hTreeSmall),(INT)ICON_MAX);
+ ErrorMessageBox("Error with icon list--too few images. %i < %i", ImageList_GetImageCount(hTreeSmall), ICON_MAX);
return false;
}
// Associate the image lists with the list view control.
(void)TreeView_SetImageList(GetTreeView(), hTreeSmall, TVSIL_NORMAL);
-
return true;
}
-
static void TreeCtrlOnPaint(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
@@ -1979,7 +1708,7 @@ static LRESULT CALLBACK TreeWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM
}
/*
- * Filter code
+ * Filter code - should be moved to filter.c/filter.h
* Added 01/09/99 - MSH <mhaaland@hypertech.com>
*/
@@ -1997,138 +1726,133 @@ LPTREEFOLDER GetFolderByName(int nParentId, const char *pszFolderName)
{
//First Get the Parent TreeviewItem
//Enumerate Children
- for(int i = 0; i < numFolders/* ||treeFolders[i] != NULL*/; i++)
+ for (int i = 0; i < numFolders; i++)
{
if (!strcmp(treeFolders[i]->m_lpTitle, pszFolderName))
{
int nParent = treeFolders[i]->m_nParent;
+
if ((nParent >= 0) && treeFolders[nParent]->m_nFolderId == nParentId)
return treeFolders[i];
}
}
+
return NULL;
}
static int InitExtraFolders(void)
{
- struct stat stat_buffer;
- struct _finddata_t files;
- int i, count = 0;
- char * ext;
- char buf[2048];
- char curdir[MAX_PATH];
- const std::string t = dir_get_value(24);
- const char *dir = t.c_str();
- memset(ExtraFolderData, 0, (MAX_EXTRA_FOLDERS * MAX_EXTRA_SUBFOLDERS)* sizeof(LPEXFOLDERDATA));
+ WIN32_FIND_DATA FindFileData;
+ int count = 0;
+ char buf[256];
+ char path[MAX_PATH];
+ const char *dir = GetFolderDir();
- /* NPW 9-Feb-2003 - MSVC stat() doesn't like stat() called with an empty string */
- if (!dir)
- return 0; //dir = ".";
+ memset(ExtraFolderData, 0, (MAX_EXTRA_FOLDERS * MAX_EXTRA_SUBFOLDERS)* sizeof(LPEXFOLDERDATA));
// Why create the directory if it doesn't exist, just return 0 folders.
- if (stat(dir, &stat_buffer) != 0)
+ if (osd::directory::open(dir) == nullptr)
return 0;
- _getcwd(curdir, MAX_PATH);
-
- chdir(dir);
+ snprintf(path, std::size(path), "%s\\*.*", dir);
+ HANDLE hFind = winui2_find_first_file_utf8(path, &FindFileData);
- for (i = 0; i < MAX_EXTRA_FOLDERS; i++)
+ for (int i = 0; i < MAX_EXTRA_FOLDERS; i++)
+ {
ExtraFolderIcons[i] = NULL;
+ }
numExtraIcons = 0;
- intptr_t hLong = 0L;
-
- if ( (hLong = _findfirst("*.ini", &files)) == -1L )
- return 0;
- do
+ if (hFind != INVALID_HANDLE_VALUE)
{
- if ((files.attrib & _A_SUBDIR) == 0)
+ while (FindNextFile (hFind, &FindFileData) != 0)
{
- FILE *fp;
+ char *file = ui_utf8_from_wstring(FindFileData.cFileName);
+ char inifile[MAX_PATH];
- fp = fopen(files.name, "r");
- if (fp != NULL)
+ memset(&inifile, 0, sizeof(inifile));
+ snprintf(inifile, std::size(inifile), "%s\\%s", dir, file);
+ FILE *readfile = fopen(inifile, "r");
+
+ if (readfile != NULL)
{
int icon[2] = { 0, 0 };
- char *p, *name;
- while (fgets(buf, 256, fp))
+ while (fgets(buf, 256, readfile))
{
if (buf[0] == '[')
{
- p = strchr(buf, ']');
+ char *p = strchr(buf, ']');
+
if (p == NULL)
continue;
*p = '\0';
- name = &buf[1];
+ char *name = &buf[1];
+
if (!strcmp(name, "FOLDER_SETTINGS"))
{
- while (fgets(buf, 256, fp))
+ while (fgets(buf, 256, readfile))
{
name = strtok(buf, " =\r\n");
+
if (name == NULL)
break;
if (!strcmp(name, "RootFolderIcon"))
{
name = strtok(NULL, " =\r\n");
+
if (name != NULL)
SetExtraIcons(name, &icon[0]);
}
if (!strcmp(name, "SubFolderIcon"))
{
name = strtok(NULL, " =\r\n");
+
if (name != NULL)
SetExtraIcons(name, &icon[1]);
}
}
+
break;
}
}
}
- fclose(fp);
- strcpy(buf, files.name);
- ext = strrchr(buf, '.');
+ fclose(readfile);
+ strcpy(buf, file);
+ char *ext = strrchr(buf, '.');
+ free(file);
- if (ext && *(ext + 1) && (core_stricmp(ext + 1, "ini")==0))
+ if (ext && *(ext + 1) && !core_stricmp(ext + 1, "ini"))
{
ExtraFolderData[count] =(EXFOLDERDATA*) malloc(sizeof(EXFOLDERDATA));
+
if (ExtraFolderData[count])
{
*ext = '\0';
-
memset(ExtraFolderData[count], 0, sizeof(EXFOLDERDATA));
-
strncpy(ExtraFolderData[count]->m_szTitle, buf, 63);
- ExtraFolderData[count]->m_nFolderId = next_folder_id++;
- ExtraFolderData[count]->m_nParent = -1;
- ExtraFolderData[count]->m_dwFlags = F_CUSTOM;
- ExtraFolderData[count]->m_nIconId = icon[0] ? -icon[0] : IDI_FOLDER;
- ExtraFolderData[count]->m_nSubIconId = icon[1] ? -icon[1] : IDI_FOLDER;
- //printf("extra folder with icon %i, subicon %i\n",
- //ExtraFolderData[count]->m_nIconId,
- //ExtraFolderData[count]->m_nSubIconId);
+ ExtraFolderData[count]->m_nFolderId = next_folder_id++;
+ ExtraFolderData[count]->m_nParent = -1;
+ ExtraFolderData[count]->m_dwFlags = F_CUSTOM;
+ ExtraFolderData[count]->m_nIconId = icon[0] ? -icon[0] : IDI_FOLDER;
+ ExtraFolderData[count]->m_nSubIconId = icon[1] ? -icon[1] : IDI_FOLDER;
count++;
}
}
}
}
- } while( _findnext(hLong, &files) == 0);
+ }
- chdir(curdir);
- _findclose(hLong);
return count;
}
void FreeExtraFolders(void)
{
- int i;
-
- for (i = 0; i < numExtraFolders; i++)
+ for (int i = 0; i < numExtraFolders; i++)
{
if (ExtraFolderData[i])
{
@@ -2137,11 +1861,12 @@ void FreeExtraFolders(void)
}
}
- for (i = 0; i < numExtraIcons; i++)
+ for (int i = 0; i < numExtraIcons; i++)
+ {
free(ExtraFolderIcons[i]);
+ }
numExtraIcons = 0;
-
}
@@ -2153,6 +1878,7 @@ static void SetExtraIcons(char *name, int *id)
*p = '\0';
ExtraFolderIcons[numExtraIcons] = (char*)malloc(strlen(name) + 1);
+
if (ExtraFolderIcons[numExtraIcons])
{
*id = ICON_MAX + numExtraIcons;
@@ -2163,47 +1889,36 @@ static void SetExtraIcons(char *name, int *id)
// Called to add child folders of the top level extra folders already created
-BOOL TryAddExtraFolderAndChildren(int parent_index)
+bool TryAddExtraFolderAndChildren(int parent_index)
{
- FILE* fp = NULL;
char fname[MAX_PATH];
char readbuf[256];
- char *p;
- char *name;
- int i;
+ char *name = NULL;
LPTREEFOLDER lpTemp = NULL;
LPTREEFOLDER lpFolder = treeFolders[parent_index];
int current_id = lpFolder->m_nFolderId;
-
int id = lpFolder->m_nFolderId - MAX_FOLDERS;
-
- /* "folder\title.ini" */
-
- const std::string t = dir_get_value(24);
- sprintf( fname, "%s\\%s.ini", t.c_str(), ExtraFolderData[id]->m_szTitle);
-
- fp = fopen(fname, "r");
- if (fp == NULL)
+ snprintf(fname, std::size(fname), "%s\\%s.ini", GetFolderDir(), ExtraFolderData[id]->m_szTitle);
+ FILE *f = fopen(fname, "r");
+
+ if (f == NULL)
return false;
- while ( fgets(readbuf, 256, fp) )
+ while (fgets(readbuf, 256, f))
{
/* do we have [...] ? */
-
if (readbuf[0] == '[')
{
- p = strchr(readbuf, ']');
+ char *p = strchr(readbuf, ']');
+
if (p == NULL)
- {
continue;
- }
*p = '\0';
name = &readbuf[1];
/* is it [FOLDER_SETTINGS]? */
-
if (strcmp(name, "FOLDER_SETTINGS") == 0)
{
current_id = -1;
@@ -2211,32 +1926,26 @@ BOOL TryAddExtraFolderAndChildren(int parent_index)
}
else
{
- /* it it [ROOT_FOLDER]? */
-
+ /* is it [ROOT_FOLDER]? */
if (!strcmp(name, "ROOT_FOLDER"))
{
current_id = lpFolder->m_nFolderId;
lpTemp = lpFolder;
-
}
else
{
/* must be [folder name] */
-
current_id = next_folder_id++;
/* create a new folder with this name,
- and the flags for this folder as read from the registry */
- lpTemp = NewFolder(name,current_id,parent_index,
- ExtraFolderData[id]->m_nSubIconId,
- GetFolderFlags(numFolders) | F_CUSTOM);
+ and the flags for this folder as read from the registry */
+ lpTemp = NewFolder(name, current_id, parent_index, ExtraFolderData[id]->m_nSubIconId, GetFolderFlags(numFolders) | F_CUSTOM);
ExtraFolderData[current_id] = (EXFOLDERDATA*)malloc(sizeof(EXFOLDERDATA));
memset(ExtraFolderData[current_id], 0, sizeof(EXFOLDERDATA));
-
ExtraFolderData[current_id]->m_nFolderId = current_id - MAX_EXTRA_FOLDERS;
ExtraFolderData[current_id]->m_nIconId = ExtraFolderData[id]->m_nSubIconId;
ExtraFolderData[current_id]->m_nParent = ExtraFolderData[id]->m_nFolderId;
ExtraFolderData[current_id]->m_nSubIconId = -1;
- strcpy( ExtraFolderData[current_id]->m_szTitle, name );
+ strcpy(ExtraFolderData[current_id]->m_szTitle, name);
ExtraFolderData[current_id]->m_dwFlags = ExtraFolderData[id]->m_dwFlags;
AddFolder(lpTemp);
}
@@ -2245,8 +1954,8 @@ BOOL TryAddExtraFolderAndChildren(int parent_index)
else if (current_id != -1)
{
/* string on a line by itself -- game name */
-
name = strtok(readbuf, " \t\r\n");
+
if (name == NULL)
{
current_id = -1;
@@ -2254,22 +1963,21 @@ BOOL TryAddExtraFolderAndChildren(int parent_index)
}
/* IMPORTANT: This assumes that all driver names are lowercase! */
- for (i = 0; name[i]; i++)
+ for (int i = 0; name[i]; i++)
name[i] = tolower(name[i]);
if (lpTemp == NULL)
{
- ErrorMsg("Error parsing %s: missing [folder name] or [ROOT_FOLDER]", fname);
+ ErrorMessageBox("Error parsing %s: missing [folder name] or [ROOT_FOLDER]", fname);
current_id = lpFolder->m_nFolderId;
lpTemp = lpFolder;
}
- AddGame(lpTemp,GetGameNameIndex(name));
+
+ AddGame(lpTemp, GetGameNameIndex(name));
}
}
- if ( fp )
- fclose( fp );
-
+ fclose(f);
return true;
}
@@ -2280,39 +1988,39 @@ void GetFolders(TREEFOLDER ***folders,int *num_folders)
*num_folders = numFolders;
}
-static BOOL TryRenameCustomFolderIni(LPTREEFOLDER lpFolder, const char *old_name, const char *new_name)
+static bool TryRenameCustomFolderIni(LPTREEFOLDER lpFolder, const char *old_name, const char *new_name)
{
char filename[MAX_PATH];
char new_filename[MAX_PATH];
- LPTREEFOLDER lpParent = NULL;
- string ini_dir = GetIniDir();
- const char* inidir = ini_dir.c_str();
+
if (lpFolder->m_nParent >= 0)
{
//it is a custom SubFolder
- lpParent = GetFolder( lpFolder->m_nParent );
- if( lpParent )
+ LPTREEFOLDER lpParent = GetFolder(lpFolder->m_nParent);
+
+ if(lpParent)
{
- snprintf(filename,std::size(filename),"%s\\%s\\%s.ini",inidir,lpParent->m_lpTitle, old_name );
- snprintf(new_filename,std::size(new_filename),"%s\\%s\\%s.ini",inidir,lpParent->m_lpTitle, new_name );
- win_move_file_utf8(filename,new_filename);
+ snprintf(filename, std::size(filename), "%s\\%s\\%s.ini", GetIniDir().c_str(), lpParent->m_lpTitle, old_name);
+ snprintf(new_filename, std::size(new_filename), "%s\\%s\\%s.ini", GetIniDir().c_str(), lpParent->m_lpTitle, new_name);
+ winui_move_file_utf8(filename, new_filename);
}
}
else
{
//Rename the File, if it exists
- snprintf(filename,std::size(filename),"%s\\%s.ini",inidir,old_name );
- snprintf(new_filename,std::size(new_filename),"%s\\%s.ini",inidir, new_name );
- win_move_file_utf8(filename,new_filename);
+ snprintf(filename, std::size(filename), "%s\\%s.ini", GetIniDir().c_str(), old_name);
+ snprintf(new_filename, std::size(new_filename), "%s\\%s.ini", GetIniDir().c_str(), new_name);
+ winui_move_file_utf8(filename, new_filename);
//Rename the Directory, if it exists
- snprintf(filename,std::size(filename),"%s\\%s",inidir,old_name );
- snprintf(new_filename,std::size(new_filename),"%s\\%s",inidir, new_name );
- win_move_file_utf8(filename,new_filename);
+ snprintf(filename, std::size(filename), "%s\\%s", GetIniDir().c_str(), old_name);
+ snprintf(new_filename, std::size(new_filename), "%s\\%s", GetIniDir().c_str(), new_name);
+ winui_move_file_utf8(filename, new_filename);
}
+
return true;
}
-BOOL TryRenameCustomFolder(LPTREEFOLDER lpFolder, const char *new_name)
+bool TryRenameCustomFolder(LPTREEFOLDER lpFolder, const char *new_name)
{
char filename[MAX_PATH];
char new_filename[MAX_PATH];
@@ -2320,13 +2028,11 @@ BOOL TryRenameCustomFolder(LPTREEFOLDER lpFolder, const char *new_name)
if (lpFolder->m_nParent >= 0)
{
// a child extra folder was renamed, so do the rename and save the parent
-
// save old title
char *old_title = lpFolder->m_lpTitle;
-
// set new title
lpFolder->m_lpTitle = (char *)malloc(strlen(new_name) + 1);
- strcpy(lpFolder->m_lpTitle,new_name);
+ strcpy(lpFolder->m_lpTitle, new_name);
// try to save
if (TrySaveExtraFolder(lpFolder) == false)
@@ -2336,6 +2042,7 @@ BOOL TryRenameCustomFolder(LPTREEFOLDER lpFolder, const char *new_name)
lpFolder->m_lpTitle = old_title;
return false;
}
+
TryRenameCustomFolderIni(lpFolder, old_title, new_name);
// successful, so free old title
free(old_title);
@@ -2343,72 +2050,65 @@ BOOL TryRenameCustomFolder(LPTREEFOLDER lpFolder, const char *new_name)
}
// a parent extra folder was renamed, so rename the file
-
- const std::string t = dir_get_value(24);
- snprintf(new_filename,std::size(new_filename),"%s\\%s.ini", t.c_str(), new_name);
- snprintf(filename,std::size(filename),"%s\\%s.ini", t.c_str(), lpFolder->m_lpTitle);
-
- BOOL retval = win_move_file_utf8(filename,new_filename);
+ snprintf(new_filename, std::size(new_filename), "%s\\%s.ini", GetFolderDir(), new_name);
+ snprintf(filename, std::size(filename), "%s\\%s.ini", GetFolderDir(), lpFolder->m_lpTitle);
+ bool retval = winui_move_file_utf8(filename, new_filename);
if (retval)
{
TryRenameCustomFolderIni(lpFolder, lpFolder->m_lpTitle, new_name);
free(lpFolder->m_lpTitle);
lpFolder->m_lpTitle = (char *)malloc(strlen(new_name) + 1);
- strcpy(lpFolder->m_lpTitle,new_name);
+ strcpy(lpFolder->m_lpTitle, new_name);
}
else
- {
- char buf[2048];
- snprintf(buf,std::size(buf),"Error while renaming custom file %s to %s", filename,new_filename);
- win_message_box_utf8(GetMainWindow(), buf, MAMEUINAME, MB_OK | MB_ICONERROR);
- }
+ ErrorMessageBox("Error while renaming custom file %s to %s", filename, new_filename);
+
return retval;
}
-void AddToCustomFolder(LPTREEFOLDER lpFolder,int driver_index)
+void AddToCustomFolder(LPTREEFOLDER lpFolder, int driver_index)
{
if ((lpFolder->m_dwFlags & F_CUSTOM) == 0)
{
- win_message_box_utf8(GetMainWindow(),"Unable to add game to non-custom folder", MAMEUINAME,MB_OK | MB_ICONERROR);
+ ErrorMessageBox("Unable to add game to non-custom folder");
return;
}
- if (TestBit(lpFolder->m_lpGameBits,driver_index) == 0)
+ if (TestBit(lpFolder->m_lpGameBits, driver_index) == 0)
{
- AddGame(lpFolder,driver_index);
+ AddGame(lpFolder, driver_index);
+
if (TrySaveExtraFolder(lpFolder) == false)
- RemoveGame(lpFolder,driver_index); // undo on error
+ RemoveGame(lpFolder, driver_index); // undo on error
}
}
-void RemoveFromCustomFolder(LPTREEFOLDER lpFolder,int driver_index)
+void RemoveFromCustomFolder(LPTREEFOLDER lpFolder, int driver_index)
{
if ((lpFolder->m_dwFlags & F_CUSTOM) == 0)
{
- win_message_box_utf8(GetMainWindow(),"Unable to remove game from non-custom folder", MAMEUINAME,MB_OK | MB_ICONERROR);
+ ErrorMessageBox("Unable to remove game from non-custom folder");
return;
}
- if (TestBit(lpFolder->m_lpGameBits,driver_index) != 0)
+ if (TestBit(lpFolder->m_lpGameBits, driver_index) != 0)
{
- RemoveGame(lpFolder,driver_index);
+ RemoveGame(lpFolder, driver_index);
+
if (TrySaveExtraFolder(lpFolder) == false)
- AddGame(lpFolder,driver_index); // undo on error
+ AddGame(lpFolder, driver_index); // undo on error
}
}
-BOOL TrySaveExtraFolder(LPTREEFOLDER lpFolder)
+bool TrySaveExtraFolder(LPTREEFOLDER lpFolder)
{
char fname[MAX_PATH];
- FILE *fp;
- BOOL error = false;
- int i,j;
-
+ bool error = false;
LPTREEFOLDER root_folder = NULL;
LPEXFOLDERDATA extra_folder = NULL;
- for (i=0; i<numExtraFolders; i++)
+ for (int i = 0; i < numExtraFolders; i++)
{
if (ExtraFolderData[i]->m_nFolderId == lpFolder->m_nFolderId)
{
@@ -2417,8 +2117,7 @@ BOOL TrySaveExtraFolder(LPTREEFOLDER lpFolder)
break;
}
- if (lpFolder->m_nParent >= 0 &&
- ExtraFolderData[i]->m_nFolderId == treeFolders[lpFolder->m_nParent]->m_nFolderId)
+ if (lpFolder->m_nParent >= 0 && ExtraFolderData[i]->m_nFolderId == treeFolders[lpFolder->m_nParent]->m_nFolderId)
{
root_folder = treeFolders[lpFolder->m_nParent];
extra_folder = ExtraFolderData[i];
@@ -2428,75 +2127,65 @@ BOOL TrySaveExtraFolder(LPTREEFOLDER lpFolder)
if (extra_folder == NULL || root_folder == NULL)
{
- MessageBox(GetMainWindow(), TEXT("Error finding custom file name to save"), TEXT(MAMEUINAME), MB_OK | MB_ICONERROR);
+ ErrorMessageBox("Error finding custom file name to save");
return false;
}
- /* "folder\title.ini" */
- const std::string t = dir_get_value(24);
- snprintf( fname, sizeof(fname), "%s\\%s.ini", t.c_str(), extra_folder->m_szTitle);
+ snprintf(fname, std::size(fname), "%s\\%s.ini", GetFolderDir(), extra_folder->m_szTitle);
+ wchar_t *temp = ui_wstring_from_utf8(GetFolderDir());
+ CreateDirectory(temp, NULL);
+ free(temp);
+ FILE *f = fopen(fname, "w");
- fp = fopen(fname, "wt");
- if (fp == NULL)
+ if (f == NULL)
error = true;
else
{
TREEFOLDER *folder_data;
- fprintf(fp,"[FOLDER_SETTINGS]\n");
+ fprintf(f, "[FOLDER_SETTINGS]\n");
+
// negative values for icons means it's custom, so save 'em
if (extra_folder->m_nIconId < 0)
- {
- fprintf(fp, "RootFolderIcon %s\n", ExtraFolderIcons[(-extra_folder->m_nIconId) - ICON_MAX]);
- }
- if (extra_folder->m_nSubIconId < 0)
- {
- fprintf(fp,"SubFolderIcon %s\n", ExtraFolderIcons[(-extra_folder->m_nSubIconId) - ICON_MAX]);
- }
+ fprintf(f, "RootFolderIcon %s\n", ExtraFolderIcons[(-extra_folder->m_nIconId) - ICON_MAX]);
- /* need to loop over all our TREEFOLDERs--first the root one, then each child. Start with the root */
+ if (extra_folder->m_nSubIconId < 0)
+ fprintf(f, "SubFolderIcon %s\n", ExtraFolderIcons[(-extra_folder->m_nSubIconId) - ICON_MAX]);
+ /* need to loop over all our TREEFOLDERs--first the root one, then each child.
+ start with the root */
folder_data = root_folder;
+ fprintf(f, "\n[ROOT_FOLDER]\n");
- fprintf(fp,"\n[ROOT_FOLDER]\n");
-
- for (i=0;i<driver_list::total();i++)
+ for (int i = 0; i < driver_list::total(); i++)
{
if (TestBit(folder_data->m_lpGameBits, i))
- {
- fprintf(fp,"%s\n",driver_list::driver(i).name);
- }
+ fprintf(f, "%s\n", driver_list::driver(i).name);
}
/* look through the custom folders for ones with our root as parent */
- for (j=0;j<numFolders;j++)
+ for (int j = 0; j < numFolders; j++)
{
folder_data = treeFolders[j];
- if (folder_data->m_nParent >= 0 &&
- treeFolders[folder_data->m_nParent] == root_folder)
+ if (folder_data->m_nParent >= 0 && treeFolders[folder_data->m_nParent] == root_folder)
{
- fprintf(fp,"\n[%s]\n",folder_data->m_lpTitle);
+ fprintf(f, "\n[%s]\n", folder_data->m_lpTitle);
- for (i=0;i<driver_list::total();i++)
+ for (int i = 0; i < driver_list::total(); i++)
{
if (TestBit(folder_data->m_lpGameBits, i))
- {
- fprintf(fp,"%s\n",driver_list::driver(i).name);
- }
+ fprintf(f, "%s\n", driver_list::driver(i).name);
}
}
}
- if (fclose(fp) != 0)
- error = true;
+
+ fclose(f);
}
if (error)
- {
- char buf[500];
- snprintf(buf,std::size(buf),"Error while saving custom file %s",fname);
- win_message_box_utf8(GetMainWindow(), buf, MAMEUINAME, MB_OK | MB_ICONERROR);
- }
+ ErrorMessageBox("Error while saving custom file %s", fname);
+
return !error;
}
@@ -2510,79 +2199,26 @@ int GetTreeViewIconIndex(int icon_id)
if (icon_id < 0)
return -icon_id;
- for (int i = 0; i < sizeof(treeIconNames) / sizeof(treeIconNames[0]); i++)
+ for (int i = 0; i < std::size(treeIconNames); i++)
+ {
if (icon_id == treeIconNames[i].nResourceID)
return i;
+ }
return -1;
}
-
-static void SaveExternalFolders(int parent_index, const char *fname)
+#if 0
+bool FilterAvailable(int driver_index)
{
- string val = dir_get_value(24);
- char s[val.size()+1];
- strcpy(s, val.c_str());
- char *fdir = strtok(s, ";"); // get first dir
-
- // create directory if needed
- wchar_t *temp = ui_wstring_from_utf8(fdir);
- BOOL res = CreateDirectory(temp, NULL);
- free(temp);
- if (!res)
- {
- if (GetLastError() == ERROR_PATH_NOT_FOUND)
- {
- printf("SaveExternalFolders: Unable to create the directory \"%s\".\n",fdir);
- return;
- }
- }
-
- // create/truncate file
- string filename = fdir + string("\\") + fname + string(".ini");
- FILE *f = fopen(filename.c_str(), "w");
- if (f == NULL)
- {
- printf("SaveExternalFolders: Unable to open file %s for writing.\n",filename.c_str());
- return;
- }
-
- // Populate the file
- fprintf(f, "[FOLDER_SETTINGS]\n");
- fprintf(f, "RootFolderIcon custom\n");
- fprintf(f, "SubFolderIcon custom\n");
-
- /* need to loop over all our TREEFOLDERs--first the root one, then each child.
- start with the root */
- LPTREEFOLDER lpFolder = treeFolders[parent_index];
- TREEFOLDER *folder_data = lpFolder;
- fprintf(f, "\n[ROOT_FOLDER]\n");
-
- int i;
- for (i = 0; i < driver_list::total(); i++)
+ if (!DriverUsesRoms(driver_index))
{
- if (TestBit(folder_data->m_lpGameBits, i))
- fprintf(f, "%s\n", GetGameName(i).c_str());
- }
-
- /* look through the custom folders for ones with our root as parent */
- for (int jj = 0; jj < numFolders; jj++)
- {
- folder_data = treeFolders[jj];
-
- if (folder_data->m_nParent >= 0 && treeFolders[folder_data->m_nParent] == lpFolder)
- {
- fprintf(f, "\n[%s]\n", folder_data->m_lpTitle);
-
- for (i = 0; i < driver_list::total(); i++)
- {
- if (TestBit(folder_data->m_lpGameBits, i))
- fprintf(f, "%s\n", GetGameName(i).c_str());
- }
- }
+ if (GetDisplayNoRomsGames())
+ return true;
+ else
+ return false;
}
- fclose(f);
- printf("SaveExternalFolders: Saved file %s.\n",filename.c_str());
+ return IsAuditResultYes(GetRomAuditResults(driver_index));
}
+#endif
-/* End of source file */
diff --git a/docs/release/src/osd/winui/treeview.h b/docs/release/src/osd/winui/treeview.h
index 7c95e1d2220..a61ee62fd0d 100644
--- a/docs/release/src/osd/winui/treeview.h
+++ b/docs/release/src/osd/winui/treeview.h
@@ -1,34 +1,12 @@
+// license:BSD-3-Clause
// For licensing and usage information, read docs/release/winui_license.txt
-//****************************************************************************
-// NOTE: ifdef MESS doesn't work here
+
#ifndef WINUI_TREEVIEW_H
#define WINUI_TREEVIEW_H
-/* corrections for commctrl.h */
-
-#if defined(__GNUC__)
-/* fix warning: cast does not match function type */
-#undef TreeView_InsertItem
-#define TreeView_InsertItem(w,i) (HTREEITEM)(LRESULT)(int)SendMessage((w),TVM_INSERTITEM,0,(LPARAM)(LPTV_INSERTSTRUCT)(i))
-
-#undef TreeView_SetImageList
-#define TreeView_SetImageList(w,h,i) (HIMAGELIST)(LRESULT)(int)SendMessage((w),TVM_SETIMAGELIST,i,(LPARAM)(HIMAGELIST)(h))
-
-#undef TreeView_GetNextItem
-#define TreeView_GetNextItem(w,i,c) (HTREEITEM)(LRESULT)(int)SendMessage((w),TVM_GETNEXTITEM,c,(LPARAM)(HTREEITEM)(i))
-
-#undef TreeView_HitTest
-#define TreeView_HitTest(hwnd, lpht) \
- (HTREEITEM)(LRESULT)(int)SNDMSG((hwnd), TVM_HITTEST, 0, (LPARAM)(LPTV_HITTESTINFO)(lpht))
-
-/* fix wrong return type */
-#undef TreeView_Select
-#define TreeView_Select(w,i,c) (BOOL)(int)SendMessage((w),TVM_SELECTITEM,c,(LPARAM)(HTREEITEM)(i))
-
-#undef TreeView_EditLabel
-#define TreeView_EditLabel(w, i) SNDMSG(w,TVM_EDITLABEL,0,(LPARAM)(i))
-
-#endif /* defined(__GNUC__) */
+#define MAX_EXTRA_FOLDERS 256
+#define MAX_EXTRA_SUBFOLDERS 256
+#define ICON_MAX std::size(treeIconNames)
#include "bitmask.h"
#include <stdint.h>
#include "emu_opts.h"
@@ -39,16 +17,16 @@
typedef struct
{
- const char *m_lpTitle; // Folder Title
- const char *short_name; // for saving in the .ini
- UINT m_nFolderId; // ID
- UINT m_nIconId; // if >= 0, resource id of icon (IDI_xxx), otherwise index in image list
- DWORD m_dwUnset; // Excluded filters
- DWORD m_dwSet; // Implied filters
- BOOL m_process; // 1 = process only if rebuilding the cache
- void (*m_pfnCreateFolders)(int parent_index); // Constructor for special folders
- BOOL (*m_pfnQuery)(uint32_t nDriver); // Query function
- BOOL m_bExpectedResult; // Expected query result
+ const char *m_lpTitle; // Folder Title
+ const char *short_name; // for saving in the .ini
+ UINT m_nFolderId; // ID
+ UINT m_nIconId; // if >= 0, resource id of icon (IDI_xxx), otherwise index in image list
+ DWORD m_dwUnset; // Excluded filters
+ DWORD m_dwSet; // Implied filters
+ BOOL m_process; // (not used yet)
+ void (*m_pfnCreateFolders)(int parent_index); // Constructor for special folders
+ BOOL (*m_pfnQuery)(uint32_t nDriver); // Query function
+ BOOL m_bExpectedResult; // Expected query result
OPTIONS_TYPE m_opttype = OPTIONS_MAX; // Has an ini file (vector.ini, etc)
} FOLDERDATA, *LPFOLDERDATA;
@@ -64,38 +42,15 @@ typedef struct
typedef const FILTER_ITEM *LPCFILTER_ITEM;
-/***************************************************************************
- Functions to build builtin folder lists
- ***************************************************************************/
-
-void CreateManufacturerFolders(int parent_index);
-void CreateYearFolders(int parent_index);
-void CreateSourceFolders(int parent_index);
-void CreateScreenFolders(int parent_index);
-void CreateResolutionFolders(int parent_index);
-void CreateFPSFolders(int parent_index);
-void CreateBIOSFolders(int parent_index);
-void CreateCPUFolders(int parent_index);
-void CreateSoundFolders(int parent_index);
-void CreateOrientationFolders(int parent_index);
-void CreateDeficiencyFolders(int parent_index);
-void CreateDumpingFolders(int parent_index);
-
-/***************************************************************************/
-
-#define MAX_EXTRA_FOLDERS 256
-#define MAX_EXTRA_SUBFOLDERS 256
-
/* TreeView structures */
enum
{
FOLDER_NONE = 0,
FOLDER_ALLGAMES,
FOLDER_AVAILABLE,
+ FOLDER_ARCADE,
FOLDER_BIOS,
FOLDER_CLONES,
- FOLDER_COMPUTER,
- FOLDER_CONSOLE,
FOLDER_CPU,
FOLDER_DEFICIENCY,
FOLDER_DUMPING,
@@ -152,8 +107,8 @@ typedef enum
typedef struct
{
- LPSTR m_lpTitle; // String contains the folder name
- LPTSTR m_lptTitle; // String contains the folder name as TCHAR*
+ char *m_lpTitle; // String contains the folder name
+ wchar_t *m_lptTitle; // String contains the folder name as wchar_t*
UINT m_nFolderId; // Index / Folder ID number
int m_nParent; // Parent folder index in treeFolders[]
int m_nIconId; // negative icon index into the ImageList, or IDI_xxx resource id
@@ -163,52 +118,61 @@ typedef struct
typedef struct
{
- char m_szTitle[64]; // Folder Title
- UINT m_nFolderId; // ID
- int m_nParent; // Parent Folder index in treeFolders[]
- DWORD m_dwFlags; // Flags - Customisable and Filters
- int m_nIconId; // negative icon index into the ImageList, or IDI_xxx resource id
- int m_nSubIconId; // negative icon index into the ImageList, or IDI_xxx resource id
+ char m_szTitle[64]; // Folder Title
+ UINT m_nFolderId; // ID
+ int m_nParent; // Parent Folder index in treeFolders[]
+ DWORD m_dwFlags; // Flags - Customizable and Filters
+ int m_nIconId; // negative icon index into the ImageList, or IDI_xxx resource id
+ int m_nSubIconId; // negative icon index into the ImageList, or IDI_xxx resource id
} EXFOLDERDATA, *LPEXFOLDERDATA;
+typedef struct
+{
+ int nResourceID;
+ const char* lpName;
+} TREEICON;
+
void FreeFolders(void);
void ResetFilters(void);
void InitTree(LPCFOLDERDATA lpFolderData, LPCFILTER_ITEM lpFilterList);
void SetCurrentFolder(LPTREEFOLDER lpFolder);
UINT GetCurrentFolderID(void);
-
LPTREEFOLDER GetCurrentFolder(void);
int GetNumFolders(void);
LPTREEFOLDER GetFolder(UINT nFolder);
LPTREEFOLDER GetFolderByID(UINT nID);
LPTREEFOLDER GetFolderByName(int nParentId, const char *pszFolderName);
-
void AddGame(LPTREEFOLDER lpFolder, UINT nGame);
void RemoveGame(LPTREEFOLDER lpFolder, UINT nGame);
int FindGame(LPTREEFOLDER lpFolder, int nGame);
-
void ResetWhichGamesInFolders(void);
-
LPCFOLDERDATA FindFilter(DWORD folderID);
-
-BOOL GameFiltered(int nGame, DWORD dwFlags);
-BOOL GetParentFound(int nGame);
-
+bool GameFiltered(int nGame, DWORD dwFlags);
+bool GetParentFound(int nGame);
LPCFILTER_ITEM GetFilterList(void);
-
-void SetTreeIconSize(HWND hWnd, BOOL bLarge);
-BOOL GetTreeIconSize(void);
-
+void SetTreeIconSize(HWND hWnd, bool bLarge);
+bool GetTreeIconSize(void);
void GetFolders(TREEFOLDER ***folders,int *num_folders);
-BOOL TryRenameCustomFolder(LPTREEFOLDER lpFolder,const char *new_name);
+bool TryRenameCustomFolder(LPTREEFOLDER lpFolder,const char *new_name);
void AddToCustomFolder(LPTREEFOLDER lpFolder,int driver_index);
void RemoveFromCustomFolder(LPTREEFOLDER lpFolder,int driver_index);
-
HIMAGELIST GetTreeViewIconList(void);
int GetTreeViewIconIndex(int icon_id);
-
void ResetTreeViewFolders(void);
void SelectTreeViewFolder(int folder_id);
-#endif /* TREEVIEW_H */
+void CreateManufacturerFolders(int parent_index);
+void CreateYearFolders(int parent_index);
+void CreateSourceFolders(int parent_index);
+void CreateScreenFolders(int parent_index);
+void CreateResolutionFolders(int parent_index);
+void CreateFPSFolders(int parent_index);
+void CreateBIOSFolders(int parent_index);
+void CreateCPUFolders(int parent_index);
+void CreateSoundFolders(int parent_index);
+void CreateOrientationFolders(int parent_index);
+void CreateDeficiencyFolders(int parent_index);
+void CreateDumpingFolders(int parent_index);
+
+#endif
diff --git a/docs/release/src/osd/winui/treeview_o.cpp b/docs/release/src/osd/winui/treeview_o.cpp
new file mode 100644
index 00000000000..fff0f416560
--- /dev/null
+++ b/docs/release/src/osd/winui/treeview_o.cpp
@@ -0,0 +1,2587 @@
+// For licensing and usage information, read docs/release/winui_license.txt
+//****************************************************************************
+
+/***************************************************************************
+
+ treeview.c
+
+ TreeView support routines - MSH 11/19/1998
+
+***************************************************************************/
+
+// standard windows headers
+#include <windows.h>
+#include <windowsx.h>
+
+// standard C headers
+#include <sys/stat.h>
+
+#ifdef _MSC_VER
+#include <direct.h>
+#endif
+#include <tchar.h>
+
+// MAME/MAMEUI headers
+#include "emu.h"
+#include "mui_util.h"
+#include "winui.h"
+#include "treeview.h"
+#include "resource.h"
+#include "mui_opts.h"
+#include "emu_opts.h"
+#include "dialogs.h"
+#include "winutf8.h"
+#include "screen.h"
+#include "drivenum.h"
+#include "corestr.h"
+
+#ifdef _MSC_VER
+#define snprintf _snprintf
+#endif
+
+#define MAX_EXTRA_FOLDERS 256
+
+/***************************************************************************
+ public structures
+ ***************************************************************************/
+
+#define ICON_MAX (sizeof(treeIconNames) / sizeof(treeIconNames[0]))
+
+/* Name used for user-defined custom icons */
+/* external *.ico file to look for. */
+
+typedef struct
+{
+ int nResourceID;
+ LPCSTR lpName;
+} TREEICON;
+
+static TREEICON treeIconNames[] =
+{
+ { IDI_FOLDER_OPEN, "foldopen" },
+ { IDI_FOLDER, "folder" },
+ { IDI_FOLDER_AVAILABLE, "foldavail" },
+ { IDI_FOLDER_MANUFACTURER, "foldmanu" },
+ { IDI_FOLDER_UNAVAILABLE, "foldunav" },
+ { IDI_FOLDER_YEAR, "foldyear" },
+ { IDI_FOLDER_SOURCE, "foldsrc" },
+ { IDI_FOLDER_HORIZONTAL, "horz" },
+ { IDI_FOLDER_VERTICAL, "vert" },
+ { IDI_MANUFACTURER, "manufact" },
+ { IDI_FOLDER_WORKING, "working" },
+ { IDI_FOLDER_NONWORKING, "nonwork" },
+ { IDI_YEAR, "year" },
+ { IDI_SOUND, "sound" },
+ { IDI_CPU, "cpu" },
+ { IDI_FOLDER_HARDDISK, "harddisk" },
+ { IDI_SOURCE, "source" }
+};
+
+/***************************************************************************
+ private variables
+ ***************************************************************************/
+
+/* this has an entry for every folder eventually in the UI, including subfolders */
+static TREEFOLDER **treeFolders = 0;
+static UINT numFolders = 0; /* Number of folder in the folder array */
+static UINT next_folder_id = MAX_FOLDERS;
+static UINT folderArrayLength = 0; /* Size of the folder array */
+static LPTREEFOLDER lpCurrentFolder = 0; /* Currently selected folder */
+static UINT nCurrentFolder = 0; /* Current folder ID */
+static WNDPROC g_lpTreeWndProc = 0; /* for subclassing the TreeView */
+static HIMAGELIST hTreeSmall = 0; /* TreeView Image list of icons */
+
+/* this only has an entry for each TOP LEVEL extra folder + SubFolders*/
+LPEXFOLDERDATA ExtraFolderData[MAX_EXTRA_FOLDERS * MAX_EXTRA_SUBFOLDERS];
+static int numExtraFolders = 0;
+static int numExtraIcons = 0;
+static char *ExtraFolderIcons[MAX_EXTRA_FOLDERS];
+
+// built in folders and filters
+static LPCFOLDERDATA g_lpFolderData;
+static LPCFILTER_ITEM g_lpFilterList;
+
+/***************************************************************************
+ private function prototypes
+ ***************************************************************************/
+
+extern BOOL InitFolders(void);
+static BOOL CreateTreeIcons(void);
+static void TreeCtrlOnPaint(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
+static const char *ParseManufacturer(const char *s, int *pParsedChars );
+static const char *TrimManufacturer(const char *s);
+static BOOL AddFolder(LPTREEFOLDER lpFolder);
+static LPTREEFOLDER NewFolder(const char *lpTitle, UINT nFolderId, int nParent, UINT nIconId, DWORD dwFlags);
+static void DeleteFolder(LPTREEFOLDER lpFolder);
+static LRESULT CALLBACK TreeWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
+static int InitExtraFolders(void);
+static void FreeExtraFolders(void);
+static void SetExtraIcons(char *name, int *id);
+static BOOL TryAddExtraFolderAndChildren(int parent_index);
+static BOOL TrySaveExtraFolder(LPTREEFOLDER lpFolder);
+static void SaveExternalFolders(int parent_index, const char *fname);
+
+/***************************************************************************
+ public functions
+ ***************************************************************************/
+
+BOOL win_move_file_utf8(const char *existingfilename, const char *newfilename)
+{
+ BOOL result = false;
+
+ TCHAR *t_existingfilename = ui_wstring_from_utf8(existingfilename);
+ if( !t_existingfilename )
+ return result;
+
+ TCHAR *t_newfilename = ui_wstring_from_utf8(newfilename);
+ if( !t_newfilename ) {
+ free(t_existingfilename);
+ return result;
+ }
+
+ result = MoveFile(t_existingfilename, t_newfilename);
+
+ free(t_newfilename);
+ free(t_existingfilename);
+
+ return result;
+}
+
+/**************************************************************************
+ * ci_strncmp - case insensitive character array compare
+ *
+ * Returns zero if the first n characters of s1 and s2 are equal,
+ * ignoring case.
+ * stolen from datafile.c
+ **************************************************************************/
+static int ci_strncmp (const char *s1, const char *s2, int n)
+{
+ int c1 = 0, c2 = 0;
+ while (n)
+ {
+ if ((c1 = tolower (*s1)) != (c2 = tolower (*s2)))
+ return (c1 - c2);
+ else
+ if (!c1)
+ break;
+ --n;
+ s1++;
+ s2++;
+ }
+ return 0;
+}
+
+
+
+/* De-allocate all folder memory */
+void FreeFolders(void)
+{
+ if (treeFolders)
+ {
+ if (numExtraFolders)
+ {
+ FreeExtraFolders();
+ numFolders -= numExtraFolders;
+ }
+
+ for (int i = numFolders - 1; i >= 0; i--)
+ {
+ DeleteFolder(treeFolders[i]);
+ treeFolders[i] = NULL;
+ numFolders--;
+ }
+ free(treeFolders);
+ treeFolders = NULL;
+ }
+ numFolders = 0;
+}
+
+/* Reset folder filters */
+void ResetFilters(void)
+{
+ if (treeFolders)
+ for (int i = 0; i < (int)numFolders; i++)
+ treeFolders[i]->m_dwFlags &= ~F_MASK;
+}
+
+void InitTree(LPCFOLDERDATA lpFolderData, LPCFILTER_ITEM lpFilterList)
+{
+ g_lpFolderData = lpFolderData;
+ g_lpFilterList = lpFilterList;
+
+ InitFolders();
+
+ /* this will subclass the treeview (where WM_DRAWITEM gets sent for the header control) */
+ LONG_PTR l = GetWindowLongPtr(GetTreeView(), GWLP_WNDPROC);
+ g_lpTreeWndProc = (WNDPROC)l;
+ SetWindowLongPtr(GetTreeView(), GWLP_WNDPROC, (LONG_PTR)TreeWndProc);
+}
+
+void SetCurrentFolder(LPTREEFOLDER lpFolder)
+{
+ lpCurrentFolder = (lpFolder == 0) ? treeFolders[0] : lpFolder;
+ nCurrentFolder = (lpCurrentFolder) ? lpCurrentFolder->m_nFolderId : 0;
+}
+
+LPTREEFOLDER GetCurrentFolder(void)
+{
+ return lpCurrentFolder;
+}
+
+UINT GetCurrentFolderID(void)
+{
+ return nCurrentFolder;
+}
+
+int GetNumFolders(void)
+{
+ return numFolders;
+}
+
+LPTREEFOLDER GetFolder(UINT nFolder)
+{
+ return (nFolder < numFolders) ? treeFolders[nFolder] : NULL;
+}
+
+LPTREEFOLDER GetFolderByID(UINT nID)
+{
+ for (UINT i = 0; i < numFolders; i++)
+ if (treeFolders[i]->m_nFolderId == nID)
+ return treeFolders[i];
+
+ return (LPTREEFOLDER)0;
+}
+
+void AddGame(LPTREEFOLDER lpFolder, UINT nGame)
+{
+ if (lpFolder)
+ SetBit(lpFolder->m_lpGameBits, nGame);
+}
+
+void RemoveGame(LPTREEFOLDER lpFolder, UINT nGame)
+{
+ ClearBit(lpFolder->m_lpGameBits, nGame);
+}
+
+int FindGame(LPTREEFOLDER lpFolder, int nGame)
+{
+ return FindBit(lpFolder->m_lpGameBits, nGame, true);
+}
+
+// Called to re-associate games with folders
+void ResetWhichGamesInFolders(void)
+{
+ int nGames = driver_list::total();
+
+ for (UINT i = 0; i < numFolders; i++)
+ {
+ LPTREEFOLDER lpFolder = treeFolders[i];
+ // setup the games in our built-in folders
+ for (UINT k = 0; g_lpFolderData[k].m_lpTitle; k++)
+ {
+ if (lpFolder->m_nFolderId == g_lpFolderData[k].m_nFolderId)
+ {
+ if (g_lpFolderData[k].m_pfnQuery || g_lpFolderData[k].m_bExpectedResult)
+ {
+ SetAllBits(lpFolder->m_lpGameBits, false);
+ for (UINT jj = 0; jj < nGames; jj++)
+ {
+ // invoke the query function
+ BOOL b = g_lpFolderData[k].m_pfnQuery ? g_lpFolderData[k].m_pfnQuery(jj) : true;
+
+ // if we expect false, flip the result
+ if (!g_lpFolderData[k].m_bExpectedResult)
+ b = !b;
+
+ // if we like what we hear, add the game
+ if (b)
+ AddGame(lpFolder, jj);
+ }
+ }
+ break;
+ }
+ }
+ }
+}
+
+
+/* Used to build the GameList */
+BOOL GameFiltered(int nGame, DWORD dwMask)
+{
+ LPTREEFOLDER lpFolder = GetCurrentFolder();
+ LPTREEFOLDER lpParent = NULL;
+
+ //Filter out the Bioses on all Folders, except for the Bios Folder
+ if( lpFolder->m_nFolderId != FOLDER_BIOS )
+ {
+// if( !( (driver_list::driver(nGame).flags & MACHINE_IS_BIOS_ROOT ) == 0) )
+// return true;
+ if( driver_list::driver(nGame).name[0] == '_' )
+ return true;
+ }
+ // Filter games--return true if the game should be HIDDEN in this view
+ if( GetFilterInherit() )
+ {
+ if( lpFolder )
+ {
+ lpParent = GetFolder( lpFolder->m_nParent );
+ if( lpParent )
+ {
+ /* Check the Parent Filters and inherit them on child,
+ * The inherited filters don't display on the custom Filter Dialog for the Child folder
+ * No need to promote all games to parent folder, works as is */
+ dwMask |= lpParent->m_dwFlags;
+ }
+ }
+ }
+
+ if (strlen(GetSearchText()) && _stricmp(GetSearchText(), SEARCH_PROMPT))
+ if (MyStrStrI(driver_list::driver(nGame).type.fullname(),GetSearchText()) == NULL &&
+ MyStrStrI(driver_list::driver(nGame).name,GetSearchText()) == NULL)
+ return true;
+
+ /*Filter Text is already global*/
+ if (MyStrStrI(driver_list::driver(nGame).type.fullname(),GetFilterText()) == NULL &&
+ MyStrStrI(driver_list::driver(nGame).name,GetFilterText()) == NULL &&
+ MyStrStrI(driver_list::driver(nGame).type.source(),GetFilterText()) == NULL &&
+ MyStrStrI(driver_list::driver(nGame).manufacturer,GetFilterText()) == NULL)
+ {
+ return true;
+ }
+ // Are there filters set on this folder?
+ if ((dwMask & F_MASK) == 0)
+ return false;
+
+ // Filter out clones?
+ if (dwMask & F_CLONES && DriverIsClone(nGame))
+ return true;
+
+ for (int i = 0; g_lpFilterList[i].m_dwFilterType; i++)
+ if (dwMask & g_lpFilterList[i].m_dwFilterType)
+ if (g_lpFilterList[i].m_pfnQuery(nGame) == g_lpFilterList[i].m_bExpectedResult)
+ return true;
+
+ return false;
+}
+
+/* Get the parent of game in this view */
+BOOL GetParentFound(int nGame) // not used
+{
+ LPTREEFOLDER lpFolder = GetCurrentFolder();
+
+ if( lpFolder )
+ {
+ int nParentIndex = GetParentIndex(&driver_list::driver(nGame));
+
+ /* return false if no parent is there in this view */
+ if( nParentIndex == -1)
+ return false;
+
+ /* return false if the folder should be HIDDEN in this view */
+ if (TestBit(lpFolder->m_lpGameBits, nParentIndex) == 0)
+ return false;
+
+ /* return false if the game should be HIDDEN in this view */
+ if (GameFiltered(nParentIndex, lpFolder->m_dwFlags))
+ return false;
+
+ return true;
+ }
+
+ return false;
+}
+
+LPCFILTER_ITEM GetFilterList(void)
+{
+ return g_lpFilterList;
+}
+
+/***************************************************************************
+ private functions
+ ***************************************************************************/
+
+void CreateSourceFolders(int parent_index)
+{
+ int i, k=0;
+ int nGames = driver_list::total();
+ int start_folder = numFolders;
+ LPTREEFOLDER lpFolder = treeFolders[parent_index];
+
+ // no games in top level folder
+ SetAllBits(lpFolder->m_lpGameBits,false);
+ for (int jj = 0; jj < nGames; jj++)
+ {
+ const char *s = GetDriverFilename(jj);
+
+ if (s == NULL || s[0] == '\0')
+ continue;
+
+ // look for an existant source treefolder for this game
+ // (likely to be the previous one, so start at the end)
+ for (i=numFolders-1;i>=start_folder;i--)
+ {
+ if (strcmp(treeFolders[i]->m_lpTitle,s) == 0)
+ {
+ AddGame(treeFolders[i], jj);
+ break;
+ }
+ }
+
+ if (i == start_folder-1)
+ {
+ // nope, it's a source file we haven't seen before, make it.
+ LPTREEFOLDER lpTemp = NewFolder(s, next_folder_id, parent_index, IDI_SOURCE, GetFolderFlags(numFolders));
+ ExtraFolderData[next_folder_id] = (EXFOLDERDATA*)malloc(sizeof(EXFOLDERDATA));
+ memset(ExtraFolderData[next_folder_id], 0, sizeof(EXFOLDERDATA));
+
+ ExtraFolderData[next_folder_id]->m_nFolderId = next_folder_id;
+ ExtraFolderData[next_folder_id]->m_nIconId = IDI_SOURCE;
+ ExtraFolderData[next_folder_id]->m_nParent = lpFolder->m_nFolderId;
+ ExtraFolderData[next_folder_id]->m_nSubIconId = -1;
+ strcpy( ExtraFolderData[next_folder_id]->m_szTitle, s );
+ ExtraFolderData[next_folder_id]->m_dwFlags = 0;
+
+ // Increment next_folder_id here in case code is added above
+ next_folder_id++;
+
+ AddFolder(lpTemp);
+ AddGame(lpTemp, jj);
+ }
+ }
+ SetNumOptionFolders(k-1);
+ const char *fname = "Source";
+ SaveExternalFolders(parent_index, fname);
+}
+
+void CreateScreenFolders(int parent_index)
+{
+ int i, k=0;
+ int nGames = driver_list::total();
+ int start_folder = numFolders;
+ LPTREEFOLDER lpFolder = treeFolders[parent_index];
+
+ // no games in top level folder
+ SetAllBits(lpFolder->m_lpGameBits,false);
+ for (int jj = 0; jj < nGames; jj++)
+ {
+ int screens = DriverNumScreens(jj);
+ char s[2];
+ itoa(screens, s, 10);
+
+ // look for an existant screens treefolder for this game
+ // (likely to be the previous one, so start at the end)
+ for (i=numFolders-1;i>=start_folder;i--)
+ {
+ if (strcmp(treeFolders[i]->m_lpTitle,s) == 0)
+ {
+ AddGame(treeFolders[i], jj);
+ break;
+ }
+ }
+
+ if (i == start_folder-1)
+ {
+ // nope, it's a screen file we haven't seen before, make it.
+ LPTREEFOLDER lpTemp = NewFolder(s, next_folder_id, parent_index, IDI_SCREEN, GetFolderFlags(numFolders));
+ ExtraFolderData[next_folder_id] = (EXFOLDERDATA*)malloc(sizeof(EXFOLDERDATA));
+ memset(ExtraFolderData[next_folder_id], 0, sizeof(EXFOLDERDATA));
+
+ ExtraFolderData[next_folder_id]->m_nFolderId = next_folder_id;
+ ExtraFolderData[next_folder_id]->m_nIconId = IDI_SCREEN;
+ ExtraFolderData[next_folder_id]->m_nParent = lpFolder->m_nFolderId;
+ ExtraFolderData[next_folder_id]->m_nSubIconId = -1;
+ strcpy( ExtraFolderData[next_folder_id]->m_szTitle, s );
+ ExtraFolderData[next_folder_id]->m_dwFlags = 0;
+
+ // Increment next_folder_id here in case code is added above
+ next_folder_id++;
+
+ AddFolder(lpTemp);
+ AddGame(lpTemp, jj);
+ }
+ }
+ SetNumOptionFolders(k-1);
+ const char *fname = "Screen";
+ SaveExternalFolders(parent_index, fname);
+}
+
+
+void CreateManufacturerFolders(int parent_index)
+{
+ int i;
+ int nGames = driver_list::total();
+ int start_folder = numFolders;
+ LPTREEFOLDER lpFolder = treeFolders[parent_index];
+
+ // no games in top level folder
+ SetAllBits(lpFolder->m_lpGameBits,false);
+
+ for (int jj = 0; jj < nGames; jj++)
+ {
+ const char *manufacturer = driver_list::driver(jj).manufacturer;
+ int iChars = 0;
+ while( manufacturer != NULL && manufacturer[0] != '\0' )
+ {
+ const char *s = ParseManufacturer(manufacturer, &iChars);
+ manufacturer += iChars;
+ //shift to next start char
+ if( s != NULL && *s != 0 )
+ {
+ const char *t = TrimManufacturer(s);
+ for (i=numFolders-1;i>=start_folder;i--)
+ {
+ //RS Made it case insensitive
+ if (ci_strncmp(treeFolders[i]->m_lpTitle,t,20) == 0 )
+ {
+ AddGame(treeFolders[i],jj);
+ break;
+ }
+ }
+
+ if (i == start_folder-1)
+ {
+ // nope, it's a manufacturer we haven't seen before, make it.
+ LPTREEFOLDER lpTemp = NewFolder(t, next_folder_id, parent_index, IDI_MANUFACTURER, GetFolderFlags(numFolders));
+ ExtraFolderData[next_folder_id] = (EXFOLDERDATA*)malloc(sizeof(EXFOLDERDATA));
+ memset(ExtraFolderData[next_folder_id], 0, sizeof(EXFOLDERDATA));
+
+ ExtraFolderData[next_folder_id]->m_nFolderId = next_folder_id;
+ ExtraFolderData[next_folder_id]->m_nIconId = IDI_MANUFACTURER;
+ ExtraFolderData[next_folder_id]->m_nParent = lpFolder->m_nFolderId;
+ ExtraFolderData[next_folder_id]->m_nSubIconId = -1;
+ strcpy( ExtraFolderData[next_folder_id]->m_szTitle, s );
+ ExtraFolderData[next_folder_id++]->m_dwFlags = 0;
+ AddFolder(lpTemp);
+ AddGame(lpTemp,jj);
+ }
+ }
+ }
+ }
+ const char *fname = "Manufacturer";
+ SaveExternalFolders(parent_index, fname);
+}
+
+/* Make a reasonable name out of the one found in the driver array */
+static const char *ParseManufacturer(const char *s, int *pParsedChars )
+{
+ static char tmp[256];
+ char *ptmp;
+ char *t;
+ *pParsedChars= 0;
+
+ if ( *s == '?' || *s == '<' || s[3] == '?' )
+ {
+ (*pParsedChars) = strlen(s);
+ return "<unknown>";
+ }
+
+ ptmp = tmp;
+ /*if first char is a space, skip it*/
+ if( *s == ' ' )
+ {
+ (*pParsedChars)++;
+ ++s;
+ }
+ while( *s )
+ {
+ /* combinations where to end string */
+
+ if (
+ ( (*s == ' ') && ( s[1] == '(' || s[1] == '/' || s[1] == '+' ) ) ||
+ ( *s == ']' ) || ( *s == '/' ) || ( *s == '?' ) )
+ {
+ (*pParsedChars)++;
+ if( s[1] == '/' || s[1] == '+' )
+ (*pParsedChars)++;
+ break;
+ }
+ if( s[0] == ' ' && s[1] == '?' )
+ {
+ (*pParsedChars) += 2;
+ s+=2;
+ }
+
+ /* skip over opening braces*/
+
+ if ( *s != '[' )
+ {
+ *ptmp++ = *s;
+ }
+ (*pParsedChars)++;
+ /*for "distributed by" and "supported by" handling*/
+ if( ( (s[1] == ',') && (s[2] == ' ') && ( (s[3] == 's') || (s[3] == 'd') ) ) )
+ {
+ //*ptmp++ = *s;
+ ++s;
+ break;
+ }
+ ++s;
+ }
+ *ptmp = '\0';
+ t = tmp;
+ if( tmp[0] == '(' || tmp[strlen(tmp)-1] == ')' || tmp[0] == ',')
+ {
+ ptmp = strchr( tmp,'(' );
+ if ( ptmp == NULL )
+ {
+ ptmp = strchr( tmp,',' );
+ if( ptmp != NULL)
+ {
+ //parse the new "supported by" and "distributed by"
+ ptmp++;
+
+ if (ci_strncmp(ptmp, " supported by", 13) == 0)
+ {
+ ptmp += 13;
+ }
+ else if (ci_strncmp(ptmp, " distributed by", 15) == 0)
+ {
+ ptmp += 15;
+ }
+ else
+ {
+ return NULL;
+ }
+ }
+ else
+ {
+ ptmp = tmp;
+ if ( ptmp == NULL )
+ {
+ return NULL;
+ }
+ }
+ }
+ if( tmp[0] == '(' || tmp[0] == ',')
+ {
+ ptmp++;
+ }
+ if (ci_strncmp(ptmp, "licensed from ", 14) == 0)
+ {
+ ptmp += 14;
+ }
+ // for the licenced from case
+ if (ci_strncmp(ptmp, "licenced from ", 14) == 0)
+ {
+ ptmp += 14;
+ }
+
+ while ( (*ptmp != ')' ) && (*ptmp != '/' ) && *ptmp != '\0')
+ {
+ if (*ptmp == ' ' && ci_strncmp(ptmp, " license", 8) == 0)
+ {
+ break;
+ }
+ if (*ptmp == ' ' && ci_strncmp(ptmp, " licence", 8) == 0)
+ {
+ break;
+ }
+ *t++ = *ptmp++;
+ }
+
+ *t = '\0';
+ }
+
+ *ptmp = '\0';
+ return tmp;
+}
+
+/* Analyze Manufacturer Names for typical patterns, that don't distinguish between companies (e.g. Co., Ltd., Inc., etc. */
+static const char *TrimManufacturer(const char *s)
+{
+ //Also remove Country specific suffixes (e.g. Japan, Italy, America, USA, ...)
+ char strTemp[256];
+ static char strTemp2[256];
+ int j, k ,l;
+ memset(strTemp, '\0', 256 );
+ memset(strTemp2, '\0', 256 );
+ //start analyzing from the back, as these are usually suffixes
+ for(int i = strlen(s)-1; i>=0; i-- )
+ {
+ l = strlen(strTemp);
+ for(k=l; k>=0; k--)
+ strTemp[k+1] = strTemp[k];
+ strTemp[0] = s[i];
+ strTemp[++l] = '\0';
+ switch (l)
+ {
+ case 2:
+ if( ci_strncmp(strTemp, "co", 2) == 0 )
+ {
+ j=l;
+ while( s[strlen(s)-j-1] == ' ' || s[strlen(s)-j-1] == ',' )
+ {
+ j++;
+ }
+ if( j!=l)
+ {
+ memset(strTemp2, '\0', 256 );
+ strncpy(strTemp2, s, strlen(s)-j );
+ }
+ }
+ break;
+ case 3:
+ if( ci_strncmp(strTemp, "co.", 3) == 0 || ci_strncmp(strTemp, "ltd", 3) == 0 || ci_strncmp(strTemp, "inc", 3) == 0 || ci_strncmp(strTemp, "SRL", 3) == 0 || ci_strncmp(strTemp, "USA", 3) == 0)
+ {
+ j=l;
+ while( s[strlen(s)-j-1] == ' ' || s[strlen(s)-j-1] == ',' )
+ {
+ j++;
+ }
+ if( j!=l)
+ {
+ memset(strTemp2, '\0', 256 );
+ strncpy(strTemp2, s, strlen(s)-j );
+ }
+ }
+ break;
+ case 4:
+ if( ci_strncmp(strTemp, "inc.", 4) == 0 || ci_strncmp(strTemp, "ltd.", 4) == 0 || ci_strncmp(strTemp, "corp", 4) == 0 || ci_strncmp(strTemp, "game", 4) == 0)
+ {
+ j=l;
+ while( s[strlen(s)-j-1] == ' ' || s[strlen(s)-j-1] == ',' )
+ {
+ j++;
+ }
+ if( j!=l)
+ {
+ memset(strTemp2, '\0', 256 );
+ strncpy(strTemp2, s, strlen(s)-j );
+ }
+ }
+ break;
+ case 5:
+ if( ci_strncmp(strTemp, "corp.", 5) == 0 || ci_strncmp(strTemp, "Games", 5) == 0 || ci_strncmp(strTemp, "Italy", 5) == 0 || ci_strncmp(strTemp, "Japan", 5) == 0)
+ {
+ j=l;
+ while( s[strlen(s)-j-1] == ' ' || s[strlen(s)-j-1] == ',' )
+ {
+ j++;
+ }
+ if( j!=l)
+ {
+ memset(strTemp2, '\0', 256 );
+ strncpy(strTemp2, s, strlen(s)-j );
+ }
+ }
+ break;
+ case 6:
+ if( ci_strncmp(strTemp, "co-ltd", 6) == 0 || ci_strncmp(strTemp, "S.R.L.", 6) == 0)
+ {
+ j=l;
+ while( s[strlen(s)-j-1] == ' ' || s[strlen(s)-j-1] == ',' )
+ {
+ j++;
+ }
+ if( j!=l)
+ {
+ memset(strTemp2, '\0', 256 );
+ strncpy(strTemp2, s, strlen(s)-j );
+ }
+ }
+ break;
+ case 7:
+ if( ci_strncmp(strTemp, "co. ltd", 7) == 0 || ci_strncmp(strTemp, "America", 7) == 0)
+ {
+ j=l;
+ while( s[strlen(s)-j-1] == ' ' || s[strlen(s)-j-1] == ',' )
+ {
+ j++;
+ }
+ if( j!=l)
+ {
+ memset(strTemp2, '\0', 256 );
+ strncpy(strTemp2, s, strlen(s)-j );
+ }
+ }
+ break;
+ case 8:
+ if( ci_strncmp(strTemp, "co. ltd.", 8) == 0 )
+ {
+ j=l;
+ while( s[strlen(s)-j-1] == ' ' || s[strlen(s)-j-1] == ',' )
+ {
+ j++;
+ }
+ if( j!=l)
+ {
+ memset(strTemp2, '\0', 256 );
+ strncpy(strTemp2, s, strlen(s)-j );
+ }
+ }
+ break;
+ case 9:
+ if( ci_strncmp(strTemp, "co., ltd.", 9) == 0 || ci_strncmp(strTemp, "gmbh & co", 9) == 0 )
+ {
+ j=l;
+ while( s[strlen(s)-j-1] == ' ' || s[strlen(s)-j-1] == ',' )
+ {
+ j++;
+ }
+ if( j!=l)
+ {
+ memset(strTemp2, '\0', 256 );
+ strncpy(strTemp2, s, strlen(s)-j );
+ }
+ }
+ break;
+ case 10:
+ if( ci_strncmp(strTemp, "corp, ltd.", 10) == 0 || ci_strncmp(strTemp, "industries", 10) == 0 || ci_strncmp(strTemp, "of America", 10) == 0)
+ {
+ j=l;
+ while( s[strlen(s)-j-1] == ' ' || s[strlen(s)-j-1] == ',' )
+ {
+ j++;
+ }
+ if( j!=l)
+ {
+ memset(strTemp2, '\0', 256 );
+ strncpy(strTemp2, s, strlen(s)-j );
+ }
+ }
+ break;
+ case 11:
+ if( ci_strncmp(strTemp, "corporation", 11) == 0 || ci_strncmp(strTemp, "enterprises", 11) == 0 )
+ {
+ j=l;
+ while( s[strlen(s)-j-1] == ' ' || s[strlen(s)-j-1] == ',' )
+ {
+ j++;
+ }
+ if( j!=l)
+ {
+ memset(strTemp2, '\0', 256 );
+ strncpy(strTemp2, s, strlen(s)-j );
+ }
+ }
+ break;
+ case 16:
+ if( ci_strncmp(strTemp, "industries japan", 16) == 0 )
+ {
+ j=l;
+ while( s[strlen(s)-j-1] == ' ' || s[strlen(s)-j-1] == ',' )
+ {
+ j++;
+ }
+ if( j!=l)
+ {
+ memset(strTemp2, '\0', 256 );
+ strncpy(strTemp2, s, strlen(s)-j );
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ if( *strTemp2 == 0 )
+ return s;
+ return strTemp2;
+}
+
+void CreateBIOSFolders(int parent_index)
+{
+ int i, nGames = driver_list::total();
+ int start_folder = numFolders;
+ const game_driver *drv;
+ int nParentIndex = -1;
+ LPTREEFOLDER lpFolder = treeFolders[parent_index];
+
+ // no games in top level folder
+ SetAllBits(lpFolder->m_lpGameBits, false);
+
+ for (int jj = 0; jj < nGames; jj++)
+ {
+ if ( DriverIsClone(jj) )
+ {
+ nParentIndex = GetParentIndex(&driver_list::driver(jj));
+ if (nParentIndex < 0) return;
+ drv = &driver_list::driver(nParentIndex);
+ }
+ else
+ drv = &driver_list::driver(jj);
+ nParentIndex = GetParentIndex(drv);
+
+ if (nParentIndex < 0 || !driver_list::driver(nParentIndex).type.fullname())
+ continue;
+
+ for (i = numFolders-1; i >= start_folder; i--)
+ {
+ if (strcmp(treeFolders[i]->m_lpTitle, driver_list::driver(nParentIndex).type.fullname()) == 0)
+ {
+ AddGame(treeFolders[i], jj);
+ break;
+ }
+ }
+
+ if (i == start_folder-1)
+ {
+ LPTREEFOLDER lpTemp = NewFolder(driver_list::driver(nParentIndex).type.fullname(), next_folder_id++, parent_index, IDI_CPU, GetFolderFlags(numFolders));
+ AddFolder(lpTemp);
+ AddGame(lpTemp, jj);
+ }
+ }
+ const char *fname = "BIOS";
+ SaveExternalFolders(parent_index, fname);
+}
+
+void CreateCPUFolders(int parent_index)
+{
+ int device_folder_count = 0;
+ LPTREEFOLDER device_folders[1024];
+ LPTREEFOLDER folder;
+ int nFolder = numFolders;
+
+ for (int i = 0; i < driver_list::total(); i++)
+ {
+ machine_config config(driver_list::driver(i),MameUIGlobal());
+
+ // enumerate through all devices
+ for (device_execute_interface &device : execute_interface_enumerator(config.root_device()))
+ {
+ // get the name
+ const char* dev_name = device.device().name();
+
+ if (dev_name)
+ {
+ // do we have a folder for this device?
+ folder = NULL;
+ for (int j = 0; j < device_folder_count; j++)
+ {
+ if (strcmp(dev_name, device_folders[j]->m_lpTitle)==0)
+ {
+ folder = device_folders[j];
+ break;
+ }
+ }
+
+ // are we forced to create a folder?
+ if (folder == NULL)
+ {
+ LPTREEFOLDER lpTemp = NewFolder(dev_name, next_folder_id, parent_index, IDI_CPU, GetFolderFlags(numFolders));
+ ExtraFolderData[next_folder_id] = (EXFOLDERDATA*)malloc(sizeof(EXFOLDERDATA));
+ memset(ExtraFolderData[next_folder_id], 0, sizeof(EXFOLDERDATA));
+ ExtraFolderData[next_folder_id]->m_nFolderId = next_folder_id;
+ ExtraFolderData[next_folder_id]->m_nIconId = IDI_CPU;
+ ExtraFolderData[next_folder_id]->m_nParent = treeFolders[parent_index]->m_nFolderId;
+ ExtraFolderData[next_folder_id]->m_nSubIconId = -1;
+ strcpy( ExtraFolderData[next_folder_id]->m_szTitle, dev_name );
+ ExtraFolderData[next_folder_id++]->m_dwFlags = 0;
+ AddFolder(lpTemp);
+ folder = treeFolders[nFolder++];
+
+ // record that we found this folder
+ device_folders[device_folder_count++] = folder;
+ if (device_folder_count >= std::size(device_folders))
+ {
+ printf("CreateCPUFolders buffer overrun: %d\n",device_folder_count);
+ fflush(stdout);
+ }
+ }
+
+ // cpu type #'s are one-based
+ AddGame(folder, i);
+ }
+ }
+ }
+ const char *fname = "CPU";
+ SaveExternalFolders(parent_index, fname);
+}
+
+void CreateSoundFolders(int parent_index)
+{
+ int device_folder_count = 0;
+ LPTREEFOLDER device_folders[512];
+ LPTREEFOLDER folder;
+ int nFolder = numFolders;
+
+ for (int i = 0; i < driver_list::total(); i++)
+ {
+ machine_config config(driver_list::driver(i),MameUIGlobal());
+
+ // enumerate through all devices
+
+ for (device_sound_interface &device : sound_interface_enumerator(config.root_device()))
+ {
+ // get the name
+ const char* dev_name = device.device().name();
+
+ if (dev_name)
+ {
+ // do we have a folder for this device?
+ folder = NULL;
+ for (int j = 0; j < device_folder_count; j++)
+ {
+ if (strcmp(dev_name, device_folders[j]->m_lpTitle)==0)
+ {
+ folder = device_folders[j];
+ break;
+ }
+ }
+
+ // are we forced to create a folder?
+ if (folder == NULL)
+ {
+ LPTREEFOLDER lpTemp = NewFolder(dev_name, next_folder_id, parent_index, IDI_SOUND, GetFolderFlags(numFolders));
+ ExtraFolderData[next_folder_id] = (EXFOLDERDATA*)malloc(sizeof(EXFOLDERDATA));
+ memset(ExtraFolderData[next_folder_id], 0, sizeof(EXFOLDERDATA));
+
+ ExtraFolderData[next_folder_id]->m_nFolderId = next_folder_id;
+ ExtraFolderData[next_folder_id]->m_nIconId = IDI_SOUND;
+ ExtraFolderData[next_folder_id]->m_nParent = treeFolders[parent_index]->m_nFolderId;
+ ExtraFolderData[next_folder_id]->m_nSubIconId = -1;
+ strcpy( ExtraFolderData[next_folder_id]->m_szTitle, dev_name );
+ ExtraFolderData[next_folder_id++]->m_dwFlags = 0;
+ AddFolder(lpTemp);
+ folder = treeFolders[nFolder++];
+
+ // record that we found this folder
+ device_folders[device_folder_count++] = folder;
+ if (device_folder_count >= std::size(device_folders))
+ {
+ printf("CreateSoundFolders buffer overrun: %d\n",device_folder_count);
+ fflush(stdout);
+ }
+ }
+
+ // cpu type #'s are one-based
+ AddGame(folder, i);
+ }
+ }
+ }
+ const char *fname = "Sound";
+ SaveExternalFolders(parent_index, fname);
+}
+
+void CreateDeficiencyFolders(int parent_index)
+{
+ int nGames = driver_list::total();
+ LPTREEFOLDER lpFolder = treeFolders[parent_index];
+
+ // create our subfolders
+ LPTREEFOLDER lpProt, lpWrongCol, lpImpCol, lpImpGraph, lpMissSnd, lpImpSnd, lpFlip, lpArt;
+ lpProt = NewFolder("Unemulated Protection", next_folder_id, parent_index, IDI_FOLDER, GetFolderFlags(numFolders));
+ ExtraFolderData[next_folder_id] = (EXFOLDERDATA*)malloc(sizeof(EXFOLDERDATA));
+ memset(ExtraFolderData[next_folder_id], 0, sizeof(EXFOLDERDATA));
+
+ ExtraFolderData[next_folder_id]->m_nFolderId = next_folder_id;
+ ExtraFolderData[next_folder_id]->m_nIconId = IDI_FOLDER;
+ ExtraFolderData[next_folder_id]->m_nParent = lpFolder->m_nFolderId;
+ ExtraFolderData[next_folder_id]->m_nSubIconId = -1;
+ strcpy( ExtraFolderData[next_folder_id]->m_szTitle, "Unemulated Protection" );
+ ExtraFolderData[next_folder_id++]->m_dwFlags = 0;
+ AddFolder(lpProt);
+ lpWrongCol = NewFolder("Wrong Colors", next_folder_id, parent_index, IDI_FOLDER, GetFolderFlags(numFolders));
+ ExtraFolderData[next_folder_id] = (EXFOLDERDATA*)malloc(sizeof(EXFOLDERDATA));
+ memset(ExtraFolderData[next_folder_id], 0, sizeof(EXFOLDERDATA));
+
+ ExtraFolderData[next_folder_id]->m_nFolderId = next_folder_id;
+ ExtraFolderData[next_folder_id]->m_nIconId = IDI_FOLDER;
+ ExtraFolderData[next_folder_id]->m_nParent = lpFolder->m_nFolderId;
+ ExtraFolderData[next_folder_id]->m_nSubIconId = -1;
+ strcpy( ExtraFolderData[next_folder_id]->m_szTitle, "Wrong Colors" );
+ ExtraFolderData[next_folder_id++]->m_dwFlags = 0;
+ AddFolder(lpWrongCol);
+
+ lpImpCol = NewFolder("Imperfect Colors", next_folder_id, parent_index, IDI_FOLDER, GetFolderFlags(numFolders));
+ ExtraFolderData[next_folder_id] = (EXFOLDERDATA*)malloc(sizeof(EXFOLDERDATA));
+ memset(ExtraFolderData[next_folder_id], 0, sizeof(EXFOLDERDATA));
+
+ ExtraFolderData[next_folder_id]->m_nFolderId = next_folder_id;
+ ExtraFolderData[next_folder_id]->m_nIconId = IDI_FOLDER;
+ ExtraFolderData[next_folder_id]->m_nParent = lpFolder->m_nFolderId;
+ ExtraFolderData[next_folder_id]->m_nSubIconId = -1;
+ strcpy( ExtraFolderData[next_folder_id]->m_szTitle, "Imperfect Colors" );
+ ExtraFolderData[next_folder_id++]->m_dwFlags = 0;
+ AddFolder(lpImpCol);
+
+ lpImpGraph = NewFolder("Imperfect Graphics", next_folder_id, parent_index, IDI_FOLDER, GetFolderFlags(numFolders));
+ ExtraFolderData[next_folder_id] = (EXFOLDERDATA*)malloc(sizeof(EXFOLDERDATA));
+ memset(ExtraFolderData[next_folder_id], 0, sizeof(EXFOLDERDATA));
+
+ ExtraFolderData[next_folder_id]->m_nFolderId = next_folder_id;
+ ExtraFolderData[next_folder_id]->m_nIconId = IDI_FOLDER;
+ ExtraFolderData[next_folder_id]->m_nParent = lpFolder->m_nFolderId;
+ ExtraFolderData[next_folder_id]->m_nSubIconId = -1;
+ strcpy( ExtraFolderData[next_folder_id]->m_szTitle, "Imperfect Graphics" );
+ ExtraFolderData[next_folder_id++]->m_dwFlags = 0;
+ AddFolder(lpImpGraph);
+
+ lpMissSnd = NewFolder("Missing Sound", next_folder_id, parent_index, IDI_FOLDER, GetFolderFlags(numFolders));
+ ExtraFolderData[next_folder_id] = (EXFOLDERDATA*)malloc(sizeof(EXFOLDERDATA));
+ memset(ExtraFolderData[next_folder_id], 0, sizeof(EXFOLDERDATA));
+
+ ExtraFolderData[next_folder_id]->m_nFolderId = next_folder_id;
+ ExtraFolderData[next_folder_id]->m_nIconId = IDI_FOLDER;
+ ExtraFolderData[next_folder_id]->m_nParent = lpFolder->m_nFolderId;
+ ExtraFolderData[next_folder_id]->m_nSubIconId = -1;
+ strcpy( ExtraFolderData[next_folder_id]->m_szTitle, "Missing Sound" );
+ ExtraFolderData[next_folder_id++]->m_dwFlags = 0;
+ AddFolder(lpMissSnd);
+
+ lpImpSnd = NewFolder("Imperfect Sound", next_folder_id, parent_index, IDI_FOLDER, GetFolderFlags(numFolders));
+ ExtraFolderData[next_folder_id] = (EXFOLDERDATA*)malloc(sizeof(EXFOLDERDATA));
+ memset(ExtraFolderData[next_folder_id], 0, sizeof(EXFOLDERDATA));
+
+ ExtraFolderData[next_folder_id]->m_nFolderId = next_folder_id;
+ ExtraFolderData[next_folder_id]->m_nIconId = IDI_FOLDER;
+ ExtraFolderData[next_folder_id]->m_nParent = lpFolder->m_nFolderId;
+ ExtraFolderData[next_folder_id]->m_nSubIconId = -1;
+ strcpy( ExtraFolderData[next_folder_id]->m_szTitle, "Imperfect Sound" );
+ ExtraFolderData[next_folder_id++]->m_dwFlags = 0;
+ AddFolder(lpImpSnd);
+
+ lpFlip = NewFolder("No Cocktail", next_folder_id, parent_index, IDI_FOLDER, GetFolderFlags(numFolders));
+ ExtraFolderData[next_folder_id] = (EXFOLDERDATA*)malloc(sizeof(EXFOLDERDATA));
+ memset(ExtraFolderData[next_folder_id], 0, sizeof(EXFOLDERDATA));
+
+ ExtraFolderData[next_folder_id]->m_nFolderId = next_folder_id;
+ ExtraFolderData[next_folder_id]->m_nIconId = IDI_FOLDER;
+ ExtraFolderData[next_folder_id]->m_nParent = lpFolder->m_nFolderId;
+ ExtraFolderData[next_folder_id]->m_nSubIconId = -1;
+ strcpy( ExtraFolderData[next_folder_id]->m_szTitle, "No Cocktail" );
+ ExtraFolderData[next_folder_id++]->m_dwFlags = 0;
+ AddFolder(lpFlip);
+
+ lpArt = NewFolder("Requires Artwork", next_folder_id, parent_index, IDI_FOLDER, GetFolderFlags(numFolders));
+ ExtraFolderData[next_folder_id] = (EXFOLDERDATA*)malloc(sizeof(EXFOLDERDATA) );
+ memset(ExtraFolderData[next_folder_id], 0, sizeof(EXFOLDERDATA));
+
+ ExtraFolderData[next_folder_id]->m_nFolderId = next_folder_id;
+ ExtraFolderData[next_folder_id]->m_nIconId = IDI_FOLDER;
+ ExtraFolderData[next_folder_id]->m_nParent = lpFolder->m_nFolderId;
+ ExtraFolderData[next_folder_id]->m_nSubIconId = -1;
+ strcpy( ExtraFolderData[next_folder_id]->m_szTitle, "Requires Artwork" );
+ ExtraFolderData[next_folder_id++]->m_dwFlags = 0;
+ AddFolder(lpArt);
+ // no games in top level folder
+ SetAllBits(lpFolder->m_lpGameBits,false);
+
+ for (int jj = 0; jj < nGames; jj++)
+ {
+ uint32_t cache = GetDriverCacheLower(jj);
+ if (BIT(cache, 21))
+ AddGame(lpWrongCol,jj);
+
+ if (BIT(cache, 22))
+ AddGame(lpProt,jj);
+
+ if (BIT(cache, 20))
+ AddGame(lpImpCol,jj);
+
+ if (BIT(cache, 18))
+ AddGame(lpImpGraph,jj);
+
+ if (BIT(cache, 17))
+ AddGame(lpMissSnd,jj);
+
+ if (BIT(cache, 16))
+ AddGame(lpImpSnd,jj);
+
+ if (BIT(cache, 8))
+ AddGame(lpFlip,jj);
+
+ if (BIT(cache, 10))
+ AddGame(lpArt,jj);
+ }
+}
+
+void CreateDumpingFolders(int parent_index)
+{
+ BOOL bBadDump = false;
+ BOOL bNoDump = false;
+ int nGames = driver_list::total();
+ LPTREEFOLDER lpFolder = treeFolders[parent_index];
+ const rom_entry *rom;
+ const game_driver *gamedrv;
+
+ // create our two subfolders
+ LPTREEFOLDER lpBad, lpNo;
+ lpBad = NewFolder("Bad Dump", next_folder_id, parent_index, IDI_FOLDER_DUMP, GetFolderFlags(numFolders));
+ ExtraFolderData[next_folder_id] = (EXFOLDERDATA*)malloc(sizeof(EXFOLDERDATA));
+ memset(ExtraFolderData[next_folder_id], 0, sizeof(EXFOLDERDATA));
+
+ ExtraFolderData[next_folder_id]->m_nFolderId = next_folder_id;
+ ExtraFolderData[next_folder_id]->m_nIconId = IDI_FOLDER_DUMP;
+ ExtraFolderData[next_folder_id]->m_nParent = lpFolder->m_nFolderId;
+ ExtraFolderData[next_folder_id]->m_nSubIconId = -1;
+ strcpy( ExtraFolderData[next_folder_id]->m_szTitle, "Bad Dump" );
+ ExtraFolderData[next_folder_id++]->m_dwFlags = 0;
+ AddFolder(lpBad);
+ lpNo = NewFolder("No Dump", next_folder_id, parent_index, IDI_FOLDER_DUMP, GetFolderFlags(numFolders));
+ ExtraFolderData[next_folder_id] = (EXFOLDERDATA*)malloc(sizeof(EXFOLDERDATA));
+ memset(ExtraFolderData[next_folder_id], 0, sizeof(EXFOLDERDATA));
+
+ ExtraFolderData[next_folder_id]->m_nFolderId = next_folder_id;
+ ExtraFolderData[next_folder_id]->m_nIconId = IDI_FOLDER_DUMP;
+ ExtraFolderData[next_folder_id]->m_nParent = lpFolder->m_nFolderId;
+ ExtraFolderData[next_folder_id]->m_nSubIconId = -1;
+ strcpy( ExtraFolderData[next_folder_id]->m_szTitle, "No Dump" );
+ ExtraFolderData[next_folder_id++]->m_dwFlags = 0;
+ AddFolder(lpNo);
+
+ // no games in top level folder
+ SetAllBits(lpFolder->m_lpGameBits,false);
+
+ for (int jj = 0; jj < nGames; jj++)
+ {
+ gamedrv = &driver_list::driver(jj);
+
+ if (!gamedrv->rom)
+ continue;
+ bBadDump = false;
+ bNoDump = false;
+ /* Allocate machine config */
+ machine_config config(*gamedrv,MameUIGlobal());
+
+ for (device_t &device : device_enumerator(config.root_device()))
+ {
+ for (const rom_entry *region = rom_first_region(device); region; region = rom_next_region(region))
+ {
+ for (rom = rom_first_file(region); rom; rom = rom_next_file(rom))
+ {
+ if (ROMREGION_ISROMDATA(region) || ROMREGION_ISDISKDATA(region) )
+ {
+ //name = ROM_GETNAME(rom);
+ util::hash_collection hashes(rom->hashdata());
+ if (hashes.flag(util::hash_collection::FLAG_BAD_DUMP))
+ bBadDump = true;
+ if (hashes.flag(util::hash_collection::FLAG_NO_DUMP))
+ bNoDump = true;
+ }
+ }
+ }
+ }
+ if (bBadDump)
+ AddGame(lpBad,jj);
+
+ if (bNoDump)
+ AddGame(lpNo,jj);
+ }
+ const char *fname = "Dumping";
+ SaveExternalFolders(parent_index, fname);
+}
+
+
+void CreateYearFolders(int parent_index)
+{
+ int i,jj;
+ int nGames = driver_list::total();
+ int start_folder = numFolders;
+ LPTREEFOLDER lpFolder = treeFolders[parent_index];
+
+ // no games in top level folder
+ SetAllBits(lpFolder->m_lpGameBits, false);
+
+ for (jj = 0; jj < nGames; jj++)
+ {
+ char s[strlen(driver_list::driver(jj).year)+1];
+ strcpy(s,driver_list::driver(jj).year);
+
+ if (s[0] == '\0' || s[0] == '?')
+ continue;
+
+ if (s[4] == '?')
+ s[4] = '\0';
+
+ // look for an extant year treefolder for this game
+ // (likely to be the previous one, so start at the end)
+ for (i=numFolders-1;i>=start_folder;i--)
+ {
+ if (strncmp(treeFolders[i]->m_lpTitle, s, 4) == 0)
+ {
+ AddGame(treeFolders[i], jj);
+ break;
+ }
+ }
+ if (i == start_folder-1)
+ {
+ // nope, it's a year we haven't seen before, make it.
+ LPTREEFOLDER lpTemp;
+ lpTemp = NewFolder(s, next_folder_id, parent_index, IDI_YEAR, GetFolderFlags(numFolders));
+ ExtraFolderData[next_folder_id] = (EXFOLDERDATA*)malloc(sizeof(EXFOLDERDATA));
+ memset(ExtraFolderData[next_folder_id], 0, sizeof(EXFOLDERDATA));
+
+ ExtraFolderData[next_folder_id]->m_nFolderId = next_folder_id;
+ ExtraFolderData[next_folder_id]->m_nIconId = IDI_YEAR;
+ ExtraFolderData[next_folder_id]->m_nParent = lpFolder->m_nFolderId;
+ ExtraFolderData[next_folder_id]->m_nSubIconId = -1;
+ strcpy( ExtraFolderData[next_folder_id]->m_szTitle, s );
+ ExtraFolderData[next_folder_id++]->m_dwFlags = 0;
+ AddFolder(lpTemp);
+ AddGame(lpTemp, jj);
+ }
+ }
+ const char *fname = "Year";
+ SaveExternalFolders(parent_index, fname);
+}
+
+void CreateResolutionFolders(int parent_index)
+{
+ int i,jj;
+ int nGames = driver_list::total();
+ int start_folder = numFolders;
+ char Screen[2048];
+ const game_driver *gamedrv;
+ LPTREEFOLDER lpFolder = treeFolders[parent_index];
+
+ // no games in top level folder
+ SetAllBits(lpFolder->m_lpGameBits, false);
+
+ for (jj = 0; jj < nGames; jj++)
+ {
+ gamedrv = &driver_list::driver(jj);
+ /* Allocate machine config */
+ machine_config config(*gamedrv,MameUIGlobal());
+
+ if (isDriverVector(&config))
+ sprintf(Screen, "Vector");
+ else
+ {
+ screen_device_enumerator iter(config.root_device());
+ const screen_device *screen = iter.first();
+ if (screen == NULL)
+ strcpy(Screen, "Screenless Game");
+ else
+ {
+ for (screen_device &screen : screen_device_enumerator(config.root_device()))
+ {
+ const rectangle &visarea = screen.visible_area();
+
+ sprintf(Screen,"%d x %d (%c)", visarea.max_y - visarea.min_y + 1, visarea.max_x - visarea.min_x + 1,
+ (driver_list::driver(jj).flags & ORIENTATION_SWAP_XY) ? 'V':'H');
+
+ // look for an existant screen treefolder for this game
+ // (likely to be the previous one, so start at the end)
+ for (i=numFolders-1;i>=start_folder;i--)
+ {
+ if (strcmp(treeFolders[i]->m_lpTitle, Screen) == 0)
+ {
+ AddGame(treeFolders[i],jj);
+ break;
+ }
+ }
+ if (i == start_folder-1)
+ {
+ // nope, it's a screen we haven't seen before, make it.
+ LPTREEFOLDER lpTemp = NewFolder(Screen, next_folder_id++, parent_index, IDI_SCREEN, GetFolderFlags(numFolders));
+ ExtraFolderData[next_folder_id] = (EXFOLDERDATA*)malloc(sizeof(EXFOLDERDATA));
+ memset(ExtraFolderData[next_folder_id], 0, sizeof(EXFOLDERDATA));
+
+ ExtraFolderData[next_folder_id]->m_nFolderId = next_folder_id;
+ ExtraFolderData[next_folder_id]->m_nIconId = IDI_SCREEN;
+ ExtraFolderData[next_folder_id]->m_nParent = lpFolder->m_nFolderId;
+ ExtraFolderData[next_folder_id]->m_nSubIconId = -1;
+ strcpy( ExtraFolderData[next_folder_id]->m_szTitle, Screen );
+ ExtraFolderData[next_folder_id++]->m_dwFlags = 0;
+ AddFolder(lpTemp);
+ AddGame(lpTemp,jj);
+ }
+ }
+ }
+ }
+ }
+ const char *fname = "Resolution";
+ SaveExternalFolders(parent_index, fname);
+}
+
+void CreateFPSFolders(int parent_index)
+{
+ int i,jj;
+ int nGames = driver_list::total();
+ int start_folder = numFolders;
+ char Screen[2048];
+ const game_driver *gamedrv;
+ LPTREEFOLDER lpFolder = treeFolders[parent_index];
+
+ // no games in top level folder
+ SetAllBits(lpFolder->m_lpGameBits, false);
+
+ for (jj = 0; jj < nGames; jj++)
+ {
+ gamedrv = &driver_list::driver(jj);
+ /* Allocate machine config */
+ machine_config config(*gamedrv,MameUIGlobal());
+
+ if (isDriverVector(&config))
+ sprintf(Screen, "Vector");
+ else
+ {
+ screen_device_enumerator iter(config.root_device());
+ const screen_device *screen = iter.first();
+ if (screen == NULL)
+ strcpy(Screen, "Screenless Game");
+ else
+ {
+ for (screen_device &screen : screen_device_enumerator(config.root_device()))
+ {
+ sprintf(Screen,"%f Hz", ATTOSECONDS_TO_HZ(screen.refresh_attoseconds()));
+
+ // look for an existant screen treefolder for this game
+ // (likely to be the previous one, so start at the end)
+ for (i=numFolders-1;i>=start_folder;i--)
+ {
+ if (strcmp(treeFolders[i]->m_lpTitle, Screen) == 0)
+ {
+ AddGame(treeFolders[i],jj);
+ break;
+ }
+ }
+ if (i == start_folder-1)
+ {
+ // nope, it's a screen we haven't seen before, make it.
+ LPTREEFOLDER lpTemp = NewFolder(Screen, next_folder_id++, parent_index, IDI_SCREEN, GetFolderFlags(numFolders));
+ ExtraFolderData[next_folder_id] = (EXFOLDERDATA*)malloc(sizeof(EXFOLDERDATA));
+ memset(ExtraFolderData[next_folder_id], 0, sizeof(EXFOLDERDATA));
+
+ ExtraFolderData[next_folder_id]->m_nFolderId = next_folder_id;
+ ExtraFolderData[next_folder_id]->m_nIconId = IDI_SCREEN;
+ ExtraFolderData[next_folder_id]->m_nParent = lpFolder->m_nFolderId;
+ ExtraFolderData[next_folder_id]->m_nSubIconId = -1;
+ strcpy( ExtraFolderData[next_folder_id]->m_szTitle, Screen );
+ ExtraFolderData[next_folder_id++]->m_dwFlags = 0;
+ AddFolder(lpTemp);
+ AddGame(lpTemp,jj);
+ }
+ }
+ }
+ }
+ }
+ const char *fname = "Refresh";
+ SaveExternalFolders(parent_index, fname);
+}
+
+
+#pragma GCC diagnostic ignored "-Wunused-but-set-variable"
+
+// adds these folders to the treeview
+void ResetTreeViewFolders(void)
+{
+ HWND hTreeView = GetTreeView();
+
+ // currently "cached" parent
+ HTREEITEM shti, hti_parent = NULL;
+ int index_parent = -1;
+
+ BOOL res = TreeView_DeleteAllItems(hTreeView);
+
+ //printf("Adding folders to tree ui indices %i to %i\n",start_index,end_index);
+
+ TVINSERTSTRUCT tvs;
+ tvs.hInsertAfter = TVI_SORT;
+
+ TVITEM tvi;
+ for (int i=0; i<numFolders; i++)
+ {
+ LPTREEFOLDER lpFolder = treeFolders[i];
+
+ if (lpFolder->m_nParent == -1)
+ {
+ if (lpFolder->m_nFolderId < MAX_FOLDERS)
+ // it's a built in folder, let's see if we should show it
+ if (GetShowFolder(lpFolder->m_nFolderId) == false)
+ continue;
+
+ tvi.mask = TVIF_TEXT | TVIF_PARAM | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
+ tvs.hParent = TVI_ROOT;
+ tvi.pszText = lpFolder->m_lptTitle;
+ tvi.lParam = (LPARAM)lpFolder;
+ tvi.iImage = GetTreeViewIconIndex(lpFolder->m_nIconId);
+ tvi.iSelectedImage = 0;
+ tvs.item = tvi;
+
+ // Add root branch
+ hti_parent = TreeView_InsertItem(hTreeView, &tvs);
+
+ continue;
+ }
+
+ // not a top level branch, so look for parent
+ if (treeFolders[i]->m_nParent != index_parent)
+ {
+
+ hti_parent = TreeView_GetRoot(hTreeView);
+ while (1)
+ {
+ if (hti_parent == NULL)
+ // couldn't find parent folder, so it's a built-in but
+ // not shown folder
+ break;
+
+ tvi.hItem = hti_parent;
+ tvi.mask = TVIF_PARAM;
+ res = TreeView_GetItem(hTreeView,&tvi);
+ if (((LPTREEFOLDER)tvi.lParam) == treeFolders[treeFolders[i]->m_nParent])
+ break;
+
+ hti_parent = TreeView_GetNextSibling(hTreeView,hti_parent);
+ }
+
+ // if parent is not shown, then don't show the child either obviously!
+ if (hti_parent == NULL)
+ continue;
+
+ index_parent = treeFolders[i]->m_nParent;
+ }
+
+ tvi.mask = TVIF_TEXT | TVIF_PARAM | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
+ tvs.hParent = hti_parent;
+ tvi.iImage = GetTreeViewIconIndex(treeFolders[i]->m_nIconId);
+ tvi.iSelectedImage = 0;
+ tvi.pszText = treeFolders[i]->m_lptTitle;
+ tvi.lParam = (LPARAM)treeFolders[i];
+ tvs.item = tvi;
+
+ // Add it to this tree branch
+ shti = TreeView_InsertItem(hTreeView, &tvs); // for current child branches
+ }
+}
+#pragma GCC diagnostic error "-Wunused-but-set-variable"
+
+void SelectTreeViewFolder(int folder_id)
+{
+ BOOL res = false;
+ HWND hTreeView = GetTreeView();
+ HTREEITEM hti;
+ TVITEM tvi;
+ memset(&tvi,0,sizeof(tvi));
+
+ hti = TreeView_GetRoot(hTreeView);
+
+ while (hti != NULL)
+ {
+ HTREEITEM hti_next;
+
+ tvi.hItem = hti;
+ tvi.mask = TVIF_PARAM;
+ res = TreeView_GetItem(hTreeView,&tvi);
+
+ if (tvi.lParam)
+ {
+ if (((LPTREEFOLDER)tvi.lParam)->m_nFolderId == folder_id)
+ {
+ res = TreeView_SelectItem(hTreeView,tvi.hItem);
+ SetCurrentFolder((LPTREEFOLDER)tvi.lParam);
+ return;
+ }
+ }
+
+ hti_next = TreeView_GetChild(hTreeView,hti);
+ if (hti_next == NULL)
+ {
+ hti_next = TreeView_GetNextSibling(hTreeView,hti);
+ if (hti_next == NULL)
+ {
+ hti_next = TreeView_GetParent(hTreeView,hti);
+ if (hti_next != NULL)
+ hti_next = TreeView_GetNextSibling(hTreeView,hti_next);
+ }
+ }
+ hti = hti_next;
+ }
+
+ // could not find folder to select
+ // make sure we select something
+ tvi.hItem = TreeView_GetRoot(hTreeView);
+ tvi.mask = TVIF_PARAM;
+ res = TreeView_GetItem(hTreeView,&tvi);
+ res = TreeView_SelectItem(hTreeView,tvi.hItem);
+ SetCurrentFolder((LPTREEFOLDER)tvi.lParam);
+ res++;
+}
+
+/*
+ * Does this folder have an INI associated with it?
+ * Currently only true for FOLDER_VECTOR and children
+ * of FOLDER_SOURCE.
+ */
+static BOOL FolderHasIni(LPTREEFOLDER lpFolder)
+{
+ LPCFOLDERDATA data = FindFilter(lpFolder->m_nFolderId);
+ if (data)
+ if (data->m_opttype < OPTIONS_MAX)
+ return true;
+
+ if (lpFolder->m_nParent != -1 && FOLDER_SOURCE == treeFolders[lpFolder->m_nParent]->m_nFolderId)
+ return true;
+
+ return false;
+}
+
+/* Add a folder to the list. Does not allocate */
+static BOOL AddFolder(LPTREEFOLDER lpFolder)
+{
+ TREEFOLDER **tmpTree = NULL;
+ UINT oldFolderArrayLength = folderArrayLength;
+ if (numFolders + 1 >= folderArrayLength)
+ {
+ folderArrayLength += 500;
+ tmpTree = (TREEFOLDER **)malloc(sizeof(TREEFOLDER **) * folderArrayLength);
+ memcpy(tmpTree,treeFolders,sizeof(TREEFOLDER **) * oldFolderArrayLength);
+ if (treeFolders) free(treeFolders);
+ treeFolders = tmpTree;
+ }
+
+ /* Is there an folder.ini that can be edited? */
+ if (FolderHasIni(lpFolder))
+ lpFolder->m_dwFlags |= F_INIEDIT;
+
+ treeFolders[numFolders] = lpFolder;
+ numFolders++;
+ return true;
+}
+
+/* Allocate and initialize a NEW TREEFOLDER */
+static LPTREEFOLDER NewFolder(const char *lpTitle, UINT nFolderId, int nParent, UINT nIconId, DWORD dwFlags)
+{
+ LPTREEFOLDER lpFolder = (LPTREEFOLDER)malloc(sizeof(TREEFOLDER));
+ memset(lpFolder, '\0', sizeof (TREEFOLDER));
+ lpFolder->m_lpTitle = (LPSTR)malloc(strlen(lpTitle) + 1);
+ strcpy((char *)lpFolder->m_lpTitle,lpTitle);
+ lpFolder->m_lptTitle = ui_wstring_from_utf8(lpFolder->m_lpTitle);
+ lpFolder->m_lpGameBits = NewBits(driver_list::total());
+ lpFolder->m_nFolderId = nFolderId;
+ lpFolder->m_nParent = nParent;
+ lpFolder->m_nIconId = nIconId;
+ lpFolder->m_dwFlags = dwFlags;
+ return lpFolder;
+}
+
+/* Deallocate the passed in LPTREEFOLDER */
+static void DeleteFolder(LPTREEFOLDER lpFolder)
+{
+ if (lpFolder)
+ {
+ if (lpFolder->m_lpGameBits)
+ {
+ DeleteBits(lpFolder->m_lpGameBits);
+ lpFolder->m_lpGameBits = 0;
+ }
+ free(lpFolder->m_lptTitle);
+ lpFolder->m_lptTitle = 0;
+ free(lpFolder->m_lpTitle);
+ lpFolder->m_lpTitle = 0;
+ free(lpFolder);
+ lpFolder = 0;
+ }
+}
+
+/* Can be called to re-initialize the array of treeFolders */
+BOOL InitFolders(void)
+{
+ int i = 0;
+ DWORD dwFolderFlags;
+ if (treeFolders != NULL)
+ {
+ for (i = numFolders - 1; i >= 0; i--)
+ {
+ DeleteFolder(treeFolders[i]);
+ treeFolders[i] = 0;
+ numFolders--;
+ }
+ }
+ numFolders = 0;
+ if (folderArrayLength == 0)
+ {
+ folderArrayLength = 200;
+ treeFolders = (TREEFOLDER **)malloc(sizeof(TREEFOLDER **) * folderArrayLength);
+ if (!treeFolders)
+ {
+ folderArrayLength = 0;
+ return 0;
+ }
+ else
+ memset(treeFolders,'\0', sizeof(TREEFOLDER **) * folderArrayLength);
+ }
+ // built-in top level folders
+ for (i = 0; g_lpFolderData[i].m_lpTitle; i++)
+ {
+ if (RequiredDriverCache() || (!RequiredDriverCache() && !g_lpFolderData[i].m_process))
+ {
+ LPCFOLDERDATA fData = &g_lpFolderData[i];
+ /* get the saved folder flags */
+ dwFolderFlags = GetFolderFlags(numFolders);
+ /* create the folder */
+ AddFolder(NewFolder(fData->m_lpTitle, fData->m_nFolderId, -1, fData->m_nIconId, dwFolderFlags));
+ }
+ }
+
+ numExtraFolders = InitExtraFolders();
+
+ for (i = 0; i < numExtraFolders; i++)
+ {
+ LPEXFOLDERDATA fExData = ExtraFolderData[i];
+ // OR in the saved folder flags
+ dwFolderFlags = fExData->m_dwFlags | GetFolderFlags(numFolders);
+ // create the folder, but if we are building the cache, the name must not be a pre-built one
+ int k = 0;
+ if (RequiredDriverCache())
+ for (int j = 0; g_lpFolderData[j].m_lpTitle; j++)
+ if (strcmp(fExData->m_szTitle, g_lpFolderData[j].m_lpTitle)==0)
+ k++;
+
+ if (k == 0)
+ AddFolder(NewFolder(fExData->m_szTitle,fExData->m_nFolderId,fExData->m_nParent, fExData->m_nIconId,dwFolderFlags));
+ }
+
+// creates child folders of all the top level folders, including custom ones
+ int num_top_level_folders = numFolders;
+
+ for (int i = 0; i < num_top_level_folders; i++)
+ {
+ LPTREEFOLDER lpFolder = treeFolders[i];
+ LPCFOLDERDATA lpFolderData = NULL;
+
+ for (int j = 0; g_lpFolderData[j].m_lpTitle; j++)
+ {
+ if (g_lpFolderData[j].m_nFolderId == lpFolder->m_nFolderId)
+ {
+ lpFolderData = &g_lpFolderData[j];
+ break;
+ }
+ }
+
+ if (lpFolderData)
+ {
+ if (lpFolderData->m_pfnCreateFolders)
+ {
+ if (RequiredDriverCache() && lpFolderData->m_process) // rebuild cache
+ lpFolderData->m_pfnCreateFolders(i);
+ else
+ if (!lpFolderData->m_process) // build every time (CreateDeficiencyFolders)
+ lpFolderData->m_pfnCreateFolders(i);
+ }
+ }
+ else
+ {
+ if ((lpFolder->m_dwFlags & F_CUSTOM) == 0)
+ {
+ printf("Internal inconsistency with non-built-in folder, but not custom\n");
+ continue;
+ }
+
+ //printf("Loading custom folder %i %i\n",i,lpFolder->m_nFolderId);
+
+ // load the extra folder files, which also adds children
+ if (TryAddExtraFolderAndChildren(i) == false)
+ lpFolder->m_nFolderId = FOLDER_NONE;
+ }
+ }
+
+ CreateTreeIcons();
+ ResetWhichGamesInFolders();
+ ResetTreeViewFolders();
+ SelectTreeViewFolder(GetSavedFolderID());
+ LoadFolderFlags();
+ return true;
+}
+
+// create iconlist and Treeview control
+static BOOL CreateTreeIcons()
+{
+ HICON hIcon;
+ INT i;
+ HINSTANCE hInst = GetModuleHandle(0);
+
+ int numIcons = ICON_MAX + numExtraIcons;
+ hTreeSmall = ImageList_Create (16, 16, ILC_COLORDDB | ILC_MASK, numIcons, numIcons);
+
+ //printf("Trying to load %i normal icons\n",ICON_MAX);
+ for (i = 0; i < ICON_MAX; i++)
+ {
+ hIcon = LoadIconFromFile(treeIconNames[i].lpName);
+ if (!hIcon)
+ hIcon = LoadIcon(hInst, MAKEINTRESOURCE(treeIconNames[i].nResourceID));
+
+ if (ImageList_AddIcon (hTreeSmall, hIcon) == -1)
+ {
+ ErrorMsg("Error creating icon on regular folder, %i %i",i,hIcon != NULL);
+ return false;
+ }
+ }
+
+ //printf("Trying to load %i extra custom-folder icons\n",numExtraIcons);
+ for (i = 0; i < numExtraIcons; i++)
+ {
+ if ((hIcon = LoadIconFromFile(ExtraFolderIcons[i])) == 0)
+ hIcon = LoadIcon (hInst, MAKEINTRESOURCE(IDI_FOLDER));
+
+ if (ImageList_AddIcon(hTreeSmall, hIcon) == -1)
+ {
+ ErrorMsg("Error creating icon on extra folder, %i %i",i,hIcon != NULL);
+ return false;
+ }
+ }
+
+ // Be sure that all the small icons were added.
+ if (ImageList_GetImageCount(hTreeSmall) < numIcons)
+ {
+ ErrorMsg("Error with icon list--too few images. %i %i", ImageList_GetImageCount(hTreeSmall),numIcons);
+ return false;
+ }
+
+ // Be sure that all the small icons were added.
+
+ if (ImageList_GetImageCount (hTreeSmall) < ICON_MAX)
+ {
+ ErrorMsg("Error with icon list--too few images. %i < %i", ImageList_GetImageCount(hTreeSmall),(INT)ICON_MAX);
+ return false;
+ }
+
+ // Associate the image lists with the list view control.
+ (void)TreeView_SetImageList(GetTreeView(), hTreeSmall, TVSIL_NORMAL);
+
+ return true;
+}
+
+
+static void TreeCtrlOnPaint(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ PAINTSTRUCT ps;
+ RECT rcClip, rcClient;
+
+ HBITMAP hBackground = GetBackgroundBitmap();
+ MYBITMAPINFO *bmDesc = GetBackgroundInfo();
+
+ HDC hDC = BeginPaint(hWnd, &ps);
+
+ GetClipBox(hDC, &rcClip);
+ GetClientRect(hWnd, &rcClient);
+
+ // Create a compatible memory DC
+ HDC memDC = CreateCompatibleDC(hDC);
+
+ // Select a compatible bitmap into the memory DC
+ HBITMAP bitmap = CreateCompatibleBitmap(hDC, rcClient.right - rcClient.left, rcClient.bottom - rcClient.top);
+ HBITMAP hOldBitmap = (HBITMAP)SelectObject(memDC, bitmap);
+
+ // First let the control do its default drawing.
+ CallWindowProc(g_lpTreeWndProc, hWnd, uMsg, (WPARAM)memDC, 0);
+
+ // Draw bitmap in the background
+ // Now create a mask
+ HDC maskDC = CreateCompatibleDC(hDC);
+
+ // Create monochrome bitmap for the mask
+ HBITMAP maskBitmap = CreateBitmap(rcClient.right - rcClient.left, rcClient.bottom - rcClient.top, 1, 1, NULL);
+
+ HBITMAP hOldMaskBitmap = (HBITMAP)SelectObject(maskDC, maskBitmap);
+ SetBkColor(memDC, GetSysColor(COLOR_WINDOW));
+
+ // Create the mask from the memory DC
+ BitBlt(maskDC, 0, 0, rcClient.right - rcClient.left, rcClient.bottom - rcClient.top, memDC, rcClient.left, rcClient.top, SRCCOPY);
+
+ HDC tempDC = CreateCompatibleDC(hDC);
+ HBITMAP hOldHBitmap = (HBITMAP)SelectObject(tempDC, hBackground);
+
+ HDC imageDC = CreateCompatibleDC(hDC);
+ HBITMAP bmpImage = CreateCompatibleBitmap(hDC, rcClient.right - rcClient.left, rcClient.bottom - rcClient.top);
+ HBITMAP hOldBmpImage = (HBITMAP)SelectObject(imageDC, bmpImage);
+
+ HPALETTE hPAL = GetBackgroundPalette();
+ if (hPAL == NULL)
+ hPAL = CreateHalftonePalette(hDC);
+
+ if (GetDeviceCaps(hDC, RASTERCAPS) & RC_PALETTE && hPAL != NULL)
+ {
+ SelectPalette(hDC, hPAL, false);
+ RealizePalette(hDC);
+ SelectPalette(imageDC, hPAL, false);
+ }
+
+ // Get x and y offset
+ RECT rcRoot;
+ TreeView_GetItemRect(hWnd, TreeView_GetRoot(hWnd), &rcRoot, false);
+ rcRoot.left = -GetScrollPos(hWnd, SB_HORZ);
+
+ // Draw bitmap in tiled manner to imageDC
+ for (int i = rcRoot.left; i < rcClient.right; i += bmDesc->bmWidth)
+ for (int j = rcRoot.top; j < rcClient.bottom; j += bmDesc->bmHeight)
+ BitBlt(imageDC, i, j, bmDesc->bmWidth, bmDesc->bmHeight, tempDC, 0, 0, SRCCOPY);
+
+ // Set the background in memDC to black. Using SRCPAINT with black and any other
+ // color results in the other color, thus making black the transparent color
+ SetBkColor(memDC, RGB(0,0,0));
+ SetTextColor(memDC, RGB(255,255,255));
+ BitBlt(memDC, rcClip.left, rcClip.top, rcClip.right - rcClip.left, rcClip.bottom - rcClip.top, maskDC, rcClip.left, rcClip.top, SRCAND);
+
+ // Set the foreground to black. See comment above.
+ SetBkColor(imageDC, RGB(255,255,255));
+ SetTextColor(imageDC, RGB(0,0,0));
+ BitBlt(imageDC, rcClip.left, rcClip.top, rcClip.right - rcClip.left, rcClip.bottom - rcClip.top, maskDC, rcClip.left, rcClip.top, SRCAND);
+
+ // Combine the foreground with the background
+ BitBlt(imageDC, rcClip.left, rcClip.top, rcClip.right - rcClip.left, rcClip.bottom - rcClip.top, memDC, rcClip.left, rcClip.top, SRCPAINT);
+
+ // Draw the final image to the screen
+ BitBlt(hDC, rcClip.left, rcClip.top, rcClip.right - rcClip.left, rcClip.bottom - rcClip.top, imageDC, rcClip.left, rcClip.top, SRCCOPY);
+
+ SelectObject(maskDC, hOldMaskBitmap);
+ SelectObject(tempDC, hOldHBitmap);
+ SelectObject(imageDC, hOldBmpImage);
+
+ DeleteDC(maskDC);
+ DeleteDC(imageDC);
+ DeleteDC(tempDC);
+ DeleteBitmap(bmpImage);
+ DeleteBitmap(maskBitmap);
+
+ if (GetBackgroundPalette() == NULL)
+ {
+ DeletePalette(hPAL);
+ hPAL = NULL;
+ }
+
+ SelectObject(memDC, hOldBitmap);
+ DeleteBitmap(bitmap);
+ DeleteDC(memDC);
+ EndPaint(hWnd, &ps);
+ ReleaseDC(hWnd, hDC);
+}
+
+/* Header code - Directional Arrows */
+static LRESULT CALLBACK TreeWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ if (GetBackgroundBitmap() != NULL)
+ {
+ switch (uMsg)
+ {
+ case WM_MOUSEMOVE:
+ {
+ if (MouseHasBeenMoved())
+ ShowCursor(true);
+ break;
+ }
+
+ case WM_KEYDOWN :
+ if (wParam == VK_F2)
+ {
+ if (lpCurrentFolder->m_dwFlags & F_CUSTOM)
+ {
+ TreeView_EditLabel(hWnd,TreeView_GetSelection(hWnd));
+ return true;
+ }
+ }
+ break;
+
+ case WM_ERASEBKGND:
+ return true;
+
+ case WM_PAINT:
+ TreeCtrlOnPaint(hWnd, uMsg, wParam, lParam);
+ UpdateWindow(hWnd);
+ break;
+ }
+ }
+
+ /* message not handled */
+ return CallWindowProc(g_lpTreeWndProc, hWnd, uMsg, wParam, lParam);
+}
+
+/*
+ * Filter code
+ * Added 01/09/99 - MSH <mhaaland@hypertech.com>
+ */
+
+/* find a FOLDERDATA by folderID */
+LPCFOLDERDATA FindFilter(DWORD folderID)
+{
+ for (int i = 0; g_lpFolderData[i].m_lpTitle; i++)
+ if (g_lpFolderData[i].m_nFolderId == folderID)
+ return &g_lpFolderData[i];
+
+ return (LPFOLDERDATA) 0;
+}
+
+LPTREEFOLDER GetFolderByName(int nParentId, const char *pszFolderName)
+{
+ //First Get the Parent TreeviewItem
+ //Enumerate Children
+ for(int i = 0; i < numFolders/* ||treeFolders[i] != NULL*/; i++)
+ {
+ if (!strcmp(treeFolders[i]->m_lpTitle, pszFolderName))
+ {
+ int nParent = treeFolders[i]->m_nParent;
+ if ((nParent >= 0) && treeFolders[nParent]->m_nFolderId == nParentId)
+ return treeFolders[i];
+ }
+ }
+ return NULL;
+}
+
+static int InitExtraFolders(void)
+{
+ struct stat stat_buffer;
+ struct _finddata_t files;
+ int i, count = 0;
+ char * ext;
+ char buf[2048];
+ char curdir[MAX_PATH];
+ const std::string t = dir_get_value(24);
+ const char *dir = t.c_str();
+ memset(ExtraFolderData, 0, (MAX_EXTRA_FOLDERS * MAX_EXTRA_SUBFOLDERS)* sizeof(LPEXFOLDERDATA));
+
+ /* NPW 9-Feb-2003 - MSVC stat() doesn't like stat() called with an empty string */
+ if (!dir)
+ return 0; //dir = ".";
+
+ // Why create the directory if it doesn't exist, just return 0 folders.
+ if (stat(dir, &stat_buffer) != 0)
+ return 0;
+
+ _getcwd(curdir, MAX_PATH);
+
+ chdir(dir);
+
+ for (i = 0; i < MAX_EXTRA_FOLDERS; i++)
+ ExtraFolderIcons[i] = NULL;
+
+ numExtraIcons = 0;
+ intptr_t hLong = 0L;
+
+ if ( (hLong = _findfirst("*.ini", &files)) == -1L )
+ return 0;
+
+ do
+ {
+ if ((files.attrib & _A_SUBDIR) == 0)
+ {
+ FILE *fp;
+
+ fp = fopen(files.name, "r");
+ if (fp != NULL)
+ {
+ int icon[2] = { 0, 0 };
+ char *p, *name;
+
+ while (fgets(buf, 256, fp))
+ {
+ if (buf[0] == '[')
+ {
+ p = strchr(buf, ']');
+ if (p == NULL)
+ continue;
+
+ *p = '\0';
+ name = &buf[1];
+ if (!strcmp(name, "FOLDER_SETTINGS"))
+ {
+ while (fgets(buf, 256, fp))
+ {
+ name = strtok(buf, " =\r\n");
+ if (name == NULL)
+ break;
+
+ if (!strcmp(name, "RootFolderIcon"))
+ {
+ name = strtok(NULL, " =\r\n");
+ if (name != NULL)
+ SetExtraIcons(name, &icon[0]);
+ }
+ if (!strcmp(name, "SubFolderIcon"))
+ {
+ name = strtok(NULL, " =\r\n");
+ if (name != NULL)
+ SetExtraIcons(name, &icon[1]);
+ }
+ }
+ break;
+ }
+ }
+ }
+ fclose(fp);
+
+ strcpy(buf, files.name);
+ ext = strrchr(buf, '.');
+
+ if (ext && *(ext + 1) && (core_stricmp(ext + 1, "ini")==0))
+ {
+ ExtraFolderData[count] =(EXFOLDERDATA*) malloc(sizeof(EXFOLDERDATA));
+ if (ExtraFolderData[count])
+ {
+ *ext = '\0';
+
+ memset(ExtraFolderData[count], 0, sizeof(EXFOLDERDATA));
+
+ strncpy(ExtraFolderData[count]->m_szTitle, buf, 63);
+ ExtraFolderData[count]->m_nFolderId = next_folder_id++;
+ ExtraFolderData[count]->m_nParent = -1;
+ ExtraFolderData[count]->m_dwFlags = F_CUSTOM;
+ ExtraFolderData[count]->m_nIconId = icon[0] ? -icon[0] : IDI_FOLDER;
+ ExtraFolderData[count]->m_nSubIconId = icon[1] ? -icon[1] : IDI_FOLDER;
+ //printf("extra folder with icon %i, subicon %i\n",
+ //ExtraFolderData[count]->m_nIconId,
+ //ExtraFolderData[count]->m_nSubIconId);
+ count++;
+ }
+ }
+ }
+ }
+ } while( _findnext(hLong, &files) == 0);
+
+ chdir(curdir);
+ _findclose(hLong);
+ return count;
+}
+
+void FreeExtraFolders(void)
+{
+ int i;
+
+ for (i = 0; i < numExtraFolders; i++)
+ {
+ if (ExtraFolderData[i])
+ {
+ free(ExtraFolderData[i]);
+ ExtraFolderData[i] = NULL;
+ }
+ }
+
+ for (i = 0; i < numExtraIcons; i++)
+ free(ExtraFolderIcons[i]);
+
+ numExtraIcons = 0;
+
+}
+
+
+static void SetExtraIcons(char *name, int *id)
+{
+ char *p = strchr(name, '.');
+
+ if (p != NULL)
+ *p = '\0';
+
+ ExtraFolderIcons[numExtraIcons] = (char*)malloc(strlen(name) + 1);
+ if (ExtraFolderIcons[numExtraIcons])
+ {
+ *id = ICON_MAX + numExtraIcons;
+ strcpy(ExtraFolderIcons[numExtraIcons], name);
+ numExtraIcons++;
+ }
+}
+
+
+// Called to add child folders of the top level extra folders already created
+BOOL TryAddExtraFolderAndChildren(int parent_index)
+{
+ FILE* fp = NULL;
+ char fname[MAX_PATH];
+ char readbuf[256];
+ char *p;
+ char *name;
+ int i;
+ LPTREEFOLDER lpTemp = NULL;
+ LPTREEFOLDER lpFolder = treeFolders[parent_index];
+
+ int current_id = lpFolder->m_nFolderId;
+
+ int id = lpFolder->m_nFolderId - MAX_FOLDERS;
+
+ /* "folder\title.ini" */
+
+ const std::string t = dir_get_value(24);
+ sprintf( fname, "%s\\%s.ini", t.c_str(), ExtraFolderData[id]->m_szTitle);
+
+ fp = fopen(fname, "r");
+ if (fp == NULL)
+ return false;
+
+ while ( fgets(readbuf, 256, fp) )
+ {
+ /* do we have [...] ? */
+
+ if (readbuf[0] == '[')
+ {
+ p = strchr(readbuf, ']');
+ if (p == NULL)
+ {
+ continue;
+ }
+
+ *p = '\0';
+ name = &readbuf[1];
+
+ /* is it [FOLDER_SETTINGS]? */
+
+ if (strcmp(name, "FOLDER_SETTINGS") == 0)
+ {
+ current_id = -1;
+ continue;
+ }
+ else
+ {
+ /* it it [ROOT_FOLDER]? */
+
+ if (!strcmp(name, "ROOT_FOLDER"))
+ {
+ current_id = lpFolder->m_nFolderId;
+ lpTemp = lpFolder;
+
+ }
+ else
+ {
+ /* must be [folder name] */
+
+ current_id = next_folder_id++;
+ /* create a new folder with this name,
+ and the flags for this folder as read from the registry */
+ lpTemp = NewFolder(name,current_id,parent_index,
+ ExtraFolderData[id]->m_nSubIconId,
+ GetFolderFlags(numFolders) | F_CUSTOM);
+ ExtraFolderData[current_id] = (EXFOLDERDATA*)malloc(sizeof(EXFOLDERDATA));
+ memset(ExtraFolderData[current_id], 0, sizeof(EXFOLDERDATA));
+
+ ExtraFolderData[current_id]->m_nFolderId = current_id - MAX_EXTRA_FOLDERS;
+ ExtraFolderData[current_id]->m_nIconId = ExtraFolderData[id]->m_nSubIconId;
+ ExtraFolderData[current_id]->m_nParent = ExtraFolderData[id]->m_nFolderId;
+ ExtraFolderData[current_id]->m_nSubIconId = -1;
+ strcpy( ExtraFolderData[current_id]->m_szTitle, name );
+ ExtraFolderData[current_id]->m_dwFlags = ExtraFolderData[id]->m_dwFlags;
+ AddFolder(lpTemp);
+ }
+ }
+ }
+ else if (current_id != -1)
+ {
+ /* string on a line by itself -- game name */
+
+ name = strtok(readbuf, " \t\r\n");
+ if (name == NULL)
+ {
+ current_id = -1;
+ continue;
+ }
+
+ /* IMPORTANT: This assumes that all driver names are lowercase! */
+ for (i = 0; name[i]; i++)
+ name[i] = tolower(name[i]);
+
+ if (lpTemp == NULL)
+ {
+ ErrorMsg("Error parsing %s: missing [folder name] or [ROOT_FOLDER]", fname);
+ current_id = lpFolder->m_nFolderId;
+ lpTemp = lpFolder;
+ }
+ AddGame(lpTemp,GetGameNameIndex(name));
+ }
+ }
+
+ if ( fp )
+ fclose( fp );
+
+ return true;
+}
+
+
+void GetFolders(TREEFOLDER ***folders,int *num_folders)
+{
+ *folders = treeFolders;
+ *num_folders = numFolders;
+}
+
+static BOOL TryRenameCustomFolderIni(LPTREEFOLDER lpFolder, const char *old_name, const char *new_name)
+{
+ char filename[MAX_PATH];
+ char new_filename[MAX_PATH];
+ LPTREEFOLDER lpParent = NULL;
+ string ini_dir = GetIniDir();
+ const char* inidir = ini_dir.c_str();
+ if (lpFolder->m_nParent >= 0)
+ {
+ //it is a custom SubFolder
+ lpParent = GetFolder( lpFolder->m_nParent );
+ if( lpParent )
+ {
+ snprintf(filename,std::size(filename),"%s\\%s\\%s.ini",inidir,lpParent->m_lpTitle, old_name );
+ snprintf(new_filename,std::size(new_filename),"%s\\%s\\%s.ini",inidir,lpParent->m_lpTitle, new_name );
+ win_move_file_utf8(filename,new_filename);
+ }
+ }
+ else
+ {
+ //Rename the File, if it exists
+ snprintf(filename,std::size(filename),"%s\\%s.ini",inidir,old_name );
+ snprintf(new_filename,std::size(new_filename),"%s\\%s.ini",inidir, new_name );
+ win_move_file_utf8(filename,new_filename);
+ //Rename the Directory, if it exists
+ snprintf(filename,std::size(filename),"%s\\%s",inidir,old_name );
+ snprintf(new_filename,std::size(new_filename),"%s\\%s",inidir, new_name );
+ win_move_file_utf8(filename,new_filename);
+ }
+ return true;
+}
+
+BOOL TryRenameCustomFolder(LPTREEFOLDER lpFolder, const char *new_name)
+{
+ char filename[MAX_PATH];
+ char new_filename[MAX_PATH];
+
+ if (lpFolder->m_nParent >= 0)
+ {
+ // a child extra folder was renamed, so do the rename and save the parent
+
+ // save old title
+ char *old_title = lpFolder->m_lpTitle;
+
+ // set new title
+ lpFolder->m_lpTitle = (char *)malloc(strlen(new_name) + 1);
+ strcpy(lpFolder->m_lpTitle,new_name);
+
+ // try to save
+ if (TrySaveExtraFolder(lpFolder) == false)
+ {
+ // failed, so free newly allocated title and restore old
+ free(lpFolder->m_lpTitle);
+ lpFolder->m_lpTitle = old_title;
+ return false;
+ }
+ TryRenameCustomFolderIni(lpFolder, old_title, new_name);
+ // successful, so free old title
+ free(old_title);
+ return true;
+ }
+
+ // a parent extra folder was renamed, so rename the file
+
+ const std::string t = dir_get_value(24);
+ snprintf(new_filename,std::size(new_filename),"%s\\%s.ini", t.c_str(), new_name);
+ snprintf(filename,std::size(filename),"%s\\%s.ini", t.c_str(), lpFolder->m_lpTitle);
+
+ BOOL retval = win_move_file_utf8(filename,new_filename);
+
+ if (retval)
+ {
+ TryRenameCustomFolderIni(lpFolder, lpFolder->m_lpTitle, new_name);
+ free(lpFolder->m_lpTitle);
+ lpFolder->m_lpTitle = (char *)malloc(strlen(new_name) + 1);
+ strcpy(lpFolder->m_lpTitle,new_name);
+ }
+ else
+ {
+ char buf[2048];
+ snprintf(buf,std::size(buf),"Error while renaming custom file %s to %s", filename,new_filename);
+ win_message_box_utf8(GetMainWindow(), buf, MAMEUINAME, MB_OK | MB_ICONERROR);
+ }
+ return retval;
+}
+
+void AddToCustomFolder(LPTREEFOLDER lpFolder,int driver_index)
+{
+ if ((lpFolder->m_dwFlags & F_CUSTOM) == 0)
+ {
+ win_message_box_utf8(GetMainWindow(),"Unable to add game to non-custom folder", MAMEUINAME,MB_OK | MB_ICONERROR);
+ return;
+ }
+
+ if (TestBit(lpFolder->m_lpGameBits,driver_index) == 0)
+ {
+ AddGame(lpFolder,driver_index);
+ if (TrySaveExtraFolder(lpFolder) == false)
+ RemoveGame(lpFolder,driver_index); // undo on error
+ }
+}
+
+void RemoveFromCustomFolder(LPTREEFOLDER lpFolder,int driver_index)
+{
+ if ((lpFolder->m_dwFlags & F_CUSTOM) == 0)
+ {
+ win_message_box_utf8(GetMainWindow(),"Unable to remove game from non-custom folder", MAMEUINAME,MB_OK | MB_ICONERROR);
+ return;
+ }
+
+ if (TestBit(lpFolder->m_lpGameBits,driver_index) != 0)
+ {
+ RemoveGame(lpFolder,driver_index);
+ if (TrySaveExtraFolder(lpFolder) == false)
+ AddGame(lpFolder,driver_index); // undo on error
+ }
+}
+
+BOOL TrySaveExtraFolder(LPTREEFOLDER lpFolder)
+{
+ char fname[MAX_PATH];
+ FILE *fp;
+ BOOL error = false;
+ int i,j;
+
+ LPTREEFOLDER root_folder = NULL;
+ LPEXFOLDERDATA extra_folder = NULL;
+
+ for (i=0; i<numExtraFolders; i++)
+ {
+ if (ExtraFolderData[i]->m_nFolderId == lpFolder->m_nFolderId)
+ {
+ root_folder = lpFolder;
+ extra_folder = ExtraFolderData[i];
+ break;
+ }
+
+ if (lpFolder->m_nParent >= 0 &&
+ ExtraFolderData[i]->m_nFolderId == treeFolders[lpFolder->m_nParent]->m_nFolderId)
+ {
+ root_folder = treeFolders[lpFolder->m_nParent];
+ extra_folder = ExtraFolderData[i];
+ break;
+ }
+ }
+
+ if (extra_folder == NULL || root_folder == NULL)
+ {
+ MessageBox(GetMainWindow(), TEXT("Error finding custom file name to save"), TEXT(MAMEUINAME), MB_OK | MB_ICONERROR);
+ return false;
+ }
+ /* "folder\title.ini" */
+
+ const std::string t = dir_get_value(24);
+ snprintf( fname, sizeof(fname), "%s\\%s.ini", t.c_str(), extra_folder->m_szTitle);
+
+ fp = fopen(fname, "wt");
+ if (fp == NULL)
+ error = true;
+ else
+ {
+ TREEFOLDER *folder_data;
+
+ fprintf(fp,"[FOLDER_SETTINGS]\n");
+ // negative values for icons means it's custom, so save 'em
+ if (extra_folder->m_nIconId < 0)
+ {
+ fprintf(fp, "RootFolderIcon %s\n", ExtraFolderIcons[(-extra_folder->m_nIconId) - ICON_MAX]);
+ }
+ if (extra_folder->m_nSubIconId < 0)
+ {
+ fprintf(fp,"SubFolderIcon %s\n", ExtraFolderIcons[(-extra_folder->m_nSubIconId) - ICON_MAX]);
+ }
+
+ /* need to loop over all our TREEFOLDERs--first the root one, then each child. Start with the root */
+
+ folder_data = root_folder;
+
+ fprintf(fp,"\n[ROOT_FOLDER]\n");
+
+ for (i=0;i<driver_list::total();i++)
+ {
+ if (TestBit(folder_data->m_lpGameBits, i))
+ {
+ fprintf(fp,"%s\n",driver_list::driver(i).name);
+ }
+ }
+
+ /* look through the custom folders for ones with our root as parent */
+ for (j=0;j<numFolders;j++)
+ {
+ folder_data = treeFolders[j];
+
+ if (folder_data->m_nParent >= 0 &&
+ treeFolders[folder_data->m_nParent] == root_folder)
+ {
+ fprintf(fp,"\n[%s]\n",folder_data->m_lpTitle);
+
+ for (i=0;i<driver_list::total();i++)
+ {
+ if (TestBit(folder_data->m_lpGameBits, i))
+ {
+ fprintf(fp,"%s\n",driver_list::driver(i).name);
+ }
+ }
+ }
+ }
+ if (fclose(fp) != 0)
+ error = true;
+ }
+
+ if (error)
+ {
+ char buf[500];
+ snprintf(buf,std::size(buf),"Error while saving custom file %s",fname);
+ win_message_box_utf8(GetMainWindow(), buf, MAMEUINAME, MB_OK | MB_ICONERROR);
+ }
+ return !error;
+}
+
+HIMAGELIST GetTreeViewIconList(void)
+{
+ return hTreeSmall;
+}
+
+int GetTreeViewIconIndex(int icon_id)
+{
+ if (icon_id < 0)
+ return -icon_id;
+
+ for (int i = 0; i < sizeof(treeIconNames) / sizeof(treeIconNames[0]); i++)
+ if (icon_id == treeIconNames[i].nResourceID)
+ return i;
+
+ return -1;
+}
+
+static void SaveExternalFolders(int parent_index, const char *fname)
+{
+ string val = dir_get_value(24);
+ char s[val.size()+1];
+ strcpy(s, val.c_str());
+ char *fdir = strtok(s, ";"); // get first dir
+
+ // create directory if needed
+ wchar_t *temp = ui_wstring_from_utf8(fdir);
+ BOOL res = CreateDirectory(temp, NULL);
+ free(temp);
+ if (!res)
+ {
+ if (GetLastError() == ERROR_PATH_NOT_FOUND)
+ {
+ printf("SaveExternalFolders: Unable to create the directory \"%s\".\n",fdir);
+ return;
+ }
+ }
+
+ // create/truncate file
+ string filename = fdir + string("\\") + fname + string(".ini");
+ FILE *f = fopen(filename.c_str(), "w");
+ if (f == NULL)
+ {
+ printf("SaveExternalFolders: Unable to open file %s for writing.\n",filename.c_str());
+ return;
+ }
+
+ // Populate the file
+ fprintf(f, "[FOLDER_SETTINGS]\n");
+ fprintf(f, "RootFolderIcon custom\n");
+ fprintf(f, "SubFolderIcon custom\n");
+
+ /* need to loop over all our TREEFOLDERs--first the root one, then each child.
+ start with the root */
+ LPTREEFOLDER lpFolder = treeFolders[parent_index];
+ TREEFOLDER *folder_data = lpFolder;
+ fprintf(f, "\n[ROOT_FOLDER]\n");
+
+ int i;
+ for (i = 0; i < driver_list::total(); i++)
+ {
+ if (TestBit(folder_data->m_lpGameBits, i))
+ fprintf(f, "%s\n", GetGameName(i).c_str());
+ }
+
+ /* look through the custom folders for ones with our root as parent */
+ for (int jj = 0; jj < numFolders; jj++)
+ {
+ folder_data = treeFolders[jj];
+
+ if (folder_data->m_nParent >= 0 && treeFolders[folder_data->m_nParent] == lpFolder)
+ {
+ fprintf(f, "\n[%s]\n", folder_data->m_lpTitle);
+
+ for (i = 0; i < driver_list::total(); i++)
+ {
+ if (TestBit(folder_data->m_lpGameBits, i))
+ fprintf(f, "%s\n", GetGameName(i).c_str());
+ }
+ }
+ }
+
+ fclose(f);
+ printf("SaveExternalFolders: Saved file %s.\n",filename.c_str());
+}
+
diff --git a/docs/release/src/osd/winui/treeview_o.h b/docs/release/src/osd/winui/treeview_o.h
new file mode 100644
index 00000000000..7c95e1d2220
--- /dev/null
+++ b/docs/release/src/osd/winui/treeview_o.h
@@ -0,0 +1,214 @@
+// For licensing and usage information, read docs/release/winui_license.txt
+//****************************************************************************
+// NOTE: ifdef MESS doesn't work here
+#ifndef WINUI_TREEVIEW_H
+#define WINUI_TREEVIEW_H
+
+/* corrections for commctrl.h */
+
+#if defined(__GNUC__)
+/* fix warning: cast does not match function type */
+#undef TreeView_InsertItem
+#define TreeView_InsertItem(w,i) (HTREEITEM)(LRESULT)(int)SendMessage((w),TVM_INSERTITEM,0,(LPARAM)(LPTV_INSERTSTRUCT)(i))
+
+#undef TreeView_SetImageList
+#define TreeView_SetImageList(w,h,i) (HIMAGELIST)(LRESULT)(int)SendMessage((w),TVM_SETIMAGELIST,i,(LPARAM)(HIMAGELIST)(h))
+
+#undef TreeView_GetNextItem
+#define TreeView_GetNextItem(w,i,c) (HTREEITEM)(LRESULT)(int)SendMessage((w),TVM_GETNEXTITEM,c,(LPARAM)(HTREEITEM)(i))
+
+#undef TreeView_HitTest
+#define TreeView_HitTest(hwnd, lpht) \
+ (HTREEITEM)(LRESULT)(int)SNDMSG((hwnd), TVM_HITTEST, 0, (LPARAM)(LPTV_HITTESTINFO)(lpht))
+
+/* fix wrong return type */
+#undef TreeView_Select
+#define TreeView_Select(w,i,c) (BOOL)(int)SendMessage((w),TVM_SELECTITEM,c,(LPARAM)(HTREEITEM)(i))
+
+#undef TreeView_EditLabel
+#define TreeView_EditLabel(w, i) SNDMSG(w,TVM_EDITLABEL,0,(LPARAM)(i))
+
+#endif /* defined(__GNUC__) */
+#include "bitmask.h"
+#include <stdint.h>
+#include "emu_opts.h"
+
+/***************************************************************************
+ Folder And Filter Definitions
+ ***************************************************************************/
+
+typedef struct
+{
+ const char *m_lpTitle; // Folder Title
+ const char *short_name; // for saving in the .ini
+ UINT m_nFolderId; // ID
+ UINT m_nIconId; // if >= 0, resource id of icon (IDI_xxx), otherwise index in image list
+ DWORD m_dwUnset; // Excluded filters
+ DWORD m_dwSet; // Implied filters
+ BOOL m_process; // 1 = process only if rebuilding the cache
+ void (*m_pfnCreateFolders)(int parent_index); // Constructor for special folders
+ BOOL (*m_pfnQuery)(uint32_t nDriver); // Query function
+ BOOL m_bExpectedResult; // Expected query result
+ OPTIONS_TYPE m_opttype = OPTIONS_MAX; // Has an ini file (vector.ini, etc)
+} FOLDERDATA, *LPFOLDERDATA;
+
+typedef const FOLDERDATA *LPCFOLDERDATA;
+
+typedef struct
+{
+ DWORD m_dwFilterType; /* Filter value */
+ DWORD m_dwCtrlID; /* Control ID that represents it */
+ BOOL (*m_pfnQuery)(uint32_t nDriver); /* Query function */
+ BOOL m_bExpectedResult; /* Expected query result */
+} FILTER_ITEM, *LPFILTER_ITEM;
+
+typedef const FILTER_ITEM *LPCFILTER_ITEM;
+
+/***************************************************************************
+ Functions to build builtin folder lists
+ ***************************************************************************/
+
+void CreateManufacturerFolders(int parent_index);
+void CreateYearFolders(int parent_index);
+void CreateSourceFolders(int parent_index);
+void CreateScreenFolders(int parent_index);
+void CreateResolutionFolders(int parent_index);
+void CreateFPSFolders(int parent_index);
+void CreateBIOSFolders(int parent_index);
+void CreateCPUFolders(int parent_index);
+void CreateSoundFolders(int parent_index);
+void CreateOrientationFolders(int parent_index);
+void CreateDeficiencyFolders(int parent_index);
+void CreateDumpingFolders(int parent_index);
+
+/***************************************************************************/
+
+#define MAX_EXTRA_FOLDERS 256
+#define MAX_EXTRA_SUBFOLDERS 256
+
+/* TreeView structures */
+enum
+{
+ FOLDER_NONE = 0,
+ FOLDER_ALLGAMES,
+ FOLDER_AVAILABLE,
+ FOLDER_BIOS,
+ FOLDER_CLONES,
+ FOLDER_COMPUTER,
+ FOLDER_CONSOLE,
+ FOLDER_CPU,
+ FOLDER_DEFICIENCY,
+ FOLDER_DUMPING,
+ FOLDER_FPS,
+ FOLDER_HARDDISK,
+ FOLDER_HORIZONTAL,
+ FOLDER_LIGHTGUN,
+ FOLDER_MANUFACTURER,
+ FOLDER_MECHANICAL,
+ FOLDER_MODIFIED,
+ FOLDER_MOUSE,
+ FOLDER_NONMECHANICAL,
+ FOLDER_NONWORKING,
+ FOLDER_ORIGINAL,
+ FOLDER_RASTER,
+ FOLDER_RESOLUTION,
+ FOLDER_SAMPLES,
+ FOLDER_SAVESTATE,
+ FOLDER_SCREENS,
+ FOLDER_SND,
+ FOLDER_SOURCE,
+ FOLDER_STEREO,
+ FOLDER_TRACKBALL,
+ FOLDER_UNAVAILABLE,
+ FOLDER_VECTOR,
+ FOLDER_VERTICAL,
+ FOLDER_WORKING,
+ FOLDER_YEAR,
+ MAX_FOLDERS,
+};
+
+typedef enum
+{
+ F_CLONES = 0x00000001,
+ F_NONWORKING = 0x00000002,
+ F_UNAVAILABLE = 0x00000004,
+ F_VECTOR = 0x00000008,
+ F_RASTER = 0x00000010,
+ F_ORIGINALS = 0x00000020,
+ F_WORKING = 0x00000040,
+ F_AVAILABLE = 0x00000080,
+ F_HORIZONTAL = 0x00000100,
+ F_VERTICAL = 0x00000200,
+ F_MECHANICAL = 0x00000400,
+ F_ARCADE = 0x00000800,
+ F_MESS = 0x00001000,
+ F_COMPUTER = 0x00002000,
+ F_CONSOLE = 0x00004000,
+ F_MODIFIED = 0x00008000,
+ F_MASK = 0x0000FFFF,
+ F_INIEDIT = 0x00010000, // There is an .ini that can be edited. MSH 20070811
+ F_CUSTOM = 0x01000000 // for current .ini custom folders
+} FOLDERFLAG;
+
+typedef struct
+{
+ LPSTR m_lpTitle; // String contains the folder name
+ LPTSTR m_lptTitle; // String contains the folder name as TCHAR*
+ UINT m_nFolderId; // Index / Folder ID number
+ int m_nParent; // Parent folder index in treeFolders[]
+ int m_nIconId; // negative icon index into the ImageList, or IDI_xxx resource id
+ DWORD m_dwFlags; // Misc flags
+ LPBITS m_lpGameBits; // Game bits, represent game indices
+} TREEFOLDER, *LPTREEFOLDER;
+
+typedef struct
+{
+ char m_szTitle[64]; // Folder Title
+ UINT m_nFolderId; // ID
+ int m_nParent; // Parent Folder index in treeFolders[]
+ DWORD m_dwFlags; // Flags - Customisable and Filters
+ int m_nIconId; // negative icon index into the ImageList, or IDI_xxx resource id
+ int m_nSubIconId; // negative icon index into the ImageList, or IDI_xxx resource id
+} EXFOLDERDATA, *LPEXFOLDERDATA;
+
+void FreeFolders(void);
+void ResetFilters(void);
+void InitTree(LPCFOLDERDATA lpFolderData, LPCFILTER_ITEM lpFilterList);
+void SetCurrentFolder(LPTREEFOLDER lpFolder);
+UINT GetCurrentFolderID(void);
+
+LPTREEFOLDER GetCurrentFolder(void);
+int GetNumFolders(void);
+LPTREEFOLDER GetFolder(UINT nFolder);
+LPTREEFOLDER GetFolderByID(UINT nID);
+LPTREEFOLDER GetFolderByName(int nParentId, const char *pszFolderName);
+
+void AddGame(LPTREEFOLDER lpFolder, UINT nGame);
+void RemoveGame(LPTREEFOLDER lpFolder, UINT nGame);
+int FindGame(LPTREEFOLDER lpFolder, int nGame);
+
+void ResetWhichGamesInFolders(void);
+
+LPCFOLDERDATA FindFilter(DWORD folderID);
+
+BOOL GameFiltered(int nGame, DWORD dwFlags);
+BOOL GetParentFound(int nGame);
+
+LPCFILTER_ITEM GetFilterList(void);
+
+void SetTreeIconSize(HWND hWnd, BOOL bLarge);
+BOOL GetTreeIconSize(void);
+
+void GetFolders(TREEFOLDER ***folders,int *num_folders);
+BOOL TryRenameCustomFolder(LPTREEFOLDER lpFolder,const char *new_name);
+void AddToCustomFolder(LPTREEFOLDER lpFolder,int driver_index);
+void RemoveFromCustomFolder(LPTREEFOLDER lpFolder,int driver_index);
+
+HIMAGELIST GetTreeViewIconList(void);
+int GetTreeViewIconIndex(int icon_id);
+
+void ResetTreeViewFolders(void);
+void SelectTreeViewFolder(int folder_id);
+
+#endif /* TREEVIEW_H */
+
diff --git a/docs/release/src/osd/winui/ui_opts.h b/docs/release/src/osd/winui/ui_opts.h
index 07570579788..054915d5e47 100644
--- a/docs/release/src/osd/winui/ui_opts.h
+++ b/docs/release/src/osd/winui/ui_opts.h
@@ -7,6 +7,7 @@
#define MUIOPTION_OVERRIDE_REDX "override_redx"
#define MUIOPTION_LIST_MODE "list_mode"
+#define MUIOPTION_VIEW_INDENT "indent_mode"
#define MUIOPTION_CHECK_GAME "check_game"
#define MUIOPTION_JOYSTICK_IN_INTERFACE "joystick_in_interface"
#define MUIOPTION_KEYBOARD_IN_INTERFACE "keyboard_in_interface"
@@ -153,7 +154,7 @@ const WINUIOPTS option_entries[] =
{ MUIOPTION_CLONE_COLOR, "-1", core_options::option_type::INTEGER, NULL },
{ MUIOPTION_CUSTOM_COLOR, "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", core_options::option_type::STRING, NULL }, // colour codes of the 16 custom colours (set in clone font dialog)
/* ListMode needs to be before ColumnWidths settings */
- { MUIOPTION_LIST_MODE, "5", core_options::option_type::INTEGER, NULL },
+ { MUIOPTION_LIST_MODE, "1", core_options::option_type::BOOLEAN, NULL },
{ MUIOPTION_SPLITTERS, MUIDEFAULT_SPLITTERS, core_options::option_type::STRING, NULL },
{ MUIOPTION_LIST_FONT, "-11,0,0,0,400,0,0,0,0,1,2,1,34,MS Sans Serif", core_options::option_type::STRING, NULL },
{ MUIOPTION_COLUMN_WIDTHS, "185,78,84,84,64,88,74,108,60,144,84,40,40", core_options::option_type::STRING, NULL },
diff --git a/docs/release/src/osd/winui/winui.cpp b/docs/release/src/osd/winui/winui.cpp
index 8ab1035eeb1..4888bdeffa6 100644
--- a/docs/release/src/osd/winui/winui.cpp
+++ b/docs/release/src/osd/winui/winui.cpp
@@ -355,6 +355,10 @@ static HDC hDC = NULL;
static HWND hSplash = NULL;
static HWND hProgress = NULL;
static intptr_t CALLBACK StartupProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
+static bool bEnableIndent = false;
+
+static bool CommonListDialog(common_file_dialog_proc cfd);
+static void SaveGameListToFile(char *szFile);
/***************************************************************************
External variables
@@ -707,9 +711,6 @@ static POPUPSTRING popstr[MAX_MENUS + 1];
static HWND hStatusBar = 0;
static HWND s_hToolBar = 0;
-/* Column Order as Displayed */
-static BOOL xpControl = false;
-
/* Used to recalculate the main window layout */
static int bottomMargin;
static int topMargin;
@@ -727,32 +728,29 @@ static std::unique_ptr<int[]> icon_index; // for custom per-game icons
static const TBBUTTON tbb[] =
{
- {0, ID_VIEW_FOLDERS, TBSTATE_ENABLED, TBSTYLE_CHECK, {0, 0}, 0, 0},
+ {0, ID_VIEW_FOLDERS, TBSTATE_ENABLED, TBSTYLE_CHECK, {0, 0}, 0, 0},
{1, ID_VIEW_PICTURE_AREA,TBSTATE_ENABLED, TBSTYLE_CHECK, {0, 0}, 0, 1},
- {0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, {0, 0}, 0, 0},
- {2, ID_VIEW_LARGE_ICON, TBSTATE_ENABLED, TBSTYLE_CHECKGROUP, {0, 0}, 0, 2},
- {3, ID_VIEW_SMALL_ICON, TBSTATE_ENABLED, TBSTYLE_CHECKGROUP, {0, 0}, 0, 3},
- {4, ID_VIEW_LIST_MENU, TBSTATE_ENABLED, TBSTYLE_CHECKGROUP, {0, 0}, 0, 4},
- {5, ID_VIEW_DETAIL, TBSTATE_ENABLED, TBSTYLE_CHECKGROUP, {0, 0}, 0, 5},
- {6, ID_VIEW_GROUPED, TBSTATE_ENABLED, TBSTYLE_CHECKGROUP, {0, 0}, 0, 6},
- {0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, {0, 0}, 0, 0},
- {7, ID_HELP_ABOUT, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0, 0}, 0, 7},
- {8, ID_HELP_CONTENTS, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0, 0}, 0, 8}
+ {0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, {0, 0}, 0, 0},
+ {2, ID_VIEW_LARGE_ICON, TBSTATE_ENABLED, TBSTYLE_CHECKGROUP, {0, 0}, 0, 2},
+ {3, ID_VIEW_SMALL_ICON, TBSTATE_ENABLED, TBSTYLE_CHECKGROUP, {0, 0}, 0, 3},
+ {0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, {0, 0}, 0, 0},
+ {6, ID_VIEW_INDENT, TBSTATE_ENABLED, TBSTYLE_CHECK, {0, 0}, 0, 4},
+ {0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, {0, 0}, 0, 0},
+ {7, ID_HELP_ABOUT, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0, 0}, 0, 5},
+// {8, ID_HELP_CONTENTS, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0, 0}, 0, 6}
};
#define NUM_TOOLBUTTONS (sizeof(tbb) / sizeof(tbb[0]))
-#define NUM_TOOLTIPS 9
+#define NUM_TOOLTIPS 7
-static const TCHAR szTbStrings[NUM_TOOLTIPS + 1][30] =
+static const TCHAR szTbStrings[NUM_TOOLTIPS][30] =
{
TEXT("Toggle Folder List"),
TEXT("Toggle Screen Shot"),
TEXT("Large Icons"),
TEXT("Small Icons"),
- TEXT("List"),
- TEXT("Details"),
- TEXT("Grouped"),
+ TEXT("Indent Clones"),
TEXT("About"),
TEXT("Help")
};
@@ -763,9 +761,7 @@ static const int CommandToString[] =
ID_VIEW_PICTURE_AREA,
ID_VIEW_LARGE_ICON,
ID_VIEW_SMALL_ICON,
- ID_VIEW_LIST_MENU,
- ID_VIEW_DETAIL,
- ID_VIEW_GROUPED,
+ ID_VIEW_INDENT,
ID_HELP_ABOUT,
ID_HELP_CONTENTS,
-1
@@ -805,6 +801,7 @@ static ResizeItem main_resize_items[] =
static Resize main_resize = { {0, 0, 0, 0}, main_resize_items };
+static wchar_t list_directory[MAX_PATH] = TEXT(".");
/* last directory for common file dialogs */
TCHAR last_directory[MAX_PATH];
@@ -1093,6 +1090,11 @@ HWND GetTreeView(void)
return hTreeView;
}
+HWND GetProgressBar()
+{
+ return hProgress;
+}
+
void GetRealColumnOrder(int order[])
{
int nColumnMax = Picker_GetNumColumns(hwndList);
@@ -1524,11 +1526,6 @@ MYBITMAPINFO *GetBackgroundInfo(void)
return &bmDesc;
}
-BOOL GetUseXPControl(void)
-{
- return xpControl;
-}
-
int GetMinimumScreenShotWindowWidth(void)
{
BITMAP bmp;
@@ -1611,14 +1608,12 @@ static BOOL Win32UI_init(HINSTANCE hInstance, LPWSTR lpCmdLine, int nCmdShow)
win_set_window_text_utf8(GetDlgItem(hSplash, IDC_PROGBAR), "Please wait...");
SendMessage(hProgress, PBM_SETPOS, 10, 0);
- extern int mame_validitychecks(int game);
WNDCLASS wndclass;
RECT rect;
int i, nSplitterCount;
extern const FOLDERDATA g_folderData[];
extern const FILTER_ITEM g_filterList[];
LONG common_control_version = GetCommonControlVersion();
- int validity_failed = 0;
LONG_PTR l;
OptionsInit();
SendMessage(hProgress, PBM_SETPOS, 25, 0);
@@ -1646,15 +1641,14 @@ static BOOL Win32UI_init(HINSTANCE hInstance, LPWSTR lpCmdLine, int nCmdShow)
SendMessage(hProgress, PBM_SETPOS, 55, 0);
// Are we using an Old comctl32.dll?
- dprintf("common controlversion %ld %ld\n",common_control_version >> 16, common_control_version & 0xffff);
+ printf("COMCTL32.DLL version = %ld %ld\n",common_control_version >> 16, common_control_version & 0xffff);
- xpControl = (common_control_version >= PACKVERSION(6,0));
- if (common_control_version < PACKVERSION(4,71))
+ if (common_control_version < PACKVERSION(6,0))
{
- char buf[] = MAMEUINAME " has detected an old version of comctl32.dll.\n\n"
+ char buf[] = MAMEUINAME " needs COMCTL32.DLL version 6.0\n\n"
"Unable to proceed.\n\n";
- win_message_box_utf8(0, buf, MAMEUINAME " Outdated comctl32.dll Error", MB_OK | MB_ICONWARNING);
+ win_message_box_utf8(0, buf, MAMEUINAME " Outdated COMCTL32.DLL Error", MB_OK | MB_ICONWARNING);
return false;
}
@@ -1701,35 +1695,35 @@ static BOOL Win32UI_init(HINSTANCE hInstance, LPWSTR lpCmdLine, int nCmdShow)
if (!SetupTabView(hTabCtrl, &opts))
return false;
}
-printf("A\n");fflush(stdout);
+
/* subclass history window */
l = GetWindowLongPtr(GetDlgItem(hMain, IDC_HISTORY), GWLP_WNDPROC);
g_lpHistoryWndProc = (WNDPROC)l;
SetWindowLongPtr(GetDlgItem(hMain, IDC_HISTORY), GWLP_WNDPROC, (LONG_PTR)HistoryWndProc);
-printf("B\n");fflush(stdout);
+
/* subclass picture frame area */
l = GetWindowLongPtr(GetDlgItem(hMain, IDC_SSFRAME), GWLP_WNDPROC);
g_lpPictureFrameWndProc = (WNDPROC)l;
SetWindowLongPtr(GetDlgItem(hMain, IDC_SSFRAME), GWLP_WNDPROC, (LONG_PTR)PictureFrameWndProc);
-printf("C\n");fflush(stdout);
+
/* subclass picture area */
l = GetWindowLongPtr(GetDlgItem(hMain, IDC_SSPICTURE), GWLP_WNDPROC);
g_lpPictureWndProc = (WNDPROC)l;
SetWindowLongPtr(GetDlgItem(hMain, IDC_SSPICTURE), GWLP_WNDPROC, (LONG_PTR)PictureWndProc);
-printf("D\n");fflush(stdout);
+
/* Load the pic for the default screenshot. */
hMissing_bitmap = LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_ABOUT));
-printf("E\n");fflush(stdout);
+
/* Stash hInstance for later use */
hInst = hInstance;
-printf("F\n");fflush(stdout);
+
s_hToolBar = InitToolbar(hMain);
hStatusBar = InitStatusBar(hMain);
hProgWnd = InitProgressBar(hStatusBar);
-printf("G\n");fflush(stdout);
+
main_resize_items[0].u.hwnd = s_hToolBar;
main_resize_items[1].u.hwnd = hStatusBar;
-printf("H\n");fflush(stdout);
+
/* In order to handle 'Large Fonts' as the Windows
* default setting, we need to make the dialogs small
* enough to fit in our smallest window size with
@@ -1744,13 +1738,13 @@ printf("H\n");fflush(stdout);
*/
GetClientRect(hMain, &rect);
-printf("I\n");fflush(stdout);
+
hTreeView = GetDlgItem(hMain, IDC_TREE);
hwndList = GetDlgItem(hMain, IDC_LIST);
-printf("J\n");fflush(stdout);
+
if (!InitSplitters())
return false;
-printf("K\n");fflush(stdout);
+
nSplitterCount = GetSplitterCount();
for (i = 0; i < nSplitterCount; i++)
{
@@ -1764,21 +1758,22 @@ printf("K\n");fflush(stdout);
AddSplitter(hWnd, hWndLeft, hWndRight, g_splitterInfo[i].pfnAdjust);
}
-printf("K\n");fflush(stdout);
+
/* Initial adjustment of controls on the Picker window */
ResizePickerControls(hMain);
-printf("L\n");fflush(stdout);
+
TabView_UpdateSelection(hTabCtrl);
-printf("M\n");fflush(stdout);
+
bDoGameCheck = GetGameCheck();
idle_work = true;
game_index = 0;
-printf("N\n");fflush(stdout);
+
BOOL bShowTree = BIT(GetWindowPanes(), 0);
bShowToolBar = GetShowToolBar();
bShowStatusBar = GetShowStatusBar();
bShowTabCtrl = GetShowTabCtrl();
-printf("O\n");fflush(stdout);
+ bEnableIndent = GetEnableIndent();
+
CheckMenuItem(GetMenu(hMain), ID_VIEW_FOLDERS, (bShowTree) ? MF_CHECKED : MF_UNCHECKED);
ToolBar_CheckButton(s_hToolBar, ID_VIEW_FOLDERS, (bShowTree) ? MF_CHECKED : MF_UNCHECKED);
CheckMenuItem(GetMenu(hMain), ID_VIEW_TOOLBARS, (bShowToolBar) ? MF_CHECKED : MF_UNCHECKED);
@@ -1786,19 +1781,21 @@ printf("O\n");fflush(stdout);
CheckMenuItem(GetMenu(hMain), ID_VIEW_STATUS, (bShowStatusBar) ? MF_CHECKED : MF_UNCHECKED);
ShowWindow(hStatusBar, (bShowStatusBar) ? SW_SHOW : SW_HIDE);
CheckMenuItem(GetMenu(hMain), ID_VIEW_PAGETAB, (bShowTabCtrl) ? MF_CHECKED : MF_UNCHECKED);
-printf("P\n");fflush(stdout);
+ CheckMenuItem(GetMenu(hMain), ID_VIEW_INDENT, (bEnableIndent) ? MF_CHECKED : MF_UNCHECKED);
+ ToolBar_CheckButton(s_hToolBar, ID_VIEW_INDENT, (bEnableIndent) ? MF_CHECKED : MF_UNCHECKED);
+
LoadBackgroundBitmap();
-printf("Q\n");fflush(stdout);
+
SendMessage(hProgress, PBM_SETPOS, 85, 0);
printf("about to init tree\n");fflush(stdout);
InitTree(g_folderData, g_filterList);
printf("did init tree\n");fflush(stdout);
SendMessage(hProgress, PBM_SETPOS, 100, 0);
-printf("R\n");fflush(stdout);
+
/* Initialize listview columns */
InitListView();
SetFocus(hwndList);
-printf("S\n");fflush(stdout);
+
/* Reset the font */
{
LOGFONT logfont;
@@ -1812,22 +1809,22 @@ printf("S\n");fflush(stdout);
if (hFont )
SetAllWindowsFont(hMain, &main_resize, hFont, false);
}
-printf("T\n");fflush(stdout);
+
/* Init DirectInput */
if (!DirectInputInitialize())
{
DialogBox(GetModuleHandle(NULL),MAKEINTRESOURCE(IDD_DIRECTX), NULL, DirectXDialogProc);
return false;
}
-printf("V\n");fflush(stdout);
+
AdjustMetrics();
UpdateScreenShot();
-printf("W\n");fflush(stdout);
+
hAccel = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDA_TAB_KEYS));
-printf("X\n");fflush(stdout);
+
/* clear keyboard state */
KeyboardStateClear();
-printf("Y\n");fflush(stdout);
+
if (GetJoyGUI() == true)
{
g_pJoyGUI = &DIJoystick;
@@ -1838,7 +1835,7 @@ printf("Y\n");fflush(stdout);
}
else
g_pJoyGUI = NULL;
-printf("Z\n");fflush(stdout);
+
if (GetHideMouseOnStartup())
{
/* For some reason the mouse is centered when a game is exited, which of
@@ -1851,13 +1848,13 @@ printf("Z\n");fflush(stdout);
// Then hide it
ShowCursor(false);
}
-printf("2\n");fflush(stdout);
+
nCmdShow = GetWindowState();
if (nCmdShow == SW_HIDE || nCmdShow == SW_MINIMIZE || nCmdShow == SW_SHOWMINIMIZED)
{
nCmdShow = SW_RESTORE;
}
-printf("3\n");fflush(stdout);
+
if (GetRunFullScreen())
{
LONG lMainStyle;
@@ -1872,40 +1869,24 @@ printf("3\n");fflush(stdout);
nCmdShow = SW_MAXIMIZE;
}
-printf("4\n");fflush(stdout);
+
ShowWindow(hMain, nCmdShow);
-printf("5\n");fflush(stdout);
+
switch (GetViewMode())
{
case VIEW_LARGE_ICONS :
SetView(ID_VIEW_LARGE_ICON);
break;
- case VIEW_SMALL_ICONS :
- SetView(ID_VIEW_SMALL_ICON);
- break;
- case VIEW_INLIST :
- SetView(ID_VIEW_LIST_MENU);
- break;
- case VIEW_REPORT :
- SetView(ID_VIEW_DETAIL);
- break;
- case VIEW_GROUPED :
default :
- SetView(ID_VIEW_GROUPED);
+ SetView(ID_VIEW_SMALL_ICON);
break;
}
-printf("6\n");fflush(stdout);
+
if (GetCycleScreenshot() > 0)
{
SetTimer(hMain, SCREENSHOT_TIMER, GetCycleScreenshot()*1000, NULL); //scale to Seconds
}
-printf("7\n");fflush(stdout);
- if (validity_failed)
- {
- win_message_box_utf8(hMain, MAMEUINAME " has failed its validity checks. The GUI will "
- "still work, but emulations will fail to execute", MAMEUINAME, MB_OK | MB_ICONERROR);
- }
-printf("8\n");fflush(stdout);
+
return true;
}
@@ -3545,27 +3526,42 @@ static void PollGUIJoystick()
static void SetView(int menu_id)
{
- BOOL force_reset = false;
- int i;
+// BOOL force_reset = false;
+// int i;
// first uncheck previous menu item, check new one
- CheckMenuRadioItem(GetMenu(hMain), ID_VIEW_LARGE_ICON, ID_VIEW_GROUPED, menu_id, MF_CHECKED);
- ToolBar_CheckButton(s_hToolBar, menu_id, MF_CHECKED);
+// CheckMenuRadioItem(GetMenu(hMain), ID_VIEW_LARGE_ICON, ID_VIEW_SMALL_ICON, menu_id, MF_CHECKED);
+// ToolBar_CheckButton(s_hToolBar, menu_id, MF_CHECKED);
- if (Picker_GetViewID(hwndList) == VIEW_GROUPED || menu_id == ID_VIEW_GROUPED)
+/// if (Picker_GetViewID(hwndList) == VIEW_GROUPED || menu_id == ID_VIEW_GROUPED)
{
// this changes the sort order, so redo everything
- force_reset = true;
+// force_reset = true;
}
- for (i = 0; i < sizeof(s_nPickers) / sizeof(s_nPickers[0]); i++)
- Picker_SetViewID(GetDlgItem(hMain, s_nPickers[i]), menu_id - ID_VIEW_LARGE_ICON);
+// for (i = 0; i < sizeof(s_nPickers) / sizeof(s_nPickers[0]); i++)
+// Picker_SetViewID(GetDlgItem(hMain, s_nPickers[i]), menu_id - ID_VIEW_LARGE_ICON);
- if (force_reset)
+// if (force_reset)
{
- for (i = 0; i < sizeof(s_nPickers) / sizeof(s_nPickers[0]); i++)
- Picker_Sort(GetDlgItem(hMain, s_nPickers[i]));
+// for (i = 0; i < sizeof(s_nPickers) / sizeof(s_nPickers[0]); i++)
+// Picker_Sort(GetDlgItem(hMain, s_nPickers[i]));
}
+ // first uncheck previous menu item, check new one
+ CheckMenuRadioItem(GetMenu(hMain), ID_VIEW_LARGE_ICON, ID_VIEW_SMALL_ICON, menu_id, MF_CHECKED);
+ ToolBar_CheckButton(s_hToolBar, menu_id, MF_CHECKED);
+
+ // Associate the image lists with the list view control.
+ if (menu_id == ID_VIEW_LARGE_ICON)
+ (void)ListView_SetImageList(hwndList, hLarge, LVSIL_SMALL);
+ else
+ (void)ListView_SetImageList(hwndList, hSmall, LVSIL_SMALL);
+
+ for (int i = 0; i < sizeof(s_nPickers) / sizeof(s_nPickers[0]); i++)
+ Picker_SetViewID(GetDlgItem(hMain, s_nPickers[i]), menu_id - ID_VIEW_LARGE_ICON);
+
+ for (int i = 0; i < sizeof(s_nPickers) / sizeof(s_nPickers[0]); i++)
+ Picker_Sort(GetDlgItem(hMain, s_nPickers[i]));
}
static void ResetListView()
@@ -3587,7 +3583,7 @@ static void ResetListView()
current_game = Picker_GetSelectedItem(hwndList);
if (current_game < 0)
- no_selection = true;
+ current_game = 0;
SetWindowRedraw(hwndList,false);
@@ -3596,7 +3592,7 @@ static void ResetListView()
// hint to have it allocate it all at once
ListView_SetItemCount(hwndList,driver_list::total());
- lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
+ lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_INDENT;
lvi.stateMask = 0;
i = -1;
@@ -3614,6 +3610,12 @@ static void ResetListView()
lvi.lParam = i;
lvi.pszText = LPSTR_TEXTCALLBACK;
lvi.iImage = I_IMAGECALLBACK;
+ lvi.iIndent = 0;
+
+ if (GetEnableIndent())
+ if (GetParentFound(i) && DriverIsClone(i))
+ lvi.iIndent = 1;
+
res = ListView_InsertItem(hwndList, &lvi);
}
} while (i != -1);
@@ -3871,30 +3873,33 @@ static BOOL MameCommand(HWND hwnd,int id, HWND hwndCtl, UINT codeNotify)
SetFocus(hwndList);
return true;
+ case ID_FILE_FILTER:
+ if (CommonListDialog(GetOpenFileName))
+ return true;
+ else
+ break;
+
case ID_FILE_EXIT:
PostMessage(hMain, WM_CLOSE, 0, 0);
return true;
case ID_VIEW_LARGE_ICON:
SetView(ID_VIEW_LARGE_ICON);
+ UpdateListView();
return true;
case ID_VIEW_SMALL_ICON:
SetView(ID_VIEW_SMALL_ICON);
- ResetListView();
- return true;
-
- case ID_VIEW_LIST_MENU:
- SetView(ID_VIEW_LIST_MENU);
- return true;
-
- case ID_VIEW_DETAIL:
- SetView(ID_VIEW_DETAIL);
+ UpdateListView();
return true;
- case ID_VIEW_GROUPED:
- SetView(ID_VIEW_GROUPED);
- return true;
+ case ID_VIEW_INDENT:
+ bEnableIndent = !bEnableIndent;
+ SetEnableIndent(bEnableIndent);
+ CheckMenuItem(GetMenu(hMain), ID_VIEW_INDENT, (bEnableIndent) ? MF_CHECKED : MF_UNCHECKED);
+ ToolBar_CheckButton(s_hToolBar, ID_VIEW_INDENT, (bEnableIndent) ? MF_CHECKED : MF_UNCHECKED);
+ UpdateListView();
+ break;
/* Arrange Icons submenu */
case ID_VIEW_BYGAME:
@@ -3958,7 +3963,7 @@ static BOOL MameCommand(HWND hwnd,int id, HWND hwndCtl, UINT codeNotify)
bShowStatusBar = !bShowStatusBar;
SetShowStatusBar(bShowStatusBar);
CheckMenuItem(GetMenu(hMain), ID_VIEW_STATUS, (bShowStatusBar) ? MF_CHECKED : MF_UNCHECKED);
- ToolBar_CheckButton(s_hToolBar, ID_VIEW_STATUS, (bShowStatusBar) ? MF_CHECKED : MF_UNCHECKED);
+ //ToolBar_CheckButton(s_hToolBar, ID_VIEW_STATUS, (bShowStatusBar) ? MF_CHECKED : MF_UNCHECKED);
ShowWindow(hStatusBar, (bShowStatusBar) ? SW_SHOW : SW_HIDE);
ResizePickerControls(hMain);
UpdateScreenShot();
@@ -4145,19 +4150,9 @@ static BOOL MameCommand(HWND hwnd,int id, HWND hwndCtl, UINT codeNotify)
SetFocus(hwndList);
return true;
- /* View Menu */
+ // for dialogs, don't remove
case ID_VIEW_LINEUPICONS:
- if( codeNotify == false)
- ResetListView();
- else
- {
- /*it was sent after a refresh (F5) was done, we only reset the View if "available" is the selected folder
- as it doesn't affect the others*/
- folder = GetSelectedFolder();
- if( folder )
- if (folder->m_nFolderId == FOLDER_AVAILABLE )
- ResetListView();
- }
+ ResetListView();
break;
case ID_GAME_PROPERTIES:
@@ -6487,12 +6482,16 @@ static HICON GetSelectedFolderIcon(void)
/* Updates all currently displayed Items in the List with the latest Data*/
void UpdateListView(void)
{
- BOOL res;
+// BOOL res;
- if( (GetViewMode() == VIEW_GROUPED) || (GetViewMode() == VIEW_DETAILS ) )
- res = ListView_RedrawItems(hwndList,ListView_GetTopIndex(hwndList), ListView_GetTopIndex(hwndList)+ ListView_GetCountPerPage(hwndList) );
+ ///if( (GetViewMode() == VIEW_GROUPED) || (GetViewMode() == VIEW_DETAILS ) )
+// res = ListView_RedrawItems(hwndList,ListView_GetTopIndex(hwndList), ListView_GetTopIndex(hwndList)+ ListView_GetCountPerPage(hwndList) );
- res++;
+// res++;
+ ResetWhichGamesInFolders();
+ ResetListView();
+ (void)ListView_RedrawItems(hwndList, ListView_GetTopIndex(hwndList), ListView_GetTopIndex(hwndList) + ListView_GetCountPerPage(hwndList));
+ SetFocus(hwndList);
}
static void CalculateBestScreenShotRect(HWND hWnd, RECT *pRect, BOOL restrict_height)
@@ -6734,4 +6733,106 @@ BOOL MouseHasBeenMoved(void)
return (p.x != mouse_x || p.y != mouse_y);
}
-/* End of source file */
+static bool CommonListDialog(common_file_dialog_proc cfd)
+{
+ bool success = false;
+ OPENFILENAME of;
+ wchar_t szFile[MAX_PATH];
+ wchar_t szCurDir[MAX_PATH];
+
+ szFile[0] = 0;
+
+ // Save current directory (avoids mame file creation further failure)
+ if (GetCurrentDirectory(MAX_PATH, szCurDir) > MAX_PATH)
+ {
+ // Path too large
+ szCurDir[0] = 0;
+ }
+
+ of.lStructSize = sizeof(OPENFILENAME);
+ of.hwndOwner = hMain;
+ of.hInstance = NULL;
+
+ of.lpstrTitle = TEXT("Enter a filter name");
+
+ of.lpstrFilter = TEXT("Filter file (*.ini)\0*.ini\0");
+ of.lpstrCustomFilter = NULL;
+ of.nMaxCustFilter = 0;
+ of.nFilterIndex = 1;
+ of.lpstrFile = szFile;
+ of.nMaxFile = sizeof(szFile);
+ of.lpstrFileTitle = NULL;
+ of.nMaxFileTitle = 0;
+ of.lpstrInitialDir = ui_wstring_from_utf8(dir_get_value(24).c_str());
+ of.nFileOffset = 0;
+ of.nFileExtension = 0;
+ of.lpstrDefExt = TEXT("ini");
+ of.lCustData = 0;
+ of.lpfnHook = NULL; //&OFNHookProc;
+ of.lpTemplateName = NULL;
+ of.Flags = OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_ENABLEHOOK;
+
+ while(!success)
+ {
+ if (GetSaveFileName(&of))
+ {
+ if (GetFileAttributes(szFile) != -1)
+ {
+ if (win_message_box_utf8(hMain, "File already exists, overwrite ?", MAMEUINAME, MB_ICONQUESTION | MB_YESNO) != IDYES )
+ continue;
+ else
+ success = true;
+
+ SetFileAttributes(szFile, FILE_ATTRIBUTE_NORMAL);
+ }
+
+ SaveGameListToFile(ui_utf8_from_wstring(szFile));
+ // Save current directory (avoids mame file creation further failure)
+ GetCurrentDirectory(MAX_PATH, list_directory);
+ // Restore current file path
+ if (szCurDir[0] != 0)
+ SetCurrentDirectory(szCurDir);
+
+ success = true;
+ }
+ else
+ break;
+ }
+
+ return success;
+}
+
+static void SaveGameListToFile(char *szFile)
+{
+ int nListCount = ListView_GetItemCount(hwndList);
+ LVITEM lvi;
+
+ FILE *f = fopen(szFile, "w");
+
+ if (f == NULL)
+ {
+ ErrorMessageBox("Error : unable to open file");
+ return;
+ }
+
+ // Header
+ fprintf(f, "[ROOT_FOLDER]\n");
+
+ // Games
+ for (int nIndex = 0; nIndex < nListCount; nIndex++)
+ {
+ lvi.iItem = nIndex;
+ lvi.iSubItem = 0;
+ lvi.mask = LVIF_PARAM;
+
+ if (ListView_GetItem(hwndList, &lvi))
+ {
+ int nGameIndex = lvi.lParam;
+ fprintf(f, "%s%s", driver_list::driver(nGameIndex).name,"\n");
+ }
+ }
+
+ fclose(f);
+ win_message_box_utf8(hMain, "File saved successfully.", MAMEUINAME, MB_ICONINFORMATION | MB_OK);
+}
+
diff --git a/docs/release/src/osd/winui/winui.h b/docs/release/src/osd/winui/winui.h
index b06510f824c..f9f3658cf98 100644
--- a/docs/release/src/osd/winui/winui.h
+++ b/docs/release/src/osd/winui/winui.h
@@ -1,8 +1,8 @@
// For licensing and usage information, read docs/release/winui_license.txt
//****************************************************************************
-#ifndef WINUI_H
-#define WINUI_H
+#ifndef WINUI_WINUI_H
+#define WINUI_WINUI_H
#include <commctrl.h>
#include <commdlg.h>
@@ -61,6 +61,7 @@ BOOL CommonFileDialog(common_file_dialog_proc cfd,char *filename, int filetype);
HWND GetMainWindow(void);
HWND GetTreeView(void);
+HWND GetProgressBar();
void SetNumOptionFolders(int count);
void GetRealColumnOrder(int order[]);
HICON LoadIconFromFile(const char *iconname);
@@ -83,7 +84,6 @@ char * ConvertAmpersandString(const char *s);
HBITMAP GetBackgroundBitmap(void);
HPALETTE GetBackgroundPalette(void);
MYBITMAPINFO* GetBackgroundInfo(void);
-BOOL GetUseXPControl(void);
int GetMinimumScreenShotWindowWidth(void);
@@ -103,3 +103,4 @@ BOOL MouseHasBeenMoved(void);
const char * GetSearchText(void);
#endif
+
diff --git a/docs/release/src/version.cpp b/docs/release/src/version.cpp
index c33180d9de3..9627910cd92 100644
--- a/docs/release/src/version.cpp
+++ b/docs/release/src/version.cpp
@@ -8,7 +8,7 @@
***************************************************************************/
-#define BARE_BUILD_VERSION "0.245.12"
+#define BARE_BUILD_VERSION "0.245.13"
extern const char bare_build_version[];
extern const char build_version[];
diff --git a/makefile b/makefile
index 4e38acd89ba..8b5117f1971 100644
--- a/makefile
+++ b/makefile
@@ -1546,7 +1546,7 @@ endif
ifeq (posix,$(SHELLTYPE))
$(GENDIR)/version.cpp: makefile $(GENDIR)/git_desc | $(GEN_FOLDERS)
- @echo '#define BARE_BUILD_VERSION "0.245.12"' > $@
+ @echo '#define BARE_BUILD_VERSION "0.245.13"' > $@
@echo '#define BARE_VCS_REVISION "$(NEW_GIT_VERSION)"' >> $@
@echo 'extern const char bare_build_version[];' >> $@
@echo 'extern const char bare_vcs_revision[];' >> $@
@@ -1556,7 +1556,7 @@ $(GENDIR)/version.cpp: makefile $(GENDIR)/git_desc | $(GEN_FOLDERS)
@echo 'const char build_version[] = BARE_BUILD_VERSION " (" BARE_VCS_REVISION ")";' >> $@
else
$(GENDIR)/version.cpp: makefile $(GENDIR)/git_desc | $(GEN_FOLDERS)
- @echo #define BARE_BUILD_VERSION "0.245.12" > $@
+ @echo #define BARE_BUILD_VERSION "0.245.13" > $@
@echo #define BARE_VCS_REVISION "$(NEW_GIT_VERSION)" >> $@
@echo extern const char bare_build_version[]; >> $@
@echo extern const char bare_vcs_revision[]; >> $@
diff --git a/src/version.cpp b/src/version.cpp
index c33180d9de3..9627910cd92 100644
--- a/src/version.cpp
+++ b/src/version.cpp
@@ -8,7 +8,7 @@
***************************************************************************/
-#define BARE_BUILD_VERSION "0.245.12"
+#define BARE_BUILD_VERSION "0.245.13"
extern const char bare_build_version[];
extern const char build_version[];