diff options
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[]; @@ -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[]; |