fix invalid write..
authorHannes Janetzek <hannes.janetzek@gmail.com>
Tue, 18 May 2010 03:20:55 +0000 (03:20 +0000)
committerHannes Janetzek <hannes.janetzek@gmail.com>
Tue, 18 May 2010 03:20:55 +0000 (03:20 +0000)
cleanups

SVN revision: 48955

src/modules/everything/evry_plug_view_thumb.c

index 2234384..ee93a37 100644 (file)
@@ -83,6 +83,7 @@ static View *view = NULL;
 
 static void _view_clear(Evry_View *view, int slide);
 static void _pan_item_select(Evas_Object *obj, Item *it, int scroll);
+static void _animator_del(Evas_Object *obj);
 
 
 
@@ -91,6 +92,9 @@ _thumb_gen(void *data, Evas_Object *obj, void *event_info)
 {
    Evas_Coord w, h;
    Item *it = data;
+   Smart_Data *sd = evas_object_smart_data_get(it->obj);
+   if (sd->clearing)
+     return;
 
    if (!it->frame) return;
 
@@ -125,6 +129,9 @@ _thumb_idler(void *data)
    Eina_List *l, *ll;
    Item *it;
 
+   if (!sd || sd->clearing)
+     return 1;
+
    EINA_LIST_FOREACH_SAFE(sd->queue, l, ll, it)
      {
        if (!it->image && !it->have_thumb)
@@ -177,8 +184,10 @@ _item_down(void *data, Evas *e, Evas_Object *obj, void *event_info)
    Evas_Event_Mouse_Down *ev = event_info;
    Item *it = data;
    Smart_Data *sd = evas_object_smart_data_get(it->obj);
+   if (!sd || sd->clearing) return;
 
    sd->mouse_act = 1;
+   sd->it_down = it;
 
    if (ev->button == 1)
      {
@@ -194,12 +203,8 @@ _item_down(void *data, Evas *e, Evas_Object *obj, void *event_info)
             sd->mouse_x = ev->canvas.x;
             sd->mouse_y = ev->canvas.y;
 
-            sd->it_down = it;
-
             if (sd->selector && evas_object_visible_get(sd->selector))
-              {
-                 evas_object_hide(sd->selector);
-              }
+              evas_object_hide(sd->selector);
          }
      }
 }
@@ -210,9 +215,13 @@ _item_up(void *data, Evas *e, Evas_Object *obj, void *event_info)
    Evas_Event_Mouse_Up *ev = event_info;
    Item *it = data;
    Smart_Data *sd = evas_object_smart_data_get(it->obj);
+   if (!sd || sd->clearing) return;
 
    sd->mouse_x = 0;
    sd->mouse_y = 0;
+   if (!sd->it_down)
+     return;
+
    sd->it_down = NULL;
 
    if (ev->button == 1)
