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 static gboolean is_jump_source(
76 struct ccs_domain_policy3 *dp, const int index)
78 return dp->list[index].target != NULL;
80 /*---------------------------------------------------------------------------*/
81 enum tree_column_pos {
82 COLUMN_INDEX, // data index (invisible)
85 COLUMN_PROFILE, // profile
86 COLUMN_KEEPER_DOMAIN, // #
87 COLUMN_INITIALIZER_TARGET, // *
88 COLUMN_DOMAIN_UNREACHABLE, // !
89 COLUMN_DOMAIN_NAME, // domain name
90 COLUMN_COLOR, // text color
91 COLUMN_REDIRECT, // redirect index (invisible)
94 /*---------------------------------------------------------------------------*/
95 static int add_tree_store(GtkTreeStore *store, GtkTreeIter *parent_iter,
96 struct ccs_domain_policy3 *dp, int *index, int nest)
99 gchar *color = "black";
100 gchar *str_num, *str_prof, *name;
101 gchar *line = NULL, *is_dis = NULL, *domain;
103 const struct ccs_transition_control_entry *transition_control;
104 int n, number, redirect_index = -1;
106 //g_print("add_tree_store index[%3d] nest[%2d]\n", *index, nest);
108 sp = get_domain_name(dp, *index);
110 const char *cp = strchr(sp, ' ');
115 name = decode_from_octal_str(sp);
117 gtk_tree_store_append(store, &iter, parent_iter);
118 number = dp->list[*index].number;
120 str_num = g_strdup_printf("%4d", number);
121 str_prof = g_strdup_printf("%3u", dp->list[*index].profile);
123 str_num = g_strdup("");
124 str_prof = g_strdup("");
127 gtk_tree_store_set(store, &iter,
128 COLUMN_INDEX, *index,
129 COLUMN_NUMBER, str_num,
130 COLUMN_COLON, number >= 0 ? ":" : "",
131 COLUMN_PROFILE, str_prof,
132 COLUMN_KEEPER_DOMAIN, dp->list[*index].is_dk ? "#" : " ",
133 COLUMN_INITIALIZER_TARGET, dp->list[*index].is_djt ? "*" : " ",
134 COLUMN_DOMAIN_UNREACHABLE, dp->list[*index].is_du ? "!" : " ",
139 transition_control = dp->list[*index].d_t;
140 if (transition_control && !is_jump_source(dp, *index)) {
141 line = g_strdup_printf(" ( %s%s from %s )",
142 get_transition_name(transition_control->type),
143 transition_control->program ?
144 transition_control->program->name : "any",
145 transition_control->domainname ?
146 transition_control->domainname->name : "any");
148 transition_control->type == CCS_TRANSITION_CONTROL_KEEP ?
150 } else if (is_jump_source(dp, *index)) { /* initialize_domain */
151 redirect_index = get_find_target_domain(*index);
153 if (redirect_index >= 0)
154 is_dis = g_strdup_printf(" ( -> %d )",
155 dp->list[redirect_index].number);
156 else if (redirect_index == EOF)
157 is_dis = g_strdup_printf(" ( -> Not Found )");
159 is_dis = g_strdup_printf(" ( -> Namespace jump )");
160 } else if (dp->list[*index].is_dd) { /* delete_domain */
163 domain = g_strdup_printf("%s%s%s%s%s%s",
164 dp->list[*index].is_dd ? "( " : "",
165 is_jump_source(dp, *index) ? "=> " : "",
167 dp->list[*index].is_dd ? " )" : "",
171 gtk_tree_store_set(store, &iter, COLUMN_DOMAIN_NAME, domain,
173 COLUMN_REDIRECT, redirect_index, -1);
181 while (*index < dp->list_len) {
182 sp = get_domain_name(dp, *index);
184 const char *cp = strchr(sp, ' ');
191 n = add_tree_store(store, &iter, dp, index, n);
199 void add_tree_data(GtkTreeView *treeview, struct ccs_domain_policy3 *dp)
202 GtkTreeIter *iter = NULL;
203 int index = 0, nest = -1;
205 store = GTK_TREE_STORE(gtk_tree_view_get_model(treeview));
206 gtk_tree_store_clear(store); // TODO 遅い
207 if (dp->list_len > 0)
208 add_tree_store(store, iter, dp, &index, nest);
210 /*---------------------------------------------------------------------------*/
211 static GtkTreeViewColumn *column_add(
212 GtkCellRenderer *renderer,
213 const GtkWidget *treeview,
215 enum tree_column_pos pos,
216 const gchar *attribute,
220 GtkTreeViewColumn *column;
222 g_object_set(renderer, "xalign", xalign, "ypad", 0, NULL);
223 column = gtk_tree_view_column_new_with_attributes(
224 title, renderer, attribute, pos, NULL);
225 gtk_tree_view_column_add_attribute(column, renderer,
226 "foreground", COLUMN_COLOR);
227 // gtk_tree_view_column_set_alignment(column, xalign);
228 gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
232 /*---------------------------------------------------------------------------*/
234 static void cb_status_toggled(GtkCellRendererToggle *renderer,
243 model = gtk_tree_view_get_model(GTK_TREE_VIEW(user_data));
244 path = gtk_tree_path_new_from_string(path_string);
246 gtk_tree_model_get_iter(model, &iter, path);
247 gtk_tree_model_get(model, &iter, COLUMN_INDEX, &status, -1);
248 gtk_tree_store_set(GTK_TREE_STORE(model), &iter,
249 COLUMN_INDEX, !status, -1);
250 gtk_tree_path_free(path);
253 /*---------------------------------------------------------------------------*/
254 static GtkWidget *create_tree_model(void)
258 // GtkCellRenderer *renderer;
259 GtkTreeViewColumn *column;
261 store = gtk_tree_store_new(N_COLUMNS_TREE,
272 treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
273 g_object_unref(store);
276 // renderer = gtk_cell_renderer_toggle_new();
277 // g_signal_connect(renderer, "toggled",
278 // G_CALLBACK(cb_status_toggled), treeview);
280 renderer = gtk_cell_renderer_text_new();
281 g_object_set(renderer, "visible", FALSE, NULL);
282 column = column_add(renderer, treeview,
283 "", COLUMN_INDEX, "text", 0.0);
285 column = column_add(gtk_cell_renderer_text_new(), treeview,
286 "No.", COLUMN_NUMBER, "text", 1.0);
287 column = column_add(gtk_cell_renderer_text_new(), treeview,
288 " ", COLUMN_COLON, "text", 0.5);
289 column = column_add(gtk_cell_renderer_text_new(), treeview,
290 "prof", COLUMN_PROFILE, "text", 1.0);
291 column = column_add(gtk_cell_renderer_text_new(), treeview,
292 "#", COLUMN_KEEPER_DOMAIN, "text", 0.5);
293 column = column_add(gtk_cell_renderer_text_new(), treeview,
294 "*", COLUMN_INITIALIZER_TARGET, "text", 0.5);
295 column = column_add(gtk_cell_renderer_text_new(), treeview,
296 "!", COLUMN_DOMAIN_UNREACHABLE, "text", 0.5);
297 column = column_add(gtk_cell_renderer_text_new(), treeview,
298 "Domain Name", COLUMN_DOMAIN_NAME, "text", 0.0);
300 gtk_tree_view_set_expander_column(GTK_TREE_VIEW(treeview), column);
301 // gtk_tree_view_column_set_spacing(column, 1);
303 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), FALSE);
307 /*---------------------------------------------------------------------------*/
308 enum list_column_pos {
316 void add_list_data(generic_list_t *generic,
317 enum ccs_screen_type current_page)
322 gchar *str_num, *ope, *profile, *alias;
324 store = GTK_LIST_STORE(gtk_tree_view_get_model(
325 GTK_TREE_VIEW(generic->listview)));
327 gtk_list_store_clear(store);
328 for(i = 0; i < generic->count; i++){
329 str_num = g_strdup_printf("%4d", i);
330 gtk_list_store_append(store, &iter);
332 switch((int)current_page) {
333 case CCS_SCREEN_EXCEPTION_LIST :
334 case CCS_SCREEN_ACL_LIST :
335 ope = decode_from_octal_str(generic->list[i].operand);
337 ccs_directives[generic->list[i].directive].alias;
338 gtk_list_store_set(store, &iter,
339 LIST_NUMBER, str_num,
346 case CCS_SCREEN_PROFILE_LIST :
347 profile = g_strdup_printf("%3u-",
348 generic->list[i].directive);
349 alias = g_strdup_printf("%s%s",
350 generic->list[i].directive < 256 ?
352 generic->list[i].operand);
353 gtk_list_store_set(store, &iter,
354 LIST_NUMBER, str_num,
361 case CCS_SCREEN_NS_LIST :
362 gtk_list_store_set(store, &iter,
363 LIST_NUMBER, str_num,
365 LIST_OPERAND, generic->list[i].operand,
373 static void disable_header_focus(GtkTreeViewColumn *column, const gchar *str)
375 GtkWidget *label, *dummy;
376 GtkButton *button = GTK_BUTTON(gtk_button_new());
378 label = gtk_label_new(str);
379 gtk_tree_view_column_set_widget(column, label);
380 gtk_widget_show(label);
381 dummy = gtk_tree_view_column_get_widget(column);
383 // g_print("<%s:%p> ", g_type_name(G_OBJECT_TYPE(dummy)), dummy);
385 g_object_set(G_OBJECT(dummy), "can-focus", FALSE, NULL);
386 // gtk_widget_set_can_focus(dummy, FALSE); // 2.18
387 if (G_OBJECT_TYPE(dummy) == G_OBJECT_TYPE(button))
389 dummy = gtk_widget_get_parent(dummy);
394 static GtkWidget *create_list_model(gboolean alias_flag)
397 GtkListStore *liststore;
398 GtkCellRenderer *renderer;
399 GtkTreeViewColumn *column;
401 liststore = gtk_list_store_new(N_COLUMNS_LIST,
402 G_TYPE_STRING, G_TYPE_STRING,
403 G_TYPE_STRING, G_TYPE_STRING);
404 treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(liststore));
405 g_object_unref(liststore);
407 renderer = gtk_cell_renderer_text_new();
408 g_object_set(renderer, "xalign", 1.0, "ypad", 0, NULL);
409 column = gtk_tree_view_column_new_with_attributes(
410 "No.", renderer, "text", LIST_NUMBER, NULL);
411 gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
412 gtk_tree_view_column_set_sort_column_id(column, LIST_NUMBER);
413 // gtk_tree_view_column_set_alignment(column, 1.0);
414 disable_header_focus(column, "No.");
416 renderer = gtk_cell_renderer_text_new();
417 column = gtk_tree_view_column_new_with_attributes(" ", renderer,
418 "text", LIST_COLON, NULL);
419 gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
420 disable_header_focus(column, " ");
423 renderer = gtk_cell_renderer_text_new();
424 column = gtk_tree_view_column_new_with_attributes(
425 "directive", renderer, "text", LIST_ALIAS, NULL);
426 gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
427 gtk_tree_view_column_set_sort_column_id(column, LIST_ALIAS);
428 disable_header_focus(column, "directive");
431 renderer = gtk_cell_renderer_text_new();
432 column = gtk_tree_view_column_new_with_attributes("operand", renderer,
433 "text", LIST_OPERAND, NULL);
434 gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
435 gtk_tree_view_column_set_sort_column_id(column, LIST_OPERAND);
436 disable_header_focus(column, "operand");
439 // gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), TRUE);
443 /*---------------------------------------------------------------------------*/
444 gint get_current_domain_index(transition_t *transition)
446 GtkTreeSelection *selection;
452 selection = gtk_tree_view_get_selection(
453 GTK_TREE_VIEW(transition->treeview));
455 gtk_tree_selection_count_selected_rows(selection)) {
456 list = gtk_tree_selection_get_selected_rows(selection, NULL);
457 model = gtk_tree_view_get_model(
458 GTK_TREE_VIEW(transition->treeview));
459 gtk_tree_model_get_iter(model, &iter, g_list_first(list)->data);
460 gtk_tree_model_get(model, &iter, COLUMN_INDEX, &index, -1);
461 g_list_foreach(list, (GFunc)gtk_tree_path_free, NULL);
464 DEBUG_PRINT("select Domain index[%d]\n", index);
468 gchar *get_alias_and_operand(GtkWidget *view, gboolean alias_flag)
470 GtkTreeSelection *selection;
474 gchar *alias = NULL, *operand = NULL,
477 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
479 gtk_tree_selection_count_selected_rows(selection)) {
480 list = gtk_tree_selection_get_selected_rows(selection, NULL);
481 model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
482 gtk_tree_model_get_iter(model, &iter, g_list_first(list)->data);
484 gtk_tree_model_get(model, &iter,
485 LIST_ALIAS, &alias, LIST_OPERAND, &operand, -1);
486 str_buff = g_strdup_printf("%s %s", alias, operand);
490 gtk_tree_model_get(model, &iter,
491 LIST_OPERAND, &operand, -1);
492 str_buff = g_strchug(operand);
498 /*---------------------------------------------------------------------------*/
499 static gboolean move_pos_list(GtkTreeModel *model, GtkTreePath *path,
500 GtkTreeIter *iter, transition_t *transition)
502 GtkWidget *view = NULL;
503 GtkTreeSelection *selection;
505 gchar *alias = NULL, *operand = NULL;
506 gchar *entry, *str_buff = NULL;
510 entry = get_combo_entry_last();
512 switch((int)transition->addentry) {
513 case ADDENTRY_DOMAIN_LIST :
514 view = transition->treeview;
515 gtk_tree_model_get(model, iter, COLUMN_INDEX, &index, -1);
516 str_buff = decode_from_octal_str(
517 get_domain_name(transition->dp, index));
518 cmp = strcmp(entry, str_buff);
520 case ADDENTRY_ACL_LIST :
521 view = transition->acl.listview;
522 gtk_tree_model_get(model, iter,
523 LIST_ALIAS, &alias, LIST_OPERAND, &operand, -1);
524 str_buff = g_strdup_printf("%s %s", alias, operand); // TODO
525 cmp = strcmp(entry, str_buff);
526 //g_print("%2d[%s][%s]\n", cmp, entry, str_buff);
528 case ADDENTRY_EXCEPTION_LIST :
529 view = transition->exp.listview;
530 gtk_tree_model_get(model, iter,
531 LIST_ALIAS, &alias, LIST_OPERAND, &operand, -1);
532 str_buff = g_strdup_printf("%s %s", alias, operand); // TODO
533 cmp = strcmp(entry, str_buff);
535 case ADDENTRY_PROFILE_LIST :
536 view = transition->prf.listview;
537 gtk_tree_model_get(model, iter, LIST_NUMBER, &str_buff, -1);
538 cmp = atoi(entry) - transition->prf.list[atoi(str_buff)].directive;
539 //g_print("entry[%s] [%s:%d]\n", entry, str_buff, transition->prf.list[atoi(str_buff)].directive);
541 case ADDENTRY_NAMESPACE_LIST :
542 view = transition->ns.listview;
543 gtk_tree_model_get(model, iter, LIST_OPERAND, &operand, -1);
544 cmp = strcmp(entry, operand);
552 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
555 gtk_tree_selection_unselect_path(selection, path);
558 gtk_tree_selection_select_path(selection, path);
561 gchar *path_str = gtk_tree_path_to_string(path);
562 g_print("Put Path[%s]\n", path_str);
570 void set_position_addentry(transition_t *transition, GtkTreePath **path)
572 GtkWidget *view = NULL;
574 GtkTreeSelection *selection;
578 switch((int)transition->addentry) {
582 case ADDENTRY_DOMAIN_LIST :
583 view = transition->treeview;
585 case ADDENTRY_ACL_LIST :
586 view = transition->acl.listview;
588 case ADDENTRY_EXCEPTION_LIST :
589 view = transition->exp.listview;
591 case ADDENTRY_PROFILE_LIST :
592 view = transition->prf.listview;
594 case ADDENTRY_NAMESPACE_LIST :
595 view = transition->ns.listview;
599 model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
600 gtk_tree_model_foreach(model,
601 (GtkTreeModelForeachFunc)move_pos_list, transition);
602 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
603 list = gtk_tree_selection_get_selected_rows(selection, NULL);
605 gtk_tree_path_free(*path);
606 (*path) = gtk_tree_path_copy(g_list_first(list)->data);
607 g_list_foreach(list, (GFunc)gtk_tree_path_free, NULL);
610 transition->addentry = ADDENTRY_NON;
614 gchar *path_str = gtk_tree_path_to_string(*path);
615 g_print("Get Path[%s]\n", path_str);
620 /*---------------------------------------------------------------------------*/
621 static void cb_selection(GtkTreeSelection *selection,
622 transition_t *transition)
629 GtkTreePath *path = NULL;
630 GtkTreeViewColumn *column = NULL;
633 DEBUG_PRINT("In **************************** \n");
634 select_count = gtk_tree_selection_count_selected_rows(selection);
635 DEBUG_PRINT("select count[%d]\n", select_count);
636 if (0 == select_count)
639 model = gtk_tree_view_get_model(
640 GTK_TREE_VIEW(transition->treeview));
641 list = gtk_tree_selection_get_selected_rows(selection, NULL);
642 gtk_tree_model_get_iter(model, &iter, g_list_first(list)->data);
643 g_list_foreach(list, (GFunc)gtk_tree_path_free, NULL);
645 gtk_tree_model_get(model, &iter, COLUMN_INDEX, &index, -1);
646 DEBUG_PRINT("--- index [%4d] ---\n", index);
647 name = decode_from_octal_str(get_domain_name(transition->dp, index));
648 if (is_jump_source(transition->dp, index)) {
649 gchar *cp = strrchr(name, ' ');
653 gtk_entry_set_text(GTK_ENTRY(transition->domainbar), name);
656 gtk_tree_view_get_cursor(GTK_TREE_VIEW(
657 transition->acl.listview), &path, &column);
659 get_acl_list(transition->dp, index,
660 &(transition->acl.list), &(transition->acl.count));
661 add_list_data(&(transition->acl), CCS_SCREEN_ACL_LIST);
663 if (transition->acl.count) {
664 set_position_addentry(transition, &path);
665 DEBUG_PRINT("ACL count<%d>\n", transition->acl.count);
667 view_cursor_set(transition->acl.listview, path, column);
668 // gtk_widget_grab_focus(transition->acl.listview);
669 disp_statusbar(transition, CCS_SCREEN_ACL_LIST);
670 } else { /* delete_domain or initializer_source */
671 disp_statusbar(transition, CCS_MAXSCREEN);
673 DEBUG_PRINT("Out **************************** \n");
675 /*---------------------------------------------------------------------------*/
676 static void set_ns_tab_label(transition_t *transition,
677 const gchar *namespace)
682 notebook = g_object_get_data(
683 G_OBJECT(transition->window), "notebook");
684 tab4 = g_object_get_data(
685 G_OBJECT(transition->window), "tab4");
686 gtk_notebook_set_tab_label_text(
687 GTK_NOTEBOOK(notebook), tab4, namespace);
688 gtk_notebook_set_menu_label_text(
689 GTK_NOTEBOOK(notebook), tab4, namespace);
691 put_ns_name(namespace);
693 /*---------------------------------------------------------------------------*/
700 static gboolean find_is_dis(GtkTreeModel *model, GtkTreePath *path,
701 GtkTreeIter *iter, struct FindIsDis_t *data)
705 gtk_tree_model_get(model, iter, COLUMN_INDEX, &index, -1);
706 if (data->redirect_index == index) {
708 data->path = gtk_tree_path_copy(path);
714 static void cb_initialize_domain(GtkTreeView *treeview, GtkTreePath *treepath,
715 GtkTreeViewColumn *treeviewcolumn, transition_t *transition)
719 struct FindIsDis_t data;
722 DEBUG_PRINT("In **************************** \n");
723 model = gtk_tree_view_get_model(treeview);
724 if (!gtk_tree_model_get_iter(model, &iter, treepath))
727 gtk_tree_model_get(model, &iter, COLUMN_INDEX, &index,
728 COLUMN_REDIRECT, &data.redirect_index, -1);
730 //#define DEBUG_PRINT g_print
731 DEBUG_PRINT("index[%d] redirect_index[%d]\n", index, data.redirect_index);
733 if (data.redirect_index == -2) {
735 g_strdup(transition->dp->list[index].target->name);
736 DEBUG_PRINT("%s\n", namespace);
737 char *cp = strchr(namespace, ' ');
740 set_ns_tab_label(transition, namespace);
742 refresh_transition(NULL, transition);
744 } else if (data.redirect_index < 0)
745 return; /* not initialize_domain */
748 gtk_tree_model_foreach(model,
749 (GtkTreeModelForeachFunc)find_is_dis, &data);
753 gchar *path_str = gtk_tree_path_to_string(data.path);
754 DEBUG_PRINT("TreePath[%s]\n", path_str);
757 GtkTreeViewColumn *column = NULL;
758 gtk_tree_view_expand_to_path(GTK_TREE_VIEW(treeview), data.path);
759 gtk_tree_selection_select_iter(
760 gtk_tree_view_get_selection(
761 GTK_TREE_VIEW(treeview)), &data.iter);
762 DEBUG_PRINT("Domain ");
763 view_cursor_set(GTK_WIDGET(treeview), data.path, column);
765 DEBUG_PRINT("Out **************************** \n");
767 /*---------------------------------------------------------------------------*/
768 void set_sensitive(GtkActionGroup *actions, int task_flag,
769 enum ccs_screen_type current_page)
771 gboolean sens_edt, sens_add, sens_del, sens_tsk,
772 sens_dch, sens_cpy, sens_opt;
774 sens_edt = sens_add = sens_del = sens_tsk =
775 sens_dch = sens_cpy = sens_opt = FALSE;
777 switch((int)current_page) {
778 case CCS_SCREEN_DOMAIN_LIST :
789 case CCS_SCREEN_ACL_LIST :
797 case CCS_SCREEN_EXCEPTION_LIST :
802 case CCS_SCREEN_PROFILE_LIST :
807 case CCS_SCREEN_NS_LIST :
813 gtk_action_set_sensitive(gtk_action_group_get_action(
814 actions, "Edit"), sens_edt);
815 gtk_action_set_sensitive(gtk_action_group_get_action(
816 actions, "Add"), sens_add);
817 gtk_action_set_sensitive(gtk_action_group_get_action(
818 actions, "Delete"), sens_del);
819 gtk_action_set_sensitive(gtk_action_group_get_action(
820 actions, "ACL"), sens_dch);
821 gtk_action_set_sensitive(gtk_action_group_get_action(
822 actions, "Copy"), sens_cpy);
823 gtk_action_set_sensitive(gtk_action_group_get_action(
824 actions, "OptimizationSupport"), sens_opt);
827 gtk_action_set_sensitive(gtk_action_group_get_action(
828 actions, "Process"), sens_tsk);
831 static gint popup_menu(transition_t *transition, guint button)
835 /* get menu.c create_menu()*/
836 popup = g_object_get_data(
837 G_OBJECT(transition->window), "popup");
839 gtk_menu_popup(GTK_MENU(popup), NULL, NULL, NULL, NULL,
840 0, gtk_get_current_event_time());
847 static gboolean cb_select_domain(GtkTreeView *treeview, GdkEventButton *event,
848 transition_t *transition)
850 transition->current_page = CCS_SCREEN_DOMAIN_LIST;
852 set_sensitive(transition->actions, transition->task_flag,
853 transition->current_page);
854 if (event->button == 3) {
856 /* get menu.c create_menu()*/
857 popup = g_object_get_data(
858 G_OBJECT(transition->window), "popup");
860 gtk_menu_popup(GTK_MENU(popup), NULL, NULL, NULL, NULL,
861 0, gtk_get_current_event_time());
868 static gboolean cb_select_acl(GtkTreeView *listview, GdkEventButton *event,
869 transition_t *transition)
871 transition->current_page = CCS_SCREEN_ACL_LIST;
872 set_sensitive(transition->actions, transition->task_flag,
873 transition->current_page);
874 return popup_menu(transition, event->button);
877 static gboolean cb_select_exp(GtkTreeView *listview, GdkEventButton *event,
878 transition_t *transition)
880 transition->current_page = CCS_SCREEN_EXCEPTION_LIST;
881 set_sensitive(transition->actions, transition->task_flag,
882 transition->current_page);
883 return popup_menu(transition, event->button);
886 static gboolean cb_select_prf(GtkTreeView *listview, GdkEventButton *event,
887 transition_t *transition)
889 transition->current_page = CCS_SCREEN_PROFILE_LIST;
890 set_sensitive(transition->actions, transition->task_flag,
891 transition->current_page);
892 return popup_menu(transition, event->button);
895 static gboolean cb_select_ns(GtkTreeView *listview, GdkEventButton *event,
896 transition_t *transition)
898 transition->current_page = CCS_SCREEN_NS_LIST;
899 set_sensitive(transition->actions, transition->task_flag,
900 transition->current_page);
901 return popup_menu(transition, event->button);
903 /*---------------------------------------------------------------------------*/
904 static void cb_ns_selection(GtkTreeSelection *selection,
905 transition_t *transition)
912 if (0 == gtk_tree_selection_count_selected_rows(selection))
915 model = gtk_tree_view_get_model(
916 GTK_TREE_VIEW(transition->ns.listview));
917 list = gtk_tree_selection_get_selected_rows(selection, NULL);
918 gtk_tree_model_get_iter(model, &iter, g_list_first(list)->data);
919 g_list_foreach(list, (GFunc)gtk_tree_path_free, NULL);
921 gtk_tree_model_get(model, &iter, LIST_OPERAND, &namespace, -1);
922 set_ns_tab_label(transition, namespace);
925 /*---------------------------------------------------------------------------*/
926 static gboolean inc_search(GtkTreeModel *model, gint column,
927 const gchar *key, GtkTreeIter *iter, gpointer search_data)
932 gtk_tree_model_get(model, iter, column, &buff, -1);
933 DEBUG_PRINT("key[%s] buff[%s]\n", key, buff);
934 ret = g_strrstr(buff, key) ? FALSE : TRUE;
940 void view_setting(GtkWidget *treeview, gint search_column)
943 gtk_tree_selection_set_mode(
944 gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)),
945 GTK_SELECTION_MULTIPLE);
947 gtk_tree_view_set_rubber_banding(GTK_TREE_VIEW(treeview), TRUE);
949 gtk_tree_view_set_search_column(GTK_TREE_VIEW(treeview),
951 gtk_tree_view_set_enable_search(GTK_TREE_VIEW(treeview), TRUE);
952 gtk_tree_view_set_search_equal_func(GTK_TREE_VIEW(treeview),
953 (GtkTreeViewSearchEqualFunc)inc_search, NULL, NULL);
956 /*---------------------------------------------------------------------------*/
957 static GtkContainer *create_domain_view(GtkWidget *paned,
958 GtkWidget *treeview, void (*paned_pack)(),
960 GtkWidget *acl_window, gboolean *acl_detached)
962 GtkWidget *scrolledwin;
963 GtkContainer *container;
965 scrolledwin = gtk_scrolled_window_new(NULL, NULL);
966 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwin),
967 GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
968 gtk_scrolled_window_set_shadow_type(
969 GTK_SCROLLED_WINDOW(scrolledwin), GTK_SHADOW_IN);
971 paned_pack(GTK_PANED(paned), scrolledwin, resize, TRUE);
974 view_setting(treeview, LIST_OPERAND);
976 view_setting(treeview, COLUMN_DOMAIN_NAME);
979 container = GTK_CONTAINER(scrolledwin);
980 gtk_container_add(container, treeview);
984 /*---------------------------------------------------------------------------*/
985 static void create_list_view(GtkWidget *box, GtkWidget *listview,
988 GtkWidget *scrolledwin;
990 scrolledwin = gtk_scrolled_window_new(NULL, NULL);
991 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwin),
992 GTK_POLICY_AUTOMATIC,
994 gtk_scrolled_window_set_shadow_type(
995 GTK_SCROLLED_WINDOW(scrolledwin), GTK_SHADOW_IN);
996 gtk_box_pack_start(GTK_BOX(box), scrolledwin, TRUE, TRUE, 0);
997 gtk_container_add(GTK_CONTAINER(scrolledwin), listview);
1001 gtk_tree_selection_set_mode(
1002 gtk_tree_view_get_selection(
1003 GTK_TREE_VIEW(listview)),
1004 GTK_SELECTION_MULTIPLE);
1006 gtk_tree_view_set_rubber_banding(
1007 GTK_TREE_VIEW(listview), TRUE);
1010 gtk_tree_view_set_search_column(
1011 GTK_TREE_VIEW(listview), LIST_OPERAND);
1012 gtk_tree_view_set_enable_search(
1013 GTK_TREE_VIEW(listview), TRUE);
1014 gtk_tree_view_set_search_equal_func(GTK_TREE_VIEW(listview),
1015 (GtkTreeViewSearchEqualFunc)inc_search, NULL, NULL);
1017 /*---------------------------------------------------------------------------*/
1018 static void set_select_flag_domain(gpointer data,
1019 transition_t *transition)
1021 GtkTreeModel *model;
1024 struct ccs_domain_policy3 *dp = transition->dp;
1027 model = gtk_tree_view_get_model(
1028 GTK_TREE_VIEW(transition->treeview));
1029 if (!model || !gtk_tree_model_get_iter(model, &iter, data)) {
1030 g_warning("ERROR: %s(%d)", __FILE__, __LINE__);
1033 gtk_tree_model_get(model, &iter, COLUMN_INDEX, &index, -1);
1035 DEBUG_PRINT("index[%d]\n", index);
1036 /* deleted_domain or initializer_source */
1037 if (!(dp->list[index].is_dd) && !(dp->list[index].target))
1038 dp->list_selected[index] = 1;
1041 gint delete_domain(transition_t *transition,
1042 GtkTreeSelection *selection, gint count)
1045 char *err_buff = NULL;
1049 list = gtk_tree_selection_get_selected_rows(selection, NULL);
1050 g_list_foreach(list, (GFunc)set_select_flag_domain, transition);
1052 g_list_foreach(list, (GFunc)gtk_tree_path_free, NULL);
1055 result = delete_domain_policy(transition->dp, &err_buff);
1057 g_warning("%s", err_buff);
1063 /*---------------------------------------------------------------------------*/
1064 gint set_domain_profile(transition_t *transition,
1065 GtkTreeSelection *selection, guint profile)
1069 char *err_buff = NULL;
1072 list = gtk_tree_selection_get_selected_rows(selection, NULL);
1073 if (transition->task_flag)
1074 g_list_foreach(list, (GFunc)set_select_flag_process,
1075 &(transition->tsk));
1077 g_list_foreach(list, (GFunc)set_select_flag_domain,
1080 g_list_foreach(list, (GFunc)gtk_tree_path_free, NULL);
1083 profile_str = g_strdup_printf("%u", profile);
1084 result = set_profile(transition->dp, profile_str, &err_buff);
1085 // g_free(profile_str); → editpolicy.c
1087 g_warning("%s", err_buff);
1093 /*---------------------------------------------------------------------------*/
1094 gboolean disp_acl_line(GtkTreeModel *model, GtkTreePath *path,
1095 GtkTreeIter *iter, generic_list_t *acl)
1097 GtkTreeSelection *selection;
1100 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(acl->listview));
1102 gtk_tree_model_get(model, iter, LIST_NUMBER, &str_num, -1);
1104 if (acl->list[atoi(str_num)].selected) {
1106 gchar *str_path = gtk_tree_path_to_string(path);
1107 g_print("select[%d] path[%s]\n", atoi(str_num), str_path);
1110 gtk_tree_selection_select_path(selection, path);
1112 gtk_tree_selection_unselect_path(selection, path);
1119 gint select_list_line(generic_list_t *gen)
1121 GtkTreeSelection *selection;
1123 GtkTreeModel *model;
1128 selection = gtk_tree_view_get_selection(
1129 GTK_TREE_VIEW(gen->listview));
1131 !gtk_tree_selection_count_selected_rows(selection))
1134 list = gtk_tree_selection_get_selected_rows(selection, NULL);
1138 model = gtk_tree_view_get_model(GTK_TREE_VIEW(gen->listview));
1139 gtk_tree_model_get_iter(model, &iter, g_list_first(list)->data);
1140 gtk_tree_model_get(model, &iter, LIST_NUMBER, &str_num, -1);
1141 g_list_foreach(list, (GFunc)gtk_tree_path_free, NULL);
1144 index = atoi(str_num);
1149 /*---------------------------------------------------------------------------*/
1150 static void set_delete_flag_gen(gpointer data, generic_list_t *gen)
1152 GtkTreeModel *model;
1156 model = gtk_tree_view_get_model(GTK_TREE_VIEW(gen->listview));
1157 if (!model || !gtk_tree_model_get_iter(model, &iter, data)) {
1158 g_warning("ERROR: %s(%d)", __FILE__, __LINE__);
1161 gtk_tree_model_get(model, &iter, LIST_NUMBER, &str_num, -1);
1163 DEBUG_PRINT("index[%d]\n", atoi(str_num));
1164 gen->list[atoi(str_num)].selected = 1;
1168 gint delete_acl(transition_t *transition,
1169 GtkTreeSelection *selection, gint count)
1172 char *err_buff = NULL;
1176 list = gtk_tree_selection_get_selected_rows(selection, NULL);
1177 g_list_foreach(list, (GFunc)set_delete_flag_gen, &(transition->acl));
1178 g_list_foreach(list, (GFunc)gtk_tree_path_free, NULL);
1181 result = delete_acl_policy(transition->dp, &err_buff,
1182 transition->acl.list, transition->acl.count);
1184 g_warning("%s", err_buff);
1191 gint delete_exp(transition_t *transition,
1192 GtkTreeSelection *selection, gint count)
1195 char *err_buff = NULL;
1198 list = gtk_tree_selection_get_selected_rows(selection, NULL);
1199 g_list_foreach(list, (GFunc)set_delete_flag_gen, &(transition->exp));
1200 g_list_foreach(list, (GFunc)gtk_tree_path_free, NULL);
1203 result = delete_exp_policy(transition->dp, &err_buff,
1204 transition->exp.list, transition->exp.count);
1206 g_warning("%s", err_buff);
1212 /*---------------------------------------------------------------------------*/
1213 static void create_tabs(GtkWidget *notebook, GtkWidget *box, const gchar *str)
1215 GtkWidget *label, *label_box, *menu_box;
1218 label_box = gtk_hbox_new(FALSE, 0);
1219 label = gtk_label_new(str);
1220 gtk_box_pack_start(GTK_BOX(label_box), label, FALSE, TRUE, 0);
1221 gtk_widget_show_all(label_box);
1223 // create context menu for tab
1224 menu_box = gtk_hbox_new(FALSE, 0);
1225 label = gtk_label_new(str);
1226 gtk_box_pack_start(GTK_BOX(menu_box), label, FALSE, TRUE, 0);
1227 gtk_widget_show_all(menu_box);
1229 gtk_notebook_append_page_menu(GTK_NOTEBOOK(notebook),
1230 box, label_box, menu_box);
1233 gchar *disp_window_title(enum ccs_screen_type current_page)
1236 gchar *title = NULL;
1237 const char *dir = get_policy_dir();
1238 enum mode_enum {e_off, e_net, e_on, e_end};
1239 const gchar *mode[e_end] = {_("offline"), _("nework"), _("online")};
1242 switch((int)current_page) {
1243 case CCS_SCREEN_DOMAIN_LIST :
1244 case CCS_SCREEN_ACL_LIST :
1246 title = g_strdup_printf("%s - %s%s%s", mode[e_off], dir,
1247 CCS_DISK_POLICY_DIR, CCS_DISK_POLICY_DOMAIN_POLICY);
1248 else if (is_network())
1249 title = g_strdup_printf("%s(%s) - %s", mode[e_net],
1250 get_remote_ip(str_ip),
1251 CCS_PROC_POLICY_DOMAIN_POLICY);
1253 title = g_strdup_printf("%s - %s", mode[e_on],
1254 CCS_PROC_POLICY_DOMAIN_POLICY);
1256 case CCS_SCREEN_EXCEPTION_LIST :
1258 title = g_strdup_printf("%s - %s%s%s", mode[e_off], dir,
1259 CCS_DISK_POLICY_DIR, CCS_DISK_POLICY_EXCEPTION_POLICY);
1260 else if (is_network())
1261 title = g_strdup_printf("%s(%s) - %s", mode[e_net],
1262 get_remote_ip(str_ip),
1263 CCS_PROC_POLICY_EXCEPTION_POLICY);
1265 title = g_strdup_printf("%s - %s", mode[e_on],
1266 CCS_PROC_POLICY_EXCEPTION_POLICY);
1268 case CCS_SCREEN_PROFILE_LIST :
1269 case CCS_SCREEN_NS_LIST :
1271 title = g_strdup_printf("%s - %s%s%s", mode[e_off], dir,
1272 CCS_DISK_POLICY_DIR, CCS_DISK_POLICY_PROFILE);
1273 else if (is_network())
1274 title = g_strdup_printf("%s(%s) - %s", mode[e_net],
1275 get_remote_ip(str_ip),
1276 CCS_PROC_POLICY_PROFILE);
1278 title = g_strdup_printf("%s - %s", mode[e_on],
1279 CCS_PROC_POLICY_PROFILE);
1281 case CCS_SCREEN_STAT_LIST :
1283 title = g_strdup_printf("%s: %s(%s) - %s",
1284 _("Statistics"), mode[e_net],
1285 get_remote_ip(str_ip),
1286 CCS_PROC_POLICY_STAT);
1288 title = g_strdup_printf("%s: %s - %s",
1289 _("Statistics"), mode[e_on],
1290 CCS_PROC_POLICY_STAT);
1292 case CCS_SCREEN_MANAGER_LIST :
1294 title = g_strdup_printf("%s: %s - %s%s%s",
1295 _("Manager Policy"), mode[e_off], dir,
1296 CCS_DISK_POLICY_DIR, CCS_DISK_POLICY_MANAGER);
1297 else if (is_network())
1298 title = g_strdup_printf("%s: %s(%s) - %s",
1299 _("Manager Policy"), mode[e_net],
1300 get_remote_ip(str_ip),
1301 CCS_PROC_POLICY_MANAGER);
1303 title = g_strdup_printf("%s: %s - %s",
1304 _("Manager Policy"), mode[e_on],
1305 CCS_PROC_POLICY_MANAGER);
1307 case CCS_MAXSCREEN :
1309 title = g_strdup_printf("%s: %s - %s%s%s",
1310 _("Domain Policy Editor"), mode[e_off], dir,
1311 CCS_DISK_POLICY_DIR, CCS_DISK_POLICY_DOMAIN_POLICY);
1312 else if (is_network())
1313 title = g_strdup_printf("%s: %s(%s) - %s",
1314 _("Domain Policy Editor"), mode[e_net],
1315 get_remote_ip(str_ip),
1316 CCS_PROC_POLICY_DOMAIN_POLICY);
1318 title = g_strdup_printf("%s: %s - %s",
1319 _("Domain Policy Editor"), mode[e_on],
1320 CCS_PROC_POLICY_DOMAIN_POLICY);
1327 static void control_acl_window(transition_t *tran)
1329 static gint x, y, w, h;
1330 static gboolean saved_flag = FALSE;
1332 if (tran->current_page == CCS_SCREEN_ACL_LIST) {
1333 gtk_window_move(GTK_WINDOW(tran->acl_window), x, y);
1334 gtk_window_set_default_size(
1335 GTK_WINDOW(tran->acl_window), w, h);
1337 gtk_widget_show(tran->acl_window);
1340 gtk_window_get_position(
1341 GTK_WINDOW(tran->acl_window), &x, &y);
1342 gtk_window_get_size(
1343 GTK_WINDOW(tran->acl_window), &w, &h);
1346 gtk_widget_hide(tran->acl_window);
1350 static void cb_switch_page(GtkWidget *notebook,
1351 GtkNotebookPage *page,
1355 GtkTreeSelection *selection_tree, *selection_list;
1359 old_page_num = gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook));
1360 if (page_num == old_page_num)
1363 DEBUG_PRINT("In Tab[%d]\n", page_num);
1366 selection_tree = gtk_tree_view_get_selection(
1367 GTK_TREE_VIEW(tran->treeview));
1368 selection_list = gtk_tree_view_get_selection(
1369 GTK_TREE_VIEW(tran->acl.listview));
1370 if (tran->acl_detached) {
1371 tran->current_page = CCS_SCREEN_ACL_LIST;
1372 control_acl_window(tran);
1374 if (tran->task_flag ||
1376 gtk_tree_selection_count_selected_rows(selection_tree)))
1377 tran->current_page = CCS_SCREEN_DOMAIN_LIST;
1378 else if(selection_list &&
1379 gtk_tree_selection_count_selected_rows(selection_list))
1380 tran->current_page = CCS_SCREEN_ACL_LIST;
1382 tran->current_page = CCS_MAXSCREEN;
1383 g_object_set(G_OBJECT(notebook), "can-focus", TRUE, NULL);
1386 tran->current_page = CCS_SCREEN_EXCEPTION_LIST;
1387 if (tran->acl_detached) {
1388 control_acl_window(tran);
1390 g_object_set(G_OBJECT(notebook), "can-focus", FALSE, NULL);
1393 tran->current_page = CCS_SCREEN_PROFILE_LIST;
1394 if (tran->acl_detached) {
1395 control_acl_window(tran);
1397 g_object_set(G_OBJECT(notebook), "can-focus", FALSE, NULL);
1400 tran->current_page = CCS_SCREEN_NS_LIST;
1401 if (tran->acl_detached) {
1402 control_acl_window(tran);
1404 g_object_set(G_OBJECT(notebook), "can-focus", FALSE, NULL);
1408 title = disp_window_title(tran->current_page);
1409 gtk_window_set_title(GTK_WINDOW(tran->window), title);
1411 set_sensitive(tran->actions, tran->task_flag,
1412 tran->current_page);
1414 refresh_transition(NULL, tran);
1415 disp_statusbar(tran, tran->current_page);
1416 DEBUG_PRINT("Out Tab[%d]\n", page_num);
1418 /*---------------------------------------------------------------------------*/
1419 static void cb_set_focus(GtkWindow *window,
1420 GtkWidget *view, transition_t *tran)
1422 if (view == tran->treeview) {
1423 DEBUG_PRINT("Focus changed!!<Domain>\n");
1424 tran->current_page = CCS_SCREEN_DOMAIN_LIST;
1425 } else if (view == tran->acl.listview) {
1426 DEBUG_PRINT("Focus changed!!<Acl>(%p)\n", view);
1427 tran->current_page = CCS_SCREEN_ACL_LIST;
1428 } else if (view == tran->exp.listview) {
1429 DEBUG_PRINT("Focus changed!!<Exception>\n");
1430 tran->current_page = CCS_SCREEN_EXCEPTION_LIST;
1431 } else if (view == tran->prf.listview) {
1432 DEBUG_PRINT("Focus changed!!<Profile>\n");
1433 tran->current_page = CCS_SCREEN_PROFILE_LIST;
1434 } else if (view == tran->tsk.treeview) {
1435 DEBUG_PRINT("Focus changed!!<Process>\n");
1436 tran->current_page = CCS_SCREEN_DOMAIN_LIST;
1437 } else if (G_IS_OBJECT(view)) {
1438 DEBUG_PRINT("Focus changed!![Other:%s(%p)]\n",
1439 g_type_name(G_OBJECT_TYPE(view)), view);
1440 // g_object_set(G_OBJECT(view), "can-focus", FALSE, NULL);
1442 DEBUG_PRINT("Focus changed!![Not object(%p)]\n", view);
1446 static void cb_set_focus_acl(GtkWindow *window,
1447 GtkWidget *view, transition_t *tran)
1449 tran->current_page = CCS_SCREEN_ACL_LIST;
1451 if (view == tran->acl.listview) {
1452 DEBUG_PRINT("Focus changed!!<Acl>(%p)\n", view);
1453 } else if (G_IS_OBJECT(view)) {
1454 DEBUG_PRINT("Focus changed!![Other:%s(%p)]\n",
1455 g_type_name(G_OBJECT_TYPE(view)), view);
1456 g_object_set(G_OBJECT(view), "can-focus", FALSE, NULL);
1458 DEBUG_PRINT("Focus changed!![Not object(%p)]\n", view);
1462 static void cb_show_acl(GtkWidget *view, transition_t *tran)
1464 DEBUG_PRINT("Show ACL!!(%p)==(%p)\n", tran->acl.listview, view);
1466 /*---------------------------------------------------------------------------*/
1470 GtkWidget *menubar, *toolbar = NULL;
1471 GtkWidget *statusbar;
1474 GtkWidget *tab1, *tab2, *tab3, *tab4;
1475 GtkWidget *notebook;
1477 GtkWidget *domainbar;
1478 GtkWidget *acl_window;
1479 GtkWidget *treeview, *listview;
1480 GtkContainer *container, *acl_container;
1482 struct ccs_domain_policy3 dp = { NULL, 0, NULL };
1483 transition_t transition;
1485 transition.task_flag = 0;
1486 if (get_domain_policy(&dp, &(transition.domain_count)))
1488 /*-----------------------------------------------*/
1490 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
1491 transition.window = window;
1492 gtk_window_set_title(GTK_WINDOW(window), _("gpet"));
1493 gtk_window_set_icon(GTK_WINDOW(window), get_png_file());
1494 gtk_container_set_border_width(GTK_CONTAINER(window), 0);
1495 g_signal_connect(G_OBJECT(window), "destroy",
1496 G_CALLBACK(gtk_main_quit), NULL);
1498 vbox = gtk_vbox_new(FALSE, 1);
1499 gtk_container_add(GTK_CONTAINER(window), vbox);
1501 // create menu bar & tool bar & popup menu
1502 menubar = create_menu(window, &transition, &toolbar);
1503 gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0);
1504 gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 0);
1507 notebook = gtk_notebook_new();
1508 // gtk_notebook_set_scrollable(GTK_NOTEBOOK(notebook), TRUE);
1509 gtk_notebook_popup_enable(GTK_NOTEBOOK(notebook));
1510 gtk_box_pack_start(GTK_BOX(vbox), notebook, TRUE, TRUE, 0);
1511 g_object_set(G_OBJECT(notebook), "can-focus", FALSE, NULL);
1513 // create status bar
1514 statusbar = gtk_statusbar_new();
1515 gtk_box_pack_start(GTK_BOX(vbox), statusbar, FALSE, FALSE, 0);
1516 contextid = gtk_statusbar_get_context_id(GTK_STATUSBAR(statusbar), "");
1517 gtk_statusbar_push(GTK_STATUSBAR(statusbar), contextid, _("gpet"));
1520 tab1 = gtk_vbox_new(FALSE, 1);
1521 // create name bar for full domain name
1522 domainbar = gtk_entry_new();
1523 gtk_box_pack_start(GTK_BOX(tab1), domainbar, FALSE, FALSE, 0);
1524 gtk_editable_set_editable(GTK_EDITABLE(domainbar), FALSE);
1525 gtk_entry_set_has_frame(GTK_ENTRY(domainbar), FALSE);
1526 gtk_entry_set_text(GTK_ENTRY(domainbar), "");
1527 // gtk_widget_set_can_focus(domainbar, FALSE); // 2.18
1528 g_object_set(G_OBJECT(domainbar), "can-focus", FALSE, NULL);
1530 pane = gtk_vpaned_new();
1531 g_object_set_data(G_OBJECT(window), "pane", pane);/* to save config */
1532 gtk_box_pack_start(GTK_BOX(tab1), pane, TRUE, TRUE, 0);
1534 // create domain transition view
1535 treeview = create_tree_model();
1536 container = create_domain_view(
1537 pane, treeview, gtk_paned_pack1, TRUE, NULL, NULL);
1538 //a add_tree_data(GTK_TREE_VIEW(treeview), &dp);
1539 //a gtk_tree_view_expand_all(GTK_TREE_VIEW(treeview));
1540 // ツリーインデント pixel(2.12)
1541 // gtk_tree_view_set_level_indentation(GTK_TREE_VIEW(treeview), 0);
1543 // gtk_tree_view_set_show_expanders(GTK_TREE_VIEW(treeview), TRUE);
1544 g_object_set(G_OBJECT(treeview), "enable-tree-lines", FALSE,
1546 // gtk_tree_view_set_grid_lines(GTK_TREE_VIEW(treeview),
1547 // GTK_TREE_VIEW_GRID_LINES_NONE);
1548 // create domain policy float window
1549 acl_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
1550 title = disp_window_title(CCS_MAXSCREEN);
1551 gtk_window_set_title(GTK_WINDOW(acl_window), title);
1553 gtk_container_set_border_width(GTK_CONTAINER(acl_window), 0);
1554 gtk_window_set_position(GTK_WINDOW(acl_window),
1555 GTK_WIN_POS_CENTER);
1556 gtk_window_set_destroy_with_parent(GTK_WINDOW(acl_window), TRUE);
1557 gtk_window_add_accel_group(GTK_WINDOW(acl_window),
1558 g_object_get_data(G_OBJECT(window), "AccelGroup"));
1559 gtk_widget_hide(acl_window);
1561 // create domain policy view
1562 listview = create_list_model(TRUE);
1563 transition.acl_detached = FALSE;
1564 acl_container = create_domain_view(pane, listview, gtk_paned_pack2,
1565 FALSE, acl_window, &transition.acl_detached);
1566 /* to save menu.c Detach_acl() */
1567 g_object_set_data(G_OBJECT(window), "acl_container", acl_container);
1569 // copy data pointer
1570 transition.domainbar = domainbar;
1571 transition.container = container;
1572 transition.treeview = treeview;
1573 transition.acl.listview = listview;
1574 transition.acl_window = acl_window;
1575 transition.statusbar = statusbar;
1576 transition.contextid = contextid;
1577 transition.dp = &dp;
1578 transition.acl.count = 0;
1579 transition.acl.list = NULL;
1580 transition.tsk.treeview = create_task_tree_model(&transition);
1581 transition.addentry = ADDENTRY_NON;
1583 // cursor move domain window
1584 g_signal_connect(gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)),
1585 "changed", G_CALLBACK(cb_selection), &transition);
1586 // g_signal_connect(GTK_TREE_VIEW(treeview), "cursor-changed",
1587 // G_CALLBACK(cb_selection), &transition);
1588 // double click or enter key domain window
1589 g_signal_connect(G_OBJECT(treeview), "row-activated",
1590 G_CALLBACK(cb_initialize_domain), &transition);
1591 // mouse click domain window
1592 g_signal_connect(G_OBJECT(treeview), "button-press-event",
1593 G_CALLBACK(cb_select_domain), &transition);
1594 // mouse click acl window
1595 g_signal_connect(G_OBJECT(listview), "button-press-event",
1596 G_CALLBACK(cb_select_acl), &transition);
1599 tab2 = gtk_vbox_new(FALSE, 1);
1600 // create exception policy view
1601 listview = create_list_model(TRUE);
1602 create_list_view(tab2, listview, TRUE);
1603 transition.exp.listview = listview;
1604 // mouse click exception window
1605 g_signal_connect(G_OBJECT(listview), "button-press-event",
1606 G_CALLBACK(cb_select_exp), &transition);
1608 tab3 = gtk_vbox_new(FALSE, 1);
1609 // create profile view
1610 listview = create_list_model(FALSE);
1611 create_list_view(tab3, listview, FALSE);
1612 transition.prf.listview = listview;
1613 transition.prf.count = 0;
1614 transition.prf.list = NULL;
1615 if (get_profile(&(transition.prf.list), &(transition.prf.count)))
1616 g_warning("Read error : profile");
1618 add_list_data(&(transition.prf), CCS_SCREEN_PROFILE_LIST);
1619 // mouse click profile window
1620 g_signal_connect(G_OBJECT(listview), "button-press-event",
1621 G_CALLBACK(cb_select_prf), &transition);
1623 tab4 = gtk_vbox_new(FALSE, 1);
1624 // create namespace view
1625 listview = create_list_model(FALSE);
1626 create_list_view(tab4, listview, FALSE);
1627 transition.ns.listview = listview;
1628 transition.ns.count = 0;
1629 transition.ns.list = NULL;
1630 if (get_namespace(&(transition.ns.list), &(transition.ns.count)))
1631 g_warning("Read error : namespace");
1633 add_list_data(&(transition.ns), CCS_SCREEN_NS_LIST);
1634 // mouse click namespace window
1635 g_signal_connect(G_OBJECT(listview), "button-press-event",
1636 G_CALLBACK(cb_select_ns), &transition);
1637 // cursor move namespace window
1638 g_signal_connect(gtk_tree_view_get_selection(GTK_TREE_VIEW(listview)),
1639 "changed", G_CALLBACK(cb_ns_selection), &transition);
1642 create_tabs(notebook, tab1, _("Domain Transition"));
1643 create_tabs(notebook, tab2, _("Exception Policy"));
1644 create_tabs(notebook, tab3, _("Profile"));
1645 create_tabs(notebook, tab4, get_ns_name());
1647 /* to save menu.c Process_state() */
1648 g_object_set_data(G_OBJECT(window), "notebook", notebook);
1649 g_object_set_data(G_OBJECT(window), "tab1", tab1);
1650 /* to save cb_ns_selection() */
1651 g_object_set_data(G_OBJECT(window), "tab4", tab4);
1654 g_signal_connect(G_OBJECT(notebook), "switch_page",
1655 G_CALLBACK(cb_switch_page), &transition);
1656 read_config(&transition);
1658 /* set widget names for .gpetrc */
1659 gtk_widget_set_name(transition.window, "GpetMainWindow");
1660 gtk_widget_set_name(transition.domainbar, "GpetDomainbar");
1661 gtk_widget_set_name(transition.acl_window, "GpetAclWindow");
1663 gtk_widget_show_all(window);
1669 /*---------------------------------------------------------------------------*/
1670 int main(int argc, char **argv)
1672 const gchar *homedir = g_getenv("HOME");
1677 bindtextdomain(GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR);
1678 bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
1679 textdomain(GETTEXT_PACKAGE);
1682 gtk_init(&argc, &argv);
1685 homedir = g_get_home_dir ();
1686 gpetrc = g_build_path("/", homedir, ".gpetrc", NULL);
1687 gtk_rc_parse(gpetrc);
1690 result = ccs_main(argc, argv);
1694 /*---------------------------------------------------------------------------*/