Re: [Gtk-osx-users] GtkOSXApplication menu support



Hi John

Here is the test sample.

Click on "Change Icon" and a new window will open. The extra Apple menu will also appear.

--
Med Venlig Hilsen / Kind Regards

Mikkel Kruse Johnsen
IT Ansvarlig, Medejer

Structura IT ApS
Kratbjerg 212
3480 Fredensborg

Telefon: +45 4816 1001
Telefax: +45 4824 5320
Direkte: +45 2128 7793
e-mail: mikkel structura-it dk


søn, 10 04 2011 kl. 12:18 -0700, skrev John Ralls:
On Apr 10, 2011, at 10:11 AM, Mikkel Kruse Johnsen wrote:

> Hi Jesse and Others
> 
> Did you resolve your problem with the extra apple menu ?
> 
> I have the same issue, it appears when I create a new window and switching between windows makes it disappear.
> 
> I also have a problem getting the "Window" and main menu to translate. Did you get this to work ?
> 

Can you create a minimal sample, perhaps by jiggering testintegration, that demonstrates the problem? Even if the problem turns out to be in your code this often helps find what the problem is.

Regards
John Ralls


/* GTK+ Integration for the Mac OS X.
 *
 * Copyright (C) 2007 Imendio AB
 * Copyright © 2009, 2010 John Ralls
 *
 * For further information, see:
 * http://sourceforge.net/apps/trac/gtk-osx/wiki/Integrate
 *
 * This library 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.1 of the License, or
 * (at your option) any later version.
 *
 * 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.
 */

/* - Dock menu (see
 *   https://bugzilla.mozilla.org/show_bug.cgi?id=377166) It looks
 *   like we have to use NSMenu for this unfortunately. However, it
 *   might be possible to implement a category or to use the "method
 *   swizzling" trick to override this somehow... look into that.
 * 
 *   or, triggering the carbon dock setup before sharedapp:
 *
 *     EventTypeSpec kFakeEventList[] = { { INT_MAX, INT_MAX } };
       EventRef event;
       ReceiveNextEvent (GetEventTypeCount (kFakeEventList),
                         kFakeEventList,
                         kEventDurationNoWait, false, 
                         &event);
 *
 * - Dragging items onto the dock icon?
 * - Dragging items onto the app launcher icon?
 *
 * - Handling many windows with menus...?
 *
 * - Better statusicon integration (real menu)
 *
 * - "Window" menu, add a way to add a standard Window menu.
 * - Window listing in the dock menu.
 *
 * - Implement moving borderless windows by dragging the window
 *   background.
 *
 * - Suspend/resume notification.
 * - Network on/off notification.
 * - GtkCheckMenuItems
 * - GtkRadioMenuItems (special case of GtkCheckMenuItems)
 */

/* Uncomment ONE of these to test menu-mangling: */
//#define IGEMACINTEGRATION
#define GTKOSXAPPLICATION
/* These others are optional */
#define BUILT_UI
//#define QUARTZ_HANDLERS

/* IGEMACINTEGRATION uses Carbon, which isn't available for 64-bit builds. */
#ifdef __x86_64__
#undef IGEMACINTEGRATION
#ifndef GTKOSXAPPLICATION
#define GTKOSXAPPLICATION
#endif
#endif //__x86_64__

#include <gtk/gtk.h>
#include <stdio.h>
#if GTK_CHECK_VERSION(2,90,7)
#include <gdk/gdkkeysyms-compat.h>
#else
#include <gdk/gdkkeysyms.h>
#endif

#ifdef IGEMACINTEGRATION
#include "ige-mac-menu.h"
#include "ige-mac-dock.h"
#include "ige-mac-bundle.h"
#endif
#ifdef GTKOSXAPPLICATION
#include "gtkosxapplication.h"
#endif

typedef struct {
  GtkWindow *window;
  GtkWidget *open_item;
  GtkWidget *edit_item;
  GtkWidget *copy_item;
  GtkWidget *quit_item;
  GtkWidget *help_menu;
  GtkWidget *about_item;
  GtkWidget *preferences_item;
} MenuItems;

static GQuark menu_items_quark = 0;

static MenuItems *
menu_items_new() {
    return g_slice_new0 (MenuItems);
}

