diff --git a/backends/imgui_impl_osx.mm b/backends/imgui_impl_osx.mm index 189dd53e6..4d3c5dcf0 100644 --- a/backends/imgui_impl_osx.mm +++ b/backends/imgui_impl_osx.mm @@ -403,8 +403,33 @@ IMGUI_IMPL_API void ImGui_ImplOSX_NewFrame(void* _Nullable view) { #endif + +NSLock *ImGui_IO_lock; + + +@interface ScopedLock : NSObject +@property (strong) NSLock *lockptr; +@end + +@implementation ScopedLock + +- (id)init:(NSLock *)incoming +{ + _lockptr = incoming; + [_lockptr lock]; + return self; +} + +- (void)dealloc { + [_lockptr unlock]; +} +@end + + bool ImGui_ImplOSX_Init(NSView* view) { + ImGui_IO_lock = [[NSLock alloc] init]; + ImGuiIO& io = ImGui::GetIO(); ImGuiPlatformIO& platform_io = ImGui::GetPlatformIO(); IMGUI_CHECKVERSION(); @@ -629,8 +654,18 @@ void ImGui_ImplOSX_NewFrame(NSView* view) // Setup display size if (view) { - const float dpi = (float)[view.window backingScaleFactor]; - io.DisplaySize = ImVec2((float)view.bounds.size.width, (float)view.bounds.size.height); + dispatch_async(dispatch_get_main_queue(), ^{ + [bd->exclusive.lock lock]; + bd->exclusive.backingScaleFactor = view.window.backingScaleFactor; + bd->exclusive.bounds = view.bounds; + [bd->exclusive.lock unlock]; + }); + + [bd->exclusive.lock lock]; + const float dpi = (float) bd->exclusive.backingScaleFactor; + io.DisplaySize = ImVec2((float) bd->exclusive.bounds.size.width, bd->exclusive.bounds.size.height); + [bd->exclusive.lock unlock]; + io.DisplayFramebufferScale = ImVec2(dpi, dpi); } @@ -674,6 +709,8 @@ static bool ImGui_ImplOSX_HandleEvent(NSEvent* event, NSView* view) return false; ImGuiIO& io = ImGui::GetIO(); + ScopedLock *sclock = [[ScopedLock alloc] init:ImGui_IO_lock]; + if (event.type == NSEventTypeLeftMouseDown || event.type == NSEventTypeRightMouseDown || event.type == NSEventTypeOtherMouseDown) { int button = (int)[event buttonNumber];