diff options
author | Stefan Kost <ensonic@users.sf.net> | 2011-01-12 16:35:53 +0200 |
---|---|---|
committer | Stefan Kost <ensonic@users.sf.net> | 2011-01-12 16:35:53 +0200 |
commit | 2f5fe8788f1b9c5fa408e1ed24cb87edefc26d86 (patch) | |
tree | c07d2d35844e9ceb49c547fea33998ab017187e9 | |
parent | 499e6b2be97d0c65c76e47cbcc1f165f23645141 (diff) |
graph: add more tracing and reset more pointers
-rw-r--r-- | src/ui/main-window.c | 46 |
1 files changed, 34 insertions, 12 deletions
diff --git a/src/ui/main-window.c b/src/ui/main-window.c index e841a6e..3d5fef9 100644 --- a/src/ui/main-window.c +++ b/src/ui/main-window.c @@ -76,8 +76,8 @@ typedef struct { } GstTLPad; typedef struct { - guint src_pad_ix,sink_pad_ix; Agedge_t *edge; + guint src_pad_ix,sink_pad_ix; GstTLPad *ns,*ne; GooCanvasItem *ci_line; } GstTLLink; @@ -243,6 +243,7 @@ refresh_layout (GstTLMainWindow *self, GstTLRefreshMode mode) arr = self->priv->elements; bin_z_order = g_slice_alloc0 (sizeof(guint)*arr->len); z_ix = 0; + // need to run in several loops to handle the hierarchy re_run = TRUE; while (re_run) { @@ -274,7 +275,7 @@ refresh_layout (GstTLMainWindow *self, GstTLRefreshMode mode) } } } - + // add pads arr = self->priv->pads; parr = self->priv->elements; @@ -298,15 +299,17 @@ refresh_layout (GstTLMainWindow *self, GstTLRefreshMode mode) __nr_nodes++; #endif } else { + TRACE("[%2d:p] skipped (proxypad)",i); + g_assert (!item->node); if (item->ci_group) { gint child_num = goo_canvas_item_find_child (self->priv->canvas_root, item->ci_group); goo_canvas_item_remove_child (self->priv->canvas_root, child_num); - item->ci_group = NULL; + item->ci_group = item->ci_box = item->ci_text = NULL; } } } } - + // add links arr = self->priv->links; parr = self->priv->pads; @@ -321,24 +324,27 @@ refresh_layout (GstTLMainWindow *self, GstTLRefreshMode mode) if (pitem1->pad_type==2 || pitem2->pad_type==2) { gboolean is_int_link=FALSE; + /* skip ghost-pad <-> proxy-pad links */ if (pitem1->pad_type==1 && (pitem1->elem_ix == pitem2->elem_ix)) is_int_link = TRUE; if (pitem2->pad_type==1 && (pitem2->elem_ix == pitem1->elem_ix)) is_int_link = TRUE; + /* it is a link involving a normal pad */ if (!is_int_link) { guint j; GstTLPad *pitem3; /* find a link */ if (pitem1->pad_type==2) { + TRACE(" skipping %d",pitem1->pad_ix); + pitem1 = NULL; for (j = 0; j < arr->len; j++) { GstTLLink *bypass_item = arr->pdata[j]; if(bypass_item) { if (item->src_pad_ix == bypass_item->sink_pad_ix) { if ((pitem3=(GstTLPad *)g_ptr_array_check (parr, bypass_item->src_pad_ix))) { pitem1 = pitem3; - item->edge = agedge (root, pitem1->node, pitem2->node); break; } } @@ -346,24 +352,34 @@ refresh_layout (GstTLMainWindow *self, GstTLRefreshMode mode) } } if (pitem2->pad_type==2) { + TRACE(" skipping %d",pitem2->pad_ix); + pitem2 = NULL; for (j = 0; j < arr->len; j++) { GstTLLink *bypass_item = arr->pdata[j]; if(bypass_item) { if (item->sink_pad_ix == bypass_item->src_pad_ix) { if ((pitem3=(GstTLPad *)g_ptr_array_check (parr, bypass_item->sink_pad_ix))) { pitem2 = pitem3; - item->edge = agedge (root, pitem1->node, pitem2->node); break; } } } } } + if (pitem1 && pitem2) { + item->edge = agedge (root, pitem1->node, pitem2->node); + TRACE("[%3d:%3d:ls] parent=%p",pitem1->pad_ix,pitem2->pad_ix,parent); + } else { + pitem1 = pitem2 = NULL; + } + } else { + /* internal link, we skip it */ + pitem1 = pitem2 = NULL; } } else { item->edge = agedge (root, pitem1->node, pitem2->node); + TRACE("[%3d:%3d:ln] parent=%p",(i>>8)&0xFF,(i&0xFF),parent); } - TRACE("[%4d:l] parent=%p",i,parent); #ifdef ENABLE_TRACE if (item->edge) { __nr_edges++; @@ -723,20 +739,26 @@ done: arr = self->priv->elements; for (i = 0; i < arr->len; i++) { GstTLElement *item = arr->pdata[i]; - if(item) - item->graph = NULL; + if(item) { + item->graph = NULL; + item->bin = NULL; + } } arr = self->priv->pads; for (i = 0; i < arr->len; i++) { GstTLPad *item = arr->pdata[i]; - if(item) - item->node = NULL; + if(item) { + item->node = NULL; + item->elem = NULL; + } } arr = self->priv->links; for (i = 0; i < arr->len; i++) { GstTLLink *item = arr->pdata[i]; - if(item) + if(item) { item->edge = NULL; + item->ns = item->ne = NULL; + } } } |