diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2010-01-15 17:50:03 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2010-01-15 17:50:03 +0000 |
commit | a3b0f8c576796b97ff4ae96b5bae2186c3eb8a2c (patch) | |
tree | bcc8b61c49b4195e230e849978727ce9ea187563 | |
parent | 79910087b918c7df65f844063963b18f1d5eead6 (diff) |
tidy up and abstract the GtkApplication concept a bit for OS X integration
git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@6496 d708f5d6-7413-0410-9779-e7cbd77b26cf
-rw-r--r-- | gtk2_ardour/ardour_ui_ed.cc | 28 | ||||
-rw-r--r-- | gtk2_ardour/cocoacarbon.mm | 76 | ||||
-rw-r--r-- | gtk2_ardour/option_editor.cc | 2 | ||||
-rw-r--r-- | gtk2_ardour/plugin_ui.cc | 4 | ||||
-rw-r--r-- | libs/gtkmm2ext/SConscript | 3 | ||||
-rw-r--r-- | libs/gtkmm2ext/application.cc | 78 | ||||
-rw-r--r-- | libs/gtkmm2ext/gtk_ui.cc | 9 | ||||
-rw-r--r-- | libs/gtkmm2ext/gtkapplication_quartz.mm | 202 | ||||
-rw-r--r-- | libs/gtkmm2ext/gtkapplication_x11.c | 3 | ||||
-rw-r--r-- | libs/gtkmm2ext/gtkmm2ext/application.h | 62 | ||||
-rw-r--r-- | libs/gtkmm2ext/gtkmm2ext/gtk_ui.h | 1 | ||||
-rw-r--r-- | libs/gtkmm2ext/gtkmm2ext/gtkapplication.h | 4 |
12 files changed, 322 insertions, 150 deletions
diff --git a/gtk2_ardour/ardour_ui_ed.cc b/gtk2_ardour/ardour_ui_ed.cc index b795bc5ae8..30e8488106 100644 --- a/gtk2_ardour/ardour_ui_ed.cc +++ b/gtk2_ardour/ardour_ui_ed.cc @@ -42,6 +42,7 @@ #include "utils.h" #include <gtkmm2ext/gtkapplication.h> +#include <gtkmm2ext/application.h> #include <ardour/session.h> #include <ardour/profile.h> @@ -851,10 +852,29 @@ ARDOUR_UI::build_menu_bar () void ARDOUR_UI::use_menubar_as_top_menubar () { -#ifdef GTKOSX - gtk_application_set_menu_bar ((GtkMenuShell*) menu_bar->gobj()); - // ige_mac_menu_set_quit_menu_item (some_item->gobj()); -#endif + Gtk::Widget* widget; + Application* app = Application::instance (); + + /* Quit will be taken of separately */ + + if ((widget = ActionManager::get_widget ("/ui/Main/Session/Quit"))) { + widget->hide (); + } + + GtkApplicationMenuGroup* group = app->add_app_menu_group (); + + if ((widget = ActionManager::get_widget ("/ui/Main/Help/About"))) { + app->add_app_menu_item (group, dynamic_cast<MenuItem*>(widget)); + } + + if ((widget = ActionManager::get_widget ("/ui/Main/WindowMenu/ToggleOptionsEditor"))) { + app->add_app_menu_item (group, dynamic_cast<MenuItem*>(widget)); + } + + app->set_menu_bar (*menu_bar); + + app->ShouldQuit.connect (sigc::mem_fun (*this, &UI::quit)); + app->ShouldLoad.connect (sigc::mem_fun (*this, &ARDOUR_UI::idle_load)); } void diff --git a/gtk2_ardour/cocoacarbon.mm b/gtk2_ardour/cocoacarbon.mm index ddf1f26f9f..c191ed975e 100644 --- a/gtk2_ardour/cocoacarbon.mm +++ b/gtk2_ardour/cocoacarbon.mm @@ -26,79 +26,10 @@ #include "actions.h" #include "opts.h" -sigc::signal<void,bool> ApplicationActivationChanged; - -@interface AppNotificationObject : NSObject {} -- (AppNotificationObject*) init; -@end - -@implementation AppNotificationObject -- (AppNotificationObject*) init -{ - self = [ super init ]; - - if (self) { - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(appDidBecomeActive:) - name:NSApplicationDidBecomeActiveNotification - object:[NSApplication sharedApplication]]; - - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(appDidBecomeInactive:) - name:NSApplicationWillResignActiveNotification - object:[NSApplication sharedApplication]]; - } - - return self; -} - -- (void)appDidBecomeActive:(NSNotification *)notification -{ - ApplicationActivationChanged (true); -} - -- (void)appDidBecomeInactive:(NSNotification *)notification -{ - ApplicationActivationChanged (false); -} - -@end - -@interface ArdourApplicationDelegate : NSObject {} -@end - -@implementation ArdourApplicationDelegate --(BOOL) application:(NSApplication*) theApplication openFile:(NSString*) file -{ - Glib::ustring utf8_path ([file UTF8String]); - ARDOUR_UI::instance()->idle_load (utf8_path); - return 1; -} -- (NSApplicationTerminateReply) applicationShouldTerminate:(NSApplication *)sender -{ - Gtkmm2ext::UI::instance()->quit (); - return NSTerminateCancel; -} -@end - void ARDOUR_UI::platform_specific () { - Gtk::Widget* widget; - - GtkApplicationMenuGroup* group = gtk_application_add_app_menu_group (); - - widget = ActionManager::get_widget ("/ui/Main/Help/About"); - if (widget) { - gtk_application_add_app_menu_item (group, (GtkMenuItem*) widget->gobj(), 0); - } - - widget = ActionManager::get_widget ("/ui/Main/WindowMenu/ToggleOptionsEditor"); - if (widget) { - gtk_application_add_app_menu_item (group, (GtkMenuItem*) widget->gobj(), 0); - } - - [ NSApp finishLaunching ]; + gtk_application_ready (); if (!ARDOUR_COMMAND_LINE::finder_invoked_ardour) { @@ -111,11 +42,6 @@ ARDOUR_UI::platform_specific () void ARDOUR_UI::platform_setup () { - /* this will stick around for ever ... is that OK ? */ - - [ [AppNotificationObject alloc] init]; - [ NSApp setDelegate: [ArdourApplicationDelegate new]]; - } bool diff --git a/gtk2_ardour/option_editor.cc b/gtk2_ardour/option_editor.cc index 1b9c326f6b..53119ea968 100644 --- a/gtk2_ardour/option_editor.cc +++ b/gtk2_ardour/option_editor.cc @@ -257,12 +257,14 @@ OptionEditor::add_session_paths () session_raid_entry.set_text(session->raid_path()); } +#ifndef GTKOSX static void font_scale_changed (Gtk::Adjustment* adj) { Config->set_font_scale((long)floor (adj->get_value() * 1024)); reset_dpi(); } +#endif void OptionEditor::setup_misc_options () diff --git a/gtk2_ardour/plugin_ui.cc b/gtk2_ardour/plugin_ui.cc index c0189bbc05..233774dba2 100644 --- a/gtk2_ardour/plugin_ui.cc +++ b/gtk2_ardour/plugin_ui.cc @@ -33,6 +33,7 @@ #include <gtkmm2ext/utils.h> #include <gtkmm2ext/doi.h> #include <gtkmm2ext/slider_controller.h> +#include <gtkmm2ext/application.h> #include <midi++/manager.h> @@ -262,8 +263,7 @@ PluginUIWindow::create_audiounit_editor (boost::shared_ptr<PluginInsert> insert) add (*box); non_gtk_gui = true; - extern sigc::signal<void,bool> ApplicationActivationChanged; - ApplicationActivationChanged.connect (mem_fun (*this, &PluginUIWindow::app_activated)); + Application::instance()->ActivationChanged.connect (mem_fun (*this, &PluginUIWindow::app_activated)); return true; #endif diff --git a/libs/gtkmm2ext/SConscript b/libs/gtkmm2ext/SConscript index 712c8c1e1e..e7079d0c5e 100644 --- a/libs/gtkmm2ext/SConscript +++ b/libs/gtkmm2ext/SConscript @@ -37,6 +37,7 @@ if gtkmm2ext['IS_OSX']: extra_sources = [] gtkmm2ext_files = Split(""" +application.cc auto_spin.cc barcontroller.cc binding_proxy.cc @@ -46,6 +47,7 @@ dndtreeview.cc fastmeter.cc focus_entry.cc grouped_buttons.cc +gtkapplication.c gtk_ui.cc idle_adjustment.cc pixfader.cc @@ -60,7 +62,6 @@ textviewer.cc utils.cc version.cc window_title.cc -gtkapplication.c """) x11_files=Split(""" diff --git a/libs/gtkmm2ext/application.cc b/libs/gtkmm2ext/application.cc new file mode 100644 index 0000000000..2a72c5bf4b --- /dev/null +++ b/libs/gtkmm2ext/application.cc @@ -0,0 +1,78 @@ +/* GTK+ Integration with platform-specific application-wide features + * such as the OS X menubar and application delegate concepts. + * + * Copyright (C) 2007 Pioneer Research Center USA, Inc. + * Copyright (C) 2007 Imendio AB + * Copyright (C) 2009 Paul Davis + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1 + * of the License. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include <gtkmm/menushell.h> +#include <gtkmm/menuitem.h> + +#include "gtkmm2ext/application.h" +#include "gtkmm2ext/gtkapplication.h" + +using namespace Gtk; +using namespace Gtkmm2ext; + +Application* Application::_instance = 0; + +Application* +Application::instance () +{ + if (!_instance) { + _instance = new Application; + } + return _instance; +} + +Application::Application () +{ + gtk_application_init (); +} + +Application::~Application () +{ + _instance = 0; + gtk_application_cleanup (); +} + +void +Application::ready () +{ + gtk_application_ready (); +} + +void +Application::set_menu_bar (MenuShell& shell) +{ + gtk_application_set_menu_bar (shell.gobj()); +} + +GtkApplicationMenuGroup* +Application::add_app_menu_group () +{ + return gtk_application_add_app_menu_group (); +} + +void +Application::add_app_menu_item (GtkApplicationMenuGroup* group, + MenuItem* item) +{ + gtk_application_add_app_menu_item (group, item->gobj()); +} diff --git a/libs/gtkmm2ext/gtk_ui.cc b/libs/gtkmm2ext/gtk_ui.cc index 8064b6cae7..25501a2119 100644 --- a/libs/gtkmm2ext/gtk_ui.cc +++ b/libs/gtkmm2ext/gtk_ui.cc @@ -33,7 +33,7 @@ #include <pbd/pthread_utils.h> #include <pbd/stacktrace.h> -#include <gtkmm2ext/gtkapplication.h> +#include <gtkmm2ext/application.h> #include <gtkmm2ext/gtk_ui.h> #include <gtkmm2ext/textviewer.h> @@ -62,7 +62,6 @@ BaseUI::RequestType Gtkmm2ext::AddTimeout = BaseUI::new_request_type(); #include <pbd/abstract_ui.cc> /* instantiate the template */ - UI::UI (string namestr, int *argc, char ***argv) : AbstractUI<UIRequest> (namestr, true) { @@ -105,14 +104,16 @@ UI::UI (string namestr, int *argc, char ***argv) register_thread (pthread_self(), X_("GUI")); - gtk_application_init (); + /* instantiate the Application singleton */ + + Application::instance(); } UI::~UI () { + delete Application::instance (); } - bool UI::caller_is_ui_thread () { diff --git a/libs/gtkmm2ext/gtkapplication_quartz.mm b/libs/gtkmm2ext/gtkapplication_quartz.mm index e5b31530ae..127dee4193 100644 --- a/libs/gtkmm2ext/gtkapplication_quartz.mm +++ b/libs/gtkmm2ext/gtkapplication_quartz.mm @@ -30,6 +30,7 @@ #import <AppKit/NSEvent.h> #import <AppKit/NSApplication.h> #import <Foundation/NSString.h> +#import <Foundation/NSNotification.h> #include <string.h> #include <gtk/gtk.h> @@ -37,6 +38,9 @@ #include <gtkmm2ext/gtkapplication.h> #include <gtkmm2ext/gtkapplication-private.h> +#define DEBUG(format, ...) g_printerr ("%s: " format, G_STRFUNC, ## __VA_ARGS__) +#define DEBUG(format, ...) + /* TODO * * - Sync adding/removing/reordering items @@ -561,7 +565,6 @@ idle_call_activate (gpointer data) } - (void) activate:(id) sender { - printf ("will call %s\n", [[self title] cStringUsingEncoding:NSUTF8StringEncoding]); g_idle_add (idle_call_activate, gtk_menu_item); } @end @@ -996,44 +999,33 @@ cocoa_menu_item_connect (GtkWidget* menu_item, G_CALLBACK (cocoa_menu_item_notify_label), menu_item); } - - gtk_widget_hide (GTK_WIDGET (menu_item)); } static void -sync_menu_item (NSMenuItem* cocoa_item, GtkWidget* menu_item) -{ - if (!GTK_WIDGET_IS_SENSITIVE (menu_item)) - [cocoa_item setState:NSOffState]; - -#if 0 -// requires OS X 10.5 or later - if (!GTK_WIDGET_VISIBLE (menu_item)) - [cocoa_item setHidden:YES]; -#endif - - if (GTK_IS_CHECK_MENU_ITEM (menu_item)) - cocoa_menu_item_update_active (cocoa_item, menu_item); - - if (!GTK_IS_SEPARATOR_MENU_ITEM (menu_item)) - cocoa_menu_item_update_accel_closure (cocoa_item, menu_item); - - if (gtk_menu_item_get_submenu (GTK_MENU_ITEM (menu_item))) - cocoa_menu_item_update_submenu (cocoa_item, menu_item); -} - -static void -add_menu_item (NSMenu* cocoa_menu, GtkWidget* menu_item) +add_menu_item (NSMenu* cocoa_menu, GtkWidget* menu_item, int index) { GtkWidget* label = NULL; GNSMenuItem *cocoa_item; + + DEBUG ("add %s to menu %s separator ? %d\n", get_menu_label_text (menu_item, NULL), + [[cocoa_menu title] cStringUsingEncoding:NSUTF8StringEncoding], + GTK_IS_SEPARATOR_MENU_ITEM(menu_item)); - if (!GTK_WIDGET_VISIBLE (menu_item)) + cocoa_item = cocoa_menu_item_get (menu_item); + + if (cocoa_item) return; - if (GTK_IS_SEPARATOR_MENU_ITEM (menu_item)) + if (GTK_IS_SEPARATOR_MENU_ITEM (menu_item)) { cocoa_item = [NSMenuItem separatorItem]; - else { + DEBUG ("\ta separator\n"); + } else { + + if (!GTK_WIDGET_VISIBLE (menu_item)) { + DEBUG ("\tnot visible\n"); + return; + } + const gchar* label_text = get_menu_label_text (menu_item, &label); if (label_text) @@ -1041,15 +1033,35 @@ add_menu_item (NSMenu* cocoa_menu, GtkWidget* menu_item) andGtkWidget:(GtkMenuItem*)menu_item]; else cocoa_item = [ [ GNSMenuItem alloc] initWithTitle:@"" andGtkWidget:(GtkMenuItem*)menu_item]; + DEBUG ("\tan item\n"); } /* connect GtkMenuItem and NSMenuItem so that we can notice changes to accel/label/submenu etc. */ cocoa_menu_item_connect (menu_item, (GNSMenuItem*) cocoa_item, label); [ cocoa_item setEnabled:YES]; - [ cocoa_menu addItem:cocoa_item]; + if (index >= 0) + [ cocoa_menu insertItem:cocoa_item atIndex:index]; + else + [ cocoa_menu addItem:cocoa_item]; + + if (!GTK_WIDGET_IS_SENSITIVE (menu_item)) + [cocoa_item setState:NSOffState]; + +#if 0 +// requires OS X 10.5 or later + if (!GTK_WIDGET_VISIBLE (menu_item)) + [cocoa_item setHidden:YES]; +#endif + + if (GTK_IS_CHECK_MENU_ITEM (menu_item)) + cocoa_menu_item_update_active (cocoa_item, menu_item); + + if (!GTK_IS_SEPARATOR_MENU_ITEM (menu_item)) + cocoa_menu_item_update_accel_closure (cocoa_item, menu_item); - sync_menu_item (cocoa_item, menu_item); + if (gtk_menu_item_get_submenu (GTK_MENU_ITEM (menu_item))) + cocoa_menu_item_update_submenu (cocoa_item, menu_item); [ cocoa_item release]; } @@ -1068,7 +1080,6 @@ push_menu_shell_to_nsmenu (GtkMenuShell *menu_shell, for (l = children; l; l = l->next) { GtkWidget *menu_item = (GtkWidget*) l->data; - NSMenuItem* cocoa_item; if (GTK_IS_TEAROFF_MENU_ITEM (menu_item)) continue; @@ -1076,12 +1087,7 @@ push_menu_shell_to_nsmenu (GtkMenuShell *menu_shell, if (g_object_get_data (G_OBJECT (menu_item), "gtk-empty-menu-item")) continue; - cocoa_item = cocoa_menu_item_get (menu_item); - - if (!cocoa_item) - add_menu_item (cocoa_menu, menu_item); - else - sync_menu_item (cocoa_item, menu_item); + add_menu_item (cocoa_menu, menu_item, -1); } g_list_free (children); @@ -1118,14 +1124,6 @@ parent_set_emission_hook (GSignalInvocationHint *ihint, if (cocoa_menu) { -#if 0 - g_printerr ("%s: item %s %p (%s, %s)\n", G_STRFUNC, - previous_parent ? "removed from" : "added to", - menu_shell, - get_menu_label_text (instance, NULL), - g_type_name (G_TYPE_FROM_INSTANCE (instance))); -#endif - push_menu_shell_to_nsmenu (GTK_MENU_SHELL (menu_shell), cocoa_menu, cocoa_menu == (NSMenu*) data, @@ -1294,8 +1292,7 @@ gtk_application_set_menu_bar (GtkMenuShell *menu_shell) extern "C" void gtk_application_add_app_menu_item (GtkApplicationMenuGroup *group, - GtkMenuItem *menu_item, - const gchar *label) + GtkMenuItem *menu_item) { // we know that the application menu is always the submenu of the first item in the main menu NSMenu* mainMenu; @@ -1334,9 +1331,11 @@ gtk_application_add_app_menu_item (GtkApplicationMenuGroup *group, [appMenu insertItem:[NSMenuItem separatorItem] atIndex:index+1]; index++; } - - add_menu_item (appMenu, GTK_WIDGET(menu_item)); + DEBUG ("Add to APP menu bar %s\n", get_menu_label_text (GTK_WIDGET(menu_item), NULL)); + add_menu_item (appMenu, GTK_WIDGET(menu_item), index+1); + group->items = g_list_append (group->items, menu_item); + gtk_widget_hide (GTK_WIDGET (menu_item)); return; } } @@ -1346,25 +1345,108 @@ gtk_application_add_app_menu_item (GtkApplicationMenuGroup *group, G_STRFUNC, group); } +/* application delegate, currently in C++ */ + +#include <gtkmm2ext/application.h> +#include <glibmm/ustring.h> + +namespace Gtk { + namespace Application { + sigc::signal<void,bool> ActivationChanged; + sigc::signal<void,const Glib::ustring&> ShouldLoad; + sigc::signal<void> ShouldQuit; + } +} + +@interface GtkApplicationNotificationObject : NSObject {} +- (GtkApplicationNotificationObject*) init; +@end + +@implementation GtkApplicationNotificationObject +- (GtkApplicationNotificationObject*) init +{ + self = [ super init ]; + + if (self) { + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(appDidBecomeActive:) + name:NSApplicationDidBecomeActiveNotification + object:[NSApplication sharedApplication]]; + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(appDidBecomeInactive:) + name:NSApplicationWillResignActiveNotification + object:[NSApplication sharedApplication]]; + } + + return self; +} + +- (void)appDidBecomeActive:(NSNotification *)notification +{ + Gtkmm2ext::Application::instance()->ActivationChanged (true); +} + +- (void)appDidBecomeInactive:(NSNotification *)notification +{ + Gtkmm2ext::Application::instance()->ActivationChanged (false); +} + +@end + +@interface GtkApplicationDelegate : NSObject {} +@end + +@implementation GtkApplicationDelegate +-(BOOL) application:(NSApplication*) theApplication openFile:(NSString*) file +{ + Glib::ustring utf8_path ([file UTF8String]); + Gtkmm2ext::Application::instance()->ShouldLoad (utf8_path); + return 1; +} +- (NSApplicationTerminateReply) applicationShouldTerminate:(NSApplication *)sender +{ + Gtkmm2ext::Application::instance()->ShouldQuit (); + return NSTerminateCancel; +} +@end + + /* Basic setup */ extern "C" int gtk_application_init () { _main_menubar = [[NSMenu alloc] initWithTitle: @""]; - if (_main_menubar) { - [NSApp setMainMenu: _main_menubar]; - create_apple_menu (); - create_window_menu (); - return 0; - } - return -1; + + if (!_main_menubar) + return -1; + + [NSApp setMainMenu: _main_menubar]; + create_apple_menu (); + // create_window_menu (); + + /* this will stick around for ever ... is that OK ? */ + + [ [GtkApplicationNotificationObject alloc] init]; + [ NSApp setDelegate: [GtkApplicationDelegate new]]; + + return 0; +} + +extern "C" void +gtk_application_ready () +{ + [ NSApp finishLaunching ]; } extern "C" void gtk_application_cleanup() { - [ _window_menu release ]; - [ _app_menu release ]; - [ _main_menubar release ]; + if (_window_menu) + [ _window_menu release ]; + if (_app_menu) + [ _app_menu release ]; + if (_main_menubar) + [ _main_menubar release ]; } diff --git a/libs/gtkmm2ext/gtkapplication_x11.c b/libs/gtkmm2ext/gtkapplication_x11.c index ccd2caa2cb..1e103b4e48 100644 --- a/libs/gtkmm2ext/gtkapplication_x11.c +++ b/libs/gtkmm2ext/gtkapplication_x11.c @@ -40,8 +40,7 @@ gtk_application_set_menu_bar (GtkMenuShell *menu_shell) void gtk_application_add_app_menu_item (GtkApplicationMenuGroup *group, - GtkMenuItem *menu_item, - const gchar *label) + GtkMenuItem *menu_item) { } diff --git a/libs/gtkmm2ext/gtkmm2ext/application.h b/libs/gtkmm2ext/gtkmm2ext/application.h new file mode 100644 index 0000000000..346f76d2f0 --- /dev/null +++ b/libs/gtkmm2ext/gtkmm2ext/application.h @@ -0,0 +1,62 @@ +/* GTK+ Integration with platform-specific application-wide features + * such as the OS X menubar and application delegate concepts. + * + * Copyright (C) 2009 Paul Davis + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1 + * of the License. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __GTK_APPLICATION_MM_H__ +#define __GTK_APPLICATION_MM_H__ + +#include <gtkmm2ext/gtkapplication.h> // for GtkApplicationGroup typedef +#include <sigc++/signal.h> + +namespace Gtk { + class MenuItem; + class MenuShell; +} + +namespace Glib { + class ustring; +} + +namespace Gtkmm2ext { + +class Application +{ +public: + static Application* instance(); + ~Application (); + + void ready (); + void set_menu_bar (Gtk::MenuShell&); + GtkApplicationMenuGroup* add_app_menu_group (); + void add_app_menu_item (GtkApplicationMenuGroup*, Gtk::MenuItem*); + + sigc::signal<void,bool> ActivationChanged; + sigc::signal<void,const Glib::ustring&> ShouldLoad; + sigc::signal<void> ShouldQuit; + +private: + Application (); + + static Application* _instance; +}; + +} + +#endif /* __GTK_APPLICATION_MM_H__ */ diff --git a/libs/gtkmm2ext/gtkmm2ext/gtk_ui.h b/libs/gtkmm2ext/gtkmm2ext/gtk_ui.h index cf7db9f1b2..4d4d7181ed 100644 --- a/libs/gtkmm2ext/gtkmm2ext/gtk_ui.h +++ b/libs/gtkmm2ext/gtkmm2ext/gtk_ui.h @@ -142,6 +142,7 @@ class UI : public Receiver, public AbstractUI<UIRequest> protected: bool _auto_display_errors; + virtual void handle_fatal (const char *); virtual void display_message (const char *prefix, gint prefix_len, Glib::RefPtr<Gtk::TextBuffer::Tag> ptag, diff --git a/libs/gtkmm2ext/gtkmm2ext/gtkapplication.h b/libs/gtkmm2ext/gtkmm2ext/gtkapplication.h index 08c3a84588..68b7bd7a9f 100644 --- a/libs/gtkmm2ext/gtkmm2ext/gtkapplication.h +++ b/libs/gtkmm2ext/gtkmm2ext/gtkapplication.h @@ -31,13 +31,13 @@ G_BEGIN_DECLS typedef struct _GtkApplicationMenuGroup GtkApplicationMenuGroup; int gtk_application_init (); +void gtk_application_ready (); void gtk_application_cleanup (); void gtk_application_set_menu_bar (GtkMenuShell *menu_shell); GtkApplicationMenuGroup * gtk_application_add_app_menu_group (void); void gtk_application_add_app_menu_item (GtkApplicationMenuGroup *group, - GtkMenuItem *menu_item, - const gchar *label); + GtkMenuItem *menu_item); /* these are private but here until GtkApplication becomes a GtkObject with an interface */ |