main.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. #include <stdio.h>
  2. #include <SDL2/SDL.h>
  3. #include "api/api.h"
  4. #include "renderer.h"
  5. #ifdef _WIN32
  6. #include <windows.h>
  7. #elif __linux__
  8. #include <unistd.h>
  9. #elif __APPLE__
  10. #include <mach-o/dyld.h>
  11. #endif
  12. SDL_Window *window;
  13. static double get_scale(void) {
  14. float dpi;
  15. SDL_GetDisplayDPI(0, NULL, &dpi, NULL);
  16. #if _WIN32
  17. return dpi / 96.0;
  18. #elif __APPLE__
  19. return dpi / 72.0;
  20. #else
  21. return 1.0;
  22. #endif
  23. }
  24. static void get_exe_dir(char *buf, int sz) {
  25. #if _WIN32
  26. int len = GetModuleFileName(NULL, buf, sz - 1);
  27. buf[len] = '\0';
  28. #elif __linux__
  29. char path[512];
  30. sprintf(path, "/proc/%d/exe", getpid());
  31. int len = readlink(path, buf, sz - 1);
  32. buf[len] = '\0';
  33. #elif __APPLE__
  34. unsigned size = sz;
  35. _NSGetExecutablePath(buf, &size);
  36. #else
  37. strcpy(buf, ".")
  38. #endif
  39. for (int i = strlen(buf) - 1; i > 0; i--) {
  40. if (buf[i] == '/' || buf[i] == '\\') {
  41. buf[i] = '\0';
  42. break;
  43. }
  44. }
  45. }
  46. int main(int argc, char **argv) {
  47. #ifdef _WIN32
  48. HINSTANCE lib = LoadLibrary("user32.dll");
  49. int (*SetProcessDPIAware)() = (void*) GetProcAddress(lib, "SetProcessDPIAware");
  50. SetProcessDPIAware();
  51. #endif
  52. SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS);
  53. SDL_EnableScreenSaver();
  54. SDL_EventState(SDL_DROPFILE, SDL_ENABLE);
  55. atexit(SDL_Quit);
  56. #if SDL_VERSION_ATLEAST(2, 0, 5)
  57. SDL_SetHint(SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH, "1");
  58. #endif
  59. SDL_DisplayMode dm;
  60. SDL_GetCurrentDisplayMode(0, &dm);
  61. window = SDL_CreateWindow(
  62. "", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
  63. dm.w * 0.8, dm.h * 0.8, SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI);
  64. ren_init(window);
  65. lua_State *L = luaL_newstate();
  66. luaL_openlibs(L);
  67. api_load_libs(L);
  68. lua_newtable(L);
  69. for (int i = 0; i < argc; i++) {
  70. lua_pushstring(L, argv[i]);
  71. lua_rawseti(L, -2, i + 1);
  72. }
  73. lua_setglobal(L, "_ARGS");
  74. lua_pushnumber(L, get_scale());
  75. lua_setglobal(L, "_SCALE");
  76. char exedir[2048];
  77. get_exe_dir(exedir, sizeof(exedir));
  78. lua_pushstring(L, exedir);
  79. lua_setglobal(L, "_EXEDIR");
  80. (void) luaL_dostring(L,
  81. "local core\n"
  82. "xpcall(function()\n"
  83. " _SCALE = tonumber(os.getenv(\"LITE_SCALE\")) or _SCALE\n"
  84. " _PATHSEP = package.config:sub(1, 1)\n"
  85. " package.path = _EXEDIR .. '/data/?.lua;' .. package.path\n"
  86. " package.path = _EXEDIR .. '/data/?/init.lua;' .. package.path\n"
  87. " core = require('core')\n"
  88. " core.init()\n"
  89. " core.run()\n"
  90. "end, function(err)\n"
  91. " print('Error: ' .. tostring(err))\n"
  92. " print(debug.traceback(nil, 2))\n"
  93. " if core and core.on_error then\n"
  94. " pcall(core.on_error, err)\n"
  95. " end\n"
  96. " os.exit(1)\n"
  97. "end)");
  98. lua_close(L);
  99. SDL_DestroyWindow(window);
  100. return EXIT_SUCCESS;
  101. }