[gnome-system-monitor] Add custom sort method for numerical columns with descending sort first.



commit b439f813ceaf6ce6e82cd490c734c67aeb1f2028
Author: Robert Roth <robert roth off gmail com>
Date:   Mon Jan 9 00:43:03 2012 +0200

    Add custom sort method for numerical columns with descending sort first.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=557122
    https://bugzilla.gnome.org/show_bug.cgi?id=507108

 src/proctable.cpp |   24 ++++++++++++++++++++++--
 src/util.cpp      |   43 +++++++++++++++++++++++++++++++++++++++++--
 src/util.h        |    2 ++
 3 files changed, 65 insertions(+), 4 deletions(-)
---
diff --git a/src/proctable.cpp b/src/proctable.cpp
index ebe5573..4f7cef8 100644
--- a/src/proctable.cpp
+++ b/src/proctable.cpp
@@ -346,7 +346,6 @@ proctable_new (ProcData * const procdata)
                                                         GUINT_TO_POINTER(i),
                                                         NULL);
                 break;
-
             case COL_VMSIZE:
             case COL_MEMRES:
             case COL_MEMSHARED:
@@ -383,12 +382,33 @@ proctable_new (ProcData * const procdata)
                                                         &procman::priority_cell_data_func,
                                                         GUINT_TO_POINTER(COL_NICE),
                                                         NULL);
+                break;
+            default:
+                gtk_tree_view_column_set_attributes(col, cell, "text", i, NULL);
+                break;
+        }
+
+        // sorting
+        switch (i) {
+            case COL_MEMXSERVER:
+            case COL_VMSIZE:
+            case COL_MEMRES:
+            case COL_MEMSHARED:
+            case COL_MEM:
+            case COL_MEMWRITABLE:
+            case COL_CPU:
+            case COL_CPU_TIME:
+            case COL_START_TIME:
+                gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(model), i,
+                                                procman::number_compare_func, GUINT_TO_POINTER(i),
+                                                NULL);
+                break;
+            case COL_PRIORITY:
                 gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(model), i,
                                                 procman::priority_compare_func,
                                                 GUINT_TO_POINTER(COL_NICE), NULL);
                 break;
             default:
-                gtk_tree_view_column_set_attributes(col, cell, "text", i, NULL);
                 break;
         }
 
diff --git a/src/util.cpp b/src/util.cpp
index 18fd8b5..68b9aba 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -305,6 +305,31 @@ static double get_relative_time(void)
     return (tv.tv_sec - start_time) + 1e-6 * tv.tv_usec;
 }
 
+static
+guint64 get_size_from_column(GtkTreeModel* model, GtkTreeIter* first,
+                             const guint index)
+{
+    GValue value = { 0 };
+    gtk_tree_model_get_value(model, first, index, &value);
+
+    guint64 size;
+    switch (G_VALUE_TYPE(&value)) {
+        case G_TYPE_UINT:
+            size = g_value_get_uint(&value);
+            break;
+        case G_TYPE_ULONG:
+            size = g_value_get_ulong(&value);
+            break;
+        case G_TYPE_UINT64:
+            size = g_value_get_uint64(&value);
+            break;
+        default:
+            g_assert_not_reached();
+    }
+
+    g_value_unset(&value);
+    return size;
+}
 
 void
 procman_debug_real(const char *file, int line, const char *func,
@@ -519,6 +544,22 @@ namespace procman
         return result;
     }
 
+    gint number_compare_func(GtkTreeModel* model, GtkTreeIter* first,
+                            GtkTreeIter* second, gpointer user_data)
+    {
+        const guint index = GPOINTER_TO_UINT(user_data);
+
+        guint64 size1, size2;
+        size1 = get_size_from_column(model, first, index);
+        size2 = get_size_from_column(model, second, index);
+
+        if ( size2 > size1 )
+            return 1;
+        else if ( size2 < size1 )
+            return -1;
+        return 0;
+    }
+
     template<>
     void tree_store_update<const char>(GtkTreeModel* model, GtkTreeIter* iter, int column, const char* new_value)
     {
@@ -533,8 +574,6 @@ namespace procman
     }
 
 
-
-
     std::string format_rate(guint64 rate, guint64 max_rate, bool want_bits)
     {
         char* bytes = procman::format_size(rate, max_rate, want_bits);
diff --git a/src/util.h b/src/util.h
index 3b0d76e..04c4440 100644
--- a/src/util.h
+++ b/src/util.h
@@ -102,6 +102,8 @@ namespace procman
                                gpointer user_data);
     gint priority_compare_func(GtkTreeModel* model, GtkTreeIter* first,
                             GtkTreeIter* second, gpointer user_data);
+    gint number_compare_func(GtkTreeModel* model, GtkTreeIter* first,
+                            GtkTreeIter* second, gpointer user_data);
 
 
     template<typename T>



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]