diff --git a/OpenTK/Platform/X11/X11KeyMap.cs b/OpenTK/Platform/X11/X11KeyMap.cs index facb594d1..048347e5e 100644 --- a/OpenTK/Platform/X11/X11KeyMap.cs +++ b/OpenTK/Platform/X11/X11KeyMap.cs @@ -182,8 +182,8 @@ namespace OpenTK.Platform.X11 Add(XKey.Pause, Key.Pause); Add(XKey.Break, Key.Pause); - Add(XKey.Scroll_Lock, Key.Pause); - Add(XKey.Insert, Key.PrintScreen); + Add(XKey.Scroll_Lock, Key.ScrollLock); + Add(XKey.Insert, Key.Insert); Add(XKey.Print, Key.PrintScreen); Add(XKey.Sys_Req, Key.PrintScreen); diff --git a/src/Core.h b/src/Core.h index 941554618..dd2cdcfd6 100644 --- a/src/Core.h +++ b/src/Core.h @@ -26,7 +26,7 @@ typedef signed __int64 int64_t; #include #define NOINLINE_ __attribute__((noinline)) #define ALIGN_HINT_(x) __attribute__((aligned(x))) -#define EXPORT_ __attribute__((noinline)) +#define EXPORT_ __attribute__((visibility("default"), noinline)) #else #error "I don't recognise this compiler. You'll need to add required definitions in Core.h!" #endif @@ -73,9 +73,17 @@ typedef struct Bitmap_ { uint8_t* Scan0; int Width, Height; } Bitmap; #endif #ifdef __linux__ #define CC_BUILD_NIX +#define CC_BUILD_POSIX +#define CC_BUILD_X11 #endif #ifdef __APPLE__ #define CC_BUILD_OSX +#define CC_BUILD_POSIX +#endif +#ifdef __sun__ +#define CC_BUILD_SOLARIS +#define CC_BUILD_POSIX +#define CC_BUILD_X11 #endif #endif diff --git a/src/ErrorHandler.c b/src/ErrorHandler.c index cacb2dce4..535c47ae2 100644 --- a/src/ErrorHandler.c +++ b/src/ErrorHandler.c @@ -9,14 +9,6 @@ static void ErrorHandler_FailCommon(ReturnCode result, const char* raw_msg, void static void ErrorHandler_DumpCommon(String* str, void* ctx); static void ErrorHandler_DumpRegisters(void* ctx); -/* POSIX is mainly shared between Linux and OSX */ -#ifdef CC_BUILD_NIX -#define CC_BUILD_POSIX -#endif -#ifdef CC_BUILD_OSX -#define CC_BUILD_POSIX -#endif - #ifdef CC_BUILD_WIN #define WIN32_LEAN_AND_MEAN #define NOSERVICE @@ -39,17 +31,17 @@ static int ErrorHandler_GetFrames(CONTEXT* ctx, struct StackPointers* pointers, frame.AddrStack.Mode = AddrModeFlat; DWORD type; -#ifdef _M_IX86 +#if defined _M_IX86 type = IMAGE_FILE_MACHINE_I386; frame.AddrPC.Offset = ctx->Eip; frame.AddrFrame.Offset = ctx->Ebp; frame.AddrStack.Offset = ctx->Esp; -#elif _M_X64 +#elif defined _M_X64 type = IMAGE_FILE_MACHINE_AMD64; frame.AddrPC.Offset = ctx->Rip; frame.AddrFrame.Offset = ctx->Rsp; frame.AddrStack.Offset = ctx->Rsp; -#elif _M_IA64 +#elif defined _M_IA64 type = IMAGE_FILE_MACHINE_IA64; frame.AddrPC.Offset = ctx->StIIP; frame.AddrFrame.Offset = ctx->IntSp; @@ -153,18 +145,18 @@ static void ErrorHandler_DumpRegisters(void* ctx) { String_InitArray(str, strBuffer); String_AppendConst(&str, "-- registers --\r\n"); -#ifdef _M_IX86 +#if defined _M_IX86 String_Format3(&str, "eax=%x ebx=%x ecx=%x\r\n", &r->Eax, &r->Ebx, &r->Ecx); String_Format3(&str, "edx=%x esi=%x edi=%x\r\n", &r->Edx, &r->Esi, &r->Edi); String_Format3(&str, "eip=%x ebp=%x esp=%x\r\n", &r->Eip, &r->Ebp, &r->Esp); -#elif _M_X64 +#elif defined _M_X64 String_Format3(&str, "rax=%x rbx=%x rcx=%x\r\n", &r->Rax, &r->Rbx, &r->Rcx); String_Format3(&str, "rdx=%x rsi=%x rdi=%x\r\n", &r->Rdx, &r->Rsi, &r->Rdi); String_Format3(&str, "rip=%x rbp=%x rsp=%x\r\n", &r->Rip, &r->Rbp, &r->Rsp); String_Format3(&str, "r8 =%x r9 =%x r10=%x\r\n", &r->R8, &r->R9, &r->R10); String_Format3(&str, "r11=%x r12=%x r13=%x\r\n", &r->R11, &r->R12, &r->R13); String_Format2(&str, "r14=%x r15=%x\r\n" , &r->R14, &r->R15); -#elif _M_IA64 +#elif defined _M_IA64 String_Format3(&str, "r1 =%x r2 =%x r3 =%x\r\n", &r->IntGp, &r->IntT0, &r->IntT1); String_Format3(&str, "r4 =%x r5 =%x r6 =%x\r\n", &r->IntS0, &r->IntS1, &r->IntS2); String_Format3(&str, "r7 =%x r8 =%x r9 =%x\r\n", &r->IntS3, &r->IntV0, &r->IntT2); @@ -258,6 +250,7 @@ void ErrorHandler_Fail2(ReturnCode result, const char* raw_msg) { #pragma optimize ("", on) #endif #endif +/* POSIX is mainly shared between Linux and OSX */ #ifdef CC_BUILD_POSIX #include #include @@ -339,13 +332,12 @@ void ErrorHandler_Fail2(ReturnCode result, const char* raw_msg) { ErrorHandler_FailCommon(result, raw_msg, &ctx); } #endif -#ifdef CC_BUILD_NIX +#ifdef CC_BUILD_X11 #include #include #include #include - /*########################################################################################################################* *-----------------------------------------------------X11 message box-----------------------------------------------------* *#########################################################################################################################*/ @@ -573,10 +565,20 @@ static void X11_MessageBox(const char* title, const char* text, X11Window* w) { } } +void ErrorHandler_ShowDialog(const char* title, const char* msg) { + X11Window w = { 0 }; + dpy = DisplayDevice_Meta; + + X11_MessageBox(title, msg, &w); + X11Window_Free(&w); +} +#endif + /*########################################################################################################################* *-------------------------------------------------------Info dumping------------------------------------------------------* *#########################################################################################################################*/ +#if defined CC_BUILD_NIX || defined CC_BUILD_SOLARIS static void ErrorHandler_DumpRegisters(void* ctx) { mcontext_t r; String str; char strBuffer[STRING_SIZE * 8]; @@ -628,16 +630,7 @@ static void ErrorHandler_DumpCommon(String* str, void* ctx) { ErrorHandler_Log(&memMap); ErrorHandler_DumpMemoryMap(); } - -void ErrorHandler_ShowDialog(const char* title, const char* msg) { - X11Window w = { 0 }; - dpy = DisplayDevice_Meta; - - X11_MessageBox(title, msg, &w); - X11Window_Free(&w); -} -#endif -#ifdef CC_BUILD_OSX +#elif defined CC_BUILD_OSX static void ErrorHandler_DumpRegisters(void* ctx) { mcontext_t r; String str; char strBuffer[STRING_SIZE * 8]; @@ -648,11 +641,11 @@ static void ErrorHandler_DumpRegisters(void* ctx) { String_AppendConst(&str, "-- registers --\n"); /* You can find these definitions at /usr/include/mach/i386/_structs.h */ -#ifdef __i386__ +#if defined __i386__ String_Format3(&str, "eax=%x ebx=%x ecx=%x\n", &r->__ss.__eax, &r->__ss.__ebx, &r->__ss.__ecx); String_Format3(&str, "edx=%x esi=%x edi=%x\n", &r->__ss.__edx, &r->__ss.__esi, &r->__ss.__edi); String_Format3(&str, "eip=%x ebp=%x esp=%x\n", &r->__ss.__eip, &r->__ss.__ebp, &r->__ss.__esp); -#elif __x86_64__ +#elif defined __x86_64__ String_Format3(&str, "rax=%x rbx=%x rcx=%x\n", &r->__ss.__rax, &r->__ss.__rbx, &r->__ss.__rcx); String_Format3(&str, "rdx=%x rsi=%x rdi=%x\n", &r->__ss.__rdx, &r->__ss.__rsi, &r->__ss.__rdi); String_Format3(&str, "rip=%x rbp=%x rsp=%x\n", &r->__ss.__rip, &r->__ss.__rbp, &r->__ss.__rsp); diff --git a/src/NixWindow.c b/src/NixWindow.c index 020e65034..c139ca346 100644 --- a/src/NixWindow.c +++ b/src/NixWindow.c @@ -1,5 +1,5 @@ #include "Window.h" -#ifdef CC_BUILD_NIX +#ifdef CC_BUILD_X11 #include "ErrorHandler.h" #include "Input.h" #include "Funcs.h" @@ -75,8 +75,8 @@ static Key Window_MapKey(KeySym key) { case XK_Pause: return Key_Pause; case XK_Break: return Key_Pause; - case XK_Scroll_Lock: return Key_Pause; - case XK_Insert: return Key_PrintScreen; + case XK_Scroll_Lock: return Key_ScrollLock; + case XK_Insert: return Key_Insert; case XK_Print: return Key_PrintScreen; case XK_Sys_Req: return Key_PrintScreen; diff --git a/src/Platform.c b/src/Platform.c index 3c488ca35..1872c195e 100644 --- a/src/Platform.c +++ b/src/Platform.c @@ -12,14 +12,8 @@ #include "freetype/freetype.h" #include "freetype/ftmodapi.h" -/* POSIX is mainly shared between Linux and OSX */ -#ifdef CC_BUILD_NIX -#define CC_BUILD_POSIX -#endif -#ifdef CC_BUILD_OSX -#define CC_BUILD_POSIX -#endif static void Platform_InitDisplay(void); +static void Platform_InitStopwatch(void); #ifdef CC_BUILD_WIN #define WIN32_LEAN_AND_MEAN @@ -52,6 +46,7 @@ ReturnCode ReturnCode_InvalidArg = ERROR_INVALID_PARAMETER; ReturnCode ReturnCode_SocketInProgess = WSAEINPROGRESS; ReturnCode ReturnCode_SocketWouldBlock = WSAEWOULDBLOCK; #endif +/* POSIX is mainly shared between Linux and OSX */ #ifdef CC_BUILD_POSIX #include #include @@ -87,9 +82,13 @@ ReturnCode ReturnCode_SocketWouldBlock = EWOULDBLOCK; #include #include #include -#ifdef CC_BUILD_SOLARIS -#include +char* Font_DefaultName = "Century Schoolbook L Roman"; #endif +#ifdef CC_BUILD_SOLARIS +#include +#include +#include +#include char* Font_DefaultName = "Century Schoolbook L Roman"; #endif #ifdef CC_BUILD_OSX @@ -344,6 +343,11 @@ uint64_t Stopwatch_Measure(void) { return (uint64_t)t.tv_sec * NS_PER_SEC + t.tv_nsec; } #endif +#ifdef CC_BUILD_SOLARIS +uint64_t Stopwatch_Measure(void) { + return gethrtime(); +} +#endif #ifdef CC_BUILD_OSX uint64_t Stopwatch_Measure(void) { return mach_absolute_time(); @@ -1059,6 +1063,9 @@ static void Font_Init(void) { #ifdef CC_BUILD_NIX static String dir = String_FromConst("/usr/share/fonts"); #endif +#ifdef CC_BUILD_SOLARIS + static String dir = String_FromConst("/usr/share/fonts"); +#endif #ifdef CC_BUILD_OSX static String dir = String_FromConst("/Library/Fonts"); #endif @@ -1779,19 +1786,13 @@ int Platform_ConvertString(void* data, const String* src) { return src->length * 2; } -void Platform_Init(void) { - LARGE_INTEGER freq; +void Platform_Init(void) { WSADATA wsaData; ReturnCode res; Platform_InitDisplay(); + Platform_InitStopwatch(); heap = GetProcessHeap(); - - sw_highRes = QueryPerformanceFrequency(&freq); - if (sw_highRes) { - sw_freqMul = 1000 * 1000; - sw_freqDiv = freq.QuadPart; - } else { sw_freqDiv = 10; } res = WSAStartup(MAKEWORD(2, 2), &wsaData); if (res) ErrorHandler_Fail2(res, "WSAStartup failed"); @@ -1814,6 +1815,16 @@ static void Platform_InitDisplay(void) { ReleaseDC(NULL, hdc); } +static void Platform_InitStopwatch(void) { + LARGE_INTEGER freq; + sw_highRes = QueryPerformanceFrequency(&freq); + + if (sw_highRes) { + sw_freqMul = 1000 * 1000; + sw_freqDiv = freq.QuadPart; + } else { sw_freqDiv = 10; } +} + void Platform_SetWorkingDir(void) { WCHAR dirName[FILENAME_SIZE + 1]; DWORD len = GetModuleFileNameW(NULL, dirName, FILENAME_SIZE); @@ -1898,6 +1909,7 @@ int Platform_ConvertString(void* data, const String* src) { void Platform_Init(void) { Platform_InitDisplay(); + Platform_InitStopwatch(); pthread_mutex_init(&event_mutex, NULL); pthread_mutex_init(&audio_lock, NULL); } @@ -1942,10 +1954,29 @@ static void Platform_TrimFilename(char* path, int len) { } } #endif +#ifdef CC_BUILD_X11 +static void Platform_InitDisplay(void) { + Display* display = XOpenDisplay(NULL); + int screen; + if (!display) ErrorHandler_Fail("Failed to open display"); + + DisplayDevice_Meta = display; + screen = DefaultScreen(display); + + /* TODO: Use Xinerama and XRandR for querying these */ + DisplayDevice_Default.Bounds.X = 0; + DisplayDevice_Default.Bounds.Y = 0; + DisplayDevice_Default.Bounds.Width = DisplayWidth(display, screen); + DisplayDevice_Default.Bounds.Height = DisplayHeight(display, screen); + DisplayDevice_Default.BitsPerPixel = DefaultDepth(display, screen); +} +#endif #ifdef CC_BUILD_NIX ReturnCode Platform_StartShell(const String* args) { return Platform_RunOpen("xdg-open %s", args); } +static void Platform_InitStopwatch(void) { sw_freqDiv = 1000; } + void Platform_SetWorkingDir(void) { char path[FILENAME_SIZE + 1] = { 0 }; int len = readlink("/proc/self/exe", path, FILENAME_SIZE); @@ -1954,22 +1985,21 @@ void Platform_SetWorkingDir(void) { Platform_TrimFilename(path, len); chdir(path); } +#endif +#ifdef CC_BUILD_SOLARIS +ReturnCode Platform_StartShell(const String* args) { + /* TODO: Is this on solaris, or just an OpenIndiana thing */ + return Platform_RunOpen("xdg-open %s", args); +} +static void Platform_InitStopwatch(void) { sw_freqDiv = 1000; } -static void Platform_InitDisplay(void) { - Display* display = XOpenDisplay(NULL); - int screen; - if (!display) ErrorHandler_Fail("Failed to open display"); +void Platform_SetWorkingDir(void) { + char path[FILENAME_SIZE + 1] = { 0 }; + int len = readlink("/proc/self/path/a.out", path, FILENAME_SIZE); + if (len <= 0) return; - DisplayDevice_Meta = display; - screen = DefaultScreen(display); - sw_freqDiv = 1000; - - /* TODO: Use Xinerama and XRandR for querying these */ - DisplayDevice_Default.Bounds.X = 0; - DisplayDevice_Default.Bounds.Y = 0; - DisplayDevice_Default.Bounds.Width = DisplayWidth(display, screen); - DisplayDevice_Default.Bounds.Height = DisplayHeight(display, screen); - DisplayDevice_Default.BitsPerPixel = DefaultDepth(display, screen); + Platform_TrimFilename(path, len); + chdir(path); } #endif #ifdef CC_BUILD_OSX @@ -2002,12 +2032,7 @@ void Platform_SetWorkingDir(void) { static void Platform_InitDisplay(void) { CGDirectDisplayID display = CGMainDisplayID(); - CGRect bounds = CGDisplayBounds(display); - - mach_timebase_info_data_t tb = { 0 }; - mach_timebase_info(&tb); - sw_freqMul = tb.numer; - sw_freqDiv = tb.denom * 1000; + CGRect bounds = CGDisplayBounds(display); DisplayDevice_Default.Bounds.X = (int)bounds.origin.x; DisplayDevice_Default.Bounds.Y = (int)bounds.origin.y; @@ -2015,4 +2040,12 @@ static void Platform_InitDisplay(void) { DisplayDevice_Default.Bounds.Height = (int)bounds.size.height; DisplayDevice_Default.BitsPerPixel = CGDisplayBitsPerPixel(display); } + +static void Platform_InitStopwatch(void) { + mach_timebase_info_data_t tb = { 0 }; + mach_timebase_info(&tb); + + sw_freqMul = tb.numer; + sw_freqDiv = tb.denom * 1000; +} #endif