mirror of
https://github.com/QB64-Phoenix-Edition/QB64pe.git
synced 2024-09-20 09:04:43 +00:00
72193e34e5
This fixes all the code so that all the calls to glut functions happen on the same thread that is running GLUT. We achieve this by creating a queue of GLUT commands to execute. Commands can be added to the queue anywhere in the code, and then the queue is processed on the GLUT thread via it's idle func or timer func. The command is run and if necessary the result is provided in the message queue object. Each object contains a completion which can be waited on to block until the GLUT thread has processed the command. Fixes: #66
45 lines
1.5 KiB
C
45 lines
1.5 KiB
C
#ifndef INCLUDE_LIBQB_GLUT_THREAD_H
|
|
#define INCLUDE_LIBQB_GLUT_THREAD_H
|
|
|
|
// Called to potentially setup GLUT before starting the program.
|
|
void libqb_glut_presetup(int argc, char **argv);
|
|
|
|
// Starts the "main thread", including handling all the GLUT setup.
|
|
void libqb_start_main_thread(int argc, char **argv);
|
|
|
|
// Used to support _ScreenShow, which can start the GLUT thread after the
|
|
// program is started
|
|
void libqb_start_glut_thread();
|
|
|
|
// Indicates whether GLUT is currently running (and thus whether we're able to
|
|
// do any GLUT-related stuff
|
|
bool libqb_is_glut_up();
|
|
|
|
// Called at consistent intervals from a GLUT callback
|
|
void libqb_process_glut_queue();
|
|
|
|
// These functions perform the same actions as their coresponding glut* functions.
|
|
// They tell the GLUT thread to perform the command, returning the result if applicable
|
|
void libqb_glut_set_cursor(int style);
|
|
void libqb_glut_warp_pointer(int x, int y);
|
|
int libqb_glut_get(int id);
|
|
void libqb_glut_iconify_window();
|
|
void libqb_glut_position_window(int x, int y);
|
|
void libqb_glut_show_window();
|
|
void libqb_glut_hide_window();
|
|
void libqb_glut_set_window_title(const char *title);
|
|
|
|
// Convinence macros, exists a function depending on the state of GLUT
|
|
#define NEEDS_GLUT(error_result) do { \
|
|
if (!libqb_is_glut_up()) { \
|
|
error(5); \
|
|
return error_result; \
|
|
} \
|
|
} while (0)
|
|
|
|
#define OPTIONAL_GLUT(result) do { \
|
|
if (!libqb_is_glut_up()) \
|
|
return result; \
|
|
} while (0)
|
|
|
|
#endif
|