diff --git a/src/qt/CMakeLists.txt b/src/qt/CMakeLists.txt index 032386152..4dd075e34 100644 --- a/src/qt/CMakeLists.txt +++ b/src/qt/CMakeLists.txt @@ -119,6 +119,7 @@ endif() if (UNIX AND NOT APPLE) find_package(X11 REQUIRED) target_link_libraries(ui PRIVATE X11::X11) + find_package(ECM NO_MODULE) if (ECM_FOUND) list(APPEND CMAKE_MODULE_PATH ${ECM_MODULE_PATH}) diff --git a/src/qt/cpp11_thread.cpp b/src/qt/cpp11_thread.cpp index 270832f10..96eb4a2e1 100644 --- a/src/qt/cpp11_thread.cpp +++ b/src/qt/cpp11_thread.cpp @@ -1,5 +1,4 @@ #include -#include #include #include @@ -9,7 +8,7 @@ struct event_cpp11_t { std::condition_variable cond; std::mutex mutex; - std::atomic_bool state = false; + bool state = false; }; extern "C" { @@ -89,7 +88,7 @@ thread_wait_event(event_t *handle, int timeout) auto lock = std::unique_lock(event->mutex); if (timeout < 0) { - event->cond.wait(lock, [=] { return event->state.load(); }); + event->cond.wait(lock, [event] { return event->state; }); } else { auto to = std::chrono::system_clock::now() + std::chrono::milliseconds(timeout); std::cv_status status; @@ -109,7 +108,10 @@ void thread_set_event(event_t *handle) { auto event = reinterpret_cast(handle); - event->state = true; + { + auto lock = std::unique_lock(event->mutex); + event->state = true; + } event->cond.notify_all(); } @@ -117,6 +119,7 @@ void thread_reset_event(event_t *handle) { auto event = reinterpret_cast(handle); + auto lock = std::unique_lock(event->mutex); event->state = false; } diff --git a/src/qt/qt_gleswidget.cpp b/src/qt/qt_gleswidget.cpp index 5bab0910d..2348dc27e 100644 --- a/src/qt/qt_gleswidget.cpp +++ b/src/qt/qt_gleswidget.cpp @@ -67,7 +67,7 @@ void GLESWidget::paintGL() { std::scoped_lock lock(image_mx); QPainter painter(this); - painter.drawImage(QRect(0, 0, width(), height()), m_image.convertToFormat(QImage::Format_RGBX8888), QRect(sx, sy, sw, sh)); + painter.drawImage(QRect(0, 0, width(), height()), m_image, QRect(sx, sy, sw, sh)); } void GLESWidget::mouseReleaseEvent(QMouseEvent *event) @@ -141,12 +141,9 @@ void GLESWidget::qt_real_blit(int x, int y, int w, int h) sy = y; sw = this->w = w; sh = this->h = h; - static auto imagebits = m_image.bits(); - for (int y1 = y; y1 < (y + h - 1); y1++) - { - auto scanline = imagebits + (y1 * (2048 + 64) * 4); - video_copy(scanline + (x * 4), &(buffer32->line[y1][x]), w * 4); - } + auto imagebits = m_image.bits(); + video_copy(imagebits + y * ((2048 + 64) * 4) + x * 4, &(buffer32->line[y][x]), h * (2048 + 64) * sizeof(uint32_t)); + if (screenshots) { video_screenshot((uint32_t *)imagebits, 0, 0, 2048 + 64);