X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/769be9881aa8d7212c6372e2fb10075cad551578..7e702780a082853b950bacf6dad486b94a4ae789:/disobedience/queue-generic.c diff --git a/disobedience/queue-generic.c b/disobedience/queue-generic.c index a2aa8ac..2f8aa70 100644 --- a/disobedience/queue-generic.c +++ b/disobedience/queue-generic.c @@ -438,6 +438,8 @@ void ql_new_queue(struct queuelike *ql, * This is used by ql_drag_motion() and ql_drag_data_received() to identify a * drop would or does land. It's important that they use the same code since * otherwise the visual feedback can be inconsistent with the actual effect! + * + * Remember to free the returned path. */ static GtkTreePath *ql_drop_path(GtkWidget *w, GtkTreeModel *model, @@ -718,6 +720,8 @@ static void ql_drag_data_received(GtkWidget attribute((unused)) *w, ql->drop(ql, tracks->nvec, tracks->vec, NULL, q); break; } + if(path) + gtk_tree_path_free(path); } /** @brief Initialize a @ref queuelike */ @@ -759,6 +763,7 @@ GtkWidget *init_queuelike(struct queuelike *ql) { /* The selection should support multiple things being selected */ ql->selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(ql->view)); + g_object_ref(ql->selection); gtk_tree_selection_set_mode(ql->selection, GTK_SELECTION_MULTIPLE); /* Catch button presses */ @@ -820,7 +825,8 @@ GtkWidget *init_queuelike(struct queuelike *ql) { /* TODO style? */ - ql->init(ql); + if(ql->init) + ql->init(ql); /* Update display text when lookups complete */ event_register("lookups-completed", queue_lookups_completed, ql); @@ -830,6 +836,31 @@ GtkWidget *init_queuelike(struct queuelike *ql) { return scrolled; } +/** @brief Destroy a queuelike + * @param ql Queuelike to destroy + * + * Returns @p ql to its initial state. + */ +void destroy_queuelike(struct queuelike *ql) { + if(ql->store) { + g_object_unref(ql->store); + ql->store = NULL; + } + if(ql->view) { + gtk_object_destroy(GTK_OBJECT(ql->view)); + ql->view = NULL; + } + if(ql->menu) { + gtk_object_destroy(GTK_OBJECT(ql->menu)); + ql->menu = NULL; + } + if(ql->selection) { + g_object_unref(ql->selection); + ql->selection = NULL; + } + ql->q = NULL; +} + /* Local Variables: c-basic-offset:2