From ad2c6f02ed68c9f1aa1cc57afaf2ce79a1c224a4 Mon Sep 17 00:00:00 2001 From: Matias De lellis Date: Thu, 14 Feb 2013 19:04:59 -0300 Subject: [PATCH] Add filter entry to search especific command lines. --- src/process-tree-view.c | 42 ++++++++++++++++++++++++++++++++++++------ src/process-tree-view.h | 1 + src/process-window.c | 32 ++++++++++++++++++++++++++++++++ src/process-window.ui | 44 +++++++++++++++++++++++++++++++++++++++----- 4 files changed, 108 insertions(+), 11 deletions(-) diff --git a/src/process-tree-view.c b/src/process-tree-view.c index 37ec367..32bfd86 100644 --- a/src/process-tree-view.c +++ b/src/process-tree-view.c @@ -48,6 +48,7 @@ struct _XtmProcessTreeView /**/ GtkListStore * model; GtkTreeModel * model_filter; + gchar * cmd_filter; GtkTreeViewColumn * sort_column; gushort columns_positions[N_COLUMNS]; XtmSettings * settings; @@ -69,8 +70,6 @@ static gboolean visible_func (GtkTreeModel *model, GtkTreeIter *iter, XtmPr static gboolean search_func (GtkTreeModel *model, gint column, const gchar *key, GtkTreeIter *iter, gpointer user_data); static void settings_changed (GObject *object, GParamSpec *pspec, XtmProcessTreeView *treeview); - - static void xtm_process_tree_view_class_init (XtmProcessTreeViewClass *klass) { @@ -110,6 +109,8 @@ xtm_process_tree_view_init (XtmProcessTreeView *treeview) g_object_set (treeview, "search-column", XTM_PTV_COLUMN_COMMAND, "model", treeview->model_filter, NULL); + treeview->cmd_filter = NULL; + /* Create cell renderer for tree view columns */ cell_text = gtk_cell_renderer_text_new(); @@ -590,16 +591,45 @@ column_clicked (GtkTreeViewColumn *column, XtmProcessTreeView *treeview) treeview->sort_column = column; } +void +xtm_process_tree_view_set_filter(XtmProcessTreeView *treeview, const gchar *cmd_filter) +{ + g_free(treeview->cmd_filter); + treeview->cmd_filter = g_strdup(cmd_filter); + + gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (treeview->model_filter)); +} + static gboolean visible_func (GtkTreeModel *model, GtkTreeIter *iter, XtmProcessTreeView *treeview) { + gchar *cmdline, *cmdline_lower, *key_lower, *p = NULL; + gboolean mach_filter = TRUE, match_uid = TRUE; guint uid; - if (treeview->show_all_processes_cached) - return TRUE; + if(treeview->cmd_filter) { + gtk_tree_model_get (GTK_TREE_MODEL (model), iter, XTM_PTV_COLUMN_COMMAND, &cmdline, -1); + if(cmdline) { + cmdline_lower = g_ascii_strdown (cmdline, -1); + key_lower = g_ascii_strdown (treeview->cmd_filter, -1); + + p = g_strrstr (cmdline_lower, key_lower); + + g_free (key_lower); + g_free (cmdline_lower); + g_free (cmdline); + } + + if(!p) + mach_filter = FALSE; + } + if (!treeview->show_all_processes_cached) { + gtk_tree_model_get (GTK_TREE_MODEL (treeview->model), iter, XTM_PTV_COLUMN_UID, &uid, -1); + if (treeview->owner_uid != uid) + match_uid = FALSE; + } - gtk_tree_model_get (GTK_TREE_MODEL (treeview->model), iter, XTM_PTV_COLUMN_UID, &uid, -1); - return (treeview->owner_uid == uid) ? TRUE : FALSE; + return (mach_filter && match_uid); } static gboolean diff --git a/src/process-tree-view.h b/src/process-tree-view.h index 3082806..71002c7 100644 --- a/src/process-tree-view.h +++ b/src/process-tree-view.h @@ -52,5 +52,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); +void xtm_process_tree_view_set_filter (XtmProcessTreeView *treeview, const gchar *cmd_filter); #endif /* !PROCESS_TREE_VIEW_H */ diff --git a/src/process-window.c b/src/process-window.c index 503f5f1..99b292c 100644 --- a/src/process-window.c +++ b/src/process-window.c @@ -42,6 +42,7 @@ struct _XtmProcessWindow GtkBuilder * builder; GtkWidget * window; GtkWidget * toolbar; + GtkWidget * filter_entry; GtkWidget * cpu_monitor; GtkWidget * mem_monitor; GtkWidget * treeview; @@ -64,6 +65,33 @@ static void monitor_update_paint_box (XtmProcessWindow *window); static void show_about_dialog (XtmProcessWindow *window); +static void +filter_entry_icon_pressed_cb (GtkEntry *entry, + gint position, + GdkEventButton *event, + gpointer data) +{ + if (position == GTK_ENTRY_ICON_SECONDARY) { + gtk_entry_set_text (entry, ""); + gtk_widget_grab_focus(GTK_WIDGET(entry)); + } +} + +static gboolean +filter_entry_keyrelease_handler(GtkEntry *entry, + XtmProcessTreeView *treeview) +{ + const gchar *text; + gboolean has_text; + + text = gtk_editable_get_chars (GTK_EDITABLE(entry), 0, -1); + xtm_process_tree_view_set_filter(treeview, text); + + has_text = gtk_entry_get_text_length (GTK_ENTRY(entry)) > 0; + gtk_entry_set_icon_sensitive (GTK_ENTRY(entry), + GTK_ENTRY_ICON_SECONDARY, + has_text); +} static void xtm_process_window_class_init (XtmProcessWindowClass *klass) @@ -146,6 +174,10 @@ xtm_process_window_init (XtmProcessWindow *window) gtk_widget_show (window->treeview); gtk_container_add (GTK_CONTAINER (gtk_builder_get_object (window->builder, "scrolledwindow")), window->treeview); + window->filter_entry = GTK_WIDGET(gtk_builder_get_object (window->builder, "filter-entry")); + g_signal_connect (G_OBJECT(window->filter_entry), "icon-press", G_CALLBACK(filter_entry_icon_pressed_cb), NULL); + g_signal_connect (G_OBJECT(window->filter_entry), "changed", G_CALLBACK(filter_entry_keyrelease_handler), window->treeview); + window->statusbar = xtm_process_statusbar_new (); gtk_widget_show (window->statusbar); gtk_box_pack_start (GTK_BOX (gtk_builder_get_object (window->builder, "process-vbox")), window->statusbar, FALSE, FALSE, 0); diff --git a/src/process-window.ui b/src/process-window.ui index 81c4371..173211c 100644 --- a/src/process-window.ui +++ b/src/process-window.ui @@ -1,8 +1,9 @@ - + + False Task Manager 490 465 @@ -10,15 +11,17 @@ True - vertical + False True + False False 1 True + False 2 @@ -32,6 +35,7 @@ True + False 2 @@ -45,28 +49,33 @@ True + False True gtk-about False + True False + True 0 - vertical + False True + False True + False 6 3 Warning, you are using the root account, you may harm your system. @@ -82,9 +91,11 @@ True + False False + True 1 @@ -96,9 +107,28 @@ + + True + True + + gtk-find + gtk-clear + False + True + True + False + + + False + False + 2 + 2 + + + True - vertical + False 6 @@ -111,12 +141,16 @@ + True + True 0 - 2 + True + True + 3 -- 1.8.1.2