358 lines
7.8 KiB
C++
358 lines
7.8 KiB
C++
// Copyright (c) 2012-2021 Wojciech Figat. All rights reserved.
|
|
|
|
#if PLATFORM_MAC
|
|
|
|
#include "MacPlatform.h"
|
|
#include "MacWindow.h"
|
|
#include "Engine/Core/Log.h"
|
|
#include "Engine/Core/Types/Guid.h"
|
|
#include "Engine/Core/Types/String.h"
|
|
#include "Engine/Core/Collections/HashFunctions.h"
|
|
#include "Engine/Core/Collections/Array.h"
|
|
#include "Engine/Core/Collections/Dictionary.h"
|
|
#include "Engine/Core/Collections/HashFunctions.h"
|
|
#include "Engine/Core/Math/Math.h"
|
|
#include "Engine/Core/Math/Rectangle.h"
|
|
#include "Engine/Core/Math/Color32.h"
|
|
#include "Engine/Platform/CPUInfo.h"
|
|
#include "Engine/Platform/MemoryStats.h"
|
|
#include "Engine/Platform/StringUtils.h"
|
|
#include "Engine/Platform/MessageBox.h"
|
|
#include "Engine/Platform/WindowsManager.h"
|
|
#include "Engine/Platform/Clipboard.h"
|
|
#include "Engine/Platform/IGuiData.h"
|
|
#include "Engine/Platform/Base/PlatformUtils.h"
|
|
#include "Engine/Utilities/StringConverter.h"
|
|
#include "Engine/Threading/Threading.h"
|
|
#include "Engine/Engine/Engine.h"
|
|
#include "Engine/Engine/CommandLine.h"
|
|
#include "Engine/Input/Input.h"
|
|
#include "Engine/Input/Mouse.h"
|
|
#include "Engine/Input/Keyboard.h"
|
|
|
|
CPUInfo MacCpu;
|
|
Guid DeviceId;
|
|
String UserLocale, ComputerName;
|
|
byte MacAddress[6];
|
|
|
|
DialogResult MessageBox::Show(Window* parent, const StringView& text, const StringView& caption, MessageBoxButtons buttons, MessageBoxIcon icon)
|
|
{
|
|
if (CommandLine::Options.Headless)
|
|
return DialogResult::None;
|
|
todo;
|
|
}
|
|
|
|
class MacKeyboard : public Keyboard
|
|
{
|
|
public:
|
|
explicit MacKeyboard()
|
|
: Keyboard()
|
|
{
|
|
}
|
|
};
|
|
|
|
class MacMouse : public Mouse
|
|
{
|
|
public:
|
|
explicit MacMouse()
|
|
: Mouse()
|
|
{
|
|
}
|
|
|
|
public:
|
|
|
|
// [Mouse]
|
|
void SetMousePosition(const Vector2& newPosition) final override
|
|
{
|
|
MacPlatform::SetMousePosition(newPosition);
|
|
|
|
OnMouseMoved(newPosition);
|
|
}
|
|
};
|
|
|
|
bool MacPlatform::Is64BitPlatform()
|
|
{
|
|
return PLATFORM_64BITS;
|
|
}
|
|
|
|
CPUInfo MacPlatform::GetCPUInfo()
|
|
{
|
|
return MacCpu;
|
|
}
|
|
|
|
int32 MacPlatform::GetCacheLineSize()
|
|
{
|
|
return MacCpu.CacheLineSize;
|
|
}
|
|
|
|
MemoryStats MacPlatform::GetMemoryStats()
|
|
{
|
|
MISSING_CODE("MacPlatform::GetMemoryStats");
|
|
return MemoryStats(); // TODO: platform stats on Mac
|
|
}
|
|
|
|
ProcessMemoryStats MacPlatform::GetProcessMemoryStats()
|
|
{
|
|
MISSING_CODE("MacPlatform::GetProcessMemoryStats");
|
|
return ProcessMemoryStats(); // TODO: platform stats on Mac
|
|
}
|
|
|
|
uint64 MacPlatform::GetCurrentThreadID()
|
|
{
|
|
MISSING_CODE("MacPlatform::GetCurrentThreadID");
|
|
return 0; // TODO: threading on Mac
|
|
}
|
|
|
|
void MacPlatform::SetThreadPriority(ThreadPriority priority)
|
|
{
|
|
// TODO: impl this
|
|
}
|
|
|
|
void MacPlatform::SetThreadAffinityMask(uint64 affinityMask)
|
|
{
|
|
// TODO: impl this
|
|
}
|
|
|
|
void MacPlatform::Sleep(int32 milliseconds)
|
|
{
|
|
MISSING_CODE("MacPlatform::Sleep");
|
|
return; // TODO: clock on Mac
|
|
}
|
|
|
|
double MacPlatform::GetTimeSeconds()
|
|
{
|
|
MISSING_CODE("MacPlatform::GetTimeSeconds");
|
|
return 0.0; // TODO: clock on Mac
|
|
}
|
|
|
|
uint64 MacPlatform::GetTimeCycles()
|
|
{
|
|
MISSING_CODE("MacPlatform::GetTimeCycles");
|
|
return 0; // TODO: clock on Mac
|
|
}
|
|
|
|
uint64 MacPlatform::GetClockFrequency()
|
|
{
|
|
MISSING_CODE("MacPlatform::GetClockFrequency");
|
|
return 0; // TODO: clock on Mac
|
|
}
|
|
|
|
void MacPlatform::GetSystemTime(int32& year, int32& month, int32& dayOfWeek, int32& day, int32& hour, int32& minute, int32& second, int32& millisecond)
|
|
{
|
|
// Query for calendar time
|
|
struct timeval time;
|
|
gettimeofday(&time, nullptr);
|
|
|
|
// Convert to local time
|
|
struct tm localTime;
|
|
localtime_r(&time.tv_sec, &localTime);
|
|
|
|
// Extract time
|
|
year = localTime.tm_year + 1900;
|
|
month = localTime.tm_mon + 1;
|
|
dayOfWeek = localTime.tm_wday;
|
|
day = localTime.tm_mday;
|
|
hour = localTime.tm_hour;
|
|
minute = localTime.tm_min;
|
|
second = localTime.tm_sec;
|
|
millisecond = time.tv_usec / 1000;
|
|
}
|
|
|
|
void MacPlatform::GetUTCTime(int32& year, int32& month, int32& dayOfWeek, int32& day, int32& hour, int32& minute, int32& second, int32& millisecond)
|
|
{
|
|
// Get the calendar time
|
|
struct timeval time;
|
|
gettimeofday(&time, nullptr);
|
|
|
|
// Convert to UTC time
|
|
struct tm localTime;
|
|
gmtime_r(&time.tv_sec, &localTime);
|
|
|
|
// Extract time
|
|
year = localTime.tm_year + 1900;
|
|
month = localTime.tm_mon + 1;
|
|
dayOfWeek = localTime.tm_wday;
|
|
day = localTime.tm_mday;
|
|
hour = localTime.tm_hour;
|
|
minute = localTime.tm_min;
|
|
second = localTime.tm_sec;
|
|
millisecond = time.tv_usec / 1000;
|
|
}
|
|
|
|
bool MacPlatform::Init()
|
|
{
|
|
if (PlatformBase::Init())
|
|
return true;
|
|
|
|
// TODO: get MacCpu
|
|
|
|
// TODO: get MacAddress
|
|
// TODO: get DeviceId
|
|
|
|
// TODO: get username
|
|
OnPlatformUserAdd(New<User>(TEXT("User")));
|
|
|
|
// TODO: get UserLocale
|
|
// TODO: get ComputerName
|
|
|
|
Input::Mouse = Impl::Mouse = New<MacMouse>();
|
|
Input::Keyboard = Impl::Keyboard = New<MacKeyboard>();
|
|
|
|
return false;
|
|
}
|
|
|
|
void MacPlatform::BeforeRun()
|
|
{
|
|
}
|
|
|
|
void MacPlatform::Tick()
|
|
{
|
|
// TODO: app events
|
|
}
|
|
|
|
void MacPlatform::BeforeExit()
|
|
{
|
|
}
|
|
|
|
void MacPlatform::Exit()
|
|
{
|
|
}
|
|
|
|
int32 MacPlatform::GetDpi()
|
|
{
|
|
return todo;
|
|
}
|
|
|
|
String MacPlatform::GetUserLocaleName()
|
|
{
|
|
return UserLocale;
|
|
}
|
|
|
|
String MacPlatform::GetComputerName()
|
|
{
|
|
return ComputerName;
|
|
}
|
|
|
|
bool MacPlatform::GetHasFocus()
|
|
{
|
|
// Check if any window is focused
|
|
ScopeLock lock(WindowsManager::WindowsLocker);
|
|
for (auto window : WindowsManager::Windows)
|
|
{
|
|
if (window->IsFocused())
|
|
return true;
|
|
}
|
|
|
|
// Default to true if has no windows open
|
|
return WindowsManager::Windows.IsEmpty();
|
|
}
|
|
|
|
bool MacPlatform::CanOpenUrl(const StringView& url)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
void MacPlatform::OpenUrl(const StringView& url)
|
|
{
|
|
}
|
|
|
|
Vector2 MacPlatform::GetMousePosition()
|
|
{
|
|
MISSING_CODE("MacPlatform::GetMousePosition");
|
|
return Vector2(0, 0); // TODO: mouse on Mac
|
|
}
|
|
|
|
void MacPlatform::SetMousePosition(const Vector2& pos)
|
|
{
|
|
MISSING_CODE("MacPlatform::SetMousePosition");
|
|
// TODO: mouse on Mac
|
|
}
|
|
|
|
Vector2 MacPlatform::GetDesktopSize()
|
|
{
|
|
MISSING_CODE("MacPlatform::GetDesktopSize");
|
|
return Vector2(0, 0); // TODO: desktop size on Mac
|
|
}
|
|
|
|
Rectangle MacPlatform::GetMonitorBounds(const Vector2& screenPos)
|
|
{
|
|
// TODO: do it in a proper way
|
|
return Rectangle(Vector2::Zero, GetDesktopSize());
|
|
}
|
|
|
|
Rectangle MacPlatform::GetVirtualDesktopBounds()
|
|
{
|
|
// TODO: do it in a proper way
|
|
return Rectangle(Vector2::Zero, GetDesktopSize());
|
|
}
|
|
|
|
String MacPlatform::GetMainDirectory()
|
|
{
|
|
MISSING_CODE("MacPlatform::GetMainDirectory");
|
|
return TEXT("/"); // TODO: GetMainDirectory
|
|
}
|
|
|
|
String MacPlatform::GetExecutableFilePath()
|
|
{
|
|
MISSING_CODE("MacPlatform::GetExecutableFilePath");
|
|
return TEXT("/"); // TODO: GetMainDirectory
|
|
}
|
|
|
|
Guid MacPlatform::GetUniqueDeviceId()
|
|
{
|
|
return DeviceId;
|
|
}
|
|
|
|
String MacPlatform::GetWorkingDirectory()
|
|
{
|
|
char buffer[256];
|
|
getcwd(buffer, ARRAY_COUNT(buffer));
|
|
return String(buffer);
|
|
}
|
|
|
|
bool MacPlatform::SetWorkingDirectory(const String& path)
|
|
{
|
|
return chdir(StringAsANSI<>(*path).Get()) != 0;
|
|
}
|
|
|
|
Window* MacPlatform::CreateWindow(const CreateWindowSettings& settings)
|
|
{
|
|
return New<MacWindow>(settings);
|
|
}
|
|
|
|
bool MacPlatform::GetEnvironmentVariable(const String& name, String& value)
|
|
{
|
|
char* env = getenv(StringAsANSI<>(*name).Get());
|
|
if (env)
|
|
{
|
|
value = String(env);
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool MacPlatform::SetEnvironmentVariable(const String& name, const String& value)
|
|
{
|
|
return setenv(StringAsANSI<>(*name).Get(), StringAsANSI<>(*value).Get(), true) != 0;
|
|
}
|
|
|
|
void* MacPlatform::LoadLibrary(const Char* filename)
|
|
{
|
|
MISSING_CODE("MacPlatform::LoadLibrary");
|
|
return nullptr; // TODO: dynamic libs on Mac
|
|
}
|
|
|
|
void MacPlatform::FreeLibrary(void* handle)
|
|
{
|
|
MISSING_CODE("MacPlatform::FreeLibrary");
|
|
return; // TODO: dynamic libs on Mac
|
|
}
|
|
|
|
void* MacPlatform::GetProcAddress(void* handle, const char* symbol)
|
|
{
|
|
MISSING_CODE("MacPlatform::GetProcAddress");
|
|
return nullptr; // TODO: dynamic libs on Mac
|
|
}
|
|
|
|
#endif
|