1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-10 04:22:20 +02:00

Change to allow working in installer

This commit is contained in:
Brian Fiete 2019-09-10 11:25:53 -07:00
parent 5c813f31ec
commit 463e26ff75
19 changed files with 571 additions and 57 deletions

View file

@ -35,7 +35,7 @@ namespace Beefy.theme.dark
mWidth = GS!(100); mWidth = GS!(100);
mHeight = GS!(24); mHeight = GS!(24);
mHorzJumpSize = GS!(40); mHorzJumpSize = GS!(40);
mFont = DarkTheme.sDarkTheme.mSmallFont; mFont = DarkTheme.sDarkTheme?.mSmallFont;
} }
public override void GetTextData() public override void GetTextData()
@ -484,22 +484,24 @@ namespace Beefy.theme.dark
if (mEditWidget.mVertPos.IsMoving) if (mEditWidget.mVertPos.IsMoving)
brightness = 0; // When we animate a pgup or pgdn, it's weird seeing the cursor scrolling around brightness = 0; // When we animate a pgup or pgdn, it's weird seeing the cursor scrolling around
Color cursorColor = mTextColors[0];
if (mOverTypeMode) if (mOverTypeMode)
{ {
if (mCharWidth <= 2) if (mCharWidth <= 2)
{ {
using (g.PushColor(Color.Get(brightness * 0.75f))) using (g.PushColor(Color.Mult(cursorColor, Color.Get(brightness * 0.75f))))
g.FillRect(aX, curY, GS!(2), lineSpacing); g.FillRect(aX, curY, GS!(2), lineSpacing);
} }
else else
{ {
using (g.PushColor(Color.Get(brightness * 0.30f))) using (g.PushColor(Color.Mult(cursorColor, Color.Get(brightness * 0.30f))))
g.FillRect(aX, curY, mCharWidth, lineSpacing); g.FillRect(aX, curY, mCharWidth, lineSpacing);
} }
} }
else else
{ {
using (g.PushColor(Color.Get(brightness))) using (g.PushColor(Color.Mult(cursorColor, Color.Get(brightness))))
g.FillRect(aX, curY, Math.Max(1.0f, GS!(1)), lineSpacing); g.FillRect(aX, curY, Math.Max(1.0f, GS!(1)), lineSpacing);
} }
drewCursor = true; drewCursor = true;

View file

