1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-08 03:28:20 +02:00

Improved SDL platform support, 'ar' lib reworking

This commit is contained in:
Brian Fiete 2022-11-07 09:57:27 -08:00
parent 258a6653f9
commit d20b53b187
16 changed files with 488 additions and 385 deletions

View file

@ -45,6 +45,10 @@ if (HAVE_BACKTRACE_HEADERS)
add_definitions(-DBFP_HAS_BACKTRACE)
endif ()
if (DEFINED BF_DISABLE_FFI)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DBF_DISABLE_FFI")
endif()
if (${IOS})
include_directories(
.
@ -255,7 +259,7 @@ elseif (${ANDROID})
../BeefySysLib/platform/android/BFPlatform.cpp
../BeefySysLib/platform/android/AndroidCommon.cpp
)
else()
elseif ((${CMAKE_HOST_SYSTEM_PROCESSOR} STREQUAL "x86_64") AND (NOT DEFINED BF_DISABLE_FFI))
file(GLOB SRC_FILES_OS
../BeefySysLib/platform/linux/BFPlatform.cpp
../BeefySysLib/platform/linux/LinuxCommon.cpp
@ -266,8 +270,13 @@ else()
../BeefySysLib/third_party/libffi/x86_64-unknown-linux-gnu/src/closures.o
../BeefySysLib/third_party/libffi/x86_64-unknown-linux-gnu/src/x86/ffi64.o
../BeefySysLib/third_party/libffi/x86_64-unknown-linux-gnu/src/x86/unix64.o
../BeefySysLib/third_party/libffi/x86_64-unknown-linux-gnu/src/x86/ffiw64.o
../BeefySysLib/third_party/libffi/x86_64-unknown-linux-gnu/src/x86/ffiw64.o
)
else()
file(GLOB SRC_FILES_OS
../BeefySysLib/platform/linux/BFPlatform.cpp
../BeefySysLib/platform/linux/LinuxCommon.cpp
)
endif()
# Add library to build.

View file

