Avoid malloc for frame callbacks

This commit is contained in:
Kovid Goyal 2018-10-26 08:49:17 +05:30
parent 5b547d9b06
commit cca2fb967c
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 19 additions and 12 deletions

7
glfw/wl_platform.h vendored
View File

@ -177,6 +177,13 @@ typedef struct _GLFWwindowWayland
int focus; int focus;
} decorations; } decorations;
struct {
unsigned long long id;
void(*callback)(unsigned long long id);
struct wl_callback *current_wl_callback;
} frameCallbackData;
} _GLFWwindowWayland; } _GLFWwindowWayland;
typedef struct _GLFWWaylandDataOffer typedef struct _GLFWWaylandDataOffer

24
glfw/wl_window.c vendored
View File

@ -973,6 +973,8 @@ void _glfwPlatformDestroyWindow(_GLFWwindow* window)
free(window->wl.title); free(window->wl.title);
free(window->wl.monitors); free(window->wl.monitors);
if (window->wl.frameCallbackData.current_wl_callback)
wl_callback_destroy(window->wl.frameCallbackData.current_wl_callback);
} }
void _glfwPlatformSetWindowTitle(_GLFWwindow* window, const char* title) void _glfwPlatformSetWindowTitle(_GLFWwindow* window, const char* title)
@ -1929,16 +1931,13 @@ _glfwPlatformUpdateIMEState(_GLFWwindow *w, int which, int a, int b, int c, int
glfw_xkb_update_ime_state(w, &_glfw.wl.xkb, which, a, b, c, d); glfw_xkb_update_ime_state(w, &_glfw.wl.xkb, which, a, b, c, d);
} }
struct frame_callback_data {
unsigned long long id;
void(*callback)(unsigned long long id);
};
static void static void
frame_handle_redraw(void *data, struct wl_callback *callback, uint32_t time) { frame_handle_redraw(void *data, struct wl_callback *callback, uint32_t time) {
struct frame_callback_data *cbdata = (struct frame_callback_data*)data; _GLFWwindow* window = (_GLFWwindow*) data;
cbdata->callback(cbdata->id); if (callback == window->wl.frameCallbackData.current_wl_callback) {
free(cbdata); window->wl.frameCallbackData.callback(window->wl.frameCallbackData.id);
window->wl.frameCallbackData.current_wl_callback = NULL;
}
wl_callback_destroy(callback); wl_callback_destroy(callback);
} }
@ -1965,9 +1964,10 @@ GLFWAPI int glfwGetXKBScancode(const char* keyName, GLFWbool caseSensitive) {
GLFWAPI void glfwRequestWaylandFrameEvent(GLFWwindow *handle, unsigned long long id, void(*callback)(unsigned long long id)) { GLFWAPI void glfwRequestWaylandFrameEvent(GLFWwindow *handle, unsigned long long id, void(*callback)(unsigned long long id)) {
_GLFWwindow* window = (_GLFWwindow*) handle; _GLFWwindow* window = (_GLFWwindow*) handle;
struct frame_callback_data *cbdata = malloc(sizeof(struct frame_callback_data));
cbdata->callback = callback; cbdata->id = id;
static const struct wl_callback_listener frame_listener = { .done = frame_handle_redraw }; static const struct wl_callback_listener frame_listener = { .done = frame_handle_redraw };
struct wl_callback *wlcallback = wl_surface_frame(window->wl.surface); if (window->wl.frameCallbackData.current_wl_callback) wl_callback_destroy(window->wl.frameCallbackData.current_wl_callback);
wl_callback_add_listener(wlcallback, &frame_listener, cbdata); window->wl.frameCallbackData.id = id;
window->wl.frameCallbackData.callback = callback;
window->wl.frameCallbackData.current_wl_callback = wl_surface_frame(window->wl.surface);
if (window->wl.frameCallbackData.current_wl_callback) wl_callback_add_listener(window->wl.frameCallbackData.current_wl_callback, &frame_listener, window);
} }