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_HELPER(a, b) a ## b
#define CARLA_JOIN_MACRO(item1, item2) CARLA_JOIN_MACRO_HELPER(item1, item2) #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 #ifdef DEBUG
/** This macro lets you embed a leak-detecting object inside a class. /** 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 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 #ifdef CARLA_OS_MAC


#if defined(BUILD_BRIDGE_ALTERNATIVE_ARCH) #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) #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 #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 #endif


@interface CarlaPluginWindow : NSWindow @interface CarlaPluginWindow : NSWindow
@@ -552,6 +555,7 @@ private:
- (instancetype)initWithWindowAndCallback:(CarlaPluginWindow*)window - (instancetype)initWithWindowAndCallback:(CarlaPluginWindow*)window
callback:(CarlaPluginUI::Callback*)callback2; callback:(CarlaPluginUI::Callback*)callback2;
- (BOOL)windowShouldClose:(id)sender; - (BOOL)windowShouldClose:(id)sender;
- (NSSize)windowWillResize:(NSWindow*)sender toSize:(NSSize)frameSize;
@end @end


@implementation CarlaPluginWindowDelegate @implementation CarlaPluginWindowDelegate
@@ -579,26 +583,36 @@ private:
(void)sender; (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; break;
} }
*/
} }
*/


@end @end


@@ -615,7 +629,7 @@ public:
const CarlaBackend::AutoNSAutoreleasePool arp; const CarlaBackend::AutoNSAutoreleasePool arp;
[NSApplication sharedApplication]; [NSApplication sharedApplication];


fView = [[CarlaPluginView new]retain];
fView = [[NSView new]retain];
CARLA_SAFE_ASSERT_RETURN(fView != nullptr,) CARLA_SAFE_ASSERT_RETURN(fView != nullptr,)


uint style = NSClosableWindowMask | NSTitledWindowMask; uint style = NSClosableWindowMask | NSTitledWindowMask;
@@ -640,13 +654,26 @@ public:
return; return;
} }


((NSWindow*)fWindow).delegate = [[[CarlaPluginWindowDelegate alloc]
((NSWindow*)fWindow).delegate = [[[CarlaPluginWindowDelegate alloc]
initWithWindowAndCallback:fWindow initWithWindowAndCallback:fWindow
callback:callback] retain]; callback:callback] retain];


// if (! isResizable)
/*
if (isResizable)
{
[fView setAutoresizingMask:(NSViewWidthSizable |
NSViewHeightSizable |
NSViewMinXMargin |
NSViewMaxXMargin |
NSViewMinYMargin |
NSViewMaxYMargin)];
[fView setAutoresizesSubviews:YES];
}
else
*/
{ {
[fView setAutoresizingMask:NSViewNotSizable]; [fView setAutoresizingMask:NSViewNotSizable];
[fView setAutoresizesSubviews:NO];
[[fWindow standardWindowButton:NSWindowZoomButton] setHidden:YES]; [[fWindow standardWindowButton:NSWindowZoomButton] setHidden:YES];
} }


@@ -702,6 +729,19 @@ public:
void idle() override void idle() override
{ {
// carla_debug("CocoaPluginUI::idle()"); // 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 void focus() override
@@ -720,17 +760,21 @@ public:
CARLA_SAFE_ASSERT_RETURN(fWindow != nullptr,); CARLA_SAFE_ASSERT_RETURN(fWindow != nullptr,);
CARLA_SAFE_ASSERT_RETURN(fView != 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) if (fIsResizable)
{ {


Loading…
Cancel
Save