[113381] trunk/dports/graphics/gimp2

devans at macports.org devans at macports.org
Thu Nov 14 13:16:50 PST 2013


Revision: 113381
          https://trac.macports.org/changeset/113381
Author:   devans at macports.org
Date:     2013-11-14 13:16:50 -0800 (Thu, 14 Nov 2013)
Log Message:
-----------
gimp2: back port upstream patches to enable Cocoa based OS X integration for +quartz builds, fixes #41279.

Modified Paths:
--------------
    trunk/dports/graphics/gimp2/Portfile

Added Paths:
-----------
    trunk/dports/graphics/gimp2/files/patch-check-os-x-integration.diff
    trunk/dports/graphics/gimp2/files/patch-link-os-x-integration.diff
    trunk/dports/graphics/gimp2/files/patch-os-x-integration-2d548c71.diff

Modified: trunk/dports/graphics/gimp2/Portfile
===================================================================
--- trunk/dports/graphics/gimp2/Portfile	2013-11-14 20:45:36 UTC (rev 113380)
+++ trunk/dports/graphics/gimp2/Portfile	2013-11-14 21:16:50 UTC (rev 113381)
@@ -7,6 +7,7 @@
 name            gimp2
 # please remember to update the gimp metapackage to match
 version         2.8.8
+revision        1
 license         {GPL-2+ LGPL}
 categories      graphics
 maintainers     devans
@@ -32,7 +33,7 @@
 
 depends_build   port:pkgconfig \
                 port:intltool \
-		port:gtk-doc
+		        port:gtk-doc
 
 depends_lib     port:desktop-file-utils \
                 port:iso-codes \
@@ -69,6 +70,9 @@
 depends_run     path:share/gimp/2.0/help:gimp-help-en
 
 patchfiles      patch-etc-gimprc.diff \
