gedit.c 3.78 KB
Newer Older
Paolo Borelli's avatar
Paolo Borelli committed
1 2 3 4
/*
 * gedit.c
 * This file is part of gedit
 *
5
 * Copyright (C) 2005 - Paolo Maggi
Paolo Borelli's avatar
Paolo Borelli committed
6 7 8 9 10 11 12 13 14 15 16 17
 *
 * 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
18
 * along with this program; if not, see <http://www.gnu.org/licenses/>.
Paolo Borelli's avatar
Paolo Borelli committed
19 20 21 22 23
 */

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
24

Paolo Borelli's avatar
Paolo Borelli committed
25
#include "gedit-app.h"
26 27 28 29 30 31 32 33 34
#ifdef OS_OSX
#include "gedit-app-osx.h"
#else
#ifdef G_OS_WIN32
#include "gedit-app-win32.h"
#else
#include "gedit-app-x11.h"
#endif
#endif
35

36 37 38 39 40
#include <glib.h>
#include <locale.h>
#include <libintl.h>

#include "gedit-dirs.h"
41 42
#include "gedit-debug.h"

LRN's avatar
LRN committed
43 44 45 46 47 48 49
#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.
 */
50
static gboolean
51
gedit_w32_load_private_dll (void)
LRN's avatar
LRN committed
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
{
	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", "libgedit.dll", NULL);
		g_free (prefix);
70

LRN's avatar
LRN committed
71
		libgedit_dll = g_module_open (dllpath, 0);
72 73 74 75 76 77
		if (libgedit_dll == NULL)
		{
			g_printerr ("Failed to load '%s': %s\n",
			            dllpath, g_module_error ());
		}

LRN's avatar
LRN committed
78 79 80 81 82 83
		g_free (dllpath);
	}

	if (libgedit_dll == NULL)
	{
		libgedit_dll = g_module_open ("libgedit.dll", 0);
84 85 86 87 88
		if (libgedit_dll == NULL)
		{
			g_printerr ("Failed to load 'libgedit.dll': %s\n",
			            g_module_error ());
		}
LRN's avatar
LRN committed
89 90
	}

91
	return (libgedit_dll != NULL);
LRN's avatar
LRN committed
92 93 94
}

static void
95
gedit_w32_unload_private_dll (void)
LRN's avatar
LRN committed
96 97 98 99 100 101 102 103 104
{
	if (libgedit_dll)
	{
		g_module_close (libgedit_dll);
		libgedit_dll = NULL;
	}
}
#endif

Paolo Borelli's avatar
Paolo Borelli committed
105 106 107
int
main (int argc, char *argv[])
{
108
	GType type;
109 110
	GeditApp *app;
	gint status;
111 112
	const gchar *dir;

113 114 115 116
#ifdef OS_OSX
	type = GEDIT_TYPE_APP_OSX;
#else
#ifdef G_OS_WIN32
117 118 119 120 121 122
	if (!gedit_w32_load_private_dll ())
	{
		return 1;
	}

	type = GEDIT_TYPE_APP_WIN32;
123 124 125 126 127
#else
	type = GEDIT_TYPE_APP_X11;
#endif
#endif

128 129 130 131 132 133 134 135 136 137 138 139 140
	/* NOTE: we should not make any calls to the gedit api before the
	 * private library is loaded */
	gedit_dirs_init ();

	/* Setup locale/gettext */
	setlocale (LC_ALL, "");

	dir = gedit_dirs_get_gedit_locale_dir ();
	bindtextdomain (GETTEXT_PACKAGE, dir);

	bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
	textdomain (GETTEXT_PACKAGE);

141
	app = g_object_new (type,
142
	                    "application-id", "org.gnome.gedit",
143
	                    "flags", G_APPLICATION_HANDLES_COMMAND_LINE | G_APPLICATION_HANDLES_OPEN,
144 145
	                    NULL);

146
	status = g_application_run (G_APPLICATION (app), argc, argv);
Paolo Borelli's avatar
Paolo Borelli committed
147

148 149 150 151 152 153
	/* 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);
154
	g_object_unref (app);
Paolo Borelli's avatar
Paolo Borelli committed
155

156 157 158 159 160 161
	if (app != NULL)
	{
		gedit_debug_message (DEBUG_APP, "Leaking with %i refs",
		                     G_OBJECT (app)->ref_count);
	}

LRN's avatar
LRN committed
162 163 164 165
#ifdef G_OS_WIN32
	gedit_w32_unload_private_dll ();
#endif

166
	return status;
Paolo Borelli's avatar
Paolo Borelli committed
167
}
168

169
/* ex:set ts=8 noet: */