mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-09-13 09:35:23 -04:00
try to simplify some of the if/elif mess in Platform.c
This commit is contained in:
parent
01572ae7af
commit
9dec053521
@ -316,7 +316,7 @@ void Logger_Backtrace(String* trace, void* ctx) {
|
|||||||
String_AppendConst(trace, _NL);
|
String_AppendConst(trace, _NL);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif /* CC_BUILD_POSIX */
|
||||||
static void Logger_DumpBacktrace(String* str, void* ctx) {
|
static void Logger_DumpBacktrace(String* str, void* ctx) {
|
||||||
static const String backtrace = String_FromConst("-- backtrace --" _NL);
|
static const String backtrace = String_FromConst("-- backtrace --" _NL);
|
||||||
Logger_Log(&backtrace);
|
Logger_Log(&backtrace);
|
||||||
|
221
src/Platform.c
221
src/Platform.c
@ -68,26 +68,19 @@ const cc_result ReturnCode_SocketInProgess = EINPROGRESS;
|
|||||||
const cc_result ReturnCode_SocketWouldBlock = EWOULDBLOCK;
|
const cc_result ReturnCode_SocketWouldBlock = EWOULDBLOCK;
|
||||||
#endif
|
#endif
|
||||||
/* Platform specific include files (Try to share for UNIX-ish) */
|
/* Platform specific include files (Try to share for UNIX-ish) */
|
||||||
#if defined CC_BUILD_LINUX
|
#if defined CC_BUILD_OSX
|
||||||
#define CC_BUILD_UNIX
|
|
||||||
#elif defined CC_BUILD_OSX
|
|
||||||
#include <mach/mach_time.h>
|
#include <mach/mach_time.h>
|
||||||
#include <mach-o/dyld.h>
|
#include <mach-o/dyld.h>
|
||||||
#include <ApplicationServices/ApplicationServices.h>
|
#include <ApplicationServices/ApplicationServices.h>
|
||||||
#elif defined CC_BUILD_SOLARIS
|
#elif defined CC_BUILD_SOLARIS
|
||||||
#define CC_BUILD_UNIX
|
|
||||||
#include <sys/filio.h>
|
#include <sys/filio.h>
|
||||||
#elif defined CC_BUILD_FREEBSD
|
#elif defined CC_BUILD_FREEBSD
|
||||||
#define CC_BUILD_UNIX
|
|
||||||
#include <sys/sysctl.h>
|
#include <sys/sysctl.h>
|
||||||
#elif defined CC_BUILD_OPENBSD
|
#elif defined CC_BUILD_OPENBSD
|
||||||
#define CC_BUILD_UNIX
|
|
||||||
#include <sys/sysctl.h>
|
#include <sys/sysctl.h>
|
||||||
#elif defined CC_BUILD_NETBSD
|
#elif defined CC_BUILD_NETBSD
|
||||||
#define CC_BUILD_UNIX
|
|
||||||
#include <sys/sysctl.h>
|
#include <sys/sysctl.h>
|
||||||
#elif defined CC_BUILD_HAIKU
|
#elif defined CC_BUILD_HAIKU
|
||||||
#define CC_BUILD_UNIX
|
|
||||||
/* TODO: Use open instead of xdg-open */
|
/* TODO: Use open instead of xdg-open */
|
||||||
/* TODO: Use load_image/resume_thread instead of fork */
|
/* TODO: Use load_image/resume_thread instead of fork */
|
||||||
/* Otherwise opening browser never works because fork fails */
|
/* Otherwise opening browser never works because fork fails */
|
||||||
@ -832,16 +825,16 @@ void Platform_LoadSysFonts(void) {
|
|||||||
static const String dirs[1] = {
|
static const String dirs[1] = {
|
||||||
String_FromConst("/system/data/fonts")
|
String_FromConst("/system/data/fonts")
|
||||||
};
|
};
|
||||||
#elif defined CC_BUILD_UNIX
|
|
||||||
static const String dirs[2] = {
|
|
||||||
String_FromConst("/usr/share/fonts"),
|
|
||||||
String_FromConst("/usr/local/share/fonts")
|
|
||||||
};
|
|
||||||
#elif defined CC_BUILD_OSX
|
#elif defined CC_BUILD_OSX
|
||||||
static const String dirs[2] = {
|
static const String dirs[2] = {
|
||||||
String_FromConst("/System/Library/Fonts"),
|
String_FromConst("/System/Library/Fonts"),
|
||||||
String_FromConst("/Library/Fonts")
|
String_FromConst("/Library/Fonts")
|
||||||
};
|
};
|
||||||
|
#elif defined CC_BUILD_POSIX
|
||||||
|
static const String dirs[2] = {
|
||||||
|
String_FromConst("/usr/share/fonts"),
|
||||||
|
String_FromConst("/usr/local/share/fonts")
|
||||||
|
};
|
||||||
#endif
|
#endif
|
||||||
for (i = 0; i < Array_Elems(dirs); i++) {
|
for (i = 0; i < Array_Elems(dirs); i++) {
|
||||||
Directory_Enum(&dirs[i], NULL, FontDirCallback);
|
Directory_Enum(&dirs[i], NULL, FontDirCallback);
|
||||||
@ -1114,7 +1107,7 @@ cc_result Process_StartGame(const String* args) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Process_Exit(cc_result code) { exit(code); }
|
void Process_Exit(cc_result code) { exit(code); }
|
||||||
#endif
|
|
||||||
/* Opening browser and starting shell is not really standardised */
|
/* Opening browser and starting shell is not really standardised */
|
||||||
#if defined CC_BUILD_OSX
|
#if defined CC_BUILD_OSX
|
||||||
void Process_StartOpen(const String* args) {
|
void Process_StartOpen(const String* args) {
|
||||||
@ -1128,7 +1121,7 @@ void Process_StartOpen(const String* args) {
|
|||||||
LSOpenCFURLRef(urlCF, NULL);
|
LSOpenCFURLRef(urlCF, NULL);
|
||||||
CFRelease(urlCF);
|
CFRelease(urlCF);
|
||||||
}
|
}
|
||||||
#elif defined CC_BUILD_UNIX
|
#else
|
||||||
void Process_StartOpen(const String* args) {
|
void Process_StartOpen(const String* args) {
|
||||||
/* TODO: Can this be used on original Solaris, or is it just an OpenIndiana thing */
|
/* TODO: Can this be used on original Solaris, or is it just an OpenIndiana thing */
|
||||||
char str[NATIVE_STR_LEN];
|
char str[NATIVE_STR_LEN];
|
||||||
@ -1139,6 +1132,7 @@ void Process_StartOpen(const String* args) {
|
|||||||
Process_RawStart("xdg-open", cmd);
|
Process_RawStart("xdg-open", cmd);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Retrieving exe path is completely OS dependant */
|
/* Retrieving exe path is completely OS dependant */
|
||||||
#if defined CC_BUILD_OSX
|
#if defined CC_BUILD_OSX
|
||||||
static cc_result Process_RawGetExePath(char* path, int* len) {
|
static cc_result Process_RawGetExePath(char* path, int* len) {
|
||||||
@ -1217,6 +1211,7 @@ static cc_result Process_RawGetExePath(char* path, int* len) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#endif /* CC_BUILD_POSIX */
|
||||||
|
|
||||||
|
|
||||||
/*########################################################################################################################*
|
/*########################################################################################################################*
|
||||||
@ -1633,10 +1628,7 @@ cc_bool Platform_DescribeError(cc_result res, String* dst) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#if defined CC_BUILD_OSX
|
||||||
#if defined CC_BUILD_UNIX
|
|
||||||
void Platform_Init(void) { Platform_InitPosix(); }
|
|
||||||
#elif defined CC_BUILD_OSX
|
|
||||||
static void Platform_InitStopwatch(void) {
|
static void Platform_InitStopwatch(void) {
|
||||||
mach_timebase_info_data_t tb = { 0 };
|
mach_timebase_info_data_t tb = { 0 };
|
||||||
mach_timebase_info(&tb);
|
mach_timebase_info(&tb);
|
||||||
@ -1661,117 +1653,22 @@ void Platform_Init(void) {
|
|||||||
void Platform_Init(void) {
|
void Platform_Init(void) {
|
||||||
char tmp[64+1] = { 0 };
|
char tmp[64+1] = { 0 };
|
||||||
EM_ASM( Module['websocket']['subprotocol'] = 'ClassiCube'; );
|
EM_ASM( Module['websocket']['subprotocol'] = 'ClassiCube'; );
|
||||||
|
/* Check if an error occurred when pre-loading IndexedDB */
|
||||||
/* Check if an error when pre-loading indexed DB */
|
|
||||||
EM_ASM_({ if (window.cc_idbErr) stringToUTF8(window.cc_idbErr, $0, 64); }, tmp);
|
EM_ASM_({ if (window.cc_idbErr) stringToUTF8(window.cc_idbErr, $0, 64); }, tmp);
|
||||||
|
|
||||||
if (!tmp[0]) return;
|
if (!tmp[0]) return;
|
||||||
Chat_Add1("&cError preloading IndexedDB: %c", tmp);
|
Chat_Add1("&cError preloading IndexedDB: %c", tmp);
|
||||||
Chat_AddRaw("&cPreviously saved settings/maps will be lost");
|
Chat_AddRaw("&cPreviously saved settings/maps will be lost");
|
||||||
|
|
||||||
/* NOTE: You must load IndexedDB before main() */
|
/* NOTE: You must pre-load IndexedDB before main() */
|
||||||
/* (because the callback to FS.synfc is asynchronous) */
|
/* (because pre-loading only works asynchronously) */
|
||||||
/* If you don't, you'll get errors later trying to sync local to remote */
|
/* If you don't, you'll get errors later trying to sync local to remote */
|
||||||
|
/* See doc/hosting-webclient.md for example preloading IndexedDB code */
|
||||||
/*
|
|
||||||
function preloadIndexedDB() {
|
|
||||||
addRunDependency('load-idb');
|
|
||||||
FS.mkdir('/classicube');
|
|
||||||
FS.mount(IDBFS, {}, '/classicube');
|
|
||||||
FS.syncfs(true, function(err) {
|
|
||||||
if (err) window.cc_idbErr = err;
|
|
||||||
removeRunDependency('load-idb');
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
var Module = {
|
|
||||||
preRun: [ preloadIndexedDB ],
|
|
||||||
......
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
#elif defined CC_BUILD_ANDROID
|
|
||||||
jclass App_Class;
|
|
||||||
jobject App_Instance;
|
|
||||||
JavaVM* VM_Ptr;
|
|
||||||
void Platform_Init(void) { Platform_InitPosix(); }
|
void Platform_Init(void) { Platform_InitPosix(); }
|
||||||
|
|
||||||
/* JNI helpers */
|
|
||||||
String JavaGetString(JNIEnv* env, jstring str) {
|
|
||||||
String dst;
|
|
||||||
dst.buffer = (*env)->GetStringUTFChars(env, str, NULL);
|
|
||||||
dst.length = (*env)->GetStringUTFLength(env, str);
|
|
||||||
dst.capacity = dst.length;
|
|
||||||
return dst;
|
|
||||||
}
|
|
||||||
|
|
||||||
jobject JavaMakeString(JNIEnv* env, const String* str) {
|
|
||||||
cc_uint8 tmp[2048 + 4];
|
|
||||||
cc_uint8* cur;
|
|
||||||
int i, len = 0;
|
|
||||||
|
|
||||||
for (i = 0; i < str->length && len < 2048; i++) {
|
|
||||||
cur = tmp + len;
|
|
||||||
len += Convert_CP437ToUtf8(str->buffer[i], cur);
|
|
||||||
}
|
|
||||||
tmp[len] = '\0';
|
|
||||||
return (*env)->NewStringUTF(env, (const char*)tmp);
|
|
||||||
}
|
|
||||||
|
|
||||||
jbyteArray JavaMakeBytes(JNIEnv* env, const cc_uint8* src, cc_uint32 len) {
|
|
||||||
if (!len) return NULL;
|
|
||||||
jbyteArray arr = (*env)->NewByteArray(env, len);
|
|
||||||
(*env)->SetByteArrayRegion(env, arr, 0, len, src);
|
|
||||||
return arr;
|
|
||||||
}
|
|
||||||
|
|
||||||
void JavaCallVoid(JNIEnv* env, const char* name, const char* sig, jvalue* args) {
|
|
||||||
jmethodID method = (*env)->GetMethodID(env, App_Class, name, sig);
|
|
||||||
(*env)->CallVoidMethodA(env, App_Instance, method, args);
|
|
||||||
}
|
|
||||||
|
|
||||||
jint JavaCallInt(JNIEnv* env, const char* name, const char* sig, jvalue* args) {
|
|
||||||
jmethodID method = (*env)->GetMethodID(env, App_Class, name, sig);
|
|
||||||
return (*env)->CallIntMethodA(env, App_Instance, method, args);
|
|
||||||
}
|
|
||||||
|
|
||||||
jfloat JavaCallFloat(JNIEnv* env, const char* name, const char* sig, jvalue* args) {
|
|
||||||
jmethodID method = (*env)->GetMethodID(env, App_Class, name, sig);
|
|
||||||
return (*env)->CallFloatMethodA(env, App_Instance, method, args);
|
|
||||||
}
|
|
||||||
|
|
||||||
jobject JavaCallObject(JNIEnv* env, const char* name, const char* sig, jvalue* args) {
|
|
||||||
jmethodID method = (*env)->GetMethodID(env, App_Class, name, sig);
|
|
||||||
return (*env)->CallObjectMethodA(env, App_Instance, method, args);
|
|
||||||
}
|
|
||||||
|
|
||||||
void JavaCall_String_Void(const char* name, const String* value) {
|
|
||||||
JNIEnv* env;
|
|
||||||
jvalue args[1];
|
|
||||||
JavaGetCurrentEnv(env);
|
|
||||||
|
|
||||||
args[0].l = JavaMakeString(env, value);
|
|
||||||
JavaCallVoid(env, name, "(Ljava/lang/String;)V", args);
|
|
||||||
(*env)->DeleteLocalRef(env, args[0].l);
|
|
||||||
}
|
|
||||||
|
|
||||||
void JavaCall_Void_String(const char* name, String* dst) {
|
|
||||||
const jchar* src;
|
|
||||||
jsize len;
|
|
||||||
JNIEnv* env;
|
|
||||||
jobject obj;
|
|
||||||
JavaGetCurrentEnv(env);
|
|
||||||
|
|
||||||
obj = JavaCallObject(env, name, "()Ljava/lang/String;", NULL);
|
|
||||||
if (!obj) return;
|
|
||||||
|
|
||||||
src = (*env)->GetStringChars(env, obj, NULL);
|
|
||||||
len = (*env)->GetStringLength(env, obj);
|
|
||||||
String_AppendUtf16(dst, src, len * 2);
|
|
||||||
|
|
||||||
(*env)->ReleaseStringChars(env, obj, src);
|
|
||||||
(*env)->DeleteLocalRef(env, obj);
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
#endif /* CC_BUILD_POSIX */
|
||||||
|
|
||||||
|
|
||||||
/*########################################################################################################################*
|
/*########################################################################################################################*
|
||||||
@ -1926,3 +1823,87 @@ cc_result Platform_SetDefaultCurrentDirectory(int argc, char **argv) {
|
|||||||
return chdir(path) == -1 ? errno : 0;
|
return chdir(path) == -1 ? errno : 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Android java interop stuff */
|
||||||
|
#if defined CC_BUILD_ANDROID
|
||||||
|
jclass App_Class;
|
||||||
|
jobject App_Instance;
|
||||||
|
JavaVM* VM_Ptr;
|
||||||
|
|
||||||
|
/* JNI helpers */
|
||||||
|
String JavaGetString(JNIEnv* env, jstring str) {
|
||||||
|
String dst;
|
||||||
|
dst.buffer = (*env)->GetStringUTFChars(env, str, NULL);
|
||||||
|
dst.length = (*env)->GetStringUTFLength(env, str);
|
||||||
|
dst.capacity = dst.length;
|
||||||
|
return dst;
|
||||||
|
}
|
||||||
|
|
||||||
|
jobject JavaMakeString(JNIEnv* env, const String* str) {
|
||||||
|
cc_uint8 tmp[2048 + 4];
|
||||||
|
cc_uint8* cur;
|
||||||
|
int i, len = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < str->length && len < 2048; i++) {
|
||||||
|
cur = tmp + len;
|
||||||
|
len += Convert_CP437ToUtf8(str->buffer[i], cur);
|
||||||
|
}
|
||||||
|
tmp[len] = '\0';
|
||||||
|
return (*env)->NewStringUTF(env, (const char*)tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
jbyteArray JavaMakeBytes(JNIEnv* env, const cc_uint8* src, cc_uint32 len) {
|
||||||
|
if (!len) return NULL;
|
||||||
|
jbyteArray arr = (*env)->NewByteArray(env, len);
|
||||||
|
(*env)->SetByteArrayRegion(env, arr, 0, len, src);
|
||||||
|
return arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void JavaCallVoid(JNIEnv* env, const char* name, const char* sig, jvalue* args) {
|
||||||
|
jmethodID method = (*env)->GetMethodID(env, App_Class, name, sig);
|
||||||
|
(*env)->CallVoidMethodA(env, App_Instance, method, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
jint JavaCallInt(JNIEnv* env, const char* name, const char* sig, jvalue* args) {
|
||||||
|
jmethodID method = (*env)->GetMethodID(env, App_Class, name, sig);
|
||||||
|
return (*env)->CallIntMethodA(env, App_Instance, method, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
jfloat JavaCallFloat(JNIEnv* env, const char* name, const char* sig, jvalue* args) {
|
||||||
|
jmethodID method = (*env)->GetMethodID(env, App_Class, name, sig);
|
||||||
|
return (*env)->CallFloatMethodA(env, App_Instance, method, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
jobject JavaCallObject(JNIEnv* env, const char* name, const char* sig, jvalue* args) {
|
||||||
|
jmethodID method = (*env)->GetMethodID(env, App_Class, name, sig);
|
||||||
|
return (*env)->CallObjectMethodA(env, App_Instance, method, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
void JavaCall_String_Void(const char* name, const String* value) {
|
||||||
|
JNIEnv* env;
|
||||||
|
jvalue args[1];
|
||||||
|
JavaGetCurrentEnv(env);
|
||||||
|
|
||||||
|
args[0].l = JavaMakeString(env, value);
|
||||||
|
JavaCallVoid(env, name, "(Ljava/lang/String;)V", args);
|
||||||
|
(*env)->DeleteLocalRef(env, args[0].l);
|
||||||
|
}
|
||||||
|
|
||||||
|
void JavaCall_Void_String(const char* name, String* dst) {
|
||||||
|
const jchar* src;
|
||||||
|
jsize len;
|
||||||
|
JNIEnv* env;
|
||||||
|
jobject obj;
|
||||||
|
JavaGetCurrentEnv(env);
|
||||||
|
|
||||||
|
obj = JavaCallObject(env, name, "()Ljava/lang/String;", NULL);
|
||||||
|
if (!obj) return;
|
||||||
|
|
||||||
|
src = (*env)->GetStringChars(env, obj, NULL);
|
||||||
|
len = (*env)->GetStringLength(env, obj);
|
||||||
|
String_AppendUtf16(dst, src, len * 2);
|
||||||
|
|
||||||
|
(*env)->ReleaseStringChars(env, obj, src);
|
||||||
|
(*env)->DeleteLocalRef(env, obj);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user