gedit r6739 - in trunk: . gedit plugin-loaders/c plugin-loaders/python plugin-loaders/python/bindings plugins/docinfo plugins/time



Author: pborelli
Date: Sun Dec 28 16:43:36 2008
New Revision: 6739
URL: http://svn.gnome.org/viewvc/gedit?rev=6739&view=rev

Log:
2008-12-28  Paolo Borelli  <pborelli katamail com>

	* plugins/docinfo/gedit-docinfo-plugin.c:
	* plugins/time/gedit-time-plugin.c:
	* plugin-loaders/python/gedit-plugin-loader-python.c:
	* plugin-loaders/python/bindings/gedit.defs:
	* plugin-loaders/c/gedit-plugin-loader-c.c:
	* gedit/gedit-plugin.c:
	* gedit/gedit-plugin.h:
	Add an "data-dir" property to plugins that plugin can use to
	locate data files in a relocable way (so that it works on
	windows). Convert a couple of plugins as a test, eventually all
	plugins need it.



Modified:
   trunk/ChangeLog
   trunk/configure.ac
   trunk/gedit/gedit-plugin.c
   trunk/gedit/gedit-plugin.h
   trunk/plugin-loaders/c/gedit-plugin-loader-c.c
   trunk/plugin-loaders/python/bindings/gedit.defs
   trunk/plugin-loaders/python/gedit-plugin-loader-python.c
   trunk/plugins/docinfo/gedit-docinfo-plugin.c
   trunk/plugins/time/gedit-time-plugin.c

Modified: trunk/configure.ac
==============================================================================
--- trunk/configure.ac	(original)
+++ trunk/configure.ac	Sun Dec 28 16:43:36 2008
@@ -344,7 +344,7 @@
 dnl ================================================================
 AC_PATH_PROG(GLIB_GENMARSHAL, glib-genmarshal)
 AC_PATH_PROG(GLIB_MKENUMS, glib-mkenums)
