diff --git a/dev/CMakeLists.txt b/dev/CMakeLists.txt index 4895ce0..61704c9 100644 --- a/dev/CMakeLists.txt +++ b/dev/CMakeLists.txt @@ -45,7 +45,8 @@ else() endif() add_custom_target(CopyHeader - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/olcPixelGameEngine3.h ${REPO_ROOT_DIR}/olcPixelGameEngine3.h + BYPRODUCTS ${REPO_ROOT_DIR}/olcPixelGameEngine3.h + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_BINARY_DIR}/olcPixelGameEngine3.h ${REPO_ROOT_DIR}/olcPixelGameEngine3.h DEPENDS olcPixelGameEngine3.h ) diff --git a/dev/src/host_lin_wayland.cpp b/dev/src/host_lin_wayland.cpp index 831cef3..84300f0 100644 --- a/dev/src/host_lin_wayland.cpp +++ b/dev/src/host_lin_wayland.cpp @@ -219,7 +219,7 @@ namespace olc::host { pPrimaryPGE->OnPreContextStart(); - // Create system thread - handles gpu context + // Create system thread - handles gpu context std::thread threadSystem([this]() { // Notify start of system thread @@ -247,11 +247,16 @@ namespace olc::host } }); + pollfd decor_wl_fd {.fd = libdecor_get_fd(decor_context), .events = POLLIN}; + bool keep_running = true; while(systemActive && keep_running) { if(decor_context) { - std::lock_guard l{decor_mutex}; - keep_running = libdecor_dispatch(decor_context, 0) >= 0; + poll(&decor_wl_fd, 1, -1); + { + std::lock_guard l{decor_mutex}; + keep_running = libdecor_dispatch(decor_context, 0) >= 0; + } } } diff --git a/dev/src/host_lin_wayland.h b/dev/src/host_lin_wayland.h index acbd1ea..d5f4100 100644 --- a/dev/src/host_lin_wayland.h +++ b/dev/src/host_lin_wayland.h @@ -29,6 +29,7 @@ #include #include #include +#include #include "libdecor.h" diff --git a/dev/src/host_lin_x11.cpp b/dev/src/host_lin_x11.cpp index cb6866c..750f669 100644 --- a/dev/src/host_lin_x11.cpp +++ b/dev/src/host_lin_x11.cpp @@ -131,6 +131,10 @@ namespace olc::host return nullptr; }; + // Create a pollfd that we will use later to wait for events to appear on the queue + // preventing the event loop from becoming a busy loop + pollfd x11_connection_fd {.fd = ConnectionNumber(olc_Display), .events = POLLIN}; + X11::XEvent xev; while(systemActive){ while (XPending(olc_Display)) @@ -297,6 +301,9 @@ namespace olc::host } } } + + // Wait until an event appears on the x11 event queue file descriptor + poll(&x11_connection_fd, 1, -1); } systemActive = false; diff --git a/dev/src/host_lin_x11.h b/dev/src/host_lin_x11.h index 832f268..f5604bd 100644 --- a/dev/src/host_lin_x11.h +++ b/dev/src/host_lin_x11.h @@ -16,6 +16,7 @@ //! START DECLARATION #include +#include namespace X11 { #include diff --git a/olcPixelGameEngine3.h b/olcPixelGameEngine3.h index 2b919d7..84de689 100644 --- a/olcPixelGameEngine3.h +++ b/olcPixelGameEngine3.h @@ -5965,6 +5965,7 @@ namespace olc #if OLC_HOST == OLC_HOST_LINUX_X11 #include +#include namespace X11 { #include @@ -6057,6 +6058,7 @@ namespace olc::host #include #include #include +#include #include "libdecor.h" @@ -12365,6 +12367,10 @@ namespace olc::host return nullptr; }; + // Create a pollfd that we will use later to wait for events to appear on the queue + // preventing the event loop from becoming a busy loop + pollfd x11_connection_fd {.fd = ConnectionNumber(olc_Display), .events = POLLIN}; + X11::XEvent xev; while(systemActive){ while (XPending(olc_Display)) @@ -12531,6 +12537,9 @@ namespace olc::host } } } + + // Wait until an event appears on the x11 event queue file descriptor + poll(&x11_connection_fd, 1, -1); } systemActive = false; @@ -13095,7 +13104,7 @@ namespace olc::host { pPrimaryPGE->OnPreContextStart(); - // Create system thread - handles gpu context + // Create system thread - handles gpu context std::thread threadSystem([this]() { // Notify start of system thread @@ -13123,11 +13132,16 @@ namespace olc::host } }); + pollfd decor_wl_fd {.fd = libdecor_get_fd(decor_context), .events = POLLIN}; + bool keep_running = true; while(systemActive && keep_running) { if(decor_context) { - std::lock_guard l{decor_mutex}; - keep_running = libdecor_dispatch(decor_context, 0) >= 0; + poll(&decor_wl_fd, 1, -1); + { + std::lock_guard l{decor_mutex}; + keep_running = libdecor_dispatch(decor_context, 0) >= 0; + } } }