[evolution] Add an EShell:module-directory constructor property.



commit 38a616e8b77cbe8bce87c97e66f7b542eda24235
Author: Matthew Barnes <mbarnes redhat com>
Date:   Wed Dec 2 00:57:44 2009 -0500

    Add an EShell:module-directory constructor property.
    
    This tells EShell where to look for EModules.  Best practice is to
    define the directory in your CPPFLAGS and then pass it to EShell at
    instantiation time, like so:
    
    Makefile.am:
    
        evolution_CPPFLAGS = \
                -DMODULEDIR=\""$(moduledir)"\"
                ...
    
    main.c:
    
        shell = g_object_new (
                E_TYPE_SHELL, "module-directory", MODULEDIR, ...);

 doc/reference/shell/eshell-sections.txt |    1 +
 shell/e-shell.c                         |   71 ++++++++++++++++++++++++++++---
 shell/e-shell.h                         |    1 +
 shell/main.c                            |    1 +
 4 files changed, 68 insertions(+), 6 deletions(-)
---
diff --git a/doc/reference/shell/eshell-sections.txt b/doc/reference/shell/eshell-sections.txt
index e43bc6d..0b67e41 100644
--- a/doc/reference/shell/eshell-sections.txt
+++ b/doc/reference/shell/eshell-sections.txt
@@ -15,6 +15,7 @@ e_shell_watch_window
 e_shell_get_watched_windows
 e_shell_get_active_window
 e_shell_send_receive
+e_shell_get_module_directory
 e_shell_get_network_available
 e_shell_set_network_available
 e_shell_get_online
diff --git a/shell/e-shell.c b/shell/e-shell.c
index 544b960..130e0f0 100644
--- a/shell/e-shell.c
+++ b/shell/e-shell.c
@@ -52,6 +52,7 @@ struct _EShellPrivate {
 	gpointer preparing_for_quit;         /* weak pointer */
 
 	gchar *geometry;
+	gchar *module_directory;
 
 	guint auto_reconnect	: 1;
 	guint network_available	: 1;
@@ -63,6 +64,7 @@ struct _EShellPrivate {
 enum {
 	PROP_0,
 	PROP_GEOMETRY,
+	PROP_MODULE_DIRECTORY,
 	PROP_NETWORK_AVAILABLE,
 	PROP_ONLINE,
 	PROP_SHELL_SETTINGS
@@ -373,15 +375,18 @@ shell_request_quit (EShell *shell)
 static void
 shell_load_modules (EShell *shell)
 {
-	GList *modules;
+	const gchar *module_directory;
+	GList *modules = NULL;
 
 	/* Load all shared library modules. */
-	modules = e_module_load_all_in_directory (EVOLUTION_MODULEDIR);
 
-	while (modules != NULL) {
-		g_type_module_unuse (G_TYPE_MODULE (modules->data));
-		modules = g_list_delete_link (modules, modules);
-	}
+	module_directory = e_shell_get_module_directory (shell);
+	g_return_if_fail (module_directory != NULL);
+
+	modules = e_module_load_all_in_directory (module_directory);
+
+	g_list_foreach (modules, (GFunc) g_type_module_unuse, NULL);
+	g_list_free (modules);
 }
 
 /* Helper for shell_add_backend() */
@@ -480,6 +485,15 @@ shell_set_geometry (EShell *shell,
 }
 
 static void
+shell_set_module_directory (EShell *shell,
+                            const gchar *module_directory)
+{
+	g_return_if_fail (shell->priv->module_directory == NULL);
+
+	shell->priv->module_directory = g_strdup (module_directory);
+}
+
+static void
 shell_set_property (GObject *object,
                     guint property_id,
                     const GValue *value,
@@ -492,6 +506,12 @@ shell_set_property (GObject *object,
 				g_value_get_string (value));
 			return;
 
+		case PROP_MODULE_DIRECTORY:
+			shell_set_module_directory (
+				E_SHELL (object),
+				g_value_get_string (value));
+			return;
+
 		case PROP_NETWORK_AVAILABLE:
 			e_shell_set_network_available (
 				E_SHELL (object),
@@ -515,6 +535,12 @@ shell_get_property (GObject *object,
                     GParamSpec *pspec)
 {
 	switch (property_id) {
+		case PROP_MODULE_DIRECTORY:
+			g_value_set_string (
+				value, e_shell_get_module_directory (
+				E_SHELL (object)));
+			return;
+
 		case PROP_NETWORK_AVAILABLE:
 			g_value_set_boolean (
 				value, e_shell_get_network_available (
@@ -588,6 +614,7 @@ shell_finalize (GObject *object)
 		e_file_lock_destroy ();
 
 	g_free (priv->geometry);
+	g_free (priv->module_directory);
 
 	/* Chain up to parent's finalize() method. */
 	G_OBJECT_CLASS (parent_class)->finalize (object);
@@ -747,6 +774,22 @@ shell_class_init (EShellClass *class)
 			G_PARAM_CONSTRUCT_ONLY));
 
 	/**
+	 * EShell:module-directory
+	 *
+	 * The directory from which to load #EModule<!-- -->s.
+	 **/
+	g_object_class_install_property (
+		object_class,
+		PROP_MODULE_DIRECTORY,
+		g_param_spec_string (
+			"module-directory",
+			_("Module Directory"),
+			_("The directory from which to load EModules"),
+			NULL,
+			G_PARAM_READWRITE |
+			G_PARAM_CONSTRUCT_ONLY));
+
+	/**
 	 * EShell:network-available
 	 *
 	 * Whether the network is available.
@@ -1504,6 +1547,22 @@ e_shell_send_receive (EShell *shell,
 }
 
 /**
+ * e_shell_get_module_directory:
+ * @shell: an #EShell
+ *
+ * Returns the directory from which #EModule<!-- -->s were loaded.
+ *
+ * Returns: the #EModule directory
+ **/
+const gchar *
+e_shell_get_module_directory (EShell *shell)
+{
+	g_return_val_if_fail (E_IS_SHELL (shell), NULL);
+
+	return shell->priv->module_directory;
+}
+
+/**
  * e_shell_get_network_available:
  * @shell: an #EShell
  *
diff --git a/shell/e-shell.h b/shell/e-shell.h
index 7d1904a..1a32480 100644
--- a/shell/e-shell.h
+++ b/shell/e-shell.h
@@ -114,6 +114,7 @@ GList *		e_shell_get_watched_windows	(EShell *shell);
 GtkWindow *     e_shell_get_active_window	(EShell *shell);
 void		e_shell_send_receive		(EShell *shell,
 						 GtkWindow *parent);
+const gchar *	e_shell_get_module_directory	(EShell *shell);
 gboolean	e_shell_get_network_available	(EShell *shell);
 void		e_shell_set_network_available	(EShell *shell,
 						 gboolean network_available);
diff --git a/shell/main.c b/shell/main.c
index 7a09f60..c1a4e5d 100644
--- a/shell/main.c
+++ b/shell/main.c
@@ -435,6 +435,7 @@ create_default_shell (void)
 		E_TYPE_SHELL,
 		"name", "org.gnome.Evolution",
 		"geometry", geometry,
+		"module-directory", EVOLUTION_MODULEDIR,
 		"online", online,
 		NULL);
 



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