some cleanups

This commit is contained in:
adelikat 2019-12-29 14:11:56 -06:00
parent ec03c6fa0f
commit c2ff680992
2 changed files with 40 additions and 35 deletions

View File

@ -2,6 +2,7 @@
using System.Text; using System.Text;
using System.IO; using System.IO;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Windows.Forms;
using BizHawk.Common; using BizHawk.Common;
using BizHawk.Client.Common; using BizHawk.Client.Common;
@ -58,7 +59,7 @@ namespace BizHawk.Client.EmuHawk
public override void Write(byte[] buffer, int offset, int count) public override void Write(byte[] buffer, int offset, int count)
{ {
//TODO - buffer undecoded characters (this may be important) // TODO - buffer undecoded characters (this may be important)
//(use decoder = System.Text.Encoding.Unicode.GetDecoder()) //(use decoder = System.Text.Encoding.Unicode.GetDecoder())
string str = Encoding.ASCII.GetString(buffer, offset, count); string str = Encoding.ASCII.GetString(buffer, offset, count);
Emit?.Invoke(str); Emit?.Invoke(str);
@ -67,7 +68,7 @@ namespace BizHawk.Client.EmuHawk
public Action<string> Emit; public Action<string> Emit;
} }
static string SkipEverythingButProgramInCommandLine(string cmdLine) internal static string SkipEverythingButProgramInCommandLine(string cmdLine)
{ {
// skip past the program name. can anyone think of a better way to do this? // skip past the program name. can anyone think of a better way to do this?
// we could use CommandLineToArgvW (commented out below) but then we would just have to re-assemble and potentially re-quote it // we could use CommandLineToArgvW (commented out below) but then we would just have to re-assemble and potentially re-quote it
@ -106,39 +107,42 @@ namespace BizHawk.Client.EmuHawk
return $"{path} {remainder}"; return $"{path} {remainder}";
} }
private static IntPtr oldOut, conOut; private static IntPtr _oldOut, _conOut;
private static bool hasConsole; private static bool _hasConsole;
private static bool attachedConsole; private static bool _attachedConsole;
private static bool shouldRedirectStdout; private static bool _shouldRedirectStdout;
public static void CreateConsole() public static void CreateConsole()
{ {
//(see desmume for the basis of some of this logic) // (see desmume for the basis of some of this logic)
if (_hasConsole)
if (hasConsole) {
return; return;
}
if (oldOut == IntPtr.Zero) if (_oldOut == IntPtr.Zero)
oldOut = ConsoleImports.GetStdHandle( -11 ); //STD_OUTPUT_HANDLE {
_oldOut = ConsoleImports.GetStdHandle( -11 ); // STD_OUTPUT_HANDLE
}
var fileType = ConsoleImports.GetFileType(oldOut); var fileType = ConsoleImports.GetFileType(_oldOut);
//stdout is already connected to something. keep using it and don't let the console interfere // stdout is already connected to something. keep using it and don't let the console interfere
shouldRedirectStdout = (fileType == ConsoleImports.FileType.FileTypeUnknown || fileType == ConsoleImports.FileType.FileTypePipe); _shouldRedirectStdout = (fileType == ConsoleImports.FileType.FileTypeUnknown || fileType == ConsoleImports.FileType.FileTypePipe);
//attach to an existing console // attach to an existing console
attachedConsole = false; _attachedConsole = false;
//ever since a recent KB, XP-based systems glitch out when attachconsole is called and there's no console to attach to. // ever since a recent KB, XP-based systems glitch out when AttachConsole is called and there's no console to attach to.
if (Environment.OSVersion.Version.Major != 5) if (Environment.OSVersion.Version.Major != 5)
{ {
if (ConsoleImports.AttachConsole(-1)) if (ConsoleImports.AttachConsole(-1))
{ {
hasConsole = true; _hasConsole = true;
attachedConsole = true; _attachedConsole = true;
} }
} }
if (!attachedConsole) if (!_attachedConsole)
{ {
ConsoleImports.FreeConsole(); ConsoleImports.FreeConsole();
if (ConsoleImports.AllocConsole()) if (ConsoleImports.AllocConsole())
@ -146,33 +150,33 @@ namespace BizHawk.Client.EmuHawk
//set icons for the console so we can tell them apart from the main window //set icons for the console so we can tell them apart from the main window
Win32Imports.SendMessage(ConsoleImports.GetConsoleWindow(), 0x0080/*WM_SETICON*/, (IntPtr)0/*ICON_SMALL*/, Properties.Resources.console16x16.GetHicon()); Win32Imports.SendMessage(ConsoleImports.GetConsoleWindow(), 0x0080/*WM_SETICON*/, (IntPtr)0/*ICON_SMALL*/, Properties.Resources.console16x16.GetHicon());
Win32Imports.SendMessage(ConsoleImports.GetConsoleWindow(), 0x0080/*WM_SETICON*/, (IntPtr)1/*ICON_LARGE*/, Properties.Resources.console32x32.GetHicon()); Win32Imports.SendMessage(ConsoleImports.GetConsoleWindow(), 0x0080/*WM_SETICON*/, (IntPtr)1/*ICON_LARGE*/, Properties.Resources.console32x32.GetHicon());
hasConsole = true; _hasConsole = true;
} }
else else
{ {
System.Windows.Forms.MessageBox.Show($"Couldn't allocate win32 console: {Marshal.GetLastWin32Error()}"); MessageBox.Show($"Couldn't allocate win32 console: {Marshal.GetLastWin32Error()}");
} }
} }
if (hasConsole) if (_hasConsole)
{ {
IntPtr ptr = ConsoleImports.GetCommandLine(); IntPtr ptr = ConsoleImports.GetCommandLine();
string commandLine = Marshal.PtrToStringAuto(ptr); string commandLine = Marshal.PtrToStringAuto(ptr);
Console.Title = SkipEverythingButProgramInCommandLine(commandLine); Console.Title = SkipEverythingButProgramInCommandLine(commandLine);
} }
if (shouldRedirectStdout) if (_shouldRedirectStdout)
{ {
conOut = ConsoleImports.CreateFile("CONOUT$", 0x40000000, 2, IntPtr.Zero, 3, 0, IntPtr.Zero); _conOut = ConsoleImports.CreateFile("CONOUT$", 0x40000000, 2, IntPtr.Zero, 3, 0, IntPtr.Zero);
if (!ConsoleImports.SetStdHandle(-11, conOut)) if (!ConsoleImports.SetStdHandle(-11, _conOut))
throw new Exception($"{nameof(ConsoleImports.SetStdHandle)}() failed"); throw new Exception($"{nameof(ConsoleImports.SetStdHandle)}() failed");
} }
//DotNetRewireConout(); //DotNetRewireConout();
hasConsole = true; _hasConsole = true;
if (attachedConsole) if (_attachedConsole)
{ {
Console.WriteLine(); Console.WriteLine();
Console.WriteLine("use cmd /c {0} to get more sensible console behaviour", Path.GetFileName(PathManager.GetGlobalBasePathAbsolute())); Console.WriteLine("use cmd /c {0} to get more sensible console behaviour", Path.GetFileName(PathManager.GetGlobalBasePathAbsolute()));
@ -181,25 +185,25 @@ namespace BizHawk.Client.EmuHawk
static void ReleaseConsole() static void ReleaseConsole()
{ {
if (!hasConsole) if (!_hasConsole)
{ {
return; return;
} }
if (shouldRedirectStdout) if (_shouldRedirectStdout)
{ {
ConsoleImports.CloseHandle(conOut); ConsoleImports.CloseHandle(_conOut);
} }
if (!attachedConsole) if (!_attachedConsole)
{ {
ConsoleImports.FreeConsole(); ConsoleImports.FreeConsole();
} }
ConsoleImports.SetStdHandle(-11, oldOut); ConsoleImports.SetStdHandle(-11, _oldOut);
conOut = IntPtr.Zero; _conOut = IntPtr.Zero;
hasConsole = false; _hasConsole = false;
} }
/// <summary> /// <summary>

View File

@ -209,6 +209,7 @@
<s:Boolean x:Key="/Default/UserDictionary/Words/=Coleco/@EntryIndexedValue">True</s:Boolean> <s:Boolean x:Key="/Default/UserDictionary/Words/=Coleco/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Colecovision/@EntryIndexedValue">True</s:Boolean> <s:Boolean x:Key="/Default/UserDictionary/Words/=Colecovision/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=colesced/@EntryIndexedValue">True</s:Boolean> <s:Boolean x:Key="/Default/UserDictionary/Words/=colesced/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Conout/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Coroutine/@EntryIndexedValue">True</s:Boolean> <s:Boolean x:Key="/Default/UserDictionary/Words/=Coroutine/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Cpus/@EntryIndexedValue">True</s:Boolean> <s:Boolean x:Key="/Default/UserDictionary/Words/=Cpus/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=curr/@EntryIndexedValue">True</s:Boolean> <s:Boolean x:Key="/Default/UserDictionary/Words/=curr/@EntryIndexedValue">True</s:Boolean>