static void
menu_items_destroy(MenuItems *items) {
    g_slice_free(MenuItems, items);
}

typedef struct {
    gchar *label;
    gpointer item;
} MenuCBData;

static MenuCBData *
menu_cbdata_new (gchar *label, gpointer item) {
    MenuCBData *datum =  g_slice_new0 (MenuCBData);
    datum->label = label;
    datum->item = item;
    g_object_ref (datum->item);
    return datum;
}

static void
menu_cbdata_delete (MenuCBData *datum) {
    g_object_unref (datum->item);
    g_slice_free (MenuCBData, datum);
}

static void
menu_item_activate_cb (GtkWidget *item,
                       MenuCBData  *datum)
{
  gboolean visible;
  gboolean sensitive;
  MenuItems *items = g_object_get_qdata (G_OBJECT(datum->item),
					 menu_items_quark);
  if (GTK_IS_WINDOW(G_OBJECT(datum->item)))
      g_print ("Item activated: %s:%s\n",
	       gtk_window_get_title(GTK_WINDOW(datum->item)),
	       datum->label);
  else
    g_print ("Item activated %s\n", datum->label);

  if (!items)
    return;

  g_object_get (G_OBJECT (items->copy_item),
                "visible", &visible,
                "sensitive", &sensitive,
                NULL);

  if (item == items->open_item) {
    gtk_widget_set_sensitive (items->copy_item,
			      !gtk_widget_get_sensitive(items->copy_item));
  }
}

#ifdef BUILT_UI

static void
action_activate_cb(GtkAction* action, gpointer data)
{
  GtkWindow *window = data;
  g_print("Window %s, Action %s\n", gtk_window_get_title(window),
	  gtk_action_get_name(action));
}

static GtkActionEntry test_actions[] = 
  {
    /*{Name, stock_id, label, accelerator, tooltip, callback} */
    {"FileMenuAction", NULL, "_File", NULL, NULL, NULL},
    {"OpenAction",  GTK_STOCK_OPEN, "_Open", NULL, NULL, 
     G_CALLBACK(action_activate_cb)},
    {"QuitAction", GTK_STOCK_QUIT, "_Quit", NULL, NULL,
     G_CALLBACK(gtk_main_quit)},
    {"EditMenuAction", NULL, "_Edit", NULL, NULL, NULL },
    {"CopyAction", GTK_STOCK_COPY, "_Copy", NULL, NULL,
     G_CALLBACK(action_activate_cb)},
    {"PasteAction", GTK_STOCK_PASTE, "_Paste", NULL, NULL,
     G_CALLBACK(action_activate_cb)},
    {"PrefsAction", GTK_STOCK_PREFERENCES, "Pr_eferences", NULL, NULL, NULL },
    {"HelpMenuAction", NULL, "_Help", NULL, NULL, NULL },
    {"AboutAction", GTK_STOCK_ABOUT, "_About", NULL, NULL,
     G_CALLBACK(action_activate_cb)},
    {"HelpAction", GTK_STOCK_HELP, "_Help", NULL, NULL, 
     G_CALLBACK(action_activate_cb)},
  };

static void
radio_item_changed_cb (GtkAction* action, GtkAction* current, MenuCBData *datum)
{
    g_print ("Radio group %s in window %s changed value: %s is now active.\n", 
	     datum->label, gtk_window_get_title(GTK_WINDOW(datum->item)), 
	     gtk_action_get_name(GTK_ACTION(current)));
}

static GtkActionEntry view_menu[] =
{
    {"ViewMenuAction", NULL, "_View", NULL, NULL, NULL},
};

static GtkRadioActionEntry view_actions[] = 
{
/* Name, StockID, Label, Accelerator, Tooltip, Value */
    {"HorizontalAction", NULL, "_Horizontal", NULL, NULL, 0},
    {"VerticalAction", NULL, "_Vertical", NULL, NULL, 0},
};
#else //not BUILT_UI
#if !defined QUARTZ_HANDLERS && defined GTKOSXAPPLICATION

/* This is needed as a callback to enable accelerators when not using
 * the Quartz event handling path and using GtkMenuItems instead of
 * GtkActions, otherwise hiding the menu disables accelerators. */

