g_source_remove(self->sm_source[1]);
self->sm_source[1] = 0;
}
- if (self->sphere) {
- roam_sphere_free(self->sphere);
- self->sphere = NULL;
- }
/* TODO: Cleanup/free objects tree */
G_OBJECT_CLASS(gis_opengl_parent_class)->dispose(_self);
}
{
g_debug("GisViewer: finalize");
GisOpenGL *self = GIS_OPENGL(_self);
+ roam_sphere_free(self->sphere);
g_mutex_free(self->sphere_lock);
G_OBJECT_CLASS(gis_opengl_parent_class)->finalize(_self);
}
{
g_debug("GisOpenGL: class_init");
GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
- gobject_class->dispose = gis_opengl_dispose;
+ gobject_class->dispose = gis_opengl_dispose;
GisViewerClass *viewer_class = GIS_VIEWER_CLASS(klass);
viewer_class->center_position = gis_opengl_center_position;
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)
{
g_debug("GisPlugins: free");
- for (int i = 0; i < self->plugins->len; i++) {
- GisPluginStore *store = g_ptr_array_index(self->plugins, i);
+ for (GList *cur = self->plugins; cur; cur = cur->next) {
+ GisPluginStore *store = cur->data;
+ g_debug("GisPlugin: freeing %s refs=%d->%d", store->name,
+ G_OBJECT(store->plugin)->ref_count,
+ G_OBJECT(store->plugin)->ref_count-1);
g_object_unref(store->plugin);
g_free(store->name);
g_free(store);
- g_ptr_array_remove_index(self->plugins, i);
}
- g_ptr_array_free(self->plugins, TRUE);
+ g_list_free(self->plugins);
if (self->dir)
g_free(self->dir);
g_free(self);
GisPluginStore *store = g_new0(GisPluginStore, 1);
store->name = g_strdup(name);
store->plugin = constructor(viewer, prefs);
- g_ptr_array_add(self->plugins, store);
+ self->plugins = g_list_prepend(self->plugins, store);
return store->plugin;
}
gboolean gis_plugins_unload(GisPlugins *self, const char *name)
{
g_debug("GisPlugins: unload %s", name);
- for (int i = 0; i < self->plugins->len; i++) {
- GisPluginStore *store = g_ptr_array_index(self->plugins, i);
+ for (GList *cur = self->plugins; cur; cur = cur->next) {
+ GisPluginStore *store = cur->data;
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->plugins, i);
+ self->plugins = g_list_delete_link(self->plugins, cur);
}
}
return FALSE;
return;
typedef void (*CBFunc)(GisPlugin *, const gchar *, gpointer);
CBFunc callback = (CBFunc)_callback;
- for (int i = 0; i < self->plugins->len; i++) {
- GisPluginStore *store = g_ptr_array_index(self->plugins, i);
+ for (GList *cur = self->plugins; cur; cur = cur->next) {
+ GisPluginStore *store = cur->data;
callback(store->plugin, store->name, user_data);
}
}
#include "gis-prefs.h"
struct _GisPlugins {
- gchar *dir;
- GPtrArray *plugins;
+ gchar *dir;
+ GList *plugins;
};
typedef GisPlugin *(*GisPluginConstructor)(GisViewer *viewer, GisPrefs *prefs);
g_free(tmp);
}
if (error) {
- g_warning("GisPrefs: new - Unable to load key file `%s': %s",
+ g_debug("GisPrefs: new - Unable to load key file `%s': %s",
self->key_path, error->message);
}
return self;
/*************
* Callbacks *
*************/
-static gboolean on_key_press(GtkWidget *widget, GdkEventKey *event, gpointer _)
+static gboolean on_key_press(GtkWidget *widget, GdkEventKey *event,
+ gpointer _window)
{
g_debug("GisTest: on_key_press - key=%x, state=%x",
event->keyval, event->state);
+ GtkWidget *window = _window;
switch (event->keyval) {
case GDK_q:
- gtk_widget_destroy(widget);
+ gtk_widget_destroy(window);
return TRUE;
}
return FALSE;
gdk_threads_enter();
GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
- g_signal_connect(window, "key-press-event", G_CALLBACK(on_key_press), NULL);
+ g_signal_connect(window, "key-press-event", G_CALLBACK(on_key_press), window);
gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(viewer));
gtk_widget_show_all(window);
gdk_threads_leave();
gdk_threads_enter();
gtk_main();
- g_object_unref(prefs);
- g_object_unref(viewer);
gis_plugins_free(plugins);
+ g_object_unref(prefs);
gdk_threads_leave();
return 0;
}
{
g_debug("GisPluginBmng: new");
GisPluginBmng *self = g_object_new(GIS_TYPE_PLUGIN_BMNG, NULL);
- self->viewer = viewer;
+ self->viewer = g_object_ref(viewer);
/* Load initial tiles */
_load_tile(self->tiles, self);
g_debug("GisPluginBmng: dispose");
GisPluginBmng *self = GIS_PLUGIN_BMNG(gobject);
/* Drop references */
- g_signal_handler_disconnect(self->viewer, self->sigid);
+ if (self->viewer) {
+ g_signal_handler_disconnect(self->viewer, self->sigid);
+ g_object_unref(self->viewer);
+ self->viewer = NULL;
+ }
G_OBJECT_CLASS(gis_plugin_bmng_parent_class)->dispose(gobject);
}
static void gis_plugin_bmng_finalize(GObject *gobject)
{
g_debug("GisPluginSrtm: new");
GisPluginSrtm *self = g_object_new(GIS_TYPE_PLUGIN_SRTM, NULL);
- self->viewer = viewer;
+ self->viewer = g_object_ref(viewer);
/* Load initial tiles */
_load_tile(self->tiles, self);
g_debug("GisPluginSrtm: dispose");
GisPluginSrtm *self = GIS_PLUGIN_SRTM(gobject);
/* Drop references */
- g_signal_handler_disconnect(self->viewer, self->sigid);
if (LOAD_BIL)
gis_viewer_clear_height_func(self->viewer);
+ if (self->viewer) {
+ g_signal_handler_disconnect(self->viewer, self->sigid);
+ g_object_unref(self->viewer);
+ self->viewer = NULL;
+ }
G_OBJECT_CLASS(gis_plugin_srtm_parent_class)->dispose(gobject);
}
static void gis_plugin_srtm_finalize(GObject *gobject)