diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2008-01-07 20:41:51 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2008-01-07 20:41:51 +0000 |
commit | 5284a1efca7e4b1e95247015ccad557b2d0aaadc (patch) | |
tree | d8f28722e9a3fa2980d8f6d67f923640f0c05eca | |
parent | e6dc790374e9df9b3efef8fdddd664e571147acb (diff) |
various OS X fixes, mostly related to AU support
git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@2836 d708f5d6-7413-0410-9779-e7cbd77b26cf
-rw-r--r-- | gtk2_ardour/SConscript | 2 | ||||
-rw-r--r-- | gtk2_ardour/ardour_ui.cc | 10 | ||||
-rw-r--r-- | gtk2_ardour/ardour_ui.h | 1 | ||||
-rw-r--r-- | gtk2_ardour/au_pluginui.h | 4 | ||||
-rw-r--r-- | gtk2_ardour/au_pluginui.mm | 189 | ||||
-rw-r--r-- | gtk2_ardour/cocoacarbon.mm (renamed from gtk2_ardour/cocoacarbon.cc) | 14 | ||||
-rw-r--r-- | gtk2_ardour/opts.cc | 2 | ||||
-rw-r--r-- | gtk2_ardour/opts.h | 1 | ||||
-rw-r--r-- | gtk2_ardour/plugin_ui.cc | 8 | ||||
-rw-r--r-- | gtk2_ardour/plugin_ui.h | 3 | ||||
-rw-r--r-- | gtk2_ardour/redirect_box.cc | 2 | ||||
-rw-r--r-- | gtk2_ardour/x11.cc | 5 | ||||
-rw-r--r-- | libs/glibmm2/glibmm/convert.cc | 3 | ||||
-rw-r--r-- | libs/glibmm2/glibmm/date.cc | 3 | ||||
-rw-r--r-- | libs/glibmm2/glibmm/error.cc | 3 | ||||
-rw-r--r-- | libs/glibmm2/glibmm/exception.cc | 3 |
16 files changed, 180 insertions, 73 deletions
diff --git a/gtk2_ardour/SConscript b/gtk2_ardour/SConscript index a410743253..39f9a21dd4 100644 --- a/gtk2_ardour/SConscript +++ b/gtk2_ardour/SConscript @@ -89,7 +89,7 @@ au_pluginui.mm gtkosx_files=Split(""" sync-menu.c -cocoacarbon.cc +cocoacarbon.mm """) x11_files=Split(""" diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index ab3d5e5e8c..77c70d0888 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -245,6 +245,9 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[]) starting.connect (mem_fun(*this, &ARDOUR_UI::startup)); stopping.connect (mem_fun(*this, &ARDOUR_UI::shutdown)); + + platform_setup (); + } int @@ -2017,6 +2020,8 @@ ARDOUR_UI::get_session_parameters (Glib::ustring predetermined_path, bool have_e Gtk::BUTTONS_NONE); } + + cerr << "PDP = " << predetermined_path << endl; int response = Gtk::RESPONSE_NONE; @@ -2230,11 +2235,6 @@ ARDOUR_UI::get_session_parameters (Glib::ustring predetermined_path, bool have_e } - //XXX This is needed because session constructor wants a - //non-existant path. hopefully this will be fixed at some point. - - session_path = Glib::build_filename (session_path, session_name); - if (!should_be_new) { if (load_session (session_path, session_name)) { diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h index 51a7a68b14..97dbb17223 100644 --- a/gtk2_ardour/ardour_ui.h +++ b/gtk2_ardour/ardour_ui.h @@ -749,6 +749,7 @@ class ARDOUR_UI : public Gtkmm2ext::UI Gtk::MessageDialog* loading_dialog; void platform_specific (); + void platform_setup (); void fontconfig_dialog (); }; diff --git a/gtk2_ardour/au_pluginui.h b/gtk2_ardour/au_pluginui.h index f6f995fe92..ab816f9630 100644 --- a/gtk2_ardour/au_pluginui.h +++ b/gtk2_ardour/au_pluginui.h @@ -31,6 +31,9 @@ class AUPluginUI : public PlugUIBase, public Gtk::VBox bool start_updating(GdkEventAny*); bool stop_updating(GdkEventAny*); + virtual void activate (); + virtual void deactivate (); + void on_realize (); void on_show (); @@ -45,6 +48,7 @@ class AUPluginUI : public PlugUIBase, public Gtk::VBox NSWindow* cocoa_window; NSScrollView* scroll_view; + NSView* au_view; /* Carbon */ diff --git a/gtk2_ardour/au_pluginui.mm b/gtk2_ardour/au_pluginui.mm index e1d7302b60..51f73199f7 100644 --- a/gtk2_ardour/au_pluginui.mm +++ b/gtk2_ardour/au_pluginui.mm @@ -34,7 +34,7 @@ AUPluginUI::AUPluginUI (boost::shared_ptr<PluginInsert> insert) bool has_carbon; bool has_cocoa; - + carbon_parented = false; cocoa_parented = false; cocoa_parent = 0; @@ -42,12 +42,13 @@ AUPluginUI::AUPluginUI (boost::shared_ptr<PluginInsert> insert) test_view_support (has_carbon, has_cocoa); - cerr << "plugin has carbon ? " << has_carbon << " cocoa ? " << has_cocoa << endl; - if (has_cocoa) { create_cocoa_view (); - } else { + } else if (has_carbon) { create_carbon_view (has_carbon); + } else { + /* fallback to cocoa */ + create_cocoa_view (); } } @@ -71,7 +72,7 @@ AUPluginUI::test_view_support (bool& has_carbon, bool& has_cocoa) bool AUPluginUI::test_carbon_view_support () { - bool ret = true; // there is always the generic GUI + bool ret = false; carbon_descriptor.componentType = kAudioUnitCarbonViewComponentType; carbon_descriptor.componentSubType = 'gnrc'; @@ -126,7 +127,6 @@ AUPluginUI::plugin_class_valid (Class pluginClass) int AUPluginUI::create_cocoa_view () { - NSView *AUView = nil; BOOL wasAbleToLoadCustomView = NO; AudioUnitCocoaViewInfo* cocoaViewInfo = NULL; UInt32 numberOfClasses = 0; @@ -142,11 +142,6 @@ AUPluginUI::create_cocoa_view () &dataSize, &isWritable ); - - if (result != noErr) { - return -1; - } - numberOfClasses = (dataSize - sizeof(CFURLRef)) / sizeof(CFStringRef); // Does view have custom Cocoa UI? @@ -174,15 +169,7 @@ AUPluginUI::create_cocoa_view () } } - cocoa_window = [NSWindow alloc]; - - NSRect frameRect = [[cocoa_window contentView] frame]; - scroll_view = [[[NSScrollView alloc] initWithFrame:frameRect] autorelease]; - [scroll_view setDrawsBackground:NO]; - [scroll_view setHasHorizontalScroller:YES]; - [scroll_view setHasVerticalScroller:YES]; - - [cocoa_window setContentView:scroll_view]; + NSRect crect = { { 0, 0 }, { 1, 1} }; // [A] Show custom UI if view has it @@ -211,8 +198,7 @@ AUPluginUI::create_cocoa_view () } // make a view - AUView = [factoryInstance uiViewForAudioUnit:*au->get_au() - withSize:[[scroll_view contentView] bounds].size]; + au_view = [factoryInstance uiViewForAudioUnit:*au->get_au() withSize:crect.size]; // cleanup [CocoaViewBundlePath release]; @@ -229,32 +215,17 @@ AUPluginUI::create_cocoa_view () if (!wasAbleToLoadCustomView) { // [B] Otherwise show generic Cocoa view - AUView = [[AUGenericView alloc] initWithAudioUnit:*au->get_au()]; - [(AUGenericView *)AUView setShowsExpertParameters:YES]; + au_view = [[AUGenericView alloc] initWithAudioUnit:*au->get_au()]; + [(AUGenericView *)au_view setShowsExpertParameters:YES]; } - - // Display view - NSRect viewFrame = [AUView frame]; - NSSize frameSize = [NSScrollView frameSizeForContentSize:viewFrame.size - hasHorizontalScroller:[scroll_view hasHorizontalScroller] - hasVerticalScroller:[scroll_view hasVerticalScroller] - borderType:[scroll_view borderType]]; - - NSRect newFrame; - newFrame.origin = [scroll_view frame].origin; - newFrame.size = frameSize; + /* make a child cocoa window */ - NSRect currentFrame = [scroll_view frame]; - [scroll_view setFrame:newFrame]; - [scroll_view setDocumentView:AUView]; - - NSSize oldContentSize = [[cocoa_window contentView] frame].size; - NSSize newContentSize = oldContentSize; - newContentSize.width += (newFrame.size.width - currentFrame.size.width); - newContentSize.height += (newFrame.size.height - currentFrame.size.height); - - [cocoa_window setContentSize:newContentSize]; + cocoa_window = [[NSWindow alloc] + initWithContentRect:crect + styleMask:NSBorderlessWindowMask + backing:NSBackingStoreBuffered + defer:NO]; return 0; } @@ -279,7 +250,7 @@ AUPluginUI::create_carbon_view (bool generic) kWindowNoShadowAttribute| kWindowNoTitleBarAttribute); - if ((err = CreateNewWindow(kFloatingWindowClass, attr, &r, &carbon_window)) != noErr) { + if ((err = CreateNewWindow(kDocumentWindowClass, attr, &r, &carbon_window)) != noErr) { error << string_compose (_("AUPluginUI: cannot create carbon window (err: %1)"), err) << endmsg; return -1; } @@ -335,6 +306,24 @@ AUPluginUI::get_nswindow () return true_parent; } +void +AUPluginUI::activate () +{ + NSWindow* win = get_nswindow (); + [win setLevel:NSFloatingWindowLevel]; + + if (carbon_parented) { + [cocoa_parent makeKeyAndOrderFront:nil]; + ActivateWindow (carbon_window, TRUE); + } +} + +void +AUPluginUI::deactivate () +{ + /* nothing to do here */ +} + OSStatus _carbon_event (EventHandlerCallRef nextHandlerRef, EventRef event, void *userData) @@ -347,27 +336,25 @@ AUPluginUI::carbon_event (EventHandlerCallRef nextHandlerRef, EventRef event) { UInt32 eventKind = GetEventKind(event); ClickActivationResult howToHandleClick; - - cerr << "Carbon event for " << au->name(); + NSWindow* win = get_nswindow (); switch (eventKind) { + case kEventWindowHandleActivate: + [win makeMainWindow]; + return eventNotHandledErr; + break; + case kEventWindowHandleDeactivate: - // don't allow window to get deactivated while app is active - // (do this only if you are a floating window that doesn't hide) - cerr << " deactivate!"; - ActivateWindow(carbon_window, TRUE); + return eventNotHandledErr; break; case kEventWindowGetClickActivation: - cerr << " click activate!"; howToHandleClick = kActivateAndHandleClick; SetEventParameter(event, kEventParamClickActivation, typeClickActivationResult, sizeof(ClickActivationResult), &howToHandleClick); break; } - cerr << "\n"; - return noErr; } @@ -407,7 +394,8 @@ AUPluginUI::parent_carbon_window () EventTypeSpec windowEventTypes[] = { {kEventClassWindow, kEventWindowGetClickActivation }, - {kEventClassWindow, kEventWindowHandleDeactivate } + {kEventClassWindow, kEventWindowHandleDeactivate }, + {kEventClassWindow, kEventWindowHandleActivate } }; EventHandlerUPP ehUPP = NewEventHandlerUPP(_carbon_event); @@ -420,6 +408,7 @@ AUPluginUI::parent_carbon_window () [win addChildWindow:cocoa_parent ordered:NSWindowAbove]; [win setLevel:NSFloatingWindowLevel]; + [win setHidesOnDeactivate:YES]; carbon_parented = true; @@ -435,8 +424,90 @@ AUPluginUI::parent_cocoa_window () return -1; } + Gtk::Container* toplevel = get_toplevel(); + + if (!toplevel || !toplevel->is_toplevel()) { + error << _("AUPluginUI: no top level window!") << endmsg; + return -1; + } + + // Get the size of the new AU View's frame + NSRect au_view_frame = [au_view frame]; + + if (au_view_frame.size.width > 500 || au_view_frame.size.height > 500) { + + /* its too big - use a scrollview */ + + NSRect frameRect = [[cocoa_window contentView] frame]; + scroll_view = [[[NSScrollView alloc] initWithFrame:frameRect] autorelease]; + [scroll_view setDrawsBackground:NO]; + [scroll_view setHasHorizontalScroller:YES]; + [scroll_view setHasVerticalScroller:YES]; + + NSSize frameSize = [NSScrollView frameSizeForContentSize:au_view_frame.size + hasHorizontalScroller:[scroll_view hasHorizontalScroller] + hasVerticalScroller:[scroll_view hasVerticalScroller] + borderType:[scroll_view borderType]]; + + // Create a new frame with same origin as current + // frame but size equal to the size of the new view + NSRect newFrame; + newFrame.origin = [scroll_view frame].origin; + newFrame.size = frameSize; + + // Set the new frame and document views on the scroll view + NSRect currentFrame = [scroll_view frame]; + [scroll_view setFrame:newFrame]; + [scroll_view setDocumentView:au_view]; + + cerr << "scroll view size is " << newFrame.size.width << " x " << newFrame.size.height << endl; + + NSSize oldContentSize = [[cocoa_window contentView] frame].size; + NSSize newContentSize = oldContentSize; + + cerr << "original size is " << newContentSize.width << " x " << newContentSize.height << endl; + + newContentSize.width += (newFrame.size.width - currentFrame.size.width); + newContentSize.height += (newFrame.size.height - currentFrame.size.height); + + [cocoa_window setContentSize:newContentSize]; + [cocoa_window setContentView:scroll_view]; + + } else { + + [cocoa_window setContentSize:au_view_frame.size]; + [cocoa_window setContentView:au_view]; + + } + + /* compute how tall the title bar is, because we have to offset the position of the child window + by that much. + */ + + NSRect content_frame = [NSWindow contentRectForFrameRect:[win frame] styleMask:[win styleMask]]; + NSRect wm_frame = [NSWindow frameRectForContentRect:content_frame styleMask:[win styleMask]]; + int titlebar_height = wm_frame.size.height - content_frame.size.height; + + // move cocoa window into position relative to the toplevel window + + NSRect view_frame = [[cocoa_window contentView] frame]; + view_frame.origin.x = content_frame.origin.x; + view_frame.origin.y = content_frame.origin.y; + + [cocoa_window setFrame:view_frame display:NO]; + + /* make top level window big enough to hold cocoa window and titlebar */ + + content_frame.size.width = view_frame.size.width; + content_frame.size.height = view_frame.size.height + titlebar_height; + + [win setFrame:content_frame display:NO]; + + /* now make cocoa window a child of this top level */ + [win addChildWindow:cocoa_window ordered:NSWindowAbove]; - [win setLevel:NSFloatingWindowLevel]; + // [win setLevel:NSFloatingWindowLevel]; + [win setHidesOnDeactivate:YES]; cocoa_parented = true; @@ -469,9 +540,9 @@ AUPluginUI::on_show () VBox::on_show (); if (cocoa_window) { - // [cocoa_window setIsVisible:YES]; + [cocoa_window setIsVisible:YES]; } else if (carbon_window) { - // [cocoa_parent setIsVisible:YES]; + [cocoa_parent setIsVisible:YES]; } } diff --git a/gtk2_ardour/cocoacarbon.cc b/gtk2_ardour/cocoacarbon.mm index 4ab3992d12..b60352eb47 100644 --- a/gtk2_ardour/cocoacarbon.cc +++ b/gtk2_ardour/cocoacarbon.mm @@ -21,8 +21,11 @@ #include "ardour_ui.h" #include "actions.h" +#include "opts.h" #include "sync-menu.h" +#include <Appkit/Appkit.h> + sigc::signal<void,bool> ApplicationActivationChanged; static EventHandlerRef application_event_handler_ref; @@ -107,4 +110,13 @@ ARDOUR_UI::platform_specific () applicationEventTypes, 0, &application_event_handler_ref); } - +void +ARDOUR_UI::platform_setup () +{ + if (!ARDOUR_COMMAND_LINE::finder_invoked_ardour) { + + /* if invoked from the command line, make sure we're visible */ + + [NSApp activateIgnoringOtherApps:YES]; + } +} diff --git a/gtk2_ardour/opts.cc b/gtk2_ardour/opts.cc index 85681b03c3..e2189f9226 100644 --- a/gtk2_ardour/opts.cc +++ b/gtk2_ardour/opts.cc @@ -40,6 +40,7 @@ char* ARDOUR_COMMAND_LINE::curvetest_file = 0; bool ARDOUR_COMMAND_LINE::try_hw_optimization = true; Glib::ustring ARDOUR_COMMAND_LINE::keybindings_path = ""; /* empty means use builtin default */ Glib::ustring ARDOUR_COMMAND_LINE::menus_file = "ardour.menus"; +bool ARDOUR_COMMAND_LINE::finder_invoked_ardour = false; using namespace ARDOUR_COMMAND_LINE; @@ -142,6 +143,7 @@ ARDOUR_COMMAND_LINE::parse_opts (int argc, char *argv[]) case 'p': //undocumented OS X finder -psn_XXXXX argument + finder_invoked_ardour = true; break; case 'S': diff --git a/gtk2_ardour/opts.h b/gtk2_ardour/opts.h index ff3bf0b481..efa2656816 100644 --- a/gtk2_ardour/opts.h +++ b/gtk2_ardour/opts.h @@ -37,6 +37,7 @@ extern bool try_hw_optimization; extern bool use_gtk_theme; extern Glib::ustring keybindings_path; extern Glib::ustring menus_file; +extern bool finder_invoked_ardour; extern int32_t parse_opts (int argc, char *argv[]); diff --git a/gtk2_ardour/plugin_ui.cc b/gtk2_ardour/plugin_ui.cc index 64e41bedb9..dc51db46b6 100644 --- a/gtk2_ardour/plugin_ui.cc +++ b/gtk2_ardour/plugin_ui.cc @@ -175,13 +175,11 @@ PluginUIWindow::create_audiounit_editor (boost::shared_ptr<PluginInsert> insert) void PluginUIWindow::app_activated (bool yn) { -#if defined(HAVE_AUDIOUNITS) && defined(GTKOSX) +#if defined (HAVE_AUDIOUNITS) && defined(GTKOSX) if (yn) { - ARDOUR_UI::instance()->the_editor().ensure_float (*this); - show (); - } else { - hide (); + _pluginui->activate (); } + cerr << "activated ? " << yn << endl; #endif } diff --git a/gtk2_ardour/plugin_ui.h b/gtk2_ardour/plugin_ui.h index ad91ebb991..dec4db3481 100644 --- a/gtk2_ardour/plugin_ui.h +++ b/gtk2_ardour/plugin_ui.h @@ -73,6 +73,9 @@ class PlugUIBase : public virtual sigc::trackable virtual gint get_preferred_width () = 0; virtual bool start_updating(GdkEventAny*) = 0; virtual bool stop_updating(GdkEventAny*) = 0; + + virtual void activate () {} + virtual void deactivate () {} protected: boost::shared_ptr<ARDOUR::PluginInsert> insert; diff --git a/gtk2_ardour/redirect_box.cc b/gtk2_ardour/redirect_box.cc index 95f6b4dac8..f3193d6924 100644 --- a/gtk2_ardour/redirect_box.cc +++ b/gtk2_ardour/redirect_box.cc @@ -1078,8 +1078,6 @@ RedirectBox::edit_redirect (boost::shared_ptr<Redirect> redirect) /* it's an insert */ - cerr << "the plugin insert, that is\n"; - boost::shared_ptr<PluginInsert> plugin_insert; boost::shared_ptr<PortInsert> port_insert; diff --git a/gtk2_ardour/x11.cc b/gtk2_ardour/x11.cc index 330d459abc..c29c7db078 100644 --- a/gtk2_ardour/x11.cc +++ b/gtk2_ardour/x11.cc @@ -4,3 +4,8 @@ void ARDOUR_UI::platform_specific () { } + +void +ARDOUR_UI::platform_setup () +{ +} diff --git a/libs/glibmm2/glibmm/convert.cc b/libs/glibmm2/glibmm/convert.cc index 1cd334bcd1..a655e8aefb 100644 --- a/libs/glibmm2/glibmm/convert.cc +++ b/libs/glibmm2/glibmm/convert.cc @@ -26,6 +26,9 @@ #include <glib/gconvert.h> #include <glib/gmessages.h> #include <glib/gunicode.h> +#ifndef g_assert +#include <glib/gtestutils.h> +#endif #include <glibmm/utility.h> diff --git a/libs/glibmm2/glibmm/date.cc b/libs/glibmm2/glibmm/date.cc index 8058376e2a..c535e92ec2 100644 --- a/libs/glibmm2/glibmm/date.cc +++ b/libs/glibmm2/glibmm/date.cc @@ -25,6 +25,9 @@ #include <glib/gmem.h> #include <glib/gmessages.h> +#ifndef g_assert +#include <glib/gtestutils.h> +#endif #include <ctime> #include <algorithm> diff --git a/libs/glibmm2/glibmm/error.cc b/libs/glibmm2/glibmm/error.cc index 2e8f072322..834fd20343 100644 --- a/libs/glibmm2/glibmm/error.cc +++ b/libs/glibmm2/glibmm/error.cc @@ -22,6 +22,9 @@ #include <glib/gerror.h> #include <glib/gmessages.h> +#ifndef g_assert +#include <glib/gtestutils.h> +#endif #include <map> #include <glibmmconfig.h> diff --git a/libs/glibmm2/glibmm/exception.cc b/libs/glibmm2/glibmm/exception.cc index 22345b2853..19de7c3b93 100644 --- a/libs/glibmm2/glibmm/exception.cc +++ b/libs/glibmm2/glibmm/exception.cc @@ -21,6 +21,9 @@ */ #include <glib/gmessages.h> +#ifndef g_assert +#include <glib/gtestutils.h> +#endif #include <glibmm/exception.h> |