--book=atk \
--book=gdk \
--book=gdk-pixbuf \
- --book=glib \
--book=gio \
+ --book=glib \
--book=gobject \
--book=gtk \
- --book=pango \
--book=libsoup-2.4 \
+ --book=pango \
--list-unknown \
"$@" \
src/*.c
#!/bin/bash
dir=$(dirname $(readlink -f $0))
./autogen.sh \
- "--libdir=$dir/src/plugins" \
- "--datadir=$dir/data" \
- --enable-gtk-doc \
+ "--enable-gtk-doc" \
+ "--libdir=$dir/src/.libs" \
+ "--includedir=$dir/src" \
CFLAGS="-g -Werror -Wno-unused $CFLAGS" \
LDFLAGS="-Wl,-z,defs"
wms.c wms.h \
gpqueue.c gpqueue.h
libgis_la_CPPFLAGS = $(AM_CPPFLAGS) \
- -DDATADIR="\"$(datadir)\"" -DPLUGINDIR="\"$(libdir)/gis\""
+ -DPKGDATADIR="\"$(datadir)/gis\"" -DPLUGINSDIR="\"$(libdir)/gis\""
libgis_la_LIBADD = $(AM_LDADD)
pkgconfigdir = $(libdir)/pkgconfig
--- /dev/null
+.
\ No newline at end of file
GisPlugin *plugin;
} GisPluginStore;
-GisPlugins *gis_plugins_new()
+GisPlugins *gis_plugins_new(gchar *dir)
{
- return g_ptr_array_new();
+ g_debug("GisPlugins: new - dir=%s", dir);
+ GisPlugins *plugins = g_new0(GisPlugins, 1);
+ if (dir)
+ plugins->dir = g_strdup(dir);
+ plugins->plugins = g_ptr_array_new();
+ return plugins;
}
void gis_plugins_free(GisPlugins *self)
{
- for (int i = 0; i < self->len; i++) {
- GisPluginStore *store = g_ptr_array_index(self, i);
+ g_debug("GisPlugins: free");
+ for (int i = 0; i < self->plugins->len; i++) {
+ GisPluginStore *store = g_ptr_array_index(self->plugins, i);
g_object_unref(store->plugin);
g_free(store->name);
g_free(store);
- g_ptr_array_remove_index(self, i);
+ g_ptr_array_remove_index(self->plugins, i);
}
- g_ptr_array_free(self, TRUE);
+ g_ptr_array_free(self->plugins, TRUE);
+ if (self->dir)
+ g_free(self->dir);
+ g_free(self);
}
-GList *gis_plugins_available()
+GList *gis_plugins_available(GisPlugins *self)
{
- GDir *dir = g_dir_open(PLUGINDIR, 0, NULL);
- if (dir == NULL)
- return NULL;
+ g_debug("GisPlugins: available");
GList *list = NULL;
- const gchar *name;
- while ((name = g_dir_read_name(dir))) {
- if (g_pattern_match_simple("*.so", name)) {
- gchar **parts = g_strsplit(name, ".", 2);
- list = g_list_prepend(list, g_strdup(parts[0]));
- g_strfreev(parts);
+ gchar *dirs[] = {self->dir, PLUGINSDIR};
+ for (int i = 0; i<2; i++) {
+ GDir *dir = g_dir_open(dirs[i], 0, NULL);
+ if (dir == NULL)
+ continue;
+ g_debug(" checking %s", dirs[i]);
+ const gchar *name;
+ while ((name = g_dir_read_name(dir))) {
+ if (g_pattern_match_simple("*.so", name)) {
+ gchar **parts = g_strsplit(name, ".", 2);
+ list = g_list_prepend(list, g_strdup(parts[0]));
+ g_strfreev(parts);
+ }
}
}
return list;
GisPlugin *gis_plugins_load(GisPlugins *self, const char *name,
GisWorld *world, GisView *view, GisOpenGL *opengl, GisPrefs *prefs)
{
- gchar *path = g_strdup_printf("%s/%s.%s", PLUGINDIR, name, G_MODULE_SUFFIX);
+ g_debug("GisPlugins: load %s", name);
+ gchar *path = g_strdup_printf("%s/%s.%s", self->dir, name, G_MODULE_SUFFIX);
+ if (!g_file_test(path, G_FILE_TEST_EXISTS))
+ path = g_strdup_printf("%s/%s.%s", PLUGINSDIR, name, G_MODULE_SUFFIX);
+ if (!g_file_test(path, G_FILE_TEST_EXISTS)) {
+ g_warning("Module %s not found", name);
+ return NULL;
+ }
GModule *module = g_module_open(path, 0);
g_free(path);
if (module == NULL) {
GisPluginStore *store = g_malloc(sizeof(GisPluginStore));
store->name = g_strdup(name);
store->plugin = constructor(world, view, opengl, prefs);
- g_ptr_array_add(self, store);
+ g_ptr_array_add(self->plugins, store);
return store->plugin;
}
gboolean gis_plugins_unload(GisPlugins *self, const char *name)
{
- for (int i = 0; i < self->len; i++) {
- GisPluginStore *store = g_ptr_array_index(self, i);
+ g_debug("GisPlugins: unload %s", name);
+ for (int i = 0; i < self->plugins->len; i++) {
+ GisPluginStore *store = g_ptr_array_index(self->plugins, i);
if (g_str_equal(store->name, name)) {
g_object_unref(store->plugin);
g_free(store->name);
g_free(store);
- g_ptr_array_remove_index(self, i);
+ g_ptr_array_remove_index(self->plugins, i);
}
}
return FALSE;
}
void gis_plugins_foreach(GisPlugins *self, GCallback _callback, gpointer user_data)
{
+ g_debug("GisPlugins: foreach");
typedef void (*CBFunc)(GisPlugin *, const gchar *, gpointer);
CBFunc callback = (CBFunc)_callback;
- for (int i = 0; i < self->len; i++) {
- GisPluginStore *store = g_ptr_array_index(self, i);
+ for (int i = 0; i < self->plugins->len; i++) {
+ GisPluginStore *store = g_ptr_array_index(self->plugins, i);
callback(store->plugin, store->name, user_data);
}
}
typedef struct _GisPlugin GisPlugin;
typedef struct _GisPluginInterface GisPluginInterface;
-typedef GPtrArray GisPlugins;
+typedef struct _GisPlugins GisPlugins;
struct _GisPluginInterface
{
#include "gis-opengl.h"
#include "gis-prefs.h"
+struct _GisPlugins {
+ gchar *dir;
+ GPtrArray *plugins;
+};
+
typedef GisPlugin *(*GisPluginConstructor)(GisWorld *world, GisView *view, GisOpenGL *opengl, GisPrefs *prefs);
-GisPlugins *gis_plugins_new();
+GisPlugins *gis_plugins_new(gchar *dir);
void gis_plugins_free();
-GList *gis_plugins_available();
-GisPlugin *gis_plugins_load(GisPlugins *self, const char *name,
+GList *gis_plugins_available(GisPlugins *plugins);
+GisPlugin *gis_plugins_load(GisPlugins *plugins, const char *name,
GisWorld *world, GisView *view, GisOpenGL *opengl, GisPrefs *prefs);
-gboolean gis_plugins_unload(GisPlugins *self, const char *name);
-void gis_plugins_foreach(GisPlugins *self, GCallback callback, gpointer user_data);
+gboolean gis_plugins_unload(GisPlugins *plugins, const char *name);
+void gis_plugins_foreach(GisPlugins *plugins, GCallback callback, gpointer user_data);
#endif
/***********
* Methods *
***********/
-GisPrefs *gis_prefs_new(const gchar *prog)
+GisPrefs *gis_prefs_new(const gchar *config, const gchar *defaults)
{
- g_debug("GisPrefs: new - %s", prog);
+ g_debug("GisPrefs: new - %s, %s", config, defaults);
GisPrefs *self = g_object_new(GIS_TYPE_PREFS, NULL);
- self->key_path = g_build_filename(g_get_user_config_dir(),
- prog, "config.ini", NULL);
+ if (config)
+ self->key_path = g_strdup(config);
+ else
+ self->key_path = g_build_filename(g_get_user_config_dir(),
+ "gis", "config.ini", NULL);
GError *error = NULL;
g_key_file_load_from_file(self->key_file, self->key_path,
G_KEY_FILE_KEEP_COMMENTS, &error);
- if (error) {
- g_debug("GisPrefs: new - Trying %s defaults", prog);
+ if (error && defaults) {
+ g_debug("GisPrefs: new - Trying %s defaults", defaults);
g_clear_error(&error);
- gchar *tmp = g_build_filename(DATADIR, prog, "defaults.ini", NULL);
- g_key_file_load_from_file(self->key_file, tmp,
+ g_key_file_load_from_file(self->key_file, defaults,
G_KEY_FILE_KEEP_COMMENTS, &error);
- g_free(tmp);
}
if (error) {
g_debug("GisPrefs: new - Trying GIS defaults");
g_clear_error(&error);
- gchar *tmp = g_build_filename(DATADIR, "gis", "defaults.ini", NULL);
+ gchar *tmp = g_build_filename(PKGDATADIR, "defaults.ini", NULL);
g_key_file_load_from_file(self->key_file, tmp,
G_KEY_FILE_KEEP_COMMENTS, &error);
g_free(tmp);
static GObject *gis_prefs_constructor(GType gtype, guint n_properties,
GObjectConstructParam *properties)
{
- g_debug("gis_prefs: constructor");
+ g_debug("GisPrefs: constructor");
GObjectClass *parent_class = G_OBJECT_CLASS(gis_prefs_parent_class);
return parent_class->constructor(gtype, n_properties, properties);
}
GType gis_prefs_get_type(void);
/* Methods */
-GisPrefs *gis_prefs_new(const gchar *prog);
+GisPrefs *gis_prefs_new(const gchar *config, const gchar *defaults);
gchar *gis_prefs_get_string (GisPrefs *prefs, const gchar *key);
gboolean gis_prefs_get_boolean (GisPrefs *prefs, const gchar *key);
gtk_init(&argc, &argv);
g_thread_init(NULL);
- GisPrefs *prefs = gis_prefs_new("aweather");
- GisPlugins *plugins = gis_plugins_new();
+ GisPrefs *prefs = gis_prefs_new(NULL, NULL);
+ GisPlugins *plugins = gis_plugins_new(NULL);
GisWorld *world = gis_world_new();
GisView *view = gis_view_new();
GisOpenGL *opengl = gis_opengl_new(world, view, plugins);
Version: @VERSION@
Requires: gmodule-2.0 gtk+-2.0 gtkglext-1.0 libsoup-2.4
Libs: -L${libdir} -lgis
-Cflags: -I${includedir}/gis
+Cflags: -I${includedir}