From 9a6cdd2ff3ac57746a56dbe19439838e7761210f Mon Sep 17 00:00:00 2001 From: Mike Massonnet Date: Mon, 10 May 2010 17:03:27 +0200 Subject: [PATCH] Filter tree view with show-all-processes Switched the get_hostname() get_owner_uid() public in task-manager.c, the owner uid is needed in the tree view class in order to filter out user processes from others. --- src/process-tree-view.c | 32 +++++++++++++++++++++++++++----- src/process-tree-view.h | 1 + src/task-manager.c | 9 ++++----- src/task-manager.h | 7 +++++++ 4 files changed, 39 insertions(+), 10 deletions(-) diff --git a/src/process-tree-view.c b/src/process-tree-view.c index 736c12a..bb5a258 100644 --- a/src/process-tree-view.c +++ b/src/process-tree-view.c @@ -49,11 +49,14 @@ struct _XtmProcessTreeView GtkTreeModel * model_filter; GtkTreeViewColumn * sort_column; XtmSettings * settings; + guint owner_uid; + gboolean show_all_processes_cached; }; 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 gboolean visible_func (GtkTreeModel *model, GtkTreeIter *iter, XtmProcessTreeView *treeview); static void settings_changed (GObject *object, GParamSpec *pspec, XtmProcessTreeView *treeview); @@ -74,12 +77,19 @@ xtm_process_tree_view_init (XtmProcessTreeView *treeview) treeview->settings = xtm_settings_get_default (); g_signal_connect (treeview->settings, "notify", G_CALLBACK (settings_changed), treeview); + { + gchar *uid_name; + get_owner_uid (&treeview->owner_uid, &uid_name); + g_object_get (treeview->settings, "show-all-processes", &treeview->show_all_processes_cached, NULL); + g_debug ("wtf all processes: %d", treeview->show_all_processes_cached); + } + /* 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_TYPE_STRING, G_TYPE_UINT64, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_FLOAT, G_TYPE_STRING, G_TYPE_INT); treeview->model_filter = gtk_tree_model_filter_new (GTK_TREE_MODEL (treeview->model), NULL); - //gtk_tree_model_filter_set_visible_func (treeview->model_filter, ...); + gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (treeview->model_filter), (GtkTreeModelFilterVisibleFunc)visible_func, treeview, NULL); g_object_set (treeview, "search-column", XTM_PTV_COLUMN_COMMAND, "model", treeview->model_filter, NULL); @@ -145,7 +155,7 @@ xtm_process_tree_view_init (XtmProcessTreeView *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); + column = gtk_tree_view_column_new_with_attributes (_("UID"), cell_text, "text", XTM_PTV_COLUMN_UID_STR, NULL); 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)); @@ -366,6 +376,18 @@ column_clicked (GtkTreeViewColumn *column, XtmProcessTreeView *treeview) treeview->sort_column = column; } +static gboolean +visible_func (GtkTreeModel *model, GtkTreeIter *iter, XtmProcessTreeView *treeview) +{ + guint uid; + + if (treeview->show_all_processes_cached) + return TRUE; + + gtk_tree_model_get (GTK_TREE_MODEL (treeview->model), iter, XTM_PTV_COLUMN_UID, &uid, -1); + return (treeview->owner_uid == uid) ? TRUE : FALSE; +} + static void settings_changed (GObject *object, GParamSpec *pspec, XtmProcessTreeView *treeview) { @@ -396,9 +418,9 @@ settings_changed (GObject *object, GParamSpec *pspec, XtmProcessTreeView *treevi } else if (!g_strcmp0 (pspec->name, "show-all-processes")) { - gboolean visible; - g_object_get (object, pspec->name, &visible, NULL); + g_object_get (object, pspec->name, &treeview->show_all_processes_cached, NULL); // TODO show/hide system processes from treeview + gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (treeview->model_filter)); } } diff --git a/src/process-tree-view.h b/src/process-tree-view.h index 2619142..c357766 100644 --- a/src/process-tree-view.h +++ b/src/process-tree-view.h @@ -27,6 +27,7 @@ enum XTM_PTV_COLUMN_RSS, XTM_PTV_COLUMN_RSS_STR, XTM_PTV_COLUMN_UID, + XTM_PTV_COLUMN_UID_STR, XTM_PTV_COLUMN_CPU, XTM_PTV_COLUMN_CPU_STR, XTM_PTV_COLUMN_PRIORITY, diff --git a/src/task-manager.c b/src/task-manager.c index b481c83..4620c12 100644 --- a/src/task-manager.c +++ b/src/task-manager.c @@ -52,8 +52,6 @@ G_DEFINE_TYPE (XtmTaskManager, xtm_task_manager, G_TYPE_OBJECT) static void xtm_task_manager_finalize (GObject *object); -static void get_owner_uid (guint *owner_uid, gchar **owner_uid_name); -static gchar * get_hostname (); static void model_add_task (GtkTreeModel *model, Task *task); static void model_update_tree_iter (GtkTreeModel *model, GtkTreeIter *iter, Task *task); static void model_update_task (GtkTreeModel *model, Task *task); @@ -94,7 +92,7 @@ _xtm_task_manager_set_model (XtmTaskManager *manager, GtkTreeModel *model) manager->model = model; } -static void +void get_owner_uid (guint *owner_uid, gchar **owner_uid_name) { uid_t uid; @@ -110,7 +108,7 @@ get_owner_uid (guint *owner_uid, gchar **owner_uid_name) *owner_uid_name = username; } -static gchar * +gchar * get_hostname () { #ifndef HOST_NAME_MAX @@ -131,7 +129,8 @@ model_add_task (GtkTreeModel *model, Task *task) XTM_PTV_COLUMN_COMMAND, task->cmdline, XTM_PTV_COLUMN_PID, task->pid, XTM_PTV_COLUMN_STATE, task->state, - XTM_PTV_COLUMN_UID, task->uid_name, + XTM_PTV_COLUMN_UID, task->uid, + XTM_PTV_COLUMN_UID_STR, task->uid_name, -1); model_update_tree_iter (model, &iter, task); } diff --git a/src/task-manager.h b/src/task-manager.h index b82eaea..cfefe64 100644 --- a/src/task-manager.h +++ b/src/task-manager.h @@ -91,4 +91,11 @@ void xtm_task_manager_get_system_info (XtmTaskManager *manager, guint *num_pr const GArray * xtm_task_manager_get_task_list (XtmTaskManager *manager); void xtm_task_manager_update_model (XtmTaskManager *manager); +/** + * Helper functions. + */ + +void get_owner_uid (guint *owner_uid, gchar **owner_uid_name); +gchar * get_hostname (); + #endif /* !TASK_MANAGER_H */