Browse Source

macOS plugin UI fixes

tags/v2.4.2
falkTX 3 years ago
parent
commit
b7d2d7b0d0
2 changed files with 73 additions and 25 deletions
  1. +4
    -0
      source/utils/CarlaJuceUtils.hpp
  2. +69
    -25
      source/utils/CarlaPluginUI.cpp

+ 4
- 0
source/utils/CarlaJuceUtils.hpp View File

@@ -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


+ 69
- 25
source/utils/CarlaPluginUI.cpp View File

@@ -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)
{


Loading…
Cancel
Save