On Linux, just call the tick callback on every loop tick. This is much simpler, and should fix the issue with screen updates sometimes getting stuck waiting for an X11 event. Note that this was what used to happen (global state being checked on every loop tick) before the refactoring to use a GLFW event loop, therefore there should be no performance regressions, though we of course end up checking global state on every group of events on Linux, instead of only when something of interest happens. I suspect, to achieve the latter is going to require implementing a mutex/lock in the main loop to avoid races, which doesn't seem worth it.
48 lines
1.3 KiB
C
Vendored
48 lines
1.3 KiB
C
Vendored
/*
|
|
* Copyright (C) 2019 Kovid Goyal <kovid at kovidgoyal.net>
|
|
*
|
|
* Distributed under terms of the GPL3 license.
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "internal.h"
|
|
|
|
#ifndef GLFW_LOOP_BACKEND
|
|
#define GLFW_LOOP_BACKEND x11
|
|
#endif
|
|
|
|
static GLFWbool keep_going = GLFW_FALSE;
|
|
|
|
void _glfwPlatformRequestTickCallback() {
|
|
}
|
|
|
|
void _glfwPlatformStopMainLoop(void) {
|
|
if (keep_going) {
|
|
keep_going = GLFW_FALSE;
|
|
_glfwPlatformPostEmptyEvent();
|
|
}
|
|
}
|
|
|
|
void _glfwPlatformRunMainLoop(GLFWtickcallback tick_callback, void* data) {
|
|
keep_going = GLFW_TRUE;
|
|
while(keep_going) {
|
|
_glfwPlatformWaitEvents();
|
|
EVDBG("loop tick");
|
|
tick_callback(data);
|
|
}
|
|
}
|
|
|
|
unsigned long long _glfwPlatformAddTimer(double interval, bool repeats, GLFWuserdatafreefun callback, void *callback_data, GLFWuserdatafreefun free_callback) {
|
|
return addTimer(&_glfw.GLFW_LOOP_BACKEND.eventLoopData, "user timer", interval, 1, repeats, callback, callback_data, free_callback);
|
|
}
|
|
|
|
void _glfwPlatformRemoveTimer(unsigned long long timer_id) {
|
|
removeTimer(&_glfw.GLFW_LOOP_BACKEND.eventLoopData, timer_id);
|
|
}
|
|
|
|
void _glfwPlatformUpdateTimer(unsigned long long timer_id, double interval, GLFWbool enabled) {
|
|
changeTimerInterval(&_glfw.GLFW_LOOP_BACKEND.eventLoopData, timer_id, interval);
|
|
toggleTimer(&_glfw.GLFW_LOOP_BACKEND.eventLoopData, timer_id, enabled);
|
|
}
|