Avoid malloc for frame callbacks
This commit is contained in:
parent
5b547d9b06
commit
cca2fb967c
7
glfw/wl_platform.h
vendored
7
glfw/wl_platform.h
vendored
@ -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
24
glfw/wl_window.c
vendored
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user