fix crash from object being swallowed twice. Closes T2463

This commit is contained in:
Boris Faure 2015-06-11 23:55:35 +02:00
parent 1ad8055d28
commit a07a63048c
2 changed files with 60 additions and 21 deletions

View File

@ -5311,6 +5311,39 @@ _smart_pty_cancel_sel(void *data)
static void static void
_smart_pty_exited(void *data) _smart_pty_exited(void *data)
{ {
Termio *sd = evas_object_smart_data_get(data);
if (sd->event)
{
evas_object_event_callback_del(sd->event, EVAS_CALLBACK_MOUSE_DOWN,
_smart_cb_mouse_down);
evas_object_event_callback_del(sd->event, EVAS_CALLBACK_MOUSE_UP,
_smart_cb_mouse_up);
evas_object_event_callback_del(sd->event, EVAS_CALLBACK_MOUSE_MOVE,
_smart_cb_mouse_move);
evas_object_event_callback_del(sd->event, EVAS_CALLBACK_MOUSE_IN,
_smart_cb_mouse_in);
evas_object_event_callback_del(sd->event, EVAS_CALLBACK_MOUSE_OUT,
_smart_cb_mouse_out);
evas_object_event_callback_del(sd->event, EVAS_CALLBACK_MOUSE_WHEEL,
_smart_cb_mouse_wheel);
evas_object_del(sd->event);
sd->event = NULL;
}
if (sd->self)
{
evas_object_event_callback_del(sd->self, EVAS_CALLBACK_KEY_DOWN,
_smart_cb_key_down);
evas_object_event_callback_del(sd->self, EVAS_CALLBACK_KEY_UP,
_smart_cb_key_up);
evas_object_event_callback_del(sd->self, EVAS_CALLBACK_FOCUS_IN,
_smart_cb_focus_in);
evas_object_event_callback_del(sd->self, EVAS_CALLBACK_FOCUS_OUT,
_smart_cb_focus_out);
sd->self = NULL;
}
evas_object_smart_callback_call(data, "exited", NULL); evas_object_smart_callback_call(data, "exited", NULL);
} }

View File