static gboolean
can_activate_cb(GtkWidget* widget, guint signal_id, gpointer data)
{
  return gtk_widget_is_sensitive(widget);
}
#endif //!QUARTZ_HANDLERS

static GtkWidget *
test_setup_menu (MenuItems *items, GtkAccelGroup *accel)
{
  GtkWidget *menubar;
  GtkWidget *menu;
  GtkWidget *item;
  menubar = gtk_menu_bar_new ();

  item = gtk_menu_item_new_with_label ("File");
  gtk_menu_shell_append (GTK_MENU_SHELL (menubar), item);
  menu = gtk_menu_new ();
  gtk_menu_set_accel_group(GTK_MENU(menu), accel);
  gtk_menu_set_accel_path(GTK_MENU(menu), "<test-integration>/File");
  gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), menu);
  item = gtk_image_menu_item_new_from_stock(GTK_STOCK_OPEN, NULL);
  items->open_item = item;
/* We're being fancy with our connection here so that we don't have to
 * have a separate callback function for each menu item, since each
 * one is going to print out a message saying what item got
 * selected. A real-life menu item usually uses just
 * g-signal_connect() to a dedicated callback -- or uses GuiManager
 * action closures.
 */
  g_signal_connect_data (item, "activate", G_CALLBACK (menu_item_activate_cb),
			 menu_cbdata_new ("open", items->window),
			 (GClosureNotify) menu_cbdata_delete, 0);
  gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
  items->quit_item = gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT, NULL);
  g_signal_connect (items->quit_item, "activate", G_CALLBACK (gtk_main_quit), NULL);
  gtk_menu_shell_append (GTK_MENU_SHELL (menu), items->quit_item);
//Set accelerators
  gtk_accel_map_add_entry("<test-integration>/File/Open", GDK_o, 
			  GDK_CONTROL_MASK);
  gtk_accel_map_add_entry("<test-integration>/File/Quit", GDK_q, 
			  GDK_CONTROL_MASK);
  items->edit_item = item = gtk_menu_item_new_with_label ("Edit");

  gtk_menu_shell_append (GTK_MENU_SHELL (menubar), item);
  menu = gtk_menu_new ();
  gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), menu);
  item = gtk_menu_item_new_with_label ("Copy");
  items->copy_item = item;
  g_signal_connect_data (item, "activate", G_CALLBACK (menu_item_activate_cb),
			 menu_cbdata_new ("copy", items->window),
			 (GClosureNotify) menu_cbdata_delete, 0);
  gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);

  item = gtk_menu_item_new_with_label ("Paste");
  g_signal_connect_data (item, "activate", G_CALLBACK (menu_item_activate_cb),
			 menu_cbdata_new ( "paste", items->window),
			 (GClosureNotify) menu_cbdata_delete, 0);
  gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);

  items->preferences_item = gtk_menu_item_new_with_label ("Preferences");
  g_signal_connect_data (items->preferences_item, "activate", 
			 G_CALLBACK (menu_item_activate_cb), 
			 menu_cbdata_new ("preferences", items->window),
			 (GClosureNotify) menu_cbdata_delete, 0);
  gtk_menu_shell_append (GTK_MENU_SHELL (menu), items->preferences_item);

  item = gtk_menu_item_new_with_label ("Help");
  items->help_menu = item;
  gtk_menu_shell_append (GTK_MENU_SHELL (menubar), item);
  menu = gtk_menu_new ();
  gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), menu);

  items->about_item = gtk_menu_item_new_with_label ("About");
  g_signal_connect_data (items->about_item, "activate", 
			 G_CALLBACK (menu_item_activate_cb), 
			 menu_cbdata_new ("about", items->window),
			 (GClosureNotify) menu_cbdata_delete, 0);
  gtk_menu_shell_append (GTK_MENU_SHELL (menu), items->about_item);

  return menubar;
}
#endif //not BUILT_UI

#ifdef IGEMACINTEGRATION
static void
dock_clicked_cb (IgeMacDock *dock,
                 GtkWindow  *window)
{
  g_print ("Dock clicked\n");
  gtk_window_deiconify (window);
}

static void
bounce_cb (GtkWidget  *button,
           IgeMacDock *dock)
{
  ige_mac_dock_attention_request (dock, IGE_MAC_ATTENTION_INFO);
}

