summaryrefslogtreecommitdiffstats
path: root/gedit/gedit.c
diff options
context:
space:
mode:
Diffstat (limited to 'gedit/gedit.c')
-rw-r--r--gedit/gedit.c203
1 files changed, 203 insertions, 0 deletions
diff --git a/gedit/gedit.c b/gedit/gedit.c
new file mode 100644
index 0000000..079b517
--- /dev/null
+++ b/gedit/gedit.c
@@ -0,0 +1,203 @@
+/*
+ * gedit.c
+ * This file is part of gedit
+ *
+ * Copyright (C) 2005 - Paolo Maggi
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include "gedit-app.h"
+
+#if defined OS_OSX
+# include "gedit-app-osx.h"
+#elif defined G_OS_WIN32
+# include "gedit-app-win32.h"
+#endif
+
+#include <locale.h>
+#include <libintl.h>
+#include <tepl/tepl.h>
+
+#include "gedit-dirs.h"
+#include "gedit-debug.h"
+#include "gedit-factory.h"
+#include "gedit-settings.h"
+
+#ifdef G_OS_WIN32
+#include <gmodule.h>
+static GModule *libgedit_dll = NULL;
+
+/* This code must live in gedit.exe, not in libgedit.dll, since the whole
+ * point is to find and load libgedit.dll.
+ */
+static gboolean
+gedit_w32_load_private_dll (void)
+{
+ gchar *dllpath;
+ gchar *prefix;
+
+ prefix = g_win32_get_package_installation_directory_of_module (NULL);
+
+ if (prefix != NULL)
+ {
+ /* Instead of g_module_open () it may be possible to do any of the
+ * following:
+ * A) Change PATH to "${dllpath}/lib/gedit;$PATH"
+ * B) Call SetDllDirectory ("${dllpath}/lib/gedit")
+ * C) Call AddDllDirectory ("${dllpath}/lib/gedit")
+ * But since we only have one library, and its name is known, may as well
+ * use gmodule.
+ */
+ dllpath = g_build_filename (prefix, "lib", "gedit", "lib" PACKAGE_STRING ".dll", NULL);
+ g_free (prefix);
+
+ libgedit_dll = g_module_open (dllpath, 0);
+ if (libgedit_dll == NULL)
+ {
+ g_printerr ("Failed to load '%s': %s\n",
+ dllpath, g_module_error ());
+ }
+
+ g_free (dllpath);
+ }
+
+ if (libgedit_dll == NULL)
+ {
+ libgedit_dll = g_module_open ("lib" PACKAGE_STRING ".dll", 0);
+ if (libgedit_dll == NULL)
+ {
+ g_printerr ("Failed to load 'lib" PACKAGE_STRING ".dll': %s\n",
+ g_module_error ());
+ }
+ }
+
+ return (libgedit_dll != NULL);
+}
+
+static void
+gedit_w32_unload_private_dll (void)
+{
+ if (libgedit_dll)
+ {
+ g_module_close (libgedit_dll);
+ libgedit_dll = NULL;
+ }
+}
+#endif /* G_OS_WIN32 */
+
+static void
+setup_i18n (void)
+{
+ const gchar *dir;
+
+ setlocale (LC_ALL, "");
+
+ dir = gedit_dirs_get_gedit_locale_dir ();
+ bindtextdomain (GETTEXT_PACKAGE, dir);
+
+ bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
+ textdomain (GETTEXT_PACKAGE);
+}
+
+static void
+setup_pango (void)
+{
+#ifdef G_OS_WIN32
+ PangoFontMap *font_map;
+
+ /* Prefer the fontconfig backend of pangocairo. The win32 backend gives
+ * ugly fonts. The fontconfig backend is what is used on Linux.
+ * Another way would be to set the environment variable:
+ * PANGOCAIRO_BACKEND=fontconfig
+ * See also the documentation of pango_cairo_font_map_new().
+ */
+ font_map = pango_cairo_font_map_new_for_font_type (CAIRO_FONT_TYPE_FT);
+
+ if (font_map != NULL)
+ {
+ pango_cairo_font_map_set_default (PANGO_CAIRO_FONT_MAP (font_map));
+ g_object_unref (font_map);
+ }
+#endif
+}
+
+int
+main (int argc, char *argv[])
+{
+ GType type;
+ GeditFactory *factory;
+ GeditApp *app;
+ gint status;
+
+#if defined OS_OSX
+ type = GEDIT_TYPE_APP_OSX;
+#elif defined G_OS_WIN32
+ if (!gedit_w32_load_private_dll ())
+ {
+ return 1;
+ }
+
+ type = GEDIT_TYPE_APP_WIN32;
+#else
+ type = GEDIT_TYPE_APP;
+#endif
+
+ /* NOTE: we should not make any calls to the gedit API before the
+ * private library is loaded.
+ */
+ gedit_dirs_init ();
+
+ setup_i18n ();
+ setup_pango ();
+ tepl_init ();
+ factory = gedit_factory_new ();
+ tepl_abstract_factory_set_singleton (TEPL_ABSTRACT_FACTORY (factory));
+
+ app = g_object_new (type,
+ "application-id", "org.gnome.gedit",
+ "flags", G_APPLICATION_HANDLES_COMMAND_LINE | G_APPLICATION_HANDLES_OPEN,
+ NULL);
+
+ status = g_application_run (G_APPLICATION (app), argc, argv);
+
+ gedit_settings_unref_singleton ();
+
+ /* Break reference cycles caused by the PeasExtensionSet
+ * for GeditAppActivatable which holds a ref on the GeditApp
+ */
+ g_object_run_dispose (G_OBJECT (app));
+
+ g_object_add_weak_pointer (G_OBJECT (app), (gpointer *) &app);
+ g_object_unref (app);
+
+ if (app != NULL)
+ {
+ gedit_debug_message (DEBUG_APP, "Leaking with %i refs",
+ G_OBJECT (app)->ref_count);
+ }
+
+ tepl_finalize ();
+ gedit_dirs_shutdown ();
+
+#ifdef G_OS_WIN32
+ gedit_w32_unload_private_dll ();
+#endif
+
+ return status;
+}
+
+/* ex:set ts=8 noet: */