From ce2f948c296217ac722215eacd9682b5d3e94171 Mon Sep 17 00:00:00 2001 From: Luiz Sardinha Date: Sun, 6 Sep 2026 17:10:54 +0200 Subject: [PATCH] fix(mac): run event queue events in autoreleasepool --- src/lib/base/CMakeLists.txt | 10 +++++++++- src/lib/base/EventQueue.cpp | 31 ++++++++++++++++++++---------- src/lib/base/OSXAutoReleasePool.h | 16 +++++++++++++++ src/lib/base/OSXAutoReleasePool.mm | 20 +++++++++++++++++++ 4 files changed, 66 insertions(+), 11 deletions(-) create mode 100644 src/lib/base/OSXAutoReleasePool.h create mode 100644 src/lib/base/OSXAutoReleasePool.mm diff --git a/src/lib/base/CMakeLists.txt b/src/lib/base/CMakeLists.txt index 57fe4fe50..acf04b972 100644 --- a/src/lib/base/CMakeLists.txt +++ b/src/lib/base/CMakeLists.txt @@ -1,9 +1,17 @@ +# SPDX-FileCopyrightText: (C) 2026 Deskflow Developers # SPDX-FileCopyrightText: (C) 2024 Chris Rizzitello # SPDX-FileCopyrightText: (C) 2012 - 2024 Symless Ltd # SPDX-FileCopyrightText: (C) 2009 - 2012 Nick Bolton # SPDX-License-Identifier: MIT -add_library(base STATIC +if(APPLE) + set(PLATFORM_CODE + OSXAutoReleasePool.h + OSXAutoReleasePool.mm + ) +endif() + +add_library(base STATIC ${PLATFORM_CODE} BaseException.cpp BaseException.h DirectionTypes.h diff --git a/src/lib/base/EventQueue.cpp b/src/lib/base/EventQueue.cpp index 638e39fe9..9af1a76b4 100644 --- a/src/lib/base/EventQueue.cpp +++ b/src/lib/base/EventQueue.cpp @@ -18,6 +18,10 @@ #include +#if defined(__APPLE__) +#include "base/OSXAutoReleasePool.h" +#endif + // interrupt handler. this just adds a quit event to the queue. static void interrupt(Arch::ThreadSignal, void *data) { @@ -166,16 +170,23 @@ bool EventQueue::getEvent(Event &event, double timeout) bool EventQueue::dispatchEvent(const Event &event) { - void *target = event.getTarget(); - if (auto typeHandler = getHandler(event.getType(), target); typeHandler.has_value()) { - (*typeHandler)(event); - return true; - } - if (auto anyHandler = getHandler(EventTypes::Unknown, target); anyHandler.has_value()) { - (*anyHandler)(event); - return true; - } - return false; +#if defined(__APPLE__) + auto dispatch = [&] { +#endif + void *target = event.getTarget(); + if (auto typeHandler = getHandler(event.getType(), target); typeHandler.has_value()) { + (*typeHandler)(event); + return true; + } + if (auto anyHandler = getHandler(EventTypes::Unknown, target); anyHandler.has_value()) { + (*anyHandler)(event); + return true; + } + return false; +#if defined(__APPLE__) + }; + return deskflow::runInAutoReleasePool(dispatch); +#endif } void EventQueue::addEvent(Event &&event) diff --git a/src/lib/base/OSXAutoReleasePool.h b/src/lib/base/OSXAutoReleasePool.h new file mode 100644 index 000000000..721425c34 --- /dev/null +++ b/src/lib/base/OSXAutoReleasePool.h @@ -0,0 +1,16 @@ +/* + * Deskflow -- mouse and keyboard sharing utility + * SPDX-FileCopyrightText: (C) 2026 Deskflow Developers + * SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception + */ + +#pragma once + +#include + +namespace deskflow { + +//! Run \p fn inside an Objective-C \c \@autoreleasepool block. +bool runInAutoReleasePool(const std::function &fn); + +} // namespace deskflow diff --git a/src/lib/base/OSXAutoReleasePool.mm b/src/lib/base/OSXAutoReleasePool.mm new file mode 100644 index 000000000..7da058930 --- /dev/null +++ b/src/lib/base/OSXAutoReleasePool.mm @@ -0,0 +1,20 @@ +/* + * Deskflow -- mouse and keyboard sharing utility + * SPDX-FileCopyrightText: (C) 2026 Deskflow Developers + * SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception + */ + +#import "base/OSXAutoReleasePool.h" + +#import + +namespace deskflow { + +bool runInAutoReleasePool(const std::function &fn) +{ + @autoreleasepool { + return fn(); + } +} + +} // namespace deskflow