[Xfce4-commits] <xfce4-taskmanager:master> Renamed Show "system" processes to "all" and added a GtkTreeModelFilter
Mike Massonnet
noreply at xfce.org
Mon May 10 17:38:01 CEST 2010
Updating branch refs/heads/master
to 99a4a680973c18bdfda62abd48fb379429010375 (commit)
from 1788e3c2201d05c5cef5026756c7e96edb075b74 (commit)
commit 99a4a680973c18bdfda62abd48fb379429010375
Author: Mike Massonnet <mmassonnet at gmail.com>
Date: Mon May 10 11:21:19 2010 +0200
Renamed Show "system" processes to "all" and added a GtkTreeModelFilter
<sigh>
I started to rename "Show sytem processes" to "Show all processes"
and included a GtkTreeModelFilter in between the GtkListStore and
GtkTreeView but nooooo... I had to write private code to sort the
columns. In fact the GtkTreeViewColumn class assumes the model to
be sortable but GtkTreeModelFilter is not, although it provides an
accessor function to the underlying model which is.
And not to mention that understanding GtkTreeViewColumn is a task
on its own! Having the code under the hand is the only exit.
</sigh>
src/process-tree-view.c | 161 ++++++++++++++++++++++++++++++++++++----------
src/process-tree-view.h | 1 +
src/process-window.c | 7 +-
src/settings.c | 6 +-
4 files changed, 133 insertions(+), 42 deletions(-)
diff --git a/src/process-tree-view.c b/src/process-tree-view.c
index 7fb7374..736c12a 100644
--- a/src/process-tree-view.c
+++ b/src/process-tree-view.c
@@ -21,6 +21,21 @@
+/* Static positions of columns in tree view */
+// TODO get the columns reorderable (more tree view hell)
+enum
+{
+ COLUMN_COMMAND = 0,
+ COLUMN_PID,
+ COLUMN_PPID,
+ COLUMN_STATE,
+ COLUMN_VSZ,
+ COLUMN_RSS,
+ COLUMN_UID,
+ COLUMN_CPU,
+ COLUMN_PRIORITY,
+};
+
typedef struct _XtmProcessTreeViewClass XtmProcessTreeViewClass;
struct _XtmProcessTreeViewClass
{
@@ -31,20 +46,21 @@ struct _XtmProcessTreeView
GtkTreeView parent;
/*<private>*/
GtkListStore * model;
+ GtkTreeModel * model_filter;
+ GtkTreeViewColumn * sort_column;
XtmSettings * settings;
};
G_DEFINE_TYPE (XtmProcessTreeView, xtm_process_tree_view, GTK_TYPE_TREE_VIEW)
static gboolean treeview_clicked (XtmProcessTreeView *treeview, GdkEventButton *event);
+static void column_clicked (GtkTreeViewColumn *column, XtmProcessTreeView *treeview);
static void settings_changed (GObject *object, GParamSpec *pspec, XtmProcessTreeView *treeview);
-static int sort_by_string (GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer user_data);
static void
xtm_process_tree_view_class_init (XtmProcessTreeViewClass *klass)
{
- GObjectClass *class = G_OBJECT_CLASS (klass);
xtm_process_tree_view_parent_class = g_type_class_peek_parent (klass);
}
@@ -54,18 +70,20 @@ xtm_process_tree_view_init (XtmProcessTreeView *treeview)
GtkCellRenderer *cell_text, *cell_right_aligned, *cell_cmdline;
GtkTreeViewColumn *column;
gboolean visible;
- guint sort_column_id;
- GtkSortType sort_type;
treeview->settings = xtm_settings_get_default ();
- g_object_get (treeview->settings, "sort-column-id", &sort_column_id, "sort-type", &sort_type, NULL);
g_signal_connect (treeview->settings, "notify", G_CALLBACK (settings_changed), treeview);
+ /* Create tree view model */
treeview->model = gtk_list_store_new (XTM_PTV_N_COLUMNS, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_UINT64,
G_TYPE_STRING, G_TYPE_UINT64, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_FLOAT, G_TYPE_STRING, G_TYPE_INT);
- g_object_set (treeview, "search-column", XTM_PTV_COLUMN_COMMAND, "model", treeview->model, NULL);
+ treeview->model_filter = gtk_tree_model_filter_new (GTK_TREE_MODEL (treeview->model), NULL);
+ //gtk_tree_model_filter_set_visible_func (treeview->model_filter, ...);
+ g_object_set (treeview, "search-column", XTM_PTV_COLUMN_COMMAND, "model", treeview->model_filter, NULL);
+
+ /* Create cell renderer for tree view columns */
cell_text = gtk_cell_renderer_text_new();
cell_right_aligned = gtk_cell_renderer_text_new ();
@@ -74,61 +92,95 @@ xtm_process_tree_view_init (XtmProcessTreeView *treeview)
cell_cmdline = gtk_cell_renderer_text_new ();
g_object_set (cell_cmdline, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
+ /* Create tree view columns */
+#define COLUMN_PROPERTIES "expand", TRUE, "clickable", TRUE, "reorderable", FALSE, "resizable", TRUE, "visible", TRUE
column = gtk_tree_view_column_new_with_attributes (_("Task"), cell_cmdline, "text", XTM_PTV_COLUMN_COMMAND, NULL);
- g_object_set (column, "expand", TRUE, "reorderable", FALSE, "resizable", TRUE, "visible", TRUE, NULL);
- gtk_tree_view_column_set_sort_column_id (GTK_TREE_VIEW_COLUMN (column), XTM_PTV_COLUMN_COMMAND);
+ g_object_set (column, COLUMN_PROPERTIES, NULL);
+ g_object_set_data (G_OBJECT (column), "sort-column-id", GINT_TO_POINTER (XTM_PTV_COLUMN_COMMAND));
+ g_object_set_data (G_OBJECT (column), "column-id", GINT_TO_POINTER (COLUMN_COMMAND));
+ g_signal_connect (column, "clicked", G_CALLBACK (column_clicked), treeview);
gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
+#undef COLUMN_PROPERTIES
+#define COLUMN_PROPERTIES "expand", FALSE, "clickable", TRUE, "reorderable", FALSE, "resizable", TRUE, "visible", visible
g_object_get (treeview->settings, "column-pid", &visible, NULL);
column = gtk_tree_view_column_new_with_attributes (_("PID"), cell_right_aligned, "text", XTM_PTV_COLUMN_PID, NULL);
- g_object_set (column, "expand", FALSE, "reorderable", FALSE, "resizable", TRUE, "visible", visible, NULL);
- gtk_tree_view_column_set_sort_column_id (GTK_TREE_VIEW_COLUMN (column), XTM_PTV_COLUMN_PID);
+ g_object_set (column, COLUMN_PROPERTIES, NULL);
+ g_object_set_data (G_OBJECT (column), "sort-column-id", GINT_TO_POINTER (XTM_PTV_COLUMN_PID));
+ g_object_set_data (G_OBJECT (column), "column-id", GINT_TO_POINTER (COLUMN_PID));
+ g_signal_connect (column, "clicked", G_CALLBACK (column_clicked), treeview);
gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
g_object_get (treeview->settings, "column-ppid", &visible, NULL);
column = gtk_tree_view_column_new_with_attributes (_("PPID"), cell_right_aligned, "text", XTM_PTV_COLUMN_PPID, NULL);
- g_object_set (column, "expand", FALSE, "reorderable", FALSE, "resizable", TRUE, "visible", visible, NULL);
- gtk_tree_view_column_set_sort_column_id (GTK_TREE_VIEW_COLUMN (column), XTM_PTV_COLUMN_PPID);
+ g_object_set (column, COLUMN_PROPERTIES, NULL);
+ g_object_set_data (G_OBJECT (column), "sort-column-id", GINT_TO_POINTER (XTM_PTV_COLUMN_PPID));
+ g_object_set_data (G_OBJECT (column), "column-id", GINT_TO_POINTER (COLUMN_PPID));
+ g_signal_connect (column, "clicked", G_CALLBACK (column_clicked), treeview);
gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
g_object_get (treeview->settings, "column-state", &visible, NULL);
column = gtk_tree_view_column_new_with_attributes (_("State"), cell_text, "text", XTM_PTV_COLUMN_STATE, NULL);
- g_object_set (column, "expand", FALSE, "reorderable", FALSE, "resizable", TRUE, "visible", visible, NULL);
- gtk_tree_view_column_set_sort_column_id (GTK_TREE_VIEW_COLUMN (column), XTM_PTV_COLUMN_STATE);
+ gtk_tree_view_column_set_min_width (GTK_TREE_VIEW_COLUMN (column), 32);
+ g_object_set (column, COLUMN_PROPERTIES, NULL);
+ g_object_set_data (G_OBJECT (column), "sort-column-id", GINT_TO_POINTER (XTM_PTV_COLUMN_STATE));
+ g_object_set_data (G_OBJECT (column), "column-id", GINT_TO_POINTER (COLUMN_STATE));
+ g_signal_connect (column, "clicked", G_CALLBACK (column_clicked), treeview);
gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
g_object_get (treeview->settings, "column-vsz", &visible, NULL);
column = gtk_tree_view_column_new_with_attributes (_("VSZ"), cell_right_aligned, "text", XTM_PTV_COLUMN_VSZ_STR, NULL);
- g_object_set (column, "expand", FALSE, "reorderable", FALSE, "resizable", TRUE, "visible", visible, NULL);
- gtk_tree_view_column_set_sort_column_id (GTK_TREE_VIEW_COLUMN (column), XTM_PTV_COLUMN_VSZ);
+ g_object_set (column, COLUMN_PROPERTIES, NULL);
+ g_object_set_data (G_OBJECT (column), "sort-column-id", GINT_TO_POINTER (XTM_PTV_COLUMN_VSZ));
+ g_object_set_data (G_OBJECT (column), "column-id", GINT_TO_POINTER (COLUMN_VSZ));
+ g_signal_connect (column, "clicked", G_CALLBACK (column_clicked), treeview);
gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
g_object_get (treeview->settings, "column-rss", &visible, NULL);
column = gtk_tree_view_column_new_with_attributes (_("RSS"), cell_right_aligned, "text", XTM_PTV_COLUMN_RSS_STR, NULL);
- g_object_set (column, "expand", FALSE, "reorderable", FALSE, "resizable", TRUE, "visible", visible, NULL);
- gtk_tree_view_column_set_sort_column_id (GTK_TREE_VIEW_COLUMN (column), XTM_PTV_COLUMN_RSS);
+ g_object_set (column, COLUMN_PROPERTIES, NULL);
+ g_object_set_data (G_OBJECT (column), "sort-column-id", GINT_TO_POINTER (XTM_PTV_COLUMN_RSS));
+ g_object_set_data (G_OBJECT (column), "column-id", GINT_TO_POINTER (COLUMN_RSS));
+ g_signal_connect (column, "clicked", G_CALLBACK (column_clicked), treeview);
gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
g_object_get (treeview->settings, "column-uid", &visible, NULL);
column = gtk_tree_view_column_new_with_attributes (_("UID"), cell_text, "text", XTM_PTV_COLUMN_UID, NULL);
- g_object_set (column, "expand", FALSE, "reorderable", FALSE, "resizable", TRUE, "visible", visible, NULL);
- gtk_tree_view_column_set_sort_column_id (GTK_TREE_VIEW_COLUMN (column), XTM_PTV_COLUMN_UID);
+ g_object_set (column, COLUMN_PROPERTIES, NULL);
+ g_object_set_data (G_OBJECT (column), "sort-column-id", GINT_TO_POINTER (XTM_PTV_COLUMN_UID));
+ g_object_set_data (G_OBJECT (column), "column-id", GINT_TO_POINTER (COLUMN_UID));
+ g_signal_connect (column, "clicked", G_CALLBACK (column_clicked), treeview);
gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
g_object_get (treeview->settings, "column-cpu", &visible, NULL);
column = gtk_tree_view_column_new_with_attributes (_("CPU"), cell_right_aligned, "text", XTM_PTV_COLUMN_CPU_STR, NULL);
- g_object_set (column, "expand", FALSE, "reorderable", FALSE, "resizable", TRUE, "visible", visible, NULL);
- gtk_tree_view_column_set_sort_column_id (GTK_TREE_VIEW_COLUMN (column), XTM_PTV_COLUMN_CPU);
+ g_object_set (column, COLUMN_PROPERTIES, NULL);
+ g_object_set_data (G_OBJECT (column), "sort-column-id", GINT_TO_POINTER (XTM_PTV_COLUMN_CPU));
+ g_object_set_data (G_OBJECT (column), "column-id", GINT_TO_POINTER (COLUMN_CPU));
+ g_signal_connect (column, "clicked", G_CALLBACK (column_clicked), treeview);
gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
g_object_get (treeview->settings, "column-priority", &visible, NULL);
/* TRANSLATORS: “Prio.” is short for Priority, it appears in the tree view header. */
column = gtk_tree_view_column_new_with_attributes (_("Prio."), cell_right_aligned, "text", XTM_PTV_COLUMN_PRIORITY, NULL);
- g_object_set (column, "expand", FALSE, "reorderable", FALSE, "resizable", TRUE, "visible", visible, NULL);
- gtk_tree_view_column_set_sort_column_id (GTK_TREE_VIEW_COLUMN (column), XTM_PTV_COLUMN_PRIORITY);
+ g_object_set (column, COLUMN_PROPERTIES, NULL);
+ g_object_set_data (G_OBJECT (column), "sort-column-id", GINT_TO_POINTER (XTM_PTV_COLUMN_PRIORITY));
+ g_object_set_data (G_OBJECT (column), "column-id", GINT_TO_POINTER (COLUMN_PRIORITY));
+ g_signal_connect (column, "clicked", G_CALLBACK (column_clicked), treeview);
gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
- gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (treeview->model), sort_column_id, sort_type);
+ /* Set initial sort column */
+ {
+ guint sort_column_id;
+ GtkSortType sort_type;
+
+ g_object_get (treeview->settings, "sort-column-id", &sort_column_id, "sort-type", &sort_type, NULL);
+ treeview->sort_column = gtk_tree_view_get_column (GTK_TREE_VIEW (treeview), sort_column_id);
+ gtk_tree_view_column_set_sort_indicator (treeview->sort_column, TRUE);
+ gtk_tree_view_column_set_sort_order (treeview->sort_column, sort_type);
+ sort_column_id = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (treeview->sort_column), "sort-column-id"));
+ gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (treeview->model), sort_column_id, sort_type);
+ }
g_signal_connect (treeview, "button-press-event", G_CALLBACK (treeview_clicked), NULL);
}
@@ -264,7 +316,7 @@ treeview_clicked (XtmProcessTreeView *treeview, GdkEventButton *event)
gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (treeview), (gint)event->x, (gint)event->y, &path, NULL, NULL, NULL);
if (path == NULL)
- return;
+ return FALSE;
gtk_tree_model_get_iter (model, &iter, path);
gtk_tree_model_get (model, &iter, XTM_PTV_COLUMN_PID, &pid, -1);
@@ -283,6 +335,38 @@ treeview_clicked (XtmProcessTreeView *treeview, GdkEventButton *event)
}
static void
+column_clicked (GtkTreeViewColumn *column, XtmProcessTreeView *treeview)
+{
+ gint sort_column_id;
+ GtkSortType sort_type;
+
+ gtk_tree_sortable_get_sort_column_id (GTK_TREE_SORTABLE (treeview->model), &sort_column_id, &sort_type);
+#if DEBUG
+ g_debug ("Last sort column %d; sort type: %d", sort_column_id, sort_type);
+#endif
+
+ if (treeview->sort_column != column)
+ {
+ gtk_tree_view_column_set_sort_indicator (treeview->sort_column, FALSE);
+ gtk_tree_view_column_set_sort_indicator (column, TRUE);
+ sort_column_id = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (column), "sort-column-id"));
+ sort_type = GTK_SORT_ASCENDING;
+ }
+ else
+ {
+ sort_type = (sort_type == GTK_SORT_ASCENDING) ? GTK_SORT_DESCENDING : GTK_SORT_ASCENDING;
+ }
+
+#if DEBUG
+ g_debug ("New sort column %d; sort type: %d", sort_column_id, sort_type);
+#endif
+ gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (treeview->model), sort_column_id, sort_type);
+ gtk_tree_view_column_set_sort_order (column, sort_type);
+
+ treeview->sort_column = column;
+}
+
+static void
settings_changed (GObject *object, GParamSpec *pspec, XtmProcessTreeView *treeview)
{
if (g_str_has_prefix (pspec->name, "column-"))
@@ -291,26 +375,26 @@ settings_changed (GObject *object, GParamSpec *pspec, XtmProcessTreeView *treevi
gushort column_id;
if (!g_strcmp0 (pspec->name, "column-uid"))
- column_id = XTM_PTV_COLUMN_UID;
+ column_id = COLUMN_UID;
else if (!g_strcmp0 (pspec->name, "column-pid"))
- column_id = XTM_PTV_COLUMN_PID;
+ column_id = COLUMN_PID;
else if (!g_strcmp0 (pspec->name, "column-ppid"))
- column_id = XTM_PTV_COLUMN_PPID;
+ column_id = COLUMN_PPID;
else if (!g_strcmp0 (pspec->name, "column-state"))
- column_id = XTM_PTV_COLUMN_STATE;
+ column_id = COLUMN_STATE;
else if (!g_strcmp0 (pspec->name, "column-vsz"))
- column_id = XTM_PTV_COLUMN_VSZ_STR;
+ column_id = COLUMN_VSZ;
else if (!g_strcmp0 (pspec->name, "column-rss"))
- column_id = XTM_PTV_COLUMN_RSS_STR;
+ column_id = COLUMN_RSS;
else if (!g_strcmp0 (pspec->name, "column-cpu"))
- column_id = XTM_PTV_COLUMN_CPU_STR;
+ column_id = COLUMN_CPU;
else if (!g_strcmp0 (pspec->name, "column-priority"))
- column_id = XTM_PTV_COLUMN_PRIORITY;
+ column_id = COLUMN_PRIORITY;
g_object_get (object, pspec->name, &visible, NULL);
gtk_tree_view_column_set_visible (gtk_tree_view_get_column (GTK_TREE_VIEW (treeview), column_id), visible);
}
- else if (!g_strcmp0 (pspec->name, "show-system-processes"))
+ else if (!g_strcmp0 (pspec->name, "show-all-processes"))
{
gboolean visible;
g_object_get (object, pspec->name, &visible, NULL);
@@ -326,3 +410,10 @@ xtm_process_tree_view_new ()
return g_object_new (XTM_TYPE_PROCESS_TREE_VIEW, NULL);
}
+void
+xtm_process_tree_view_get_sort_column_id (XtmProcessTreeView *treeview, gint *sort_column_id, GtkSortType *sort_type)
+{
+ *sort_column_id = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (treeview->sort_column), "column-id"));
+ *sort_type = gtk_tree_view_column_get_sort_order (treeview->sort_column);
+}
+
diff --git a/src/process-tree-view.h b/src/process-tree-view.h
index 481c552..2619142 100644
--- a/src/process-tree-view.h
+++ b/src/process-tree-view.h
@@ -44,5 +44,6 @@ typedef struct _XtmProcessTreeView XtmProcessTreeView;
GType xtm_process_tree_view_get_type (void);
GtkWidget * xtm_process_tree_view_new ();
+void xtm_process_tree_view_get_sort_column_id (XtmProcessTreeView *treeview, gint *sort_column_id, GtkSortType *sort_type);
#endif /* !PROCESS_TREE_VIEW_H */
diff --git a/src/process-window.c b/src/process-window.c
index 38aa419..307a135 100644
--- a/src/process-window.c
+++ b/src/process-window.c
@@ -137,8 +137,7 @@ xtm_process_window_finalize (GObject *object)
GtkSortType sort_type;
gtk_window_get_size (GTK_WINDOW (priv->window), &width, &height);
- gtk_tree_sortable_get_sort_column_id (GTK_TREE_SORTABLE (gtk_tree_view_get_model (GTK_TREE_VIEW (priv->treeview))),
- &sort_column_id, &sort_type);
+ xtm_process_tree_view_get_sort_column_id (XTM_PROCESS_TREE_VIEW (priv->treeview), &sort_column_id, &sort_type);
g_object_set (priv->settings, "window-width", width, "window-height", height,
"sort-column-id", sort_column_id, "sort-type", sort_type, NULL);
@@ -269,7 +268,7 @@ show_menu_preferences (XtmProcessWindow *window)
}
menu = gtk_menu_new ();
- menu_preferences_append_item (GTK_MENU (menu), _("Show system processes"), "show-system-processes", window->priv->settings);
+ menu_preferences_append_item (GTK_MENU (menu), _("Show all processes"), "show-all-processes", window->priv->settings);
mi = gtk_separator_menu_item_new ();
gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
@@ -366,7 +365,7 @@ xtm_process_window_get_model (XtmProcessWindow *window)
{
g_return_val_if_fail (G_LIKELY (XTM_IS_PROCESS_WINDOW (window)), NULL);
g_return_val_if_fail (G_LIKELY (GTK_IS_TREE_VIEW (window->priv->treeview)), NULL);
- return gtk_tree_view_get_model (GTK_TREE_VIEW (window->priv->treeview));
+ return gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (gtk_tree_view_get_model (GTK_TREE_VIEW (window->priv->treeview))));
}
void
diff --git a/src/settings.c b/src/settings.c
index 8591443..0a0aa8f 100644
--- a/src/settings.c
+++ b/src/settings.c
@@ -23,7 +23,7 @@
enum
{
- PROP_SHOW_SYSTEM_PROCESSES = 1,
+ PROP_SHOW_ALL_PROCESSES = 1,
PROP_COLUMN_UID,
PROP_COLUMN_PID,
PROP_COLUMN_PPID,
@@ -67,8 +67,8 @@ xtm_settings_class_init (XtmSettingsClass *klass)
xtm_settings_parent_class = g_type_class_peek_parent (klass);
class->get_property = xtm_settings_get_property;
class->set_property = xtm_settings_set_property;
- g_object_class_install_property (class, PROP_SHOW_SYSTEM_PROCESSES,
- g_param_spec_boolean ("show-system-processes", "ShowSystemProcesses", "Show system processes", FALSE, G_PARAM_READWRITE));
+ g_object_class_install_property (class, PROP_SHOW_ALL_PROCESSES,
+ g_param_spec_boolean ("show-all-processes", "ShowAllProcesses", "Show all processes", FALSE, G_PARAM_READWRITE));
g_object_class_install_property (class, PROP_COLUMN_UID,
g_param_spec_boolean ("column-uid", "ColumnUID", "Show column UID", FALSE, G_PARAM_READWRITE));
g_object_class_install_property (class, PROP_COLUMN_PID,
More information about the Xfce4-commits
mailing list