raster pushed a commit to branch master.

http://git.enlightenment.org/apps/rage.git/commit/?id=11a55d0dea41714e5e922e52170e7a97e23b747c

commit 11a55d0dea41714e5e922e52170e7a97e23b747c
Author: Carsten Haitzler (Rasterman) <[email protected]>
Date:   Wed Feb 5 13:48:08 2020 +0000

    browser - limit number of browser file objects creates or destroyed
    
    this limits how many per second we create or destroy spreading the
    cost over time to keep smoothness at the cost of perhaps some delay
    until you see updated content as you scroll.
---
 src/bin/browser.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 52 insertions(+), 5 deletions(-)

diff --git a/src/bin/browser.c b/src/bin/browser.c
index 65e1ec4..905be88 100644
--- a/src/bin/browser.c
+++ b/src/bin/browser.c
@@ -60,7 +60,13 @@ static Eina_List *entries = NULL;
 static Ecore_Timer *_browser_hide_focus_restore_timer = NULL;
 static Eina_Semaphore step_sema;
 static Ecore_Timer *initial_update_timer = NULL;
+static Ecore_Timer *pop_eval_redo = NULL;
 
+static const int max_created = 8;
+static const int max_destroyed = 16;
+
+static void _pop_eval_delay(Evas_Object *win, int created, int destroyed);
+static void _entry_files_pop_eval(Evas_Object *win, Entry *entry);
 static void _sel_go(Evas_Object *win EINA_UNUSED, Entry *base_entry, int x, 
int y);
 
 static void
@@ -298,21 +304,57 @@ _cb_file_selected(void *data, Evas_Object *obj, const 
char *sig EINA_UNUSED, con
 static void
 _entry_files_pop_clear(Entry *entry)
 {
-   int i, k;
+   Evas_Object *win = evas_object_data_get(entry->table, "win");
+   int i, k, destroyed = 0;
 
    // if we had any content at all before - nuke it all
    if ((entry->sels) && (entry->file_obj))
      {
-        entry->sels = eina_list_free(entry->sels);
         k = entry->cols * entry->rows;
         for (i = 0; i < k; i++)
           {
              if (entry->file_obj[i])
                {
+                  entry->sels = eina_list_remove(entry->sels, 
entry->file_obj[i]);
                   evas_object_del(entry->file_obj[i]);
                   entry->file_obj[i] = NULL;
+                  destroyed++;
+                  if (destroyed >= max_destroyed) break;
                }
           }
+        _pop_eval_delay(win, 0, destroyed);
+     }
+}
+
+static Eina_Bool
+_cb_pop_eval_redo(void *data)
+{
+   Evas_Object *win = data;
+   Inf *inf = evas_object_data_get(win, "inf");
+   Eina_List *l;
+   Entry *entry;
+   pop_eval_redo = NULL;
+   if (!inf) return EINA_FALSE;
+   if (!bx) return EINA_FALSE;
+   EINA_LIST_FOREACH(entries, l, entry)
+     {
+        if (pop_eval_redo) break;
+        _entry_files_pop_eval(win, entry);
+     }
+   return EINA_FALSE;
+}
+
+static void
+_pop_eval_delay(Evas_Object *win, int created, int destroyed)
+{
+   if ((created >= max_created) || (destroyed >= max_destroyed))
+     {
+        if (pop_eval_redo)
+          {
+             ecore_timer_del(pop_eval_redo);
+             pop_eval_redo = NULL;
+          }
+        pop_eval_redo = ecore_timer_add(0.01, _cb_pop_eval_redo, win);
      }
 }
 
@@ -323,9 +365,10 @@ _entry_files_pop_eval(Evas_Object *win, Entry *entry)
    Eina_List *l;
    Evas_Object **obj;
    Evas_Coord win_w, win_h, ent_x, ent_y, ent_w, ent_h;
-   int i = 0, j = 0;
+   int i = 0, j = 0, created = 0, destroyed = 0;
    Eina_Rectangle win_rect, file_rect;
 
+   if (pop_eval_redo) return;
    evas_object_geometry_get(entry->table, &ent_x, &ent_y, &ent_w, &ent_h);
    evas_object_geometry_get(win, NULL, NULL, &win_w, &win_h);
    win_rect.x = 0;
@@ -350,6 +393,7 @@ _entry_files_pop_eval(Evas_Object *win, Entry *entry)
    // walk files to find which intersect the window
    EINA_LIST_FOREACH(entry->files, l, file)
      {
+        if ((created >= max_created) && (destroyed >= max_destroyed)) break;
         file_rect.x = ent_x + ((i * ent_w) / entry->cols);
         file_rect.y = ent_y + ((j * ent_h) / entry->rows);
         file_rect.w = (ent_w / entry->cols);
@@ -361,7 +405,7 @@ _entry_files_pop_eval(Evas_Object *win, Entry *entry)
         obj = &(entry->file_obj[(j * entry->cols) + i]);
         if (eina_rectangles_intersect(&win_rect, &file_rect))
           {
-             if (!(*obj))
+             if ((!(*obj)) && (created < max_created))
                {
                   Evas_Object *o, *base;
                   char buf[PATH_MAX], *p;
@@ -430,15 +474,17 @@ _entry_files_pop_eval(Evas_Object *win, Entry *entry)
                                               "rage");
                        evas_object_raise(base);
                     }
+                  created++;
                }
           }
         else
           {
-             if (*obj)
+             if ((*obj) && (destroyed < max_destroyed))
                {
                   entry->sels = eina_list_remove(entry->sels, *obj);
                   evas_object_del(*obj);
                   *obj = NULL;
+                  destroyed++;
                }
           }
         i++;
@@ -448,6 +494,7 @@ _entry_files_pop_eval(Evas_Object *win, Entry *entry)
              j++;
           }
      }
+   _pop_eval_delay(win, created, destroyed);
 }
 
 static void

-- 


Reply via email to