OSDN Git Service

805116c1840ce27d72a0f423d4d2b27f15e4b1d0
[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           *line;
49         int             n = 0, index;
50
51         gtk_tree_store_append(store, &iter, parent_iter);
52
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,
60                                 COLUMN_INDEX,           index,
61                                 COLUMN_NUMBER,          *number,
62                                 COLUMN_COLON,           ":",
63                                 COLUMN_PROFILE, str_prof,
64                                 COLUMN_NAME,            line,
65                                 -1);
66         DEBUG_PRINT("[%3d]%3d(%d):%s %s\n", index, *number, nest, str_prof, line);
67         g_free(str_prof);
68         g_free(line);
69
70         (*number)++;
71         while (*number < tsk->count) {
72                 n = tsk->task[*number].depth;
73                 if (n > nest) {
74                         n = add_task_tree_store(store, &iter, tsk, number, n);
75                 } else
76                         break;
77         }
78
79         return n;
80 }
81
82 void add_task_tree_data(GtkTreeView *treeview, task_list_t *tsk)
83 {
84         GtkTreeStore    *store;
85         GtkTreeIter     *iter = NULL;
86         int             number = 0, nest = -1;
87
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);
91 }
92
93 void set_select_flag_process(gpointer data, task_list_t *tsk)
94 {
95         GtkTreeModel            *model;
96         GtkTreeIter             iter;
97         gint                    index;
98
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__);
103                 return;
104         }
105         gtk_tree_model_get(model, &iter, COLUMN_INDEX, &index, -1);
106
107         DEBUG_PRINT("index[%d]\n", index);
108         tsk->task[index].selected = 1;
109 }
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)
115 {
116         GtkTreeViewColumn       *column;
117
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);
122
123         return column;
124 }
125 /*---------------------------------------------------------------------------*/
126 static gboolean cb_select_process(GtkTreeView *treeview,
127                                         GdkEventButton *event,
128                                         transition_t *transition)
129 {
130         transition->current_page = CCS_SCREEN_DOMAIN_LIST;
131
132         set_sensitive(transition->actions, transition->task_flag,
133                                                 transition->current_page);
134         if (event->button == 3) {
135                 GtkWidget       *popup;
136                 /* get menu.c create_menu()*/
137                 popup = g_object_get_data(
138                                 G_OBJECT(transition->window), "popup");
139
140                 gtk_menu_popup(GTK_MENU(popup), NULL, NULL, NULL, NULL,
141                                         0, gtk_get_current_event_time());
142                 return TRUE;
143         }
144
145         return FALSE;
146 }
147
148 static void cb_selection_proc(GtkTreeSelection *selection,
149                                         transition_t *transition)
150 {
151         GtkTreeIter     iter;
152         gint            select_count;
153         GtkTreeModel    *model;
154         GList           *list;
155         gint            index;
156         GtkTreePath             *path = NULL;
157         GtkTreeViewColumn       *column = NULL;
158
159         select_count = gtk_tree_selection_count_selected_rows(selection);
160         if (0 == select_count)
161                 return;
162
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);
168         g_list_free(list);
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);
172
173         gtk_tree_view_get_cursor(GTK_TREE_VIEW(
174                         transition->acl.listview), &path, &column);
175
176         get_process_acl_list(index,
177                 &(transition->acl.list), &(transition->acl.count));
178         add_list_data(&(transition->acl), TRUE);
179
180         view_cursor_set(transition->acl.listview, path, column);
181
182         disp_statusbar(transition, CCS_SCREEN_ACL_LIST);
183 }
184 /*---------------------------------------------------------------------------*/
185 GtkWidget *create_task_tree_model(transition_t *transition)
186 {
187         GtkWidget               *treeview;
188         GtkTreeStore            *store;
189         GtkTreeViewColumn       *column;
190
191         store = gtk_tree_store_new(N_COLUMNS_TREE,
192                                 G_TYPE_INT,
193                                 G_TYPE_INT,
194                                 G_TYPE_STRING,
195                                 G_TYPE_STRING,
196                                 G_TYPE_STRING);
197         treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
198         g_object_unref(store);
199
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);
208         // 開く位置
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);
213                 // ツリー開くマーク(2.12)
214 //      gtk_tree_view_set_show_expanders(GTK_TREE_VIEW(treeview), TRUE);
215         g_object_set(G_OBJECT(treeview), "enable-tree-lines", TRUE,
216                                                 NULL);
217         gtk_tree_view_set_grid_lines(GTK_TREE_VIEW(treeview),
218                                         GTK_TREE_VIEW_GRID_LINES_NONE);
219         // ヘッダ非表示
220         gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), FALSE);
221         view_setting(treeview, COLUMN_NAME);
222
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);
229
230         return treeview;
231 }
232 /*---------------------------------------------------------------------------*/
233 gint get_current_process_index(task_list_t *tsk)
234 {
235         GtkTreeSelection        *selection;
236         GtkTreeModel            *model;
237         GtkTreeIter             iter;
238         GList                   *list;
239         gint                    index = -1;
240
241         selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tsk->treeview));
242
243         if (selection &&
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);
250                 g_list_free(list);
251         }
252
253         return index;
254 }
255