aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar pboutill <pboutill@85f007b7-540e-0410-9357-904b9bb8a0f7>2012-09-17 14:26:49 +0000
committerGravatar pboutill <pboutill@85f007b7-540e-0410-9357-904b9bb8a0f7>2012-09-17 14:26:49 +0000
commita6dac9962929d724c08c9a74a8e05de06469a1a0 (patch)
tree50b0390b38f18c27c2c171c1cbfd130200fa6289
parent26f21ad4387a2e9b9c16712859881fee5625f79b (diff)
MacOS integration uses lablgtkosx >= 1.1
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@15814 85f007b7-540e-0410-9357-904b9bb8a0f7
-rw-r--r--Makefile.build5
-rwxr-xr-xconfigure8
-rw-r--r--ide/coqide_main.ml443
-rw-r--r--ide/ide_mac_stubs.c85
4 files changed, 32 insertions, 109 deletions
diff --git a/Makefile.build b/Makefile.build
index 2a9986d10..9d9f08ea0 100644
--- a/Makefile.build
+++ b/Makefile.build
@@ -315,8 +315,9 @@ coqide-files: $(IDEFILES)
ifeq ($(HASCOQIDE),opt)
$(COQIDE): $(LINKIDEOPT) | $(COQTOPEXE)
$(SHOW)'OCAMLOPT -o $@'
- $(HIDE)$(OCAMLOPT) $(COQIDEFLAGS) $(OPTFLAGS) $(IDEOPTFLAGS) -o $@ unix.cmxa threads.cmxa\
- lablgtk.cmxa lablgtksourceview2.cmxa gtkThread.cmx str.cmxa $(LINKIDEOPT)
+ $(HIDE)$(OCAMLOPT) $(COQIDEFLAGS) $(OPTFLAGS) -o $@ unix.cmxa threads.cmxa \
+ lablgtk.cmxa lablgtksourceview2.cmxa $(IDEOPTFLAGS) gtkThread.cmx \
+ str.cmxa $(LINKIDEOPT)
$(STRIP) $@
else
$(COQIDE): $(COQIDEBYTE)
diff --git a/configure b/configure
index f8ac8e99e..1f87c9dd1 100755
--- a/configure
+++ b/configure
@@ -647,11 +647,9 @@ else
else
echo "LablGtk2 found, native threads: native CoqIde will be available."
COQIDE=opt
- if [ "$nomacintegration_spec" = "no" ] && pkg-config --exists gtk-mac-integration;
+ if [ "$nomacintegration_spec" = "no" ] && lablgtkosxdir=$(ocamlfind query lablgtkosx 2> /dev/null);
then
- cflags=$cflags" `pkg-config --cflags gtk-mac-integration`"
- IDEARCHFLAGS='-ccopt "`pkg-config --libs gtk-mac-integration`"'
- IDEARCHFILE=ide/ide_mac_stubs.o
+ IDEARCHFLAGS=lablgtkosx.cmxa
IDEARCHDEF=QUARTZ
elif [ "$ARCH" = "win32" ];
then
@@ -673,6 +671,8 @@ case $COQIDE in
no) LABLGTKINCLUDES="";;
esac
+[ x$lablgtkosxdir = x ] || LABLGTKINCLUDES="$LABLGTKINCLUDES -I $lablgtkosxdir"
+
# strip command
case $ARCH in
diff --git a/ide/coqide_main.ml4 b/ide/coqide_main.ml4
index 91ae8a96b..b3eee72db 100644
--- a/ide/coqide_main.ml4
+++ b/ide/coqide_main.ml4
@@ -6,19 +6,6 @@
(* * GNU Lesser General Public License Version 2.1 *)
(************************************************************************)
-IFDEF QUARTZ THEN
-external gtk_mac_init : (string -> unit) -> (unit -> bool) -> unit
- = "caml_gtk_mac_init"
-
-external gtk_mac_ready : ([> Gtk.widget ] as 'a) Gtk.obj -> ([> Gtk.widget ] as 'a) Gtk.obj ->
- ([> Gtk.widget ] as 'a) Gtk.obj -> unit
- = "caml_gtk_mac_ready"
-END
-
-let initmac () = IFDEF QUARTZ THEN gtk_mac_init Coqide.do_load Coqide.forbid_quit_to_save ELSE () END
-
-let macready x y z = IFDEF QUARTZ THEN gtk_mac_ready x#as_widget y#as_widget z#as_widget ELSE () END
-
(* On win32, we add the directory of coqide to the PATH at launch-time
(this used to be done in a .bat script). *)
@@ -66,8 +53,19 @@ END
let () =
Coqide.ignore_break ();
- ignore (GtkMain.Main.init ());
- initmac ();
+ ignore (GtkMain.Main.init ())
+
+IFDEF QUARTZ THEN
+ let osx = GOSXApplication.osxapplication ()
+
+ let _ =
+ osx#connect#ns_application_open_file ~callback:(fun x -> Coqide.do_load x; true) in
+ let _ =
+ osx#connect#ns_application_block_termination ~callback:Coqide.forbid_quit_to_save in
+ ()
+END
+
+let () =
(* Statup preferences *)
begin
try Preferences.load_pref ()
@@ -90,9 +88,18 @@ let () =
Coq.check_connection args;
Coqide.sup_args := args;
Coqide.main files;
- if !Coq_config.with_geoproof then ignore (Thread.create Coqide.check_for_geoproof_input ());
- macready (Coqide_ui.ui_m#get_widget "/CoqIde MenuBar") (Coqide_ui.ui_m#get_widget "/CoqIde MenuBar/Edit/Prefs")
- (Coqide_ui.ui_m#get_widget "/CoqIde MenuBar/Help/Abt");
+ if !Coq_config.with_geoproof then ignore (Thread.create Coqide.check_for_geoproof_input ())
+
+IFDEF QUARTZ THEN
+ let () =
+ GtkOSXApplication.OSXApplication.set_menu_bar osx#as_osxapplication (GtkMenu.MenuShell.cast (Coqide_ui.ui_m#get_widget "/CoqIde MenuBar")#as_widget) in
+ let () =
+ GtkOSXApplication.OSXApplication.insert_app_menu_item osx#as_osxapplication (Coqide_ui.ui_m#get_widget "/CoqIde MenuBar/Edit/Prefs")#as_widget 1 in
+ let () =
+ GtkOSXApplication.OSXApplication.set_help_menu osx#as_osxapplication (Some (GtkMenu.MenuItem.cast (Coqide_ui.ui_m#get_widget "/CoqIde MenuBar/Help")#as_widget)) in
+ osx#ready ()
+END
+
while true do
try
GtkThread.main ()
diff --git a/ide/ide_mac_stubs.c b/ide/ide_mac_stubs.c
deleted file mode 100644
index 2aeb2bf42..000000000
--- a/ide/ide_mac_stubs.c
+++ /dev/null
@@ -1,85 +0,0 @@
-#include <caml/mlvalues.h>
-#include <caml/alloc.h>
-#include <caml/memory.h>
-#include <caml/callback.h>
-#include <caml/fail.h>
-
-#include <gtk/gtk.h>
-#include <lablgtk2/wrappers.h>
-#include <lablgtk2/ml_glib.h>
-#include <lablgtk2/ml_gobject.h>
-#include <gtkmacintegration/gtkosxapplication.h>
-
-GtkOSXApplication *theApp;
-value open_file_fun, forbid_quit_fun, themenubar, pref_item, about_item;
-
-static void osx_accel_map_foreach_lcb(gpointer data,const gchar *accel_path,
- guint accel_key, GdkModifierType accel_mods,
- gboolean changed) {
- if (accel_mods & GDK_CONTROL_MASK) {
- accel_mods |= GDK_META_MASK;
- accel_mods &= (accel_mods & GDK_MOD1_MASK) ? ~GDK_MOD1_MASK : ~GDK_CONTROL_MASK;
- if (!gtk_accel_map_change_entry(accel_path,accel_key,accel_mods,FALSE)) {
- g_print("could not change accelerator %s\n",accel_path);
- }
- }
- if (accel_mods & GDK_MOD1_MASK) {
- accel_mods &= ~ GDK_MOD1_MASK;
- accel_mods |= GDK_CONTROL_MASK;
- if (!gtk_accel_map_change_entry(accel_path,accel_key,accel_mods,FALSE)) {
- g_print("could not change accelerator %s\n",accel_path);
- }
- }
-}
-
-static gboolean deal_with_open(GtkOSXApplication *app, gchar *path, gpointer user_data)
-{
- CAMLparam0();
- CAMLlocal2(string_path, res);
- string_path = caml_copy_string(path);
- res = caml_callback_exn(open_file_fun,string_path);
- gboolean truc = !(Is_exception_result(res));
- CAMLreturnT(gboolean, truc);
-}
-
-static gboolean deal_with_quit(GtkOSXApplication *app, gpointer user_data)
-{
- CAMLparam0();
- CAMLlocal1(res);
- res = caml_callback_exn(forbid_quit_fun,Val_unit);
- gboolean truc = (Bool_val(res))||((Is_exception_result(res)));
- CAMLreturnT(gboolean, truc);
-}
-
-CAMLprim value caml_gtk_mac_init(value open_file_the_fun, value forbid_quit_the_fun)
-{
- CAMLparam2(open_file_the_fun,forbid_quit_the_fun);
- open_file_fun = open_file_the_fun;
- caml_register_generational_global_root(&open_file_fun);
- forbid_quit_fun = forbid_quit_the_fun;
- caml_register_generational_global_root(&forbid_quit_fun);
- theApp = g_object_new(GTK_TYPE_OSX_APPLICATION, NULL);
- g_signal_connect(theApp, "NSApplicationOpenFile", G_CALLBACK(deal_with_open), NULL);
- g_signal_connect(theApp, "NSApplicationBlockTermination", G_CALLBACK(deal_with_quit), NULL);
- CAMLreturn (Val_unit);
-}
-
-CAMLprim value caml_gtk_mac_ready(value menubar, value prefs, value about)
-{
- GtkOSXApplicationMenuGroup * pref_grp, * about_grp;
- CAMLparam3(menubar,prefs,about);
- themenubar = menubar;
- pref_item = prefs;
- about_item = about;
- caml_register_generational_global_root(&themenubar);
- caml_register_generational_global_root(&pref_item);
- caml_register_generational_global_root(&about_item);
- /* gtk_accel_map_foreach(NULL, osx_accel_map_foreach_lcb);*/
- gtk_osxapplication_set_menu_bar(theApp,check_cast(GTK_MENU_SHELL,themenubar));
- gtk_osxapplication_insert_app_menu_item(theApp,check_cast(GTK_WIDGET,about_item),1);
- gtk_osxapplication_insert_app_menu_item(theApp,gtk_separator_menu_item_new(),2);
- gtk_osxapplication_insert_app_menu_item(theApp,check_cast(GTK_WIDGET,pref_item),3);
- gtk_osxapplication_insert_app_menu_item(theApp,gtk_separator_menu_item_new(),4);
- gtk_osxapplication_ready(theApp);
- CAMLreturn(Val_unit);
-}