@ -106,6 +106,10 @@ if(NOT MSVC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wno-multichar")
endif(NOT MSVC)
if (DEFINED BF_ENABLE_SDL)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DBF_ENABLE_SDL")
endif()
################ Files ################
# -- Add files to project. -- #
#######################################
@ -117,8 +121,7 @@ file(GLOB SRC_FILES
CachedDataStream.cpp
Common.cpp
DataStream.cpp
FileStream.cpp
HeadlessApp.cpp
FileStream.cpp
MemStream.cpp
ResLib.cpp
Startup.cpp
@ -308,11 +311,20 @@ if (${APPLE})
file(GLOB SRC_FILES_OS
platform/darwin/BFPlatform.cpp
platform/darwin/DarwinCommon.cpp
HeadlessApp.cpp
)
else()
file(GLOB SRC_FILES_OS
platform/linux/BFPlatform.cpp
platform/linux/LinuxCommon.cpp
HeadlessApp.cpp
)
endif()
if (DEFINED BF_ENABLE_SDL)
file(GLOB SRC_FILES_OS
platform/sdl/SdlBFApp.cpp
platform/sdl/GLRenderDevice.cpp
)
endif()

View file

@ -28,6 +28,10 @@
//#define offsetof(type, member) __builtin_offsetof (type, member)
#ifdef __arm__
#define BF_PLATFORM_OPENGL_ES2
#endif
extern "C"
{
//#define FFI_BUILDING
@ -136,7 +140,7 @@ typedef void* HMODULE;
#if defined _DEBUG || defined BF_DEBUG_ASSERTS
#define BF_DBG_FATAL(msg) (void) ((Beefy::BFFatalError(msg, __FILE__, __LINE__), 0) )
#else
#define BF_DBG_FATAL(msg)
#define BF_DBG_FATAL(msg)
#endif
#define BF_NOINLINE __attribute__ ((noinline))
@ -159,7 +163,7 @@ static char* itoa(int value, char* str, int base)
inline uint32 InterlockedCompareExchange(volatile uint32* dest, uint32 exch, uint32 comp)
{
return __sync_val_compare_and_swap(dest, comp, exch);
return __sync_val_compare_and_swap(dest, comp, exch);
}
inline uint64 InterlockedCompareExchange64(volatile int64* dest, int64 exch, int64 comp)

View file

@ -1,9 +1,14 @@
#pragma once
#include "../../HeadlessApp.h"
#include "../sdl/SdlBFApp.h"
#include "../HeadlessApp.h"
NS_BF_BEGIN;
#ifdef BF_ENABLE_SDL
typedef SdlBFApp PlatformBFApp;
#else
typedef HeadlessApp PlatformBFApp;
#endif
NS_BF_END;

View file

@ -59,28 +59,28 @@ struct BfpPipeInfo
};
struct BfpFile
{
{
BfpPipeInfo* mPipeInfo;
int mHandle;
int mHandle;
bool mNonBlocking;
bool mAllowTimeout;
bool mAllowTimeout;
bool mIsStd;
BfpFile()
{
mPipeInfo = NULL;
mHandle = -1;
mHandle = -1;
mNonBlocking = false;
mAllowTimeout = false;
mAllowTimeout = false;
mIsStd = false;
}
BfpFile(int handle)
{
{
mPipeInfo = NULL;
mHandle = handle;
mHandle = handle;
mNonBlocking = false;
mAllowTimeout = false;
mAllowTimeout = false;
mIsStd = false;
}
@ -130,7 +130,7 @@ BfpTimeStamp BfpToTimeStamp(const timespec& ts)
int gBFPlatformLastError = 0;
uint32 Beefy::BFTickCount()
{
{
struct timespec now;
if (clock_gettime(CLOCK_MONOTONIC, &now))
return 0;
@ -166,7 +166,7 @@ int64 Beefy::EndianSwap(int64 val)
logType = LOG_WARNING;
else if (hFile == (int*)STDERR_FILENO)
logType = LOG_ERR;
if (logType != -1)
{
static std::string strOut;
@ -176,7 +176,7 @@ int64 Beefy::EndianSwap(int64 val)
syslog(LOG_WARNING, "%s", strOut.c_str());
}
#endif
int writeCount = (int)::write((int)(intptr)hFile, lpBuffer, nNumberOfBytesToWrite);
if (writeCount == -1)
{
@ -184,7 +184,7 @@ int64 Beefy::EndianSwap(int64 val)
lpNumberOfBytesWritten = 0;
return false;
}
*lpNumberOfBytesWritten = (uint32)writeCount;
return true;
}*/
@ -195,7 +195,7 @@ int64 Beefy::GetFileTimeWrite(const StringImpl& path)
int result = stat(path.c_str(), &statbuf);
if (result == -1)
return 0;
return statbuf.st_mtime;
}
@ -203,40 +203,40 @@ int64 Beefy::GetFileTimeWrite(const StringImpl& path)
{
std::wstring tzName0 = Beefy::UTF8Decode(tzname[0]);
std::wstring tzName1 = Beefy::UTF8Decode(tzname[1]);
bool isDST = false;
time_t timeNow;
time(&timeNow);
tm tmNow = *gmtime(&timeNow);
isDST = tmNow.tm_isdst;
struct tm checkTM;
memset(&checkTM, 0, sizeof(tm));
checkTM.tm_mday = 1;
checkTM.tm_year = tmNow.tm_year;
time_t checkTime = mktime(&checkTM);
time_t lastOffset = 0;
time_t minOffset = 0;
time_t maxOffset = 0;
for (int pass = 0; pass < 2; pass++)
{
int searchDir = 60*60*24;
int thresholdCount = 0;
while (true)
{
checkTime += searchDir;
tm checkTM = *gmtime(&checkTime);
if (checkTM.tm_year != tmNow.tm_year)
break; // No DST
mktime(&checkTM);
time_t offset = checkTM.tm_gmtoff;
if (lastOffset != offset)
{
@ -250,12 +250,12 @@ int64 Beefy::GetFileTimeWrite(const StringImpl& path)
SYSTEMTIME* sysTimeP = (offset == minOffset) ?
&lpTimeZoneInformation->StandardDate :
&lpTimeZoneInformation->DaylightDate;
if (offset == minOffset)
tzName0 = Beefy::UTF8Decode(checkTM.tm_zone);
else
tzName1 = Beefy::UTF8Decode(checkTM.tm_zone);
sysTimeP->wDay = 0;
sysTimeP->wDayOfWeek = 0;
sysTimeP->wYear = checkTM.tm_year + 1900;
@ -265,7 +265,7 @@ int64 Beefy::GetFileTimeWrite(const StringImpl& path)
sysTimeP->wMinute = checkTM.tm_min;
sysTimeP->wSecond = checkTM.tm_sec;
sysTimeP->wMilliseconds = 0;
break;
}
else
@ -282,13 +282,13 @@ int64 Beefy::GetFileTimeWrite(const StringImpl& path)
}
}
}
wcsncpy(lpTimeZoneInformation->StandardName, tzName0.c_str(), 32);
wcsncpy(lpTimeZoneInformation->DaylightName, tzName1.c_str(), 32);
lpTimeZoneInformation->DaylightBias = (int32)maxOffset;
lpTimeZoneInformation->StandardBias = (int32)minOffset;
if (minOffset == maxOffset)
return 0;
return isDST ? 2 : 1;
@ -444,14 +444,14 @@ static String gUnwindExecStr;
static int gUnwindIdx = 0;
static _Unwind_Reason_Code UnwindHandler(struct _Unwind_Context* context, void* ref)
{
{
gUnwindIdx++;
if (gUnwindIdx < 2)
return _URC_NO_REASON;
void* addr = (void*)_Unwind_GetIP(context);
#if BFP_HAS_ATOS
#if BFP_HAS_ATOS
gUnwindExecStr += StrFormat(" %p", addr);
#else
Dl_info info;
@ -470,11 +470,11 @@ static _Unwind_Reason_Code UnwindHandler(struct _Unwind_Context* context, void*
static bool FancyBacktrace()
{
gUnwindExecStr += StrFormat("atos -p %d", getpid());
gUnwindExecStr += StrFormat("atos -p %d", getpid());
_Unwind_Backtrace(&UnwindHandler, NULL);
#if BFP_HAS_ATOS
return system(gUnwindExecStr.c_str()) == 0;
#else
#else
return true;
#endif
}
@ -503,7 +503,7 @@ static void Crashed()
if (!FancyBacktrace())
{
#ifdef BFP_HAS_EXECINFO
#ifdef BFP_HAS_EXECINFO
void* array[64];
size_t size;
char** strings;
@ -511,7 +511,7 @@ static void Crashed()
size = backtrace(array, 64);
strings = backtrace_symbols(array, size);
for (i = 0; i < size; i++)
BFP_ERRPRINTF("%s\n", strings[i]);
@ -524,7 +524,7 @@ static void Crashed()
static void SigHandler(int sig)
{
//printf("SigHandler paused...\n");
//printf("SigHandler paused...\n");
const char* sigName = NULL;
switch (sig)
@ -559,6 +559,9 @@ BFP_EXPORT void BFP_CALLTYPE BfpSystem_Init(int version, BfpSystemInitFlags flag
BfpSystem_FatalError(StrFormat("Bfp build version '%d' does not match requested version '%d'", BFP_VERSION, version).c_str(), "BFP FATAL ERROR");
}
struct sigaction ignoreAction = { SIG_IGN };
sigaction(SIGPIPE, &ignoreAction, NULL);
//if (ptrace(PTRACE_TRACEME, 0, 1, 0) != -1)
{
//ptrace(PTRACE_DETACH, 0, 1, 0);
@ -576,7 +579,7 @@ BFP_EXPORT void BFP_CALLTYPE BfpSystem_Init(int version, BfpSystemInitFlags flag
}
BFP_EXPORT void BFP_CALLTYPE BfpSystem_SetCommandLine(int argc, char** argv)
{
{
char exePath[PATH_MAX] = { 0 };
int nchar = readlink("/proc/self/exe", exePath, PATH_MAX);
if (nchar > 0)
@ -589,8 +592,8 @@ BFP_EXPORT void BFP_CALLTYPE BfpSystem_SetCommandLine(int argc, char** argv)
char* cwd = getcwd(NULL, 0);
gExePath = GetAbsPath(relPath, cwd);
free(cwd);
}
}
for (int i = 0; i < argc; i++)
{
if (i != 0)
@ -628,7 +631,7 @@ BFP_EXPORT void BFP_CALLTYPE BfpSystem_AddCrashInfo(const char* str) // Can do a
}
BFP_EXPORT void BFP_CALLTYPE BfpSystem_SetCrashRelaunchCmd(const char* str)
{
{
}
void BfpSystem_Shutdown()
@ -676,7 +679,7 @@ BFP_EXPORT uint32 BFP_CALLTYPE BfpSystem_InterlockedExchange32(uint32* ptr, uint
// __sync_lock_test_and_set only has Acquire semantics, so we need a __sync_synchronize to enforce a full barrier
uint32 prevVal = __sync_lock_test_and_set(ptr, val);
__sync_synchronize();
return prevVal;
return prevVal;
}
BFP_EXPORT uint64 BFP_CALLTYPE BfpSystem_InterlockedExchange64(uint64* ptr, uint64 val)
@ -684,7 +687,7 @@ BFP_EXPORT uint64 BFP_CALLTYPE BfpSystem_InterlockedExchange64(uint64* ptr, uint
// __sync_lock_test_and_set only has Acquire semantics, so we need a __sync_synchronize to enforce a full barrier
uint64 prevVal = __sync_lock_test_and_set(ptr, val);
__sync_synchronize();
return prevVal;
return prevVal;
}
BFP_EXPORT uint32 BFP_CALLTYPE BfpSystem_InterlockedExchangeAdd32(uint32* ptr, uint32 val)
@ -730,7 +733,7 @@ BFP_EXPORT void BFP_CALLTYPE BfpSystem_GetExecutablePath(char* outStr, int* inOu
gExePath = path;
// When when running with a './file', we end up with an annoying '/./' in our path
gExePath.Replace("/./", "/");
gExePath.Replace("/./", "/");
}
#endif
@ -758,7 +761,7 @@ BFP_EXPORT void BFP_CALLTYPE BfpSystem_GetEnvironmentStrings(char* outStr, int*
}
BFP_EXPORT int BFP_CALLTYPE BfpSystem_GetNumLogicalCPUs(BfpSystemResult* outResult)
{
{
#ifdef BF_PLATFORM_ANDROID
//TODO: Handle this
OUTRESULT(BfpSystemResult_Ok);
@ -789,8 +792,8 @@ BFP_EXPORT int64 BFP_CALLTYPE BfpSystem_GetCPUTickFreq()
BFP_EXPORT void BFP_CALLTYPE BfpSystem_CreateGUID(BfpGUID* outGuid)
{
// uuid_t guid;
// uuid_generate(guid);
// uuid_t guid;
// uuid_generate(guid);
// BfpGUID bfpGuid;
// memcpy(&bfpGuid, guid, 16);
// return bfpGuid;
@ -879,7 +882,7 @@ BFP_EXPORT BfpSpawn* BFP_CALLTYPE BfpSpawn_Create(const char* inTargetPath, cons
{
Beefy::Array<Beefy::StringView> stringViews;
//printf("BfpSpawn_Create: %s %s %x\n", inTargetPath, args, flags);
//printf("BfpSpawn_Create: %s %s %x\n", inTargetPath, args, flags);
char* prevWorkingDir = NULL;
@ -966,7 +969,7 @@ BFP_EXPORT BfpSpawn* BFP_CALLTYPE BfpSpawn_Create(const char* inTargetPath, cons
{
verb = targetPath.Substring(barPos + 1);
targetPath.RemoveToEnd(barPos);
}
}
}
int32 i = 0;
@ -1097,9 +1100,9 @@ BFP_EXPORT BfpSpawn* BFP_CALLTYPE BfpSpawn_Create(const char* inTargetPath, cons
{
if ((flags & BfpSpawnFlag_RedirectStdInput) != 0)
{
close(stdInFD[1]);
close(stdInFD[1]);
while ((dup2(stdInFD[0], STDIN_FILENO) == -1) && (errno == EINTR)) {}
close(stdInFD[0]);
close(stdInFD[0]);
}
if ((flags & BfpSpawnFlag_RedirectStdOutput) != 0)
@ -1114,7 +1117,7 @@ BFP_EXPORT BfpSpawn* BFP_CALLTYPE BfpSpawn_Create(const char* inTargetPath, cons
while ((dup2(stdErrFD[1], STDERR_FILENO) == -1) && (errno == EINTR)) {}
close(stdErrFD[0]);
}
// If successful then this shouldn't return at all:
int result;
@ -1245,18 +1248,18 @@ struct BfpThread
void* mThreadParam;
#ifndef BFP_HAS_PTHREAD_TIMEDJOIN_NP
BfpEvent* mDoneEvent;
#endif
#endif
pthread_t mPThread;
int mRefCount;
int mPriority;
int mPriority;
BfpThread()
{
}
~BfpThread()
{
{
}
void Release()
@ -1280,13 +1283,13 @@ static __thread BfpThreadInfo gCurrentThreadInfo;
void* ThreadFunc(void* threadParam)
{
BfpThread* thread = (BfpThread*)threadParam;
gCurrentThread = thread;
thread->mStartProc(thread->mThreadParam);
#ifndef BFP_HAS_PTHREAD_TIMEDJOIN_NP
BfpEvent_Set(thread->mDoneEvent, true);
#endif
#endif
thread->Release();
return NULL;
}
@ -1301,9 +1304,9 @@ BFP_EXPORT BfpThread* BFP_CALLTYPE BfpThread_Create(BfpThreadStartProc startProc
thread->mPriority = 0;
#ifndef BFP_HAS_PTHREAD_TIMEDJOIN_NP
thread->mDoneEvent = BfpEvent_Create(BfpEventFlag_None);
#endif
#endif
BF_ASSERT(sizeof(pthread_t) <= sizeof(void*));
BF_ASSERT(sizeof(pthread_t) <= sizeof(void*));
pthread_attr_t params;
pthread_attr_init(&params);
pthread_attr_setstacksize(&params, stackSize);
@ -1312,7 +1315,7 @@ BFP_EXPORT BfpThread* BFP_CALLTYPE BfpThread_Create(BfpThreadStartProc startProc
pthread_create(&thread->mPThread, &params, ThreadFunc, (void*)thread);
pthread_attr_destroy(&params);
if (outThreadId != NULL)
*outThreadId = (BfpThreadId)thread->mPThread;
@ -1342,7 +1345,7 @@ BFP_EXPORT void BFP_CALLTYPE BfpThread_Release(BfpThread* thread)
pthread_detach(thread->mPThread);
thread->mPThreadReleased = true;
}
thread->Release();
}
@ -1402,7 +1405,7 @@ BFP_EXPORT bool BFP_CALLTYPE BfpThread_WaitFor(BfpThread* thread, int waitMS)
#else
if (thread == NULL)
BF_FATAL("Invalid thread with non-infinite wait");
return BfpEvent_WaitFor(thread->mDoneEvent, waitMS);
return BfpEvent_WaitFor(thread->mDoneEvent, waitMS);
#endif
}
@ -1463,7 +1466,7 @@ BFP_EXPORT BfpThreadInfo* BFP_CALLTYPE BfpThreadInfo_Create()
{
BfpThreadInfo* threadInfo = new BfpThreadInfo();
threadInfo->mStackBase = 0;
threadInfo->mStackLimit = 0;
threadInfo->mStackLimit = 0;
threadInfo->mPThread = pthread_self();
return threadInfo;
}
@ -1516,7 +1519,7 @@ BFP_EXPORT BfpCritSect* BFP_CALLTYPE BfpCritSect_Create()
{
BfpCritSect* critSect = new BfpCritSect();
pthread_mutexattr_t attributes;
pthread_mutexattr_t attributes;
pthread_mutexattr_init(&attributes);
pthread_mutexattr_settype(&attributes, PTHREAD_MUTEX_RECURSIVE);
pthread_mutex_init(&critSect->mPMutex, &attributes);
@ -1547,12 +1550,12 @@ BFP_EXPORT bool BFP_CALLTYPE BfpCritSect_TryEnter(BfpCritSect* critSect, int wai
{
return pthread_mutex_trylock(&critSect->mPMutex) == 0;
}
uint32 start = Beefy::BFTickCount();
while ((int)(Beefy::BFTickCount() - start) < waitMS)
{
if (pthread_mutex_trylock(&critSect->mPMutex) == 0)
{
{
return true;
}
}
@ -1646,22 +1649,22 @@ BFP_EXPORT bool BFP_CALLTYPE BfpEvent_WaitFor(BfpEvent* event, int waitMS)
clock_gettime(CLOCK_REALTIME, &ts);
ts.tv_sec += waitMS / 1000;
ts.tv_nsec += (waitMS % 1000) * 1000000;
result = pthread_cond_timedwait(&event->mCondVariable, &event->mMutex, &ts);
if (waitMS == (uint32)-1)
BF_ASSERT(result == 0);
if (result != 0)
{
// Timeout
// Timeout
pthread_mutex_unlock(&event->mMutex);
return false;
}
}
}
if (!event->mManualReset)
event->mSet = false;
event->mSet = false;
pthread_mutex_unlock(&event->mMutex);
return true;
}
@ -1669,17 +1672,17 @@ BFP_EXPORT bool BFP_CALLTYPE BfpEvent_WaitFor(BfpEvent* event, int waitMS)
BFP_EXPORT BfpDynLib* BFP_CALLTYPE BfpDynLib_Load(const char* fileName)
{
BfpDynLib* mod = NULL;
static const char* prefixes[] = {NULL, "lib"};
static const char* suffixes[] = {NULL, ".so", ".dylib"};
for (int prefixIdx = 0; prefixIdx < sizeof(prefixes)/sizeof(prefixes[0]); prefixIdx++)
{
for (int suffixIdx = 0; suffixIdx < sizeof(suffixes)/sizeof(suffixes[0]); suffixIdx++)
{
const char* prefix = prefixes[prefixIdx];
const char* suffix = suffixes[suffixIdx];
Beefy::String checkName = fileName;
if (prefix != NULL)
checkName = Beefy::String(prefix) + checkName;
@ -1690,13 +1693,13 @@ BFP_EXPORT BfpDynLib* BFP_CALLTYPE BfpDynLib_Load(const char* fileName)
checkName.RemoveToEnd(dotPos);
checkName += suffix;
}
mod = (BfpDynLib*)dlopen(checkName.c_str(), RTLD_LAZY);
if (mod != NULL)
return mod;
}
}
/*mod = (BfpDynLib*)dlopen("/var/Beef/qt-build/Debug/bin/libIDEHelper.so", RTLD_LAZY);;
if (mod == NULL)
{
@ -1725,16 +1728,16 @@ BFP_EXPORT void BFP_CALLTYPE BfpDynLib_GetFilePath(BfpDynLib* lib, char* outPath
return;
}
path = linkMap->l_name;
path = linkMap->l_name;
#else
Dl_info info;
Dl_info info;
if (dladdr((void*)lib, &info) == 0)
{
OUTRESULT(BfpLibResult_UnknownError);
return;
}
path = info.dli_fname;
path = info.dli_fname;
#endif
TryStringOut(path, outPath, inOutPathSize, (BfpResult*)outResult);
@ -1762,7 +1765,7 @@ BFP_EXPORT void BFP_CALLTYPE BfpDirectory_Create(const char* path, BfpFileResult
break;
}
}
else
else
OUTRESULT(BfpFileResult_Ok);
}
@ -1785,7 +1788,7 @@ BFP_EXPORT void BFP_CALLTYPE BfpDirectory_Delete(const char* path, BfpFileResult
break;
}
}
else
else
OUTRESULT(BfpFileResult_Ok);
}
@ -1798,10 +1801,10 @@ BFP_EXPORT void BFP_CALLTYPE BfpDirectory_GetCurrent(char* outPath, int* inOutPa
}
BFP_EXPORT void BFP_CALLTYPE BfpDirectory_SetCurrent(const char* path, BfpFileResult* outResult)
{
{
if (chdir(path) != 0)
OUTRESULT(BfpFileResult_NotFound);
else
OUTRESULT(BfpFileResult_NotFound);
else
OUTRESULT(BfpFileResult_Ok);
}
@ -1811,7 +1814,7 @@ BFP_EXPORT bool BFP_CALLTYPE BfpDirectory_Exists(const char* path)
int result = stat(path, &statbuf);
if (result != 0)
return false;
return S_ISDIR(statbuf.st_mode);
return S_ISDIR(statbuf.st_mode);
}
BFP_EXPORT void BFP_CALLTYPE BfpDirectory_GetSysDirectory(BfpSysDirectoryKind sysDirKind, char* outPath, int* inOutPathLen, BfpFileResult* outResult)
@ -1821,7 +1824,7 @@ BFP_EXPORT void BFP_CALLTYPE BfpDirectory_GetSysDirectory(BfpSysDirectoryKind sy
}
BFP_EXPORT BfpFile* BFP_CALLTYPE BfpFile_Create(const char* inName, BfpFileCreateKind createKind, BfpFileCreateFlags createFlags, BfpFileAttributes createdFileAttrs, BfpFileResult* outResult)
{
{
auto _DoCreate = [&](String& name)
{
int flags = 0;
@ -1903,14 +1906,14 @@ BFP_EXPORT BfpFile* BFP_CALLTYPE BfpFile_Create(const char* inName, BfpFileCreat
}
return result;
};
// POSIX doesn't need the OpenAlways kind.
if (createKind == BfpFileCreateKind_OpenAlways)
createKind = BfpFileCreateKind_CreateAlways;
BfpFile* bfpFile = NULL;
int result;
int result;
if ((createFlags & BfpFileCreateFlag_Pipe) != 0)
{
int readHandle;
@ -1938,11 +1941,11 @@ BFP_EXPORT BfpFile* BFP_CALLTYPE BfpFile_Create(const char* inName, BfpFileCreat
OUTRESULT(BfpFileResult_Ok);
BfpPipeInfo* pipeInfo = new BfpPipeInfo();
pipeInfo->mWriteHandle = writeHandle;
pipeInfo->mWriteHandle = writeHandle;
if (isCreating)
pipeInfo->mPipePath = name;
bfpFile = new BfpFile();
bfpFile->mHandle = readHandle;
bfpFile->mHandle = readHandle;
bfpFile->mPipeInfo = pipeInfo;
}
else
@ -1967,11 +1970,11 @@ BFP_EXPORT BfpFile* BFP_CALLTYPE BfpFile_Create(const char* inName, BfpFileCreat
bfpFile->mHandle = handle;
}
OUTRESULT(BfpFileResult_Ok);
OUTRESULT(BfpFileResult_Ok);
if ((createFlags & (BfpFileCreateFlag_NonBlocking | BfpFileCreateFlag_AllowTimeouts)) != 0)
bfpFile->mNonBlocking = true;
if ((createFlags & BfpFileCreateFlag_AllowTimeouts) != 0)
bfpFile->mAllowTimeout = true;
if ((createFlags & BfpFileCreateFlag_AllowTimeouts) != 0)
bfpFile->mAllowTimeout = true;
return bfpFile;
}
@ -2009,21 +2012,21 @@ BFP_EXPORT intptr BFP_CALLTYPE BfpFile_GetSystemHandle(BfpFile* file)
}
BFP_EXPORT void BFP_CALLTYPE BfpFile_Release(BfpFile* file)
{
{
if ((file->mHandle != -1) && (!file->mIsStd))
close(file->mHandle);
if (file->mPipeInfo != NULL)
{
if (file->mPipeInfo->mWriteHandle != -1)
close(file->mPipeInfo->mWriteHandle);
if (!file->mPipeInfo->mPipePath.IsEmpty())
{
int worked = remove(file->mPipeInfo->mPipePath.c_str());
remove((file->mPipeInfo->mPipePath + "__").c_str());
//printf("Removing %s %d\n", file->mPipeInfo->mPipePath.c_str(), worked);
}
}
}
delete file;
}
@ -2047,7 +2050,7 @@ BFP_EXPORT void BFP_CALLTYPE BfpFile_Close(BfpFile* file, BfpFileResult* outResu
}
BFP_EXPORT intptr BFP_CALLTYPE BfpFile_Write(BfpFile* file, const void* buffer, intptr size, int timeoutMS, BfpFileResult* outResult)
{
{
int writeHandle = file->mHandle;
if (file->mPipeInfo != NULL)
writeHandle = file->mPipeInfo->mWriteHandle;
@ -2071,9 +2074,9 @@ BFP_EXPORT intptr BFP_CALLTYPE BfpFile_Read(BfpFile* file, void* buffer, intptr
{
if (file->mNonBlocking)
{
if (!file->mAllowTimeout)
timeoutMS = -1;
if (!file->mAllowTimeout)
timeoutMS = -1;
timeval timeout;
timeout.tv_sec = 0;
timeout.tv_usec = timeoutMS * 1000;
@ -2119,7 +2122,7 @@ BFP_EXPORT int64 BFP_CALLTYPE BfpFile_GetFileSize(BfpFile* file)
BFP_EXPORT int64 BFP_CALLTYPE BfpFile_Seek(BfpFile* file, int64 offset, BfpFileSeekKind seekKind)
{
int whence;
if (seekKind == BfpFileSeekKind_Absolute)
if (seekKind == BfpFileSeekKind_Absolute)
whence = SEEK_SET;
else if (seekKind == BfpFileSeekKind_Relative)
whence = SEEK_CUR;
@ -2144,7 +2147,7 @@ BFP_EXPORT BfpTimeStamp BFP_CALLTYPE BfpFile_GetTime_LastWrite(const char* path)
struct stat statbuf = {0};
int result = stat(path, &statbuf);
if (result != 0)
return 0;
return 0;
return statbuf.st_mtime;
}
@ -2163,7 +2166,7 @@ BFP_EXPORT void BFP_CALLTYPE BfpFile_Copy(const char* oldPath, const char* newPa
{
int fd_to, fd_from;
char buf[4096];
ssize_t nread;
ssize_t nread;
fd_from = open(oldPath, O_RDONLY);
if (fd_from < 0)
@ -2228,7 +2231,7 @@ BFP_EXPORT void BFP_CALLTYPE BfpFile_Copy(const char* oldPath, const char* newPa
out_error:
close(fd_from);
if (fd_to >= 0)
close(fd_to);
close(fd_to);
}
BFP_EXPORT void BFP_CALLTYPE BfpFile_Rename(const char* oldPath, const char* newPath, BfpFileResult* outResult)
@ -2250,7 +2253,7 @@ BFP_EXPORT void BFP_CALLTYPE BfpFile_Delete(const char* path, BfpFileResult* out
break;
}
}
else
else
OUTRESULT(BfpFileResult_Ok);
}
@ -2327,7 +2330,7 @@ BFP_EXPORT void BFP_CALLTYPE BfpFile_GetActualPath(const char* inPath, char* out
struct BfpFindFileData
{
BfpFindFileFlags mFlags;
BfpFindFileFlags mFlags;
DIR* mDirStruct;
Beefy::String mWildcard;
Beefy::String mDirPath;
@ -2341,7 +2344,7 @@ BFP_EXPORT BfpFindFileData* BFP_CALLTYPE BfpFindFileData_FindFirstFile(const cha
{
Beefy::String findStr = path;
Beefy::String wildcard;
int lastSlashPos = std::max((int)findStr.LastIndexOf('/'), (int)findStr.LastIndexOf('\\'));
if (lastSlashPos != -1)
{
@ -2350,7 +2353,7 @@ BFP_EXPORT BfpFindFileData* BFP_CALLTYPE BfpFindFileData_FindFirstFile(const cha
}
if (wildcard == "*.*")
wildcard = "*";
DIR* dir = opendir(findStr.c_str());
if (dir == NULL)
{
@ -2361,18 +2364,18 @@ BFP_EXPORT BfpFindFileData* BFP_CALLTYPE BfpFindFileData_FindFirstFile(const cha
BfpFindFileData* findData = new BfpFindFileData();
findData->mFlags = flags;
findData->mDirPath = findStr;
findData->mDirStruct = dir;
findData->mDirStruct = dir;
findData->mWildcard = wildcard;
findData->mHasStat = false;
findData->mDirEnt = NULL;
if (!BfpFindFileData_FindNextFile(findData))
{
{
OUTRESULT(BfpFileResult_NoResults);
closedir(findData->mDirStruct);
delete findData;
return NULL;
}
}
OUTRESULT(BfpFileResult_Ok);
return findData;
@ -2384,7 +2387,7 @@ static void GetStat(BfpFindFileData* findData)
return;
Beefy::String filePath = findData->mDirPath + "/" + findData->mDirEnt->d_name;
findData->mStat = { 0 };
int result = stat(filePath.c_str(), &findData->mStat);
@ -2404,11 +2407,11 @@ static bool BfpFindFileData_CheckFilter(BfpFindFileData* findData)
if (isDir)
{
if ((findData->mFlags & BfpFindFileFlag_Directories) == 0)
if ((findData->mFlags & BfpFindFileFlag_Directories) == 0)
return false;
if ((strcmp(findData->mDirEnt->d_name, ".") == 0) || (strcmp(findData->mDirEnt->d_name, "..") == 0))
return false;
if ((strcmp(findData->mDirEnt->d_name, ".") == 0) || (strcmp(findData->mDirEnt->d_name, "..") == 0))
return false;
}
else
{
@ -2423,10 +2426,10 @@ static bool BfpFindFileData_CheckFilter(BfpFindFileData* findData)
}
BFP_EXPORT bool BFP_CALLTYPE BfpFindFileData_FindNextFile(BfpFindFileData* findData)
{
{
while (true)
{
findData->mHasStat = false;
findData->mHasStat = false;
findData->mDirEnt = readdir(findData->mDirStruct);
if (findData->mDirEnt == NULL)
return false;
@ -2446,8 +2449,8 @@ BFP_EXPORT void BFP_CALLTYPE BfpFindFileData_GetFileName(BfpFindFileData* findDa
BFP_EXPORT BfpTimeStamp BFP_CALLTYPE BfpFindFileData_GetTime_LastWrite(BfpFindFileData* findData)
{
GetStat(findData);
#ifdef BF_PLATFORM_DARWIN
GetStat(findData);
#ifdef BF_PLATFORM_DARWIN
return BfpToTimeStamp(findData->mStat.st_mtimespec);
#else
return BfpToTimeStamp(findData->mStat.st_mtim);
@ -2457,7 +2460,7 @@ BFP_EXPORT BfpTimeStamp BFP_CALLTYPE BfpFindFileData_GetTime_LastWrite(BfpFindFi
BFP_EXPORT BfpTimeStamp BFP_CALLTYPE BfpFindFileData_GetTime_Created(BfpFindFileData* findData)
{
GetStat(findData);
#ifdef BF_PLATFORM_DARWIN
#ifdef BF_PLATFORM_DARWIN
return BfpToTimeStamp(findData->mStat.st_ctimespec);
#else
return BfpToTimeStamp(findData->mStat.st_ctim);

View file

@ -7,7 +7,9 @@
USING_NS_BF;
#ifndef NOT_IMPL
#define NOT_IMPL throw "Not implemented"
#endif
#pragma comment(lib, "SDL2.lib")
@ -138,7 +140,7 @@ static void CreateOrthographicOffCenter(float left, float right, float bottom, f
GLShaderParam::GLShaderParam()
{
mGLVariable = NULL;
mGLVariable = 0;
}
GLShaderParam::~GLShaderParam()
@ -229,9 +231,6 @@ GLDrawBatch::GLDrawBatch() : DrawBatch()
GLDrawBatch::~GLDrawBatch()
{
delete mVertices;
delete mIndices;
//mGLBuffer->Release();
}
extern int gBFDrawBatchCount;
@ -311,60 +310,6 @@ void GLDrawLayer::SetShaderConstantData(int usageIdx, int slotIdx, void* constDa
{
}
/*void GLDrawLayer::FreeBatch(DrawBatch* drawBatch)
{
//delete drawBatch;
GLDrawBatch* batch = (GLDrawBatch*) drawBatch;
batch->Clear();
//GLDrawBatchVector* pool = &((GLRenderDevice*) gBFApp->mRenderDevice)->mDrawBatchPool;
//pool->push_back(batch);
GLRenderDevice* glRenderDevice = (GLRenderDevice*)gBFApp->mRenderDevice;
drawBatch->mNext = glRenderDevice->mFreeBatchHead;
glRenderDevice->mFreeBatchHead = batch;
}*/
//void GLRenderDevice::PhysSetShader(Shader* shader)
//{
// GLRenderDevice* aRenderDevice = (GLRenderDevice*) gBFApp->mRenderDevice;
//
// //TODO: Cache more
//
// GLShader* glShader = (GLShader*)shader;
//
// GLfloat matrix[4][4];
// CreateOrthographicOffCenter(0.0f, (float)mPhysRenderWindow->mWidth, (float)mPhysRenderWindow->mHeight, 0.0f, -100.0f, 100.0f, matrix);
// GLint matrixLoc = bf_glGetUniformLocation(glShader->mGLProgram, "screenMatrix");
// //BF_ASSERT(matrixLoc >= 0);
// if (matrixLoc >= 0)
// bf_glUniformMatrix4fv(matrixLoc, 1, false, (float*)matrix);
//
// /*mPhysShaderPass = shaderPass;
// GLShaderPass* dXShaderPass = (GLShaderPass*) mPhysShaderPass;
// mGLDevice->IASetInputLayout(dXShaderPass->mGLLayout);
//
// if (mCurShader->mLastResizeCount != mCurRenderTarget->mResizeNum)
// {
// ShaderParam* shaderParam = mCurShader->GetShaderParam(L"WindowSize");
// if (shaderParam != NULL)
// {
// shaderParam->SetFloat2((float) mCurRenderTarget->mWidth, (float) mCurRenderTarget->mHeight);
// }
//
// mCurShader->mLastResizeCount = mCurRenderTarget->mResizeNum;
// }
//
// GLCHECK(dXShaderPass->mGLEffectPass->Apply(0));*/
//
// /*GLfloat matrix[4][4];
// CreateOrthographicOffCenter(0.0f, (float)mPhysRenderWindow->mWidth, (float)mPhysRenderWindow->mHeight, 0.0f, -100.0f, 100.0f, matrix);
// GLint uniformLocation = bf_glGetUniformLocation(((GLShader*)shaderPass->mTechnique->mShader)->mGLProgram, "screenMatrix");
// if (uniformLocation != -1)
// bf_glUniformMatrix4fv(uniformLocation, 1, false, (GLfloat*)matrix);*/
//}
void GLRenderDevice::PhysSetRenderWindow(RenderWindow* renderWindow)
{
mCurRenderTarget = renderWindow;

View file

@ -117,9 +117,6 @@ class GLRenderWindow : public RenderWindow
public:
SDL_Window* mSDLWindow;
GLRenderDevice* mRenderDevice;
//IGLGISwapChain* mGLSwapChain;
//IGL10Texture2D* mGLBackBuffer;
//IGL10RenderTargetView* mGLRenderTargetView;
bool mResizePending;
int mPendingWidth;
int mPendingHeight;
@ -138,18 +135,9 @@ public:
void CopyBitsTo(uint32* dest, int width, int height);
};
typedef std::vector<GLDrawBatch*> GLDrawBatchVector;
class GLRenderDevice : public RenderDevice
{
public:
//IGLGIFactory* mGLGIFactory;
//IGL10Device* mGLDevice;
//IGL10BlendState* mGLNormalBlendState;
//IGL10BlendState* mGLAdditiveBlendState;
//IGL10RasterizerState* mGLRasterizerStateClipped;
//IGL10RasterizerState* mGLRasterizerStateUnclipped;
GLuint mGLVAO;
GLuint mGLVertexBuffer;
GLuint mGLIndexBuffer;
@ -158,7 +146,6 @@ public:
bool mHasVSync;
GLDrawBatchVector mDrawBatchPool;
GLDrawBatch* mFreeBatchHead;
public:

View file

@ -24,13 +24,21 @@ SdlBFWindow::SdlBFWindow(BFWindow* parent, const StringImpl& title, int x, int y
mSDLWindow = SDL_CreateWindow(title.c_str(), x, y, width, height, sdlWindowFlags);
#ifndef BF_PLATFORM_OPENGL_ES2
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
#endif
if (!SDL_GL_CreateContext(mSDLWindow))
{
BF_FATAL(StrFormat("Unable to create OpenGL context: %s", SDL_GetError()).c_str());
BF_FATAL(StrFormat(
#ifdef BF_PLATFORM_OPENGL_ES2
"Unable to create OpenGLES context: %s"
#else
"Unable to create OpenGL context: %s"
#endif
, SDL_GetError()).c_str());
SDL_Quit();
exit(2);
}
@ -324,7 +332,7 @@ void SdlBFWindow::SetAlpha(float alpha, uint32 destAlphaSrcMask, bool isMouseVis
uint32 SdlBFApp::GetClipboardFormat(const StringImpl& format)
{
return CF_TEXT;
return /*CF_TEXT*/1;
}
void* SdlBFApp::GetClipboardData(const StringImpl& format, int* size)

View file

@ -164,7 +164,7 @@ static HWND gNoButtonWindow = NULL;
static bool gExiting = false;
static LRESULT CALLBACK SEHWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
{
switch (uMsg)
{
case WM_COMMAND:
@ -189,21 +189,21 @@ static LRESULT CALLBACK SEHWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
if (::GetSaveFileNameW(&openFileName))
{
CreateMiniDump(CrashCatcher::Get()->mExceptionPointers, UTF8Encode(fileName));
}
}
}
else if (hwndCtl == gNoButtonWindow)
{
if (!CrashCatcher::Get()->mRelaunchCmd.IsEmpty())
{
SHELLEXECUTEINFOW shellExecuteInfo = { 0 };
shellExecuteInfo.cbSize = sizeof(SHELLEXECUTEINFOW);
shellExecuteInfo.nShow = SW_SHOWNORMAL;
shellExecuteInfo.cbSize = sizeof(SHELLEXECUTEINFOW);
shellExecuteInfo.nShow = SW_SHOWNORMAL;
String cmd = CrashCatcher::Get()->mRelaunchCmd;
String file;
String file;
bool nameQuoted = cmd[0] == '\"';
int i;
for (i = (nameQuoted ? 1 : 0); cmd[i] != 0; i++)
{
@ -224,11 +224,11 @@ static LRESULT CALLBACK SEHWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
useParamsPtr++;
auto fileW = UTF8Decode(file);
shellExecuteInfo.lpFile = fileW.c_str();
shellExecuteInfo.lpFile = fileW.c_str();
auto paramsW = UTF8Decode(useParamsPtr);
shellExecuteInfo.lpParameters = paramsW.c_str();
BOOL success = ::ShellExecuteExW(&shellExecuteInfo);
BOOL success = ::ShellExecuteExW(&shellExecuteInfo);
}
CrashCatcher::Get()->mCloseRequested = true;
@ -261,7 +261,7 @@ static void ShowErrorDialog(const StringImpl& errorTitle, const StringImpl& erro
GetVersionEx(&aVersionInfo);
// Setting fonts on 98 causes weirdo crash things in GDI upon the second crash.
// That's no good.
// That's no good.
gUseDefaultFonts = aVersionInfo.dwPlatformId != VER_PLATFORM_WIN32_NT;
int aHeight = -MulDiv(8, 96, 72);
@ -302,7 +302,7 @@ static void ShowErrorDialog(const StringImpl& errorTitle, const StringImpl& erro
RECT windowRect = aRect;
BOOL worked = AdjustWindowRect(&windowRect, aWindowStyle, FALSE);
HWND aHWnd = ::CreateWindowExW(0, L"SEHWindow", L"Fatal Error!",
aWindowStyle,
64, 64,
@ -332,7 +332,7 @@ static void ShowErrorDialog(const StringImpl& errorTitle, const StringImpl& erro
DEFAULT_PITCH | FF_DONTCARE, "Arial");
if (!gUseDefaultFonts)
SendMessage(aLabelWindow, WM_SETFONT, (WPARAM)aBoldArialFont, 0);
SendMessage(aLabelWindow, WM_SETFONT, (WPARAM)aBoldArialFont, 0);
HWND anEditWindow = CreateWindowA("EDIT", errorText.c_str(),
WS_VISIBLE | WS_CHILD | ES_MULTILINE | WS_BORDER | WS_HSCROLL | WS_VSCROLL | ES_READONLY,
@ -403,7 +403,7 @@ static void ShowErrorDialog(const StringImpl& errorTitle, const StringImpl& erro
aCurX += aButtonWidth + 8;
}
gNoButtonWindow = CreateWindowA("BUTTON", relaunchCmd.IsEmpty() ? "Close Now" : "Relaunch",
WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON | BS_PUSHBUTTON,
aCurX, aRect.bottom - 24 - 8,
@ -437,7 +437,7 @@ static void ShowErrorDialog(const StringImpl& errorTitle, const StringImpl& erro
static bool GetLogicalAddress(void* addr, char* szModule, DWORD len, uintptr& section, uintptr& offset)
{
MEMORY_BASIC_INFORMATION mbi;
if (!VirtualQuery(addr, &mbi, sizeof(mbi)))
return false;
@ -495,7 +495,7 @@ static BOOL CALLBACK MyMiniDumpCallback(
BOOL bRet = FALSE;
// Check parameters
// Check parameters
if (pInput == 0)
return FALSE;
@ -504,29 +504,29 @@ static BOOL CALLBACK MyMiniDumpCallback(
return FALSE;
// Process the callbacks
// Process the callbacks
switch (pInput->CallbackType)
{
case IncludeModuleCallback:
{
// Include the module into the dump
// Include the module into the dump
bRet = TRUE;
}
break;
case IncludeThreadCallback:
{
// Include the thread into the dump
// Include the thread into the dump
bRet = TRUE;
}
break;
case ModuleCallback:
{
// Does the module have ModuleReferencedByMemory flag set ?
// Does the module have ModuleReferencedByMemory flag set ?
if (!(pOutput->ModuleWriteFlags & ModuleReferencedByMemory))
{
// No, it does not - exclude it
// No, it does not - exclude it
//wprintf(L"Excluding module: %s \n", pInput->Module.FullPath);
@ -538,19 +538,19 @@ static BOOL CALLBACK MyMiniDumpCallback(
break;
case ThreadCallback:
{
// Include all thread information into the minidump
// Include all thread information into the minidump
bRet = TRUE;
}
break;
case ThreadExCallback:
{
// Include this information
// Include this information
bRet = TRUE;
}
break;
case MemoryCallback:
{
// We do not include any information here -> return FALSE
// We do not include any information here -> return FALSE
bRet = FALSE;
}
break;
@ -564,7 +564,7 @@ static BOOL CALLBACK MyMiniDumpCallback(
static bool CreateMiniDump(EXCEPTION_POINTERS* pep, const StringImpl& filePath)
{
// Open the file
// Open the file
typedef BOOL(*PDUMPFN)(
HANDLE hProcess,
DWORD ProcessId,
@ -587,7 +587,7 @@ static bool CreateMiniDump(EXCEPTION_POINTERS* pep, const StringImpl& filePath)
if ((hFile == NULL) || (hFile == INVALID_HANDLE_VALUE))
return false;
// Create the minidump
// Create the minidump
MINIDUMP_EXCEPTION_INFORMATION mdei;
@ -615,9 +615,9 @@ static bool CreateMiniDump(EXCEPTION_POINTERS* pep, const StringImpl& filePath)
BOOL rv = (*pFn)(GetCurrentProcess(), GetCurrentProcessId(),
hFile, mdt, (pep != 0) ? &mdei : 0, &user_stream_info, &mci);
// Close the file
CloseHandle(hFile);
// Close the file
CloseHandle(hFile);
return true;
}
@ -638,7 +638,7 @@ static String ImageHelpWalk(PCONTEXT theContext, int theSkipCount)
sf.AddrStack.Mode = AddrModeFlat;
sf.AddrFrame.Offset = theContext->Rbp;
sf.AddrFrame.Mode = AddrModeFlat;
#else
#else
sf.AddrPC.Offset = theContext->Eip;
sf.AddrPC.Mode = AddrModeFlat;
sf.AddrStack.Offset = theContext->Esp;
@ -676,7 +676,7 @@ static String ImageHelpWalk(PCONTEXT theContext, int theSkipCount)
//aDebugDump += aBuffer;
break;
}
if ((aLevelCount > 0) && ((sf.AddrFrame.Offset == 0) || (sf.AddrPC.Offset == 0)))
break;
@ -693,7 +693,7 @@ static String ImageHelpWalk(PCONTEXT theContext, int theSkipCount)
// Displacement of the input address, relative to the start of the symbol
#ifdef BF64
DWORD64 symDisplacement = 0;
DWORD64 symDisplacement = 0;
#else
DWORD symDisplacement = 0;
#endif
@ -706,7 +706,7 @@ static String ImageHelpWalk(PCONTEXT theContext, int theSkipCount)
GetLogicalAddress((PVOID)sf.AddrPC.Offset, szModule, sizeof(szModule), section, offset);
bool forceFail = false;
bool forceFail = false;
if ((gSymGetSymFromAddr(hProcess, sf.AddrPC.Offset, &symDisplacement, pSymbol)) && (!forceFail))
{
char aUDName[256];
@ -735,26 +735,26 @@ static String ImageHelpWalk(PCONTEXT theContext, int theSkipCount)
#else
IMAGEHLP_LINE lineInfo = { 0 };
lineInfo.SizeOfStruct = sizeof(IMAGEHLP_LINE);
#endif
#endif
if (gSymGetLineFromAddr(hProcess, sf.AddrPC.Offset, &displacement, &lineInfo))
{
{
aDebugDump += StrFormat(" at %s:%d\r\n", lineInfo.FileName, lineInfo.LineNumber);
}
}
else // No symbol found. Print out the logical address instead.
{
// ModuleInfo* moduleInfo = NULL;
// if (moduleInfoMap.TryAdd(szModule, NULL, &moduleInfo))
// {
//
//
// }
aDebugDump += StrFormat("%@ %@ %04X:%@ %s\r\n", sf.AddrFrame.Offset, sf.AddrPC.Offset, section, offset, GetFileName(szModule).c_str());
}
}
aDebugDump += StrFormat(" Params: %@ %@ %@ %@\r\n", sf.Params[0], sf.Params[1], sf.Params[2], sf.Params[3]);
aDebugDump += StrFormat(" Params: %@ %@ %@ %@\r\n", sf.Params[0], sf.Params[1], sf.Params[2], sf.Params[3]);
aDebugDump += "\r\n";
aLevelCount++;
@ -792,7 +792,7 @@ static String GetVersion(const StringImpl& fileName)
nFixedLength = 0;
LPSTR lpVersion = NULL;
void* lpFixedPointer;
TRANSARRAY* lpTransArray;
TRANSARRAY* lpTransArray;
GetFileVersionInfoA(fileName.c_str(),
dwReserved,
@ -850,7 +850,7 @@ static void DoHandleDebugEvent(LPEXCEPTION_POINTERS lpEP)
crashCatcher->mCrashed = true;
HMODULE hMod = GetModuleHandleA(NULL);
PIMAGE_DOS_HEADER pDosHdr = (PIMAGE_DOS_HEADER)hMod;
PIMAGE_NT_HEADERS pNtHdr = (PIMAGE_NT_HEADERS)((uint8*)hMod + pDosHdr->e_lfanew);
bool isCLI = pNtHdr->OptionalHeader.Subsystem == IMAGE_SUBSYSTEM_WINDOWS_CUI;
@ -858,7 +858,7 @@ static void DoHandleDebugEvent(LPEXCEPTION_POINTERS lpEP)
isCLI = false;
else if ((CrashCatcher::Get()->mCrashReportKind == BfpCrashReportKind_Console) || (CrashCatcher::Get()->mCrashReportKind == BfpCrashReportKind_PrintOnly))
isCLI = true;
bool hasImageHelp = LoadImageHelp();
String anErrorTitle;
@ -869,7 +869,7 @@ static void DoHandleDebugEvent(LPEXCEPTION_POINTERS lpEP)
if (isCLI)
aDebugDump += "**** FATAL APPLICATION ERROR ****\n";
for (auto func : CrashCatcher::Get()->mCrashInfoFuncs)
func();
@ -878,10 +878,10 @@ static void DoHandleDebugEvent(LPEXCEPTION_POINTERS lpEP)
crashInfo += "\nExecutable: ";
crashInfo += path;
crashInfo += "\r\n";
crashInfo += GetVersion(path);
crashInfo += GetVersion(path);
aDebugDump.Append(crashInfo);
for (int i = 0; i < (int)aDebugDump.length(); i++)
{
char c = aDebugDump[i];
@ -898,7 +898,7 @@ static void DoHandleDebugEvent(LPEXCEPTION_POINTERS lpEP)
}
// aDebugDump.Replace("\n", "\r\n");
// aDebugDump.Replace("\t", " ");
// aDebugDump.Replace("\t", " ");
if (!aDebugDump.IsEmpty())
{
@ -907,7 +907,7 @@ static void DoHandleDebugEvent(LPEXCEPTION_POINTERS lpEP)
aDebugDump += "\r\n";
}
WCHAR exeFilePathW[MAX_PATH];
exeFilePathW[0] = 0;
::GetModuleFileNameW(hMod, exeFilePathW, MAX_PATH);
@ -934,7 +934,7 @@ static void DoHandleDebugEvent(LPEXCEPTION_POINTERS lpEP)
}
///////////////////////////
// first name the exception
// first name the exception
char *szName = NULL;
for (int i = 0; gMsgTable[i].dwExceptionCode != 0xFFFFFFFF; i++)
{
@ -962,16 +962,16 @@ static void DoHandleDebugEvent(LPEXCEPTION_POINTERS lpEP)
// Get logical address of the module where exception occurs
uintptr section, offset;
GetLogicalAddress(lpEP->ExceptionRecord->ExceptionAddress, aBuffer, sizeof(aBuffer), section, offset);
aDebugDump += StrFormat("Logical Address: %04X:%@\r\n", section, offset);
aDebugDump += StrFormat("Logical Address: %04X:%@\r\n", section, offset);
aDebugDump += "\r\n";
anErrorTitle = StrFormat("Exception at %04X:%08X", section, offset);
String aWalkString;
if (hasImageHelp)
aWalkString = ImageHelpWalk(lpEP->ContextRecord, 0);
@ -992,10 +992,10 @@ static void DoHandleDebugEvent(LPEXCEPTION_POINTERS lpEP)
aDebugDump += StrFormat("Flags:%@\r\n", lpEP->ContextRecord->EFlags);
#else
aDebugDump += StrFormat("EAX:%08X EBX:%08X ECX:%08X EDX:%08X ESI:%08X EDI:%08X\r\n",
lpEP->ContextRecord->Eax, lpEP->ContextRecord->Ebx, lpEP->ContextRecord->Ecx, lpEP->ContextRecord->Edx, lpEP->ContextRecord->Esi, lpEP->ContextRecord->Edi);
aDebugDump += StrFormat("EIP:%08X ESP:%08X EBP:%08X\r\n", lpEP->ContextRecord->Eip, lpEP->ContextRecord->Esp, lpEP->ContextRecord->Ebp);
aDebugDump += StrFormat("CS:%04X SS:%04X DS:%04X ES:%04X FS:%04X GS:%04X\r\n", lpEP->ContextRecord->SegCs, lpEP->ContextRecord->SegSs, lpEP->ContextRecord->SegDs, lpEP->ContextRecord->SegEs, lpEP->ContextRecord->SegFs, lpEP->ContextRecord->SegGs);
aDebugDump += StrFormat("Flags:%08X\r\n", lpEP->ContextRecord->EFlags);
lpEP->ContextRecord->Eax, lpEP->ContextRecord->Ebx, lpEP->ContextRecord->Ecx, lpEP->ContextRecord->Edx, lpEP->ContextRecord->Esi, lpEP->ContextRecord->Edi);
aDebugDump += StrFormat("EIP:%08X ESP:%08X EBP:%08X\r\n", lpEP->ContextRecord->Eip, lpEP->ContextRecord->Esp, lpEP->ContextRecord->Ebp);
aDebugDump += StrFormat("CS:%04X SS:%04X DS:%04X ES:%04X FS:%04X GS:%04X\r\n", lpEP->ContextRecord->SegCs, lpEP->ContextRecord->SegSs, lpEP->ContextRecord->SegDs, lpEP->ContextRecord->SegEs, lpEP->ContextRecord->SegFs, lpEP->ContextRecord->SegGs);
aDebugDump += StrFormat("Flags:%08X\r\n", lpEP->ContextRecord->EFlags);
#endif
aDebugDump += "\r\n";
@ -1015,12 +1015,12 @@ static void DoHandleDebugEvent(LPEXCEPTION_POINTERS lpEP)
if (hasImageHelp)
GetSymbolsFromMapFile(aDebugDump);*/
if (isCLI)
{
{
aDebugDump += "\n";
//fwrite(aDebugDump.c_str(), 1, aDebugDump.length(), stderr);
//fflush(stderr);
//fwrite(aDebugDump.c_str(), 1, aDebugDump.length(), stderr);
//fflush(stderr);
DWORD bytesWritten;
::WriteFile(::GetStdHandle(STD_ERROR_HANDLE), aDebugDump.c_str(), (DWORD)aDebugDump.length(), &bytesWritten, NULL);
}
@ -1031,7 +1031,7 @@ static void DoHandleDebugEvent(LPEXCEPTION_POINTERS lpEP)
CrashCatcher::CrashCatcher()
{
mCrashed = false;
mInitialized = false;
mInitialized = false;
mExceptionPointers = NULL;
mPreviousFilter = NULL;
mDebugError = false;
@ -1040,11 +1040,11 @@ CrashCatcher::CrashCatcher()
}
static long __stdcall SEHFilter(LPEXCEPTION_POINTERS lpExceptPtr)
{
{
OutputDebugStrF("SEH Filter! CraskReportKind:%d\n", CrashCatcher::Get()->mCrashReportKind);
if (CrashCatcher::Get()->mCrashReportKind == BfpCrashReportKind_None)
{
{
OutputDebugStrF("Silent Exiting\n");
::TerminateProcess(GetCurrentProcess(), lpExceptPtr->ExceptionRecord->ExceptionCode);
}
@ -1059,17 +1059,17 @@ static long __stdcall SEHFilter(LPEXCEPTION_POINTERS lpExceptPtr)
//CreateMiniDump(lpExceptPtr);
DoHandleDebugEvent(lpExceptPtr);
}
//if (!gDebugError)
//SetErrorMode(SEM_NOGPFAULTERRORBOX);
//SetErrorMode(SEM_NOGPFAULTERRORBOX);
if (CrashCatcher::Get()->mCrashReportKind == BfpCrashReportKind_PrintOnly)
{
::TerminateProcess(GetCurrentProcess(), lpExceptPtr->ExceptionRecord->ExceptionCode);
}
//return EXCEPTION_CONTINUE_SEARCH;
return (CrashCatcher::Get()->mCloseRequested) ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH;
return (CrashCatcher::Get()->mCloseRequested) ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH;
}
//PVECTORED_EXCEPTION_HANDLER(
@ -1082,7 +1082,7 @@ static long __stdcall VectorExceptionHandler(LPEXCEPTION_POINTERS lpExceptPtr)
void CrashCatcher::Init()
{
{
if (mInitialized)
return;
@ -1105,7 +1105,7 @@ void CrashCatcher::Test()
}
__except (SEHFilter(GetExceptionInformation()))
{
}
}
@ -1125,7 +1125,7 @@ void CrashCatcher::AddInfo(const StringImpl& str)
}
void CrashCatcher::Crash(const StringImpl& str)
{
{
OutputDebugStrF("CrashCatcher::Crash\n");
mBfpCritSect.Lock();
@ -1148,17 +1148,17 @@ void CrashCatcher::Crash(const StringImpl& str)
// When we catch the exception information like this, it displays the dump correctly but
// the minidump doesn't contain a valid callstack, so we need to rely on SetUnhandledExceptionFilter
/*__try
{
{
::MessageBoxA(NULL, "A", "B", MB_ICONERROR);
__debugbreak();
__debugbreak();
}
__except (SEHFilter(GetExceptionInformation()))
{
}*/
for (auto func : CrashCatcher::Get()->mCrashInfoFuncs)
func();
func();
exit(1);
}
@ -1205,7 +1205,7 @@ CrashCatcher* CrashCatcher::Get()
{
if (sharedMem->mABIVersion == 0 && sharedMem->mBpManager == NULL && sharedMem->mCounter == 0)
{
sCrashCatcher = new CrashCatcher();
sCrashCatcher = new CrashCatcher();
sharedMem->mBpManager = sCrashCatcher;
sharedMem->mABIVersion = CRASHCATCH_ABI_VERSION;
sharedMem->mCounter = 1;
@ -1216,7 +1216,7 @@ CrashCatcher* CrashCatcher::Get()
sCrashCatcher = sharedMem->mBpManager;
}
::UnmapViewOfFile(sharedMem);
}
}
::CloseHandle(fileMapping);
}
else
@ -1227,7 +1227,7 @@ CrashCatcher* CrashCatcher::Get()
CrashCatchMemory* sharedMem = (CrashCatchMemory*)MapViewOfFile(fileMapping, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(CrashCatchMemory));
if (sharedMem != NULL)
{
sCrashCatcher = new CrashCatcher();
sCrashCatcher = new CrashCatcher();
sharedMem->mBpManager = sCrashCatcher;
sharedMem->mABIVersion = CRASHCATCH_ABI_VERSION;
sharedMem->mCounter = 1;
@ -1235,11 +1235,11 @@ CrashCatcher* CrashCatcher::Get()
::ReleaseMutex(mutex);
}
else
{
{
::CloseHandle(fileMapping);
::CloseHandle(mutex);
}
}
}
}
}

View file

@ -6,8 +6,8 @@ if(NOT CMAKE_BUILD_TYPE)
message(STATUS "Build type not specified: Use Debug by default.")
endif(NOT CMAKE_BUILD_TYPE)
add_subdirectory(extern/hunspell)
add_subdirectory(BeefRT)
add_subdirectory(BeefySysLib)
add_subdirectory(extern/hunspell)
add_subdirectory(IDEHelper)
add_subdirectory(BeefBoot)
add_subdirectory(BeefRT)

View file

@ -195,50 +195,91 @@ namespace IDE
gApp.GetProjectBuildDir(project, projectBuildDir);
File.WriteAll(scope $"{projectBuildDir}/ObjectArgs.txt", .((.)objectsArg.Ptr, objectsArg.Length)).IgnoreError();
String arCmds = scope String(""); //-O2 -Rpass=inline
String arCmds = null; //-O2 -Rpass=inline
//(doClangCPP ? "-lc++abi " : "") +
arCmds.AppendF("CREATE {}\n", targetPath);
String arArgs = scope .();
void AddObject(StringView obj)
bool useArCmds = false;
if (useArCmds)
{
if (obj.IsEmpty)
return;
arCmds = scope:: String("");
arCmds.AppendF("CREATE {}\n", targetPath);
if (obj.EndsWith(".lib", .OrdinalIgnoreCase))
arCmds.AppendF("ADDLIB {}\n", obj);
else
arCmds.AppendF("ADDMOD {}\n", obj);
}
bool inQuote = false;
int lastEnd = -1;
for (int i < objectsArg.Length)
{
var c = objectsArg[i];
if (c == '"')
void AddObject(StringView obj)
{
if (inQuote)
if (obj.IsEmpty)
return;
if (obj.EndsWith(".lib", .OrdinalIgnoreCase))
arCmds.AppendF("ADDLIB {}\n", obj);
else
arCmds.AppendF("ADDMOD {}\n", obj);
}
bool inQuote = false;
int lastEnd = -1;
for (int i < objectsArg.Length)
{
var c = objectsArg[i];
if (c == '"')
{
if (inQuote)
AddObject(objectsArg.Substring(lastEnd + 1, i - lastEnd - 1));
inQuote = !inQuote;
lastEnd = i;
}
else if ((c == ' ') && (!inQuote))
{
AddObject(objectsArg.Substring(lastEnd + 1, i - lastEnd - 1));
inQuote = !inQuote;
lastEnd = i;
lastEnd = i;
}
}
else if ((c == ' ') && (!inQuote))
{
AddObject(objectsArg.Substring(lastEnd + 1, i - lastEnd - 1));
lastEnd = i;
}
}
AddObject(objectsArg.Substring(lastEnd + 1));
AddObject(objectsArg.Substring(lastEnd + 1));
for (let obj in objectsArg.Split(' '))
{
if (!obj.IsEmpty)
for (let obj in objectsArg.Split(' '))
{
if (!obj.IsEmpty)
{
}
}
arCmds.AppendF("SAVE\n");
}
else
{
arArgs.AppendF($"-qc {targetPath}");
void AddObject(StringView obj)
{
if (obj.IsEmpty)
return;
arArgs.Append(" ");
arArgs.Append(obj);
}
bool inQuote = false;
int lastEnd = -1;
for (int i < objectsArg.Length)
{
var c = objectsArg[i];
if (c == '"')
{
if (inQuote)
AddObject(objectsArg.Substring(lastEnd + 1, i - lastEnd - 1));
inQuote = !inQuote;
lastEnd = i;
}
else if ((c == ' ') && (!inQuote))
{
AddObject(objectsArg.Substring(lastEnd + 1, i - lastEnd - 1));
lastEnd = i;
}
}
AddObject(objectsArg.Substring(lastEnd + 1));
}
arCmds.AppendF("SAVE\n");
UpdateCacheStr(project, "", workspaceOptions, options, null, null);
@ -275,13 +316,15 @@ namespace IDE
return false;
}
String cmdLine = scope .();
cmdLine.AppendF("-M");
var runCmd = gApp.QueueRun(arPath, cmdLine, workingDir, .UTF8);
if (arCmds != null)
arArgs.Append("-M");
var runCmd = gApp.QueueRun(arPath, arArgs, workingDir, .UTF8);
runCmd.mReference = new String(project.mProjectName);
runCmd.mOnlyIfNotFailed = true;
runCmd.mStdInData = new .(arCmds);
if (arCmds != null)
runCmd.mStdInData = new .(arCmds);
var tagetCompletedCmd = new IDEApp.TargetCompletedCmd(project);
tagetCompletedCmd.mOnlyIfNotFailed = true;
gApp.mExecutionQueue.Add(tagetCompletedCmd);

View file

@ -827,7 +827,7 @@ namespace IDE
mExecutionPaused = false;
}
base.Shutdown();
base.Shutdown();
}
public override void Run()
@ -8547,14 +8547,14 @@ namespace IDE
if (executionInstance.mProcess.AttachStandardInput(fileStream) case .Err)
return;
while (!executionInstance.mStdInData.IsEmpty)
WriteLoop: while (!executionInstance.mStdInData.IsEmpty)
{
switch (fileStream.TryWrite(.((.)executionInstance.mStdInData.Ptr, executionInstance.mStdInData.Length)))
{
case .Ok(int len):
executionInstance.mStdInData.Remove(0, len);
case .Err:
break;
break WriteLoop;
}
}
}
@ -8712,6 +8712,8 @@ namespace IDE
if ((mVerbosity >= .Diagnostic) && (useArgsFile != .None))
OutputLine("Arg file contents: {0}", args);
if ((mVerbosity >= .Diagnostic) && (stdInData != null))
OutputLine("StdIn data: {0}", stdInData);
}
else
OutputLine("Executing: {0}", showArgs);

View file

@ -13,7 +13,7 @@ using Beefy.theme;
using IDE.Debugger;
namespace IDE.ui
{
{
public class HoverWatch : Widget, IWatchOwner
{
public class PendingWatch
@ -25,7 +25,7 @@ namespace IDE.ui
public ~this()
{
}
}
@ -38,7 +38,7 @@ namespace IDE.ui
public HoverListView mChildrenListView;
static int32 sHLVItemId = -1;
int32 mHLVItemId = ++sHLVItemId;
int32 mHLVItemId = ++sHLVItemId;
public this(IWatchOwner watchOwner, HoverListView listView) : base(watchOwner, listView)
{
@ -77,7 +77,7 @@ namespace IDE.ui
if (mWatchEntry.mResultTypeStr != null)
DarkTooltipManager.ShowTooltip(mWatchEntry.mResultTypeStr, this, LabelX + GS!(8), mSelfHeight + mBottomPadding);
return;
}
}
base.ShowTooltip(mouseX, mouseY);
}
@ -128,7 +128,7 @@ namespace IDE.ui
}
}
public class HoverListView : WatchListView
public class HoverListView : WatchListView
{
public HoverWatch mHoverWatch;
public bool mSizeDirty;
@ -168,7 +168,7 @@ namespace IDE.ui
public override void Draw(Graphics g)
{
base.Draw(g);
}
@ -185,7 +185,7 @@ namespace IDE.ui
}
public override void Update()
{
{
base.Update();
if (mSizeDirty)
@ -220,7 +220,7 @@ namespace IDE.ui
Resize(mX, mY, listView.mColumns[1].mWidth - adjust, mHeight);
HorzScrollTo(0);
}
}
}
class ContentWidget : Widget
{
@ -317,7 +317,7 @@ namespace IDE.ui
}
void IWatchOwner.UpdateWatch(WatchListViewItem watchEntry)
{
{
}
public void Clear()
@ -364,7 +364,7 @@ namespace IDE.ui
mWidgetWindow = null;
}
Widget.RemoveAndDelete(mEditWidget);
mEditWidget = null;
@ -398,13 +398,13 @@ namespace IDE.ui
if (mCloseHandler != null)
mCloseHandler();
Clear();
Clear();
if (!mCreatedWindow)
delete this;
}
void HandleMouseWheel(MouseEvent evt)
void HandleMouseWheel(MouseEvent evt)
{
if (mListViews.Count > 1)
{
@ -470,7 +470,7 @@ namespace IDE.ui
}
}
}
if (mCloseDelay > 1)
mCloseDelay--;
if (mCloseCountdown > 0)
@ -514,8 +514,8 @@ namespace IDE.ui
var beforeLastListView = mChildWidgets[mChildWidgets.Count - 2] as HoverListView;
if (beforeLastListView != null)
{
if (mEditWidget != null)
mEditWidget.LostFocus();
if (mEditWidget != null)
mEditWidget.LostFocus();
CloseChildren(beforeLastListView);
}
}
@ -526,11 +526,11 @@ namespace IDE.ui
{
base.MouseMove(x, y);
}
void CloseChildren(HoverListView hoverListView)
{
{
for (HoverListViewItem childItem in hoverListView.GetRoot().mChildItems)
{
var childrenListView = childItem.mChildrenListView;
@ -539,14 +539,14 @@ namespace IDE.ui
CloseChildren(childrenListView);
mListViews.Remove(childrenListView);
childrenListView.RemoveSelf();
childItem.mChildrenListView = null;
childItem.mChildrenListView = null;
if (childItem.mOpenButton != null)
childItem.mOpenButton.mIsOpen = false;
//delete childrenListView;
gApp.DeferDelete(childrenListView);
}
}
}
}
void OpenButtonClicked(HoverListViewItem listViewItem)
@ -572,7 +572,7 @@ namespace IDE.ui
childrenListView.mParentHoverListViewItem = listViewItem;
mContentWidget.AddWidget(childrenListView);
mListViews.Add(childrenListView);
listViewItem.mChildrenListView = childrenListView;
listViewItem.mChildrenListView = childrenListView;
for (var pendingEntry in listViewItem.mPendingWatches)
{
var watchListViewItem = DoListViewItem(listViewItem.mChildrenListView, null, pendingEntry.mName, pendingEntry.mEvalStr, false, listViewItem.mWatchEntry);
@ -709,10 +709,10 @@ namespace IDE.ui
HoverListViewItem valueSubItem = null;
var useListViewItem = listViewItem;
if (useListViewItem == null)
if (useListViewItem == null)
useListViewItem = (HoverListViewItem)listView.GetRoot().CreateChildItem();
if (useListViewItem.mWatchEntry == null)
if (useListViewItem.mWatchEntry == null)
{
useListViewItem.mWatchEntry = new WatchEntry();
valueSubItem = (HoverListViewItem)useListViewItem.CreateSubItem(1);
@ -724,7 +724,7 @@ namespace IDE.ui
}
bool isLiteral = displayString.StartsWith("'") || displayString.StartsWith("\"");
var watch = useListViewItem.mWatchEntry;
String.NewOrSet!(watch.mName, displayString);
String.NewOrSet!(watch.mEvalStr, evalString);
@ -819,12 +819,12 @@ namespace IDE.ui
valueSubItem.Label = "";
}
else if (valueSubItem.mLabel.StartsWith("!", StringComparison.Ordinal))
{
{
var errorVals = scope List<StringView>(scope String(valueSubItem.mLabel, 1).Split('\t'));
if (errorVals.Count > 1)
{
{
String.NewOrSet!(valueSubItem.mLabel, errorVals[2]);
}
}
else
String.NewOrSet!(valueSubItem.mLabel, errorVals[0]);
valueSubItem.mFailed = true;
@ -834,7 +834,7 @@ namespace IDE.ui
if ((vals.Count > 1) && (!vals[1].IsEmpty))
String.NewOrSet!(watch.mResultTypeStr, vals[1]);
else
else
DeleteAndNullify!(watch.mResultTypeStr);
int cmdStringCount = Math.Max(0, vals.Count - 2);
@ -876,7 +876,7 @@ namespace IDE.ui
String.NewOrSet!(watch.mEditInitialize, scope String(memberVals[1]));
}
else if (memberVals0 == ":editVal")
{
{
String.NewOrSet!(watch.mEditInitialize, scope String(memberVals[1]));
}
else if (memberVals0 == ":break")
@ -949,7 +949,7 @@ namespace IDE.ui
if (int32.Parse(memberVals[1]) case .Ok(out language))
{
watch.mLanguage = (.)language;
}
}
}
else if (memberVals0 == ":warn")
{
@ -963,7 +963,7 @@ namespace IDE.ui
}
if (memberVals.Count >= 2)
{
{
if (useListViewItem.mOpenButton == null)
{
useListViewItem.MakeParent();
@ -998,11 +998,11 @@ namespace IDE.ui
}
if ((memberCount == 0) && (useListViewItem.mOpenButton != null))
{
{
Widget.RemoveAndDelete(useListViewItem.mOpenButton);
useListViewItem.mOpenButton = null;
delete useListViewItem.mChildItems;
useListViewItem.mChildItems = null;
useListViewItem.mChildItems = null;
}
//if (valueSubItem.mFailed)
//return null;
@ -1010,7 +1010,7 @@ namespace IDE.ui
}
HoverListView CreateListView()
{
{
//var font = DarkTheme.sDarkTheme.mSmallFont;
var listView = new HoverListView(this);
@ -1018,18 +1018,18 @@ namespace IDE.ui
listView.mHoverWatch = this;
listView.SetShowHeader(false);
listView.mShowColumnGrid = true;
listView.mShowColumnGrid = true;
#unwarn
var nameColumn = listView.AddColumn(100, "Name");
#unwarn
var valueColumn = listView.AddColumn(100, "Value");
return listView;
}
int32 mResizeCount = 0;
Widget GetParentWidget()
{
Widget parentWidget = null;
@ -1118,7 +1118,7 @@ namespace IDE.ui
var font = DarkTheme.sDarkTheme.mSmallFont;
float nameWidth = 0;
float valueWidth = 0;
float valueWidth = 0;
bool hadMembers = false;
@ -1151,7 +1151,7 @@ namespace IDE.ui
if (listViewItem.mWatchRefreshButton != null)
thisNameWidth += GS!(18);
nameWidth = Math.Max(nameWidth, thisNameWidth);
float addHeight = nameHeight - listView.mFont.GetLineSpacing();
childHeights += addHeight;
listViewItem.mSelfHeight += addHeight;
@ -1172,7 +1172,7 @@ namespace IDE.ui
if (listViewItem.mWatchEntry.mResultType != WatchResultType.None)
hasLeftIcon = true;
}
if (!hadMembers)
listView.mLabelX -= GS!(14);
if (!hasRightValues)
@ -1191,7 +1191,7 @@ namespace IDE.ui
float height = childHeights + GS!(6);
float maxHeight = font.GetLineSpacing() * 12 + 6.001f;
if (height > maxHeight)
if (height > maxHeight)
{
if (listView.mVertScrollbar == null)
{
@ -1387,17 +1387,17 @@ namespace IDE.ui
else
width = listView.mWidth - x - GS!(4);
//editWidget.Resize(x - GS!(1), y - GS!(2), width, GS!(24));
editWidget.ResizeAround(x, y, width);
listView.AddWidget(editWidget);
editWidget.mOnLostFocus.Add(new => HandleEditLostFocus);
editWidget.mOnSubmit.Add(new => HandleRenameSubmit);
editWidget.mOnCancel.Add(new => HandleRenameCancel);
WidgetWindow.sOnMouseWheel.Add(new => HandleMouseWheel);
editWidget.SetFocus();
mActionIdx++;
}
@ -1446,7 +1446,7 @@ namespace IDE.ui
flags |= DebugManager.EvalExpressionFlags.DeselectCallStackIdx;
flags |= .AllowCalls | .AllowSideEffects;
gApp.DebugEvaluate(null, evalStr, val, -1, headListViewItem.mWatchEntry.mLanguage, flags);
//IDEApp.sApp.OutputLine(val);
//IDEApp.sApp.OutputLine(val);
if (val.StartsWith("!", StringComparison.Ordinal))
{
@ -1469,7 +1469,7 @@ namespace IDE.ui
IDEApp.sApp.MemoryEdited();
}
editWidget.RemoveSelf();
editWidget.RemoveSelf();
BFApp.sApp.DeferDelete(editWidget);
mEditWidget = null;
mEditingItem = null;
@ -1480,7 +1480,7 @@ namespace IDE.ui
var childListView = childWidget as HoverListView;
RefreshListView(childListView);
}
mEditLostFocusTick = mUpdateCnt;
FinishListView(listView, listView.mX, listView.mY);
@ -1513,7 +1513,7 @@ namespace IDE.ui
if (theEvent.mBtn == 0)
{
//PropertyEntry aPropertyEntry = mPropertyEntryMap[item];
//EditValue(aPropertyEntry);
//EditValue(aPropertyEntry);
EditListViewItem(item);
}
else if (theEvent.mBtn == 1)
@ -1522,7 +1522,7 @@ namespace IDE.ui
clickedItem.SelfToOtherTranslate(clickedItem.mListView.GetRoot(), theEvent.mX, theEvent.mY, out aX, out aY);
ShowRightClickMenu(item, aX, aY);
}
theEvent.mHandled = true;
}
@ -1570,7 +1570,7 @@ namespace IDE.ui
mDisplayString.Append('\n');
mDisplayString.Append(useStr);
}
Rehup();
return true;
}
@ -1599,8 +1599,8 @@ namespace IDE.ui
mTextPanel = textPanel;
mTextPanel.mOnRemovedFromParent.Add(new => PanelRemovedFromParent);
if (mTextPanel.mHoverWatch != null)
Debug.Assert(mTextPanel.mHoverWatch == this);
if (mTextPanel.mHoverWatch != null)
Debug.Assert(mTextPanel.mHoverWatch == this);
mTextPanel.mHoverWatch = this;
if (displayString == null)
mDisplayString.Clear();
@ -1615,7 +1615,7 @@ namespace IDE.ui
mOrigY = y;
Widget parentWidget = GetParentWidget();
//var parentWidget = textPanel.EditWidget.Content;
if (evalString != null)
@ -1664,7 +1664,7 @@ namespace IDE.ui
(int)screenWidth, (int)screenHeight,
windowFlags,
this);
WidgetWindow.sMouseDownHandler.Add(new => HandleMouseDown);
WidgetWindow.sMouseWheelDelegate.Add(new => HandleMouseWheel);
WidgetWindow.sMenuItemSelectedDelegate.Add(new => HandleSysMenuItemSelected);
@ -1695,9 +1695,9 @@ namespace IDE.ui
openYList.Add(openY);
}
var sourceViewPanel = mTextPanel;
var sourceViewPanel = mTextPanel;
var widgetWindow = mWidgetWindow;
Close();
Close();
if (widgetWindow != null)
widgetWindow.mRootWidget = null; // Detach root
//Debug.WriteLine("Hoverwatch showing");
@ -1726,7 +1726,7 @@ namespace IDE.ui
OpenButtonClicked(hoverListViewItem);
break;
}
}
}
}
mRehupEvent();

View file

@ -523,7 +523,7 @@ namespace Tests
iSer.Serialize(serCtx);
Test.Assert(serCtx.mStr == "x 10\ny 2\n");
Test.Assert(cTest0 == "Test\n0");
Test.Assert(cTest0 == "Test\n0" || cTest0 == "Test\r\n0");
Test.Assert(cTest1 == "AAAAAAAAAAAA");
Test.Assert((Object)cTest1 == (Object)"AAAAAAAAAAAA");
Test.Assert((cTest0Binary[0] == (.)'T') && ((cTest0Binary.Count == 6) || (cTest0Binary.Count == 7)));

View file

@ -7,10 +7,25 @@ ROOTPATH="$(dirname "$SCRIPTPATH")"
echo Building from $SCRIPTPATH
cd $SCRIPTPATH
if [[ $1 == "clean" ]]; then
rm -rf ../jbuild
rm -rf ../jbuild_d
fi
for i in "$@"
do
if [[ $i == "clean" ]]; then
echo "Cleaning..."
rm -rf ../jbuild
rm -rf ../jbuild_d
exit
fi
if [[ $i == "sdl" ]]; then
echo "Using SDL"
USE_SDL="-DBF_ENABLE_SDL=1"
fi
if [[ $i == "no_ffi" ]]; then
echo "Disabling FFI"
USE_FFI="-DBF_DISABLE_FFI=1"
fi
done
if command -v ninja >/dev/null 2>&1 ; then
CAN_USE_NINJA=1
@ -55,11 +70,15 @@ if [ ! -d jbuild_d ]; then
mkdir jbuild_d
mkdir jbuild
fi
cd jbuild_d
cmake $USE_NINJA -DCMAKE_BUILD_TYPE=Debug ../
echo cmake $USE_NINJA $USE_SDL -DCMAKE_BUILD_TYPE=Debug ../
cmake $USE_NINJA $USE_SDL $USE_FFI -DCMAKE_BUILD_TYPE=Debug ../
cmake --build .
cd ../jbuild
cmake $USE_NINJA -DCMAKE_BUILD_TYPE=RelWithDebInfo ../
cmake $USE_NINJA $USE_SDL $USE_FFI -DCMAKE_BUILD_TYPE=RelWithDebInfo ../
cmake --build .
cd ../IDE/dist

66
bin/build_sdl.sh Normal file
View file

@ -0,0 +1,66 @@
#!/bin/bash
echo Starting build.sh
PATH=/usr/local/bin:$PATH:$HOME/bin
SCRIPTPATH=$(cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)
ROOTPATH="$(dirname "$SCRIPTPATH")"
echo Building from $SCRIPTPATH
cd $SCRIPTPATH
if [[ $1 == "clean" ]]; then
rm -rf ../jbuild_sdl
rm -rf ../jbuild_sdl_d
exit
fi
if [[ $1 == "sdl" ]]; then
echo "Using SDL"
USE_SDL="-DBF_ENABLE_SDL=1"
fi
if command -v ninja >/dev/null 2>&1 ; then
CAN_USE_NINJA=1
if [ -d ../jbuild_sdl_d ] && [ ! -f ../jbuild_sdl_d/build.ninja ]; then
CAN_USE_NINJA=0
fi
if [ $CAN_USE_NINJA == 1 ]; then
echo "Ninja is enabled for this build."
USE_NINJA="-GNinja"
else
echo "Ninja couldn't be enabled for this build, consider doing a clean build to start using Ninja for faster build speeds."
fi
else
echo "Ninja isn't installed, consider installing it for faster build speeds."
fi
# exit when any command fails
set -e
### Dependencies ###
if [ ! -f ../BeefySysLib/third_party/libffi/Makefile ]; then
echo Building libffi...
cd ../BeefySysLib/third_party/libffi
./configure
make
cd $SCRIPTPATH
fi
### LIBS ###
cd ..
if [ ! -d jbuild_sdl_d ]; then
mkdir jbuild_sdl_d
mkdir jbuild_sdl
fi
cd jbuild_sdl_d
echo cmake $USE_NINJA $USE_SDL -DCMAKE_BUILD_TYPE=Debug ../
cmake $USE_NINJA -DBF_ENABLE_SDL=1 -DCMAKE_BUILD_TYPE=Debug ../
cmake --build .
cd ../jbuild_sdl
cmake $USE_NINJA -DBF_ENABLE_SDL=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo ../
cmake --build .