summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Kost <ensonic@users.sf.net>2011-01-12 16:35:53 +0200
committerStefan Kost <ensonic@users.sf.net>2011-01-12 16:35:53 +0200
commit2f5fe8788f1b9c5fa408e1ed24cb87edefc26d86 (patch)
treec07d2d35844e9ceb49c547fea33998ab017187e9
parent499e6b2be97d0c65c76e47cbcc1f165f23645141 (diff)
graph: add more tracing and reset more pointers
-rw-r--r--src/ui/main-window.c46
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;
+ }
}
}