diff options
author | Stefan Kost <ensonic@users.sf.net> | 2010-10-12 11:43:25 +0300 |
---|---|---|
committer | Stefan Kost <ensonic@users.sf.net> | 2010-10-12 11:43:25 +0300 |
commit | c22d58565eb08bf34f4e4bf5c7becff8d604cf8a (patch) | |
tree | be1f9bf5ad5291ef70b9195c9830ca42bc3c8997 | |
parent | e764419f34551ef7c89a5bd993059ff71c1e76b8 (diff) |
ui: when removing links, remove pads that were temporarily added
When using playbin2 we see some link add/remove pairs during autoplugging
process. The target proxypads are never really added and thus would stay on the
screen.
-rw-r--r-- | src/ui/main-window.c | 59 |
1 files changed, 41 insertions, 18 deletions
diff --git a/src/ui/main-window.c b/src/ui/main-window.c index 38ac07b..4f9681e 100644 --- a/src/ui/main-window.c +++ b/src/ui/main-window.c @@ -987,29 +987,29 @@ on_new_log_event (GstTLLogBuffer *lb, GstTLLogEvent *ev, gpointer user_data) GstTLLink *item; GstTLPad *pitem; guint link_ix; - - // update parents - if (!(pitem = g_ptr_array_check (parr, ev->data.topo_link.src_pad_ix))) { - pitem = g_ptr_array_get (parr, ev->data.topo_link.src_pad_ix, GstTLPad); - pitem->pad_ix = ev->data.topo_link.src_pad_ix; - pitem->elem_ix = G_MAXUINT; - } - if (!pitem->name && ev->data.topo_link.src_pad_name) { - pitem->name=ev->data.topo_link.src_pad_name; - } - if (!(pitem = g_ptr_array_check (parr, ev->data.topo_link.sink_pad_ix))) { - pitem = g_ptr_array_get (parr, ev->data.topo_link.sink_pad_ix, GstTLPad); - pitem->pad_ix = ev->data.topo_link.sink_pad_ix; - pitem->elem_ix = G_MAXUINT; - } - if (!pitem->name && ev->data.topo_link.sink_pad_name) { - pitem->name=ev->data.topo_link.sink_pad_name; - } /* add or remove link */ link_ix = (ev->data.topo_link.src_pad_ix<<8)|ev->data.topo_link.sink_pad_ix; item = g_ptr_array_get (larr, link_ix, GstTLLink); if (ev->qkey == log_event_type_topo_link_add) { + // update parents + if (!(pitem = g_ptr_array_check (parr, ev->data.topo_link.src_pad_ix))) { + pitem = g_ptr_array_get (parr, ev->data.topo_link.src_pad_ix, GstTLPad); + pitem->pad_ix = ev->data.topo_link.src_pad_ix; + pitem->elem_ix = G_MAXUINT; + } + if (!pitem->name && ev->data.topo_link.src_pad_name) { + pitem->name=ev->data.topo_link.src_pad_name; + } + if (!(pitem = g_ptr_array_check (parr, ev->data.topo_link.sink_pad_ix))) { + pitem = g_ptr_array_get (parr, ev->data.topo_link.sink_pad_ix, GstTLPad); + pitem->pad_ix = ev->data.topo_link.sink_pad_ix; + pitem->elem_ix = G_MAXUINT; + } + if (!pitem->name && ev->data.topo_link.sink_pad_name) { + pitem->name=ev->data.topo_link.sink_pad_name; + } + item->src_pad_ix = ev->data.topo_link.src_pad_ix; item->sink_pad_ix = ev->data.topo_link.sink_pad_ix; TRACE("[l+] ----------------------------------------"); @@ -1019,6 +1019,29 @@ on_new_log_event (GstTLLogBuffer *lb, GstTLLogEvent *ev, gpointer user_data) gint child_num = goo_canvas_item_find_child (self->priv->canvas_root, item->ci_line); goo_canvas_item_remove_child (self->priv->canvas_root, child_num); } + // remove parents (if those where temporary) + if ((pitem = g_ptr_array_check (parr, ev->data.topo_link.src_pad_ix))) { + if (pitem->elem_ix == G_MAXUINT) { + // remove canvas item + if (pitem->ci_group) { + gint child_num = goo_canvas_item_find_child (self->priv->canvas_root, pitem->ci_group); + goo_canvas_item_remove_child (self->priv->canvas_root, child_num); + } + g_slice_free (GstTLPad, parr->pdata[ev->data.topo_link.src_pad_ix]); + parr->pdata[ev->data.topo_link.src_pad_ix] = NULL; + } + } + if ((pitem = g_ptr_array_check (parr, ev->data.topo_link.sink_pad_ix))) { + if (pitem->elem_ix == G_MAXUINT) { + // remove canvas item + if (pitem->ci_group) { + gint child_num = goo_canvas_item_find_child (self->priv->canvas_root, pitem->ci_group); + goo_canvas_item_remove_child (self->priv->canvas_root, child_num); + } + g_slice_free (GstTLPad, parr->pdata[ev->data.topo_link.sink_pad_ix]); + parr->pdata[ev->data.topo_link.sink_pad_ix] = NULL; + } + } g_slice_free (GstTLLink, larr->pdata[link_ix]); larr->pdata[link_ix] = NULL; TRACE("[l-] ----------------------------------------"); |