mirror of
				https://github.com/ocornut/imgui.git
				synced 2025-10-26 12:27:30 +00:00 
			
		
		
		
	Examples: Fix for Emscripten. GLFW+WGPU: rework examples main loop to handle minimization. (#7844)
Amend8874787,71ee2ceAmendea39841f(emscripten_mainloop_stub.h)
This commit is contained in:
		| @@ -151,6 +151,11 @@ int main(int, char**) | |||||||
|         // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data. |         // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data. | ||||||
|         // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. |         // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. | ||||||
|         glfwPollEvents(); |         glfwPollEvents(); | ||||||
|  |         if (glfwGetWindowAttrib(window, GLFW_ICONIFIED) != 0) | ||||||
|  |         { | ||||||
|  |             ImGui_ImplGlfw_Sleep(10); | ||||||
|  |             continue; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         // React to changes in screen size |         // React to changes in screen size | ||||||
|         int width, height; |         int width, height; | ||||||
|   | |||||||
| @@ -167,6 +167,9 @@ int main(int, char**) | |||||||
|         ImGui_ImplSDLRenderer3_RenderDrawData(ImGui::GetDrawData(), renderer); |         ImGui_ImplSDLRenderer3_RenderDrawData(ImGui::GetDrawData(), renderer); | ||||||
|         SDL_RenderPresent(renderer); |         SDL_RenderPresent(renderer); | ||||||
|     } |     } | ||||||
|  | #ifdef __EMSCRIPTEN__ | ||||||
|  |     EMSCRIPTEN_MAINLOOP_END; | ||||||
|  | #endif | ||||||
|  |  | ||||||
|     // Cleanup |     // Cleanup | ||||||
|     ImGui_ImplSDLRenderer3_Shutdown(); |     ImGui_ImplSDLRenderer3_Shutdown(); | ||||||
|   | |||||||
| @@ -17,20 +17,21 @@ | |||||||
| // - So the next logical step was to refactor all examples to follow that layout of using a "main loop" function. | // - So the next logical step was to refactor all examples to follow that layout of using a "main loop" function. | ||||||
| //   This worked, but it made us lose all the nice things we had... | //   This worked, but it made us lose all the nice things we had... | ||||||
|  |  | ||||||
| // Since only about 3 examples really need to run with Emscripten, here's our solution: | // Since only about 4 examples really need to run with Emscripten, here's our solution: | ||||||
| // - Use some weird macros and capturing lambda to turn a loop in main() into a function. | // - Use some weird macros and capturing lambda to turn a loop in main() into a function. | ||||||
| // - Hide all that crap in this file so it doesn't make our examples unusually ugly. | // - Hide all that crap in this file so it doesn't make our examples unusually ugly. | ||||||
| //   As a stance and principle of Dear ImGui development we don't use C++ headers and we don't | //   As a stance and principle of Dear ImGui development we don't use C++ headers and we don't | ||||||
| //   want to suggest to the newcomer that we would ever use C++ headers as this would affect | //   want to suggest to the newcomer that we would ever use C++ headers as this would affect | ||||||
| //   the initial judgment of many of our target audience. | //   the initial judgment of many of our target audience. | ||||||
| // - Technique is based on this idea: https://github.com/ocornut/imgui/pull/2492/ | // - Technique is based on this idea: https://github.com/ocornut/imgui/pull/2492/ | ||||||
|  | // - The do { } while (0) is to allow our code calling continue in the main loop. | ||||||
| #ifdef __EMSCRIPTEN__ | #ifdef __EMSCRIPTEN__ | ||||||
| #include <emscripten.h> | #include <emscripten.h> | ||||||
| #include <functional> | #include <functional> | ||||||
| static std::function<void()>            MainLoopForEmscriptenP; | static std::function<void()>            MainLoopForEmscriptenP; | ||||||
| static void MainLoopForEmscripten()     { MainLoopForEmscriptenP(); } | static void MainLoopForEmscripten()     { MainLoopForEmscriptenP(); } | ||||||
| #define EMSCRIPTEN_MAINLOOP_BEGIN       MainLoopForEmscriptenP = [&]() | #define EMSCRIPTEN_MAINLOOP_BEGIN       MainLoopForEmscriptenP = [&]() { do | ||||||
| #define EMSCRIPTEN_MAINLOOP_END         ; emscripten_set_main_loop(MainLoopForEmscripten, 0, true) | #define EMSCRIPTEN_MAINLOOP_END         while (0); }; emscripten_set_main_loop(MainLoopForEmscripten, 0, true) | ||||||
| #else | #else | ||||||
| #define EMSCRIPTEN_MAINLOOP_BEGIN | #define EMSCRIPTEN_MAINLOOP_BEGIN | ||||||
| #define EMSCRIPTEN_MAINLOOP_END | #define EMSCRIPTEN_MAINLOOP_END | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 ocornut
					ocornut