@ -161,11 +161,11 @@ static void _tabs_refresh(Tabs *tabs);
/* {{{ Solo */ /* {{{ Solo */
static Evas_Object * static Evas_Object *
_solo_get_evas_object(Term_Container *container) _solo_get_evas_object(Term_Container *tc)
{ {
Solo *solo; Solo *solo;
assert (container->type == TERM_CONTAINER_TYPE_SOLO); assert (tc->type == TERM_CONTAINER_TYPE_SOLO);
solo = (Solo*)container; solo = (Solo*) tc;
return solo->term->bg; return solo->term->bg;
} }
@ -782,7 +782,6 @@ _win_swallow(Term_Container *tc, Term_Container *orig,
Win *wn; Win *wn;
Evas_Object *base; Evas_Object *base;
Evas_Object *o; Evas_Object *o;
Evas_Coord x, y, w, h;
assert (tc->type == TERM_CONTAINER_TYPE_WIN); assert (tc->type == TERM_CONTAINER_TYPE_WIN);
@ -791,16 +790,13 @@ _win_swallow(Term_Container *tc, Term_Container *orig,
if (orig) if (orig)
{ {
o = edje_object_part_swallow_get(base, "terminology.content");
edje_object_part_unswallow(base, o);
evas_object_hide(o);
o = orig->get_evas_object(orig); o = orig->get_evas_object(orig);
evas_object_geometry_get(o, &x, &y, &w, &h); edje_object_part_unswallow(base, o);
} }
o = new_child->get_evas_object(new_child); o = new_child->get_evas_object(new_child);
edje_object_part_swallow(base, "terminology.content", o); edje_object_part_swallow(base, "terminology.content", o);
if (orig)
evas_object_geometry_set(o, x, y, w, h);
evas_object_show(o); evas_object_show(o);
new_child->parent = tc; new_child->parent = tc;
wn->child = new_child; wn->child = new_child;
@ -893,8 +889,9 @@ _win_split(Term_Container *tc, Term_Container *child, const char *cmd,
Term *tm_new, *tm; Term *tm_new, *tm;
Term_Container *tc_split, *tc_solo_new; Term_Container *tc_split, *tc_solo_new;
Win *wn; Win *wn;
Evas_Object *obj_split;
char buf[PATH_MAX], *wdir = NULL; char buf[PATH_MAX], *wdir = NULL;
Evas_Object *base;
Evas_Object *o;
assert (tc->type == TERM_CONTAINER_TYPE_WIN); assert (tc->type == TERM_CONTAINER_TYPE_WIN);
wn = (Win*) tc; wn = (Win*) tc;
@ -908,14 +905,14 @@ _win_split(Term_Container *tc, Term_Container *child, const char *cmd,
tc_solo_new = _solo_new(tm_new, wn); tc_solo_new = _solo_new(tm_new, wn);
evas_object_data_set(tm_new->termio, "sizedone", tm_new->termio); evas_object_data_set(tm_new->termio, "sizedone", tm_new->termio);
base = win_base_get(wn);
o = child->get_evas_object(child);
edje_object_part_unswallow(base, o);
tc_split = _split_new(child, tc_solo_new, is_horizontal); tc_split = _split_new(child, tc_solo_new, is_horizontal);
obj_split = tc_split->get_evas_object(tc_split);
tc_split->is_focused = tc->is_focused; tc_split->is_focused = tc->is_focused;
tc->swallow(tc, child, tc_split); tc->swallow(tc, NULL, tc_split);
evas_object_show(obj_split);
} }
static void static void
@ -1173,7 +1170,6 @@ _split_swallow(Term_Container *tc, Term_Container *orig,
{ {
Split *split; Split *split;
Evas_Object *o; Evas_Object *o;
Evas_Coord x, y, w, h;
assert (tc->type == TERM_CONTAINER_TYPE_SPLIT); assert (tc->type == TERM_CONTAINER_TYPE_SPLIT);
split = (Split*) tc; split = (Split*) tc;
@ -1181,7 +1177,6 @@ _split_swallow(Term_Container *tc, Term_Container *orig,
assert (orig && (orig == split->tc1 || orig == split->tc2)); assert (orig && (orig == split->tc1 || orig == split->tc2));
o = orig->get_evas_object(orig); o = orig->get_evas_object(orig);
evas_object_geometry_get(o, &x, &y, &w, &h);
evas_object_hide(o); evas_object_hide(o);
if (orig == split->last_focus) if (orig == split->last_focus)
@ -1201,7 +1196,6 @@ _split_swallow(Term_Container *tc, Term_Container *orig,
split->tc2 = new_child; split->tc2 = new_child;
} }
new_child->parent = tc; new_child->parent = tc;
evas_object_geometry_set(o, x, y, w, h);
evas_object_show(o); evas_object_show(o);
evas_object_show(split->panes); evas_object_show(split->panes);
@ -1253,12 +1247,15 @@ _split_close(Term_Container *tc, Term_Container *child)
{ {
Split *split; Split *split;
Term_Container *parent, *other_child; Term_Container *parent, *other_child;
Evas_Object *top, *bottom;
assert (tc->type == TERM_CONTAINER_TYPE_SPLIT); assert (tc->type == TERM_CONTAINER_TYPE_SPLIT);
split = (Split*) tc; split = (Split*) tc;
elm_object_part_content_unset(split->panes, PANES_TOP); top = elm_object_part_content_unset(split->panes, PANES_TOP);
elm_object_part_content_unset(split->panes, PANES_BOTTOM); bottom = elm_object_part_content_unset(split->panes, PANES_BOTTOM);
evas_object_hide(top);
evas_object_hide(bottom);
parent = tc->parent; parent = tc->parent;
other_child = (child == split->tc1) ? split->tc2 : split->tc1; other_child = (child == split->tc1) ? split->tc2 : split->tc1;
@ -1360,11 +1357,13 @@ _split_split(Term_Container *tc, Term_Container *child,
{ {
Term *tm_new, *tm; Term *tm_new, *tm;
Term_Container *tc_split, *tc_solo_new; Term_Container *tc_split, *tc_solo_new;
Split *split;
Win *wn; Win *wn;
Evas_Object *obj_split; Evas_Object *obj_split;
char buf[PATH_MAX], *wdir = NULL; char buf[PATH_MAX], *wdir = NULL;
assert (tc->type == TERM_CONTAINER_TYPE_SPLIT); assert (tc->type == TERM_CONTAINER_TYPE_SPLIT);
split = (Split *)tc;
wn = tc->wn; wn = tc->wn;
tm = child->focused_term_get(child); tm = child->focused_term_get(child);
@ -1376,6 +1375,11 @@ _split_split(Term_Container *tc, Term_Container *child,
tc_solo_new = _solo_new(tm_new, wn); tc_solo_new = _solo_new(tm_new, wn);
evas_object_data_set(tm_new->termio, "sizedone", tm_new->termio); evas_object_data_set(tm_new->termio, "sizedone", tm_new->termio);
if (child == split->tc1)
elm_object_part_content_unset(split->panes, PANES_TOP);
else
elm_object_part_content_unset(split->panes, PANES_BOTTOM);
tc_split = _split_new(child, tc_solo_new, is_horizontal); tc_split = _split_new(child, tc_solo_new, is_horizontal);
obj_split = tc_split->get_evas_object(tc_split); obj_split = tc_split->get_evas_object(tc_split);
@ -3639,6 +3643,8 @@ _term_free(Term *term)
term->popmedia_deleted = EINA_FALSE; term->popmedia_deleted = EINA_FALSE;
evas_object_del(term->termio); evas_object_del(term->termio);
term->termio = NULL; term->termio = NULL;
edje_object_part_unswallow(term->bg, term->base);
evas_object_del(term->base); evas_object_del(term->base);
term->base = NULL; term->base = NULL;
evas_object_del(term->bg); evas_object_del(term->bg);