gtkosx_files=Split("""
sync-menu.c
-cocoacarbon.cc
+cocoacarbon.mm
""")
x11_files=Split("""
starting.connect (mem_fun(*this, &ARDOUR_UI::startup));
stopping.connect (mem_fun(*this, &ARDOUR_UI::shutdown));
+
+ platform_setup ();
+
}
int
Gtk::BUTTONS_NONE);
}
+
+ cerr << "PDP = " << predetermined_path << endl;
int response = Gtk::RESPONSE_NONE;
}
- //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)) {
Gtk::MessageDialog* loading_dialog;
void platform_specific ();
+ void platform_setup ();
void fontconfig_dialog ();
};
bool start_updating(GdkEventAny*);
bool stop_updating(GdkEventAny*);
+ virtual void activate ();
+ virtual void deactivate ();
+
void on_realize ();
void on_show ();
NSWindow* cocoa_window;
NSScrollView* scroll_view;
+ NSView* au_view;
/* Carbon */
bool has_carbon;
bool has_cocoa;
-
+
carbon_parented = false;
cocoa_parented = false;
cocoa_parent = 0;
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 ();
}
}
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';
int
AUPluginUI::create_cocoa_view ()
{
- NSView *AUView = nil;
BOOL wasAbleToLoadCustomView = NO;
AudioUnitCocoaViewInfo* cocoaViewInfo = NULL;
UInt32 numberOfClasses = 0;
&dataSize,
&isWritable );
-
- if (result != noErr) {
- return -1;
- }
-
numberOfClasses = (dataSize - sizeof(CFURLRef)) / sizeof(CFStringRef);
// Does view have custom Cocoa UI?
}
}
- 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
}
// 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];
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;
}
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;
}
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)
{
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;
}
EventTypeSpec windowEventTypes[] = {
{kEventClassWindow, kEventWindowGetClickActivation },
- {kEventClassWindow, kEventWindowHandleDeactivate }
+ {kEventClassWindow, kEventWindowHandleDeactivate },
+ {kEventClassWindow, kEventWindowHandleActivate }
};
EventHandlerUPP ehUPP = NewEventHandlerUPP(_carbon_event);
[win addChildWindow:cocoa_parent ordered:NSWindowAbove];
[win setLevel:NSFloatingWindowLevel];
+ [win setHidesOnDeactivate:YES];
carbon_parented = true;
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;
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];
}
}
+++ /dev/null
-/*
- Copyright (C) 2007 Paul Davis
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#include <Carbon/Carbon.h>
-#undef check // stupid, stupid carbon
-
-#include "ardour_ui.h"
-#include "actions.h"
-#include "sync-menu.h"
-
-sigc::signal<void,bool> ApplicationActivationChanged;
-static EventHandlerRef application_event_handler_ref;
-
-/* Called for clicks on the dock icon. Can be used to unminimize or
- * create a new window for example.
- */
-
-static OSErr
-handle_reopen_application (const AppleEvent *inAppleEvent,
- AppleEvent *outAppleEvent,
- long inHandlerRefcon)
-{
- cerr << "reopen app\n";
- return noErr;
-}
-
-static OSErr
-handle_quit_application (const AppleEvent *inAppleEvent,
- AppleEvent *outAppleEvent,
- long inHandlerRefcon)
-{
- cerr << "quit app\n";
- ARDOUR_UI::instance()->quit ();
-
- return noErr;
-}
-
-static OSStatus
-application_event_handler (EventHandlerCallRef nextHandlerRef, EventRef event, void *userData)
-{
- UInt32 eventKind = GetEventKind (event);
-
- switch (eventKind) {
- case kEventAppActivated:
- ApplicationActivationChanged (true); // EMIT SIGNAL
- return eventNotHandledErr;
-
- case kEventAppDeactivated:
- ApplicationActivationChanged (false); // EMIT SIGNAL
- return eventNotHandledErr;
-
- default:
- // pass-thru all kEventClassApplication events we're not interested in.
- break;
- }
- return eventNotHandledErr;
-}
-
-void
-ARDOUR_UI::platform_specific ()
-{
- AEInstallEventHandler (kCoreEventClass, kAEReopenApplication,
- handle_reopen_application, 0, true);
-
- AEInstallEventHandler (kCoreEventClass, kAEQuitApplication,
- handle_quit_application, 0, true);
-
- Gtk::Widget* widget = ActionManager::get_widget ("/ui/Main/Session/Quit");
- if (widget) {
- ige_mac_menu_set_quit_menu_item ((GtkMenuItem*) widget->gobj());
- }
-
- IgeMacMenuGroup* group = ige_mac_menu_add_app_menu_group ();
-
- widget = ActionManager::get_widget ("/ui/Main/Session/About");
- if (widget) {
- ige_mac_menu_add_app_menu_item (group, (GtkMenuItem*) widget->gobj(), 0);
- }
- widget = ActionManager::get_widget ("/ui/Main/Session/ToggleOptionsEditor");
- if (widget) {
- ige_mac_menu_add_app_menu_item (group, (GtkMenuItem*) widget->gobj(), 0);
- }
-
- EventTypeSpec applicationEventTypes[] = {
- {kEventClassApplication, kEventAppActivated },
- {kEventClassApplication, kEventAppDeactivated }
- };
-
- EventHandlerUPP ehUPP = NewEventHandlerUPP (application_event_handler);
-
- InstallApplicationEventHandler (ehUPP, sizeof(applicationEventTypes) / sizeof(EventTypeSpec),
- applicationEventTypes, 0, &application_event_handler_ref);
-}
-
-
--- /dev/null
+/*
+ Copyright (C) 2007 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include <Carbon/Carbon.h>
+#undef check // stupid, stupid carbon
+
+#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;
+
+/* Called for clicks on the dock icon. Can be used to unminimize or
+ * create a new window for example.
+ */
+
+static OSErr
+handle_reopen_application (const AppleEvent *inAppleEvent,
+ AppleEvent *outAppleEvent,
+ long inHandlerRefcon)
+{
+ cerr << "reopen app\n";
+ return noErr;
+}
+
+static OSErr
+handle_quit_application (const AppleEvent *inAppleEvent,
+ AppleEvent *outAppleEvent,
+ long inHandlerRefcon)
+{
+ cerr << "quit app\n";
+ ARDOUR_UI::instance()->quit ();
+
+ return noErr;
+}
+
+static OSStatus
+application_event_handler (EventHandlerCallRef nextHandlerRef, EventRef event, void *userData)
+{
+ UInt32 eventKind = GetEventKind (event);
+
+ switch (eventKind) {
+ case kEventAppActivated:
+ ApplicationActivationChanged (true); // EMIT SIGNAL
+ return eventNotHandledErr;
+
+ case kEventAppDeactivated:
+ ApplicationActivationChanged (false); // EMIT SIGNAL
+ return eventNotHandledErr;
+
+ default:
+ // pass-thru all kEventClassApplication events we're not interested in.
+ break;
+ }
+ return eventNotHandledErr;
+}
+
+void
+ARDOUR_UI::platform_specific ()
+{
+ AEInstallEventHandler (kCoreEventClass, kAEReopenApplication,
+ handle_reopen_application, 0, true);
+
+ AEInstallEventHandler (kCoreEventClass, kAEQuitApplication,
+ handle_quit_application, 0, true);
+
+ Gtk::Widget* widget = ActionManager::get_widget ("/ui/Main/Session/Quit");
+ if (widget) {
+ ige_mac_menu_set_quit_menu_item ((GtkMenuItem*) widget->gobj());
+ }
+
+ IgeMacMenuGroup* group = ige_mac_menu_add_app_menu_group ();
+
+ widget = ActionManager::get_widget ("/ui/Main/Session/About");
+ if (widget) {
+ ige_mac_menu_add_app_menu_item (group, (GtkMenuItem*) widget->gobj(), 0);
+ }
+ widget = ActionManager::get_widget ("/ui/Main/Session/ToggleOptionsEditor");
+ if (widget) {
+ ige_mac_menu_add_app_menu_item (group, (GtkMenuItem*) widget->gobj(), 0);
+ }
+
+ EventTypeSpec applicationEventTypes[] = {
+ {kEventClassApplication, kEventAppActivated },
+ {kEventClassApplication, kEventAppDeactivated }
+ };
+
+ EventHandlerUPP ehUPP = NewEventHandlerUPP (application_event_handler);
+
+ InstallApplicationEventHandler (ehUPP, sizeof(applicationEventTypes) / sizeof(EventTypeSpec),
+ 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];
+ }
+}
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;
case 'p':
//undocumented OS X finder -psn_XXXXX argument
+ finder_invoked_ardour = true;
break;
case 'S':
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[]);
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
}
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;
/* it's an insert */
- cerr << "the plugin insert, that is\n";
-
boost::shared_ptr<PluginInsert> plugin_insert;
boost::shared_ptr<PortInsert> port_insert;
ARDOUR_UI::platform_specific ()
{
}
+
+void
+ARDOUR_UI::platform_setup ()
+{
+}
#include <glib/gconvert.h>
#include <glib/gmessages.h>
#include <glib/gunicode.h>
+#ifndef g_assert
+#include <glib/gtestutils.h>
+#endif
#include <glibmm/utility.h>
#include <glib/gmem.h>
#include <glib/gmessages.h>
+#ifndef g_assert
+#include <glib/gtestutils.h>
+#endif
#include <ctime>
#include <algorithm>
#include <glib/gerror.h>
#include <glib/gmessages.h>
+#ifndef g_assert
+#include <glib/gtestutils.h>
+#endif
#include <map>
#include <glibmmconfig.h>
*/
#include <glib/gmessages.h>
+#ifndef g_assert
+#include <glib/gtestutils.h>
+#endif
#include <glibmm/exception.h>