X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fau_pluginui.mm;h=f394e305c89bf36507ae615e623b41993e096185;hb=611dcdd24932222d676da4d9a4dca643f79db4a4;hp=2b3053d20f5a586e2b54eb43f36eeaf04fd63a7e;hpb=f3d5ad776b16f8063c313571ab6cd6b5d72db35e;p=ardour.git diff --git a/gtk2_ardour/au_pluginui.mm b/gtk2_ardour/au_pluginui.mm index 2b3053d20f..f394e305c8 100644 --- a/gtk2_ardour/au_pluginui.mm +++ b/gtk2_ardour/au_pluginui.mm @@ -5,7 +5,9 @@ #include "pbd/convert.h" #include "pbd/error.h" + #include "ardour/audio_unit.h" +#include "ardour/debug.h" #include "ardour/plugin_insert.h" #undef check // stupid gtk, stupid apple @@ -55,20 +57,23 @@ static const gchar* _automation_mode_strings[] = { self = [ super init ]; if (self) { - plugin_ui = apluginui; - cocoa_parent = cp; + plugin_ui = apluginui; top_level_parent = tlp; - - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(cocoaParentActivationHandler:) - name:NSWindowDidBecomeMainNotification - object:nil]; - - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(cocoaParentBecameKeyHandler:) - name:NSWindowDidBecomeKeyNotification - object:nil]; - } + + if (cp) { + cocoa_parent = cp; + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(cocoaParentActivationHandler:) + name:NSWindowDidBecomeMainNotification + object:nil]; + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(cocoaParentBecameKeyHandler:) + name:NSWindowDidBecomeKeyNotification + object:nil]; + } + } return self; } @@ -101,7 +106,7 @@ static const gchar* _automation_mode_strings[] = { - (void)auViewResized:(NSNotification *)notification; { - (void) notification; + (void) notification; // stop complaints about unusued argument plugin_ui->cocoa_view_resized(); } @@ -131,7 +136,7 @@ AUPluginUI::AUPluginUI (boost::shared_ptr insert) smaller_hbox->set_spacing (6); smaller_hbox->pack_start (preset_label, false, false, 4); - smaller_hbox->pack_start (_preset_box, false, false); + smaller_hbox->pack_start (_preset_combo, false, false); smaller_hbox->pack_start (save_button, false, false); #if 0 /* one day these might be useful with an AU plugin, but not yet */ @@ -169,6 +174,7 @@ AUPluginUI::AUPluginUI (boost::shared_ptr insert) cocoa_parent = 0; _notify = 0; cocoa_window = 0; + carbon_window = 0; au_view = 0; editView = 0; @@ -176,8 +182,10 @@ AUPluginUI::AUPluginUI (boost::shared_ptr insert) if (test_cocoa_view_support()) { create_cocoa_view (); +#ifdef WITH_CARBON } else if (test_carbon_view_support()) { create_carbon_view (); +#endif } else { create_cocoa_view (); } @@ -187,17 +195,21 @@ AUPluginUI::AUPluginUI (boost::shared_ptr insert) AUPluginUI::~AUPluginUI () { + if (_notify) { + [[NSNotificationCenter defaultCenter] removeObserver:_notify]; + } + if (cocoa_parent) { NSWindow* win = get_nswindow(); - [[NSNotificationCenter defaultCenter] removeObserver:_notify]; [win removeChildWindow:cocoa_parent]; - } +#ifdef WITH_CARBON if (carbon_window) { /* not parented, just overlaid on top of our window */ DisposeWindow (carbon_window); } +#endif if (editView) { CloseComponent (editView); @@ -286,11 +298,16 @@ AUPluginUI::create_cocoa_view () &isWritable ); numberOfClasses = (dataSize - sizeof(CFURLRef)) / sizeof(CFStringRef); - + // Does view have custom Cocoa UI? if ((result == noErr) && (numberOfClasses > 0) ) { + + DEBUG_TRACE(DEBUG::AudioUnits, + string_compose ( "based on %1, there are %2 cocoa UI classes\n", dataSize, numberOfClasses)); + cocoaViewInfo = (AudioUnitCocoaViewInfo *)malloc(dataSize); + if(AudioUnitGetProperty(*au->get_au(), kAudioUnitProperty_CocoaUI, kAudioUnitScope_Global, @@ -299,12 +316,17 @@ AUPluginUI::create_cocoa_view () &dataSize) == noErr) { CocoaViewBundlePath = (NSURL *)cocoaViewInfo->mCocoaAUViewBundleLocation; - + // we only take the first view in this example. factoryClassName = (NSString *)cocoaViewInfo->mCocoaAUViewClass[0]; - + + DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("the factory name is %1 bundle is %2\n", + [factoryClassName UTF8String], CocoaViewBundlePath)); + } else { + DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("No cocoaUI property cocoaViewInfo = %1\n", cocoaViewInfo)); + if (cocoaViewInfo != NULL) { free (cocoaViewInfo); cocoaViewInfo = NULL; @@ -312,17 +334,19 @@ AUPluginUI::create_cocoa_view () } } - NSRect crect = { { 0, 0 }, { 1, 1} }; - // [A] Show custom UI if view has it if (CocoaViewBundlePath && factoryClassName) { NSBundle *viewBundle = [NSBundle bundleWithPath:[CocoaViewBundlePath path]]; + + DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("tried to create bundle, result = %1\n", viewBundle)); + if (viewBundle == nil) { error << _("AUPluginUI: error loading AU view's bundle") << endmsg; return -1; } else { Class factoryClass = [viewBundle classNamed:factoryClassName]; + DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("tried to create factory class, result = %1\n", factoryClass)); if (!factoryClass) { error << _("AUPluginUI: error getting AU view's factory class from bundle") << endmsg; return -1; @@ -334,14 +358,18 @@ AUPluginUI::create_cocoa_view () return -1; } // make a factory - id factoryInstance = [[[factoryClass alloc] init] autorelease]; - if (factoryInstance == nil) { + id factory = [[[factoryClass alloc] init] autorelease]; + if (factory == nil) { error << _("AUPluginUI: Could not create an instance of the AU view factory") << endmsg; return -1; } + DEBUG_TRACE (DEBUG::AudioUnits, "got a factory instance\n"); + // make a view - au_view = [factoryInstance uiViewForAudioUnit:*au->get_au() withSize:crect.size]; + au_view = [factory uiViewForAudioUnit:*au->get_au() withSize:NSZeroSize]; + + DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("view created @ %1\n", au_view)); // cleanup [CocoaViewBundlePath release]; @@ -358,23 +386,17 @@ AUPluginUI::create_cocoa_view () if (!wasAbleToLoadCustomView) { // load generic Cocoa view + DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("Loading generic view using %1 -> %2\n", au, + au->get_au())); au_view = [[AUGenericView alloc] initWithAudioUnit:*au->get_au()]; + DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("view created @ %1\n", au_view)); [(AUGenericView *)au_view setShowsExpertParameters:YES]; } - // watch for size changes of the view - - [[NSNotificationCenter defaultCenter] addObserver:_notify - selector:@selector(auViewResized:) name:NSWindowDidResizeNotification - object:au_view]; - - // Get the size of the new AU View's frame + // Get the initial size of the new AU View's frame - NSRect packFrame; - packFrame = [au_view frame]; - prefwidth = packFrame.size.width; - prefheight = packFrame.size.height; - low_box.set_size_request (prefwidth, prefheight); + NSRect rect = [au_view frame]; + low_box.set_size_request (rect.size.width, rect.size.height); return 0; } @@ -382,12 +404,41 @@ AUPluginUI::create_cocoa_view () void AUPluginUI::cocoa_view_resized () { - NSRect packFrame = [au_view frame]; + GtkRequisition topsize = top_box.size_request (); + NSWindow* window = get_nswindow (); + NSSize oldContentSize= [window contentRectForFrameRect:[window frame]].size; + NSSize newContentSize= [au_view frame].size; + NSRect windowFrame= [window frame]; + + oldContentSize.height -= topsize.height; + + float dy = oldContentSize.height - newContentSize.height; + float dx = oldContentSize.width - newContentSize.width; + + windowFrame.origin.y += dy; + windowFrame.origin.x += dx; + windowFrame.size.height -= dy; + windowFrame.size.width -= dx; + + [[NSNotificationCenter defaultCenter] removeObserver:_notify + name:NSViewFrameDidChangeNotification + object:au_view]; + + NSUInteger old_auto_resize = [au_view autoresizingMask]; + + [au_view setAutoresizingMask:NSViewNotSizable]; + [window setFrame:windowFrame display:YES]; + [au_view setAutoresizingMask:old_auto_resize]; + + [[NSNotificationCenter defaultCenter] addObserver:_notify + selector:@selector(auViewResized:) name:NSViewFrameDidChangeNotification + object:au_view]; } int AUPluginUI::create_carbon_view () { +#ifdef WITH_CARBON OSStatus err; ControlRef root_control; @@ -443,6 +494,10 @@ AUPluginUI::create_carbon_view () low_box.set_size_request (prefwidth, prefheight); return 0; +#else + error << _("AU Carbon GUI is not supported.") << endmsg; + return -1; +#endif } NSWindow* @@ -468,21 +523,26 @@ AUPluginUI::get_nswindow () void AUPluginUI::activate () { +#ifdef WITH_CARBON ActivateWindow (carbon_window, TRUE); +#endif // [cocoa_parent makeKeyAndOrderFront:nil]; } void AUPluginUI::deactivate () { +#ifdef WITH_CARBON ActivateWindow (carbon_window, FALSE); +#endif } int AUPluginUI::parent_carbon_window () { +#ifdef WITH_CARBON NSWindow* win = get_nswindow (); - int x, y; + Rect windowStructureBoundsRect; if (!win) { return -1; @@ -495,7 +555,11 @@ AUPluginUI::parent_carbon_window () return -1; } - toplevel->get_window()->get_root_origin (x, y); + /* figure out where the cocoa parent window is in carbon-coordinate space, which + differs from both cocoa-coordinate space and GTK-coordinate space + */ + + GetWindowBounds((WindowRef) [win windowRef], kWindowStructureRgn, &windowStructureBoundsRect); /* compute how tall the title bar is, because we have to offset the position of the carbon window by that much. @@ -508,7 +572,11 @@ AUPluginUI::parent_carbon_window () int packing_extra = 6; // this is the total vertical packing in our top level window - MoveWindow (carbon_window, x, y + titlebar_height + top_box.get_height() + packing_extra, false); + /* move into position, based on parent window position */ + MoveWindow (carbon_window, + windowStructureBoundsRect.left, + windowStructureBoundsRect.top + titlebar_height + top_box.get_height() + packing_extra, + false); ShowWindow (carbon_window); // create the cocoa window for the carbon one and make it visible @@ -521,6 +589,9 @@ AUPluginUI::parent_carbon_window () [win addChildWindow:cocoa_parent ordered:NSWindowAbove]; return 0; +#else + return -1; +#endif } int @@ -549,7 +620,15 @@ AUPluginUI::parent_cocoa_window () NSPoint origin = { 0, a.height }; [au_view setFrameOrigin:origin]; - [view addSubview:au_view]; + [view addSubview:au_view positioned:NSWindowBelow relativeTo:nil]; + + // watch for size changes of the view + + _notify = [ [NotificationObject alloc] initWithPluginUI:this andCocoaParent:nil andTopLevelParent:win ]; + + [[NSNotificationCenter defaultCenter] addObserver:_notify + selector:@selector(auViewResized:) name:NSViewFrameDidChangeNotification + object:au_view]; return 0; } @@ -625,10 +704,12 @@ AUPluginUI::on_map_event (GdkEventAny*) void AUPluginUI::on_window_hide () { +#ifdef WITH_CARBON if (carbon_window) { HideWindow (carbon_window); ActivateWindow (carbon_window, FALSE); } +#endif hide_all (); } @@ -642,10 +723,12 @@ AUPluginUI::on_window_show (const string& /*title*/) show_all (); +#ifdef WITH_CARBON if (carbon_window) { ShowWindow (carbon_window); ActivateWindow (carbon_window, TRUE); } +#endif return true; }