OSDN Git Service

conf.h is added to Makefile.am.
[gpet/origin.git] / src / process.c
1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
2 /*
3  * Gui Policy Editor for TOMOYO Linux
4  *
5  * process.c
6  * Copyright (C) Yoshihiro Kusuno 2010,2011 <yocto@users.sourceforge.jp>
7  *
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.
12  *
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.
17  *
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
21  */
22
23 #ifdef HAVE_CONFIG_H
24 #  include <config.h>
25 #endif
26
27 #include <gtk/gtk.h>
28 #include <glib/gi18n.h>
29
30 #include "gpet.h"
31
32 enum task_column_pos {
33         COLUMN_INDEX,           // data index (invisible)
34         COLUMN_NUMBER,          // n
35         COLUMN_COLON,           // :
36         COLUMN_PROFILE,         // profile
37         COLUMN_NAME,            // process name + pid + domain name
38         N_COLUMNS_TREE
39 };
40
41 /*---------------------------------------------------------------------------*/
42 static int add_task_tree_store(GtkTreeStore *store,
43                         GtkTreeIter *parent_iter,
44                         task_list_t *tsk, int *number, int nest)
45 {
46         GtkTreeIter     iter;
47         gchar           *str_prof;
48         gchar           *str_domain;
49         gchar           *line;
50         int             n = 0, index;
51
52         gtk_tree_store_append(store, &iter, parent_iter);
53
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,
60                                 str_domain);
61         gtk_tree_store_set(store, &iter,
62                                 COLUMN_INDEX,           index,
63                                 COLUMN_NUMBER,          *number,
64                                 COLUMN_COLON,           ":",
65                                 COLUMN_PROFILE,         str_prof,
66                                 COLUMN_NAME,            line,
67                                 -1);
68         DEBUG_PRINT("[%3d]%3d(%d):%s %s\n", index, *number, nest, str_prof, line);
69         g_free(str_domain);
70         g_free(str_prof);
71         g_free(line);
72
73         (*number)++;
74         while (*number < tsk->count) {
75                 n = tsk->task[*number].depth;
76                 if (n > nest) {
77                         n = add_task_tree_store(store, &iter, tsk, number, n);
78                 } else
79                         break;
80         }
81
82         return n;
83 }
84
85 void add_task_tree_data(GtkTreeView *treeview, task_list_t *tsk)
86 {
87         GtkTreeStore    *store;
88         GtkTreeIter     *iter = NULL;
89         int             number = 0, nest = -1;
90
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);
94 }
95
96 void set_select_flag_process(gpointer data, task_list_t *tsk)
97 {
98         GtkTreeModel            *model;
99         GtkTreeIter             iter;
100         gint                    index;
101
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__);
106                 return;
107         }
108         gtk_tree_model_get(model, &iter, COLUMN_INDEX, &index, -1);
109
110         DEBUG_PRINT("index[%d]\n", index);
111         tsk->task[index].selected = 1;
112 }
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)
118 {
119         GtkTreeViewColumn       *column;
120
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);
125
126         return column;
127 }
128 /*---------------------------------------------------------------------------*/
129 static gboolean cb_select_process(GtkTreeView *treeview,
130                                         GdkEventButton *event,
131                                         transition_t *transition)
132 {
133         transition->current_page = CCS_SCREEN_DOMAIN_LIST;
134
135         set_sensitive(transition->actions, transition->task_flag,
136                                                 transition->current_page);
137         if (event->button == 3) {
138                 GtkWidget       *popup;
139                 /* get menu.c create_menu()*/
140                 popup = g_object_get_data(
141                                 G_OBJECT(transition->window), "popup");
142
143                 gtk_menu_popup(GTK_MENU(popup), NULL, NULL, NULL, NULL,
144                                         0, gtk_get_current_event_time());
145                 return TRUE;
146         }
147
148         return FALSE;
149 }
150
151 static void cb_selection_proc(GtkTreeSelection *selection,
152                                         transition_t *transition)
153 {
154         GtkTreeIter             iter;
155         gint                    select_count;
156         GtkTreeModel            *model;
157         GList                   *list;
158         gint                    index;
159         gchar                   *str_domain;
160         GtkTreePath             *path = NULL;
161         GtkTreeViewColumn       *column = NULL;
162
163         select_count = gtk_tree_selection_count_selected_rows(selection);
164         if (0 == select_count)
165                 return;
166
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);
172         g_list_free(list);
173         gtk_tree_model_get(model, &iter, COLUMN_INDEX, &index, -1);
174
175         str_domain = decode_from_octal_str(transition->tsk.task[index].domain);
176         gtk_entry_set_text(GTK_ENTRY(transition->domainbar), str_domain);
177         g_free(str_domain);
178
179         gtk_tree_view_get_cursor(GTK_TREE_VIEW(
180                         transition->acl.listview), &path, &column);
181
182         get_process_acl_list(index,
183                 &(transition->acl.list), &(transition->acl.count));
184         add_list_data(&(transition->acl), TRUE);
185
186         view_cursor_set(transition->acl.listview, path, column);
187
188         disp_statusbar(transition, CCS_SCREEN_ACL_LIST);
189 }
190 /*---------------------------------------------------------------------------*/
191 GtkWidget *create_task_tree_model(transition_t *transition)
192 {
193         GtkWidget               *treeview;
194         GtkTreeStore            *store;
195         GtkTreeViewColumn       *column;
196
197         store = gtk_tree_store_new(N_COLUMNS_TREE,
198                                 G_TYPE_INT,
199                                 G_TYPE_INT,
200                                 G_TYPE_STRING,
201                                 G_TYPE_STRING,
202                                 G_TYPE_STRING);
203         treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
204         g_object_unref(store);
205
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);
214         // 開く位置
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);
219                 // ツリー開くマーク(2.12)
220 //      gtk_tree_view_set_show_expanders(GTK_TREE_VIEW(treeview), TRUE);
221         g_object_set(G_OBJECT(treeview), "enable-tree-lines", TRUE,
222                                                 NULL);
223         gtk_tree_view_set_grid_lines(GTK_TREE_VIEW(treeview),
224                                         GTK_TREE_VIEW_GRID_LINES_NONE);
225         // ヘッダ非表示
226         gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), FALSE);
227         view_setting(treeview, COLUMN_NAME);
228
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);
235
236         return treeview;
237 }
238 /*---------------------------------------------------------------------------*/
239 gint get_current_process_index(task_list_t *tsk)
240 {
241         GtkTreeSelection        *selection;
242         GtkTreeModel            *model;
243         GtkTreeIter             iter;
244         GList                   *list;
245         gint                    index = -1;
246
247         selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tsk->treeview));
248
249         if (selection &&
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);
256                 g_list_free(list);
257         }
258
259         return index;
260 }
261