1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
#include "api.h"
#include "../renwindow.h"
#include "lua.h"
#include <SDL.h>
#ifdef _WIN32
#include "windows/darkmode.h"
#endif
static RenWindow *persistant_window = NULL;
static void init_window_icon(SDL_Window *window) {
#if !defined(_WIN32) && !defined(__APPLE__)
#include "../resources/icons/icon.inl"
(void) icon_rgba_len; /* unused */
SDL_Surface *surf = SDL_CreateRGBSurfaceFrom(
icon_rgba, 64, 64,
32, 64 * 4,
0x000000ff,
0x0000ff00,
0x00ff0000,
0xff000000);
SDL_SetWindowIcon(window, surf);
SDL_FreeSurface(surf);
#endif
}
static int f_renwin_create(lua_State *L) {
const char *title = luaL_checkstring(L, 1);
const int x = luaL_optinteger(L, 2, SDL_WINDOWPOS_UNDEFINED);
const int y = luaL_optinteger(L, 3, SDL_WINDOWPOS_UNDEFINED);
float width = luaL_optnumber(L, 4, 0);
float height = luaL_optnumber(L, 5, 0);
if (width < 1 || height < 1) {
SDL_DisplayMode dm;
SDL_GetCurrentDisplayMode(0, &dm);
if (width < 1) {
width = dm.w * 0.8;
}
if (height < 1) {
height = dm.h * 0.8;
}
}
SDL_Window *window = SDL_CreateWindow(
title, x, y, width, height,
SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI | SDL_WINDOW_HIDDEN
);
if (!window) {
return luaL_error(L, "Error creating lite-xl window: %s", SDL_GetError());
}
#ifdef _WIN32
windows_darkmode_set_theme(window, NULL, false);
#endif
init_window_icon(window);
RenWindow **window_renderer = (RenWindow**)lua_newuserdata(L, sizeof(RenWindow*));
luaL_setmetatable(L, API_TYPE_RENWINDOW);
*window_renderer = ren_create(window);
/* Set a minimum size to prevent too small to see issues on unmaximize.
** Needs to be set after renderer to work: libsdl-org/SDL/issues/1408 */
SDL_SetWindowMinimumSize(window, 240, 180);
return 1;
}
static int f_renwin_gc(lua_State *L) {
RenWindow *window_renderer = *(RenWindow**)luaL_checkudata(L, 1, API_TYPE_RENWINDOW);
if (window_renderer != persistant_window)
ren_destroy(window_renderer);
return 0;
}
static int f_renwin_get_size(lua_State *L) {
RenWindow *window_renderer = *(RenWindow**)luaL_checkudata(L, 1, API_TYPE_RENWINDOW);
int w, h;
ren_get_size(window_renderer, &w, &h);
lua_pushnumber(L, w);
lua_pushnumber(L, h);
return 2;
}
static int f_renwin_persist(lua_State *L) {
RenWindow *window_renderer = *(RenWindow**)luaL_checkudata(L, 1, API_TYPE_RENWINDOW);
persistant_window = window_renderer;
return 0;
}
static int f_renwin_restore(lua_State *L) {
if (!persistant_window) {
lua_pushnil(L);
}
else {
RenWindow **window_renderer = (RenWindow**)lua_newuserdata(L, sizeof(RenWindow*));
luaL_setmetatable(L, API_TYPE_RENWINDOW);
*window_renderer = persistant_window;
}
return 1;
}
static const luaL_Reg renwindow_lib[] = {
{ "create", f_renwin_create },
{ "__gc", f_renwin_gc },
{ "get_size", f_renwin_get_size },
{ "_persist", f_renwin_persist },
{ "_restore", f_renwin_restore },
{NULL, NULL}
};
int luaopen_renwindow(lua_State* L) {
luaL_newmetatable(L, API_TYPE_RENWINDOW);
luaL_setfuncs(L, renwindow_lib, 0);
lua_pushvalue(L, -1);
lua_setfield(L, -2, "__index");
return 1;
}
|