static void
change_icon_cb (GtkWidget  *button,
                IgeMacDock *dock)
{
  static gboolean   changed;
  static GdkPixbuf *pixbuf;

  if (!pixbuf) {
      char filename[PATH_MAX];
      snprintf (filename, sizeof(filename), "%s/%s", PREFIX, 
		 "share/gtk-2.0/demo/gnome-foot.png");
      pixbuf = gdk_pixbuf_new_from_file (filename, NULL);
  }

  if (changed) 
    ige_mac_dock_set_icon_from_pixbuf (dock, NULL);
  else
    ige_mac_dock_set_icon_from_pixbuf (dock, pixbuf);

  changed = !changed;
}
#elif defined GTKOSXAPPLICATION
typedef struct {
  GtkOSXApplication *app;
  GtkOSXApplicationAttentionType type;
} AttentionRequest;

static gboolean
attention_cb(AttentionRequest* req)
{
  gtk_osxapplication_attention_request(req->app, req->type);
  g_free(req);
  return FALSE;
}

static void
bounce_cb (GtkWidget  *button,
           GtkOSXApplication *app)
{
  AttentionRequest *req = g_new0 (AttentionRequest, 1);
  req->app = app;
  req->type = CRITICAL_REQUEST;
  g_timeout_add_seconds(2, (GSourceFunc)attention_cb, req);
  g_print("Now switch to some other application\n");
}

static GtkWidget *create_window(const gchar *);

static void
change_icon_cb (GtkWidget  *button,
                GtkOSXApplication *app)
{
	GtkWidget *window3;

	window3 = create_window("Test Integration Window 2");	
}
#endif

static void
change_menu_cb (GtkWidget  *button,
                gpointer    user_data)
{
  GtkWidget *window = gtk_widget_get_toplevel(button);
  MenuItems *items = g_object_get_qdata(G_OBJECT(window), menu_items_quark);
  const gchar* open_accel_path =
      gtk_menu_item_get_accel_path(GTK_MENU_ITEM(items->open_item));
  const gchar* quit_accel_path =
      gtk_menu_item_get_accel_path(GTK_MENU_ITEM(items->quit_item));

  if (gtk_widget_get_visible(items->edit_item)) {
      gtk_widget_set_visible(items->edit_item, FALSE);
      gtk_accel_map_change_entry(open_accel_path, GDK_o,
				 GDK_MOD1_MASK, TRUE);
      gtk_accel_map_change_entry(quit_accel_path, GDK_q,
				 GDK_MOD1_MASK, TRUE);
  } else {
     gtk_widget_set_visible(items->edit_item, TRUE);
     gtk_accel_map_change_entry(open_accel_path, GDK_o,
				GDK_CONTROL_MASK, TRUE);
     gtk_accel_map_change_entry(quit_accel_path, GDK_q,
				GDK_CONTROL_MASK, TRUE);
  }
}

