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++;

-- 


Reply via email to