summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Kost <ensonic@users.sf.net>2010-10-12 11:43:25 +0300
committerStefan Kost <ensonic@users.sf.net>2010-10-12 11:43:25 +0300
commitc22d58565eb08bf34f4e4bf5c7becff8d604cf8a (patch)
treebe1f9bf5ad5291ef70b9195c9830ca42bc3c8997
parente764419f34551ef7c89a5bd993059ff71c1e76b8 (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.c59
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-] ----------------------------------------");