static void
view_menu_cb (GtkWidget *button, gpointer user_data)
{
#ifdef BUILT_UI
  GtkToggleButton *toggle = GTK_TOGGLE_BUTTON(button);
  static guint mergeid = 0;
  static GtkActionGroup* view_action_group = NULL;
  GtkUIManager *mgr = user_data;
  GtkWidget *window = gtk_widget_get_toplevel(button);
  GtkOSXApplication *theApp = g_object_new(GTK_TYPE_OSX_APPLICATION, NULL);
  GError *err = NULL;
  if (view_action_group == NULL) {
    view_action_group = gtk_action_group_new("ViewAction");
    gtk_action_group_add_actions(view_action_group, view_menu,
				 sizeof(view_menu)/sizeof(GtkActionEntry),
				 NULL);
    gtk_action_group_add_radio_actions_full(
	    view_action_group, view_actions, 
	    sizeof(view_actions)/sizeof(GtkRadioActionEntry), 
	    0, G_CALLBACK(radio_item_changed_cb),
	    menu_cbdata_new ("View", GTK_WINDOW(window)),
	    (GDestroyNotify) menu_cbdata_delete );
  }
  if (gtk_toggle_button_get_active(toggle)) {
    mergeid = gtk_ui_manager_add_ui_from_file(mgr, "src/addedui.xml", &err);
    if (err) {
      g_print("Error retrieving file: %d %s\n", mergeid, err->message);
    }
    gtk_ui_manager_insert_action_group(mgr, view_action_group, 0);
    {
      GtkWidget *menu = gtk_menu_new();
      GtkWidget *item;
      item = gtk_menu_item_new_with_label("Framish");
      g_signal_connect_data (item, "activate",
			     G_CALLBACK (menu_item_activate_cb),
			     menu_cbdata_new ( "Framish", item),
			     (GClosureNotify) menu_cbdata_delete, 0);
      gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
      item = gtk_menu_item_new_with_label("Freebish");
      g_signal_connect_data (item, "activate",
			     G_CALLBACK (menu_item_activate_cb),
			     menu_cbdata_new ( "Freebish", item),
			     (GClosureNotify) menu_cbdata_delete, 0);
      gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
      gtk_osxapplication_set_dock_menu(theApp, GTK_MENU_SHELL(menu));
    }
  }
  else if (mergeid) {
    gtk_ui_manager_remove_action_group(mgr, view_action_group);
    gtk_ui_manager_remove_ui(mgr, mergeid);
    mergeid = 0;
  }
#else
  g_print("View Menu Toggle Button doesn't actually do anything in the hand-built menu build\n");
#endif //BUILT_UI
}

#ifdef GTKOSXAPPLICATION
static void
app_active_cb (GtkOSXApplication* app, gboolean* data)
{
  g_print("Application became %s\n", *data ? "active" : "inactive");
}

static gboolean
app_should_quit_cb (GtkOSXApplication *app, gpointer data)
{
  static gboolean abort = TRUE;
  gboolean answer;
  answer = abort;
  abort = FALSE;
  g_print ("Application has been requested to quit, %s\n", answer ? "but no!" :
	   "it's OK.");
  return answer;
}

static void
app_will_quit_cb (GtkOSXApplication *app, gpointer data)
{
  g_print ("Quitting Now\n");
  gtk_main_quit();
}

static gboolean
app_open_file_cb (GtkOSXApplication *app, gchar *path, gpointer user_data)
{
    g_print("File open event for %s", path);
    return FALSE;
}

#endif //GTKOSXAPPLICATION
#ifdef IGEMACINTEGRATION

gboolean _ige_mac_menu_is_quit_menu_item_handled (void);

