commit 3691ab555c811ef87fb9f902b76089aa6f7b514e
Author: phantomjinx <p.g.richard...@phantomjinx.co.uk>
Date:   Tue Oct 23 21:35:22 2012 +0100

    Reduce the number of selection changed callbacks
    
    * When a playlist is selected, the sorttabs are repopulated and their
      selections reselected. This causes the displayed tracks to be reset,
      producing more signals and firing more callbacks.
    
    * Reduces the number of callbacks fired by only initiating the idle
      selection callback if one has not already been scheduled.

 plugins/sorttab_display/normal_sorttab_page.c |   33 ++++++++++++++++++++++++-
 1 files changed, 32 insertions(+), 1 deletions(-)
---
diff --git a/plugins/sorttab_display/normal_sorttab_page.c 
b/plugins/sorttab_display/normal_sorttab_page.c
index 9dfb338..ea64cf7 100644
--- a/plugins/sorttab_display/normal_sorttab_page.c
+++ b/plugins/sorttab_display/normal_sorttab_page.c
@@ -41,6 +41,8 @@
 #include "normal_sorttab_page.h"
 #include "sorttab_display_context_menu.h"
 
+#define NO_IDLE_SELECTION_CALLBACK -1
+
 G_DEFINE_TYPE( NormalSortTabPage, normal_sort_tab_page, GTK_TYPE_TREE_VIEW);
 
 #define NORMAL_SORT_TAB_PAGE_GET_PRIVATE(obj) \
@@ -60,6 +62,12 @@ struct _NormalSortTabPagePrivate {
     /* Handler id of the selection changed callback */
     gulong selection_changed_id;
 
+    /*
+     * Handler id of the idle callback when the selection
+     * changed callback is executed
+     */
+    guint selection_changed_idle_id;
+
     /* name of entry last selected */
     GList *last_selection;
 
@@ -547,6 +555,8 @@ static gboolean _st_selection_changed_cb(gpointer data) {
             time.tv_sec % 3600, time.tv_usec);
 #endif
 
+    priv->selection_changed_idle_id = NO_IDLE_SELECTION_CALLBACK;
+
     return FALSE;
 }
 
@@ -558,10 +568,28 @@ static gboolean _st_selection_changed_cb(gpointer data) {
  * called.
  */
 static void _st_selection_changed(GtkTreeSelection *selection, gpointer 
user_data) {
+
+    NormalSortTabPage *self = NORMAL_SORT_TAB_PAGE(user_data);
+    gulong idleId = NO_IDLE_SELECTION_CALLBACK;
+
+    if (self) {
+        NormalSortTabPagePrivate *priv = 
NORMAL_SORT_TAB_PAGE_GET_PRIVATE(self);
+        idleId = priv->selection_changed_idle_id;
+    }
+
 #if DEBUG_CB_INIT
     printf("st_s_c enter (inst: %p)\n", (gint)user_data);
 #endif
-    gdk_threads_add_idle_full(G_PRIORITY_DEFAULT_IDLE, 
_st_selection_changed_cb, user_data, NULL);
+
+    if (idleId == NO_IDLE_SELECTION_CALLBACK) {
+        // Only execute an idle function if one has not already been scheduled
+        idleId = gdk_threads_add_idle_full(G_PRIORITY_DEFAULT_IDLE, 
_st_selection_changed_cb, user_data, NULL);
+        if (self) {
+            NormalSortTabPagePrivate *priv = 
NORMAL_SORT_TAB_PAGE_GET_PRIVATE(self);
+            priv->selection_changed_idle_id = idleId;
+        }
+    }
+
 #if DEBUG_CB_INIT
     printf("st_s_c exit (inst: %p)\n", (gint)user_data);
 #endif
@@ -883,6 +911,9 @@ GtkWidget *normal_sort_tab_page_new(SortTabWidget 
*st_widget_parent, ST_CAT_item
     priv->selection_changed_id = g_signal_connect (G_OBJECT (selection), 
"changed",
                 G_CALLBACK (_st_selection_changed),
                 nst);
+
+    priv->selection_changed_idle_id = NO_IDLE_SELECTION_CALLBACK;
+
     /*
      * set string compare function according to
      * whether the ignore field is set or not

------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_sfd2d_oct
_______________________________________________
gtkpod-cvs2 mailing list
gtkpod-cvs2@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/gtkpod-cvs2

Reply via email to