Add filter entry to search especific command lines. (#9856)

This commit is contained in:
Matias De lellis
2013-02-14 19:04:59 -03:00
committed by Landry Breuil
parent 21c372715e
commit 9ca4c078c6
4 changed files with 108 additions and 11 deletions

View File

@@ -48,6 +48,7 @@ struct _XtmProcessTreeView
/*<private>*/ /*<private>*/
GtkListStore * model; GtkListStore * model;
GtkTreeModel * model_filter; GtkTreeModel * model_filter;
gchar * cmd_filter;
GtkTreeViewColumn * sort_column; GtkTreeViewColumn * sort_column;
gushort columns_positions[N_COLUMNS]; gushort columns_positions[N_COLUMNS];
XtmSettings * settings; 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 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 settings_changed (GObject *object, GParamSpec *pspec, XtmProcessTreeView *treeview);
static void static void
xtm_process_tree_view_class_init (XtmProcessTreeViewClass *klass) 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); 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 */ /* Create cell renderer for tree view columns */
cell_text = gtk_cell_renderer_text_new(); cell_text = gtk_cell_renderer_text_new();
@@ -590,16 +591,45 @@ column_clicked (GtkTreeViewColumn *column, XtmProcessTreeView *treeview)
treeview->sort_column = column; 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 static gboolean
visible_func (GtkTreeModel *model, GtkTreeIter *iter, XtmProcessTreeView *treeview) 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; guint uid;
if (treeview->show_all_processes_cached) if(treeview->cmd_filter) {
return TRUE; 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);
gtk_tree_model_get (GTK_TREE_MODEL (treeview->model), iter, XTM_PTV_COLUMN_UID, &uid, -1); p = g_strrstr (cmdline_lower, key_lower);
return (treeview->owner_uid == uid) ? TRUE : FALSE;
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;
}
return (mach_filter && match_uid);
} }
static gboolean static gboolean

View File

@@ -52,5 +52,6 @@ typedef struct _XtmProcessTreeView XtmProcessTreeView;
GType xtm_process_tree_view_get_type (void); GType xtm_process_tree_view_get_type (void);
GtkWidget * xtm_process_tree_view_new (void); GtkWidget * xtm_process_tree_view_new (void);
void xtm_process_tree_view_get_sort_column_id (XtmProcessTreeView *treeview, gint *sort_column_id, GtkSortType *sort_type); 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 */ #endif /* !PROCESS_TREE_VIEW_H */

View File

