1
0
Fork 0
mirror of https://github.com/bjornbytes/lovr.git synced 2024-07-02 12:33:52 +00:00
lovr/src/core/os_win32.c
2021-07-18 22:24:00 -07:00

153 lines
3.2 KiB
C

#include "os.h"
#define WIN32_LEAN_AND_MEAN
#define WINVER 0x0600
#define _WIN32_WINNT 0x0600
#include <windows.h>
#include <shellapi.h>
#include <knownfolders.h>
#include <shlobj.h>
#include <stdio.h>
#include "os_glfw.h"
static uint64_t frequency;
#ifndef LOVR_OMIT_MAIN
int main(int argc, char** argv);
int WINAPI WinMain(HINSTANCE instance, HINSTANCE prev, LPSTR args, int show) {
int argc;
char** argv;
LPWSTR* wargv = CommandLineToArgvW(GetCommandLineW(), &argc);
if (!wargv) {
return EXIT_FAILURE;
}
argv = calloc(argc + 1, sizeof(char*));
if (!argv) {
return EXIT_FAILURE;
}
for (int i = 0; i < argc; i++) {
int size = WideCharToMultiByte(CP_UTF8, 0, wargv[i], -1, NULL, 0, NULL, NULL);
argv[i] = malloc(size);
if (!argv[i]) {
return EXIT_FAILURE;
}
if (!WideCharToMultiByte(CP_UTF8, 0, wargv[i], -1, argv[i], size, NULL, NULL)) {
return EXIT_FAILURE;
}
}
int status = main(argc, argv);
for (int i = 0; i < argc; i++) {
free(argv[i]);
}
free(argv);
return status;
}
#endif
bool os_init() {
LARGE_INTEGER f;
QueryPerformanceFrequency(&f);
frequency = f.QuadPart;
return true;
}
void os_destroy() {
glfwTerminate();
}
const char* os_get_name() {
return "Windows";
}
uint32_t os_get_core_count() {
SYSTEM_INFO info;
GetSystemInfo(&info);
return info.dwNumberOfProcessors;
}
void os_open_console() {
if (!AttachConsole(ATTACH_PARENT_PROCESS)) {
if (GetLastError() != ERROR_ACCESS_DENIED) {
if (!AllocConsole()) {
return;
}
}
}
freopen("CONOUT$", "w", stdout);
freopen("CONIN$", "r", stdin);
freopen("CONOUT$", "w", stderr);
}
double os_get_time() {
LARGE_INTEGER t;
QueryPerformanceCounter(&t);
return t.QuadPart / (double) frequency;
}
void os_sleep(double seconds) {
Sleep((unsigned int) (seconds * 1000));
}
void os_request_permission(os_permission permission) {
//
}
void os_on_permission(fn_permission* callback) {
//
}
size_t os_get_home_directory(char* buffer, size_t size) {
PWSTR wpath = NULL;
if (SHGetKnownFolderPath(&FOLDERID_Profile, 0, NULL, &wpath) == S_OK) {
size_t bytes = WideCharToMultiByte(CP_UTF8, 0, wpath, -1, buffer, (int) size, NULL, NULL) - 1;
CoTaskMemFree(wpath);
return bytes;
}
return 0;
}
size_t os_get_data_directory(char* buffer, size_t size) {
PWSTR wpath = NULL;
if (SHGetKnownFolderPath(&FOLDERID_RoamingAppData, 0, NULL, &wpath) == S_OK) {
size_t bytes = WideCharToMultiByte(CP_UTF8, 0, wpath, -1, buffer, (int) size, NULL, NULL) - 1;
CoTaskMemFree(wpath);
return bytes;
}
return 0;
}
size_t os_get_working_directory(char* buffer, size_t size) {
WCHAR wpath[1024];
int length = GetCurrentDirectoryW((int) size, wpath);
if (length) {
return WideCharToMultiByte(CP_UTF8, 0, wpath, length + 1, buffer, (int) size, NULL, NULL) - 1;
}
return 0;
}
size_t os_get_executable_path(char* buffer, size_t size) {
WCHAR wpath[1024];
DWORD length = GetModuleFileNameW(NULL, wpath, 1024);
if (length < 1024) {
return WideCharToMultiByte(CP_UTF8, 0, wpath, length + 1, buffer, (int) size, NULL, NULL) - 1;
}
return 0;
}
size_t os_get_bundle_path(char* buffer, size_t size, const char** root) {
*root = NULL;
return os_get_executable_path(buffer, size);
}