Move android_main and CloseWindow() out of rcore
This commit is contained in:
parent
a0afba2de0
commit
cc5249b82c
184
src/rcore.c
184
src/rcore.c
|
|
@ -418,190 +418,6 @@ const char *TextFormat(const char *text, ...); // Formatting of text with
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
// Module Functions Definition - Window and OpenGL Context Functions
|
// Module Functions Definition - Window and OpenGL Context Functions
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
#if defined(PLATFORM_ANDROID)
|
|
||||||
// To allow easier porting to android, we allow the user to define a
|
|
||||||
// main function which we call from android_main, defined by ourselves
|
|
||||||
extern int main(int argc, char *argv[]);
|
|
||||||
|
|
||||||
void android_main(struct android_app *app)
|
|
||||||
{
|
|
||||||
char arg0[] = "raylib"; // NOTE: argv[] are mutable
|
|
||||||
CORE.Android.app = app;
|
|
||||||
|
|
||||||
// NOTE: Return from main is ignored
|
|
||||||
(void)main(1, (char *[]) { arg0, NULL });
|
|
||||||
|
|
||||||
// Request to end the native activity
|
|
||||||
ANativeActivity_finish(app->activity);
|
|
||||||
|
|
||||||
// Android ALooper_pollAll() variables
|
|
||||||
int pollResult = 0;
|
|
||||||
int pollEvents = 0;
|
|
||||||
|
|
||||||
// Waiting for application events before complete finishing
|
|
||||||
while (!app->destroyRequested)
|
|
||||||
{
|
|
||||||
while ((pollResult = ALooper_pollAll(0, NULL, &pollEvents, (void **)&CORE.Android.source)) >= 0)
|
|
||||||
{
|
|
||||||
if (CORE.Android.source != NULL) CORE.Android.source->process(app, CORE.Android.source);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: Add this to header (if apps really need it)
|
|
||||||
struct android_app *GetAndroidApp(void)
|
|
||||||
{
|
|
||||||
return CORE.Android.app;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Close window and unload OpenGL context
|
|
||||||
void CloseWindow(void)
|
|
||||||
{
|
|
||||||
#if defined(SUPPORT_GIF_RECORDING)
|
|
||||||
if (gifRecording)
|
|
||||||
{
|
|
||||||
MsfGifResult result = msf_gif_end(&gifState);
|
|
||||||
msf_gif_free(result);
|
|
||||||
gifRecording = false;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(SUPPORT_MODULE_RTEXT) && defined(SUPPORT_DEFAULT_FONT)
|
|
||||||
UnloadFontDefault(); // WARNING: Module required: rtext
|
|
||||||
#endif
|
|
||||||
|
|
||||||
rlglClose(); // De-init rlgl
|
|
||||||
|
|
||||||
#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB)
|
|
||||||
glfwDestroyWindow(CORE.Window.handle);
|
|
||||||
glfwTerminate();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(_WIN32) && defined(SUPPORT_WINMM_HIGHRES_TIMER) && !defined(SUPPORT_BUSY_WAIT_LOOP)
|
|
||||||
timeEndPeriod(1); // Restore time period
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(PLATFORM_ANDROID)
|
|
||||||
// Close surface, context and display
|
|
||||||
if (CORE.Window.device != EGL_NO_DISPLAY)
|
|
||||||
{
|
|
||||||
eglMakeCurrent(CORE.Window.device, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
|
|
||||||
|
|
||||||
if (CORE.Window.surface != EGL_NO_SURFACE)
|
|
||||||
{
|
|
||||||
eglDestroySurface(CORE.Window.device, CORE.Window.surface);
|
|
||||||
CORE.Window.surface = EGL_NO_SURFACE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (CORE.Window.context != EGL_NO_CONTEXT)
|
|
||||||
{
|
|
||||||
eglDestroyContext(CORE.Window.device, CORE.Window.context);
|
|
||||||
CORE.Window.context = EGL_NO_CONTEXT;
|
|
||||||
}
|
|
||||||
|
|
||||||
eglTerminate(CORE.Window.device);
|
|
||||||
CORE.Window.device = EGL_NO_DISPLAY;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(PLATFORM_DRM)
|
|
||||||
if (CORE.Window.prevFB)
|
|
||||||
{
|
|
||||||
drmModeRmFB(CORE.Window.fd, CORE.Window.prevFB);
|
|
||||||
CORE.Window.prevFB = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (CORE.Window.prevBO)
|
|
||||||
{
|
|
||||||
gbm_surface_release_buffer(CORE.Window.gbmSurface, CORE.Window.prevBO);
|
|
||||||
CORE.Window.prevBO = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (CORE.Window.gbmSurface)
|
|
||||||
{
|
|
||||||
gbm_surface_destroy(CORE.Window.gbmSurface);
|
|
||||||
CORE.Window.gbmSurface = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (CORE.Window.gbmDevice)
|
|
||||||
{
|
|
||||||
gbm_device_destroy(CORE.Window.gbmDevice);
|
|
||||||
CORE.Window.gbmDevice = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (CORE.Window.crtc)
|
|
||||||
{
|
|
||||||
if (CORE.Window.connector)
|
|
||||||
{
|
|
||||||
drmModeSetCrtc(CORE.Window.fd, CORE.Window.crtc->crtc_id, CORE.Window.crtc->buffer_id,
|
|
||||||
CORE.Window.crtc->x, CORE.Window.crtc->y, &CORE.Window.connector->connector_id, 1, &CORE.Window.crtc->mode);
|
|
||||||
drmModeFreeConnector(CORE.Window.connector);
|
|
||||||
CORE.Window.connector = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
drmModeFreeCrtc(CORE.Window.crtc);
|
|
||||||
CORE.Window.crtc = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (CORE.Window.fd != -1)
|
|
||||||
{
|
|
||||||
close(CORE.Window.fd);
|
|
||||||
CORE.Window.fd = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Close surface, context and display
|
|
||||||
if (CORE.Window.device != EGL_NO_DISPLAY)
|
|
||||||
{
|
|
||||||
if (CORE.Window.surface != EGL_NO_SURFACE)
|
|
||||||
{
|
|
||||||
eglDestroySurface(CORE.Window.device, CORE.Window.surface);
|
|
||||||
CORE.Window.surface = EGL_NO_SURFACE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (CORE.Window.context != EGL_NO_CONTEXT)
|
|
||||||
{
|
|
||||||
eglDestroyContext(CORE.Window.device, CORE.Window.context);
|
|
||||||
CORE.Window.context = EGL_NO_CONTEXT;
|
|
||||||
}
|
|
||||||
|
|
||||||
eglTerminate(CORE.Window.device);
|
|
||||||
CORE.Window.device = EGL_NO_DISPLAY;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(PLATFORM_DRM)
|
|
||||||
// Wait for mouse and gamepad threads to finish before closing
|
|
||||||
// NOTE: Those threads should already have finished at this point
|
|
||||||
// because they are controlled by CORE.Window.shouldClose variable
|
|
||||||
|
|
||||||
CORE.Window.shouldClose = true; // Added to force threads to exit when the close window is called
|
|
||||||
|
|
||||||
// Close the evdev keyboard
|
|
||||||
if (CORE.Input.Keyboard.fd != -1)
|
|
||||||
{
|
|
||||||
close(CORE.Input.Keyboard.fd);
|
|
||||||
CORE.Input.Keyboard.fd = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < sizeof(CORE.Input.eventWorker)/sizeof(InputEventWorker); ++i)
|
|
||||||
{
|
|
||||||
if (CORE.Input.eventWorker[i].threadId)
|
|
||||||
{
|
|
||||||
pthread_join(CORE.Input.eventWorker[i].threadId, NULL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (CORE.Input.Gamepad.threadId) pthread_join(CORE.Input.Gamepad.threadId, NULL);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(SUPPORT_EVENTS_AUTOMATION)
|
|
||||||
RL_FREE(events);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
CORE.Window.ready = false;
|
|
||||||
TRACELOG(LOG_INFO, "Window closed successfully");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if KEY_ESCAPE pressed or Close icon pressed
|
// Check if KEY_ESCAPE pressed or Close icon pressed
|
||||||
bool WindowShouldClose(void)
|
bool WindowShouldClose(void)
|
||||||
|
|
|
||||||
|
|
@ -1199,3 +1199,89 @@ static int32_t AndroidInputCallback(struct android_app *app, AInputEvent *event)
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// To allow easier porting to android, we allow the user to define a
|
||||||
|
// main function which we call from android_main, defined by ourselves
|
||||||
|
extern int main(int argc, char *argv[]);
|
||||||
|
|
||||||
|
void android_main(struct android_app *app)
|
||||||
|
{
|
||||||
|
char arg0[] = "raylib"; // NOTE: argv[] are mutable
|
||||||
|
CORE.Android.app = app;
|
||||||
|
|
||||||
|
// NOTE: Return from main is ignored
|
||||||
|
(void)main(1, (char *[]) { arg0, NULL });
|
||||||
|
|
||||||
|
// Request to end the native activity
|
||||||
|
ANativeActivity_finish(app->activity);
|
||||||
|
|
||||||
|
// Android ALooper_pollAll() variables
|
||||||
|
int pollResult = 0;
|
||||||
|
int pollEvents = 0;
|
||||||
|
|
||||||
|
// Waiting for application events before complete finishing
|
||||||
|
while (!app->destroyRequested)
|
||||||
|
{
|
||||||
|
while ((pollResult = ALooper_pollAll(0, NULL, &pollEvents, (void **)&CORE.Android.source)) >= 0)
|
||||||
|
{
|
||||||
|
if (CORE.Android.source != NULL) CORE.Android.source->process(app, CORE.Android.source);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// NOTE: Add this to header (if apps really need it)
|
||||||
|
struct android_app *GetAndroidApp(void)
|
||||||
|
{
|
||||||
|
return CORE.Android.app;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close window and unload OpenGL context
|
||||||
|
void CloseWindow(void)
|
||||||
|
{
|
||||||
|
#if defined(SUPPORT_GIF_RECORDING)
|
||||||
|
if (gifRecording)
|
||||||
|
{
|
||||||
|
MsfGifResult result = msf_gif_end(&gifState);
|
||||||
|
msf_gif_free(result);
|
||||||
|
gifRecording = false;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(SUPPORT_MODULE_RTEXT) && defined(SUPPORT_DEFAULT_FONT)
|
||||||
|
UnloadFontDefault(); // WARNING: Module required: rtext
|
||||||
|
#endif
|
||||||
|
|
||||||
|
rlglClose(); // De-init rlgl
|
||||||
|
|
||||||
|
#if defined(_WIN32) && defined(SUPPORT_WINMM_HIGHRES_TIMER) && !defined(SUPPORT_BUSY_WAIT_LOOP)
|
||||||
|
timeEndPeriod(1); // Restore time period
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Close surface, context and display
|
||||||
|
if (CORE.Window.device != EGL_NO_DISPLAY)
|
||||||
|
{
|
||||||
|
eglMakeCurrent(CORE.Window.device, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
|
||||||
|
|
||||||
|
if (CORE.Window.surface != EGL_NO_SURFACE)
|
||||||
|
{
|
||||||
|
eglDestroySurface(CORE.Window.device, CORE.Window.surface);
|
||||||
|
CORE.Window.surface = EGL_NO_SURFACE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CORE.Window.context != EGL_NO_CONTEXT)
|
||||||
|
{
|
||||||
|
eglDestroyContext(CORE.Window.device, CORE.Window.context);
|
||||||
|
CORE.Window.context = EGL_NO_CONTEXT;
|
||||||
|
}
|
||||||
|
|
||||||
|
eglTerminate(CORE.Window.device);
|
||||||
|
CORE.Window.device = EGL_NO_DISPLAY;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(SUPPORT_EVENTS_AUTOMATION)
|
||||||
|
RL_FREE(events);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
CORE.Window.ready = false;
|
||||||
|
TRACELOG(LOG_INFO, "Window closed successfully");
|
||||||
|
}
|
||||||
|
|
@ -467,3 +467,37 @@ static bool InitGraphicsDevice(int width, int height)
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Close window and unload OpenGL context
|
||||||
|
void CloseWindow(void)
|
||||||
|
{
|
||||||
|
#if defined(SUPPORT_GIF_RECORDING)
|
||||||
|
if (gifRecording)
|
||||||
|
{
|
||||||
|
MsfGifResult result = msf_gif_end(&gifState);
|
||||||
|
msf_gif_free(result);
|
||||||
|
gifRecording = false;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(SUPPORT_MODULE_RTEXT) && defined(SUPPORT_DEFAULT_FONT)
|
||||||
|
UnloadFontDefault(); // WARNING: Module required: rtext
|
||||||
|
#endif
|
||||||
|
|
||||||
|
rlglClose(); // De-init rlgl
|
||||||
|
|
||||||
|
glfwDestroyWindow(CORE.Window.handle);
|
||||||
|
glfwTerminate();
|
||||||
|
|
||||||
|
#if defined(_WIN32) && defined(SUPPORT_WINMM_HIGHRES_TIMER) && !defined(SUPPORT_BUSY_WAIT_LOOP)
|
||||||
|
timeEndPeriod(1); // Restore time period
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(SUPPORT_EVENTS_AUTOMATION)
|
||||||
|
RL_FREE(events);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
CORE.Window.ready = false;
|
||||||
|
TRACELOG(LOG_INFO, "Window closed successfully");
|
||||||
|
}
|
||||||
118
src/rcore_drm.c
118
src/rcore_drm.c
|
|
@ -884,3 +884,121 @@ static bool InitGraphicsDevice(int width, int height)
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Close window and unload OpenGL context
|
||||||
|
void CloseWindow(void)
|
||||||
|
{
|
||||||
|
#if defined(SUPPORT_GIF_RECORDING)
|
||||||
|
if (gifRecording)
|
||||||
|
{
|
||||||
|
MsfGifResult result = msf_gif_end(&gifState);
|
||||||
|
msf_gif_free(result);
|
||||||
|
gifRecording = false;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(SUPPORT_MODULE_RTEXT) && defined(SUPPORT_DEFAULT_FONT)
|
||||||
|
UnloadFontDefault(); // WARNING: Module required: rtext
|
||||||
|
#endif
|
||||||
|
|
||||||
|
rlglClose(); // De-init rlgl
|
||||||
|
|
||||||
|
#if defined(_WIN32) && defined(SUPPORT_WINMM_HIGHRES_TIMER) && !defined(SUPPORT_BUSY_WAIT_LOOP)
|
||||||
|
timeEndPeriod(1); // Restore time period
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
if (CORE.Window.prevFB)
|
||||||
|
{
|
||||||
|
drmModeRmFB(CORE.Window.fd, CORE.Window.prevFB);
|
||||||
|
CORE.Window.prevFB = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CORE.Window.prevBO)
|
||||||
|
{
|
||||||
|
gbm_surface_release_buffer(CORE.Window.gbmSurface, CORE.Window.prevBO);
|
||||||
|
CORE.Window.prevBO = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CORE.Window.gbmSurface)
|
||||||
|
{
|
||||||
|
gbm_surface_destroy(CORE.Window.gbmSurface);
|
||||||
|
CORE.Window.gbmSurface = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CORE.Window.gbmDevice)
|
||||||
|
{
|
||||||
|
gbm_device_destroy(CORE.Window.gbmDevice);
|
||||||
|
CORE.Window.gbmDevice = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CORE.Window.crtc)
|
||||||
|
{
|
||||||
|
if (CORE.Window.connector)
|
||||||
|
{
|
||||||
|
drmModeSetCrtc(CORE.Window.fd, CORE.Window.crtc->crtc_id, CORE.Window.crtc->buffer_id,
|
||||||
|
CORE.Window.crtc->x, CORE.Window.crtc->y, &CORE.Window.connector->connector_id, 1, &CORE.Window.crtc->mode);
|
||||||
|
drmModeFreeConnector(CORE.Window.connector);
|
||||||
|
CORE.Window.connector = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
drmModeFreeCrtc(CORE.Window.crtc);
|
||||||
|
CORE.Window.crtc = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CORE.Window.fd != -1)
|
||||||
|
{
|
||||||
|
close(CORE.Window.fd);
|
||||||
|
CORE.Window.fd = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close surface, context and display
|
||||||
|
if (CORE.Window.device != EGL_NO_DISPLAY)
|
||||||
|
{
|
||||||
|
if (CORE.Window.surface != EGL_NO_SURFACE)
|
||||||
|
{
|
||||||
|
eglDestroySurface(CORE.Window.device, CORE.Window.surface);
|
||||||
|
CORE.Window.surface = EGL_NO_SURFACE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CORE.Window.context != EGL_NO_CONTEXT)
|
||||||
|
{
|
||||||
|
eglDestroyContext(CORE.Window.device, CORE.Window.context);
|
||||||
|
CORE.Window.context = EGL_NO_CONTEXT;
|
||||||
|
}
|
||||||
|
|
||||||
|
eglTerminate(CORE.Window.device);
|
||||||
|
CORE.Window.device = EGL_NO_DISPLAY;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait for mouse and gamepad threads to finish before closing
|
||||||
|
// NOTE: Those threads should already have finished at this point
|
||||||
|
// because they are controlled by CORE.Window.shouldClose variable
|
||||||
|
|
||||||
|
CORE.Window.shouldClose = true; // Added to force threads to exit when the close window is called
|
||||||
|
|
||||||
|
// Close the evdev keyboard
|
||||||
|
if (CORE.Input.Keyboard.fd != -1)
|
||||||
|
{
|
||||||
|
close(CORE.Input.Keyboard.fd);
|
||||||
|
CORE.Input.Keyboard.fd = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < sizeof(CORE.Input.eventWorker)/sizeof(InputEventWorker); ++i)
|
||||||
|
{
|
||||||
|
if (CORE.Input.eventWorker[i].threadId)
|
||||||
|
{
|
||||||
|
pthread_join(CORE.Input.eventWorker[i].threadId, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CORE.Input.Gamepad.threadId) pthread_join(CORE.Input.Gamepad.threadId, NULL);
|
||||||
|
|
||||||
|
#if defined(SUPPORT_EVENTS_AUTOMATION)
|
||||||
|
RL_FREE(events);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
CORE.Window.ready = false;
|
||||||
|
TRACELOG(LOG_INFO, "Window closed successfully");
|
||||||
|
}
|
||||||
|
|
@ -1041,3 +1041,36 @@ static bool InitGraphicsDevice(int width, int height)
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Close window and unload OpenGL context
|
||||||
|
void CloseWindow(void)
|
||||||
|
{
|
||||||
|
#if defined(SUPPORT_GIF_RECORDING)
|
||||||
|
if (gifRecording)
|
||||||
|
{
|
||||||
|
MsfGifResult result = msf_gif_end(&gifState);
|
||||||
|
msf_gif_free(result);
|
||||||
|
gifRecording = false;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(SUPPORT_MODULE_RTEXT) && defined(SUPPORT_DEFAULT_FONT)
|
||||||
|
UnloadFontDefault(); // WARNING: Module required: rtext
|
||||||
|
#endif
|
||||||
|
|
||||||
|
rlglClose(); // De-init rlgl
|
||||||
|
|
||||||
|
glfwDestroyWindow(CORE.Window.handle);
|
||||||
|
glfwTerminate();
|
||||||
|
|
||||||
|
#if defined(_WIN32) && defined(SUPPORT_WINMM_HIGHRES_TIMER) && !defined(SUPPORT_BUSY_WAIT_LOOP)
|
||||||
|
timeEndPeriod(1); // Restore time period
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(SUPPORT_EVENTS_AUTOMATION)
|
||||||
|
RL_FREE(events);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
CORE.Window.ready = false;
|
||||||
|
TRACELOG(LOG_INFO, "Window closed successfully");
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user