diff --git a/source/utils/CarlaJuceUtils.hpp b/source/utils/CarlaJuceUtils.hpp index b1bcf00e8..d0f678de4 100644 --- a/source/utils/CarlaJuceUtils.hpp +++ b/source/utils/CarlaJuceUtils.hpp @@ -31,6 +31,10 @@ #define CARLA_JOIN_MACRO_HELPER(a, b) a ## b #define CARLA_JOIN_MACRO(item1, item2) CARLA_JOIN_MACRO_HELPER(item1, item2) +/** Same but for joining 3 items */ +#define CARLA_JOIN_MACRO_HELPER3(a, b, c) a ## b ## c +#define CARLA_JOIN_MACRO3(item1, item2, item3) CARLA_JOIN_MACRO_HELPER3(item1, item2, item3) + #ifdef DEBUG /** This macro lets you embed a leak-detecting object inside a class. To use it, simply declare a CARLA_LEAK_DETECTOR(YourClassName) inside a private section diff --git a/source/utils/CarlaPluginUI.cpp b/source/utils/CarlaPluginUI.cpp index 54715f17b..fcf47c84a 100644 --- a/source/utils/CarlaPluginUI.cpp +++ b/source/utils/CarlaPluginUI.cpp @@ -496,11 +496,14 @@ private: #ifdef CARLA_OS_MAC #if defined(BUILD_BRIDGE_ALTERNATIVE_ARCH) -# define CarlaPluginWindow CARLA_JOIN_MACRO(CarlaPluginWindowBridgedArch, CARLA_PLUGIN_UI_CLASS_PREFIX) +# define CarlaPluginWindow CARLA_JOIN_MACRO3(CarlaPluginWindowBridgedArch, CARLA_BACKEND_NAMESPACE, CARLA_PLUGIN_UI_CLASS_PREFIX) +# define CarlaPluginWindowDelegate CARLA_JOIN_MACRO3(CarlaPluginWindowDelegateBridgedArch, CARLA_BACKEND_NAMESPACE, CARLA_PLUGIN_UI_CLASS_PREFIX) #elif defined(BUILD_BRIDGE) -# define CarlaPluginWindow CARLA_JOIN_MACRO(CarlaPluginWindowBridged, CARLA_PLUGIN_UI_CLASS_PREFIX) +# define CarlaPluginWindow CARLA_JOIN_MACRO3(CarlaPluginWindowBridged, CARLA_BACKEND_NAMESPACE, CARLA_PLUGIN_UI_CLASS_PREFIX) +# define CarlaPluginWindowDelegate CARLA_JOIN_MACRO3(CarlaPluginWindowDelegateBridged, CARLA_BACKEND_NAMESPACE, CARLA_PLUGIN_UI_CLASS_PREFIX) #else -# define CarlaPluginWindow CARLA_JOIN_MACRO(CarlaPluginWindow, CARLA_PLUGIN_UI_CLASS_PREFIX) +# define CarlaPluginWindow CARLA_JOIN_MACRO3(CarlaPluginWindow, CARLA_BACKEND_NAMESPACE, CARLA_PLUGIN_UI_CLASS_PREFIX) +# define CarlaPluginWindowDelegate CARLA_JOIN_MACRO3(CarlaPluginWindowDelegate, CARLA_BACKEND_NAMESPACE, CARLA_PLUGIN_UI_CLASS_PREFIX) #endif @interface CarlaPluginWindow : NSWindow @@ -552,6 +555,7 @@ private: - (instancetype)initWithWindowAndCallback:(CarlaPluginWindow*)window callback:(CarlaPluginUI::Callback*)callback2; - (BOOL)windowShouldClose:(id)sender; +- (NSSize)windowWillResize:(NSWindow*)sender toSize:(NSSize)frameSize; @end @implementation CarlaPluginWindowDelegate @@ -579,26 +583,36 @@ private: (void)sender; } -@end - -@interface CarlaPluginView : NSView -- (void)resizeWithOldSuperviewSize:(NSSize)oldSize; -@end +- (NSSize)windowWillResize:(NSWindow*)sender toSize:(NSSize)frameSize +{ + for (NSView* subview in [[window contentView] subviews]) + { + const NSSize minSize = [subview fittingSize]; + if (frameSize.width < minSize.width) + frameSize.width = minSize.width; + if (frameSize.height < minSize.height) + frameSize.height = minSize.height; + break; + } -@implementation CarlaPluginView + return frameSize; +} -- (void)resizeWithOldSuperviewSize:(NSSize)oldSize +/* +- (void)windowDidResize:(NSWindow*)sender { - [super resizeWithOldSuperviewSize:oldSize]; + carla_stdout("window did resize %p %f %f", sender, [window frame].size.width, [window frame].size.height); - /* - for (NSView* subview in [self subviews]) + const NSSize size = [window frame].size; + NSView* const view = [window contentView]; + + for (NSView* subview in [view subviews]) { - [subview setFrame:NSMakeRect(0, 0, oldSize.width, oldSize.height)]; + [subview setFrameSize:size]; break; } - */ } +*/ @end @@ -615,7 +629,7 @@ public: const CarlaBackend::AutoNSAutoreleasePool arp; [NSApplication sharedApplication]; - fView = [[CarlaPluginView new]retain]; + fView = [[NSView new]retain]; CARLA_SAFE_ASSERT_RETURN(fView != nullptr,) uint style = NSClosableWindowMask | NSTitledWindowMask; @@ -640,13 +654,26 @@ public: return; } - ((NSWindow*)fWindow).delegate = [[[CarlaPluginWindowDelegate alloc] + ((NSWindow*)fWindow).delegate = [[[CarlaPluginWindowDelegate alloc] initWithWindowAndCallback:fWindow callback:callback] retain]; - // if (! isResizable) + /* + if (isResizable) + { + [fView setAutoresizingMask:(NSViewWidthSizable | + NSViewHeightSizable | + NSViewMinXMargin | + NSViewMaxXMargin | + NSViewMinYMargin | + NSViewMaxYMargin)]; + [fView setAutoresizesSubviews:YES]; + } + else + */ { [fView setAutoresizingMask:NSViewNotSizable]; + [fView setAutoresizesSubviews:NO]; [[fWindow standardWindowButton:NSWindowZoomButton] setHidden:YES]; } @@ -702,6 +729,19 @@ public: void idle() override { // carla_debug("CocoaPluginUI::idle()"); + + for (NSView* subview in [fView subviews]) + { + const NSSize viewSize = [fView frame].size; + const NSSize subviewSize = [subview frame].size; + + if (viewSize.width != subviewSize.width || viewSize.height != subviewSize.height) + { + [fView setFrameSize:subviewSize]; + [fWindow setContentSize:subviewSize]; + } + break; + } } void focus() override @@ -720,17 +760,21 @@ public: CARLA_SAFE_ASSERT_RETURN(fWindow != nullptr,); CARLA_SAFE_ASSERT_RETURN(fView != nullptr,); - [fView setFrame:NSMakeRect(0, 0, width, height)]; + const NSSize size = NSMakeSize(width, height); - for (NSView* subview in [fView subviews]) + [fView setFrameSize:size]; + [fWindow setContentSize:size]; + + // this is needed for a few plugins + if (forceUpdate) { - [subview setFrame:NSMakeRect(0, 0, width, height)]; - break; + for (NSView* subview in [fView subviews]) + { + [subview setFrame:[fView frame]]; + break; + } } - const NSSize size = NSMakeSize(width, height); - [fWindow setContentSize:size]; - /* if (fIsResizable) {