GRITS_OBJECT(msg->storm_based)->hidden = !sshow || hide;
}
- gtk_widget_queue_draw(GTK_WIDGET(alert->viewer));
+ grits_viewer_queue_draw(alert->viewer);
return TRUE;
}
g_free(date_str);
gtk_widget_show_all(GTK_WIDGET(alert->config));
+ alert->update_source = 0;
return FALSE;
}
(a->info->prior == b->info->prior) ? 0 : 1;
}
-static gboolean _update_end(gpointer _alert)
-{
- GritsPluginAlert *alert = _alert;
- gtk_widget_queue_draw(GTK_WIDGET(alert->viewer));
- return FALSE;
-}
-
static void _update_warnings(GritsPluginAlert *alert, GList *old)
{
g_debug("GritsPluginAlert: _update_warnings");
AlertMsg *msg = cur->data;
msg->county_based = _load_county_based(alert, msg);
}
- g_idle_add(_update_end, alert);
+ grits_viewer_queue_draw(alert->viewer);
for (GList *cur = alert->msgs; cur; cur = cur->next) {
AlertMsg *msg = cur->data;
msg->storm_based = _load_storm_based(alert, msg);
}
- g_idle_add(_update_end, alert);
+ grits_viewer_queue_draw(alert->viewer);
g_debug("GritsPluginAlert: _load_warnings - end");
}
if (!(alert->msgs = msg_load_index(alert->http, when, &alert->updated, offline)))
return;
- g_idle_add((GSourceFunc)_update_buttons, alert);
+ if (!alert->update_source)
+ alert->update_source = g_idle_add((GSourceFunc)_update_buttons, alert);
_update_warnings(alert, old);
g_list_foreach(old, (GFunc)msg_free, NULL);
/* Drop references */
if (alert->viewer) {
GritsViewer *viewer = alert->viewer;
- alert->viewer = NULL;
g_signal_handler_disconnect(viewer, alert->refresh_id);
g_signal_handler_disconnect(viewer, alert->time_changed_id);
soup_session_abort(alert->http->soup);
g_thread_pool_free(alert->threads, TRUE, TRUE);
- gtk_widget_destroy(alert->details);
- while (gtk_events_pending())
- gtk_main_iteration();
+ if (alert->update_source)
+ g_source_remove(alert->update_source);
+ alert->viewer = NULL;
for (GList *cur = alert->msgs; cur; cur = cur->next) {
AlertMsg *msg = cur->data;
if (msg->county_based) grits_viewer_remove(viewer,
}
for (GList *cur = alert->states; cur; cur = cur->next)
grits_viewer_remove(viewer, cur->data);
+ gtk_widget_destroy(alert->details);
g_object_unref(alert->prefs);
g_object_unref(viewer);
}
guint time_id; // "time-changed" callback ID
guint refresh_id; // "refresh" callback ID
guint location_id; // "locaiton-changed" callback ID
+ guint idle_source; // _site_update_end idle source
};
/* format: http://mesonet.agron.iastate.edu/data/nexrd2/raw/KABR/KABR_20090510_0323 */
aweather_level2_get_config(site->level2));
}
site->status = STATUS_LOADED;
+ site->idle_source = 0;
return FALSE;
}
gpointer _site_update_thread(gpointer _site)
GRITS_LEVEL_WORLD+3, TRUE);
out:
- g_idle_add(_site_update_end, site);
+ if (!site->idle_source)
+ site->idle_source = g_idle_add(_site_update_end, site);
return NULL;
}
void _site_update(RadarSite *site)
g_signal_handler_disconnect(site->viewer, site->time_id);
if (site->refresh_id)
g_signal_handler_disconnect(site->viewer, site->refresh_id);
+ if (site->idle_source)
+ g_source_remove(site->idle_source);
+ site->idle_source = 0;
/* Remove tab */
if (site->config)
guint time_id; // "time-changed" callback ID
guint refresh_id; // "refresh" callback ID
+ guint idle_source; // _conus_update_end idle source
};
void _conus_update_loading(gchar *file, goffset cur,
/* Copy images to graphics memory */
static void _conus_update_end_copy(GritsTile *tile, guchar *pixels)
{
- if (!tile->data) {
- tile->data = g_new0(guint, 1);
- glGenTextures(1, tile->data);
- }
+ if (!tile->tex)
+ glGenTextures(1, &tile->tex);
gchar *clear = g_malloc0(2048*2048*4);
- guint *tex = tile->data;
- glBindTexture(GL_TEXTURE_2D, *tex);
+ glBindTexture(GL_TEXTURE_2D, tile->tex);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glPixelStorei(GL_PACK_ALIGNMENT, 1);
/* Update GUI */
gchar *label = g_path_get_basename(conus->path);
_gtk_bin_set_child(GTK_BIN(conus->config), gtk_label_new(label));
- gtk_widget_queue_draw(GTK_WIDGET(conus->viewer));
+ grits_viewer_queue_draw(conus->viewer);
g_free(label);
out:
+ conus->idle_source = 0;
g_free(conus->path);
g_mutex_unlock(&conus->loading);
return FALSE;
out:
g_debug("Conus: update_thread - done");
- g_idle_add(_conus_update_end, conus);
+ if (!conus->idle_source)
+ conus->idle_source = g_idle_add(_conus_update_end, conus);
return NULL;
}
{
g_signal_handler_disconnect(conus->viewer, conus->time_id);
g_signal_handler_disconnect(conus->viewer, conus->refresh_id);
+ if (conus->idle_source)
+ g_source_remove(conus->idle_source);
for (int i = 0; i < 2; i++) {
GritsTile *tile = conus->tile[i];
- if (tile->data) {
- glDeleteTextures(1, tile->data);
- g_free(tile->data);
- }
grits_viewer_remove(conus->viewer, GRITS_OBJECT(tile));
+ g_object_unref(tile);
}
g_object_unref(conus->viewer);
g_warning("GritsPluginRadar: _update_hidden - no site or counus found");
}
}
- gtk_widget_queue_draw(GTK_WIDGET(viewer));
+ grits_viewer_queue_draw(viewer);
}
/* Methods */
/* TODO: move to constructor if possible */
g_debug("GritsPluginRadar: new");
GritsPluginRadar *self = g_object_new(GRITS_TYPE_PLUGIN_RADAR, NULL);
- self->viewer = viewer;
- self->prefs = prefs;
+ self->viewer = g_object_ref(viewer);
+ self->prefs = g_object_ref(prefs);
/* Setup page switching */
self->tab_id = g_signal_connect(self->config, "switch-page",
"conus" G_DIR_SEPARATOR_S);
self->sites = g_hash_table_new_full(g_str_hash, g_str_equal,
NULL, (GDestroyNotify)radar_site_free);
- self->config = gtk_notebook_new();
+ self->config = g_object_ref(gtk_notebook_new());
/* Load colormaps */
for (int i = 0; colormaps[i].file; i++) {
g_signal_handler_disconnect(self->config, self->tab_id);
grits_viewer_remove(viewer, GRITS_OBJECT(self->hud));
radar_conus_free(self->conus);
+ g_hash_table_destroy(self->sites);
+ g_object_unref(self->config);
+ g_object_unref(self->hud);
+ g_object_unref(self->prefs);
+ g_object_unref(viewer);
}
/* Drop references */
G_OBJECT_CLASS(grits_plugin_radar_parent_class)->dispose(gobject);
/* Free data */
grits_http_free(self->conus_http);
grits_http_free(self->sites_http);
- g_hash_table_destroy(self->sites);
gtk_widget_destroy(self->config);
G_OBJECT_CLASS(grits_plugin_radar_parent_class)->finalize(gobject);