billiob pushed a commit to branch master. http://git.enlightenment.org/apps/terminology.git/commit/?id=0edb5f79139c8959a352ca0fda50419aa963643b
commit 0edb5f79139c8959a352ca0fda50419aa963643b Author: Boris Faure <[email protected]> Date: Sat Mar 14 23:32:02 2020 +0100 win: rollback tabs when dragging tabs made last tab lonely --- src/bin/win.c | 136 +++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 91 insertions(+), 45 deletions(-) diff --git a/src/bin/win.c b/src/bin/win.c index 64f800d..52f216a 100644 --- a/src/bin/win.c +++ b/src/bin/win.c @@ -1247,6 +1247,11 @@ _win_swallow(Term_Container *tc, Term_Container *orig, evas_object_show(o); new_child->parent = tc; wn->child = new_child; + + if (_tab_drag && _tab_drag->icon) + { + evas_object_raise(_tab_drag->icon); + } } static void @@ -2987,6 +2992,19 @@ _tab_item_to_term(const Tab_Item *tab_item) return solo->term; } +static void +_cb_tab_activate(void *data, + Evas_Object *_obj EINA_UNUSED, + const char *_sig EINA_UNUSED, + const char *_src EINA_UNUSED) +{ + Tab_Item *tab_item = data; + Term *term = _tab_item_to_term(tab_item); + + term_focus(term); +} + + static void _tabbar_clear(Term *term) { @@ -3012,25 +3030,19 @@ _tabbar_clear(Term *term) term->tab_spacer = NULL; } if (term->tab_inactive) - evas_object_hide(term->tab_inactive); -} - -static void -_cb_tab_activate(void *data, - Evas_Object *_obj EINA_UNUSED, - const char *_sig EINA_UNUSED, - const char *_src EINA_UNUSED) -{ - Tab_Item *tab_item = data; - Term *term = _tab_item_to_term(tab_item); - - term_focus(term); + { + evas_object_hide(term->tab_inactive); + edje_object_signal_callback_del(term->tab_inactive, + "tab,activate", "terminology", + _cb_tab_activate); + } } static void _tab_item_free(Tab_Item *tab_item) { Term *term; + if (!tab_item) return; @@ -3040,6 +3052,7 @@ _tab_item_free(Tab_Item *tab_item) edje_object_signal_callback_del(term->tab_inactive, "tab,activate", "terminology", _cb_tab_activate); + free(tab_item); } static void @@ -3087,6 +3100,7 @@ _tabs_recompute_drag(Tabs *tabs) break; } } + assert(term != NULL); if (n > 1) { v1 = (double)(idx) / (double)n; @@ -3094,7 +3108,6 @@ _tabs_recompute_drag(Tabs *tabs) } tabs->v1_orig = v1; tabs->v2_orig = v2; - assert(term != NULL); edje_object_part_drag_value_set(term->bg_edj, "terminology.tabl", v1, 0.0); edje_object_part_drag_value_set(term->bg_edj, "terminology.tabr", v2, 0.0); } @@ -3232,6 +3245,7 @@ _solo_attach(Term_Container *tc, Term_Container *tc_to_add) _tabs_new(tc, tc->parent); _tabs_attach(tc->parent, tc_to_add); + assert(eina_list_count(((Tabs*)(tc->parent))->tabs) > 1); } static void @@ -3411,6 +3425,9 @@ _tabbar_fill(Tabs *tabs) _tabs_set_main_tab(term, tab_item); assert(main_term == term); evas_object_hide(term->tab_inactive); + edje_object_signal_callback_del(term->tab_inactive, + "tab,activate", "terminology", + _cb_tab_activate); after_current = EINA_TRUE; } else @@ -3479,60 +3496,72 @@ _tabs_get_or_create_boxes(Term *term, Term *src) static void _tab_drag_rollback_tabs(void) { - ERR("rollback tabs"); Term *term = _tab_drag->term; Win *wn = term->wn; Term_Container *tc_win = (Term_Container*)wn; Term_Container *tc = term->container; Term_Container *tc_tabs = _tab_drag->tabs_child; + int n; + Tabs *tabs; if (tc_tabs->type == TERM_CONTAINER_TYPE_TABS) { - Tabs *tabs = (Tabs*) tc_tabs; - int n; + tabs = (Tabs*) tc_tabs; /* reinsert at correct place */ _solo_attach(tabs->current->tc, tc); + } + else + { + assert(tc_tabs->type == TERM_CONTAINER_TYPE_SOLO); + + /* Create tabs with solo */ + assert(term->tab_item == NULL); + _solo_attach(_tab_drag->tabs_child, term->container); + tabs = (Tabs *) term->container->parent; + } + + n = eina_list_count(tabs->tabs); + assert (n >= 2); - n = eina_list_count(tabs->tabs); + /* move tab_item to expected place */ + if (_tab_drag->previous_position < n) + { + Tab_Item *tab_item = term->tab_item; - /* move tab_item to expected place */ - if (_tab_drag->previous_position < n) + tabs->tabs = eina_list_remove(tabs->tabs, tab_item); + if (_tab_drag->previous_position == n-1) + { + tabs->tabs = eina_list_append(tabs->tabs, term->tab_item); + } + else { int i = 0; - Tab_Item *tab_item = term->tab_item; Eina_List *l; - tabs->tabs = eina_list_remove(tabs->tabs, tab_item); EINA_LIST_FOREACH(tabs->tabs, l, tab_item) { if (i == _tab_drag->previous_position) { tabs->tabs = eina_list_prepend_relative_list(tabs->tabs, - term->tab_item, - l); + term->tab_item, + l); break; } i++; } } + } - tc_win->unfocus(tc_win, NULL); - tc->focus(tc, NULL); + tc_win->unfocus(tc_win, NULL); + tc->focus(tc, NULL); - /* Repack in correct boxes */ - elm_box_unpack_all(term->tabbar.l.box); - elm_box_unpack_all(term->tabbar.r.box); - _tabbar_fill(tabs); + /* Repack in correct boxes */ + elm_box_unpack_all(term->tabbar.l.box); + elm_box_unpack_all(term->tabbar.r.box); + _tabbar_fill(tabs); - _tab_drag_reparented(); - } - else - { - assert(tc_tabs->type == TERM_CONTAINER_TYPE_SOLO); - /* Create tabs with solo */ - ERR("TAB CREATE"); - } + _tab_drag_reparented(); } static void @@ -3599,8 +3628,6 @@ _tab_drag_save_state(Term_Container *tc) ERR("invalid parent type:%d", tc->parent->type); abort(); } - - } static void @@ -3676,8 +3703,8 @@ _tab_reorg(Term *term, Term *to_term, Evas_Coord mx, Evas_Coord my) _solo_attach(to_tc, tc_orig); /* reinsert at correct place */ - _tab_drag_reinsert(term, mid); _tab_drag_reparented(); + _tab_drag_reinsert(term, mid); return; } @@ -3720,8 +3747,8 @@ _tab_drag_stop(void) goto end; mid = (double)(mx - x) / (double)w; - _tab_drag_reinsert(term, mid); _tab_drag_reparented(); + _tab_drag_reinsert(term, mid); } else { @@ -3890,12 +3917,14 @@ _tab_drag_start(void *data EINA_UNUSED) evas_object_resize(o, w, h); evas_object_move(o, x + off_x, y + off_y); + evas_object_raise(o); evas_object_show(o); _tab_drag->icon = o; _tab_drag_save_state(tc); tc->parent->detach(tc->parent, tc); + assert(term->tab_item == NULL); _tab_drag->timer = NULL; return ECORE_CALLBACK_CANCEL; @@ -4351,7 +4380,12 @@ _tabs_close(Term_Container *tc, Term_Container *child) evas_object_del(next_term->tab_spacer); next_term->tab_spacer = NULL; if (next_term->tab_inactive) - evas_object_hide(next_term->tab_inactive); + { + evas_object_hide(next_term->tab_inactive); + edje_object_signal_callback_del(next_term->tab_inactive, + "tab,activate", "terminology", + _cb_tab_activate); + } elm_layout_signal_emit(next_term->bg, "tabcount,off", "terminology"); elm_layout_signal_emit(next_term->bg, "tab_btn,off", "terminology"); @@ -4375,6 +4409,7 @@ _tabs_close(Term_Container *tc, Term_Container *child) _tab_item_free(item); _tab_item_free(next_item); + EINA_LIST_FREE(tabs->tabs, item) {} free(tc); return; @@ -4403,6 +4438,7 @@ _tabs_close(Term_Container *tc, Term_Container *child) if (tc->is_focused) next_child->focus(next_child, tc); _tab_item_free(item); + assert(tabs->current != item); return; } _tab_item_free(item); @@ -4559,7 +4595,12 @@ _tabcount_refresh(Tabs *tabs) term = solo->term; if (term->tab_inactive) - evas_object_hide(term->tab_inactive); + { + evas_object_hide(term->tab_inactive); + edje_object_signal_callback_del(term->tab_inactive, + "tab,activate", "terminology", + _cb_tab_activate); + } if (tabs->current == tab_item) { @@ -4943,7 +4984,12 @@ _tabs_recreate(Tabs *tabs) term = solo->term; if (term->tab_inactive) - evas_object_hide(term->tab_inactive); + { + evas_object_hide(term->tab_inactive); + edje_object_signal_callback_del(term->tab_inactive, + "tab,activate", "terminology", + _cb_tab_activate); + } if (term->missed_bell) missed++; --