@@ -42,6 +42,7 @@ struct _XtmProcessWindow
GtkBuilder * builder; GtkBuilder * builder;
GtkWidget * window; GtkWidget * window;
GtkWidget * toolbar; GtkWidget * toolbar;
GtkWidget * filter_entry;
GtkWidget * cpu_monitor; GtkWidget * cpu_monitor;
GtkWidget * mem_monitor; GtkWidget * mem_monitor;
GtkWidget * treeview; GtkWidget * treeview;
@@ -64,6 +65,33 @@ static void monitor_update_paint_box (XtmProcessWindow *window);
static void show_about_dialog (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 static void
xtm_process_window_class_init (XtmProcessWindowClass *klass) xtm_process_window_class_init (XtmProcessWindowClass *klass)
@@ -146,6 +174,10 @@ xtm_process_window_init (XtmProcessWindow *window)
gtk_widget_show (window->treeview); gtk_widget_show (window->treeview);
gtk_container_add (GTK_CONTAINER (gtk_builder_get_object (window->builder, "scrolledwindow")), 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 (); window->statusbar = xtm_process_statusbar_new ();
gtk_widget_show (window->statusbar); gtk_widget_show (window->statusbar);
gtk_box_pack_start (GTK_BOX (gtk_builder_get_object (window->builder, "process-vbox")), window->statusbar, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (gtk_builder_get_object (window->builder, "process-vbox")), window->statusbar, FALSE, FALSE, 0);

View File

@@ -1,8 +1,9 @@
<?xml version="1.0"?> <?xml version="1.0" encoding="UTF-8"?>
<interface> <interface>
<!-- interface-requires gtk+ 2.12 --> <!-- interface-requires gtk+ 2.12 -->
<!-- interface-naming-policy project-wide --> <!-- interface-naming-policy project-wide -->
<object class="GtkWindow" id="process-window"> <object class="GtkWindow" id="process-window">
<property name="can_focus">False</property>
<property name="title" translatable="yes">Task Manager</property> <property name="title" translatable="yes">Task Manager</property>
<property name="default_width">490</property> <property name="default_width">490</property>
<property name="default_height">465</property> <property name="default_height">465</property>
@@ -10,15 +11,17 @@
<child> <child>
<object class="GtkVBox" id="process-vbox"> <object class="GtkVBox" id="process-vbox">
<property name="visible">True</property> <property name="visible">True</property>
<property name="orientation">vertical</property> <property name="can_focus">False</property>
<child> <child>
<object class="GtkToolbar" id="process-toolbar"> <object class="GtkToolbar" id="process-toolbar">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property>
<property name="show_arrow">False</property> <property name="show_arrow">False</property>
<property name="icon_size">1</property> <property name="icon_size">1</property>
<child> <child>
<object class="GtkToolItem" id="cpu-toolitem"> <object class="GtkToolItem" id="cpu-toolitem">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property>
<property name="border_width">2</property> <property name="border_width">2</property>
<child> <child>
<placeholder/> <placeholder/>
@@ -32,6 +35,7 @@
<child> <child>
<object class="GtkToolItem" id="mem-toolitem"> <object class="GtkToolItem" id="mem-toolitem">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property>
<property name="border_width">2</property> <property name="border_width">2</property>
<child> <child>
<placeholder/> <placeholder/>
@@ -45,28 +49,33 @@
<child> <child>
<object class="GtkToolButton" id="toolbutton-about"> <object class="GtkToolButton" id="toolbutton-about">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property> <property name="use_underline">True</property>
<property name="stock_id">gtk-about</property> <property name="stock_id">gtk-about</property>
</object> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
<property name="homogeneous">True</property>
</packing> </packing>
</child> </child>
</object> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property> <property name="position">0</property>
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkVBox" id="root-warning-box"> <object class="GtkVBox" id="root-warning-box">
<property name="orientation">vertical</property> <property name="can_focus">False</property>
<child> <child>
<object class="GtkEventBox" id="root-warning-ebox"> <object class="GtkEventBox" id="root-warning-ebox">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property>
<child> <child>
<object class="GtkLabel" id="root-warning-label"> <object class="GtkLabel" id="root-warning-label">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xpad">6</property> <property name="xpad">6</property>
<property name="ypad">3</property> <property name="ypad">3</property>
<property name="label" translatable="yes">Warning, you are using the root account, you may harm your system.</property> <property name="label" translatable="yes">Warning, you are using the root account, you may harm your system.</property>
@@ -82,9 +91,11 @@
<child> <child>
<object class="GtkHSeparator" id="root-warning-separator"> <object class="GtkHSeparator" id="root-warning-separator">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property>
</object> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property> <property name="position">1</property>
</packing> </packing>
</child> </child>
@@ -95,10 +106,29 @@
<property name="position">1</property> <property name="position">1</property>
</packing> </packing>
</child> </child>
<child>
<object class="GtkEntry" id="filter-entry">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="invisible_char">•</property>
<property name="primary_icon_stock">gtk-find</property>
<property name="secondary_icon_stock">gtk-clear</property>
<property name="primary_icon_activatable">False</property>
<property name="secondary_icon_activatable">True</property>
<property name="primary_icon_sensitive">True</property>
<property name="secondary_icon_sensitive">False</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="padding">2</property>
<property name="position">2</property>
</packing>
</child>
<child> <child>
<object class="GtkVBox" id="mainview-vbox"> <object class="GtkVBox" id="mainview-vbox">
<property name="visible">True</property> <property name="visible">True</property>
<property name="orientation">vertical</property> <property name="can_focus">False</property>
<property name="spacing">6</property> <property name="spacing">6</property>
<child> <child>
<object class="GtkScrolledWindow" id="scrolledwindow"> <object class="GtkScrolledWindow" id="scrolledwindow">
@@ -111,12 +141,16 @@
</child> </child>
</object> </object>
<packing> <packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property> <property name="position">0</property>
</packing> </packing>
</child> </child>
</object> </object>
<packing> <packing>
<property name="position">2</property> <property name="expand">True</property>
<property name="fill">True</property>
<property name="position">3</property>
</packing> </packing>
</child> </child>
<child> <child>