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
23 #include <sys/types.h>
34 #include <glib/gi18n.h>
38 /*---------------------------------------------------------------------------*/
39 /* from util.c (ccs-patch-1.8.1-20110505) */
40 static gboolean is_octal_char(const char *str)
42 return *str >= '0' && *str++ <= '3' &&
43 *str >= '0' && *str++ <= '7' &&
44 *str >= '0' && *str <= '7';
46 /* from util.c (ccs-patch-1.8.1-20110505) */
47 static gchar octal_char_to_binary(const char *str)
49 return ((str[0] - '0') << 6) + ((str[1] - '0') << 3) + (str[2] - '0');
52 gchar *decode_from_octal_str(const char *name)
54 gchar *tmp, buff[strlen(name)+1];
60 for( ; *name; name++, tmp++) {
61 if (*name == '\\' && is_octal_char(name + 1)) {
63 *tmp = octal_char_to_binary(name);
71 return g_strdup(buff);
74 /*---------------------------------------------------------------------------*/
75 enum tree_column_pos {
76 COLUMN_INDEX, // data index (invisible)
79 COLUMN_PROFILE, // profile
80 COLUMN_KEEPER_DOMAIN, // #
81 COLUMN_INITIALIZER_TARGET, // *
82 COLUMN_DOMAIN_UNREACHABLE, // !
83 COLUMN_DOMAIN_NAME, // domain name
84 COLUMN_COLOR, // text color
85 COLUMN_REDIRECT, // redirect index (invisible)
88 /*---------------------------------------------------------------------------*/
89 static int add_tree_store(GtkTreeStore *store, GtkTreeIter *parent_iter,
90 struct ccs_domain_policy *dp, int *index, int nest)
93 gchar *color = "black";
94 gchar *str_num, *str_prof, *name;
95 gchar *line = NULL, *is_dis = NULL, *domain;
97 const struct ccs_transition_control_entry *transition_control;
98 int n, number, redirect_index = -1;
100 //g_print("add_tree_store index[%3d] nest[%2d]\n", *index, nest);
102 sp = ccs_domain_name(dp, *index);
104 const char *cp = strchr(sp, ' ');
109 name = decode_from_octal_str(sp);
111 gtk_tree_store_append(store, &iter, parent_iter);
112 number = dp->list[*index].number;
114 str_num = g_strdup_printf("%4d", number);
115 str_prof = dp->list[*index].profile_assigned ?
116 g_strdup_printf("%3u", dp->list[*index].profile) :
119 str_num = g_strdup("");
120 str_prof = g_strdup("");
123 gtk_tree_store_set(store, &iter,
124 COLUMN_INDEX, *index,
125 COLUMN_NUMBER, str_num,
126 COLUMN_COLON, number >= 0 ? ":" : "",
127 COLUMN_PROFILE, str_prof,
128 COLUMN_KEEPER_DOMAIN, dp->list[*index].is_dk ? "#" : " ",
129 COLUMN_INITIALIZER_TARGET, dp->list[*index].is_dit ? "*" : " ",
130 COLUMN_DOMAIN_UNREACHABLE, dp->list[*index].is_du ? "!" : " ",
135 transition_control = dp->list[*index].d_t;
136 if (transition_control && !(dp->list[*index].is_dis)) {
137 line = g_strdup_printf(" ( %s%s from %s )",
138 get_transition_name(transition_control->type),
139 transition_control->program ?
140 transition_control->program->name : "any",
141 transition_control->domainname ?
142 transition_control->domainname->name : "any");
144 transition_control->type == CCS_TRANSITION_CONTROL_KEEP ?
146 } else if (dp->list[*index].is_dis) { /* initialize_domain */
147 is_dis = g_strdup_printf(CCS_ROOT_NAME "%s",
148 strrchr(ccs_domain_name(dp, *index), ' '));
149 redirect_index = ccs_find_domain(dp, is_dis, false, false);
152 if (redirect_index >= 0)
153 is_dis = g_strdup_printf(" ( -> %d )",
154 dp->list[redirect_index].number);
156 is_dis = g_strdup_printf(" ( -> Not Found )");
157 } else if (dp->list[*index].is_dd) { /* delete_domain */
160 domain = g_strdup_printf("%s%s%s%s%s",
161 dp->list[*index].is_dd ? "( " : "",
163 dp->list[*index].is_dd ? " )" : "",
167 gtk_tree_store_set(store, &iter, COLUMN_DOMAIN_NAME, domain,
169 COLUMN_REDIRECT, redirect_index, -1);
177 while (*index < dp->list_len) {
178 sp = ccs_domain_name(dp, *index);
180 const char *cp = strchr(sp, ' ');
187 n = add_tree_store(store, &iter, dp, index, n);
195 void add_tree_data(GtkTreeView *treeview, struct ccs_domain_policy *dp)
198 GtkTreeIter *iter = NULL;
199 int index = 0, nest = -1;
201 store = GTK_TREE_STORE(gtk_tree_view_get_model(treeview));
202 gtk_tree_store_clear(store); // TODO 遅い
203 add_tree_store(store, iter, dp, &index, nest);
205 /*---------------------------------------------------------------------------*/
206 static GtkTreeViewColumn *column_add(
207 GtkCellRenderer *renderer,
208 const GtkWidget *treeview,
210 enum tree_column_pos pos,
211 const gchar *attribute,
215 GtkTreeViewColumn *column;
217 g_object_set(renderer, "xalign", xalign, "ypad", 0, NULL);
218 column = gtk_tree_view_column_new_with_attributes(
219 title, renderer, attribute, pos, NULL);
220 gtk_tree_view_column_add_attribute(column, renderer,
221 "foreground", COLUMN_COLOR);
222 // gtk_tree_view_column_set_alignment(column, xalign);
223 gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
227 /*---------------------------------------------------------------------------*/
229 static void cb_status_toggled(GtkCellRendererToggle *renderer,
238 model = gtk_tree_view_get_model(GTK_TREE_VIEW(user_data));
239 path = gtk_tree_path_new_from_string(path_string);
241 gtk_tree_model_get_iter(model, &iter, path);
242 gtk_tree_model_get(model, &iter, COLUMN_INDEX, &status, -1);
243 gtk_tree_store_set(GTK_TREE_STORE(model), &iter,
244 COLUMN_INDEX, !status, -1);
245 gtk_tree_path_free(path);
248 /*---------------------------------------------------------------------------*/
249 static GtkWidget *create_tree_model(void)
253 // GtkCellRenderer *renderer;
254 GtkTreeViewColumn *column;
256 store = gtk_tree_store_new(N_COLUMNS_TREE,
267 treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
268 g_object_unref(store);
271 // renderer = gtk_cell_renderer_toggle_new();
272 // g_signal_connect(renderer, "toggled",
273 // G_CALLBACK(cb_status_toggled), treeview);
275 renderer = gtk_cell_renderer_text_new();
276 g_object_set(renderer, "visible", FALSE, NULL);
277 column = column_add(renderer, treeview,
278 "", COLUMN_INDEX, "text", 0.0);
280 column = column_add(gtk_cell_renderer_text_new(), treeview,
281 "No.", COLUMN_NUMBER, "text", 1.0);
282 column = column_add(gtk_cell_renderer_text_new(), treeview,
283 " ", COLUMN_COLON, "text", 0.5);
284 column = column_add(gtk_cell_renderer_text_new(), treeview,
285 "prof", COLUMN_PROFILE, "text", 1.0);
286 column = column_add(gtk_cell_renderer_text_new(), treeview,
287 "#", COLUMN_KEEPER_DOMAIN, "text", 0.5);
288 column = column_add(gtk_cell_renderer_text_new(), treeview,
289 "*", COLUMN_INITIALIZER_TARGET, "text", 0.5);
290 column = column_add(gtk_cell_renderer_text_new(), treeview,
291 "!", COLUMN_DOMAIN_UNREACHABLE, "text", 0.5);
292 column = column_add(gtk_cell_renderer_text_new(), treeview,
293 "Domain Name", COLUMN_DOMAIN_NAME, "text", 0.0);
295 gtk_tree_view_set_expander_column(GTK_TREE_VIEW(treeview), column);
296 // gtk_tree_view_column_set_spacing(column, 1);
298 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), FALSE);
302 /*---------------------------------------------------------------------------*/
303 enum list_column_pos {
311 void add_list_data(generic_list_t *generic, gboolean alias_flag)
316 gchar *str_num, *profile, *alias;
318 store = GTK_LIST_STORE(gtk_tree_view_get_model(
319 GTK_TREE_VIEW(generic->listview)));
321 gtk_list_store_clear(store);
322 for(i = 0; i < generic->count; i++){
323 str_num = g_strdup_printf("%4d", i);
324 gtk_list_store_append(store, &iter);
327 gchar *ope = decode_from_octal_str(
328 generic->list[i].operand);
331 ccs_directives[generic->list[i].directive].alias;
332 gtk_list_store_set(store, &iter,
333 LIST_NUMBER, str_num,
336 // LIST_OPERAND, generic->list[i].operand,
337 LIST_OPERAND, ope, // test
341 profile = g_strdup_printf("%3u-",
342 generic->list[i].directive);
343 alias = g_strdup_printf("%s%s",
344 generic->list[i].directive < 256 ?
346 generic->list[i].operand);
347 gtk_list_store_set(store, &iter,
348 LIST_NUMBER, str_num,
359 static void disable_header_focus(GtkTreeViewColumn *column, const gchar *str)
361 GtkWidget *label, *dummy;
362 GtkButton *button = GTK_BUTTON(gtk_button_new());
364 label = gtk_label_new(str);
365 gtk_tree_view_column_set_widget(column, label);
366 gtk_widget_show(label);
367 dummy = gtk_tree_view_column_get_widget(column);
369 // g_print("<%s:%p> ", g_type_name(G_OBJECT_TYPE(dummy)), dummy);
371 g_object_set(G_OBJECT(dummy), "can-focus", FALSE, NULL);
372 // gtk_widget_set_can_focus(dummy, FALSE); // 2.18
373 if (G_OBJECT_TYPE(dummy) == G_OBJECT_TYPE(button))
375 dummy = gtk_widget_get_parent(dummy);
380 static GtkWidget *create_list_model(gboolean alias_flag)
383 GtkListStore *liststore;
384 GtkCellRenderer *renderer;
385 GtkTreeViewColumn *column;
387 liststore = gtk_list_store_new(N_COLUMNS_LIST,
388 G_TYPE_STRING, G_TYPE_STRING,
389 G_TYPE_STRING, G_TYPE_STRING);
390 treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(liststore));
391 g_object_unref(liststore);
393 renderer = gtk_cell_renderer_text_new();
394 g_object_set(renderer, "xalign", 1.0, "ypad", 0, NULL);
395 column = gtk_tree_view_column_new_with_attributes(
396 "No.", renderer, "text", LIST_NUMBER, NULL);
397 gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
398 gtk_tree_view_column_set_sort_column_id(column, LIST_NUMBER);
399 // gtk_tree_view_column_set_alignment(column, 1.0);
400 disable_header_focus(column, "No.");
402 renderer = gtk_cell_renderer_text_new();
403 column = gtk_tree_view_column_new_with_attributes(" ", renderer,
404 "text", LIST_COLON, NULL);
405 gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
406 disable_header_focus(column, " ");
409 renderer = gtk_cell_renderer_text_new();
410 column = gtk_tree_view_column_new_with_attributes(
411 "directive", renderer, "text", LIST_ALIAS, NULL);
412 gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
413 gtk_tree_view_column_set_sort_column_id(column, LIST_ALIAS);
414 disable_header_focus(column, "directive");
417 renderer = gtk_cell_renderer_text_new();
418 column = gtk_tree_view_column_new_with_attributes("operand", renderer,
419 "text", LIST_OPERAND, NULL);
420 gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
421 gtk_tree_view_column_set_sort_column_id(column, LIST_OPERAND);
422 disable_header_focus(column, "operand");
425 // gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), TRUE);
429 /*---------------------------------------------------------------------------*/
430 gint get_current_domain_index(transition_t *transition)
432 GtkTreeSelection *selection;
438 selection = gtk_tree_view_get_selection(
439 GTK_TREE_VIEW(transition->treeview));
441 gtk_tree_selection_count_selected_rows(selection)) {
442 list = gtk_tree_selection_get_selected_rows(selection, NULL);
443 model = gtk_tree_view_get_model(
444 GTK_TREE_VIEW(transition->treeview));
445 gtk_tree_model_get_iter(model, &iter, g_list_first(list)->data);
446 gtk_tree_model_get(model, &iter, COLUMN_INDEX, &index, -1);
447 g_list_foreach(list, (GFunc)gtk_tree_path_free, NULL);
450 DEBUG_PRINT("select Domain index[%d]\n", index);
454 gchar *get_alias_and_operand(GtkWidget *view, gboolean alias_flag)
456 GtkTreeSelection *selection;
460 gchar *alias = NULL, *operand = NULL,
463 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
465 gtk_tree_selection_count_selected_rows(selection)) {
466 list = gtk_tree_selection_get_selected_rows(selection, NULL);
467 model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
468 gtk_tree_model_get_iter(model, &iter, g_list_first(list)->data);
470 gtk_tree_model_get(model, &iter,
471 LIST_ALIAS, &alias, LIST_OPERAND, &operand, -1);
472 str_buff = g_strdup_printf("%s %s", alias, operand);
476 gtk_tree_model_get(model, &iter,
477 LIST_OPERAND, &operand, -1);
478 str_buff = g_strchug(operand);
484 /*---------------------------------------------------------------------------*/
485 static gboolean move_pos_list(GtkTreeModel *model, GtkTreePath *path,
486 GtkTreeIter *iter, transition_t *transition)
488 GtkWidget *view = NULL;
489 GtkTreeSelection *selection;
491 gchar *alias = NULL, *operand = NULL;
492 gchar *entry, *str_buff = NULL;
496 entry = get_combo_entry_last();
498 switch((int)transition->addentry) {
499 case ADDENTRY_DOMAIN_LIST :
500 view = transition->treeview;
501 gtk_tree_model_get(model, iter, COLUMN_INDEX, &index, -1);
502 str_buff = decode_from_octal_str(
503 ccs_domain_name(transition->dp, index));
504 cmp = strcmp(entry, str_buff);
506 case ADDENTRY_ACL_LIST :
507 view = transition->acl.listview;
508 gtk_tree_model_get(model, iter,
509 LIST_ALIAS, &alias, LIST_OPERAND, &operand, -1);
510 str_buff = g_strdup_printf("%s %s", alias, operand); // TODO
511 cmp = strcmp(entry, str_buff);
512 //g_print("%2d[%s][%s]\n", cmp, entry, str_buff);
514 case ADDENTRY_EXCEPTION_LIST :
515 view = transition->exp.listview;
516 gtk_tree_model_get(model, iter,
517 LIST_ALIAS, &alias, LIST_OPERAND, &operand, -1);
518 str_buff = g_strdup_printf("%s %s", alias, operand); // TODO
519 cmp = strcmp(entry, str_buff);
521 case ADDENTRY_PROFILE_LIST :
522 view = transition->prf.listview;
523 gtk_tree_model_get(model, iter, LIST_NUMBER, &str_buff, -1);
524 cmp = atoi(entry) - transition->prf.list[atoi(str_buff)].directive;
525 //g_print("entry[%s] [%s:%d]\n", entry, str_buff, transition->prf.list[atoi(str_buff)].directive);
533 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
536 gtk_tree_selection_unselect_path(selection, path);
539 gtk_tree_selection_select_path(selection, path);
542 gchar *path_str = gtk_tree_path_to_string(path);
543 g_print("Put Path[%s]\n", path_str);
551 void set_position_addentry(transition_t *transition, GtkTreePath **path)
553 GtkWidget *view = NULL;
555 GtkTreeSelection *selection;
559 switch((int)transition->addentry) {
563 case ADDENTRY_DOMAIN_LIST :
564 view = transition->treeview;
566 case ADDENTRY_ACL_LIST :
567 view = transition->acl.listview;
569 case ADDENTRY_EXCEPTION_LIST :
570 view = transition->exp.listview;
572 case ADDENTRY_PROFILE_LIST :
573 view = transition->prf.listview;
577 model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
578 gtk_tree_model_foreach(model,
579 (GtkTreeModelForeachFunc)move_pos_list, transition);
580 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
581 list = gtk_tree_selection_get_selected_rows(selection, NULL);
583 gtk_tree_path_free(*path);
584 (*path) = gtk_tree_path_copy(g_list_first(list)->data);
585 g_list_foreach(list, (GFunc)gtk_tree_path_free, NULL);
588 transition->addentry = ADDENTRY_NON;
592 gchar *path_str = gtk_tree_path_to_string(*path);
593 g_print("Get Path[%s]\n", path_str);
598 /*---------------------------------------------------------------------------*/
599 static void cb_selection(GtkTreeSelection *selection,
600 transition_t *transition)
607 GtkTreePath *path = NULL;
608 GtkTreeViewColumn *column = NULL;
611 DEBUG_PRINT("In **************************** \n");
612 select_count = gtk_tree_selection_count_selected_rows(selection);
613 DEBUG_PRINT("select count[%d]\n", select_count);
614 if (0 == select_count)
617 model = gtk_tree_view_get_model(
618 GTK_TREE_VIEW(transition->treeview));
619 list = gtk_tree_selection_get_selected_rows(selection, NULL);
620 gtk_tree_model_get_iter(model, &iter, g_list_first(list)->data);
621 g_list_foreach(list, (GFunc)gtk_tree_path_free, NULL);
623 gtk_tree_model_get(model, &iter, COLUMN_INDEX, &index, -1);
624 DEBUG_PRINT("--- index [%4d] ---\n", index);
625 name = decode_from_octal_str(ccs_domain_name(transition->dp, index));
626 gtk_entry_set_text(GTK_ENTRY(transition->domainbar), name);
629 gtk_tree_view_get_cursor(GTK_TREE_VIEW(
630 transition->acl.listview), &path, &column);
632 get_acl_list(transition->dp, index,
633 &(transition->acl.list), &(transition->acl.count));
634 add_list_data(&(transition->acl), TRUE);
636 if (transition->acl.count) {
637 set_position_addentry(transition, &path);
638 DEBUG_PRINT("ACL count<%d>\n", transition->acl.count);
640 view_cursor_set(transition->acl.listview, path, column);
641 // gtk_widget_grab_focus(transition->acl.listview);
642 disp_statusbar(transition, CCS_SCREEN_ACL_LIST);
643 } else { /* delete_domain or initializer_source */
644 disp_statusbar(transition, CCS_MAXSCREEN);
646 DEBUG_PRINT("Out **************************** \n");
649 static void cb_selection (GtkTreeView *treeview,
650 transition_t *transition)
652 GtkTreeSelection *selection;
658 GtkTreePath *path = NULL;
659 GtkTreeViewColumn *column = NULL;
661 DEBUG_PRINT("In **************************** \n");
662 selection = gtk_tree_view_get_selection(treeview);
663 select_count = gtk_tree_selection_count_selected_rows(selection);
664 DEBUG_PRINT("select count[%d]\n", select_count);
665 if (0 == select_count)
668 model = gtk_tree_view_get_model(
669 GTK_TREE_VIEW(transition->treeview));
670 list = gtk_tree_selection_get_selected_rows(selection, NULL);
671 gtk_tree_model_get_iter(model, &iter, g_list_first(list)->data);
672 g_list_foreach(list, (GFunc)gtk_tree_path_free, NULL);
674 gtk_tree_model_get(model, &iter, COLUMN_INDEX, &index, -1);
675 DEBUG_PRINT("--- index [%4d] ---\n", index);
676 gtk_entry_set_text(GTK_ENTRY(transition->domainbar),
677 ccs_domain_name(transition->dp, index));
679 gtk_tree_view_get_cursor(GTK_TREE_VIEW(
680 transition->acl.listview), &path, &column);
682 get_acl_list(transition->dp, index,
683 &(transition->acl.list), &(transition->acl.count));
684 add_list_data(&(transition->acl), TRUE);
686 if (transition->acl.count) {
687 DEBUG_PRINT("ACL count<%d>\n", transition->acl.count);
689 view_cursor_set(transition->acl.listview, path, column);
690 disp_statusbar(transition, CCS_SCREEN_ACL_LIST);
691 } else { /* delete_domain or initializer_source */
692 disp_statusbar(transition, CCS_MAXSCREEN);
694 DEBUG_PRINT("Out **************************** \n");
697 /*---------------------------------------------------------------------------*/
704 static gboolean find_is_dis(GtkTreeModel *model, GtkTreePath *path,
705 GtkTreeIter *iter, struct FindIsDis_t *data)
709 gtk_tree_model_get(model, iter, COLUMN_INDEX, &index, -1);
710 if (data->redirect_index == index) {
712 data->path = gtk_tree_path_copy(path);
718 static void cb_initialize_domain(GtkTreeView *treeview, GtkTreePath *treepath,
719 GtkTreeViewColumn treeviewcolumn, gpointer dummy)
724 struct FindIsDis_t data;
726 DEBUG_PRINT("In **************************** \n");
727 model = gtk_tree_view_get_model(treeview);
728 ret = gtk_tree_model_get_iter(model, &iter, treepath);
730 gtk_tree_model_get(model, &iter,
731 COLUMN_REDIRECT, &data.redirect_index, -1);
732 DEBUG_PRINT("redirect_index[%d]\n", data.redirect_index);
733 if (!ret || data.redirect_index < 0)
734 return; /* not initialize_domain */
737 gtk_tree_model_foreach(model,
738 (GtkTreeModelForeachFunc)find_is_dis, &data);
742 gchar *path_str = gtk_tree_path_to_string(data.path);
743 DEBUG_PRINT("TreePath[%s]\n", path_str);
746 GtkTreeViewColumn *column = NULL;
747 gtk_tree_view_expand_to_path(GTK_TREE_VIEW(treeview), data.path);
748 gtk_tree_selection_select_iter(
749 gtk_tree_view_get_selection(
750 GTK_TREE_VIEW(treeview)), &data.iter);
751 DEBUG_PRINT("Domain ");
752 view_cursor_set(GTK_WIDGET(treeview), data.path, column);
754 DEBUG_PRINT("Out **************************** \n");
756 /*---------------------------------------------------------------------------*/
757 void set_sensitive(GtkActionGroup *actions, int task_flag,
758 enum ccs_screen_type current_page)
760 gboolean sens_edt, sens_add, sens_del, sens_tsk,
761 sens_dch, sens_cpy, sens_opt;
763 sens_edt = sens_add = sens_del = sens_tsk =
764 sens_dch = sens_cpy = sens_opt = FALSE;
766 switch((int)current_page) {
767 case CCS_SCREEN_DOMAIN_LIST :
778 case CCS_SCREEN_ACL_LIST :
786 case CCS_SCREEN_EXCEPTION_LIST :
791 case CCS_SCREEN_PROFILE_LIST :
798 gtk_action_set_sensitive(gtk_action_group_get_action(
799 actions, "Edit"), sens_edt);
800 gtk_action_set_sensitive(gtk_action_group_get_action(
801 actions, "Add"), sens_add);
802 gtk_action_set_sensitive(gtk_action_group_get_action(
803 actions, "Delete"), sens_del);
804 gtk_action_set_sensitive(gtk_action_group_get_action(
805 actions, "ACL"), sens_dch);
806 gtk_action_set_sensitive(gtk_action_group_get_action(
807 actions, "Copy"), sens_cpy);
808 gtk_action_set_sensitive(gtk_action_group_get_action(
809 actions, "OptimizationSupport"), sens_opt);
812 gtk_action_set_sensitive(gtk_action_group_get_action(
813 actions, "Process"), sens_tsk);
816 static gint popup_menu(transition_t *transition, guint button)
820 /* get menu.c create_menu()*/
821 popup = g_object_get_data(
822 G_OBJECT(transition->window), "popup");
824 gtk_menu_popup(GTK_MENU(popup), NULL, NULL, NULL, NULL,
825 0, gtk_get_current_event_time());
832 static gboolean cb_select_domain(GtkTreeView *treeview, GdkEventButton *event,
833 transition_t *transition)
835 transition->current_page = CCS_SCREEN_DOMAIN_LIST;
837 set_sensitive(transition->actions, transition->task_flag,
838 transition->current_page);
839 if (event->button == 3) {
841 /* get menu.c create_menu()*/
842 popup = g_object_get_data(
843 G_OBJECT(transition->window), "popup");
845 gtk_menu_popup(GTK_MENU(popup), NULL, NULL, NULL, NULL,
846 0, gtk_get_current_event_time());
853 static gboolean cb_select_acl(GtkTreeView *listview, GdkEventButton *event,
854 transition_t *transition)
856 transition->current_page = CCS_SCREEN_ACL_LIST;
857 set_sensitive(transition->actions, transition->task_flag,
858 transition->current_page);
859 return popup_menu(transition, event->button);
862 static gboolean cb_select_exp(GtkTreeView *listview, GdkEventButton *event,
863 transition_t *transition)
865 transition->current_page = CCS_SCREEN_EXCEPTION_LIST;
866 set_sensitive(transition->actions, transition->task_flag,
867 transition->current_page);
868 return popup_menu(transition, event->button);
871 static gboolean cb_select_prf(GtkTreeView *listview, GdkEventButton *event,
872 transition_t *transition)
874 transition->current_page = CCS_SCREEN_PROFILE_LIST;
875 set_sensitive(transition->actions, transition->task_flag,
876 transition->current_page);
877 return popup_menu(transition, event->button);
879 /*---------------------------------------------------------------------------*/
880 static gboolean inc_search(GtkTreeModel *model, gint column,
881 const gchar *key, GtkTreeIter *iter, gpointer search_data)
886 gtk_tree_model_get(model, iter, column, &buff, -1);
887 DEBUG_PRINT("key[%s] buff[%s]\n", key, buff);
888 ret = g_strrstr(buff, key) ? FALSE : TRUE;
894 void view_setting(GtkWidget *treeview, gint search_column)
897 gtk_tree_selection_set_mode(
898 gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)),
899 GTK_SELECTION_MULTIPLE);
901 gtk_tree_view_set_rubber_banding(GTK_TREE_VIEW(treeview), TRUE);
903 gtk_tree_view_set_search_column(GTK_TREE_VIEW(treeview),
905 gtk_tree_view_set_enable_search(GTK_TREE_VIEW(treeview), TRUE);
906 gtk_tree_view_set_search_equal_func(GTK_TREE_VIEW(treeview),
907 (GtkTreeViewSearchEqualFunc)inc_search, NULL, NULL);
910 /*---------------------------------------------------------------------------*/
911 static GtkContainer *create_domain_view(GtkWidget *paned,
912 GtkWidget *treeview, void (*paned_pack)(),
914 GtkWidget *acl_window, gboolean *acl_detached)
916 GtkWidget *scrolledwin;
917 GtkContainer *container;
919 scrolledwin = gtk_scrolled_window_new(NULL, NULL);
920 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwin),
921 GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
922 gtk_scrolled_window_set_shadow_type(
923 GTK_SCROLLED_WINDOW(scrolledwin), GTK_SHADOW_IN);
925 paned_pack(GTK_PANED(paned), scrolledwin, resize, TRUE);
928 view_setting(treeview, LIST_OPERAND);
930 view_setting(treeview, COLUMN_DOMAIN_NAME);
933 container = GTK_CONTAINER(scrolledwin);
934 gtk_container_add(container, treeview);
938 /*---------------------------------------------------------------------------*/
939 static void create_list_view(GtkWidget *box, GtkWidget *listview,
942 GtkWidget *scrolledwin;
944 scrolledwin = gtk_scrolled_window_new(NULL, NULL);
945 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwin),
946 GTK_POLICY_AUTOMATIC,
948 gtk_scrolled_window_set_shadow_type(
949 GTK_SCROLLED_WINDOW(scrolledwin), GTK_SHADOW_IN);
950 gtk_box_pack_start(GTK_BOX(box), scrolledwin, TRUE, TRUE, 0);
951 gtk_container_add(GTK_CONTAINER(scrolledwin), listview);
955 gtk_tree_selection_set_mode(
956 gtk_tree_view_get_selection(
957 GTK_TREE_VIEW(listview)),
958 GTK_SELECTION_MULTIPLE);
960 gtk_tree_view_set_rubber_banding(
961 GTK_TREE_VIEW(listview), TRUE);
964 gtk_tree_view_set_search_column(
965 GTK_TREE_VIEW(listview), LIST_OPERAND);
966 gtk_tree_view_set_enable_search(
967 GTK_TREE_VIEW(listview), TRUE);
968 gtk_tree_view_set_search_equal_func(GTK_TREE_VIEW(listview),
969 (GtkTreeViewSearchEqualFunc)inc_search, NULL, NULL);
971 /*---------------------------------------------------------------------------*/
972 static void set_select_flag_domain(gpointer data,
973 transition_t *transition)
978 struct ccs_domain_policy *dp = transition->dp;
981 model = gtk_tree_view_get_model(
982 GTK_TREE_VIEW(transition->treeview));
983 if (!model || !gtk_tree_model_get_iter(model, &iter, data)) {
984 g_warning("ERROR: %s(%d)", __FILE__, __LINE__);
987 gtk_tree_model_get(model, &iter, COLUMN_INDEX, &index, -1);
989 DEBUG_PRINT("index[%d]\n", index);
990 /* deleted_domain or initializer_source */
991 if (!(dp->list[index].is_dd) && !(dp->list[index].is_dis))
992 dp->list_selected[index] = 1;
995 gint delete_domain(transition_t *transition,
996 GtkTreeSelection *selection, gint count)
999 char *err_buff = NULL;
1003 list = gtk_tree_selection_get_selected_rows(selection, NULL);
1004 g_list_foreach(list, (GFunc)set_select_flag_domain, transition);
1006 g_list_foreach(list, (GFunc)gtk_tree_path_free, NULL);
1009 result = delete_domain_policy(transition->dp, &err_buff);
1011 g_warning("%s", err_buff);
1017 /*---------------------------------------------------------------------------*/
1018 gint set_domain_profile(transition_t *transition,
1019 GtkTreeSelection *selection, guint profile)
1023 char *err_buff = NULL;
1026 list = gtk_tree_selection_get_selected_rows(selection, NULL);
1027 if (transition->task_flag)
1028 g_list_foreach(list, (GFunc)set_select_flag_process,
1029 &(transition->tsk));
1031 g_list_foreach(list, (GFunc)set_select_flag_domain,
1034 g_list_foreach(list, (GFunc)gtk_tree_path_free, NULL);
1037 profile_str = g_strdup_printf("%u", profile);
1038 result = set_profile(transition->dp, profile_str, &err_buff);
1039 // g_free(profile_str); → editpolicy.c
1041 g_warning("%s", err_buff);
1047 /*---------------------------------------------------------------------------*/
1048 gboolean disp_acl_line(GtkTreeModel *model, GtkTreePath *path,
1049 GtkTreeIter *iter, generic_list_t *acl)
1051 GtkTreeSelection *selection;
1054 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(acl->listview));
1056 gtk_tree_model_get(model, iter, LIST_NUMBER, &str_num, -1);
1058 if (acl->list[atoi(str_num)].selected) {
1060 gchar *str_path = gtk_tree_path_to_string(path);
1061 g_print("select[%d] path[%s]\n", atoi(str_num), str_path);
1064 gtk_tree_selection_select_path(selection, path);
1066 gtk_tree_selection_unselect_path(selection, path);
1073 gint select_list_line(generic_list_t *gen)
1075 GtkTreeSelection *selection;
1077 GtkTreeModel *model;
1082 selection = gtk_tree_view_get_selection(
1083 GTK_TREE_VIEW(gen->listview));
1085 !gtk_tree_selection_count_selected_rows(selection))
1088 list = gtk_tree_selection_get_selected_rows(selection, NULL);
1092 model = gtk_tree_view_get_model(GTK_TREE_VIEW(gen->listview));
1093 gtk_tree_model_get_iter(model, &iter, g_list_first(list)->data);
1094 gtk_tree_model_get(model, &iter, LIST_NUMBER, &str_num, -1);
1095 g_list_foreach(list, (GFunc)gtk_tree_path_free, NULL);
1098 index = atoi(str_num);
1103 /*---------------------------------------------------------------------------*/
1104 static void set_delete_flag_gen(gpointer data, generic_list_t *gen)
1106 GtkTreeModel *model;
1110 model = gtk_tree_view_get_model(GTK_TREE_VIEW(gen->listview));
1111 if (!model || !gtk_tree_model_get_iter(model, &iter, data)) {
1112 g_warning("ERROR: %s(%d)", __FILE__, __LINE__);
1115 gtk_tree_model_get(model, &iter, LIST_NUMBER, &str_num, -1);
1117 DEBUG_PRINT("index[%d]\n", atoi(str_num));
1118 gen->list[atoi(str_num)].selected = 1;
1122 gint delete_acl(transition_t *transition,
1123 GtkTreeSelection *selection, gint count)
1126 char *err_buff = NULL;
1130 list = gtk_tree_selection_get_selected_rows(selection, NULL);
1131 g_list_foreach(list, (GFunc)set_delete_flag_gen, &(transition->acl));
1132 g_list_foreach(list, (GFunc)gtk_tree_path_free, NULL);
1135 result = delete_acl_policy(transition->dp, &err_buff,
1136 transition->acl.list, transition->acl.count);
1138 g_warning("%s", err_buff);
1145 gint delete_exp(transition_t *transition,
1146 GtkTreeSelection *selection, gint count)
1149 char *err_buff = NULL;
1152 list = gtk_tree_selection_get_selected_rows(selection, NULL);
1153 g_list_foreach(list, (GFunc)set_delete_flag_gen, &(transition->exp));
1154 g_list_foreach(list, (GFunc)gtk_tree_path_free, NULL);
1157 result = delete_exp_policy(transition->dp, &err_buff,
1158 transition->exp.list, transition->exp.count);
1160 g_warning("%s", err_buff);
1166 /*---------------------------------------------------------------------------*/
1167 static void create_tabs(GtkWidget *notebook, GtkWidget *box, gchar *str)
1169 GtkWidget *label, *label_box, *menu_box;
1172 label_box = gtk_hbox_new(FALSE, 0);
1173 label = gtk_label_new(str);
1174 gtk_box_pack_start(GTK_BOX(label_box), label, FALSE, TRUE, 0);
1175 gtk_widget_show_all(label_box);
1177 // create context menu for tab
1178 menu_box = gtk_hbox_new(FALSE, 0);
1179 label = gtk_label_new(str);
1180 gtk_box_pack_start(GTK_BOX(menu_box), label, FALSE, TRUE, 0);
1181 gtk_widget_show_all(menu_box);
1183 gtk_notebook_append_page_menu(GTK_NOTEBOOK(notebook),
1184 box, label_box, menu_box);
1187 gchar *disp_window_title(enum ccs_screen_type current_page)
1190 gchar *title = NULL;
1191 const char *dir = get_policy_dir();
1192 enum mode_enum {e_off, e_net, e_on, e_end};
1193 const gchar *mode[e_end] = {_("offline"), _("nework"), _("online")};
1196 switch((int)current_page) {
1197 case CCS_SCREEN_DOMAIN_LIST :
1198 case CCS_SCREEN_ACL_LIST :
1200 title = g_strdup_printf("%s - %s%s%s", mode[e_off], dir,
1201 CCS_DISK_POLICY_DIR, CCS_DISK_POLICY_DOMAIN_POLICY);
1202 else if (is_network())
1203 title = g_strdup_printf("%s(%s) - %s", mode[e_net],
1204 get_remote_ip(str_ip),
1205 CCS_PROC_POLICY_DOMAIN_POLICY);
1207 title = g_strdup_printf("%s - %s", mode[e_on],
1208 CCS_PROC_POLICY_DOMAIN_POLICY);
1210 case CCS_SCREEN_EXCEPTION_LIST :
1212 title = g_strdup_printf("%s - %s%s%s", mode[e_off], dir,
1213 CCS_DISK_POLICY_DIR, CCS_DISK_POLICY_EXCEPTION_POLICY);
1214 else if (is_network())
1215 title = g_strdup_printf("%s(%s) - %s", mode[e_net],
1216 get_remote_ip(str_ip),
1217 CCS_PROC_POLICY_EXCEPTION_POLICY);
1219 title = g_strdup_printf("%s - %s", mode[e_on],
1220 CCS_PROC_POLICY_EXCEPTION_POLICY);
1222 case CCS_SCREEN_PROFILE_LIST :
1224 title = g_strdup_printf("%s - %s%s%s", mode[e_off], dir,
1225 CCS_DISK_POLICY_DIR, CCS_DISK_POLICY_PROFILE);
1226 else if (is_network())
1227 title = g_strdup_printf("%s(%s) - %s", mode[e_net],
1228 get_remote_ip(str_ip),
1229 CCS_PROC_POLICY_PROFILE);
1231 title = g_strdup_printf("%s - %s", mode[e_on],
1232 CCS_PROC_POLICY_PROFILE);
1234 case CCS_SCREEN_STAT_LIST :
1236 title = g_strdup_printf("%s: %s(%s) - %s",
1237 _("Statistics"), mode[e_net],
1238 get_remote_ip(str_ip),
1239 CCS_PROC_POLICY_STAT);
1241 title = g_strdup_printf("%s: %s - %s",
1242 _("Statistics"), mode[e_on],
1243 CCS_PROC_POLICY_STAT);
1245 case CCS_SCREEN_MANAGER_LIST :
1247 title = g_strdup_printf("%s: %s - %s%s%s",
1248 _("Manager Policy"), mode[e_off], dir,
1249 CCS_DISK_POLICY_DIR, CCS_DISK_POLICY_MANAGER);
1250 else if (is_network())
1251 title = g_strdup_printf("%s: %s(%s) - %s",
1252 _("Manager Policy"), mode[e_net],
1253 get_remote_ip(str_ip),
1254 CCS_PROC_POLICY_MANAGER);
1256 title = g_strdup_printf("%s: %s - %s",
1257 _("Manager Policy"), mode[e_on],
1258 CCS_PROC_POLICY_MANAGER);
1260 case CCS_MAXSCREEN :
1262 title = g_strdup_printf("%s: %s - %s%s%s",
1263 _("Domain Policy Editor"), mode[e_off], dir,
1264 CCS_DISK_POLICY_DIR, CCS_DISK_POLICY_DOMAIN_POLICY);
1265 else if (is_network())
1266 title = g_strdup_printf("%s: %s(%s) - %s",
1267 _("Domain Policy Editor"), mode[e_net],
1268 get_remote_ip(str_ip),
1269 CCS_PROC_POLICY_DOMAIN_POLICY);
1271 title = g_strdup_printf("%s: %s - %s",
1272 _("Domain Policy Editor"), mode[e_on],
1273 CCS_PROC_POLICY_DOMAIN_POLICY);
1280 static void control_acl_window(transition_t *tran)
1282 static gint x, y, w, h;
1283 static gboolean saved_flag = FALSE;
1285 if (tran->current_page == CCS_SCREEN_ACL_LIST) {
1286 gtk_window_move(GTK_WINDOW(tran->acl_window), x, y);
1287 gtk_window_set_default_size(
1288 GTK_WINDOW(tran->acl_window), w, h);
1290 gtk_widget_show(tran->acl_window);
1293 gtk_window_get_position(
1294 GTK_WINDOW(tran->acl_window), &x, &y);
1295 gtk_window_get_size(
1296 GTK_WINDOW(tran->acl_window), &w, &h);
1299 gtk_widget_hide(tran->acl_window);
1303 static void cb_switch_page(GtkWidget *notebook,
1304 GtkNotebookPage *page,
1308 GtkTreeSelection *selection_tree, *selection_list;
1312 old_page_num = gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook));
1313 if (page_num == old_page_num)
1316 DEBUG_PRINT("In Tab[%d]\n", page_num);
1319 selection_tree = gtk_tree_view_get_selection(
1320 GTK_TREE_VIEW(tran->treeview));
1321 selection_list = gtk_tree_view_get_selection(
1322 GTK_TREE_VIEW(tran->acl.listview));
1324 if (tran->acl_detached) {
1325 if(selection_list &&
1326 gtk_tree_selection_count_selected_rows(selection_list))
1327 tran->current_page = CCS_SCREEN_ACL_LIST;
1328 control_acl_window(tran);
1329 g_object_set(G_OBJECT(notebook), "can-focus", FALSE, NULL);
1331 if (tran->task_flag ||
1333 gtk_tree_selection_count_selected_rows(selection_tree)))
1334 tran->current_page = CCS_SCREEN_DOMAIN_LIST;
1335 else if(selection_list &&
1336 gtk_tree_selection_count_selected_rows(selection_list))
1337 tran->current_page = CCS_SCREEN_ACL_LIST;
1339 tran->current_page = CCS_MAXSCREEN;
1340 g_object_set(G_OBJECT(notebook), "can-focus", TRUE, NULL);
1344 tran->current_page = CCS_SCREEN_EXCEPTION_LIST;
1345 if (tran->acl_detached) {
1346 control_acl_window(tran);
1348 g_object_set(G_OBJECT(notebook), "can-focus", FALSE, NULL);
1351 tran->current_page = CCS_SCREEN_PROFILE_LIST;
1352 if (tran->acl_detached) {
1353 control_acl_window(tran);
1355 g_object_set(G_OBJECT(notebook), "can-focus", FALSE, NULL);
1359 title = disp_window_title(tran->current_page);
1360 gtk_window_set_title(GTK_WINDOW(tran->window), title);
1362 // disp_statusbar(tran, tran->current_page);
1363 set_sensitive(tran->actions, tran->task_flag,
1364 tran->current_page);
1366 refresh_transition(NULL, tran);
1367 DEBUG_PRINT("Out Tab[%d]\n", page_num);
1369 /*---------------------------------------------------------------------------*/
1370 static void cb_set_focus(GtkWindow *window,
1371 GtkWidget *view, transition_t *tran)
1373 if (view == tran->treeview) {
1374 DEBUG_PRINT("Focus changed!!<Domain>\n");
1375 tran->current_page = CCS_SCREEN_DOMAIN_LIST;
1376 } else if (view == tran->acl.listview) {
1377 DEBUG_PRINT("Focus changed!!<Acl>(%p)\n", view);
1378 tran->current_page = CCS_SCREEN_ACL_LIST;
1379 } else if (view == tran->exp.listview) {
1380 DEBUG_PRINT("Focus changed!!<Exception>\n");
1381 tran->current_page = CCS_SCREEN_EXCEPTION_LIST;
1382 } else if (view == tran->prf.listview) {
1383 DEBUG_PRINT("Focus changed!!<Profile>\n");
1384 tran->current_page = CCS_SCREEN_PROFILE_LIST;
1385 } else if (view == tran->tsk.treeview) {
1386 DEBUG_PRINT("Focus changed!!<Process>\n");
1387 tran->current_page = CCS_SCREEN_DOMAIN_LIST;
1388 } else if (G_IS_OBJECT(view)) {
1389 DEBUG_PRINT("Focus changed!![Other:%s(%p)]\n",
1390 g_type_name(G_OBJECT_TYPE(view)), view);
1391 // g_object_set(G_OBJECT(view), "can-focus", FALSE, NULL);
1393 DEBUG_PRINT("Focus changed!![Not object(%p)]\n", view);
1397 static void cb_set_focus_acl(GtkWindow *window,
1398 GtkWidget *view, transition_t *tran)
1400 tran->current_page = CCS_SCREEN_ACL_LIST;
1402 if (view == tran->acl.listview) {
1403 DEBUG_PRINT("Focus changed!!<Acl>(%p)\n", view);
1404 } else if (G_IS_OBJECT(view)) {
1405 DEBUG_PRINT("Focus changed!![Other:%s(%p)]\n",
1406 g_type_name(G_OBJECT_TYPE(view)), view);
1407 g_object_set(G_OBJECT(view), "can-focus", FALSE, NULL);
1409 DEBUG_PRINT("Focus changed!![Not object(%p)]\n", view);
1413 static void cb_show_acl(GtkWidget *view, transition_t *tran)
1415 DEBUG_PRINT("Show ACL!!(%p)==(%p)\n", tran->acl.listview, view);
1417 /*---------------------------------------------------------------------------*/
1421 GtkWidget *menubar, *toolbar = NULL;
1422 GtkWidget *statusbar;
1425 GtkWidget *tab1, *tab2, *tab3;
1426 GtkWidget *notebook;
1428 GtkWidget *domainbar;
1429 GtkWidget *acl_window;
1430 GtkWidget *treeview, *listview;
1431 GtkContainer *container, *acl_container;
1433 struct ccs_domain_policy dp = { NULL, 0, NULL };
1434 transition_t transition;
1436 transition.task_flag = 0;
1437 if (get_domain_policy(&dp, &(transition.domain_count)))
1439 /*-----------------------------------------------*/
1441 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
1442 transition.window = window;
1443 gtk_window_set_title(GTK_WINDOW(window), _("gpet"));
1444 gtk_window_set_icon(GTK_WINDOW(window), get_png_file());
1445 gtk_container_set_border_width(GTK_CONTAINER(window), 0);
1446 g_signal_connect(G_OBJECT(window), "destroy",
1447 G_CALLBACK(gtk_main_quit), NULL);
1449 vbox = gtk_vbox_new(FALSE, 1);
1450 gtk_container_add(GTK_CONTAINER(window), vbox);
1452 // create menu bar & tool bar & popup menu
1453 menubar = create_menu(window, &transition, &toolbar);
1454 gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0);
1455 gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 0);
1458 notebook = gtk_notebook_new();
1459 // gtk_notebook_set_scrollable(GTK_NOTEBOOK(notebook), TRUE);
1460 gtk_notebook_popup_enable(GTK_NOTEBOOK(notebook));
1461 gtk_box_pack_start(GTK_BOX(vbox), notebook, TRUE, TRUE, 0);
1462 g_object_set(G_OBJECT(notebook), "can-focus", FALSE, NULL);
1464 // create status bar
1465 statusbar = gtk_statusbar_new();
1466 gtk_box_pack_start(GTK_BOX(vbox), statusbar, FALSE, FALSE, 0);
1467 contextid = gtk_statusbar_get_context_id(GTK_STATUSBAR(statusbar), "");
1468 gtk_statusbar_push(GTK_STATUSBAR(statusbar), contextid, _("gpet"));
1471 tab1 = gtk_vbox_new(FALSE, 1);
1472 // create name bar for full domain name
1473 domainbar = gtk_entry_new();
1474 gtk_box_pack_start(GTK_BOX(tab1), domainbar, FALSE, FALSE, 0);
1475 gtk_editable_set_editable(GTK_EDITABLE(domainbar), FALSE);
1476 gtk_entry_set_has_frame(GTK_ENTRY(domainbar), FALSE);
1477 gtk_entry_set_text(GTK_ENTRY(domainbar), "");
1478 // gtk_widget_set_can_focus(domainbar, FALSE); // 2.18
1479 g_object_set(G_OBJECT(domainbar), "can-focus", FALSE, NULL);
1481 pane = gtk_vpaned_new();
1482 g_object_set_data(G_OBJECT(window), "pane", pane);/* to save config */
1483 gtk_box_pack_start(GTK_BOX(tab1), pane, TRUE, TRUE, 0);
1485 // create domain transition view
1486 treeview = create_tree_model();
1487 container = create_domain_view(
1488 pane, treeview, gtk_paned_pack1, TRUE, NULL, NULL);
1489 //a add_tree_data(GTK_TREE_VIEW(treeview), &dp);
1490 //a gtk_tree_view_expand_all(GTK_TREE_VIEW(treeview));
1491 // ツリーインデント pixel(2.12)
1492 // gtk_tree_view_set_level_indentation(GTK_TREE_VIEW(treeview), 0);
1494 // gtk_tree_view_set_show_expanders(GTK_TREE_VIEW(treeview), TRUE);
1495 g_object_set(G_OBJECT(treeview), "enable-tree-lines", FALSE,
1497 // gtk_tree_view_set_grid_lines(GTK_TREE_VIEW(treeview),
1498 // GTK_TREE_VIEW_GRID_LINES_NONE);
1499 // create domain policy float window
1500 acl_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
1501 title = disp_window_title(CCS_MAXSCREEN);
1502 gtk_window_set_title(GTK_WINDOW(acl_window), title);
1504 gtk_container_set_border_width(GTK_CONTAINER(acl_window), 0);
1505 gtk_window_set_position(GTK_WINDOW(acl_window),
1506 GTK_WIN_POS_CENTER);
1507 gtk_window_set_destroy_with_parent(GTK_WINDOW(acl_window), TRUE);
1508 gtk_window_add_accel_group(GTK_WINDOW(acl_window),
1509 g_object_get_data(G_OBJECT(window), "AccelGroup"));
1510 gtk_widget_hide(acl_window);
1512 // create domain policy view
1513 listview = create_list_model(TRUE);
1514 transition.acl_detached = FALSE;
1515 acl_container = create_domain_view(pane, listview, gtk_paned_pack2,
1516 FALSE, acl_window, &transition.acl_detached);
1517 /* to save menu.c Detach_acl() */
1518 g_object_set_data(G_OBJECT(window), "acl_container", acl_container);
1520 // copy data pointer
1521 transition.domainbar = domainbar;
1522 transition.container = container;
1523 transition.treeview = treeview;
1524 transition.acl.listview = listview;
1525 transition.acl_window = acl_window;
1526 transition.statusbar = statusbar;
1527 transition.contextid = contextid;
1528 transition.dp = &dp;
1529 transition.acl.count = 0;
1530 transition.acl.list = NULL;
1531 transition.tsk.treeview = create_task_tree_model(&transition);
1532 transition.addentry = ADDENTRY_NON;
1534 // cursor move domain window
1535 g_signal_connect(gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)),
1536 "changed", G_CALLBACK(cb_selection), &transition);
1537 // g_signal_connect(GTK_TREE_VIEW(treeview), "cursor-changed",
1538 // G_CALLBACK(cb_selection), &transition);
1539 // double click or enter key domain window
1540 g_signal_connect(G_OBJECT(treeview), "row-activated",
1541 G_CALLBACK(cb_initialize_domain), NULL);
1542 // mouse click domain window
1543 g_signal_connect(G_OBJECT(treeview), "button-press-event",
1544 G_CALLBACK(cb_select_domain), &transition);
1545 // mouse click acl window
1546 g_signal_connect(G_OBJECT(listview), "button-press-event",
1547 G_CALLBACK(cb_select_acl), &transition);
1550 tab2 = gtk_vbox_new(FALSE, 1);
1551 // create exception policy view
1552 listview = create_list_model(TRUE);
1553 create_list_view(tab2, listview, TRUE);
1554 transition.exp.listview = listview;
1555 // mouse click exception window
1556 g_signal_connect(G_OBJECT(listview), "button-press-event",
1557 G_CALLBACK(cb_select_exp), &transition);
1559 tab3 = gtk_vbox_new(FALSE, 1);
1560 // create profile view
1561 listview = create_list_model(FALSE);
1562 create_list_view(tab3, listview, FALSE);
1563 transition.prf.listview = listview;
1564 transition.prf.count = 0;
1565 transition.prf.list = NULL;
1566 if (get_profile(&(transition.prf.list), &(transition.prf.count)))
1567 g_warning("Read error : profile");
1569 add_list_data(&(transition.prf), FALSE);
1570 // mouse click profile window
1571 g_signal_connect(G_OBJECT(listview), "button-press-event",
1572 G_CALLBACK(cb_select_prf), &transition);
1575 create_tabs(notebook, tab1, _("Domain Transition"));
1576 create_tabs(notebook, tab2, _("Exception Policy"));
1577 create_tabs(notebook, tab3, _("Profile"));
1579 /* to save menu.c Process_state() */
1580 g_object_set_data(G_OBJECT(window), "notebook", notebook);
1581 g_object_set_data(G_OBJECT(window), "tab1", tab1);
1584 g_signal_connect(G_OBJECT(notebook), "switch_page",
1585 G_CALLBACK(cb_switch_page), &transition);
1586 read_config(&transition);
1588 /* set widget names for .gpetrc */
1589 gtk_widget_set_name(transition.window, "GpetMainWindow");
1590 gtk_widget_set_name(transition.domainbar, "GpetDomainbar");
1591 gtk_widget_set_name(transition.acl_window, "GpetAclWindow");
1593 gtk_widget_show_all(window);
1599 /*---------------------------------------------------------------------------*/
1600 int main(int argc, char **argv)
1602 const gchar *homedir = g_getenv("HOME");
1607 bindtextdomain(GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR);
1608 bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
1609 textdomain(GETTEXT_PACKAGE);
1612 gtk_init(&argc, &argv);
1615 homedir = g_get_home_dir ();
1616 gpetrc = g_build_path("/", homedir, ".gpetrc", NULL);
1617 gtk_rc_parse(gpetrc);
1620 result = ccs_main(argc, argv);
1624 /*---------------------------------------------------------------------------*/