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 <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
23 #include <sys/types.h>
34 #include <glib/gi18n.h>
38 /*---------------------------------------------------------------------------*/
39 enum tree_column_pos {
40 COLUMN_INDEX, // data index (invisible)
43 COLUMN_PROFILE, // profile
44 COLUMN_KEEPER_DOMAIN, // #
45 COLUMN_INITIALIZER_TARGET, // *
46 COLUMN_DOMAIN_UNREACHABLE, // !
47 COLUMN_DOMAIN_NAME, // domain name
48 COLUMN_COLOR, // text color
49 COLUMN_REDIRECT, // redirect index (invisible)
52 /*---------------------------------------------------------------------------*/
53 static int add_tree_store(GtkTreeStore *store, GtkTreeIter *parent_iter,
54 struct ccs_domain_policy *dp, int *index, int nest)
57 gchar *color = "black";
58 gchar *str_num, *str_prof;
59 gchar *line = NULL, *is_dis = NULL, *domain;
61 const struct ccs_transition_control_entry *transition_control;
62 int n, number, redirect_index = -1;
64 sp = ccs_domain_name(dp, *index);
66 const char *cp = strchr(sp, ' ');
72 gtk_tree_store_append(store, &iter, parent_iter);
73 number = dp->list[*index].number;
75 str_num = g_strdup_printf("%4d", number);
76 str_prof = dp->list[*index].profile_assigned ?
77 g_strdup_printf("%3u", dp->list[*index].profile) :
80 str_num = g_strdup("");
81 str_prof = g_strdup("");
84 gtk_tree_store_set(store, &iter,
86 COLUMN_NUMBER, str_num,
87 COLUMN_COLON, number >= 0 ? ":" : "",
88 COLUMN_PROFILE, str_prof,
89 COLUMN_KEEPER_DOMAIN, dp->list[*index].is_dk ? "#" : " ",
90 COLUMN_INITIALIZER_TARGET, dp->list[*index].is_dit ? "*" : " ",
91 COLUMN_DOMAIN_UNREACHABLE, dp->list[*index].is_du ? "!" : " ",
96 transition_control = dp->list[*index].d_t;
97 if (transition_control && !(dp->list[*index].is_dis)) {
98 line = g_strdup_printf(" ( %s%s from %s )",
99 get_transition_name(transition_control->type),
100 transition_control->program ?
101 transition_control->program->name : "any",
102 transition_control->domainname ?
103 transition_control->domainname->name : "any");
105 transition_control->type == CCS_TRANSITION_CONTROL_KEEP ?
107 } else if (dp->list[*index].is_dis) { /* initialize_domain */
108 is_dis = g_strdup_printf(CCS_ROOT_NAME "%s",
109 strrchr(ccs_domain_name(dp, *index), ' '));
110 redirect_index = ccs_find_domain(dp, is_dis, false, false);
113 if (redirect_index >= 0)
114 is_dis = g_strdup_printf(" ( -> %d )",
115 dp->list[redirect_index].number);
117 is_dis = g_strdup_printf(" ( -> Not Found )");
118 } else if (dp->list[*index].is_dd) { /* delete_domain */
121 domain = g_strdup_printf("%s%s%s%s%s",
122 dp->list[*index].is_dd ? "( " : "",
124 dp->list[*index].is_dd ? " )" : "",
128 gtk_tree_store_set(store, &iter, COLUMN_DOMAIN_NAME, domain,
130 COLUMN_REDIRECT, redirect_index, -1);
137 while (*index < dp->list_len) {
138 sp = ccs_domain_name(dp, *index);
140 const char *cp = strchr(sp, ' ');
147 n = add_tree_store(store, &iter, dp, index, n);
155 void add_tree_data(GtkTreeView *treeview, struct ccs_domain_policy *dp)
158 GtkTreeIter *iter = NULL;
159 int index = 0, nest = -1;
161 store = GTK_TREE_STORE(gtk_tree_view_get_model(treeview));
162 gtk_tree_store_clear(store);
163 add_tree_store(store, iter, dp, &index, nest);
165 /*---------------------------------------------------------------------------*/
166 static GtkTreeViewColumn *column_add(
167 GtkCellRenderer *renderer,
168 const GtkWidget *treeview,
170 enum tree_column_pos pos,
171 const gchar *attribute,
175 GtkTreeViewColumn *column;
177 g_object_set(renderer, "xalign", xalign, "ypad", 0, NULL);
178 column = gtk_tree_view_column_new_with_attributes(
179 title, renderer, attribute, pos, NULL);
180 gtk_tree_view_column_add_attribute(column, renderer,
181 "foreground", COLUMN_COLOR);
182 // gtk_tree_view_column_set_alignment(column, xalign);
183 gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
187 /*---------------------------------------------------------------------------*/
189 static void cb_status_toggled(GtkCellRendererToggle *renderer,
198 model = gtk_tree_view_get_model(GTK_TREE_VIEW(user_data));
199 path = gtk_tree_path_new_from_string(path_string);
201 gtk_tree_model_get_iter(model, &iter, path);
202 gtk_tree_model_get(model, &iter, COLUMN_INDEX, &status, -1);
203 gtk_tree_store_set(GTK_TREE_STORE(model), &iter,
204 COLUMN_INDEX, !status, -1);
205 gtk_tree_path_free(path);
208 /*---------------------------------------------------------------------------*/
209 static GtkWidget *create_tree_model(void)
213 // GtkCellRenderer *renderer;
214 GtkTreeViewColumn *column;
216 store = gtk_tree_store_new(N_COLUMNS_TREE,
227 treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
228 g_object_unref(store);
231 // renderer = gtk_cell_renderer_toggle_new();
232 // g_signal_connect(renderer, "toggled",
233 // G_CALLBACK(cb_status_toggled), treeview);
235 renderer = gtk_cell_renderer_text_new();
236 g_object_set(renderer, "visible", FALSE, NULL);
237 column = column_add(renderer, treeview,
238 "", COLUMN_INDEX, "text", 0.0);
240 column = column_add(gtk_cell_renderer_text_new(), treeview,
241 "No.", COLUMN_NUMBER, "text", 1.0);
242 column = column_add(gtk_cell_renderer_text_new(), treeview,
243 " ", COLUMN_COLON, "text", 0.5);
244 column = column_add(gtk_cell_renderer_text_new(), treeview,
245 "prof", COLUMN_PROFILE, "text", 1.0);
246 column = column_add(gtk_cell_renderer_text_new(), treeview,
247 "#", COLUMN_KEEPER_DOMAIN, "text", 0.5);
248 column = column_add(gtk_cell_renderer_text_new(), treeview,
249 "*", COLUMN_INITIALIZER_TARGET, "text", 0.5);
250 column = column_add(gtk_cell_renderer_text_new(), treeview,
251 "!", COLUMN_DOMAIN_UNREACHABLE, "text", 0.5);
252 column = column_add(gtk_cell_renderer_text_new(), treeview,
253 "Domain Name", COLUMN_DOMAIN_NAME, "text", 0.0);
255 gtk_tree_view_set_expander_column(GTK_TREE_VIEW(treeview), column);
256 // gtk_tree_view_column_set_spacing(column, 1);
258 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), FALSE);
262 /*---------------------------------------------------------------------------*/
263 enum list_column_pos {
271 void add_list_data(generic_list_t *generic, gboolean alias_flag)
276 gchar *str_num, *profile, *alias;
278 store = GTK_LIST_STORE(gtk_tree_view_get_model(
279 GTK_TREE_VIEW(generic->listview)));
281 gtk_list_store_clear(store);
282 for(i = 0; i < generic->count; i++){
283 str_num = g_strdup_printf("%4d", i);
284 gtk_list_store_append(store, &iter);
288 ccs_directives[generic->list[i].directive].alias;
289 gtk_list_store_set(store, &iter,
290 LIST_NUMBER, str_num,
293 LIST_OPERAND, generic->list[i].operand,
296 profile = g_strdup_printf("%3u-",
297 generic->list[i].directive);
298 alias = g_strdup_printf("%s%s",
299 generic->list[i].directive < 256 ?
301 generic->list[i].operand);
302 gtk_list_store_set(store, &iter,
303 LIST_NUMBER, str_num,
314 static GtkWidget *create_list_model(gboolean alias_flag)
317 GtkListStore *liststore;
318 GtkCellRenderer *renderer;
319 GtkTreeViewColumn *column;
321 liststore = gtk_list_store_new(N_COLUMNS_LIST,
322 G_TYPE_STRING, G_TYPE_STRING,
323 G_TYPE_STRING, G_TYPE_STRING);
324 treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(liststore));
325 g_object_unref(liststore);
327 renderer = gtk_cell_renderer_text_new();
328 g_object_set(renderer, "xalign", 1.0, "ypad", 0, NULL);
329 column = gtk_tree_view_column_new_with_attributes(
330 "No.", renderer, "text", LIST_NUMBER, NULL);
331 gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
332 gtk_tree_view_column_set_sort_column_id(column, LIST_NUMBER);
333 // gtk_tree_view_column_set_alignment(column, 1.0);
335 renderer = gtk_cell_renderer_text_new();
336 column = gtk_tree_view_column_new_with_attributes(" ", renderer,
337 "text", LIST_COLON, NULL);
338 gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
341 renderer = gtk_cell_renderer_text_new();
342 column = gtk_tree_view_column_new_with_attributes(
343 "directive", renderer, "text", LIST_ALIAS, NULL);
344 gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
345 gtk_tree_view_column_set_sort_column_id(column, LIST_ALIAS);
348 renderer = gtk_cell_renderer_text_new();
349 column = gtk_tree_view_column_new_with_attributes("operand", renderer,
350 "text", LIST_OPERAND, NULL);
351 gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
352 gtk_tree_view_column_set_sort_column_id(column, LIST_OPERAND);
355 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), TRUE);
359 /*---------------------------------------------------------------------------*/
360 gint get_current_domain_index(transition_t *transition)
362 GtkTreeSelection *selection;
368 selection = gtk_tree_view_get_selection(
369 GTK_TREE_VIEW(transition->treeview));
371 gtk_tree_selection_count_selected_rows(selection)) {
372 list = gtk_tree_selection_get_selected_rows(
374 model = gtk_tree_view_get_model(
375 GTK_TREE_VIEW(transition->treeview));
376 gtk_tree_model_get_iter(model, &iter,
377 g_list_first(list)->data);
378 gtk_tree_model_get(model, &iter,
379 COLUMN_INDEX, &index, -1);
380 g_list_foreach(list, (GFunc)gtk_tree_path_free, NULL);
383 DEBUG_PRINT("select Domain index[%d]\n", index);
386 /*---------------------------------------------------------------------------*/
387 static void cb_selection(GtkTreeSelection *selection,
388 transition_t *transition)
395 GtkTreePath *path = NULL;
396 GtkTreeViewColumn *column = NULL;
398 select_count = gtk_tree_selection_count_selected_rows(selection);
399 DEBUG_PRINT("select count[%d]\n", select_count);
400 if (0 == select_count)
403 model = gtk_tree_view_get_model(
404 GTK_TREE_VIEW(transition->treeview));
405 list = gtk_tree_selection_get_selected_rows(selection, NULL);
406 gtk_tree_model_get_iter(model, &iter, g_list_first(list)->data);
407 g_list_foreach(list, (GFunc)gtk_tree_path_free, NULL);
409 gtk_tree_model_get(model, &iter, COLUMN_INDEX, &index, -1);
410 DEBUG_PRINT("--- index [%4d] ---\n", index);
411 gtk_entry_set_text(GTK_ENTRY(transition->domainbar),
412 ccs_domain_name(transition->dp, index));
414 gtk_tree_view_get_cursor(GTK_TREE_VIEW(
415 transition->acl.listview), &path, &column);
417 get_acl_list(transition->dp, index,
418 &(transition->acl.list), &(transition->acl.count));
419 add_list_data(&(transition->acl), TRUE);
421 view_cursor_set(transition->acl.listview, path, column);
423 if (transition->acl.count) {
424 disp_statusbar(transition, CCS_SCREEN_ACL_LIST);
425 } else { /* delete_domain or initializer_source */
426 disp_statusbar(transition, CCS_MAXSCREEN);
429 /*---------------------------------------------------------------------------*/
436 static gboolean find_is_dis(GtkTreeModel *model, GtkTreePath *path,
437 GtkTreeIter *iter, struct FindIsDis_t *data)
441 gtk_tree_model_get(model, iter, COLUMN_INDEX, &index, -1);
442 if (data->redirect_index == index) {
444 data->path = gtk_tree_path_copy(path);
450 static void cb_initialize_domain(GtkTreeView *treeview, GtkTreePath *treepath,
451 GtkTreeViewColumn treeviewcolumn, gpointer dummy)
456 struct FindIsDis_t data;
458 model = gtk_tree_view_get_model(treeview);
459 ret = gtk_tree_model_get_iter(model, &iter, treepath);
461 gtk_tree_model_get(model, &iter,
462 COLUMN_REDIRECT, &data.redirect_index, -1);
463 DEBUG_PRINT("redirect_index[%d]\n", data.redirect_index);
464 if (!ret || data.redirect_index < 0)
465 return; /* not initialize_domain */
468 gtk_tree_model_foreach(model,
469 (GtkTreeModelForeachFunc)find_is_dis, &data);
472 gtk_tree_view_expand_to_path(GTK_TREE_VIEW(treeview), data.path);
473 gtk_tree_selection_select_iter(
474 gtk_tree_view_get_selection(
475 GTK_TREE_VIEW(treeview)), &data.iter);
476 gtk_tree_view_set_cursor(GTK_TREE_VIEW(treeview),
477 data.path, NULL, FALSE);
478 gtk_tree_path_free(data.path);
481 /*---------------------------------------------------------------------------*/
482 void set_sensitive(GtkActionGroup *actions, int task_flag,
483 enum ccs_screen_type current_page)
485 gboolean sens_edt, sens_add, sens_del, sens_tsk;
487 sens_edt = sens_add = sens_del = sens_tsk = FALSE;
489 switch((int)current_page) {
490 case CCS_SCREEN_DOMAIN_LIST :
502 case CCS_SCREEN_ACL_LIST :
508 case CCS_SCREEN_EXCEPTION_LIST :
514 case CCS_SCREEN_PROFILE_LIST :
522 gtk_action_set_sensitive(gtk_action_group_get_action(
523 actions, "Edit"), sens_edt);
524 gtk_action_set_sensitive(gtk_action_group_get_action(
525 actions, "Add"), sens_add);
526 gtk_action_set_sensitive(gtk_action_group_get_action(
527 actions, "Delete"), sens_del);
528 gtk_action_set_sensitive(gtk_action_group_get_action(
529 actions, "Process"), sens_tsk);
532 static gint popup_menu(transition_t *transition, guint button)
536 /* get menu.c create_menu()*/
537 popup = g_object_get_data(
538 G_OBJECT(transition->window), "popup");
540 gtk_menu_popup(GTK_MENU(popup), NULL, NULL, NULL, NULL,
541 0, gtk_get_current_event_time());
548 static gboolean cb_select_domain(GtkTreeView *treeview, GdkEventButton *event,
549 transition_t *transition)
551 transition->current_page = CCS_SCREEN_DOMAIN_LIST;
553 set_sensitive(transition->actions, transition->task_flag,
554 transition->current_page);
555 if (event->button == 3) {
557 /* get menu.c create_menu()*/
558 popup = g_object_get_data(
559 G_OBJECT(transition->window), "popup");
561 gtk_menu_popup(GTK_MENU(popup), NULL, NULL, NULL, NULL,
562 0, gtk_get_current_event_time());
569 static gboolean cb_select_acl(GtkTreeView *listview, GdkEventButton *event,
570 transition_t *transition)
572 transition->current_page = CCS_SCREEN_ACL_LIST;
573 set_sensitive(transition->actions, transition->task_flag,
574 transition->current_page);
575 return popup_menu(transition, event->button);
578 static gboolean cb_select_exp(GtkTreeView *listview, GdkEventButton *event,
579 transition_t *transition)
581 transition->current_page = CCS_SCREEN_EXCEPTION_LIST;
582 set_sensitive(transition->actions, transition->task_flag,
583 transition->current_page);
584 return popup_menu(transition, event->button);
587 static gboolean cb_select_prf(GtkTreeView *listview, GdkEventButton *event,
588 transition_t *transition)
590 transition->current_page = CCS_SCREEN_PROFILE_LIST;
591 set_sensitive(transition->actions, transition->task_flag,
592 transition->current_page);
593 return popup_menu(transition, event->button);
595 /*---------------------------------------------------------------------------*/
596 static gboolean inc_search(GtkTreeModel *model, gint column,
597 const gchar *key, GtkTreeIter *iter, gpointer search_data)
602 gtk_tree_model_get(model, iter, column, &buff, -1);
603 DEBUG_PRINT("key[%s] buff[%s]\n", key, buff);
604 ret = g_strrstr(buff, key) ? FALSE : TRUE;
610 void view_setting(GtkWidget *treeview, gint search_column)
613 gtk_tree_selection_set_mode(
614 gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)),
615 GTK_SELECTION_MULTIPLE);
617 gtk_tree_view_set_rubber_banding(GTK_TREE_VIEW(treeview), TRUE);
619 gtk_tree_view_set_search_column(GTK_TREE_VIEW(treeview),
621 gtk_tree_view_set_enable_search(GTK_TREE_VIEW(treeview), TRUE);
622 gtk_tree_view_set_search_equal_func(GTK_TREE_VIEW(treeview),
623 (GtkTreeViewSearchEqualFunc)inc_search, NULL, NULL);
626 static GtkContainer *create_domain_view(GtkWidget *box,
627 GtkWidget *treeview, void (*paned_pack)(), gboolean resize)
629 GtkWidget *scrolledwin;
630 GtkContainer *container;
632 scrolledwin = gtk_scrolled_window_new(NULL, NULL);
633 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwin),
634 GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
635 gtk_scrolled_window_set_shadow_type(
636 GTK_SCROLLED_WINDOW(scrolledwin), GTK_SHADOW_IN);
637 paned_pack(GTK_PANED(box), scrolledwin, resize, TRUE);
638 container = GTK_CONTAINER(scrolledwin);
639 gtk_container_add(container, treeview);
641 view_setting(treeview, COLUMN_DOMAIN_NAME);
645 /*---------------------------------------------------------------------------*/
646 static void create_list_view(GtkWidget *box, GtkWidget *listview,
649 GtkWidget *scrolledwin;
651 scrolledwin = gtk_scrolled_window_new(NULL, NULL);
652 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwin),
653 GTK_POLICY_AUTOMATIC,
655 gtk_scrolled_window_set_shadow_type(
656 GTK_SCROLLED_WINDOW(scrolledwin), GTK_SHADOW_IN);
657 gtk_box_pack_start(GTK_BOX(box), scrolledwin, TRUE, TRUE, 0);
658 gtk_container_add(GTK_CONTAINER(scrolledwin), listview);
662 gtk_tree_selection_set_mode(
663 gtk_tree_view_get_selection(
664 GTK_TREE_VIEW(listview)),
665 GTK_SELECTION_MULTIPLE);
667 gtk_tree_view_set_rubber_banding(
668 GTK_TREE_VIEW(listview), TRUE);
671 gtk_tree_view_set_search_column(
672 GTK_TREE_VIEW(listview), LIST_OPERAND);
673 gtk_tree_view_set_enable_search(
674 GTK_TREE_VIEW(listview), TRUE);
675 gtk_tree_view_set_search_equal_func(GTK_TREE_VIEW(listview),
676 (GtkTreeViewSearchEqualFunc)inc_search, NULL, NULL);
678 /*---------------------------------------------------------------------------*/
679 static void set_select_flag_domain(gpointer data,
680 transition_t *transition)
685 struct ccs_domain_policy *dp = transition->dp;
688 model = gtk_tree_view_get_model(
689 GTK_TREE_VIEW(transition->treeview));
690 if (!model || !gtk_tree_model_get_iter(model, &iter, data)) {
691 g_warning("ERROR: %s(%d)", __FILE__, __LINE__);
694 gtk_tree_model_get(model, &iter, COLUMN_INDEX, &index, -1);
696 DEBUG_PRINT("index[%d]\n", index);
697 /* deleted_domain or initializer_source */
698 if (!(dp->list[index].is_dd) && !(dp->list[index].is_dis))
699 dp->list_selected[index] = 1;
702 gint delete_domain(transition_t *transition,
703 GtkTreeSelection *selection, gint count)
706 char *err_buff = NULL;
710 list = gtk_tree_selection_get_selected_rows(selection, NULL);
711 g_list_foreach(list, (GFunc)set_select_flag_domain, transition);
713 g_list_foreach(list, (GFunc)gtk_tree_path_free, NULL);
716 result = delete_domain_policy(transition->dp, &err_buff);
718 g_warning("%s", err_buff);
724 /*---------------------------------------------------------------------------*/
725 gint set_domain_profile(transition_t *transition,
726 GtkTreeSelection *selection, guint profile)
730 char *err_buff = NULL;
733 list = gtk_tree_selection_get_selected_rows(selection, NULL);
734 if (transition->task_flag)
735 g_list_foreach(list, (GFunc)set_select_flag_process,
738 g_list_foreach(list, (GFunc)set_select_flag_domain,
741 g_list_foreach(list, (GFunc)gtk_tree_path_free, NULL);
744 profile_str = g_strdup_printf("%u", profile);
745 result = set_profile(transition->dp, profile_str, &err_buff);
746 // g_free(profile_str);
748 g_warning("%s", err_buff);
754 /*---------------------------------------------------------------------------*/
755 gint select_profile_line(generic_list_t *prf)
757 GtkTreeSelection *selection;
764 selection = gtk_tree_view_get_selection(
765 GTK_TREE_VIEW(prf->listview));
767 !gtk_tree_selection_count_selected_rows(selection))
770 list = gtk_tree_selection_get_selected_rows(selection, NULL);
771 model = gtk_tree_view_get_model(GTK_TREE_VIEW(prf->listview));
772 gtk_tree_model_get_iter(model, &iter, g_list_first(list)->data);
773 gtk_tree_model_get(model, &iter, LIST_NUMBER, &str_num, -1);
774 g_list_foreach(list, (GFunc)gtk_tree_path_free, NULL);
777 index = atoi(str_num);
782 /*---------------------------------------------------------------------------*/
783 static void set_delete_flag_gen(gpointer data, generic_list_t *gen)
789 model = gtk_tree_view_get_model(GTK_TREE_VIEW(gen->listview));
790 if (!model || !gtk_tree_model_get_iter(model, &iter, data)) {
791 g_warning("ERROR: %s(%d)", __FILE__, __LINE__);
794 gtk_tree_model_get(model, &iter, LIST_NUMBER, &str_num, -1);
796 DEBUG_PRINT("index[%d]\n", atoi(str_num));
797 gen->list[atoi(str_num)].selected = 1;
801 gint delete_acl(transition_t *transition,
802 GtkTreeSelection *selection, gint count)
805 char *err_buff = NULL;
809 list = gtk_tree_selection_get_selected_rows(selection, NULL);
810 g_list_foreach(list, (GFunc)set_delete_flag_gen, &(transition->acl));
811 g_list_foreach(list, (GFunc)gtk_tree_path_free, NULL);
814 result = delete_acl_policy(transition->dp, &err_buff,
815 transition->acl.list, transition->acl.count);
817 g_warning("%s", err_buff);
824 gint delete_exp(transition_t *transition,
825 GtkTreeSelection *selection, gint count)
828 char *err_buff = NULL;
831 list = gtk_tree_selection_get_selected_rows(selection, NULL);
832 g_list_foreach(list, (GFunc)set_delete_flag_gen, &(transition->exp));
833 g_list_foreach(list, (GFunc)gtk_tree_path_free, NULL);
836 result = delete_exp_policy(transition->dp, &err_buff,
837 transition->exp.list, transition->exp.count);
839 g_warning("%s", err_buff);
845 /*---------------------------------------------------------------------------*/
846 static void create_tabs(GtkWidget *notebook, GtkWidget *box, gchar *str)
848 GtkWidget *label, *label_box, *menu_box;
851 label_box = gtk_hbox_new(FALSE, 0);
852 label = gtk_label_new(str);
853 gtk_box_pack_start(GTK_BOX(label_box), label, FALSE, TRUE, 0);
854 gtk_widget_show_all(label_box);
856 // create context menu for tab
857 menu_box = gtk_hbox_new(FALSE, 0);
858 label = gtk_label_new(str);
859 gtk_box_pack_start(GTK_BOX(menu_box), label, FALSE, TRUE, 0);
860 gtk_widget_show_all(menu_box);
862 gtk_notebook_append_page_menu(GTK_NOTEBOOK(notebook),
863 box, label_box, menu_box);
866 static void disp_window_title(GtkWidget *window,
867 enum ccs_screen_type current_page)
871 switch((int)current_page) {
872 case CCS_SCREEN_DOMAIN_LIST :
873 case CCS_SCREEN_ACL_LIST :
875 title = is_offline() ?
876 CCS_DISK_POLICY_DIR CCS_DISK_POLICY_DOMAIN_POLICY :
877 CCS_PROC_POLICY_DOMAIN_POLICY;
879 case CCS_SCREEN_EXCEPTION_LIST :
880 title = is_offline() ?
881 CCS_DISK_POLICY_DIR CCS_DISK_POLICY_EXCEPTION_POLICY :
882 CCS_PROC_POLICY_EXCEPTION_POLICY;
884 case CCS_SCREEN_PROFILE_LIST :
885 title = is_offline() ?
886 CCS_DISK_POLICY_DIR CCS_DISK_POLICY_PROFILE :
887 CCS_PROC_POLICY_PROFILE;
890 gtk_window_set_title(GTK_WINDOW(window), title);
893 static void cb_switch_page(GtkWidget *notebook,
894 GtkNotebookPage *page,
898 GtkTreeSelection *selection_tree, *selection_list;
901 old_page_num = gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook));
902 if (page_num == old_page_num)
907 selection_tree = gtk_tree_view_get_selection(
908 GTK_TREE_VIEW(tran->treeview));
909 selection_list = gtk_tree_view_get_selection(
910 GTK_TREE_VIEW(tran->acl.listview));
912 if (tran->task_flag ||
914 gtk_tree_selection_count_selected_rows(selection_tree)))
915 tran->current_page = CCS_SCREEN_DOMAIN_LIST;
916 else if(selection_list &&
917 gtk_tree_selection_count_selected_rows(selection_list))
918 tran->current_page = CCS_SCREEN_ACL_LIST;
920 tran->current_page = CCS_MAXSCREEN;
923 tran->current_page = CCS_SCREEN_EXCEPTION_LIST;
926 tran->current_page = CCS_SCREEN_PROFILE_LIST;
930 disp_window_title(tran->window, tran->current_page);
931 // disp_statusbar(tran, tran->current_page);
932 set_sensitive(tran->actions, tran->task_flag,
935 refresh_transition(NULL, tran);
936 DEBUG_PRINT("page[%2d]\n", page_num);
938 /*---------------------------------------------------------------------------*/
942 GtkWidget *menubar, *toolbar = NULL;
943 GtkWidget *statusbar;
945 GtkWidget *vbox, *vbox2, *vbox3, *vbox4;
948 GtkWidget *domainbar;
949 GtkWidget *treeview, *listview;
950 GtkContainer *container;
951 struct ccs_domain_policy dp = { NULL, 0, NULL };
952 transition_t transition;
954 transition.task_flag = 0;
955 if (get_domain_policy(&dp, &(transition.domain_count)))
957 /*-----------------------------------------------*/
959 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
960 transition.window = window;
961 gtk_window_set_title(GTK_WINDOW(window), _("gpet"));
962 gtk_window_set_icon(GTK_WINDOW(window), get_png_file());
963 gtk_container_set_border_width(GTK_CONTAINER(window), 0);
964 g_signal_connect(G_OBJECT(window), "destroy",
965 G_CALLBACK(gtk_main_quit), NULL);
967 vbox = gtk_vbox_new(FALSE, 1);
968 gtk_container_add(GTK_CONTAINER(window), vbox);
970 // create menu bar & tool bar & popup menu
971 menubar = create_menu(window, &transition, &toolbar);
972 gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0);
973 gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 0);
976 notebook = gtk_notebook_new();
977 gtk_notebook_set_scrollable(GTK_NOTEBOOK(notebook), TRUE);
978 gtk_notebook_popup_enable(GTK_NOTEBOOK(notebook));
979 gtk_box_pack_start(GTK_BOX(vbox), notebook, TRUE, TRUE, 0);
982 statusbar = gtk_statusbar_new();
983 gtk_box_pack_start(GTK_BOX(vbox), statusbar, FALSE, FALSE, 0);
984 contextid = gtk_statusbar_get_context_id(GTK_STATUSBAR(statusbar), "");
985 gtk_statusbar_push(GTK_STATUSBAR(statusbar), contextid, _("gpet"));
988 vbox2 = gtk_vbox_new(FALSE, 1);
989 // create name bar for full domain name
990 domainbar = gtk_entry_new();
991 gtk_box_pack_start(GTK_BOX(vbox2), domainbar, FALSE, FALSE, 0);
992 gtk_editable_set_editable(GTK_EDITABLE(domainbar), FALSE);
993 gtk_entry_set_has_frame(GTK_ENTRY(domainbar), FALSE);
994 gtk_entry_set_text(GTK_ENTRY(domainbar), "");
996 box = gtk_vpaned_new();
997 g_object_set_data(G_OBJECT(window), "pane", box);/* to save config */
998 gtk_container_add(GTK_CONTAINER(vbox2), box);
1000 // create domain transition view
1001 treeview = create_tree_model();
1002 container = create_domain_view(
1003 box, treeview, gtk_paned_pack1, TRUE);
1004 add_tree_data(GTK_TREE_VIEW(treeview), &dp);
1005 gtk_tree_view_expand_all(GTK_TREE_VIEW(treeview));
1006 // ツリーインデント pixel(2.12)
1007 // gtk_tree_view_set_level_indentation(GTK_TREE_VIEW(treeview), 0);
1009 // gtk_tree_view_set_show_expanders(GTK_TREE_VIEW(treeview), TRUE);
1010 g_object_set(G_OBJECT(treeview), "enable-tree-lines", FALSE,
1012 // gtk_tree_view_set_grid_lines(GTK_TREE_VIEW(treeview),
1013 // GTK_TREE_VIEW_GRID_LINES_NONE);
1014 // create domain policy view
1015 listview = create_list_model(TRUE);
1016 create_domain_view(box, listview, gtk_paned_pack2, FALSE);
1018 // copy data pointer
1019 transition.domainbar = domainbar;
1020 transition.container = container;
1021 transition.treeview = treeview;
1022 transition.acl.listview = listview;
1023 transition.statusbar = statusbar;
1024 transition.contextid = contextid;
1025 transition.dp = &dp;
1026 transition.acl.count = 0;
1027 transition.acl.list = NULL;
1028 transition.tsk.treeview = create_task_tree_model(&transition);
1030 // cursor move domain window
1031 g_signal_connect(gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)),
1032 "changed", G_CALLBACK(cb_selection), &transition);
1033 // double click or enter key domain window
1034 g_signal_connect(G_OBJECT(treeview), "row-activated",
1035 G_CALLBACK(cb_initialize_domain), NULL);
1036 // mouse click domain window
1037 g_signal_connect(G_OBJECT(treeview), "button-press-event",
1038 G_CALLBACK(cb_select_domain), &transition);
1039 // mouse click acl window
1040 g_signal_connect(G_OBJECT(listview), "button-press-event",
1041 G_CALLBACK(cb_select_acl), &transition);
1044 vbox3 = gtk_vbox_new(FALSE, 1);
1045 // create exception policy view
1046 listview = create_list_model(TRUE);
1047 create_list_view(vbox3, listview, TRUE);
1048 transition.exp.listview = listview;
1049 // mouse click exception window
1050 g_signal_connect(G_OBJECT(listview), "button-press-event",
1051 G_CALLBACK(cb_select_exp), &transition);
1053 vbox4 = gtk_vbox_new(FALSE, 1);
1054 // create profile view
1055 listview = create_list_model(FALSE);
1056 create_list_view(vbox4, listview, FALSE);
1057 transition.prf.listview = listview;
1058 transition.prf.count = 0;
1059 transition.prf.list = NULL;
1060 if (get_profile(&(transition.prf.list), &(transition.prf.count)))
1061 g_warning("Read error : profile");
1063 add_list_data(&(transition.prf), FALSE);
1064 // mouse click profile window
1065 g_signal_connect(G_OBJECT(listview), "button-press-event",
1066 G_CALLBACK(cb_select_prf), &transition);
1069 create_tabs(notebook, vbox2, _("Domain Transition"));
1070 create_tabs(notebook, vbox3, _("Exception Policy"));
1071 create_tabs(notebook, vbox4, _("Profile"));
1073 /* to save menu.c Process_state() */
1074 g_object_set_data(G_OBJECT(window), "notebook", notebook);
1075 g_object_set_data(G_OBJECT(window), "vbox2", vbox2);
1078 g_signal_connect(G_OBJECT(notebook), "switch_page",
1079 G_CALLBACK(cb_switch_page), &transition);
1081 gtk_tree_view_set_fixed_height_mode(GTK_TREE_VIEW(transition.treeview), TRUE);
1082 gtk_tree_view_set_fixed_height_mode(GTK_TREE_VIEW(transition.acl.listview), TRUE);
1083 gtk_tree_view_set_fixed_height_mode(GTK_TREE_VIEW(transition.exp.listview), TRUE);
1084 gtk_tree_view_set_fixed_height_mode(GTK_TREE_VIEW(transition.prf.listview), TRUE);
1086 read_config(&transition);
1087 gtk_widget_show_all(window);
1093 /*---------------------------------------------------------------------------*/
1094 int main(int argc, char **argv)
1099 bindtextdomain(GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR);
1100 bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
1101 textdomain(GETTEXT_PACKAGE);
1104 gtk_init(&argc, &argv);
1106 result = ccs_main(argc, argv);
1110 /*---------------------------------------------------------------------------*/