From de2fa7938758ff83cabf06baf4c0ac7a230e78bf Mon Sep 17 00:00:00 2001 From: sanine-a Date: Sat, 24 Oct 2020 22:09:34 -0500 Subject: add more window functions and clean up window info access --- src/window/window.c | 78 ++++++++++++++++++++++++++++++++++++++++++++--------- src/window/window.h | 25 +++++++++++++++++ 2 files changed, 91 insertions(+), 12 deletions(-) (limited to 'src/window') diff --git a/src/window/window.c b/src/window/window.c index bb371cd..ff04b5a 100644 --- a/src/window/window.c +++ b/src/window/window.c @@ -1,19 +1,25 @@ #include "window.h" +int honey_window_info_ref = LUA_NOREF; + bool honey_setup_window(lua_State* L) { - honey_window_information* info = malloc(sizeof(honey_window_information)); - if (info == NULL) { - fprintf(stderr, "[honey] ERROR: failed to allocate memory for window information!\n"); - return false; - } + honey_window_information* info = lua_newuserdata(L, sizeof(honey_window_information)); + honey_window_info_ref = luaL_ref(L, LUA_REGISTRYINDEX); glfwInit(); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); - info->window = glfwCreateWindow(640, 480, "honey", NULL, NULL); + info->window = glfwCreateWindow(HONEY_WINDOW_DEFAULT_WIDTH, + HONEY_WINDOW_DEFAULT_HEIGHT, + "honey", NULL, NULL); + + info->width = HONEY_WINDOW_DEFAULT_WIDTH; + info->height = HONEY_WINDOW_DEFAULT_WIDTH; + info->fullscreen = false; + if (info->window == NULL) { fprintf(stderr, "[honey] ERROR: failed to create window!\n"); glfwTerminate(); @@ -34,11 +40,13 @@ bool honey_setup_window(lua_State* L) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); honey_lua_element window_elements[] = { - { "internal", HONEY_LIGHTUSERDATA, { .pointer = info } }, { "set_fullscreen", HONEY_FUNC, { .function = honey_window_set_fullscreen } }, + { "set_title", HONEY_FUNC, { .function = honey_window_set_title } }, + { "get_size", HONEY_FUNC, { .function = honey_window_get_size } }, + { "set_size", HONEY_FUNC, { .function = honey_window_set_size } }, }; - honey_lua_create_table(L, window_elements, 2); + honey_lua_create_table(L, window_elements, 4); return true; } @@ -51,11 +59,8 @@ int honey_window_set_fullscreen(lua_State* L) bool fullscreen = lua_toboolean(L, 1); - lua_getglobal(L, "honey"); - lua_getfield(L, -1, "window"); - lua_getfield(L, -1, "internal"); + lua_rawgeti(L, LUA_REGISTRYINDEX, honey_window_info_ref); honey_window_information* info = lua_touserdata(L, -1); - lua_pop(L, 2); if (fullscreen) { glfwGetWindowSize(info->window, &(info->width), &(info->height)); @@ -63,9 +68,58 @@ int honey_window_set_fullscreen(lua_State* L) GLFWmonitor* monitor = glfwGetPrimaryMonitor(); const GLFWvidmode* mode = glfwGetVideoMode(monitor); glfwSetWindowMonitor(info->window, monitor, 0, 0, mode->width, mode->height, mode->refreshRate); + info->fullscreen = true; } else { glfwSetWindowMonitor(info->window, NULL, 20, 20, info->width, info->height, 0); + info->fullscreen = false; } return 0; } + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +int honey_window_set_title(lua_State* L) +{ + if (!honey_lua_validate_types(L, 1, HONEY_STRING)) + lua_error(L); + + const char* title = lua_tostring(L, 1); + + lua_rawgeti(L, LUA_REGISTRYINDEX, honey_window_info_ref); + honey_window_information* info = lua_touserdata(L, -1); + + glfwSetWindowTitle(info->window, title); + return 0; +} + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +int honey_window_get_size(lua_State* L) +{ + lua_rawgeti(L, LUA_REGISTRYINDEX, honey_window_info_ref); + honey_window_information* info = lua_touserdata(L, -1); + + int width, height; + glfwGetWindowSize(info->window, &width, &height); + lua_pushinteger(L, width); + lua_pushinteger(L, height); + return 2; +} + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +int honey_window_set_size(lua_State* L) +{ + if (!honey_lua_validate_types(L, 2, HONEY_INT, HONEY_INT)) + lua_error(L); + + int width = lua_tointeger(L, 1); + int height = lua_tointeger(L, 2); + + lua_rawgeti(L, LUA_REGISTRYINDEX, honey_window_info_ref); + honey_window_information* info = lua_touserdata(L, -1); + + glfwSetWindowSize(info->window, width, height); + return 0; +} diff --git a/src/window/window.h b/src/window/window.h index c0083ba..3d320f7 100644 --- a/src/window/window.h +++ b/src/window/window.h @@ -15,6 +15,8 @@ typedef struct { bool fullscreen; } honey_window_information; +extern int honey_window_info_ref; + /** @brief Push the various honey.window table to the stack. * * @param[in] L The lua state to push to @@ -33,4 +35,27 @@ bool honey_setup_window(lua_State* L); */ int honey_window_set_fullscreen(lua_State* L); +/** @brief Set the title of the window. + * + * @param[in] title String containing the desired window title. + * + * @returns Nothing. + */ +int honey_window_set_title(lua_State* L); + +/** @brief Get the current size of the window. + * + * @returns width, height numbers representing the window size in pixels. + */ +int honey_window_get_size(lua_State* L); + +/** @brief Set the current size of the window. + * + * @param[in] width Integer of the desired width in pixels. + * @param[in] height Integer of the desired height in pixels. + * + * @returns Nothing. + */ +int honey_window_set_size(lua_State* L); + #endif -- cgit v1.2.1