NativeWindowAndroid.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. // Copyright (C) 2009-2023, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #include <AnKi/Core/NativeWindowAndroid.h>
  6. namespace anki {
  7. Error NativeWindow::newInstance(const NativeWindowInitInfo& initInfo, NativeWindow*& nativeWindow)
  8. {
  9. NativeWindowAndroid* andwin = static_cast<NativeWindowAndroid*>(initInfo.m_allocCallback(
  10. initInfo.m_allocCallbackUserData, nullptr, sizeof(NativeWindowAndroid), alignof(NativeWindowAndroid)));
  11. callConstructor(*andwin);
  12. const Error err = andwin->init(initInfo);
  13. if(err)
  14. {
  15. callDestructor(*andwin);
  16. initInfo.m_allocCallback(initInfo.m_allocCallbackUserData, andwin, 0, 0);
  17. nativeWindow = nullptr;
  18. return err;
  19. }
  20. else
  21. {
  22. nativeWindow = andwin;
  23. return Error::kNone;
  24. }
  25. }
  26. void NativeWindow::deleteInstance(NativeWindow* window)
  27. {
  28. if(window)
  29. {
  30. NativeWindowAndroid* self = static_cast<NativeWindowAndroid*>(window);
  31. AllocAlignedCallback callback = self->m_pool.getAllocationCallback();
  32. void* userData = self->m_pool.getAllocationCallbackUserData();
  33. callDestructor(*self);
  34. callback(userData, self, 0, 0);
  35. }
  36. }
  37. void NativeWindow::setWindowTitle([[maybe_unused]] CString title)
  38. {
  39. // Nothing
  40. }
  41. NativeWindowAndroid::~NativeWindowAndroid()
  42. {
  43. ANKI_CORE_LOGI("Destroying Android window");
  44. ANativeActivity_finish(g_androidApp->activity);
  45. // Loop until destroyRequested is set
  46. while(!g_androidApp->destroyRequested)
  47. {
  48. int ident;
  49. int events;
  50. android_poll_source* source;
  51. while((ident = ALooper_pollAll(0, nullptr, &events, reinterpret_cast<void**>(&source))) >= 0)
  52. {
  53. if(source != nullptr)
  54. {
  55. source->process(g_androidApp, source);
  56. }
  57. }
  58. }
  59. m_nativeWindow = nullptr;
  60. }
  61. Error NativeWindowAndroid::init([[maybe_unused]] const NativeWindowInitInfo& init)
  62. {
  63. ANKI_CORE_LOGI("Initializing Android window");
  64. m_pool.init(init.m_allocCallback, init.m_allocCallbackUserData);
  65. // Loop until the window is ready
  66. while(g_androidApp->window == nullptr)
  67. {
  68. int ident;
  69. int events;
  70. android_poll_source* source;
  71. const int timeoutMs = 5;
  72. while((ident = ALooper_pollAll(timeoutMs, nullptr, &events, reinterpret_cast<void**>(&source))) >= 0)
  73. {
  74. if(source != nullptr)
  75. {
  76. source->process(g_androidApp, source);
  77. }
  78. }
  79. }
  80. m_nativeWindow = g_androidApp->window;
  81. // Set some stuff
  82. m_width = ANativeWindow_getWidth(g_androidApp->window);
  83. m_height = ANativeWindow_getHeight(g_androidApp->window);
  84. return Error::kNone;
  85. }
  86. } // end namespace anki