static GtkWidget *
create_window(IgeMacDock *dock, const gchar *title)
{
#else
static GtkWidget *
create_window(const gchar *title)
{
  gpointer	dock = NULL;
#endif
  GtkWidget	  *window;
  GtkWidget       *vbox;
  GtkWidget       *menubar;
  GtkWidget       *bbox;
  GtkWidget       *button;
  GtkWidget	  *textentry;
  MenuItems       *items = menu_items_new();
#ifdef BUILT_UI
  GtkUIManager *mgr = gtk_ui_manager_new();
  GtkActionGroup *actions = gtk_action_group_new("TestActions");
  guint mergeid;
  GError *err = NULL;
  GtkAccelGroup *accel_group;
#else //not BUILT_UI
  GtkAccelGroup *accel_group = gtk_accel_group_new();
#endif //not BUILT_UI
#ifdef IGEMACINTEGRATION
  IgeMacMenuGroup *group;
#endif //IGEMACINTEGRATION
#ifdef GTKOSXAPPLICATION
  GtkOSXApplication *theApp = g_object_new(GTK_TYPE_OSX_APPLICATION, NULL);
#endif //GTKOSXAPPLICATION
  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  if (title)
      gtk_window_set_title (GTK_WINDOW (window), title);
  gtk_window_set_default_size (GTK_WINDOW (window), 400, 300);
  items->window = GTK_WINDOW (window);
  vbox = gtk_vbox_new (FALSE, 0);
  gtk_container_add (GTK_CONTAINER (window), vbox);
#ifdef BUILT_UI
  mergeid = gtk_ui_manager_add_ui_from_file(mgr, "src/testui.xml", &err);
  if (err) {
    g_print("Error retrieving file: %d %s\n", mergeid, err->message);
  }
  gtk_action_group_add_actions(actions, test_actions,
			       sizeof(test_actions)/sizeof(GtkActionEntry),
			       (gpointer)window);
  gtk_ui_manager_insert_action_group(mgr, actions, 0);
  menubar = gtk_ui_manager_get_widget(mgr, "/menubar");
  items->open_item = gtk_ui_manager_get_widget(mgr, "/menubar/File/Open");
  items->edit_item = gtk_ui_manager_get_widget(mgr, "/menubar/Edit");
  items->copy_item = gtk_ui_manager_get_widget(mgr, "/menubar/Edit/Copy");
  items->help_menu = gtk_ui_manager_get_widget(mgr, "/menubar/Help");
  items->quit_item = gtk_ui_manager_get_widget(mgr, "/menubar/File/Quit");
  items->about_item = gtk_ui_manager_get_widget(mgr, "/menubar/Help/About");
  items->preferences_item = gtk_ui_manager_get_widget(mgr, "/menubar/Edit/Preferences");
  accel_group = gtk_ui_manager_get_accel_group(mgr);
#else //not BUILT_UI
  menubar = test_setup_menu (items, accel_group);
#endif //not BUILT_UI
  gtk_window_add_accel_group(GTK_WINDOW(window), accel_group);
  gtk_box_pack_start (GTK_BOX (vbox), 
                      menubar,
                      FALSE, TRUE, 0);
  
  gtk_box_pack_start (GTK_BOX (vbox), 
                      gtk_label_new ("Some window content here"), 
                      FALSE, FALSE, 12);

  bbox = gtk_hbutton_box_new ();
  gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), GTK_BUTTONBOX_CENTER);
  gtk_box_set_spacing (GTK_BOX (bbox), 12);

  gtk_box_pack_start (GTK_BOX (vbox), 
                      bbox,
                      TRUE, TRUE, 0);

  button = gtk_button_new_with_mnemonic ("B_ounce");
  g_signal_connect (button, "clicked", G_CALLBACK (bounce_cb), dock);
  gtk_box_pack_start (GTK_BOX (bbox), 
                      button,
                      FALSE, FALSE, 0);

  button = gtk_button_new_with_label ("Change Icon");
  g_signal_connect (button, "clicked", G_CALLBACK (change_icon_cb), dock);
  gtk_box_pack_start (GTK_BOX (bbox), 
                      button,
                      FALSE, FALSE, 0);

  button = gtk_button_new_with_label ("Change Menu");
  g_signal_connect (button, "clicked", G_CALLBACK (change_menu_cb), NULL);
  gtk_box_pack_start (GTK_BOX (bbox),
                      button,
                      FALSE, FALSE, 0);
  button = gtk_toggle_button_new_with_label("View Menu");
  textentry = gtk_entry_new();
  gtk_box_pack_start(GTK_BOX (vbox), textentry, TRUE, TRUE, 2);
#ifdef BUILT_UI
  g_signal_connect(button, "toggled", G_CALLBACK (view_menu_cb), (gpointer)mgr);
#else //not BUILT_UI
  g_signal_connect(button, "toggled", G_CALLBACK (view_menu_cb), NULL);
#endif //not BUILT_UI
  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), FALSE);
  gtk_box_pack_start (GTK_BOX (bbox),
		      button,
		      FALSE, FALSE, 0);

  gtk_widget_show_all (window);
#if defined IGE_MAC_MENU || defined GTKOSXAPPLICATION
  gtk_widget_hide (menubar);
#ifdef GTKOSXAPPLICATION
/* Not really necessary unless quartz accelerator handling is turned off. */
#if !defined QUARTZ_HANDLERS && !defined BUILT_UI
  g_signal_connect(menubar, "can-activate-accel", 
		   G_CALLBACK(can_activate_cb), NULL);
#endif // !defined QUARTZ_HANDLERS && !defined BUILT_UI
#endif  //GTKOSXAPPLICATION
#endif //defined IGE_MAC_MENU || defined GTKOSXAPPLICATION
#ifdef IGEMACINTEGRATION
  ige_mac_menu_set_menu_bar (GTK_MENU_SHELL (menubar));
  ige_mac_menu_set_quit_menu_item (GTK_MENU_ITEM (items->quit_item));
  group = ige_mac_menu_add_app_menu_group ();
  ige_mac_menu_add_app_menu_item  (group,
				   GTK_MENU_ITEM (items->about_item),
				   "About");
  group = ige_mac_menu_add_app_menu_group ();
  ige_mac_menu_add_app_menu_item  (group,
				   GTK_MENU_ITEM (items->preferences_item),
				   "Preferences");