-			      
+
 GNOME_COMPILE_WARNINGS(yes)
 
 AC_ARG_ENABLE(deprecations,

Modified: trunk/gedit/gedit-plugin.c
==============================================================================
--- trunk/gedit/gedit-plugin.c	(original)
+++ trunk/gedit/gedit-plugin.c	Sun Dec 28 16:43:36 2008
@@ -33,18 +33,22 @@
 #endif
 
 #include "gedit-plugin.h"
+#include "gedit-dirs.h"
 
 /* properties */
 enum {
 	PROP_0,
-	PROP_INSTALL_PATH
+	PROP_INSTALL_DIR,
+	PROP_DATA_DIR_NAME,
+	PROP_DATA_DIR
 };
 
 typedef struct _GeditPluginPrivate GeditPluginPrivate;
 
 struct _GeditPluginPrivate
 {
-	gchar *install_path;
+	gchar *install_dir;
+	gchar *data_dir_name;
 };
 
 #define GEDIT_PLUGIN_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), GEDIT_TYPE_PLUGIN, GeditPluginPrivate))
@@ -76,12 +80,13 @@
 			   GValue     *value,
 			   GParamSpec *pspec)
 {
-	GeditPluginPrivate *priv = GEDIT_PLUGIN_GET_PRIVATE (object);
-
 	switch (prop_id)
 	{
-		case PROP_INSTALL_PATH:
-			g_value_set_string (value, priv->install_path);
+		case PROP_INSTALL_DIR:
+			g_value_take_string (value, gedit_plugin_get_install_dir (GEDIT_PLUGIN (object)));
+			break;
+		case PROP_DATA_DIR:
+			g_value_take_string (value, gedit_plugin_get_data_dir (GEDIT_PLUGIN (object)));
 			break;
 		default:
 			g_return_if_reached ();
@@ -98,8 +103,11 @@
 
 	switch (prop_id)
 	{
-		case PROP_INSTALL_PATH:
-			priv->install_path = g_value_dup_string (value);
+		case PROP_INSTALL_DIR:
+			priv->install_dir = g_value_dup_string (value);
+			break;
+		case PROP_DATA_DIR_NAME:
+			priv->data_dir_name = g_value_dup_string (value);
 			break;
 		default:
 			g_return_if_reached ();
@@ -110,8 +118,9 @@
 gedit_plugin_finalize (GObject *object)
 {
 	GeditPluginPrivate *priv = GEDIT_PLUGIN_GET_PRIVATE (object);
-	
-	g_free (priv->install_path);
+
+	g_free (priv->install_dir);
+	g_free (priv->data_dir_name);
 }
 
 static void 
@@ -131,14 +140,31 @@
 	object_class->finalize = gedit_plugin_finalize;
 
 	g_object_class_install_property (object_class,
-					 PROP_INSTALL_PATH,
-					 g_param_spec_string ("install-path",
-							      "Install Path",
-							      "The path where the plugin is installed",
+					 PROP_INSTALL_DIR,
+					 g_param_spec_string ("install-dir",
+							      "Install Directory",
+							      "The directory where the plugin is installed",
 							      NULL,
-							      G_PARAM_READWRITE | 
-								  G_PARAM_CONSTRUCT_ONLY));
-	
+							      G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+
+	/* the basename of the data dir is set at construction time by the plugin loader
+	 * while the full path is constructed on the fly to take into account relocability
+	 * that's why we have a writeonly prop and a readonly prop */
+	g_object_class_install_property (object_class,
+					 PROP_DATA_DIR_NAME,
+					 g_param_spec_string ("data-dir-name",
+							      "Basename of the data directory",
+							      "The basename of the directory where the plugin should look for its data files",
+							      NULL,
+							      G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
+	g_object_class_install_property (object_class,
+					 PROP_DATA_DIR,
+					 g_param_spec_string ("data-dir",
+							      "Data Directory",
+							      "The full path of the directory where the plugin should look for its data files",
+							      NULL,
+							      G_PARAM_READABLE));
+
 	g_type_class_add_private (klass, sizeof (GeditPluginPrivate));
 }
 
@@ -149,17 +175,70 @@
 }
 
 /**
- * gedit_plugin_get_install_path:
+ * gedit_plugin_get_install_dir:
  * @plugin: a #GeditPlugin
  *
- * Returns the path where the plugin is installed
+ * Returns the path of the directory where the plugin is installed
  */
-const gchar *
-gedit_plugin_get_install_path (GeditPlugin *plugin)
+gchar *
+gedit_plugin_get_install_dir (GeditPlugin *plugin)
 {
 	g_return_val_if_fail (GEDIT_IS_PLUGIN (plugin), NULL);
-	
-	return GEDIT_PLUGIN_GET_PRIVATE (plugin)->install_path;
+
+	return g_strdup (GEDIT_PLUGIN_GET_PRIVATE (plugin)->install_dir);
+}
+
+/**
+ * gedit_plugin_get_data_dir:
+ * @plugin: a #GeditPlugin
+ *
+ * Returns the path of the directory where the plugin should look for
+ * its data files
+ */
+gchar *
+gedit_plugin_get_data_dir (GeditPlugin *plugin)
+{
+	GeditPluginPrivate *priv;
+	gchar *gedit_lib_dir;
+	gchar *data_dir;
+
+	g_return_val_if_fail (GEDIT_IS_PLUGIN (plugin), NULL);
+
+	priv = GEDIT_PLUGIN_GET_PRIVATE (plugin);
+
+	/* If it's a "user" plugin the data dir is
+	 * install_dir/data_dir_name if instead it's a
+	 * "system" plugin the data dir is under gedit_data_dir,
+	 * so it's under $prefix/share/gedit-2/plugins/data_dir_name
+	 * where data_dir_name usually it's the name of the plugin
+	 */
+	gedit_lib_dir = gedit_dirs_get_gedit_lib_dir ();
+
+	/* CHECK: is checking the prefix enough or should we be more
+	 * careful about normalizing paths etc? */
+	if (g_str_has_prefix (priv->install_dir, gedit_lib_dir))
+	{
+		gchar *gedit_data_dir;
+
+		gedit_data_dir = gedit_dirs_get_gedit_data_dir ();
+
+		data_dir = g_build_filename (gedit_data_dir,
+					     "plugins",
+					     priv->data_dir_name,
+					     NULL);
+
+		g_free (gedit_data_dir);
+	}
+	else
+	{
+		data_dir = g_build_filename (priv->install_dir,
+					     priv->data_dir_name,
+					     NULL);
+	}
+
+	g_free (gedit_lib_dir);
+
+	return data_dir;
 }
 
 /**

Modified: trunk/gedit/gedit-plugin.h
==============================================================================
--- trunk/gedit/gedit-plugin.h	(original)
+++ trunk/gedit/gedit-plugin.h	Sun Dec 28 16:43:36 2008
@@ -99,7 +99,9 @@
  * Public methods
  */
 GType 		 gedit_plugin_get_type 		(void) G_GNUC_CONST;
-gchar const	*gedit_plugin_get_install_path	(GeditPlugin *plugin);
+
+gchar 		*gedit_plugin_get_install_dir	(GeditPlugin *plugin);
+gchar 		*gedit_plugin_get_data_dir	(GeditPlugin *plugin);
 
 void 		 gedit_plugin_activate		(GeditPlugin *plugin,
 						 GeditWindow *window);

Modified: trunk/plugin-loaders/c/gedit-plugin-loader-c.c
==============================================================================
--- trunk/plugin-loaders/c/gedit-plugin-loader-c.c	(original)
+++ trunk/plugin-loaders/c/gedit-plugin-loader-c.c	Sun Dec 28 16:43:36 2008
@@ -48,13 +48,15 @@
 {
 	GeditPluginLoaderC *cloader = GEDIT_PLUGIN_LOADER_C (loader);
 	GeditObjectModule *module;
+	const gchar *module_name;
 	GeditPlugin *result;
-	
+
 	module = (GeditObjectModule *)g_hash_table_lookup (cloader->priv->loaded_plugins, info);
-	
+	module_name = gedit_plugin_info_get_module_name (info);
+
 	if (module == NULL)
 	{
-		module = gedit_object_module_new (gedit_plugin_info_get_module_name (info),
+		module = gedit_object_module_new (module_name,
 						  path,
 						  "register_gedit_plugin");
 
@@ -70,10 +72,15 @@
 
 		return NULL;
 	}
-	
-	/* create new plugin object */
-	result = (GeditPlugin *)gedit_object_module_new_object (module, "install-path", path, NULL);
-	
+
+	/* TODO: for now we force data-dir-name = module-name... if needed we can
+	 * add a datadir field to the plugin descriptor file.
+	 */
+	result = (GeditPlugin *)gedit_object_module_new_object (module,
+								"install-dir", path,
+								"data-dir-name", module_name,
+								NULL);
+
 	if (!result)
 	{
 		g_warning ("Could not create plugin object: %s", gedit_plugin_info_get_name (info));

Modified: trunk/plugin-loaders/python/bindings/gedit.defs
==============================================================================
--- trunk/plugin-loaders/python/bindings/gedit.defs	(original)
+++ trunk/plugin-loaders/python/bindings/gedit.defs	Sun Dec 28 16:43:36 2008
@@ -629,6 +629,18 @@
   (return-type "GType")
 )
 
+(define-method get_install_dir
+  (of-object "GeditPlugin")
+  (c-name "gedit_plugin_get_install_dir")
+  (return-type "gchar*")
+)
+
+(define-method get_data_dir
+  (of-object "GeditPlugin")
+  (c-name "gedit_plugin_get_data_dir")
+  (return-type "gchar*")
+)
+
 (define-method activate
   (of-object "GeditPlugin")
   (c-name "gedit_plugin_activate")
@@ -668,12 +680,6 @@
   (return-type "GtkWidget*")
 )
 
-(define-method get_install_path
-  (of-object "GeditPlugin")
-  (c-name "gedit_plugin_get_install_path")
-  (return-type "const-gchar*")
-)
-
 ;; From ../gedit/gedit-plugin-python.h
 
 (define-function gedit_plugin_python_get_type

Modified: trunk/plugin-loaders/python/gedit-plugin-loader-python.c
==============================================================================
--- trunk/plugin-loaders/python/gedit-plugin-loader-python.c	(original)
+++ trunk/plugin-loaders/python/gedit-plugin-loader-python.c	Sun Dec 28 16:43:36 2008
@@ -128,7 +128,10 @@
 	*/
 	if (pyinfo->class_type != GEDIT_TYPE_PLUGIN_PYTHON)
 	{
-		GObject *obj = g_object_new (pyinfo->class_type, "install-path", pyinfo->path, NULL);
+		GObject *obj = g_object_new (pyinfo->class_type,
+					     "install-dir", pyinfo->path,
+					     "data-dir-name", gedit_plugin_info_get_module_name (info),
+					     NULL);
 		pygobject = (PyGObject *)pygobject_new (obj);
 	}
 	else
@@ -137,8 +140,11 @@
 		
 		if (pygobject->obj != NULL)
 			g_error("GObject for plugin is already initialized!");
-		
-		pygobject_construct(pygobject, "install-path", pyinfo->path, NULL);
+
+		pygobject_construct(pygobject,
+				    "install-dir", pyinfo->path,
+				    "data-dir-name", gedit_plugin_info_get_module_name (info),
+				    NULL);
 	}
 
 	if (pygobject == NULL || pygobject->obj == NULL)

Modified: trunk/plugins/docinfo/gedit-docinfo-plugin.c
==============================================================================
--- trunk/plugins/docinfo/gedit-docinfo-plugin.c	(original)
+++ trunk/plugins/docinfo/gedit-docinfo-plugin.c	Sun Dec 28 16:43:36 2008
@@ -59,6 +59,8 @@
 
 typedef struct
 {
+	GeditPlugin *plugin;
+
 	GtkActionGroup *ui_action_group;
 	guint ui_id;
 
@@ -87,6 +89,8 @@
 		    WindowData	*data)
 {
 	DocInfoDialog *dialog;
+	gchar *data_dir;
+	gchar *ui_file;
 	GtkWidget *content;
 	GtkWidget *error_widget;
 	gboolean ret;
@@ -95,7 +99,9 @@
 
 	dialog = g_new (DocInfoDialog, 1);
 
-	ret = gedit_utils_get_ui_objects (GEDIT_UIDIR "docinfo.ui",
+	data_dir = gedit_plugin_get_data_dir (data->plugin);
+	ui_file = g_build_filename (data_dir, "docinfo.ui", NULL);
+	ret = gedit_utils_get_ui_objects (ui_file,
 					  NULL,
 					  &error_widget,
 					  "dialog", &dialog->dialog,
@@ -114,6 +120,9 @@
 					  "selected_chars_ns_label", &dialog->selected_chars_ns_label,
 					  NULL);
 
+	g_free (data_dir);
+	g_free (ui_file);
+
 	if (!ret)
 	{
 		const gchar *err_message;
@@ -423,6 +432,8 @@
 	
 	gedit_debug (DEBUG_PLUGINS);
 
+	g_object_unref (data->plugin);
+
 	g_object_unref (data->ui_action_group);
 	
 	if (data->dialog != NULL)
@@ -478,8 +489,8 @@
 	gedit_debug (DEBUG_PLUGINS);
 
 	data = g_new (WindowData, 1);
-	manager = gedit_window_get_ui_manager (window);
 
+	data->plugin = g_object_ref (plugin);
 	data->dialog = NULL;
 	data->ui_action_group = gtk_action_group_new ("GeditDocInfoPluginActions");
 	
@@ -490,6 +501,7 @@
 				      G_N_ELEMENTS (action_entries),
 				      window);
 
+	manager = gedit_window_get_ui_manager (window);
 	gtk_ui_manager_insert_action_group (manager,
 					    data->ui_action_group,
 					    -1);

Modified: trunk/plugins/time/gedit-time-plugin.c
==============================================================================
--- trunk/plugins/time/gedit-time-plugin.c	(original)
+++ trunk/plugins/time/gedit-time-plugin.c	Sun Dec 28 16:43:36 2008
@@ -741,6 +741,8 @@
 get_configure_dialog (GeditTimePlugin *plugin)
 {
 	TimeConfigureDialog *dialog = NULL;
+	gchar *data_dir;
+	gchar *ui_file;
 	GtkWidget *content;
 	GtkWidget *viewport;
 	GeditTimePluginPromptType prompt_type;
@@ -775,7 +777,9 @@
 
 	g_return_val_if_fail (dialog->dialog != NULL, NULL);
 
-	ret = gedit_utils_get_ui_objects (GEDIT_UIDIR "time.ui",
+	data_dir = gedit_plugin_get_data_dir (GEDIT_PLUGIN (plugin));
+	ui_file = g_build_filename (data_dir, "time.ui", NULL);
+	ret = gedit_utils_get_ui_objects (ui_file,
 					  root_objects,
 					  &error_widget,
 					  "time_dialog_content", &content,
@@ -788,6 +792,9 @@
 					  "custom_format_example", &dialog->custom_format_example,
 					  NULL);
 
+	g_free (data_dir);
+	g_free (ui_file);
+
 	if (!ret)
 	{
 		gtk_box_pack_start_defaults (GTK_BOX (GTK_DIALOG (dialog->dialog)->vbox),
@@ -917,13 +924,17 @@
 			  GeditTimePlugin           *plugin)
 {
 	ChooseFormatDialog *dialog;
+	gchar *data_dir;
+	gchar *ui_file;
 	GtkWidget *error_widget;
 	gboolean ret;
 	gchar *sf, *cf;
 
 	dialog = g_new0 (ChooseFormatDialog, 1);
 
-	ret = gedit_utils_get_ui_objects (GEDIT_UIDIR "time.ui",
+	data_dir = gedit_plugin_get_data_dir (GEDIT_PLUGIN (plugin));
+	ui_file = g_build_filename (data_dir, "time.ui", NULL);
+	ret = gedit_utils_get_ui_objects (ui_file,
 					  NULL,
 					  &error_widget,
 					  "choose_format_dialog", &dialog->dialog,
@@ -934,6 +945,9 @@
 					  "custom_format_example", &dialog->custom_format_example,
 					  NULL);
 
+	g_free (data_dir);
+	g_free (ui_file);
+
 	if (!ret)
 	{
 		const gchar *err_message;



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