@@ -241,7 +250,6 @@ _item_up(void *data, Evas *e, Evas_Object *obj, void *event_info)
 static void
 _item_show(View *v, Item *it, Evas_Object *list)
 {
-
    if (!it->frame)
      {
        it->frame = edje_object_add(v->evas);
@@ -264,6 +272,7 @@ _item_show(View *v, Item *it, Evas_Object *list)
        evas_object_event_callback_add(it->frame, EVAS_CALLBACK_MOUSE_UP,
                                       _item_up, it);
        evas_object_smart_member_add(it->frame, list);
+
        evas_object_clip_set(it->frame, evas_object_clip_get(list));
 
        if (it->item->marked)
@@ -292,6 +301,7 @@ static void
 _item_hide(Item *it)
 {
    if (it->do_thumb) e_thumb_icon_end(it->thumb);
+
    if (it->thumb) evas_object_del(it->thumb);
    if (it->image) evas_object_del(it->image);
    if (it->frame) evas_object_del(it->frame);
@@ -409,6 +419,7 @@ _e_smart_reconfigure_do(void *data)
          sd->cx = 0;
        if (sd->cy < 0)
          sd->cy = 0;
+
        changed = 1;
      }
 
@@ -471,7 +482,7 @@ _e_smart_reconfigure_do(void *data)
    if (changed)
      evas_object_smart_callback_call(obj, "changed", NULL);
 
-   if (!sd->thumb_idler)
+   if (!sd->clearing && !sd->thumb_idler)
      sd->thumb_idler = ecore_idle_enterer_add(_thumb_idler, sd);
 
    sd->idle_enter = NULL;
@@ -502,24 +513,17 @@ static void
 _e_smart_del(Evas_Object *obj)
 {
    Smart_Data *sd = evas_object_smart_data_get(obj);
-   Item *it;
 
    if (sd->idle_enter)
      ecore_idle_enterer_del(sd->idle_enter);
+
    if (sd->thumb_idler)
      ecore_idle_enterer_del(sd->thumb_idler);
-   if (sd->animator)
-     ecore_animator_del(sd->animator);
 
-   // sd->view is just referenced
-   // sd->child_obj is unused
-   EINA_LIST_FREE(sd->items, it)
-     {
-       _item_hide(it);
-       evry_item_free(it->item);
-       free(it);
-     }
-   evas_object_del(sd->selector);
+   _animator_del(obj);
+
+   if (sd->selector)
+     evas_object_del(sd->selector);
 
    free(sd);
    evas_object_smart_data_set(obj, NULL);
@@ -676,10 +680,25 @@ _pan_item_remove(Evas_Object *obj, Item *it)
    E_FREE(it);
 }
 
+static void
+_animator_del(Evas_Object *obj)
+{
+   Smart_Data *sd = evas_object_smart_data_get(obj);
+   if (sd->clearing)
+     {
+       sd->clearing = EINA_FALSE;
+       _view_clear(EVRY_VIEW(sd->view), 0);
+     }
+
+   sd->animator = NULL;
+}
+
 static int
 _animator(void *data)
 {
    Smart_Data *sd = evas_object_smart_data_get(data);
+   if (!sd) return 0;
+
    double da;
    double spd = ((25.0/ (double)e_config->framerate) /
                 (double) (1 + sd->view->zoom));
@@ -730,18 +749,12 @@ _animator(void *data)
          {
             sd->slide = sd->slide_to;
             sd->sliding = 0;
-            if (sd->view->mode == VIEW_MODE_THUMB &&
-                sd->cur_item &&sd->cur_item->frame)
-              edje_object_signal_emit(sd->cur_item->frame,
-                                      "e,state,selected", "e");
-
 
-            if (sd->clearing)
-              {
-                 _view_clear(EVRY_VIEW(sd->view), 0);
-                 sd->animator = NULL;
-                 return 0;
-              }
+            if ((sd->view->mode == VIEW_MODE_THUMB) &&
+                (sd->cur_item &&
+                 sd->cur_item->frame))
+              edje_object_signal_emit(sd->cur_item->frame,
+                                      "e,state,selected", "e");
          }
        else
          wait++;
@@ -749,9 +762,11 @@ _animator(void *data)
        evas_object_move(sd->view->span, sd->slide, sd->y);
      }
 
-   if (wait) return 1;
+   if (wait)
+     return 1;
+
+   _animator_del(data);
 
-   sd->animator = NULL;
    return 0;
 
 }
@@ -766,7 +781,7 @@ _pan_item_select(Evas_Object *obj, Item *it, int scroll)
 
    if (sd->cur_item)
      {
-       prev = sd->cur_item->y / sd->cur_item->h;
+       prev = sd->cur_item->y / (1 + sd->cur_item->h);
        sd->cur_item->selected = EINA_FALSE;
        edje_object_signal_emit(sd->cur_item->frame,
                                "e,state,unselected", "e");
@@ -802,8 +817,8 @@ _pan_item_select(Evas_Object *obj, Item *it, int scroll)
                             "e,state,selected", "e");
        return;
      }
-   else if (sd->view->mode == VIEW_MODE_LIST ||
-           sd->view->mode == VIEW_MODE_DETAIL)
+   else if (it->h && (sd->view->mode == VIEW_MODE_LIST ||
+                     sd->view->mode == VIEW_MODE_DETAIL))
      {
        int all  = sd->ch / it->h;
        int rows = (it->h && sd->h < sd->ch) ? (sd->h / it->h) : all;
@@ -857,12 +872,12 @@ _pan_item_select(Evas_Object *obj, Item *it, int scroll)
 
        align *= it->h;
      }
-   else
+   else if (sd->view->mode == VIEW_MODE_THUMB)
      {
        if (sd->view->zoom < 2)
          {
             edje_object_signal_emit(sd->cur_item->frame,
-                                    "e,state,selected", "e");
+                                    "e,state,selected", "e");
          }
 
        if ((it->y + it->h) - sd->cy > sd->h)
@@ -889,9 +904,8 @@ _pan_item_select(Evas_Object *obj, Item *it, int scroll)
             e_scrollframe_child_pos_set(sd->view->sframe,
                                         0, sd->scroll_align);
          }
-       if (sd->animator)
-         ecore_animator_del(sd->animator);
-       sd->animator = NULL;
+
+       _animator_del(obj);
      }
    else
      {
@@ -915,9 +929,7 @@ _clear_items(Evas_Object *obj)
    Eina_List *l;
    Item *it;
 
-   if (sd->animator)
-     ecore_animator_del(sd->animator);
-   sd->animator = NULL;
+   _animator_del(obj);
 
    EINA_LIST_FOREACH(sd->items, l, it)
      _item_hide(it);
@@ -941,6 +953,7 @@ _view_clear(Evry_View *view, int slide)
    View *v = (View*) view;
    Smart_Data *sd = evas_object_smart_data_get(v->span);
    Item *it;
+   if (!sd) return;
 
    sd->mouse_x = 0;
    sd->mouse_y = 0;
@@ -962,17 +975,24 @@ _view_clear(Evry_View *view, int slide)
          }
 
        if (sd->animator)
