1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
3 * Gui Policy Editor for TOMOYO Linux
6 * Copyright (C) Yoshihiro Kusuno 2010,2011 <yocto@users.sourceforge.jp>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU Library General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor Boston, MA 02110-1301, USA
28 #include <glib/gi18n.h>
32 enum task_column_pos {
33 COLUMN_INDEX, // data index (invisible)
36 COLUMN_PROFILE, // profile
37 COLUMN_NAME, // process name + pid + domain name
41 /*---------------------------------------------------------------------------*/
42 static int add_task_tree_store(GtkTreeStore *store,
43 GtkTreeIter *parent_iter,
44 task_list_t *tsk, int *number, int nest)
51 gtk_tree_store_append(store, &iter, parent_iter);
53 index = tsk->task[*number].index;
54 str_prof = g_strdup_printf("%3u", tsk->task[*number].profile);
55 line = g_strdup_printf("%s (%u) %s",
56 tsk->task[*number].name,
57 tsk->task[*number].pid,
58 tsk->task[*number].domain);
59 gtk_tree_store_set(store, &iter,
61 COLUMN_NUMBER, *number,
63 COLUMN_PROFILE, str_prof,
66 DEBUG_PRINT("[%3d]%3d(%d):%s %s\n", index, *number, nest, str_prof, line);
71 while (*number < tsk->count) {
72 n = tsk->task[*number].depth;
74 n = add_task_tree_store(store, &iter, tsk, number, n);
82 void add_task_tree_data(GtkTreeView *treeview, task_list_t *tsk)
85 GtkTreeIter *iter = NULL;
86 int number = 0, nest = -1;
88 store = GTK_TREE_STORE(gtk_tree_view_get_model(treeview));
89 gtk_tree_store_clear(store);
90 add_task_tree_store(store, iter, tsk, &number, nest);
93 void set_select_flag_process(gpointer data, task_list_t *tsk)
99 model = gtk_tree_view_get_model(
100 GTK_TREE_VIEW(tsk->treeview));
101 if (!model || !gtk_tree_model_get_iter(model, &iter, data)) {
102 g_warning("ERROR: %s(%d)", __FILE__, __LINE__);
105 gtk_tree_model_get(model, &iter, COLUMN_INDEX, &index, -1);
107 DEBUG_PRINT("index[%d]\n", index);
108 tsk->task[index].selected = 1;
110 /*---------------------------------------------------------------------------*/
111 static GtkTreeViewColumn *column_add(
112 GtkCellRenderer *renderer, const GtkWidget *treeview,
113 const gchar *title, enum task_column_pos pos,
114 const gchar *attribute, const gfloat xalign)
116 GtkTreeViewColumn *column;
118 g_object_set(renderer, "xalign", xalign, "ypad", 0, NULL);
119 column = gtk_tree_view_column_new_with_attributes(
120 title, renderer, attribute, pos, NULL);
121 gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
125 /*---------------------------------------------------------------------------*/
126 static gboolean cb_select_process(GtkTreeView *treeview,
127 GdkEventButton *event,
128 transition_t *transition)
130 transition->current_page = CCS_SCREEN_DOMAIN_LIST;
132 set_sensitive(transition->actions, transition->task_flag,
133 transition->current_page);
134 if (event->button == 3) {
136 /* get menu.c create_menu()*/
137 popup = g_object_get_data(
138 G_OBJECT(transition->window), "popup");
140 gtk_menu_popup(GTK_MENU(popup), NULL, NULL, NULL, NULL,
141 0, gtk_get_current_event_time());
148 static void cb_selection_proc(GtkTreeSelection *selection,
149 transition_t *transition)
156 GtkTreePath *path = NULL;
157 GtkTreeViewColumn *column = NULL;
159 select_count = gtk_tree_selection_count_selected_rows(selection);
160 if (0 == select_count)
163 model = gtk_tree_view_get_model(
164 GTK_TREE_VIEW(transition->tsk.treeview));
165 list = gtk_tree_selection_get_selected_rows(selection, NULL);
166 gtk_tree_model_get_iter(model, &iter, g_list_first(list)->data);
167 g_list_foreach(list, (GFunc)gtk_tree_path_free, NULL);
169 gtk_tree_model_get(model, &iter, COLUMN_INDEX, &index, -1);
170 gtk_entry_set_text(GTK_ENTRY(transition->domainbar),
171 transition->tsk.task[index].domain);
173 gtk_tree_view_get_cursor(GTK_TREE_VIEW(
174 transition->acl.listview), &path, &column);
176 get_process_acl_list(index,
177 &(transition->acl.list), &(transition->acl.count));
178 add_list_data(&(transition->acl), TRUE);
180 view_cursor_set(transition->acl.listview, path, column);
182 disp_statusbar(transition, CCS_SCREEN_ACL_LIST);
184 /*---------------------------------------------------------------------------*/
185 GtkWidget *create_task_tree_model(transition_t *transition)
189 GtkTreeViewColumn *column;
191 store = gtk_tree_store_new(N_COLUMNS_TREE,
197 treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
198 g_object_unref(store);
200 column = column_add(gtk_cell_renderer_text_new(), treeview,
201 "No.", COLUMN_NUMBER, "text", 1.0);
202 column = column_add(gtk_cell_renderer_text_new(), treeview,
203 " ", COLUMN_COLON, "text", 0.5);
204 column = column_add(gtk_cell_renderer_text_new(), treeview,
205 "prof", COLUMN_PROFILE, "text", 1.0);
206 column = column_add(gtk_cell_renderer_text_new(), treeview,
207 "Name", COLUMN_NAME, "text", 0.0);
209 gtk_tree_view_set_expander_column(GTK_TREE_VIEW(treeview), column);
210 gtk_tree_view_column_set_spacing(column, 1);
211 // ツリーインデント pixel(2.12)
212 // gtk_tree_view_set_level_indentation(GTK_TREE_VIEW(treeview), 2);
214 // gtk_tree_view_set_show_expanders(GTK_TREE_VIEW(treeview), TRUE);
215 g_object_set(G_OBJECT(treeview), "enable-tree-lines", TRUE,
217 gtk_tree_view_set_grid_lines(GTK_TREE_VIEW(treeview),
218 GTK_TREE_VIEW_GRID_LINES_NONE);
220 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), FALSE);
221 view_setting(treeview, COLUMN_NAME);
223 // cursor move process window
224 g_signal_connect(gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)),
225 "changed", G_CALLBACK(cb_selection_proc), transition);
226 // mouse click process window
227 g_signal_connect(G_OBJECT(treeview), "button-press-event",
228 G_CALLBACK(cb_select_process), transition);
232 /*---------------------------------------------------------------------------*/
233 gint get_current_process_index(task_list_t *tsk)
235 GtkTreeSelection *selection;
241 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tsk->treeview));
244 gtk_tree_selection_count_selected_rows(selection)) {
245 list = gtk_tree_selection_get_selected_rows(selection, NULL);
246 model = gtk_tree_view_get_model(GTK_TREE_VIEW(tsk->treeview));
247 gtk_tree_model_get_iter(model, &iter, g_list_first(list)->data);
248 gtk_tree_model_get(model, &iter, COLUMN_INDEX, &index, -1);
249 g_list_foreach(list, (GFunc)gtk_tree_path_free, NULL);