+                patch-os-x-integration-2d548c71.diff \
+                patch-check-os-x-integration.diff \
+                patch-link-os-x-integration.diff \
                 patch-plug-ins-twain-tw_mac.c.diff
 
 platform darwin 9 {
@@ -100,6 +104,7 @@
                 --with-x \
                 --x-includes=${prefix}/include \
                 --x-libraries=${prefix}/lib \
+                --disable-silent-rules \
                 --without-alsa \
                 --without-gvfs \
                 --without-gudev \
@@ -166,6 +171,7 @@
                           port:xorg-libXext \
                           port:xorg-libXfixes \
                           port:xpm
+    depends_lib-append    port:gtk-osx-application
     configure.args-delete --with-x \
                           --x-includes=${prefix}/include \
                           --x-libraries=${prefix}/lib

Added: trunk/dports/graphics/gimp2/files/patch-check-os-x-integration.diff
===================================================================
--- trunk/dports/graphics/gimp2/files/patch-check-os-x-integration.diff	                        (rev 0)
+++ trunk/dports/graphics/gimp2/files/patch-check-os-x-integration.diff	2013-11-14 21:16:50 UTC (rev 113381)
@@ -0,0 +1,66 @@
+From c21e7b581c898692b6721468b0568d705280ad1e Mon Sep 17 00:00:00 2001
+From: Michael Natterer <mitch at gimp.org>
+Date: Sun, 10 Nov 2013 17:58:23 +0000
+Subject: configure: run check for gtk-mac-integration only on OSX
+
+---
+diff --git a/configure.ac b/configure.ac
+index 038b5e6..d82ca48 100644
+--- configure.ac
++++ configure.ac
+@@ -1844,14 +1844,6 @@ if test "x$enable_python" != xno; then
+ fi
+ AM_CONDITIONAL(BUILD_PYTHON, test "x$enable_python" != xno)
+ 
+-####################################
+-# Check for GTK Mac Integration
+-####################################
+-
+-if test "x$platform_osx" != xno; then
+-  PKG_CHECK_MODULES(GTK_MAC_INTEGRATION, gtk-mac-integration >= gtk_mac_integration_required_version)
+-fi
+-
+ 
+ #########################################
+ # Check whether Script-Fu should be built
+@@ -1901,6 +1893,15 @@ esac
+ AM_CONDITIONAL(PLATFORM_OSX, test "x$platform_osx" = xyes)
+ 
+ 
++###############################
++# Check for GTK Mac Integration
++###############################
++
++if test "x$platform_osx" != xno; then
++  PKG_CHECK_MODULES(GTK_MAC_INTEGRATION, gtk-mac-integration >= gtk_mac_integration_required_version)
++fi
++
++
+ ####################################
+ # Check for Mac OS X TWAIN framework
+ ####################################
+--
+cgit v0.9.2
+From fef663774e90bbf5edc47a1f85ad14fcc45f80f1 Mon Sep 17 00:00:00 2001
+From: Michael Natterer <mitch at gimp.org>
+Date: Sun, 10 Nov 2013 19:51:37 +0000
+Subject: configure: check for gtk-mac-intregration only if GTK+ is built for quartz
+
+(cherry picked from commit cfa074628f24211d681b18d96be8eef7d217fcd9)
+---
+diff --git a/configure.ac b/configure.ac
+index d82ca48..d6e4b78 100644
+--- configure.ac
++++ configure.ac
+@@ -1897,7 +1897,8 @@ AM_CONDITIONAL(PLATFORM_OSX, test "x$platform_osx" = xyes)
+ # Check for GTK Mac Integration
+ ###############################
+ 
+-if test "x$platform_osx" != xno; then
++if test "x$platform_osx" != xno &&
++   test "x`$PKG_CONFIG --variable=target gtk+-2.0`" == "xquartz"; then
+   PKG_CHECK_MODULES(GTK_MAC_INTEGRATION, gtk-mac-integration >= gtk_mac_integration_required_version)
+ fi
+ 
+--
+cgit v0.9.2

Added: trunk/dports/graphics/gimp2/files/patch-link-os-x-integration.diff
===================================================================
--- trunk/dports/graphics/gimp2/files/patch-link-os-x-integration.diff	                        (rev 0)
+++ trunk/dports/graphics/gimp2/files/patch-link-os-x-integration.diff	2013-11-14 21:16:50 UTC (rev 113381)
@@ -0,0 +1,10 @@
+--- app/Makefile.am.orig	2013-11-14 10:34:21.000000000 -0800
++++ app/Makefile.am	2013-11-14 10:36:40.000000000 -0800
+@@ -198,6 +198,7 @@
+ 	widgets/libappwidgets.a	\
+ 	$(libgimpwidgets)	\
+ 	$(GTK_LIBS)		\
++	$(GTK_MAC_INTEGRATION_LIBS) \
+ 	$(DBUS_GLIB_LIBS)	\
+ 	$(gimpconsoleldadd)	\
+ 	$(GIMPRC)

Added: trunk/dports/graphics/gimp2/files/patch-os-x-integration-2d548c71.diff
===================================================================
--- trunk/dports/graphics/gimp2/files/patch-os-x-integration-2d548c71.diff	                        (rev 0)
+++ trunk/dports/graphics/gimp2/files/patch-os-x-integration-2d548c71.diff	2013-11-14 21:16:50 UTC (rev 113381)
@@ -0,0 +1,1539 @@
+From 2d548c71df2e62bd345e02f50e5a3c1b08a1cf1e Mon Sep 17 00:00:00 2001
+From: Daniel Sabo <DanielSabo at gmail.com>
+Date: Sat, 09 Nov 2013 20:00:55 +0000
+Subject: app: Port to gtk-mac-integration
+
+Replace deprecated Carbon APIs with Cocoa.
+
+Includes code by:
+Simone Karin Lehmann
+Michael Natterer
+Daniel Sabo
+
+(cherry picked from commit e56344294c90e1ba97de5c134b50c4c522f0808f)
+---
+diff --git a/app/Makefile.am b/app/Makefile.am
+index a4ef552..a2a1bde 100644
+--- app/Makefile.am
++++ app/Makefile.am
+@@ -90,7 +90,7 @@ gimp_2_8_SOURCES = $(libapp_sources) main.c
+ 
+ 
+ if PLATFORM_OSX
+-framework_carbon = -framework Carbon
++framework_cocoa = -framework Cocoa
+ endif
+ 
+ if OS_WIN32
+@@ -186,7 +186,7 @@ gimpconsoleldadd = \
+ gimp_2_8_LDFLAGS = \
+ 	$(AM_LDFLAGS)		\
+ 	$(win32_ldflags)	\
+-	$(framework_carbon)
++	$(framework_cocoa)
+ 
+ gimp_2_8_LDADD = \
+ 	gui/libappgui.a		\
+diff --git a/app/gui/Makefile.am b/app/gui/Makefile.am
+index 10f9c32..d2b07d5 100644
+--- app/gui/Makefile.am
++++ app/gui/Makefile.am
+@@ -1,17 +1,23 @@
+ ## Process this file with automake to produce Makefile.in
+ 
++if PLATFORM_OSX
++xobjective_c = "-xobjective-c"
++endif
++
+ AM_CPPFLAGS = \
+ 	-DG_LOG_DOMAIN=\"Gimp-GUI\"	\
+ 	-DGIMP_COMMAND=\"@GIMP_COMMAND@\"
+ 
+ INCLUDES = \
+-	-I$(top_builddir)	\
+-	-I$(top_srcdir)		\
+-	-I$(top_builddir)/app	\
+-	-I$(top_srcdir)/app	\
+-	$(GEGL_CFLAGS)		\
+-	$(GTK_CFLAGS)		\
+-	$(DBUS_GLIB_CFLAGS)	\
++	-I$(top_builddir)		\
++	-I$(top_srcdir)			\
++	-I$(top_builddir)/app		\
++	-I$(top_srcdir)/app		\
++	$(xobjective_c)			\
++	$(GEGL_CFLAGS)			\
++	$(GTK_CFLAGS)			\
++	$(DBUS_GLIB_CFLAGS)		\
++	$(GTK_MAC_INTEGRATION_CFLAGS)	\
+ 	-I$(includedir)
+ 
+ noinst_LIBRARIES = libappgui.a
+@@ -37,9 +43,7 @@ libappgui_a_sources = \
+ 	splash.c		\
+ 	splash.h		\
+ 	themes.c		\
+-	themes.h		\
+-	ige-mac-menu.c		\
+-	ige-mac-menu.h
++	themes.h
+ 
+ libappgui_a_built_sources = gimpdbusservice-glue.h 
+ 
+diff --git a/app/gui/gui-unique.c b/app/gui/gui-unique.c
+index 122d0f6..5218d78 100644
+--- app/gui/gui-unique.c
++++ app/gui/gui-unique.c
+@@ -24,8 +24,8 @@
+ #endif
+ 
+ #ifdef GDK_WINDOWING_QUARTZ
+-#include <Carbon/Carbon.h>
+-#include <sys/param.h>
++#import <AppKit/AppKit.h>
++#include <gtkosxapplication.h>
+ #endif
+ 
+ #if HAVE_DBUS_GLIB
+@@ -63,11 +63,16 @@ static HWND             proxy_window     = NULL;
+ #endif
+ 
+ #ifdef GDK_WINDOWING_QUARTZ
+-static void  gui_unique_mac_init (Gimp *gimp);
+-static void  gui_unique_mac_exit (void);
++static void gui_unique_quartz_init (Gimp *gimp);
++static void gui_unique_quartz_exit (void);
+ 
+-static Gimp            *unique_gimp      = NULL;
+-AEEventHandlerUPP       open_document_callback_proc;
++ at interface GimpAppleEventHandler : NSObject {}
++- (void) handleEvent:(NSAppleEventDescriptor *) inEvent
++        andReplyWith:(NSAppleEventDescriptor *) replyEvent;
++ at end
++
++static Gimp                   *unique_gimp   = NULL;
++static GimpAppleEventHandler  *event_handler = NULL;
+ #endif
+ 
+ 
+@@ -76,13 +81,11 @@ gui_unique_init (Gimp *gimp)
+ {
+ #ifdef G_OS_WIN32
+   gui_unique_win32_init (gimp);
+-#elif HAVE_DBUS_GLIB
++#elif defined (GDK_WINDOWING_QUARTZ)
++  gui_unique_quartz_init (gimp);
++#elif defined (HAVE_DBUS_GLIB)
+   gui_dbus_service_init (gimp);
+ #endif
+-
+-#ifdef GDK_WINDOWING_QUARTZ
+-  gui_unique_mac_init (gimp);
+-#endif
+ }
+ 
+ void
+@@ -90,13 +93,11 @@ gui_unique_exit (void)
+ {
+ #ifdef G_OS_WIN32
+   gui_unique_win32_exit ();
+-#elif HAVE_DBUS_GLIB
++#elif defined (GDK_WINDOWING_QUARTZ)
++  gui_unique_quartz_exit ();
++#elif defined (HAVE_DBUS_GLIB)
+   gui_dbus_service_exit ();
+ #endif
+-
+-#ifdef GDK_WINDOWING_QUARTZ
+-  gui_unique_mac_exit ();
+-#endif
+ }
+ 
+ 
+@@ -280,7 +281,7 @@ gui_unique_win32_exit (void)
+ #ifdef GDK_WINDOWING_QUARTZ
+ 
+ static gboolean
+-gui_unique_mac_idle_open (gchar *data)
++gui_unique_quartz_idle_open (gchar *path)
+ {
+   /*  We want to be called again later in case that GIMP is not fully
+    *  started yet.
+@@ -288,94 +289,126 @@ gui_unique_mac_idle_open (gchar *data)
+   if (! gimp_is_restored (unique_gimp))
+     return TRUE;
+ 
+-  if (data)
++  if (path)
+     {
+-      file_open_from_command_line (unique_gimp, data, FALSE);
++      file_open_from_command_line (unique_gimp, path, FALSE);
+     }
+ 
+   return FALSE;
+ }
+ 
+-/* Handle the kAEOpenDocuments Apple events. This will register
+- * an idle source callback for each filename in the event.
+- */
+-static pascal OSErr
+-gui_unique_mac_open_documents (const AppleEvent *inAppleEvent,
+-                               AppleEvent       *outAppleEvent,
+-                               long              handlerRefcon)
++static gboolean
++gui_unique_quartz_nsopen_file_callback (GtkosxApplication *osx_app,
++                                        gchar             *path,
++                                        gpointer           user_data)
+ {
+-  OSStatus    status;
+-  AEDescList  documents;
+-  gchar       path[MAXPATHLEN];
+-
+-  status = AEGetParamDesc (inAppleEvent,
+-                           keyDirectObject, typeAEList,
+-                           &documents);
+-  if (status == noErr)
+-    {
+-      long count = 0;
+-      int  i;
++  gchar    *callback_path;
++  GSource  *source;
++  GClosure *closure;
+ 
+-      AECountItems (&documents, &count);
++  callback_path = g_strdup (path);
+ 
+-      for (i = 0; i < count; i++)
+-        {
+-          FSRef    ref;
+-          gchar    *callback_path;
+-          GSource  *source;
+-          GClosure *closure;
++  closure = g_cclosure_new (G_CALLBACK (gui_unique_quartz_idle_open),
++                            (gpointer) callback_path,
++                            (GClosureNotify) g_free);
+ 
+-          status = AEGetNthPtr (&documents, i + 1, typeFSRef,
+-                                0, 0, &ref, sizeof (ref),
+-                                0);
+-          if (status != noErr)
+-            continue;
++  g_object_watch_closure (G_OBJECT (unique_gimp), closure);
+ 
+-          FSRefMakePath (&ref, (UInt8 *) path, MAXPATHLEN);
++  source = g_idle_source_new ();
+ 
+-          callback_path = g_strdup (path);
++  g_source_set_priority (source, G_PRIORITY_LOW);
++  g_source_set_closure (source, closure);
++  g_source_attach (source, NULL);
++  g_source_unref (source);
+ 
+-          closure = g_cclosure_new (G_CALLBACK (gui_unique_mac_idle_open),
+-                                    (gpointer) callback_path,
+-                                    (GClosureNotify) g_free);
++  return TRUE;
++}
+ 
+-          g_object_watch_closure (G_OBJECT (unique_gimp), closure);
++ at implementation GimpAppleEventHandler
++- (void) handleEvent: (NSAppleEventDescriptor *) inEvent
++        andReplyWith: (NSAppleEventDescriptor *) replyEvent
++{
++  const gchar       *path;
++  NSURL             *url;
++  NSAutoreleasePool *urlpool;
++  NSInteger          count;
++  NSInteger          i;
+ 
+-          source = g_idle_source_new ();
+-          g_source_set_priority (source, G_PRIORITY_LOW);
+-          g_source_set_closure (source, closure);
+-          g_source_attach (source, NULL);
+-          g_source_unref (source);
+-        }
++  urlpool = [[NSAutoreleasePool alloc] init];
++
++  count = [inEvent numberOfItems];
++
++  for (i = 1; i <= count; i++)
++    {
++      gchar    *callback_path;
++      GSource  *source;
++      GClosure *closure;
++
++      url = [NSURL URLWithString: [[inEvent descriptorAtIndex: i] stringValue]];
++      path = [[url path] UTF8String];
++
++      callback_path = g_strdup (path);
++      closure = g_cclosure_new (G_CALLBACK (gui_unique_quartz_idle_open),
++                                (gpointer) callback_path,
++                                (GClosureNotify) g_free);
++
++      g_object_watch_closure (G_OBJECT (unique_gimp), closure);
++
++      source = g_idle_source_new ();
++      g_source_set_priority (source, G_PRIORITY_LOW);
++      g_source_set_closure (source, closure);
++      g_source_attach (source, NULL);
++      g_source_unref (source);
+     }
+ 
+-    return status;
++  [urlpool drain];
+ }
++ at end
+ 
+ static void
+-gui_unique_mac_init (Gimp *gimp)
++gui_unique_quartz_init (Gimp *gimp)
+ {
++  GtkosxApplication *osx_app;
++
+   g_return_if_fail (GIMP_IS_GIMP (gimp));
+   g_return_if_fail (unique_gimp == NULL);
+ 
++  osx_app = gtkosx_application_get ();
++
+   unique_gimp = gimp;
+ 
+-  open_document_callback_proc = NewAEEventHandlerUPP(gui_unique_mac_open_documents);
++  g_signal_connect (osx_app, "NSApplicationOpenFile",
++                    G_CALLBACK (gui_unique_quartz_nsopen_file_callback),
++                    gimp);
++
++  /* Using the event handler is a hack, it is neccesary becuase
++   * gtkosx_application will drop the file open events if any
++   * event processing is done before gtkosx_application_ready is
++   * called, which we unfortuantly can't avoid doing right now.
++   */
++  event_handler = [[GimpAppleEventHandler alloc] init];
+ 
+-  AEInstallEventHandler (kCoreEventClass, kAEOpenDocuments,
+-                         open_document_callback_proc,
+-                         0L, TRUE);
++  [[NSAppleEventManager sharedAppleEventManager]
++      setEventHandler: event_handler
++          andSelector: @selector (handleEvent: andReplyWith:)
++        forEventClass: kCoreEventClass
++           andEventID: kAEOpenDocuments];
+ }
+ 
+ static void
+-gui_unique_mac_exit (void)
++gui_unique_quartz_exit (void)
+ {
++  g_return_if_fail (GIMP_IS_GIMP (unique_gimp));
++
+   unique_gimp = NULL;
+ 
+-  AERemoveEventHandler (kCoreEventClass, kAEOpenDocuments,
+-                        open_document_callback_proc, TRUE);
++  [[NSAppleEventManager sharedAppleEventManager]
++      removeEventHandlerForEventClass: kCoreEventClass
++                           andEventID: kAEOpenDocuments];
++
++  [event_handler release];
+ 
+-  DisposeAEEventHandlerUPP(open_document_callback_proc);
++  event_handler = NULL;
+ }
+ 
+ #endif /* GDK_WINDOWING_QUARTZ */
+diff --git a/app/gui/gui.c b/app/gui/gui.c
+index f3ad117..faaa91b 100644
+--- app/gui/gui.c
++++ app/gui/gui.c
+@@ -77,7 +77,7 @@
+ #include "splash.h"
+ #include "themes.h"
+ #ifdef GDK_WINDOWING_QUARTZ
+-#include "ige-mac-menu.h"
++#include <gtkosxapplication.h>
+ #endif /* GDK_WINDOWING_QUARTZ */
+ 
+ #include "gimp-intl.h"
+@@ -427,17 +427,26 @@ gui_restore_callback (Gimp               *gimp,
+ 
+ #ifdef GDK_WINDOWING_QUARTZ
+ static void
+-gui_add_to_app_menu (GimpUIManager   *ui_manager,
+-                     IgeMacMenuGroup *group,
+-                     const gchar     *action_path,
+-                     const gchar     *label)
++gui_add_to_app_menu (GimpUIManager     *ui_manager,
++                     GtkosxApplication *osx_app,
++                     const gchar       *action_path,
++                     gint               index)
+ {
+   GtkWidget *item;
+ 
+   item = gtk_ui_manager_get_widget (GTK_UI_MANAGER (ui_manager), action_path);
+ 
+   if (GTK_IS_MENU_ITEM (item))
+-    ige_mac_menu_add_app_menu_item (group, GTK_MENU_ITEM (item), label);
++    gtkosx_application_insert_app_menu_item (osx_app, GTK_WIDGET (item), index);
++}
++
++static gboolean
++gui_quartz_quit_callback (GtkosxApplication *osx_app,
++                          GimpUIManager     *ui_manager)
++{
++  gimp_ui_manager_activate_action (ui_manager, "file", "file-quit");
++
++  return TRUE;
+ }
+ #endif
+ 
+@@ -468,47 +477,50 @@ gui_restore_after_callback (Gimp               *gimp,
+ 
+ #ifdef GDK_WINDOWING_QUARTZ
+   {
+-    IgeMacMenuGroup *group;
+-    GtkWidget       *menu;
+-    GtkWidget       *item;
++    GtkosxApplication *osx_app;
++    GtkWidget         *menu;
++    GtkWidget         *item;
+ 
+-    menu = gtk_ui_manager_get_widget (GTK_UI_MANAGER (image_ui_manager),
+-				      "/dummy-menubar/image-popup");
++    osx_app = gtkosx_application_get ();
+ 
++    menu = gtk_ui_manager_get_widget (GTK_UI_MANAGER (image_ui_manager),
++                                      "/image-menubar");
+     if (GTK_IS_MENU_ITEM (menu))
+       menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (menu));
+ 
+-    ige_mac_menu_set_menu_bar (GTK_MENU_SHELL (menu));
++    gtkosx_application_set_menu_bar (osx_app, GTK_MENU_SHELL (menu));
++    gtkosx_application_set_use_quartz_accelerators (osx_app, FALSE);
+ 
+-    item = gtk_ui_manager_get_widget (GTK_UI_MANAGER (image_ui_manager),
+-                                      "/dummy-menubar/image-popup/File/file-quit");
+-    if (GTK_IS_MENU_ITEM (item))
+-      ige_mac_menu_set_quit_menu_item (GTK_MENU_ITEM (item));
++    gui_add_to_app_menu (image_ui_manager, osx_app,
++                         "/image-menubar/Help/dialogs-about", 0);
++
++#define PREFERENCES "/image-menubar/Edit/Preferences/"
+ 
+-    /*  the about group  */
+-    group = ige_mac_menu_add_app_menu_group ();
++    gui_add_to_app_menu (image_ui_manager, osx_app,
++                         PREFERENCES "dialogs-preferences", 2);
++    gui_add_to_app_menu (image_ui_manager, osx_app,
++                         PREFERENCES "dialogs-input-devices", 3);
++    gui_add_to_app_menu (image_ui_manager, osx_app,
++                         PREFERENCES "dialogs-keyboard-shortcuts", 4);
++    gui_add_to_app_menu (image_ui_manager, osx_app,
++                         PREFERENCES "dialogs-module-dialog", 5);
++    gui_add_to_app_menu (image_ui_manager, osx_app,
++                         PREFERENCES "plug-in-unit-editor", 6);
+ 
+-    gui_add_to_app_menu (image_ui_manager, group,
+-                         "/dummy-menubar/image-popup/Help/dialogs-about",
+-                         _("About GIMP"));
++#undef PREFERENCES
+ 
+-    /*  the preferences group  */
+-    group = ige_mac_menu_add_app_menu_group ();
++    item = gtk_separator_menu_item_new ();
++    gtkosx_application_insert_app_menu_item (osx_app, item, 7);
+ 
+-#define PREFERENCES "/dummy-menubar/image-popup/Edit/Preferences/"
++    item = gtk_ui_manager_get_widget (GTK_UI_MANAGER (image_ui_manager),
++                                      "/image-menubar/File/file-quit");
++    gtk_widget_hide (item);
+ 
+-    gui_add_to_app_menu (image_ui_manager, group,
+-                         PREFERENCES "dialogs-preferences", NULL);
+-    gui_add_to_app_menu (image_ui_manager, group,
+-                         PREFERENCES "dialogs-input-devices", NULL);
+-    gui_add_to_app_menu (image_ui_manager, group,
+-                         PREFERENCES "dialogs-keyboard-shortcuts", NULL);
+-    gui_add_to_app_menu (image_ui_manager, group,
+-                         PREFERENCES "dialogs-module-dialog", NULL);
+-    gui_add_to_app_menu (image_ui_manager, group,
+-                         PREFERENCES "plug-in-unit-editor", NULL);
++    g_signal_connect (osx_app, "NSApplicationBlockTermination",
++                      G_CALLBACK (gui_quartz_quit_callback),
++                      image_ui_manager);
+ 
+-#undef PREFERENCES
++    gtkosx_application_ready (osx_app);
+   }
+ #endif /* GDK_WINDOWING_QUARTZ */
+ 
+diff --git a/app/gui/ige-mac-menu.c b/app/gui/ige-mac-menu.c
+deleted file mode 100644
+index c352f8f..0000000
+--- app/gui/ige-mac-menu.c
++++ /dev/null
+@@ -1,988 +0,0 @@
+-/* GTK+ Integration for the Mac OS X Menubar.
+- *
+- * Copyright (C) 2007 Pioneer Research Center USA, Inc.
+- * Copyright (C) 2007 Imendio AB
+- *
+- * For further information, see:
+- * http://developer.imendio.com/projects/gtk-macosx/menubar
+- *
+- * 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, see
+- * <http://www.gnu.org/licenses/>.
+- */
+-
+-#include "config.h"
+-
+-#include <gtk/gtk.h>
+-
+-#ifdef GDK_WINDOWING_QUARTZ
+-
+-#include <gdk/gdkkeysyms.h>
+-#include <Carbon/Carbon.h>
+-
+-#include "ige-mac-menu.h"
+-
+-/* TODO
+- *
+- * - Adding a standard Window menu (Minimize etc)?
+- * - Sync reordering items? Does that work now?
+- * - Create on demand? (can this be done with gtk+? ie fill in menu
+-     items when the menu is opened)
+- * - Figure out what to do per app/window...
+- *
+- */
+-
+-#define IGE_QUARTZ_MENU_CREATOR 'IGEC'
+-#define IGE_QUARTZ_ITEM_WIDGET  'IWID'
+-
+-
+-static void   sync_menu_shell (GtkMenuShell *menu_shell,
+-			       MenuRef       carbon_menu,
+-			       gboolean      toplevel,
+-			       gboolean      debug);
+-
+-
+-/*
+- * utility functions
+- */
+-
+-static GtkWidget *
+-find_menu_label (GtkWidget *widget)
+-{
+-  GtkWidget *label = NULL;
+-
+-  if (GTK_IS_LABEL (widget))
+-    return widget;
+-
+-  if (GTK_IS_CONTAINER (widget))
+-    {
+-      GList *children;
+-      GList *l;
+-
+-      children = gtk_container_get_children (GTK_CONTAINER (widget));
+-
+-      for (l = children; l; l = l->next)
+-	{
+-	  label = find_menu_label (l->data);
+-	  if (label)
+-	    break;
+-	}
+-
+-      g_list_free (children);
+-    }
+-
+-  return label;
+-}
+-
+-static const gchar *
+-get_menu_label_text (GtkWidget  *menu_item,
+-		     GtkWidget **label)
+-{
+-  GtkWidget *my_label;
+-
+-  my_label = find_menu_label (menu_item);
+-  if (label)
+-    *label = my_label;
+-
+-  if (my_label)
+-    return gtk_label_get_text (GTK_LABEL (my_label));
+-
+-  return NULL;
+-}
+-
+-static gboolean
+-accel_find_func (GtkAccelKey *key,
+-		 GClosure    *closure,
+-		 gpointer     data)
+-{
+-  return (GClosure *) data == closure;
+-}
+-
+-
+-/*
+- * CarbonMenu functions
+- */
+-
+-typedef struct
+-{
+-  MenuRef menu;
+-  guint   toplevel : 1;
+-} CarbonMenu;
+-
+-static GQuark carbon_menu_quark = 0;
+-
+-static CarbonMenu *
+-carbon_menu_new (void)
+-{
+-  return g_slice_new0 (CarbonMenu);
+-}
+-
+-static void
+-carbon_menu_free (CarbonMenu *menu)
+-{
+-  g_slice_free (CarbonMenu, menu);
+-}
+-
+-static CarbonMenu *
+-carbon_menu_get (GtkWidget *widget)
+-{
+-  return g_object_get_qdata (G_OBJECT (widget), carbon_menu_quark);
+-}
+-
+-static void
+-carbon_menu_connect (GtkWidget *menu,
+-		     MenuRef    menuRef,
+-                     gboolean   toplevel)
+-{
+-  CarbonMenu *carbon_menu = carbon_menu_get (menu);
+-
+-  if (!carbon_menu)
+-    {
+-      carbon_menu = carbon_menu_new ();
+-
+-      g_object_set_qdata_full (G_OBJECT (menu), carbon_menu_quark,
+-			       carbon_menu,
+-			       (GDestroyNotify) carbon_menu_free);
+-    }
+-
+-  carbon_menu->menu     = menuRef;
+-  carbon_menu->toplevel = toplevel;
+-}
+-
+-
+-/*
+- * CarbonMenuItem functions
+- */
+-
+-typedef struct
+-{
+-  MenuRef        menu;
+-  MenuItemIndex  index;
+-  MenuRef        submenu;
+-  GClosure      *accel_closure;
+-} CarbonMenuItem;
+-
+-static GQuark carbon_menu_item_quark = 0;
+-
+-static CarbonMenuItem *
+-carbon_menu_item_new (void)
+-{
+-  return g_slice_new0 (CarbonMenuItem);
+-}
+-
+-static void
+-carbon_menu_item_free (CarbonMenuItem *menu_item)
+-{
+-  if (menu_item->accel_closure)
+-    g_closure_unref (menu_item->accel_closure);
+-
+-  g_slice_free (CarbonMenuItem, menu_item);
+-}
+-
+-static CarbonMenuItem *
+-carbon_menu_item_get (GtkWidget *widget)
+-{
+-  return g_object_get_qdata (G_OBJECT (widget), carbon_menu_item_quark);
+-}
+-
+-static void
+-carbon_menu_item_update_state (CarbonMenuItem *carbon_item,
+-			       GtkWidget      *widget)
+-{
+-  gboolean sensitive;
+-  gboolean visible;
+-  UInt32   set_attrs = 0;
+-  UInt32   clear_attrs = 0;
+-
+-  g_object_get (widget,
+-                "sensitive", &sensitive,
+-                "visible",   &visible,
+-                NULL);
+-
+-  if (!sensitive)
+-    set_attrs |= kMenuItemAttrDisabled;
+-  else
+-    clear_attrs |= kMenuItemAttrDisabled;
+-
+-  if (!visible)
+-    set_attrs |= kMenuItemAttrHidden;
+-  else
+-    clear_attrs |= kMenuItemAttrHidden;
+-
+-  ChangeMenuItemAttributes (carbon_item->menu, carbon_item->index,
+-                            set_attrs, clear_attrs);
+-}
+-
+-static void
+-carbon_menu_item_update_active (CarbonMenuItem *carbon_item,
+-				GtkWidget      *widget)
+-{
+-  gboolean active;
+-
+-  g_object_get (widget,
+-                "active", &active,
+-                NULL);
+-
+-  CheckMenuItem (carbon_item->menu, carbon_item->index,
+-		 active);
+-}
+-
+-static void
+-carbon_menu_item_update_submenu (CarbonMenuItem *carbon_item,
+-				 GtkWidget      *widget)
+-{
+-  GtkWidget *submenu;
+-
+-  submenu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (widget));
+-
+-  if (submenu)
+-    {
+-      const gchar *label_text;
+-      CFStringRef  cfstr = NULL;
+-
+-      label_text = get_menu_label_text (widget, NULL);
+-      if (label_text)
+-        cfstr = CFStringCreateWithCString (NULL, label_text,
+-					   kCFStringEncodingUTF8);
+-
+-      CreateNewMenu (0, 0, &carbon_item->submenu);
+-      SetMenuTitleWithCFString (carbon_item->submenu, cfstr);
+-      SetMenuItemHierarchicalMenu (carbon_item->menu, carbon_item->index,
+-				   carbon_item->submenu);
+-
+-      sync_menu_shell (GTK_MENU_SHELL (submenu), carbon_item->submenu, FALSE, FALSE);
+-
+-      if (cfstr)
+-	CFRelease (cfstr);
+-    }
+-  else
+-    {
+-      SetMenuItemHierarchicalMenu (carbon_item->menu, carbon_item->index,
+-				   NULL);
+-      carbon_item->submenu = NULL;
+-    }
+-}
+-
+-static void
+-carbon_menu_item_update_label (CarbonMenuItem *carbon_item,
+-			       GtkWidget      *widget)
+-{
+-  const gchar *label_text;
+-  CFStringRef  cfstr = NULL;
+-
+-  label_text = get_menu_label_text (widget, NULL);
+-  if (label_text)
+-    cfstr = CFStringCreateWithCString (NULL, label_text,
+-				       kCFStringEncodingUTF8);
+-
+-  SetMenuItemTextWithCFString (carbon_item->menu, carbon_item->index,
+-			       cfstr);
+-
+-  if (cfstr)
+-    CFRelease (cfstr);
+-}
+-
+-static void
+-carbon_menu_item_update_accelerator (CarbonMenuItem *carbon_item,
+-				     GtkWidget      *widget)
+-{
+-  GtkWidget *label;
+-
+-  get_menu_label_text (widget, &label);
+-
+-  if (GTK_IS_ACCEL_LABEL (label))
+-    {
+-      GClosure      *closure;
+-
+-      g_object_get (label, "accel-closure", &closure, NULL);
+-
+-      if (closure)
+-	{
+-	  GtkAccelGroup *group;
+-	  GtkAccelKey   *key;
+-
+-	  group = gtk_accel_group_from_accel_closure (closure);
+-	  key = gtk_accel_group_find (group, accel_find_func, closure);
+-
+-	  g_closure_unref (closure);
+-
+-	  if (key            &&
+-	      key->accel_key &&
+-	      key->accel_flags & GTK_ACCEL_VISIBLE)
+-	    {
+-	      GdkDisplay      *display = gtk_widget_get_display (widget);
+-	      GdkKeymap       *keymap  = gdk_keymap_get_for_display (display);
+-	      GdkKeymapKey    *keys;
+-	      gint             n_keys;
+-
+-	      if (gdk_keymap_get_entries_for_keyval (keymap, key->accel_key,
+-						     &keys, &n_keys))
+-		{
+-		  UInt8 modifiers = 0;
+-
+-		  SetMenuItemCommandKey (carbon_item->menu, carbon_item->index,
+-					 true, keys[0].keycode);
+-
+-		  g_free (keys);
+-
+-		  if (key->accel_mods)
+-		    {
+-		      if (key->accel_mods & GDK_SHIFT_MASK)
+-			modifiers |= kMenuShiftModifier;
+-
+-		      if (key->accel_mods & GDK_MOD1_MASK)
+-			modifiers |= kMenuOptionModifier;
+-		    }
+-
+-		  if (!(key->accel_mods & GDK_META_MASK))
+-		    {
+-		      modifiers |= kMenuNoCommandModifier;
+-		    }
+-
+-		  SetMenuItemModifiers (carbon_item->menu, carbon_item->index,
+-					modifiers);
+-
+-		  return;
+-		}
+-	    }
+-	}
+-    }
+-
+-  /*  otherwise, clear the menu shortcut  */
+-  SetMenuItemModifiers (carbon_item->menu, carbon_item->index,
+-			kMenuNoModifiers | kMenuNoCommandModifier);
+-  ChangeMenuItemAttributes (carbon_item->menu, carbon_item->index,
+-			    0, kMenuItemAttrUseVirtualKey);
+-  SetMenuItemCommandKey (carbon_item->menu, carbon_item->index,
+-			 false, 0);
+-}
+-
+-static void
+-carbon_menu_item_accel_changed (GtkAccelGroup   *accel_group,
+-				guint            keyval,
+-				GdkModifierType  modifier,
+-				GClosure        *accel_closure,
+-				GtkWidget       *widget)
+-{
+-  CarbonMenuItem *carbon_item = carbon_menu_item_get (widget);
+-  GtkWidget      *label;
+-
+-  get_menu_label_text (widget, &label);
+-
+-  if (GTK_IS_ACCEL_LABEL (label))
+-    {
+-      GClosure *closure;
+-
+-      g_object_get (label, "accel-closure", &closure, NULL);
+-
+-      if (closure)
+-	{
+-	  if (closure == accel_closure)
+-	    carbon_menu_item_update_accelerator (carbon_item, widget);
+-
+-	  g_closure_unref (closure);
+-	}
+-    }
+-}
+-
+-static void
+-carbon_menu_item_update_accel_closure (CarbonMenuItem *carbon_item,
+-				       GtkWidget      *widget)
+-{
+-  GtkAccelGroup *group;
+-  GtkWidget     *label;
+-
+-  get_menu_label_text (widget, &label);
+-
+-  if (carbon_item->accel_closure)
+-    {
+-      group = gtk_accel_group_from_accel_closure (carbon_item->accel_closure);
+-
+-      g_signal_handlers_disconnect_by_func (group,
+-					    carbon_menu_item_accel_changed,
+-					    widget);
+-
+-      g_closure_unref (carbon_item->accel_closure);
+-      carbon_item->accel_closure = NULL;
+-    }
+-
+-  if (GTK_IS_ACCEL_LABEL (label))
+-    g_object_get (label, "accel-closure", &carbon_item->accel_closure, NULL);
+-
+-  if (carbon_item->accel_closure)
+-    {
+-      group = gtk_accel_group_from_accel_closure (carbon_item->accel_closure);
+-
+-      g_signal_connect_object (group, "accel-changed",
+-			       G_CALLBACK (carbon_menu_item_accel_changed),
+-			       widget, 0);
+-    }
+-
+-  carbon_menu_item_update_accelerator (carbon_item, widget);
+-}
+-
+-static void
+-carbon_menu_item_notify (GObject        *object,
+-			 GParamSpec     *pspec,
+-			 CarbonMenuItem *carbon_item)
+-{
+-  if (!strcmp (pspec->name, "sensitive") ||
+-      !strcmp (pspec->name, "visible"))
+-    {
+-      carbon_menu_item_update_state (carbon_item, GTK_WIDGET (object));
+-    }
+-  else if (!strcmp (pspec->name, "active"))
+-    {
+-      carbon_menu_item_update_active (carbon_item, GTK_WIDGET (object));
+-    }
+-  else if (!strcmp (pspec->name, "submenu"))
+-    {
+-      carbon_menu_item_update_submenu (carbon_item, GTK_WIDGET (object));
+-    }
+-}
+-
+-static void
+-carbon_menu_item_notify_label (GObject    *object,
+-			       GParamSpec *pspec,
+-			       gpointer    data)
+-{
+-  CarbonMenuItem *carbon_item = carbon_menu_item_get (GTK_WIDGET (object));
+-
+-  if (!strcmp (pspec->name, "label"))
+-    {
+-      carbon_menu_item_update_label (carbon_item,
+-				     GTK_WIDGET (object));
+-    }
+-  else if (!strcmp (pspec->name, "accel-closure"))
+-    {
+-      carbon_menu_item_update_accel_closure (carbon_item,
+-					     GTK_WIDGET (object));
+-    }
+-}
+-
+-static CarbonMenuItem *
+-carbon_menu_item_connect (GtkWidget     *menu_item,
+-			  GtkWidget     *label,
+-			  MenuRef        menu,
+-			  MenuItemIndex  index)
+-{
+-  CarbonMenuItem *carbon_item = carbon_menu_item_get (menu_item);
+-
+-  if (!carbon_item)
+-    {
+-      carbon_item = carbon_menu_item_new ();
+-
+-      g_object_set_qdata_full (G_OBJECT (menu_item), carbon_menu_item_quark,
+-			       carbon_item,
+-			       (GDestroyNotify) carbon_menu_item_free);
+-
+-      g_signal_connect (menu_item, "notify",
+-                        G_CALLBACK (carbon_menu_item_notify),
+-                        carbon_item);
+-
+-      if (label)
+-	g_signal_connect_swapped (label, "notify::label",
+-				  G_CALLBACK (carbon_menu_item_notify_label),
+-				  menu_item);
+-    }
+-
+-  carbon_item->menu  = menu;
+-  carbon_item->index = index;
+-
+-  return carbon_item;
+-}
+-
+-static gboolean
+-menu_event_activate_callback (GtkMenuItem *widget)
+-{
+-  gtk_menu_item_activate (GTK_MENU_ITEM  (widget));
+-
+-  return FALSE;
+-}
+-
+-/*
+- * carbon event handler
+- */
+-
+-static OSStatus
+-menu_event_handler_func (EventHandlerCallRef  event_handler_call_ref,
+-			 EventRef             event_ref,
+-			 void                *data)
+-{
+-  UInt32  event_class = GetEventClass (event_ref);
+-  UInt32  event_kind = GetEventKind (event_ref);
+-  MenuRef menu_ref;
+-
+-  switch (event_class)
+-    {
+-    case kEventClassCommand:
+-      /* This is called when activating (is that the right GTK+ term?)
+-       * a menu item.
+-       */
+-      if (event_kind == kEventCommandProcess)
+-	{
+-	  HICommand command;
+-	  OSStatus  err;
+-
+-	  /*g_printerr ("Menu: kEventClassCommand/kEventCommandProcess\n");*/
+-
+-	  err = GetEventParameter (event_ref, kEventParamDirectObject,
+-				   typeHICommand, 0,
+-				   sizeof (command), 0, &command);
+-
+-	  if (err == noErr)
+-	    {
+-	      GtkWidget *widget = NULL;
+-
+-	      /* Get any GtkWidget associated with the item. */
+-	      err = GetMenuItemProperty (command.menu.menuRef,
+-					 command.menu.menuItemIndex,
+-					 IGE_QUARTZ_MENU_CREATOR,
+-					 IGE_QUARTZ_ITEM_WIDGET,
+-					 sizeof (widget), 0, &widget);
+-	      if (err == noErr && GTK_IS_WIDGET (widget))
+-		{
+-                  GSource  *source;
+-                  GClosure *closure;
+-
+-                  closure = g_cclosure_new (G_CALLBACK (menu_event_activate_callback),
+-                                            widget, NULL);
+-
+-                  g_object_watch_closure (G_OBJECT (widget), closure);
+-
+-                  source = g_idle_source_new ();
+-                  g_source_set_priority (source, G_PRIORITY_HIGH);
+-                  g_source_set_closure (source, closure);
+-                  g_source_attach (source, NULL);
+-                  g_source_unref (source);
+-
+-		  return noErr;
+-		}
+-	    }
+-	}
+-      break;
+-
+-    case kEventClassMenu:
+-      GetEventParameter (event_ref,
+-			 kEventParamDirectObject,
+-			 typeMenuRef,
+-			 NULL,
+-			 sizeof (menu_ref),
+-			 NULL,
+-			 &menu_ref);
+-
+-      switch (event_kind)
+-	{
+-	case kEventMenuTargetItem:
+-	  /* This is called when an item is selected (what is the
+-	   * GTK+ term? prelight?)
+-	   */
+-	  /*g_printerr ("kEventClassMenu/kEventMenuTargetItem\n");*/
+-	  break;
+-
+-	case kEventMenuOpening:
+-	  /* Is it possible to dynamically build the menu here? We
+-	   * can at least set visibility/sensitivity.
+-	   */
+-	  /*g_printerr ("kEventClassMenu/kEventMenuOpening\n");*/
+-	  break;
+-
+-	case kEventMenuClosed:
+-	  /*g_printerr ("kEventClassMenu/kEventMenuClosed\n");*/
+-	  break;
+-
+-	default:
+-	  break;
+-	}
+-
+-      break;
+-
+-    default:
+-      break;
+-    }
+-
+-  return CallNextEventHandler (event_handler_call_ref, event_ref);
+-}
+-
+-static void
+-setup_menu_event_handler (void)
+-{
+-  static gboolean is_setup = FALSE;
+-
+-  EventHandlerUPP menu_event_handler_upp;
+-  EventHandlerRef menu_event_handler_ref;
+-  const EventTypeSpec menu_events[] = {
+-    { kEventClassCommand, kEventCommandProcess },
+-    { kEventClassMenu, kEventMenuTargetItem },
+-    { kEventClassMenu, kEventMenuOpening },
+-    { kEventClassMenu, kEventMenuClosed }
+-  };
+-
+-  if (is_setup)
+-    return;
+-
+-  /* FIXME: We might have to install one per window? */
+-
+-  menu_event_handler_upp = NewEventHandlerUPP (menu_event_handler_func);
+-  InstallEventHandler (GetApplicationEventTarget (), menu_event_handler_upp,
+-		       GetEventTypeCount (menu_events), menu_events, 0,
+-		       &menu_event_handler_ref);
+-
+-#if 0
+-  /* FIXME: Remove the handler with: */
+-  RemoveEventHandler(menu_event_handler_ref);
+-  DisposeEventHandlerUPP(menu_event_handler_upp);
+-#endif
+-
+-  is_setup = TRUE;
+-}
+-
+-static void
+-sync_menu_shell (GtkMenuShell *menu_shell,
+-                 MenuRef       carbon_menu,
+-		 gboolean      toplevel,
+-		 gboolean      debug)
+-{
+-  GList         *children;
+-  GList         *l;
+-  MenuItemIndex  carbon_index = 1;
+-
+-  if (debug)
+-    g_printerr ("%s: syncing shell %p\n", G_STRFUNC, menu_shell);
+-
+-  carbon_menu_connect (GTK_WIDGET (menu_shell), carbon_menu, toplevel);
+-
+-  children = gtk_container_get_children (GTK_CONTAINER (menu_shell));
+-
+-  for (l = children; l; l = l->next)
+-    {
+-      GtkWidget      *menu_item = l->data;
+-      CarbonMenuItem *carbon_item;
+-
+-      if (GTK_IS_TEAROFF_MENU_ITEM (menu_item))
+-	continue;
+-
+-      if (toplevel && g_object_get_data (G_OBJECT (menu_item),
+-					 "gtk-empty-menu-item"))
+-	continue;
+-
+-      carbon_item = carbon_menu_item_get (menu_item);
+-
+-      if (debug)
+-	g_printerr ("%s: carbon_item %d for menu_item %d (%s, %s)\n",
+-		    G_STRFUNC, carbon_item ? carbon_item->index : -1,
+-		    carbon_index, get_menu_label_text (menu_item, NULL),
+-		    g_type_name (G_TYPE_FROM_INSTANCE (menu_item)));
+-
+-      if (carbon_item && carbon_item->index != carbon_index)
+-	{
+-	  if (debug)
+-	    g_printerr ("%s:   -> not matching, deleting\n", G_STRFUNC);
+-
+-	  DeleteMenuItem (carbon_item->menu, carbon_index);
+-	  carbon_item = NULL;
+-	}
+-
+-      if (!carbon_item)
+-	{
+-	  GtkWidget          *label      = NULL;
+-	  const gchar        *label_text;
+-	  CFStringRef         cfstr      = NULL;
+-	  MenuItemAttributes  attributes = 0;
+-
+-	  if (debug)
+-	    g_printerr ("%s:   -> creating new\n", G_STRFUNC);
+-
+-	  label_text = get_menu_label_text (menu_item, &label);
+-	  if (label_text)
+-	    cfstr = CFStringCreateWithCString (NULL, label_text,
+-					       kCFStringEncodingUTF8);
+-
+-	  if (GTK_IS_SEPARATOR_MENU_ITEM (menu_item))
+-	    attributes |= kMenuItemAttrSeparator;
+-
+-	  if (!gtk_widget_is_sensitive (menu_item))
+-	    attributes |= kMenuItemAttrDisabled;
+-
+-	  if (!gtk_widget_get_visible (menu_item))
+-	    attributes |= kMenuItemAttrHidden;
+-
+-	  InsertMenuItemTextWithCFString (carbon_menu, cfstr,
+-					  carbon_index - 1,
+-					  attributes, 0);
+-	  SetMenuItemProperty (carbon_menu, carbon_index,
+-			       IGE_QUARTZ_MENU_CREATOR,
+-			       IGE_QUARTZ_ITEM_WIDGET,
+-			       sizeof (menu_item), &menu_item);
+-
+-	  if (cfstr)
+-	    CFRelease (cfstr);
+-
+-	  carbon_item = carbon_menu_item_connect (menu_item, label,
+-						  carbon_menu,
+-						  carbon_index);
+-
+-	  if (GTK_IS_CHECK_MENU_ITEM (menu_item))
+-	    carbon_menu_item_update_active (carbon_item, menu_item);
+-
+-	  carbon_menu_item_update_accel_closure (carbon_item, menu_item);
+-
+-	  if (gtk_menu_item_get_submenu (GTK_MENU_ITEM (menu_item)))
+-	    carbon_menu_item_update_submenu (carbon_item, menu_item);
+-	}
+-
+-      carbon_index++;
+-    }
+-
+-  g_list_free (children);
+-}
+-
+-static gulong emission_hook_id    = 0;
+-static gint   emission_hook_count = 0;
+-
+-static gboolean
+-parent_set_emission_hook (GSignalInvocationHint *ihint,
+-			  guint                  n_param_values,
+-			  const GValue          *param_values,
+-			  gpointer               data)
+-{
+-  GtkWidget *instance = g_value_get_object (param_values);
+-
+-  if (GTK_IS_MENU_ITEM (instance))
+-    {
+-      GtkWidget *previous_parent = g_value_get_object (param_values + 1);
+-      GtkWidget *menu_shell      = NULL;
+-
+-      if (GTK_IS_MENU_SHELL (previous_parent))
+-	{
+-	  menu_shell = previous_parent;
+-        }
+-      else
+-      {
+-        GtkWidget *parent;
+-
+-        parent = gtk_widget_get_parent (instance);
+-
+-        if (GTK_IS_MENU_SHELL (parent))
+-	  {
+-	    menu_shell = parent;
+-	  }
+-      }
+-
+-      if (menu_shell)
+-        {
+-	  CarbonMenu *carbon_menu = carbon_menu_get (menu_shell);
+-
+-	  if (carbon_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
+-
+-	      sync_menu_shell (GTK_MENU_SHELL (menu_shell),
+-			       carbon_menu->menu,
+-			       carbon_menu->toplevel,
+-			       FALSE);
+-	    }
+-        }
+-    }
+-
+-  return TRUE;
+-}
+-
+-static void
+-parent_set_emission_hook_remove (GtkWidget *widget,
+-				 gpointer   data)
+-{
+-  emission_hook_count--;
+-
+-  if (emission_hook_count > 0)
+-    return;
+-
+-  g_signal_remove_emission_hook (g_signal_lookup ("parent-set",
+-						  GTK_TYPE_WIDGET),
+-				 emission_hook_id);
+-  emission_hook_id = 0;
+-}
+-
+-
+-/*
+- * public functions
+- */
+-
+-void
+-ige_mac_menu_set_menu_bar (GtkMenuShell *menu_shell)
+-{
+-  CarbonMenu *current_menu;
+-  MenuRef     carbon_menubar;
+-
+-  g_return_if_fail (GTK_IS_MENU_SHELL (menu_shell));
+-
+-  if (carbon_menu_quark == 0)
+-    carbon_menu_quark = g_quark_from_static_string ("CarbonMenu");
+-
+-  if (carbon_menu_item_quark == 0)
+-    carbon_menu_item_quark = g_quark_from_static_string ("CarbonMenuItem");
+-
+-  current_menu = carbon_menu_get (GTK_WIDGET (menu_shell));
+-  if (current_menu)
+-    {
+-      SetRootMenu (current_menu->menu);
+-      return;
+-    }
+-
+-  CreateNewMenu (0 /*id*/, 0 /*options*/, &carbon_menubar);
+-  SetRootMenu (carbon_menubar);
+-
+-  setup_menu_event_handler ();
+-
+-  if (emission_hook_id == 0)
+-    {
+-      emission_hook_id =
+-        g_signal_add_emission_hook (g_signal_lookup ("parent-set",
+-                                                     GTK_TYPE_WIDGET),
+-                                    0,
+-                                    parent_set_emission_hook,
+-                                    NULL, NULL);
+-    }
+-
+-  emission_hook_count++;
+-
+-  g_signal_connect (menu_shell, "destroy",
+-		    G_CALLBACK (parent_set_emission_hook_remove),
+-		    NULL);
+-
+-  sync_menu_shell (menu_shell, carbon_menubar, TRUE, FALSE);
+-}
+-
+-void
+-ige_mac_menu_set_quit_menu_item (GtkMenuItem *menu_item)
+-{
+-  MenuRef       appmenu;
+-  MenuItemIndex index;
+-
+-  g_return_if_fail (GTK_IS_MENU_ITEM (menu_item));
+-
+-  setup_menu_event_handler ();
+-
+-  if (GetIndMenuItemWithCommandID (NULL, kHICommandQuit, 1,
+-                                   &appmenu, &index) == noErr)
+-    {
+-      SetMenuItemCommandID (appmenu, index, 0);
+-      SetMenuItemProperty (appmenu, index,
+-                           IGE_QUARTZ_MENU_CREATOR,
+-                           IGE_QUARTZ_ITEM_WIDGET,
+-                           sizeof (menu_item), &menu_item);
+-
+-      gtk_widget_hide (GTK_WIDGET (menu_item));
+-    }
+-}
+-
+-
+-struct _IgeMacMenuGroup
+-{
+-  GList *items;
+-};
+-
+-static GList *app_menu_groups = NULL;
+-
+-IgeMacMenuGroup *
+-ige_mac_menu_add_app_menu_group (void)
+-{
+-  IgeMacMenuGroup *group = g_slice_new0 (IgeMacMenuGroup);
+-
+-  app_menu_groups = g_list_append (app_menu_groups, group);
+-
+-  return group;
+-}
+-
+-void
+-ige_mac_menu_add_app_menu_item (IgeMacMenuGroup *group,
+-				GtkMenuItem     *menu_item,
+-				const gchar     *label)
+-{
+-  MenuRef  appmenu;
+-  GList   *list;
+-  gint     index = 0;
+-
+-  g_return_if_fail (group != NULL);
+-  g_return_if_fail (GTK_IS_MENU_ITEM (menu_item));
+-
+-  setup_menu_event_handler ();
+-
+-  if (GetIndMenuItemWithCommandID (NULL, kHICommandHide, 1,
+-                                   &appmenu, NULL) != noErr)
+-    {
+-      g_warning ("%s: retrieving app menu failed",
+-		 G_STRFUNC);
+-      return;
+-    }
+-
+-  for (list = app_menu_groups; list; list = g_list_next (list))
+-    {
+-      IgeMacMenuGroup *list_group = list->data;
+-
+-      index += g_list_length (list_group->items);
+-
+-      /*  adjust index for the separator between groups, but not
+-       *  before the first group
+-       */
+-      if (list_group->items && list->prev)
+-	index++;
+-
+-      if (group == list_group)
+-	{
+-	  CFStringRef cfstr;
+-
+-	  /*  add a separator before adding the first item, but not
+-	   *  for the first group
+-	   */
+-	  if (!group->items && list->prev)
+-	    {
+-	      InsertMenuItemTextWithCFString (appmenu, NULL, index,
+-					      kMenuItemAttrSeparator, 0);
+-	      index++;
+-	    }
+-
+-	  if (!label)
+-	    label = get_menu_label_text (GTK_WIDGET (menu_item), NULL);
+-
+-	  cfstr = CFStringCreateWithCString (NULL, label,
+-					     kCFStringEncodingUTF8);
+-
+-	  InsertMenuItemTextWithCFString (appmenu, cfstr, index, 0, 0);
+-	  SetMenuItemProperty (appmenu, index + 1,
+-			       IGE_QUARTZ_MENU_CREATOR,
+-			       IGE_QUARTZ_ITEM_WIDGET,
+-			       sizeof (menu_item), &menu_item);
+-
+-	  CFRelease (cfstr);
+-
+-	  gtk_widget_hide (GTK_WIDGET (menu_item));
+-
+-	  group->items = g_list_append (group->items, menu_item);
+-
+-	  return;
+-	}
+-    }
+-
+-  if (!list)
+-    g_warning ("%s: app menu group %p does not exist",
+-	       G_STRFUNC, group);
+-}
+-
+-#endif /* GDK_WINDOWING_QUARTZ */
+diff --git a/app/gui/ige-mac-menu.h b/app/gui/ige-mac-menu.h
+deleted file mode 100644
+index b7def85..0000000
+--- app/gui/ige-mac-menu.h
++++ /dev/null
+@@ -1,43 +0,0 @@
+-/* GTK+ Integration for the Mac OS X Menubar.
+- *
+- * Copyright (C) 2007 Pioneer Research Center USA, Inc.
+- * Copyright (C) 2007 Imendio AB
+- *
+- * For further information, see:
+- * http://developer.imendio.com/projects/gtk-macosx/menubar
+- *
+- * 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, see
+- * <http://www.gnu.org/licenses/>.
+- */
+-
+-#ifndef __IGE_MAC_MENU_H__
+-#define __IGE_MAC_MENU_H__
+-
+-#include <gtk/gtk.h>
+-
+-G_BEGIN_DECLS
+-
+-typedef struct _IgeMacMenuGroup IgeMacMenuGroup;
+-
+-void              ige_mac_menu_set_menu_bar       (GtkMenuShell    *menu_shell);
+-void              ige_mac_menu_set_quit_menu_item (GtkMenuItem     *menu_item);
+-
+-IgeMacMenuGroup * ige_mac_menu_add_app_menu_group (void);
+-void              ige_mac_menu_add_app_menu_item  (IgeMacMenuGroup *group,
+-						   GtkMenuItem     *menu_item,
+-						   const gchar     *label);
+-
+-G_END_DECLS
+-
+-#endif /* __IGE_MAC_MENU_H__ */
+diff --git a/configure.ac b/configure.ac
+index 712f30f..038b5e6 100644
+--- configure.ac
++++ configure.ac
+@@ -64,6 +64,7 @@ m4_define([exif_required_version], [0.6.15])
+ m4_define([lcms1_required_version], [1.16])
+ m4_define([lcms2_required_version], [2.2])
+ m4_define([libpng_required_version], [1.2.37])
++m4_define([gtk_mac_integration_required_version], [1.0.1])
+ 
+ 
+ AC_INIT([GIMP], [gimp_version],
+@@ -1843,6 +1844,14 @@ if test "x$enable_python" != xno; then
+ fi
+ AM_CONDITIONAL(BUILD_PYTHON, test "x$enable_python" != xno)
+ 
++####################################
++# Check for GTK Mac Integration
++####################################
++
++if test "x$platform_osx" != xno; then
++  PKG_CHECK_MODULES(GTK_MAC_INTEGRATION, gtk-mac-integration >= gtk_mac_integration_required_version)
++fi
++
+ 
+ #########################################
+ # Check whether Script-Fu should be built
+--
+cgit v0.9.2
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macports-changes/attachments/20131114/4b544d08/attachment-0001.html>


More information about the macports-changes mailing list