@ -67,6 +67,10 @@ namespace Beefy.widgets
if (mHorzScrollbar == null) if (mHorzScrollbar == null)
{ {
mHorzScrollbar = ThemeFactory.mDefault.CreateScrollbar(Scrollbar.Orientation.Horz); mHorzScrollbar = ThemeFactory.mDefault.CreateScrollbar(Scrollbar.Orientation.Horz);
}
if (mHorzScrollbar.mParent == null)
{
mHorzScrollbar.Init(); mHorzScrollbar.Init();
mHorzScrollbar.mOnScrollEvent.Add(new => ScrollEventHandler); mHorzScrollbar.mOnScrollEvent.Add(new => ScrollEventHandler);
AddWidgetAtIndex(0, mHorzScrollbar); AddWidgetAtIndex(0, mHorzScrollbar);
@ -77,6 +81,10 @@ namespace Beefy.widgets
if (mVertScrollbar == null) if (mVertScrollbar == null)
{ {
mVertScrollbar = ThemeFactory.mDefault.CreateScrollbar(Scrollbar.Orientation.Vert); mVertScrollbar = ThemeFactory.mDefault.CreateScrollbar(Scrollbar.Orientation.Vert);
}
if (mVertScrollbar.mParent == null)
{
mVertScrollbar.Init(); mVertScrollbar.Init();
mVertScrollbar.mOnScrollEvent.Add(new => ScrollEventHandler); mVertScrollbar.mOnScrollEvent.Add(new => ScrollEventHandler);
AddWidgetAtIndex(0, mVertScrollbar); AddWidgetAtIndex(0, mVertScrollbar);

View file

@ -429,7 +429,7 @@ namespace Beefy.widgets
var result = mOnHitTest(x, y); var result = mOnHitTest(x, y);
if (result != HitTestResult.NotHandled) if (result != HitTestResult.NotHandled)
{ {
if (result == .Transparent) if ((result == .Transparent) || (result == .Caption))
{ {
if (mHasMouseInside) if (mHasMouseInside)
MouseLeave(); MouseLeave();

View file

@ -0,0 +1,6 @@
FileVersion = 1
[Project]
Name = "MiniZ"
TargetType = "BeefLib"
StartupObject = "Program"

View file

@ -76,6 +76,16 @@ namespace IDE.Util
return i; return i;
} }
public int GetCompressedSize()
{
return mFileStat.mCompSize;
}
public int GetUncompressedSize()
{
return mFileStat.mUncompSize;
}
public Result<void> GetFileName(String outFileName) public Result<void> GetFileName(String outFileName)
{ {
outFileName.Append(&mFileStat.mFilename, GetStrLen(&mFileStat.mFilename, mFileStat.mFilename.Count)); outFileName.Append(&mFileStat.mFilename, GetStrLen(&mFileStat.mFilename, mFileStat.mFilename.Count));
@ -107,6 +117,15 @@ namespace IDE.Util
return .Ok; return .Ok;
} }
public Result<void> Init(Stream stream)
{
Debug.Assert(!mInitialized);
if (!MiniZ.ZipReaderInitStream(&mFile, stream, .None))
return .Err;
mInitialized = true;
return .Ok;
}
public int GetNumFiles() public int GetNumFiles()
{ {
return MiniZ.ZipReaderGetNumFiles(&mFile); return MiniZ.ZipReaderGetNumFiles(&mFile);
@ -180,7 +199,7 @@ namespace IDE.Util
} }
// Compression/decompression stream struct. // Compression/decompression stream struct.
public struct Stream public struct ZipStream
{ {
public uint8* mNextIn; // pointer to next byte to read public uint8* mNextIn; // pointer to next byte to read
public uint32 mAvailIn; // number of bytes available at next_in public uint32 mAvailIn; // number of bytes available at next_in
@ -509,12 +528,12 @@ namespace IDE.Util
return VERSION; return VERSION;
} }
static ReturnStatus DeflateInit(Stream* pStream, CompressionLevel level) static ReturnStatus DeflateInit(ZipStream* pStream, CompressionLevel level)
{ {
return DeflateInit(pStream, level, DEFLATED, DEFAULT_WINDOW_BITS, 9, .DEFAULT_STRATEGY); return DeflateInit(pStream, level, DEFLATED, DEFAULT_WINDOW_BITS, 9, .DEFAULT_STRATEGY);
} }
static ReturnStatus DeflateInit(Stream* pStream, CompressionLevel level, int method, int window_bits, int mem_level, CompressionStrategy strategy) static ReturnStatus DeflateInit(ZipStream* pStream, CompressionLevel level, int method, int window_bits, int mem_level, CompressionStrategy strategy)
{ {
tdefl_compressor* pComp; tdefl_compressor* pComp;
TDEFLFlags comp_flags = TDEFLFlags.TDEFL_COMPUTE_ADLER32 | tdefl_create_comp_flags_from_zip_params(level, window_bits, strategy); TDEFLFlags comp_flags = TDEFLFlags.TDEFL_COMPUTE_ADLER32 | tdefl_create_comp_flags_from_zip_params(level, window_bits, strategy);
@ -546,7 +565,7 @@ namespace IDE.Util
return .OK; return .OK;
} }
static ReturnStatus deflateReset(Stream* pStream) static ReturnStatus deflateReset(ZipStream* pStream)
{ {
if ((pStream == null) || (pStream.mState == null) || (pStream.mZAlloc == null) || (pStream.mZFree == null)) return .STREAM_ERROR; if ((pStream == null) || (pStream.mState == null) || (pStream.mZAlloc == null) || (pStream.mZFree == null)) return .STREAM_ERROR;
pStream.mTotalIn = pStream.mTotalOut = 0; pStream.mTotalIn = pStream.mTotalOut = 0;
@ -554,7 +573,7 @@ namespace IDE.Util
return .OK; return .OK;
} }
static ReturnStatus deflate(Stream* pStream, Flush flushIn) static ReturnStatus deflate(ZipStream* pStream, Flush flushIn)
{ {
Flush flush = flushIn; Flush flush = flushIn;
int in_bytes, out_bytes; int in_bytes, out_bytes;
@ -604,7 +623,7 @@ namespace IDE.Util
return status; return status;
} }
static ReturnStatus deflateEnd(Stream* pStream) static ReturnStatus deflateEnd(ZipStream* pStream)
{ {
if (pStream == null) return .STREAM_ERROR; if (pStream == null) return .STREAM_ERROR;
if (pStream.mState != null) if (pStream.mState != null)
@ -615,7 +634,7 @@ namespace IDE.Util
return .OK; return .OK;
} }
static uint32 deflateBound(Stream* pStream, uint32 source_len) static uint32 deflateBound(ZipStream* pStream, uint32 source_len)
{ {
// This is really over conservative. (And lame, but it's actually pretty tricky to compute a true upper bound given the way tdefl's blocking works.) // This is really over conservative. (And lame, but it's actually pretty tricky to compute a true upper bound given the way tdefl's blocking works.)
return Math.Max(128 + (source_len * 110) / 100, 128 + source_len + ((source_len / (31 * 1024)) + 1) * 5); return Math.Max(128 + (source_len * 110) / 100, 128 + source_len + ((source_len / (31 * 1024)) + 1) * 5);
@ -624,8 +643,8 @@ namespace IDE.Util
public static ReturnStatus Compress(uint8* pDest, ref int pDest_len, uint8* pSource, int source_len, CompressionLevel level) public static ReturnStatus Compress(uint8* pDest, ref int pDest_len, uint8* pSource, int source_len, CompressionLevel level)
{ {
ReturnStatus status; ReturnStatus status;
Stream stream = ?; ZipStream stream = ?;
Internal.MemSet(&stream, 0, sizeof(Stream)); Internal.MemSet(&stream, 0, sizeof(ZipStream));
// In case uint32 is 64-bits (argh I hate longs). // In case uint32 is 64-bits (argh I hate longs).
if ((source_len | pDest_len) > 0xFFFFFFFFU) return .PARAM_ERROR; if ((source_len | pDest_len) > 0xFFFFFFFFU) return .PARAM_ERROR;
@ -669,7 +688,7 @@ namespace IDE.Util
public TinflStatus m_last_status; public TinflStatus m_last_status;
} }
static ReturnStatus inflateInit2(Stream* pStream, int window_bits) static ReturnStatus inflateInit2(ZipStream* pStream, int window_bits)
{ {
inflate_state* pDecomp; inflate_state* pDecomp;
if (pStream == null) return .STREAM_ERROR; if (pStream == null) return .STREAM_ERROR;
@ -700,12 +719,12 @@ namespace IDE.Util
return .OK; return .OK;
} }
static ReturnStatus inflateInit(Stream* pStream) static ReturnStatus inflateInit(ZipStream* pStream)
{ {
return inflateInit2(pStream, DEFAULT_WINDOW_BITS); return inflateInit2(pStream, DEFAULT_WINDOW_BITS);
} }
static ReturnStatus inflate(Stream* pStream, Flush flushIn) static ReturnStatus inflate(ZipStream* pStream, Flush flushIn)
{ {
Flush flush = flushIn; Flush flush = flushIn;
inflate_state* pState; inflate_state* pState;
@ -799,7 +818,7 @@ namespace IDE.Util
return ((status == .Done) && (pState.m_dict_avail == 0)) ? .STREAM_END : .OK; return ((status == .Done) && (pState.m_dict_avail == 0)) ? .STREAM_END : .OK;
} }
static ReturnStatus inflateEnd(Stream* pStream) static ReturnStatus inflateEnd(ZipStream* pStream)
{ {
if (pStream == null) if (pStream == null)
return .STREAM_ERROR; return .STREAM_ERROR;
@ -813,9 +832,9 @@ namespace IDE.Util
public static ReturnStatus Uncompress(uint8* pDest, ref int pDest_len, uint8* pSource, int source_len) public static ReturnStatus Uncompress(uint8* pDest, ref int pDest_len, uint8* pSource, int source_len)
{ {
Stream stream = default; ZipStream stream = default;
ReturnStatus status; ReturnStatus status;
Internal.MemSet(&stream, 0, sizeof(Stream)); Internal.MemSet(&stream, 0, sizeof(ZipStream));
// In case uint32 is 64-bits (argh I hate longs). // In case uint32 is 64-bits (argh I hate longs).
if ((source_len | pDest_len) > 0xFFFFFFFFU) return .PARAM_ERROR; if ((source_len | pDest_len) > 0xFFFFFFFFU) return .PARAM_ERROR;
@ -2751,6 +2770,7 @@ namespace IDE.Util
public ZipArray m_central_dir_offsets; public ZipArray m_central_dir_offsets;
public ZipArray m_sorted_central_dir_offsets; public ZipArray m_sorted_central_dir_offsets;
public FILE* m_pFile; public FILE* m_pFile;
public Stream mStream;
public void* m_pMem; public void* m_pMem;
public int m_mem_size; public int m_mem_size;
public int m_mem_capacity; public int m_mem_capacity;
@ -3147,6 +3167,40 @@ namespace IDE.Util
return true; return true;
} }
static int ZipFileStreamReadFunc(void* pOpaque, int64 file_ofs, void* pBuf, int n)
{
ZipArchive* pZip = (ZipArchive*)pOpaque;
int64 cur_ofs = pZip.m_pState.mStream.Position;
if (((int64)file_ofs < 0) || (((cur_ofs != (int64)file_ofs)) && (pZip.m_pState.mStream.Seek((int64)file_ofs) case .Err)))
return 0;
switch (pZip.m_pState.mStream.TryRead(.((uint8*)pBuf, n)))
{
case .Ok(let len):
return len;
case .Err:
return 0;
}
}
public static bool ZipReaderInitStream(ZipArchive* pZip, Stream stream, ZipFlags flags)
{
int64 file_size = stream.Length;
if (!zip_reader_init_internal(pZip, flags))
{
return false;
}
pZip.m_pRead = => ZipFileStreamReadFunc;
pZip.m_pIO_opaque = pZip;
pZip.m_pState.mStream = stream;
pZip.m_archive_size = file_size;
if (!zip_reader_read_central_dir(pZip, flags))
{
ZipReaderEnd(pZip);
return false;
}
return true;
}
public static int ZipReaderGetNumFiles(ZipArchive* pZip) public static int ZipReaderGetNumFiles(ZipArchive* pZip)
{ {
return (pZip != null) ? pZip.m_total_files : 0; return (pZip != null) ? pZip.m_total_files : 0;

View file

@ -12,7 +12,7 @@ namespace System.IO
return Exists(fileName.ToScopeCStr!()); return Exists(fileName.ToScopeCStr!());
} }
public static Result<void> CreateDirectory(StringView fullPath) public static Result<void, Platform.BfpFileResult> CreateDirectory(StringView fullPath)
{ {
for (int32 pass = 0; pass < 2; pass++) for (int32 pass = 0; pass < 2; pass++)
{ {
@ -34,7 +34,7 @@ namespace System.IO
continue; continue;
} }
} }
return .Err; return .Err(result);
} }
return .Ok; return .Ok;
} }
@ -48,7 +48,7 @@ namespace System.IO
return .Ok; return .Ok;
} }
public static Result<void> DelTree(String path) public static Result<void> DelTree(StringView path)
{ {
if (path.Length <= 2) if (path.Length <= 2)
return .Err; return .Err;

View file

@ -8,13 +8,6 @@ namespace System.IO
{ {
protected Platform.BfpFile* mBfpFile; protected Platform.BfpFile* mBfpFile;
public enum SeekKind
{
Absolute,
Relative,
FromEnd
};
public override int64 Position public override int64 Position
{ {
get get
@ -41,7 +34,7 @@ namespace System.IO
Close(); Close();
} }
public Result<void> Seek(int64 pos, SeekKind seekKind = .Absolute) public override Result<void> Seek(int64 pos, SeekKind seekKind = .Absolute)
{ {
int64 newPos = Platform.BfpFile_Seek(mBfpFile, pos, (Platform.BfpFileSeekKind)seekKind); int64 newPos = Platform.BfpFile_Seek(mBfpFile, pos, (Platform.BfpFileSeekKind)seekKind);
// Ensure position is what was requested // Ensure position is what was requested

View file

@ -0,0 +1,110 @@
#if BF_PLATFORM_WINDOWS
namespace System.IO
{
static class Shell
{
public struct COM_IPersist : Windows.COM_IUnknown
{
public struct VTable : COM_IUnknown.VTable
{
public function HResult(COM_IPersistFile* self, Guid* pClassID) GetClassID;
}
}
public struct COM_IPersistFile : COM_IPersist
{
public static Guid sIID = .(0x0000010b, 0, 0, 0xC0, 0, 0, 0, 0, 0, 0, 0x46);
public struct VTable : COM_IPersist.VTable
{
public function HResult(COM_IPersistFile* self) IsDirty;
public function HResult(COM_IPersistFile* self, char16* pszFileName) Load;
public function HResult(COM_IPersistFile* self, char16* pszFileName, Windows.IntBool remember) Save;
public function HResult(COM_IPersistFile* self, char16* pszFileName) SaveCompleted;
public function HResult(COM_IPersistFile* self, char16* pszName) GetCurFile;
}
public new VTable* VT
{
get
{
return (.)mVT;
}
}
}
public struct COM_IShellLink : Windows.COM_IUnknown
{
public static Guid sCLSID = .(0x00021401, 0, 0, 0xC0, 0, 0, 0, 0, 0, 0, 0x46);
public static Guid sIID = .(0x000214F9, 0, 0, 0xC0, 0, 0, 0, 0, 0, 0, 0x46);
struct IDLIST;
public struct VTable : Windows.COM_IUnknown.VTable
{
public function HResult(COM_IShellLink* self, char16* pszFile, int32 cch, Windows.NativeFindData* pfd, uint32 fFlags) GetPath;
public function HResult(COM_IShellLink* self, IDLIST** ppidl) GetIDList;
public function HResult(COM_IShellLink* self, IDLIST* pidl) SetIDList;
public function HResult(COM_IShellLink* self, char16* pszName, int32 cch) GetDescription;
public function HResult(COM_IShellLink* self, char16* pszName) SetDescription;
public function HResult(COM_IShellLink* self, char16* pszDir, int32 cch) GetWorkingDirectory;
public function HResult(COM_IShellLink* self, char16* pszDir) SetWorkingDirectory;
public function HResult(COM_IShellLink* self, char16* pszArgs, int32 cch) GetArguments;
public function HResult(COM_IShellLink* self, char16* pszArgs) SetArguments;
public function HResult(COM_IShellLink* self, uint16 *pwHotkey) GetHotkey;
public function HResult(COM_IShellLink* self, uint16 wHotkey) SetHotkey;
public function HResult(COM_IShellLink* self, int32 *piShowCmd) GetShowCmd;
public function HResult(COM_IShellLink* self, int32 iShowCmd) SetShowCmd;
public function HResult(COM_IShellLink* self, char16* pszIconPath, int32 cch, int32 *piIcon) GetIconLocation;
public function HResult(COM_IShellLink* self, char16* pszIconPath, int32 iIcon) SetIconLocation;
public function HResult(COM_IShellLink* self, char16* pszPathRel, uint32 dwReserved) SetRelativePath;
public function HResult(COM_IShellLink* self, Windows.HWnd hwnd, uint32 fFlags) Resolve;
public function HResult(COM_IShellLink* self, char16* pszFile) SetPath;
}
public new VTable* VT
{
get
{
return (.)mVT;
}
}
}
public static Result<void> CreateShortcut(StringView linkPath, StringView targetPath, StringView arguments, StringView workingDirectory, StringView description)
{
COM_IShellLink* shellLink = null;
COM_IPersistFile* persistFile = null;
defer
{
if (persistFile != null)
persistFile.VT.Release(persistFile);
if (shellLink != null)
shellLink.VT.Release(shellLink);
}
mixin TryHR(Windows.COM_IUnknown.HResult result)
{
if (result != .OK)
return .Err;
}
TryHR!(Windows.COM_IUnknown.CoCreateInstance(ref COM_IShellLink.sCLSID, null, .INPROC_SERVER, ref COM_IShellLink.sIID, (void**)&shellLink));
TryHR!(shellLink.VT.SetPath(shellLink, targetPath.ToScopedNativeWChar!()));
if (!arguments.IsEmpty)
TryHR!(shellLink.VT.SetArguments(shellLink, arguments.ToScopedNativeWChar!()));
if (!workingDirectory.IsEmpty)
TryHR!(shellLink.VT.SetWorkingDirectory(shellLink, workingDirectory.ToScopedNativeWChar!()));
if (!description.IsEmpty)
TryHR!(shellLink.VT.SetDescription(shellLink, description.ToScopedNativeWChar!()));
TryHR!(shellLink.VT.QueryInterface(shellLink, ref COM_IPersistFile.sIID, (void**)&persistFile));
TryHR!(persistFile.VT.Save(persistFile, linkPath.ToScopedNativeWChar!(), true));
return .Ok;
}
}
}
#endif

View file

@ -14,6 +14,13 @@ namespace System.IO
private ReadWriteTask _activeReadWriteTask; private ReadWriteTask _activeReadWriteTask;
private SemaphoreSlim _asyncActiveSemaphore; private SemaphoreSlim _asyncActiveSemaphore;
public enum SeekKind
{
Absolute,
Relative,
FromEnd
}
public abstract int64 Position public abstract int64 Position
{ {
get; get;
@ -43,6 +50,15 @@ namespace System.IO
} }
} }
public virtual Result<void> Seek(int64 pos, SeekKind seekKind = .Absolute)
{
if (seekKind == .Absolute)
Position = pos;
else
Runtime.FatalError();
return .Ok;
}
public abstract Result<int> TryRead(Span<uint8> data); public abstract Result<int> TryRead(Span<uint8> data);
public abstract Result<int> TryWrite(Span<uint8> data); public abstract Result<int> TryWrite(Span<uint8> data);
public abstract void Close(); public abstract void Close();

View file

@ -11,6 +11,10 @@ namespace System.IO
public bool AutoFlush; public bool AutoFlush;
public this()
{
}
public this(Stream stream, Encoding encoding, int32 bufferSize, bool ownsStream = false) public this(Stream stream, Encoding encoding, int32 bufferSize, bool ownsStream = false)
{ {
Debug.Assert(encoding != null); Debug.Assert(encoding != null);
@ -19,6 +23,21 @@ namespace System.IO
mOwnsStream = ownsStream; mOwnsStream = ownsStream;
} }
public Result<void, FileOpenError> Create(StringView fileName)
{
Debug.Assert(mStream == null);
var fileStream = new FileStream();
mStream = fileStream;
mEncoding = .UTF8;
mOwnsStream = true;
if (fileStream.Open(fileName, FileMode.Create, FileAccess.Write, FileShare.ReadWrite) case .Err(let err))
return .Err(err);
return .Ok;
}
public Result<void> Write(Span<uint8> data) public Result<void> Write(Span<uint8> data)
{ {
var spanLeft = data; var spanLeft = data;

View file

@ -0,0 +1,78 @@
using System.IO;
namespace System.IO
{
class Substream : Stream
{
public bool mOwnsStream;
Stream mChildStream ~ { if (mOwnsStream) delete _; };
int64 mOffset;
int64 mLength;
public override int64 Position
{
get
{
return mChildStream.Position + mOffset;
}
set
{
mChildStream.Position = value + mOffset;
}
}
public override int64 Length
{
get
{
return mLength;
}
}
public override bool CanRead
{
get
{
return mChildStream.CanRead;
}
}
public override bool CanWrite
{
get
{
return mChildStream.CanWrite;
}
}
public this(Stream childStream, int64 offset, int64 length, bool ownsStream = false)
{
mChildStream = childStream;
mOffset = offset;
mLength = length;
mOwnsStream = ownsStream;
}
public override Result<int> TryRead(Span<uint8> data)
{
return mChildStream.TryRead(data);
}
public override Result<int> TryWrite(Span<uint8> data)
{
return mChildStream.TryWrite(data);
}
public override void Close()
{
mChildStream.Close();
}
public override void Flush()
{
mChildStream.Flush();
}
}
}

View file

@ -400,6 +400,8 @@ namespace System
AppData_Local, AppData_Local,
AppData_LocalLow, AppData_LocalLow,
AppData_Roaming, AppData_Roaming,
Programs,
Programs_Common
} }
public static Result<void, Platform.Result> GetStrHelper(String outStr, delegate void (char8* outPtr, int32* outSize, Result* outResult) func) public static Result<void, Platform.Result> GetStrHelper(String outStr, delegate void (char8* outPtr, int32* outSize, Result* outResult) func)

View file

@ -40,7 +40,7 @@ namespace System
private int32 inextp; private int32 inextp;
private int32[] SeedArray = new int32[56] ~ delete _; private int32[] SeedArray = new int32[56] ~ delete _;
private int32 sSeed = (int32)Environment.TickCount; private static int32 sSeed = (int32)Platform.BfpSystem_GetTimeStamp();
// //
// Public Constants // Public Constants

View file

@ -2373,6 +2373,7 @@ namespace System
struct StringSplitEnumerator : IEnumerator<StringView> struct StringSplitEnumerator : IEnumerator<StringView>
{ {
StringSplitOptions mSplitOptions; StringSplitOptions mSplitOptions;
char8 mSplitChar0;
char8[] mSplitChars; char8[] mSplitChars;
char8* mPtr; char8* mPtr;
int_strsize mStrLen; int_strsize mStrLen;
@ -2385,6 +2386,10 @@ namespace System
{ {
mPtr = ptr; mPtr = ptr;
mStrLen = (int_strsize)strLength; mStrLen = (int_strsize)strLength;
if (splitChars.Count > 0)
mSplitChar0 = splitChars[0];
else
mSplitChar0 = '\0';
mSplitChars = splitChars; mSplitChars = splitChars;
mCurCount = 0; mCurCount = 0;
mMaxCount = (int32)count; mMaxCount = (int32)count;
@ -2393,6 +2398,19 @@ namespace System
mSplitOptions = splitOptions; mSplitOptions = splitOptions;
} }
public this(char8* ptr, int strLength, char8 splitChar, int count, StringSplitOptions splitOptions)
{
mPtr = ptr;
mStrLen = (int_strsize)strLength;
mSplitChar0 = splitChar;
mSplitChars = null;
mCurCount = 0;
mMaxCount = (int32)count;
mPos = 0;
mMatchPos = -1;
mSplitOptions = splitOptions;
}
public StringView Current public StringView Current
{ {
get get
@ -2443,9 +2461,6 @@ namespace System
return true; return true;
} }
char8 splitChar0 = mSplitChars[0];
int splitCharCount = mSplitChars.Count;
int endDiff = mStrLen - mMatchPos; int endDiff = mStrLen - mMatchPos;
if (endDiff == 0) if (endDiff == 0)
return false; return false;
@ -2461,13 +2476,13 @@ namespace System
else else
{ {
char8 c = mPtr[mMatchPos]; char8 c = mPtr[mMatchPos];
if (c == splitChar0) if (c == mSplitChar0)
{ {
foundMatch = true; foundMatch = true;
} }
else if (splitCharCount > 1) else if (mSplitChars != null)
{ {
for (int i = 1; i < splitCharCount; i++) for (int i = 1; i < mSplitChars.Count; i++)
if (c == mSplitChars[i]) if (c == mSplitChars[i])
foundMatch = true; foundMatch = true;
} }
@ -2478,6 +2493,8 @@ namespace System
if ((mMatchPos > mPos + 1) || (!mSplitOptions.HasFlag(StringSplitOptions.RemoveEmptyEntries))) if ((mMatchPos > mPos + 1) || (!mSplitOptions.HasFlag(StringSplitOptions.RemoveEmptyEntries)))
return true; return true;
mPos = mMatchPos + 1; mPos = mMatchPos + 1;
if (mPos >= mStrLen)
return false;
} }
} }
} }
@ -2585,6 +2602,17 @@ namespace System
} }
} }
public bool IsWhiteSpace
{
get
{
for (int i = 0; i < mLength; i++)
if (!mPtr[i].IsWhiteSpace)
return false;
return true;
}
}
public int GetHashCode() public int GetHashCode()
{ {
return String.[Friend]GetHashCode(mPtr, mLength); return String.[Friend]GetHashCode(mPtr, mLength);
@ -2893,17 +2921,32 @@ namespace System
return (c32, idx, len); return (c32, idx, len);
} }
public StringSplitEnumerator Split(char8 c)
{
return StringSplitEnumerator(Ptr, Length, c, Int32.MaxValue, StringSplitOptions.None);
}
public StringSplitEnumerator Split(char8 separator, int count)
{
return StringSplitEnumerator(Ptr, Length, separator, count, StringSplitOptions.None);
}
public StringSplitEnumerator Split(char8 separator, StringSplitOptions options)
{
return StringSplitEnumerator(Ptr, Length, separator, Int32.MaxValue, options);
}
public StringSplitEnumerator Split(char8 separator, int count, StringSplitOptions options)
{
return StringSplitEnumerator(Ptr, Length, separator, count, options);
}
public StringSplitEnumerator Split(params char8[] separators) public StringSplitEnumerator Split(params char8[] separators)
{ {
return StringSplitEnumerator(Ptr, Length, separators, Int32.MaxValue, StringSplitOptions.None); return StringSplitEnumerator(Ptr, Length, separators, Int32.MaxValue, StringSplitOptions.None);
} }
public StringSplitEnumerator Split(char8[] separators, int count) public StringSplitEnumerator Split(char8[] separators, int count = Int32.MaxValue, StringSplitOptions options = .None)
{
return StringSplitEnumerator(Ptr, Length, separators, count, StringSplitOptions.None);
}
public StringSplitEnumerator Split(char8[] separators, int count, StringSplitOptions options)
{ {
return StringSplitEnumerator(Ptr, Length, separators, count, options); return StringSplitEnumerator(Ptr, Length, separators, count, options);
} }

View file

@ -46,7 +46,7 @@ namespace System
public struct VTable public struct VTable
{ {
public function void(COM_IUnknown* self, ref Guid riid, out void* result) QueryInterface; public function HResult(COM_IUnknown* self, ref Guid riid, void** result) QueryInterface;
public function HResult(COM_IUnknown* self) AddRef; public function HResult(COM_IUnknown* self) AddRef;
public function HResult(COM_IUnknown* self) Release; public function HResult(COM_IUnknown* self) Release;
} }
@ -188,6 +188,7 @@ namespace System
public const int32 MB_YESNO = 4; public const int32 MB_YESNO = 4;
public const int32 MB_ICONHAND = 0x10; public const int32 MB_ICONHAND = 0x10;
public const int32 MB_ICONQUESTION = 0x20;
public const int32 IDOK = 1; public const int32 IDOK = 1;
public const int32 IDYES = 6; public const int32 IDYES = 6;
@ -339,7 +340,7 @@ namespace System
bool gotData = false; bool gotData = false;
GetValue(name, scope [&] (regType, regData) => GetValue(name, scope [&] (regType, regData) =>
{ {
if (regType == Windows.REG_SZ) if ((regType == Windows.REG_SZ) || (regType == Windows.REG_EXPAND_SZ))
{ {
gotData = true; gotData = true;
var span = Span<char16>((char16*)regData.Ptr, regData.Length / 2); var span = Span<char16>((char16*)regData.Ptr, regData.Length / 2);
@ -419,11 +420,27 @@ namespace System
Runtime.NotImplemented(); Runtime.NotImplemented();
//return Variant.Create<int>(1234); //return Variant.Create<int>(1234);
} }
public Result<void> SetValue(StringView name, StringView strValue)
{
let result = Windows.RegSetValueExA(this, name.ToScopeCStr!(), 0, Windows.REG_SZ, strValue.ToScopeCStr!(), (uint32)strValue.Length + 1);
if (result != 0)
return .Err;
return .Ok;
}
public Result<void> SetValueExpand(StringView name, StringView strValue)
{
let result = Windows.RegSetValueExA(this, name.ToScopeCStr!(), 0, Windows.REG_EXPAND_SZ, strValue.ToScopeCStr!(), (uint32)strValue.Length + 1);
if (result != 0)
return .Err;
return .Ok;
}
} }
public struct HWnd : int public struct HWnd : int
{ {
public const HWnd Broadcast = (.)0xFFFF;
} }
public struct HModule : int public struct HModule : int
@ -867,6 +884,7 @@ namespace System
public const int32 WM_KEYDOWN = 0x0100; public const int32 WM_KEYDOWN = 0x0100;
public const int32 WM_KEYUP = 0x0101; public const int32 WM_KEYUP = 0x0101;
public const int32 WM_CHAR = 0x0102; public const int32 WM_CHAR = 0x0102;
public const int32 WM_SETTINGCHANGE = 0x001A;
public const int32 BFFM_INITIALIZED = 1; public const int32 BFFM_INITIALIZED = 1;
public const int32 BFFM_SELCHANGED = 2; public const int32 BFFM_SELCHANGED = 2;
@ -932,6 +950,154 @@ namespace System
public const int32 TIME_ZONE_ID_INVALID = -1; public const int32 TIME_ZONE_ID_INVALID = -1;
public const int32 OBJECT_INHERIT_ACE = 1;
public const int32 CONTAINER_INHERIT_ACE = 2;
public const int32 NO_PROPAGATE_INHERIT_ACE = 4;
public const int32 INHERIT_ONLY_ACE = 8;
public const int32 INHERITED_ACE = 0x10;
public const int32 VALID_INHERIT_FLAGS = 0x1F;
public const int32 SMTO_NORMAL = 0x0000;
public const int32 SMTO_BLOCK = 0x0001;
public const int32 SMTO_ABORTIFHUNG = 0x0002;
enum SECURITY_INFORMATION : int32
{
DACL_SECURITY_INFORMATION = 4
}
enum SE_OBJECT_TYPE : int32
{
SE_UNKNOWN_OBJECT_TYPE,
SE_FILE_OBJECT,
SE_SERVICE,
SE_PRINTER,
SE_REGISTRY_KEY,
SE_LMSHARE,
SE_KERNEL_OBJECT,
SE_WINDOW_OBJECT,
SE_DS_OBJECT,
SE_DS_OBJECT_ALL,
SE_PROVIDER_DEFINED_OBJECT,
SE_WMIGUID_OBJECT,
SE_REGISTRY_WOW64_32KEY,
SE_REGISTRY_WOW64_64KEY
}
public struct SID;
public struct SECURITY_DESCRIPTOR;
[CRepr]
public struct ACL
{
uint8 AclRevision;
uint8 Sbz1;
uint16 AclSize;
uint16 AceCount;
uint16 Sbz2;
}
public enum ACCESS_MODE : int32
{
NOT_USED_ACCESS = 0,
GRANT_ACCESS,
SET_ACCESS,
DENY_ACCESS,
REVOKE_ACCESS,
SET_AUDIT_SUCCESS,
SET_AUDIT_FAILURE
}
public enum MULTIPLE_TRUSTEE_OPERATION : int32
{
NO_MULTIPLE_TRUSTEE,
TRUSTEE_IS_IMPERSONATE,
}
public enum TRUSTEE_FORM : int32
{
TRUSTEE_IS_SID,
TRUSTEE_IS_NAME,
TRUSTEE_BAD_FORM,
TRUSTEE_IS_OBJECTS_AND_SID,
TRUSTEE_IS_OBJECTS_AND_NAME
}
public enum TRUSTEE_TYPE : int32
{
TRUSTEE_IS_UNKNOWN,
TRUSTEE_IS_USER,
TRUSTEE_IS_GROUP,
TRUSTEE_IS_DOMAIN,
TRUSTEE_IS_ALIAS,
TRUSTEE_IS_WELL_KNOWN_GROUP,
TRUSTEE_IS_DELETED,
TRUSTEE_IS_INVALID,
TRUSTEE_IS_COMPUTER
}
[CRepr]
public struct TRUSTEE_W
{
TRUSTEE_W* pMultipleTrustee;
MULTIPLE_TRUSTEE_OPERATION MultipleTrusteeOperation;
TRUSTEE_FORM TrusteeForm;
TRUSTEE_TYPE TrusteeType;
char16* ptstrName;
}
[CRepr]
public struct EXPLICIT_ACCESS_W
{
uint32 grfAccessPermissions;
ACCESS_MODE grfAccessMode;
uint32 grfInheritance;
TRUSTEE_W Trustee;
}
[Import("advapi32.lib"), CLink, StdCall]
public static extern uint32 GetNamedSecurityInfoW(
char16* pObjectName,
SE_OBJECT_TYPE ObjectType,
SECURITY_INFORMATION SecurityInfo,
SID** ppsidOwner,
SID** ppsidGroup,
ACL** ppDacl,
ACL** ppSacl,
SECURITY_DESCRIPTOR* *ppSecurityDescriptor
);
[Import("advapi32.lib"), CLink, StdCall]
public static extern void BuildExplicitAccessWithNameW(
EXPLICIT_ACCESS_W* pExplicitAccess,
char16* pTrusteeName,
uint32 AccessPermissions,
ACCESS_MODE AccessMode,
uint32 Inheritance
);
[Import("advapi32.lib"), CLink, StdCall]
public static extern uint32 SetEntriesInAclW(
uint32 cCountOfExplicitEntries,
EXPLICIT_ACCESS_W* pListOfExplicitEntries,
ACL* OldAcl,
ACL** NewAcl
);
[Import("advapi32.lib"), CLink, StdCall]
public static extern uint32 SetNamedSecurityInfoW(
char16* pObjectName,
SE_OBJECT_TYPE ObjectType,
SECURITY_INFORMATION SecurityInfo,
SID* psidOwner,
SID* psidGroup,
ACL* pDacl,
ACL* pSacl
);
[CLink, StdCall]
public static extern void LocalFree(void* ptr);
[CLink, StdCall] [CLink, StdCall]
public static extern int32 GetTimeZoneInformation(out TimeZoneInformation dynamicTimeZoneInformation); public static extern int32 GetTimeZoneInformation(out TimeZoneInformation dynamicTimeZoneInformation);
@ -953,6 +1119,9 @@ namespace System
[Import("advapi32.lib"), CLink, StdCall] [Import("advapi32.lib"), CLink, StdCall]
public static extern int32 RegGetValueA(HKey hkey, char8* lpSubKey, char8* lpValue, uint32 dwFlags, uint32* pdwType, void* pvData, uint32* pcbData); public static extern int32 RegGetValueA(HKey hkey, char8* lpSubKey, char8* lpValue, uint32 dwFlags, uint32* pdwType, void* pvData, uint32* pcbData);
[Import("advapi32.lib"), CLink, StdCall]
public static extern int32 RegSetValueExA(HKey hkey, char8* lpValue, uint32 reserved, uint32 dwType, void* pvData, uint32 cbData);
[Import("shell32.lib"), CLink, StdCall] [Import("shell32.lib"), CLink, StdCall]
public static extern int32 SHGetSpecialFolderLocation(HWnd hwnd, int32 csidl, ref int ppidl); public static extern int32 SHGetSpecialFolderLocation(HWnd hwnd, int32 csidl, ref int ppidl);
@ -1124,7 +1293,7 @@ namespace System
public static extern int32 MessageBoxA(HWnd hWnd, char8* text, char8* caption, int32 type); public static extern int32 MessageBoxA(HWnd hWnd, char8* text, char8* caption, int32 type);
[CLink, StdCall] [CLink, StdCall]
public static extern int32 MessageBoxW(HWnd hWnd, char16* text, char8* caption, int32 type); public static extern int32 MessageBoxW(HWnd hWnd, char16* text, char16* caption, int32 type);
[CLink, StdCall] [CLink, StdCall]
public static extern int32 SetErrorMode(int32 errorMode); public static extern int32 SetErrorMode(int32 errorMode);
@ -1182,7 +1351,10 @@ namespace System
public static extern IntBool PostMessageW(HWnd hWnd, int32 msg, int wParam, int lParam); public static extern IntBool PostMessageW(HWnd hWnd, int32 msg, int wParam, int lParam);
[Import("user32.lib"), CLink, StdCall] [Import("user32.lib"), CLink, StdCall]
public static extern IntBool SendMessageW(HWnd hWnd, int32 msg, int wParam, int lParam); public static extern int32 SendMessageW(HWnd hWnd, int32 msg, int wParam, int lParam);
[Import("user32.lib"), CLink, StdCall]
public static extern int32 SendMessageTimeoutW(HWnd hWnd, int32 msg, int wParam, int lParam, int32 flags, int32 timeout, int32* result);
[Import("user32.lib "), CLink, StdCall] [Import("user32.lib "), CLink, StdCall]
public static extern HWnd SetFocus(HWnd hWnd); public static extern HWnd SetFocus(HWnd hWnd);

View file

@ -286,6 +286,8 @@ enum BfpSysDirectoryKind
BfpSysDirectoryKind_AppData_Local, BfpSysDirectoryKind_AppData_Local,
BfpSysDirectoryKind_AppData_LocalLow, BfpSysDirectoryKind_AppData_LocalLow,
BfpSysDirectoryKind_AppData_Roaming, BfpSysDirectoryKind_AppData_Roaming,
BfpSysDirectoryKind_Programs,
BfpSysDirectoryKind_Programs_Common
}; };
struct BfpFindFileData; struct BfpFindFileData;

View file

@ -2563,6 +2563,12 @@ BFP_EXPORT void BFP_CALLTYPE BfpDirectory_GetSysDirectory(BfpSysDirectoryKind sy
case BfpSysDirectoryKind_AppData_Roaming: case BfpSysDirectoryKind_AppData_Roaming:
_GetKnownFolder(FOLDERID_RoamingAppData); _GetKnownFolder(FOLDERID_RoamingAppData);
return; return;
case BfpSysDirectoryKind_Programs:
_GetKnownFolder(FOLDERID_Programs);
return;
case BfpSysDirectoryKind_Programs_Common:
_GetKnownFolder(FOLDERID_CommonPrograms);
return;
} }
TryStringOut(path, outPath, inOutPathLen, (BfpResult*)outResult); TryStringOut(path, outPath, inOutPathLen, (BfpResult*)outResult);

View file

@ -13,3 +13,7 @@ Location = { Path = "../../BeefLibs/Beefy2D" }
[Registry.SDL2] [Registry.SDL2]
Version = "1.0.0" Version = "1.0.0"
Location = { Path = "../../BeefLibs/SDL2" } Location = { Path = "../../BeefLibs/SDL2" }
[Registry.MiniZ]
Version = "1.0.0"
Location = { Path = "../../BeefLibs/MiniZ" }

View file

@ -1919,7 +1919,6 @@ namespace IDE.ui
infoSections[i].ToString(str); infoSections[i].ToString(str);
mInvokeSrcPositions.Add(int32.Parse(str)); mInvokeSrcPositions.Add(int32.Parse(str));
} }
Debug.WriteLine("Invoke size: {}", mInvokeSrcPositions.Count);
} }
case "invokeLeftParen": case "invokeLeftParen":
{ {