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)
52 gtk_tree_store_append(store, &iter, parent_iter);
54 index = tsk->task[*number].index;
55 str_prof = g_strdup_printf("%3u", tsk->task[*number].profile);
56 str_domain = decode_from_octal_str(tsk->task[*number].domain);
57 line = g_strdup_printf("%s (%u) %s",
58 tsk->task[*number].name,
59 tsk->task[*number].pid,
61 gtk_tree_store_set(store, &iter,
63 COLUMN_NUMBER, *number,
65 COLUMN_PROFILE, str_prof,
68 DEBUG_PRINT("[%3d]%3d(%d):%s %s\n", index, *number, nest, str_prof, line);
74 while (*number < tsk->count) {
75 n = tsk->task[*number].depth;
77 n = add_task_tree_store(store, &iter, tsk, number, n);
85 void add_task_tree_data(GtkTreeView *treeview, task_list_t *tsk)
88 GtkTreeIter *iter = NULL;
89 int number = 0, nest = -1;
91 store = GTK_TREE_STORE(gtk_tree_view_get_model(treeview));
92 gtk_tree_store_clear(store);
93 add_task_tree_store(store, iter, tsk, &number, nest);
96 void set_select_flag_process(gpointer data, task_list_t *tsk)
102 model = gtk_tree_view_get_model(
103 GTK_TREE_VIEW(tsk->treeview));
104 if (!model || !gtk_tree_model_get_iter(model, &iter, data)) {
105 g_warning("ERROR: %s(%d)", __FILE__, __LINE__);
108 gtk_tree_model_get(model, &iter, COLUMN_INDEX, &index, -1);
110 DEBUG_PRINT("index[%d]\n", index);
111 tsk->task[index].selected = 1;
113 /*---------------------------------------------------------------------------*/
114 static GtkTreeViewColumn *column_add(
115 GtkCellRenderer *renderer, const GtkWidget *treeview,
116 const gchar *title, enum task_column_pos pos,
117 const gchar *attribute, const gfloat xalign)
119 GtkTreeViewColumn *column;
121 g_object_set(renderer, "xalign", xalign, "ypad", 0, NULL);
122 column = gtk_tree_view_column_new_with_attributes(
123 title, renderer, attribute, pos, NULL);
124 gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
128 /*---------------------------------------------------------------------------*/
129 static gboolean cb_select_process(GtkTreeView *treeview,
130 GdkEventButton *event,
131 transition_t *transition)
133 transition->current_page = CCS_SCREEN_DOMAIN_LIST;
135 set_sensitive(transition->actions, transition->task_flag,
136 transition->current_page);
137 if (event->button == 3) {
139 /* get menu.c create_menu()*/
140 popup = g_object_get_data(
141 G_OBJECT(transition->window), "popup");
143 gtk_menu_popup(GTK_MENU(popup), NULL, NULL, NULL, NULL,
144 0, gtk_get_current_event_time());
151 static void cb_selection_proc(GtkTreeSelection *selection,
152 transition_t *transition)
160 GtkTreePath *path = NULL;
161 GtkTreeViewColumn *column = NULL;
163 select_count = gtk_tree_selection_count_selected_rows(selection);
164 if (0 == select_count)
167 model = gtk_tree_view_get_model(
168 GTK_TREE_VIEW(transition->tsk.treeview));
169 list = gtk_tree_selection_get_selected_rows(selection, NULL);
170 gtk_tree_model_get_iter(model, &iter, g_list_first(list)->data);
171 g_list_foreach(list, (GFunc)gtk_tree_path_free, NULL);
173 gtk_tree_model_get(model, &iter, COLUMN_INDEX, &index, -1);
175 str_domain = decode_from_octal_str(transition->tsk.task[index].domain);
176 gtk_entry_set_text(GTK_ENTRY(transition->domainbar), str_domain);
179 gtk_tree_view_get_cursor(GTK_TREE_VIEW(
180 transition->acl.listview), &path, &column);
182 get_process_acl_list(index,
183 &(transition->acl.list), &(transition->acl.count));
184 add_list_data(&(transition->acl), TRUE);
186 view_cursor_set(transition->acl.listview, path, column);
188 disp_statusbar(transition, CCS_SCREEN_ACL_LIST);
190 /*---------------------------------------------------------------------------*/
191 GtkWidget *create_task_tree_model(transition_t *transition)
195 GtkTreeViewColumn *column;
197 store = gtk_tree_store_new(N_COLUMNS_TREE,
203 treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
204 g_object_unref(store);
206 column = column_add(gtk_cell_renderer_text_new(), treeview,
207 "No.", COLUMN_NUMBER, "text", 1.0);
208 column = column_add(gtk_cell_renderer_text_new(), treeview,
209 " ", COLUMN_COLON, "text", 0.5);
210 column = column_add(gtk_cell_renderer_text_new(), treeview,
211 "prof", COLUMN_PROFILE, "text", 1.0);
212 column = column_add(gtk_cell_renderer_text_new(), treeview,
213 "Name", COLUMN_NAME, "text", 0.0);
215 gtk_tree_view_set_expander_column(GTK_TREE_VIEW(treeview), column);
216 gtk_tree_view_column_set_spacing(column, 1);
217 // ツリーインデント pixel(2.12)
218 // gtk_tree_view_set_level_indentation(GTK_TREE_VIEW(treeview), 2);
220 // gtk_tree_view_set_show_expanders(GTK_TREE_VIEW(treeview), TRUE);
221 g_object_set(G_OBJECT(treeview), "enable-tree-lines", TRUE,
223 gtk_tree_view_set_grid_lines(GTK_TREE_VIEW(treeview),
224 GTK_TREE_VIEW_GRID_LINES_NONE);
226 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), FALSE);
227 view_setting(treeview, COLUMN_NAME);
229 // cursor move process window
230 g_signal_connect(gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)),
231 "changed", G_CALLBACK(cb_selection_proc), transition);
232 // mouse click process window
233 g_signal_connect(G_OBJECT(treeview), "button-press-event",
234 G_CALLBACK(cb_select_process), transition);
238 /*---------------------------------------------------------------------------*/
239 gint get_current_process_index(task_list_t *tsk)
241 GtkTreeSelection *selection;
247 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tsk->treeview));
250 gtk_tree_selection_count_selected_rows(selection)) {
251 list = gtk_tree_selection_get_selected_rows(selection, NULL);
252 model = gtk_tree_view_get_model(GTK_TREE_VIEW(tsk->treeview));
253 gtk_tree_model_get_iter(model, &iter, g_list_first(list)->data);
254 gtk_tree_model_get(model, &iter, COLUMN_INDEX, &index, -1);
255 g_list_foreach(list, (GFunc)gtk_tree_path_free, NULL);