Add filter entry to search especific command lines. (#9856)
This commit is contained in:
committed by
Landry Breuil
parent
21c372715e
commit
9ca4c078c6
@@ -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
|
||||||
|
|||||||
@@ -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 */
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user