#endif //IGEMACINTEGRATION
#ifdef GTKOSXAPPLICATION
  GtkWidget *sep;
  gtk_osxapplication_set_menu_bar(theApp, GTK_MENU_SHELL(menubar));
  gtk_osxapplication_insert_app_menu_item  (theApp, items->about_item,
					    0);
  sep = gtk_separator_menu_item_new();
  g_object_ref(sep);
  gtk_osxapplication_insert_app_menu_item  (theApp, sep, 1);
  gtk_osxapplication_insert_app_menu_item  (theApp,
					    items->preferences_item,
					    2);
  sep = gtk_separator_menu_item_new();
  g_object_ref(sep);
  gtk_osxapplication_insert_app_menu_item  (theApp, sep, 3);

  gtk_osxapplication_set_help_menu(theApp, GTK_MENU_ITEM(items->help_menu));
  gtk_osxapplication_set_window_menu(theApp, NULL);
#endif //GTKOSXAPPLICATION
  if (!menu_items_quark)
      menu_items_quark = g_quark_from_static_string("MenuItem");
  g_object_set_qdata_full(G_OBJECT(window), menu_items_quark, 
			  items, (GDestroyNotify)menu_items_destroy);
  return window;
}

int
main (int argc, char **argv)
{
  GtkWidget       *window1, *window2;
#ifdef IGEMACINTEGRATION
  IgeMacDock      *dock;
#endif //IGEMACINTEGRATION
#ifdef GTKOSXAPPLICATION
  GtkOSXApplication *theApp;
#endif //GTKOSXAPPLICATION
  gtk_init (&argc, &argv);
#ifdef IGEMACINTEGRATION
  dock = ige_mac_dock_get_default ();
  window1 = create_window(dock, "Test Integration Window 1"); 
  window2 = create_window(dock, "Test Integration Window 2"); 
  dock = ige_mac_dock_new ();
  g_signal_connect (dock,
                    "clicked",
                    G_CALLBACK (dock_clicked_cb),
                    window1);
  g_signal_connect (dock,

                    "quit-activate",
                    G_CALLBACK (gtk_main_quit),
                    window1);
#endif //IGEMACINTEGRATION
#ifdef GTKOSXAPPLICATION
  theApp  = g_object_new(GTK_TYPE_OSX_APPLICATION, NULL);
  window1 = create_window("Test Integration Window 1");
  window2 = create_window("Test Integration Window 2");
  {
    gboolean falseval = FALSE;
    gboolean trueval = TRUE;
    g_signal_connect(theApp, "NSApplicationDidBecomeActive",
		     G_CALLBACK(app_active_cb), &trueval);
    g_signal_connect(theApp, "NSApplicationWillResignActive",
		     G_CALLBACK(app_active_cb), &falseval);
    g_signal_connect(theApp, "NSApplicationBlockTermination",
		     G_CALLBACK(app_should_quit_cb), NULL);
    g_signal_connect(theApp, "NSApplicationWillTerminate",
		     G_CALLBACK(app_will_quit_cb), NULL);
    g_signal_connect(theApp, "NSApplicationOpenFile",
		     G_CALLBACK(app_open_file_cb), NULL);
  }
#ifndef QUARTZ_HANDLERS
  gtk_osxapplication_set_use_quartz_accelerators(theApp, FALSE);
#endif //QUARTZ_HANDLERS
  gtk_osxapplication_ready(theApp);
  {
    const gchar *id = quartz_application_get_bundle_id();
    if (id != NULL) {
      g_print ("TestIntegration Error! Bundle Has ID %s\n", id); 
    }
  }
#endif //GTKOSXAPPLICATION
  gtk_accel_map_load("accel_map");
  gtk_main ();
#ifdef GTKOSXAPPLICATION
  g_object_unref(theApp);
#endif //GTKOSXAPPLICATION
  return 0;
}


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]