summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2008-01-07 20:41:51 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2008-01-07 20:41:51 +0000
commit5284a1efca7e4b1e95247015ccad557b2d0aaadc (patch)
treed8f28722e9a3fa2980d8f6d67f923640f0c05eca
parente6dc790374e9df9b3efef8fdddd664e571147acb (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/SConscript2
-rw-r--r--gtk2_ardour/ardour_ui.cc10
-rw-r--r--gtk2_ardour/ardour_ui.h1
-rw-r--r--gtk2_ardour/au_pluginui.h4
-rw-r--r--gtk2_ardour/au_pluginui.mm189
-rw-r--r--gtk2_ardour/cocoacarbon.mm (renamed from gtk2_ardour/cocoacarbon.cc)14
-rw-r--r--gtk2_ardour/opts.cc2
-rw-r--r--gtk2_ardour/opts.h1
-rw-r--r--gtk2_ardour/plugin_ui.cc8
-rw-r--r--gtk2_ardour/plugin_ui.h3
-rw-r--r--gtk2_ardour/redirect_box.cc2
-rw-r--r--gtk2_ardour/x11.cc5
-rw-r--r--libs/glibmm2/glibmm/convert.cc3
-rw-r--r--libs/glibmm2/glibmm/date.cc3
-rw-r--r--libs/glibmm2/glibmm/error.cc3
-rw-r--r--libs/glibmm2/glibmm/exception.cc3
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>