Changeset 1766

Show
Ignore:
Timestamp:
03/30/07 17:13:03
Author:
pvanhoof
Message:

Performance and ui redrawing improvement

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/libtinymailui-gtk/tny-gtk-header-list-model.c

    r1765 r1766  
    438438} notify_views_data_t; 
    439439 
     440 
     441static void 
     442notify_views_add_destroy (gpointer data) 
     443{ 
     444        TnyGtkHeaderListModel *me = (TnyGtkHeaderListModel*) data; 
     445 
     446        g_mutex_lock (me->ra_lock); 
     447        me->recent_updated = 0; 
     448        me->recent_added = 0; 
     449        me->updating_views = FALSE; 
     450        g_mutex_unlock (me->ra_lock); 
     451        g_object_unref (me); 
     452 
     453} 
     454 
    440455static gboolean 
    441456notify_views_add (gpointer data) 
    442457{ 
    443458        TnyGtkHeaderListModel *me = (TnyGtkHeaderListModel*) data; 
    444         gint i, added; GtkTreePath *path; 
     459        gint updated, going_to_update, i, added;  
     460        GtkTreePath *path; 
     461        gboolean needmore = FALSE; 
    445462 
    446463        g_mutex_lock (me->ra_lock); 
    447         added = me->recent_added; 
    448         me->recent_added = 0; 
    449         me->going_to_update_views = FALSE; 
     464        if (me->recent_added - me->recent_updated > 300) { 
     465                going_to_update = me->recent_updated + 300; 
     466                needmore = TRUE; 
     467        } else 
     468                going_to_update = me->recent_added; 
     469        updated = me->recent_updated; 
    450470        g_mutex_unlock (me->ra_lock); 
    451471 
     
    454474 
    455475        gdk_threads_enter(); 
    456         for (i = 0; i< added; i++) 
     476        for (i = updated; i < going_to_update; i++) 
    457477        { 
    458478                GtkTreeIter iter; 
    459479                iter.stamp = me->stamp; 
    460                 iter.user_data = (gpointer) (me->items->len - 1); 
    461                 gtk_tree_model_row_inserted (GTK_TREE_MODEL (me), path, &iter); 
    462         } 
     480                iter.user_data = (gpointer) i; 
     481                gtk_tree_model_row_inserted ((GtkTreeModel *)me, path, &iter); 
     482        } 
     483        me->recent_updated = i; 
    463484        gdk_threads_leave(); 
    464485 
    465486        gtk_tree_path_free (path); 
    466         g_object_unref (G_OBJECT (me)); 
    467  
    468         return FALSE; 
     487 
     488        return needmore; 
    469489} 
    470490 
     
    483503         * iterator_lock for locking this out, by the way. */ 
    484504 
    485         g_object_ref (G_OBJECT (item)); 
     505        g_object_ref (item); 
    486506        g_ptr_array_add (me->items, item); 
    487507 
     
    489509         * of the view is, however, quite slow. So we delay it per 100 or so. */ 
    490510 
    491         /* TNY TODO: this delay is not time driven. This means that on slow 
    492          * connections (fewer prepends happen per time), the updating will be 
    493          * slower. This is unwanted: updating should be time, not connection  
    494          * speed, based. Therefore: alter this to use time in stead of counts. */ 
    495  
    496511        g_mutex_lock (me->ra_lock); 
    497512        me->recent_added++; 
    498         if (!me->going_to_update_views) 
     513        if (!me->updating_views) 
    499514        { 
    500                 g_object_ref (G_OBJECT (me)); 
    501                 me->going_to_update_views = TRUE; 
    502                 g_timeout_add (2000, notify_views_add, me); 
     515                g_object_ref (me); 
     516                me->updating_views = TRUE; 
     517                me->recent_updated = 0; 
     518                g_timeout_add_full (500, G_PRIORITY_DEFAULT_IDLE,  
     519                        notify_views_add, me, notify_views_add_destroy); 
    503520        } 
    504521        g_mutex_unlock (me->ra_lock); 
     
    709726        g_static_rec_mutex_init (self->iterator_lock); 
    710727        self->items = g_ptr_array_sized_new (1000); 
    711         self->going_to_update_views = FALSE; 
     728        self->updating_views = FALSE; 
    712729        self->ra_lock = g_mutex_new (); 
    713730        self->recent_added = 0; 
     731        self->recent_updated = 0; 
    714732 
    715733        return; 
  • trunk/libtinymailui-gtk/tny-gtk-header-list-model.h

    r1763 r1766  
    6666        GStaticRecMutex *iterator_lock; 
    6767        TnyFolder *folder; 
    68         gint stamp, recent_added
    69         gboolean going_to_update_views; 
     68        gint stamp, recent_added, recent_updated
     69        gboolean updating_views; 
    7070        GMutex *ra_lock; 
    7171