From 94ae470ba27c951bca016857a1074a548c490553 Mon Sep 17 00:00:00 2001 From: "Rob Swindell (on Windows 11)" <rob@synchro.net> Date: Wed, 27 Dec 2023 20:14:39 -0800 Subject: [PATCH] Use GDI mode for Windows builds of SCFG, making this a Windows/GUI app now In Windows 11, "Windows Terminal" is now the default console (though the Windows user can change that to the old conhost.exe). Running UIFC apps (e.g. SCFG) in Windows console mode from within a Windows Terminal console doesn't always display correctly (depending on the width of the console). And even if if the app displays correctly at first in console mode, it's very easy for the user to resize the console window and just totally foobar the display of the app. Windows console mode (previously, the default interface mode) is still available ("-iw" option) if one wants to use it instead. However, stdio/door mode ("-id") and ANSI mode ("-ia") can't be used directly from a console. The help/usage output is sent in Windows console mode (not stdout or GDI mode) so it creates a new window, disables mouse support (so you can copy text from it). stdout doesn't work from GUI apps. Fun times. --- src/sbbs3/scfg/scfg.c | 78 ++++++++++++++++++++++++++++--------- src/sbbs3/scfg/scfg.vcxproj | 12 +++--- 2 files changed, 66 insertions(+), 24 deletions(-) diff --git a/src/sbbs3/scfg/scfg.c b/src/sbbs3/scfg/scfg.c index 0e5c1e1652..ce60d2d01a 100644 --- a/src/sbbs3/scfg/scfg.c +++ b/src/sbbs3/scfg/scfg.c @@ -381,6 +381,21 @@ void set_cfg_filename(const char* hostname) snprintf(cfg.filename, sizeof cfg.filename, "%ssbbs%s%s.ini", cfg.ctrl_dir, *hostname ? ".":"", hostname); } +#ifdef _WIN32 + #define printf cprintf +#endif + +void banner() +{ + char compiler[32]; + + DESCRIBE_COMPILER(compiler); + + printf("\nSynchronet Configuration Utility (%s) v%s%c " COPYRIGHT_NOTICE + "\n",PLATFORM_DESC, VERSION, REVISION); + printf("\nCompiled %s/%s %s %s with %s\n", GIT_BRANCH, GIT_HASH, __DATE__, __TIME__, compiler); +} + int main(int argc, char **argv) { char* p; @@ -390,14 +405,12 @@ int main(int argc, char **argv) BOOL door_mode=FALSE; BOOL alt_chars = FALSE; int ciolib_mode=CIOLIB_MODE_AUTO; - char compiler[32]; - - DESCRIBE_COMPILER(compiler); - - printf("\nSynchronet Configuration Utility (%s) v%s%c " COPYRIGHT_NOTICE - "\n",PLATFORM_DESC, VERSION, REVISION); - printf("\nCompiled %s/%s %s %s with %s\n", GIT_BRANCH, GIT_HASH, __DATE__, __TIME__, compiler); +#if defined(_WIN32) + cio_api.options |= CONIO_OPT_DISABLE_CLOSE; +#else + banner(); +#endif xp_randomize(); cfg.size=sizeof(cfg); @@ -493,10 +506,22 @@ int main(int argc, char **argv) case 'I': ciolib_mode=CIOLIB_MODE_CURSES_ASCII; break; -#endif +#elif defined _WIN32 case 'W': ciolib_mode=CIOLIB_MODE_CONIO; break; + case 'G': + switch (toupper(argv[i][3])) { + case 0: + case 'W': + ciolib_mode = CIOLIB_MODE_GDI; + break; + case 'F': + ciolib_mode = CIOLIB_MODE_GDI_FULLSCREEN; + break; + } + break; +#endif case 'D': door_mode=TRUE; break; @@ -514,7 +539,16 @@ int main(int argc, char **argv) auto_save=TRUE; break; default: - USAGE: + USAGE: +#ifdef _WIN32 + uifc.size=sizeof(uifc); + uifc.mode |= UIFC_NOMOUSE; + uifc.scrn_len = 40; + initciolib(CIOLIB_MODE_CONIO); + uifcini32(&uifc); + banner(); +#endif + printf("\nusage: scfg [ctrl_dir] [options]" "\n\noptions:\n\n" "-w run initial setup wizard\n" @@ -534,20 +568,28 @@ int main(int argc, char **argv) "-host=<name> set hostname to use for alternate sbbs.ini file\n" "-iX set interface mode to X (default=auto) where X is one of:\n" #ifdef __unix__ - " X = X11 mode\n" - " C = Curses mode\n" - " F = Curses mode with forced IBM charset\n" - " I = Curses mode with forced ASCII charset\n" -#else - " W = Win32 console mode\n" -#endif - " A = ANSI mode\n" - " D = standard input/output/door mode\n" + " X = X11 mode\n" + " C = Curses mode\n" + " F = Curses mode with forced IBM charset\n" + " I = Curses mode with forced ASCII charset\n" +#elif defined(_WIN32) + " W = Win32 console mode\n" +#if defined(WITH_GDI) + " G = Win32 graphics mode\n" + " GF = Win32 graphics mode, full screen\n" +#endif // WITH_GDI +#endif // _WIN32 + " A = ANSI mode\n" + " D = standard input/output/door mode\n" "-A use alternate (ASCII) characters for arrow symbols\n" "-v# set video mode to # (default=auto)\n" "-l# set screen lines to # (default=auto-detect)\n" "-y automatically save changes (don't ask)\n" ); +#ifdef _WIN32 + printf("\nHit a key to close..."); + getch(); +#endif exit(0); } } diff --git a/src/sbbs3/scfg/scfg.vcxproj b/src/sbbs3/scfg/scfg.vcxproj index c5b3cca82c..fd9653917e 100644 --- a/src/sbbs3/scfg/scfg.vcxproj +++ b/src/sbbs3/scfg/scfg.vcxproj @@ -34,7 +34,6 @@ <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" /> <Import Project="..\..\xpdev\xpdev.props" /> <Import Project="..\..\smblib\smblib.props" /> - <Import Project="..\..\conio\conio.props" /> <Import Project="..\..\uifc\uifc.props" /> <Import Project="..\..\build\undeprecate.props" /> <Import Project="..\..\build\target_ia32.props" /> @@ -42,13 +41,13 @@ <Import Project="..\..\encode\encode.props" /> <Import Project="..\..\..\3rdp\win32.release\cryptlib\cryptlib.props" /> <Import Project="..\..\..\3rdp\win32.release\libarchive\libarchive.props" /> + <Import Project="..\..\conio\conio_gdi.props" /> </ImportGroup> <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets"> <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" /> <Import Project="..\..\xpdev\xpdev.props" /> <Import Project="..\..\smblib\smblib.props" /> - <Import Project="..\..\conio\conio.props" /> <Import Project="..\..\uifc\uifc.props" /> <Import Project="..\..\build\undeprecate.props" /> <Import Project="..\..\build\target_ia32.props" /> @@ -56,6 +55,7 @@ <Import Project="..\..\encode\encode.props" /> <Import Project="..\..\..\3rdp\win32.release\cryptlib\cryptlib.props" /> <Import Project="..\..\..\3rdp\win32.release\libarchive\libarchive.props" /> + <Import Project="..\..\conio\conio_gdi.props" /> </ImportGroup> <PropertyGroup Label="UserMacros" /> <PropertyGroup> @@ -97,7 +97,7 @@ <SuppressStartupBanner>true</SuppressStartupBanner> <GenerateDebugInformation>true</GenerateDebugInformation> <ProgramDatabaseFile>.\msvc.win32.exe.debug/scfg.pdb</ProgramDatabaseFile> - <SubSystem>Console</SubSystem> + <SubSystem>Windows</SubSystem> <RandomizedBaseAddress>false</RandomizedBaseAddress> <DataExecutionPrevention> </DataExecutionPrevention> @@ -139,7 +139,7 @@ <OutputFile>.\msvc.win32.exe.release/scfg.exe</OutputFile> <SuppressStartupBanner>true</SuppressStartupBanner> <ProgramDatabaseFile>.\msvc.win32.exe.release/scfg.pdb</ProgramDatabaseFile> - <SubSystem>Console</SubSystem> + <SubSystem>Windows</SubSystem> <RandomizedBaseAddress>false</RandomizedBaseAddress> <DataExecutionPrevention> </DataExecutionPrevention> @@ -238,8 +238,8 @@ </ClCompile> </ItemGroup> <ItemGroup> - <ProjectReference Include="..\..\conio\conio.vcxproj"> - <Project>{84592e48-27ca-48a6-b9c6-243d2347a578}</Project> + <ProjectReference Include="..\..\conio\conio_gdi.vcxproj"> + <Project>{fbcce03b-65ee-44a1-bbe1-b1f789d223a1}</Project> </ProjectReference> <ProjectReference Include="..\..\smblib\smblib.vcxproj"> <Project>{d674842b-2f41-42cb-9426-b3c4b0682574}</Project> -- GitLab