-         ecore_animator_del(sd->animator);
+         {
+            ecore_animator_del(sd->animator);
+            sd->animator = NULL;
+         }
      }
 
-   sd->clearing = EINA_FALSE;
+   if (sd->clearing)
+     return;
 
    _clear_items(v->span);
 
-   EINA_LIST_FREE(sd->items, it)
+   if (sd->items)
      {
-       evry_item_free(it->item);
-       E_FREE(it);
+       EINA_LIST_FREE(sd->items, it)
+         {
+            evry_item_free(it->item);
+            E_FREE(it);
+         }
      }
 
    _e_smart_reconfigure(v->span);
@@ -994,9 +1014,7 @@ _update_frame(Evas_Object *obj)
 {
    Smart_Data *sd = evas_object_smart_data_get(obj);
 
-   if (sd->animator)
-     ecore_animator_del(sd->animator);
-   sd->animator = NULL;
+   _animator_del(obj);
 
    sd->scroll_align = 0;
 
@@ -1032,6 +1050,7 @@ _view_update(Evry_View *view, int slide)
    Evry_Plugin *p = v->state->plugin;
 
    sd->cur_item = NULL;
+   sd->it_down = NULL;
    sd->mouse_act = 0;
    sd->mouse_x = 0;
    sd->mouse_y = 0;
@@ -1494,6 +1513,7 @@ _view_cb_mouse_wheel(void *data, Evas *e, Evas_Object *obj, void *event_info)
 {
    Evas_Event_Mouse_Wheel *ev = event_info;
    Smart_Data *sd = evas_object_smart_data_get(obj);
+   if (sd->clearing) return;
    if (ev->z)
      {
        evas_object_hide(sd->selector);
@@ -1508,39 +1528,49 @@ _view_cb_mouse_move(void *data, Evas *e, Evas_Object *obj, void *event_info)
 {
    Evas_Event_Mouse_Move *ev = event_info;
    Smart_Data *sd = evas_object_smart_data_get(obj);
-   int diff_y;
+   int diff_y, diff_x;
+   if (!sd) return;
+
+   if (sd->clearing)
+     goto end;
 
    if (!sd->mouse_x)
-     return ;
+     goto end;
 
    if (!sd->it_down)
-     return;
+     goto end;
 
-   if ((diff_y = abs(ev->cur.canvas.y - sd->mouse_y) > 30))
+   diff_x = abs(ev->cur.canvas.x - sd->mouse_x);
+   diff_y = abs(ev->cur.canvas.y - sd->mouse_y);
+
+   if (diff_y > (diff_x + 10) * 2)
      goto end;
 
    if ((sd->cur_item != sd->it_down) &&
-       (abs(ev->cur.canvas.x - sd->mouse_x) > 30 - diff_y))
+       (diff_x > 10))
      {
        evry_item_select(sd->view->state, sd->it_down->item);
        _pan_item_select(obj, sd->it_down, 0);
-       return;
      }
 
-   if (ev->cur.canvas.x - sd->mouse_x > 150)
-     {
-       evry_browse_back(NULL);
-       goto end;
-     }
-   else if (sd->mouse_x - ev->cur.canvas.x > 150)
+   if (sd->cur_item == sd->it_down)
      {
-       evry_browse_item(NULL);
-       goto end;
-     }
-   else
-     {
-       return;
-     }
+       if (ev->cur.canvas.x - sd->mouse_x > 150)
+         {
+            sd->it_down = NULL;
+            sd->mouse_x = 0;
+            sd->mouse_y = 0;
+            evry_browse_back(NULL);
+         }
+       else if (sd->mouse_x - ev->cur.canvas.x > 150)
+         {
+            sd->it_down = NULL;
+            sd->mouse_x = 0;
+            sd->mouse_y = 0;
+            evry_browse_item(NULL);
+         }
+   }
+   return;
 
  end:
    sd->it_down = NULL;
@@ -1612,13 +1642,15 @@ _view_create(Evry_View *view, const Evry_State *s, const Evas_Object *swallow)
 static void
 _view_destroy(Evry_View *view)
 {
+   Ecore_Event_Handler *h;
+
    GET_VIEW(v, view);
 
-   Ecore_Event_Handler *h;
+   _view_clear(view, 0);
 
+   evas_object_del(v->span);
    evas_object_del(v->bg);
    evas_object_del(v->sframe);
-   evas_object_del(v->span);
 
    evry_tab_view_free(v->tabs);