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 */
152 name = g_strdup(dp->list[*index].target->name);
153 redirect_index = get_find_target_domain(*index);
155 if (redirect_index >= 0)
156 is_dis = g_strdup_printf(" ( -> %d )",
157 dp->list[redirect_index].number);
158 else if (redirect_index == EOF)
159 is_dis = g_strdup_printf(" ( -> Not Found )");
161 is_dis = g_strdup_printf(" ( -> Namespace jump )");
162 } else if (dp->list[*index].is_dd) { /* delete_domain */
165 domain = g_strdup_printf("%s%s%s%s%s%s",
166 dp->list[*index].is_dd ? "( " : "",
167 is_jump_source(dp, *index) ? "=> " : "",
169 dp->list[*index].is_dd ? " )" : "",
173 gtk_tree_store_set(store, &iter, COLUMN_DOMAIN_NAME, domain,
175 COLUMN_REDIRECT, redirect_index, -1);
183 while (*index < dp->list_len) {
184 sp = get_domain_name(dp, *index);
186 const char *cp = strchr(sp, ' ');
193 n = add_tree_store(store, &iter, dp, index, n);
201 void add_tree_data(GtkTreeView *treeview, struct ccs_domain_policy3 *dp)
204 GtkTreeIter *iter = NULL;
205 int index = 0, nest = -1;
207 store = GTK_TREE_STORE(gtk_tree_view_get_model(treeview));
208 gtk_tree_store_clear(store); // TODO 遅い
209 if (dp->list_len > 0)
210 add_tree_store(store, iter, dp, &index, nest);
212 /*---------------------------------------------------------------------------*/
213 static GtkTreeViewColumn *column_add(
214 GtkCellRenderer *renderer,
215 const GtkWidget *treeview,
217 enum tree_column_pos pos,
218 const gchar *attribute,
222 GtkTreeViewColumn *column;
224 g_object_set(renderer, "xalign", xalign, "ypad", 0, NULL);
225 column = gtk_tree_view_column_new_with_attributes(
226 title, renderer, attribute, pos, NULL);
227 gtk_tree_view_column_add_attribute(column, renderer,
228 "foreground", COLUMN_COLOR);
229 // gtk_tree_view_column_set_alignment(column, xalign);
230 gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
234 /*---------------------------------------------------------------------------*/
236 static void cb_status_toggled(GtkCellRendererToggle *renderer,
245 model = gtk_tree_view_get_model(GTK_TREE_VIEW(user_data));
246 path = gtk_tree_path_new_from_string(path_string);
248 gtk_tree_model_get_iter(model, &iter, path);
249 gtk_tree_model_get(model, &iter, COLUMN_INDEX, &status, -1);
250 gtk_tree_store_set(GTK_TREE_STORE(model), &iter,
251 COLUMN_INDEX, !status, -1);
252 gtk_tree_path_free(path);
255 /*---------------------------------------------------------------------------*/
256 static GtkWidget *create_tree_model(void)
260 // GtkCellRenderer *renderer;
261 GtkTreeViewColumn *column;
263 store = gtk_tree_store_new(N_COLUMNS_TREE,
274 treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
275 g_object_unref(store);
278 // renderer = gtk_cell_renderer_toggle_new();
279 // g_signal_connect(renderer, "toggled",
280 // G_CALLBACK(cb_status_toggled), treeview);
282 renderer = gtk_cell_renderer_text_new();
283 g_object_set(renderer, "visible", FALSE, NULL);
284 column = column_add(renderer, treeview,
285 "", COLUMN_INDEX, "text", 0.0);
287 column = column_add(gtk_cell_renderer_text_new(), treeview,
288 "No.", COLUMN_NUMBER, "text", 1.0);
289 column = column_add(gtk_cell_renderer_text_new(), treeview,
290 " ", COLUMN_COLON, "text", 0.5);
291 column = column_add(gtk_cell_renderer_text_new(), treeview,
292 "prof", COLUMN_PROFILE, "text", 1.0);
293 column = column_add(gtk_cell_renderer_text_new(), treeview,
294 "#", COLUMN_KEEPER_DOMAIN, "text", 0.5);
295 column = column_add(gtk_cell_renderer_text_new(), treeview,
296 "*", COLUMN_INITIALIZER_TARGET, "text", 0.5);
297 column = column_add(gtk_cell_renderer_text_new(), treeview,
298 "!", COLUMN_DOMAIN_UNREACHABLE, "text", 0.5);
299 column = column_add(gtk_cell_renderer_text_new(), treeview,
300 "Domain Name", COLUMN_DOMAIN_NAME, "text", 0.0);
302 gtk_tree_view_set_expander_column(GTK_TREE_VIEW(treeview), column);
303 // gtk_tree_view_column_set_spacing(column, 1);
305 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), FALSE);
309 /*---------------------------------------------------------------------------*/
310 enum list_column_pos {
318 void add_list_data(generic_list_t *generic,
319 enum ccs_screen_type current_page)
324 gchar *str_num, *ope, *profile, *alias;
326 store = GTK_LIST_STORE(gtk_tree_view_get_model(
327 GTK_TREE_VIEW(generic->listview)));
329 gtk_list_store_clear(store);
330 for(i = 0; i < generic->count; i++){
331 str_num = g_strdup_printf("%4d", i);
332 gtk_list_store_append(store, &iter);
334 switch((int)current_page) {
335 case CCS_SCREEN_EXCEPTION_LIST :
336 case CCS_SCREEN_ACL_LIST :
337 ope = decode_from_octal_str(generic->list[i].operand);
339 ccs_directives[generic->list[i].directive].alias;
340 gtk_list_store_set(store, &iter,
341 LIST_NUMBER, str_num,
348 case CCS_SCREEN_PROFILE_LIST :
349 profile = g_strdup_printf("%3u-",
350 generic->list[i].directive);
351 alias = g_strdup_printf("%s%s",
352 generic->list[i].directive < 256 ?
354 generic->list[i].operand);
355 gtk_list_store_set(store, &iter,
356 LIST_NUMBER, str_num,
363 case CCS_SCREEN_NS_LIST :
364 gtk_list_store_set(store, &iter,
365 LIST_NUMBER, str_num,
367 LIST_OPERAND, generic->list[i].operand,
375 static void disable_header_focus(GtkTreeViewColumn *column, const gchar *str)
377 GtkWidget *label, *dummy;
378 GtkButton *button = GTK_BUTTON(gtk_button_new());
380 label = gtk_label_new(str);
381 gtk_tree_view_column_set_widget(column, label);
382 gtk_widget_show(label);
383 dummy = gtk_tree_view_column_get_widget(column);
385 // g_print("<%s:%p> ", g_type_name(G_OBJECT_TYPE(dummy)), dummy);
387 g_object_set(G_OBJECT(dummy), "can-focus", FALSE, NULL);
388 // gtk_widget_set_can_focus(dummy, FALSE); // 2.18
389 if (G_OBJECT_TYPE(dummy) == G_OBJECT_TYPE(button))
391 dummy = gtk_widget_get_parent(dummy);
396 static GtkWidget *create_list_model(gboolean alias_flag)
399 GtkListStore *liststore;
400 GtkCellRenderer *renderer;
401 GtkTreeViewColumn *column;
403 liststore = gtk_list_store_new(N_COLUMNS_LIST,
404 G_TYPE_STRING, G_TYPE_STRING,
405 G_TYPE_STRING, G_TYPE_STRING);
406 treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(liststore));
407 g_object_unref(liststore);
409 renderer = gtk_cell_renderer_text_new();
410 g_object_set(renderer, "xalign", 1.0, "ypad", 0, NULL);
411 column = gtk_tree_view_column_new_with_attributes(
412 "No.", renderer, "text", LIST_NUMBER, NULL);
413 gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
414 gtk_tree_view_column_set_sort_column_id(column, LIST_NUMBER);
415 // gtk_tree_view_column_set_alignment(column, 1.0);
416 disable_header_focus(column, "No.");
418 renderer = gtk_cell_renderer_text_new();
419 column = gtk_tree_view_column_new_with_attributes(" ", renderer,
420 "text", LIST_COLON, NULL);
421 gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
422 disable_header_focus(column, " ");
425 renderer = gtk_cell_renderer_text_new();
426 column = gtk_tree_view_column_new_with_attributes(
427 "directive", renderer, "text", LIST_ALIAS, NULL);
428 gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
429 gtk_tree_view_column_set_sort_column_id(column, LIST_ALIAS);
430 disable_header_focus(column, "directive");
433 renderer = gtk_cell_renderer_text_new();
434 column = gtk_tree_view_column_new_with_attributes("operand", renderer,
435 "text", LIST_OPERAND, NULL);
436 gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
437 gtk_tree_view_column_set_sort_column_id(column, LIST_OPERAND);
438 disable_header_focus(column, "operand");
441 // gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), TRUE);
445 /*---------------------------------------------------------------------------*/
446 gint get_current_domain_index(transition_t *transition)
448 GtkTreeSelection *selection;
454 selection = gtk_tree_view_get_selection(
455 GTK_TREE_VIEW(transition->treeview));
457 gtk_tree_selection_count_selected_rows(selection)) {
458 list = gtk_tree_selection_get_selected_rows(selection, NULL);
459 model = gtk_tree_view_get_model(
460 GTK_TREE_VIEW(transition->treeview));
461 gtk_tree_model_get_iter(model, &iter, g_list_first(list)->data);
462 gtk_tree_model_get(model, &iter, COLUMN_INDEX, &index, -1);
463 g_list_foreach(list, (GFunc)gtk_tree_path_free, NULL);
466 DEBUG_PRINT("select Domain index[%d]\n", index);
470 gchar *get_alias_and_operand(GtkWidget *view, gboolean alias_flag)
472 GtkTreeSelection *selection;
476 gchar *alias = NULL, *operand = NULL,
479 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
481 gtk_tree_selection_count_selected_rows(selection)) {
482 list = gtk_tree_selection_get_selected_rows(selection, NULL);
483 model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
484 gtk_tree_model_get_iter(model, &iter, g_list_first(list)->data);
486 gtk_tree_model_get(model, &iter,
487 LIST_ALIAS, &alias, LIST_OPERAND, &operand, -1);
488 str_buff = g_strdup_printf("%s %s", alias, operand);
492 gtk_tree_model_get(model, &iter,
493 LIST_OPERAND, &operand, -1);
494 str_buff = g_strchug(operand);
500 /*---------------------------------------------------------------------------*/
501 static gboolean move_pos_list(GtkTreeModel *model, GtkTreePath *path,
502 GtkTreeIter *iter, transition_t *transition)
504 GtkWidget *view = NULL;
505 GtkTreeSelection *selection;
507 gchar *alias = NULL, *operand = NULL;
508 gchar *entry, *str_buff = NULL;
512 entry = get_combo_entry_last();
514 switch((int)transition->addentry) {
515 case ADDENTRY_DOMAIN_LIST :
516 view = transition->treeview;
517 gtk_tree_model_get(model, iter, COLUMN_INDEX, &index, -1);
518 str_buff = decode_from_octal_str(
519 get_domain_name(transition->dp, index));
520 cmp = strcmp(entry, str_buff);
522 case ADDENTRY_ACL_LIST :
523 view = transition->acl.listview;
524 gtk_tree_model_get(model, iter,
525 LIST_ALIAS, &alias, LIST_OPERAND, &operand, -1);
526 str_buff = g_strdup_printf("%s %s", alias, operand); // TODO
527 cmp = strcmp(entry, str_buff);
528 //g_print("%2d[%s][%s]\n", cmp, entry, str_buff);
530 case ADDENTRY_EXCEPTION_LIST :
531 view = transition->exp.listview;
532 gtk_tree_model_get(model, iter,
533 LIST_ALIAS, &alias, LIST_OPERAND, &operand, -1);
534 str_buff = g_strdup_printf("%s %s", alias, operand); // TODO
535 cmp = strcmp(entry, str_buff);
537 case ADDENTRY_PROFILE_LIST :
538 view = transition->prf.listview;
539 gtk_tree_model_get(model, iter, LIST_NUMBER, &str_buff, -1);
540 cmp = atoi(entry) - transition->prf.list[atoi(str_buff)].directive;
541 //g_print("entry[%s] [%s:%d]\n", entry, str_buff, transition->prf.list[atoi(str_buff)].directive);
543 case ADDENTRY_NAMESPACE_LIST :
544 view = transition->ns.listview;
545 gtk_tree_model_get(model, iter, LIST_OPERAND, &operand, -1);
546 cmp = strcmp(entry, operand);
554 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
557 gtk_tree_selection_unselect_path(selection, path);
560 gtk_tree_selection_select_path(selection, path);
563 gchar *path_str = gtk_tree_path_to_string(path);
564 g_print("Put Path[%s]\n", path_str);
572 void set_position_addentry(transition_t *transition, GtkTreePath **path)
574 GtkWidget *view = NULL;
576 GtkTreeSelection *selection;
580 switch((int)transition->addentry) {
584 case ADDENTRY_DOMAIN_LIST :
585 view = transition->treeview;
587 case ADDENTRY_ACL_LIST :
588 view = transition->acl.listview;
590 case ADDENTRY_EXCEPTION_LIST :
591 view = transition->exp.listview;
593 case ADDENTRY_PROFILE_LIST :
594 view = transition->prf.listview;
596 case ADDENTRY_NAMESPACE_LIST :
597 view = transition->ns.listview;
601 model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
602 gtk_tree_model_foreach(model,
603 (GtkTreeModelForeachFunc)move_pos_list, transition);
604 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
605 list = gtk_tree_selection_get_selected_rows(selection, NULL);
607 gtk_tree_path_free(*path);
608 (*path) = gtk_tree_path_copy(g_list_first(list)->data);
609 g_list_foreach(list, (GFunc)gtk_tree_path_free, NULL);
612 transition->addentry = ADDENTRY_NON;
616 gchar *path_str = gtk_tree_path_to_string(*path);
617 g_print("Get Path[%s]\n", path_str);
622 /*---------------------------------------------------------------------------*/
623 static void cb_selection(GtkTreeSelection *selection,
624 transition_t *transition)
631 GtkTreePath *path = NULL;
632 GtkTreeViewColumn *column = NULL;
635 DEBUG_PRINT("In **************************** \n");
636 select_count = gtk_tree_selection_count_selected_rows(selection);
637 DEBUG_PRINT("select count[%d]\n", select_count);
638 if (0 == select_count)
641 model = gtk_tree_view_get_model(
642 GTK_TREE_VIEW(transition->treeview));
643 list = gtk_tree_selection_get_selected_rows(selection, NULL);
644 gtk_tree_model_get_iter(model, &iter, g_list_first(list)->data);
645 g_list_foreach(list, (GFunc)gtk_tree_path_free, NULL);
647 gtk_tree_model_get(model, &iter, COLUMN_INDEX, &index, -1);
648 DEBUG_PRINT("--- index [%4d] ---\n", index);
649 name = decode_from_octal_str(get_domain_name(transition->dp, index));
650 if (is_jump_source(transition->dp, index)) {
651 gchar *cp = strrchr(name, ' ');
655 gtk_entry_set_text(GTK_ENTRY(transition->domainbar), name);
658 gtk_tree_view_get_cursor(GTK_TREE_VIEW(
659 transition->acl.listview), &path, &column);
661 get_acl_list(transition->dp, index,
662 &(transition->acl.list), &(transition->acl.count));
663 add_list_data(&(transition->acl), CCS_SCREEN_ACL_LIST);
665 if (transition->acl.count) {
666 set_position_addentry(transition, &path);
667 DEBUG_PRINT("ACL count<%d>\n", transition->acl.count);
669 view_cursor_set(transition->acl.listview, path, column);
670 // gtk_widget_grab_focus(transition->acl.listview);
671 disp_statusbar(transition, CCS_SCREEN_ACL_LIST);
672 } else { /* delete_domain or initializer_source */
673 disp_statusbar(transition, CCS_MAXSCREEN);
675 DEBUG_PRINT("Out **************************** \n");
677 /*---------------------------------------------------------------------------*/
678 static void set_ns_tab_label(transition_t *transition,
679 const gchar *namespace)
684 notebook = g_object_get_data(
685 G_OBJECT(transition->window), "notebook");
686 tab4 = g_object_get_data(
687 G_OBJECT(transition->window), "tab4");
688 gtk_notebook_set_tab_label_text(
689 GTK_NOTEBOOK(notebook), tab4, namespace);
690 gtk_notebook_set_menu_label_text(
691 GTK_NOTEBOOK(notebook), tab4, namespace);
693 put_ns_name(namespace);
695 /*---------------------------------------------------------------------------*/
702 static gboolean find_is_dis(GtkTreeModel *model, GtkTreePath *path,
703 GtkTreeIter *iter, struct FindIsDis_t *data)
707 gtk_tree_model_get(model, iter, COLUMN_INDEX, &index, -1);
708 if (data->redirect_index == index) {
710 data->path = gtk_tree_path_copy(path);
716 static void cb_initialize_domain(GtkTreeView *treeview, GtkTreePath *treepath,
717 GtkTreeViewColumn *treeviewcolumn, transition_t *transition)
721 struct FindIsDis_t data;
724 DEBUG_PRINT("In **************************** \n");
725 model = gtk_tree_view_get_model(treeview);
726 if (!gtk_tree_model_get_iter(model, &iter, treepath))
729 gtk_tree_model_get(model, &iter, COLUMN_INDEX, &index,
730 COLUMN_REDIRECT, &data.redirect_index, -1);
732 //#define DEBUG_PRINT g_print
733 DEBUG_PRINT("index[%d] redirect_index[%d]\n", index, data.redirect_index);
735 if (data.redirect_index == -2) {
737 g_strdup(transition->dp->list[index].target->name);
738 DEBUG_PRINT("%s\n", namespace);
739 char *cp = strchr(namespace, ' ');
742 set_ns_tab_label(transition, namespace);
744 refresh_transition(NULL, transition);
746 } else if (data.redirect_index < 0)
747 return; /* not initialize_domain */
750 gtk_tree_model_foreach(model,
751 (GtkTreeModelForeachFunc)find_is_dis, &data);
755 gchar *path_str = gtk_tree_path_to_string(data.path);
756 DEBUG_PRINT("TreePath[%s]\n", path_str);
759 GtkTreeViewColumn *column = NULL;
760 gtk_tree_view_expand_to_path(GTK_TREE_VIEW(treeview), data.path);
761 gtk_tree_selection_select_iter(
762 gtk_tree_view_get_selection(
763 GTK_TREE_VIEW(treeview)), &data.iter);
764 DEBUG_PRINT("Domain ");
765 view_cursor_set(GTK_WIDGET(treeview), data.path, column);
767 DEBUG_PRINT("Out **************************** \n");
769 /*---------------------------------------------------------------------------*/
770 void set_sensitive(GtkActionGroup *actions, int task_flag,
771 enum ccs_screen_type current_page)
773 gboolean sens_edt, sens_add, sens_del, sens_tsk,
774 sens_dch, sens_cpy, sens_opt;
776 sens_edt = sens_add = sens_del = sens_tsk =
777 sens_dch = sens_cpy = sens_opt = FALSE;
779 switch((int)current_page) {
780 case CCS_SCREEN_DOMAIN_LIST :
791 case CCS_SCREEN_ACL_LIST :
799 case CCS_SCREEN_EXCEPTION_LIST :
804 case CCS_SCREEN_PROFILE_LIST :
809 case CCS_SCREEN_NS_LIST :
815 gtk_action_set_sensitive(gtk_action_group_get_action(
816 actions, "Edit"), sens_edt);
817 gtk_action_set_sensitive(gtk_action_group_get_action(
818 actions, "Add"), sens_add);
819 gtk_action_set_sensitive(gtk_action_group_get_action(
820 actions, "Delete"), sens_del);
821 gtk_action_set_sensitive(gtk_action_group_get_action(
822 actions, "ACL"), sens_dch);
823 gtk_action_set_sensitive(gtk_action_group_get_action(
824 actions, "Copy"), sens_cpy);
825 gtk_action_set_sensitive(gtk_action_group_get_action(
826 actions, "OptimizationSupport"), sens_opt);
829 gtk_action_set_sensitive(gtk_action_group_get_action(
830 actions, "Process"), sens_tsk);
833 static gint popup_menu(transition_t *transition, guint button)
837 /* get menu.c create_menu()*/
838 popup = g_object_get_data(
839 G_OBJECT(transition->window), "popup");
841 gtk_menu_popup(GTK_MENU(popup), NULL, NULL, NULL, NULL,
842 0, gtk_get_current_event_time());
849 static gboolean cb_select_domain(GtkTreeView *treeview, GdkEventButton *event,
850 transition_t *transition)
852 transition->current_page = CCS_SCREEN_DOMAIN_LIST;
854 set_sensitive(transition->actions, transition->task_flag,
855 transition->current_page);
856 if (event->button == 3) {
858 /* get menu.c create_menu()*/
859 popup = g_object_get_data(
860 G_OBJECT(transition->window), "popup");
862 gtk_menu_popup(GTK_MENU(popup), NULL, NULL, NULL, NULL,
863 0, gtk_get_current_event_time());
870 static gboolean cb_select_acl(GtkTreeView *listview, GdkEventButton *event,
871 transition_t *transition)
873 transition->current_page = CCS_SCREEN_ACL_LIST;
874 set_sensitive(transition->actions, transition->task_flag,
875 transition->current_page);
876 return popup_menu(transition, event->button);
879 static gboolean cb_select_exp(GtkTreeView *listview, GdkEventButton *event,
880 transition_t *transition)
882 transition->current_page = CCS_SCREEN_EXCEPTION_LIST;
883 set_sensitive(transition->actions, transition->task_flag,
884 transition->current_page);
885 return popup_menu(transition, event->button);
888 static gboolean cb_select_prf(GtkTreeView *listview, GdkEventButton *event,
889 transition_t *transition)
891 transition->current_page = CCS_SCREEN_PROFILE_LIST;
892 set_sensitive(transition->actions, transition->task_flag,
893 transition->current_page);
894 return popup_menu(transition, event->button);
897 static gboolean cb_select_ns(GtkTreeView *listview, GdkEventButton *event,
898 transition_t *transition)
900 transition->current_page = CCS_SCREEN_NS_LIST;
901 set_sensitive(transition->actions, transition->task_flag,
902 transition->current_page);
903 return popup_menu(transition, event->button);
905 /*---------------------------------------------------------------------------*/
906 static void cb_ns_selection(GtkTreeSelection *selection,
907 transition_t *transition)
914 if (0 == gtk_tree_selection_count_selected_rows(selection))
917 model = gtk_tree_view_get_model(
918 GTK_TREE_VIEW(transition->ns.listview));
919 list = gtk_tree_selection_get_selected_rows(selection, NULL);
920 gtk_tree_model_get_iter(model, &iter, g_list_first(list)->data);
921 g_list_foreach(list, (GFunc)gtk_tree_path_free, NULL);
923 gtk_tree_model_get(model, &iter, LIST_OPERAND, &namespace, -1);
924 set_ns_tab_label(transition, namespace);
927 /*---------------------------------------------------------------------------*/
928 static gboolean inc_search(GtkTreeModel *model, gint column,
929 const gchar *key, GtkTreeIter *iter, gpointer search_data)
934 gtk_tree_model_get(model, iter, column, &buff, -1);
935 DEBUG_PRINT("key[%s] buff[%s]\n", key, buff);
936 ret = g_strrstr(buff, key) ? FALSE : TRUE;
942 void view_setting(GtkWidget *treeview, gint search_column)
945 gtk_tree_selection_set_mode(
946 gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)),
947 GTK_SELECTION_MULTIPLE);
949 gtk_tree_view_set_rubber_banding(GTK_TREE_VIEW(treeview), TRUE);
951 gtk_tree_view_set_search_column(GTK_TREE_VIEW(treeview),
953 gtk_tree_view_set_enable_search(GTK_TREE_VIEW(treeview), TRUE);
954 gtk_tree_view_set_search_equal_func(GTK_TREE_VIEW(treeview),
955 (GtkTreeViewSearchEqualFunc)inc_search, NULL, NULL);
958 /*---------------------------------------------------------------------------*/
959 static GtkContainer *create_domain_view(GtkWidget *paned,
960 GtkWidget *treeview, void (*paned_pack)(),
962 GtkWidget *acl_window, gboolean *acl_detached)
964 GtkWidget *scrolledwin;
965 GtkContainer *container;
967 scrolledwin = gtk_scrolled_window_new(NULL, NULL);
968 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwin),
969 GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
970 gtk_scrolled_window_set_shadow_type(
971 GTK_SCROLLED_WINDOW(scrolledwin), GTK_SHADOW_IN);
973 paned_pack(GTK_PANED(paned), scrolledwin, resize, TRUE);
976 view_setting(treeview, LIST_OPERAND);
978 view_setting(treeview, COLUMN_DOMAIN_NAME);
981 container = GTK_CONTAINER(scrolledwin);
982 gtk_container_add(container, treeview);
986 /*---------------------------------------------------------------------------*/
987 static void create_list_view(GtkWidget *box, GtkWidget *listview,
990 GtkWidget *scrolledwin;
992 scrolledwin = gtk_scrolled_window_new(NULL, NULL);
993 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwin),
994 GTK_POLICY_AUTOMATIC,
996 gtk_scrolled_window_set_shadow_type(
997 GTK_SCROLLED_WINDOW(scrolledwin), GTK_SHADOW_IN);
998 gtk_box_pack_start(GTK_BOX(box), scrolledwin, TRUE, TRUE, 0);
999 gtk_container_add(GTK_CONTAINER(scrolledwin), listview);
1003 gtk_tree_selection_set_mode(
1004 gtk_tree_view_get_selection(
1005 GTK_TREE_VIEW(listview)),
1006 GTK_SELECTION_MULTIPLE);
1008 gtk_tree_view_set_rubber_banding(
1009 GTK_TREE_VIEW(listview), TRUE);
1012 gtk_tree_view_set_search_column(
1013 GTK_TREE_VIEW(listview), LIST_OPERAND);
1014 gtk_tree_view_set_enable_search(
1015 GTK_TREE_VIEW(listview), TRUE);
1016 gtk_tree_view_set_search_equal_func(GTK_TREE_VIEW(listview),
1017 (GtkTreeViewSearchEqualFunc)inc_search, NULL, NULL);
1019 /*---------------------------------------------------------------------------*/
1020 static void set_select_flag_domain(gpointer data,
1021 transition_t *transition)
1023 GtkTreeModel *model;
1026 struct ccs_domain_policy3 *dp = transition->dp;
1029 model = gtk_tree_view_get_model(
1030 GTK_TREE_VIEW(transition->treeview));
1031 if (!model || !gtk_tree_model_get_iter(model, &iter, data)) {
1032 g_warning("ERROR: %s(%d)", __FILE__, __LINE__);
1035 gtk_tree_model_get(model, &iter, COLUMN_INDEX, &index, -1);
1037 DEBUG_PRINT("index[%d]\n", index);
1038 /* deleted_domain or initializer_source */
1039 if (!(dp->list[index].is_dd) && !(dp->list[index].target))
1040 dp->list_selected[index] = 1;
1043 gint delete_domain(transition_t *transition,
1044 GtkTreeSelection *selection, gint count)
1047 char *err_buff = NULL;
1051 list = gtk_tree_selection_get_selected_rows(selection, NULL);
1052 g_list_foreach(list, (GFunc)set_select_flag_domain, transition);
1054 g_list_foreach(list, (GFunc)gtk_tree_path_free, NULL);
1057 result = delete_domain_policy(transition->dp, &err_buff);
1059 g_warning("%s", err_buff);
1065 /*---------------------------------------------------------------------------*/
1066 gint set_domain_profile(transition_t *transition,
1067 GtkTreeSelection *selection, guint profile)
1071 char *err_buff = NULL;
1074 list = gtk_tree_selection_get_selected_rows(selection, NULL);
1075 if (transition->task_flag)
1076 g_list_foreach(list, (GFunc)set_select_flag_process,
1077 &(transition->tsk));
1079 g_list_foreach(list, (GFunc)set_select_flag_domain,
1082 g_list_foreach(list, (GFunc)gtk_tree_path_free, NULL);
1085 profile_str = g_strdup_printf("%u", profile);
1086 result = set_profile(transition->dp, profile_str, &err_buff);
1087 // g_free(profile_str); → editpolicy.c
1089 g_warning("%s", err_buff);
1095 /*---------------------------------------------------------------------------*/
1096 gboolean disp_acl_line(GtkTreeModel *model, GtkTreePath *path,
1097 GtkTreeIter *iter, generic_list_t *acl)
1099 GtkTreeSelection *selection;
1102 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(acl->listview));
1104 gtk_tree_model_get(model, iter, LIST_NUMBER, &str_num, -1);
1106 if (acl->list[atoi(str_num)].selected) {
1108 gchar *str_path = gtk_tree_path_to_string(path);
1109 g_print("select[%d] path[%s]\n", atoi(str_num), str_path);
1112 gtk_tree_selection_select_path(selection, path);
1114 gtk_tree_selection_unselect_path(selection, path);
1121 gint select_list_line(generic_list_t *gen)
1123 GtkTreeSelection *selection;
1125 GtkTreeModel *model;
1130 selection = gtk_tree_view_get_selection(
1131 GTK_TREE_VIEW(gen->listview));
1133 !gtk_tree_selection_count_selected_rows(selection))
1136 list = gtk_tree_selection_get_selected_rows(selection, NULL);
1140 model = gtk_tree_view_get_model(GTK_TREE_VIEW(gen->listview));
1141 gtk_tree_model_get_iter(model, &iter, g_list_first(list)->data);
1142 gtk_tree_model_get(model, &iter, LIST_NUMBER, &str_num, -1);
1143 g_list_foreach(list, (GFunc)gtk_tree_path_free, NULL);
1146 index = atoi(str_num);
1151 /*---------------------------------------------------------------------------*/
1152 static void set_delete_flag_gen(gpointer data, generic_list_t *gen)
1154 GtkTreeModel *model;
1158 model = gtk_tree_view_get_model(GTK_TREE_VIEW(gen->listview));
1159 if (!model || !gtk_tree_model_get_iter(model, &iter, data)) {
1160 g_warning("ERROR: %s(%d)", __FILE__, __LINE__);
1163 gtk_tree_model_get(model, &iter, LIST_NUMBER, &str_num, -1);
1165 DEBUG_PRINT("index[%d]\n", atoi(str_num));
1166 gen->list[atoi(str_num)].selected = 1;
1170 gint delete_acl(transition_t *transition,
1171 GtkTreeSelection *selection, gint count)
1174 char *err_buff = NULL;
1178 list = gtk_tree_selection_get_selected_rows(selection, NULL);
1179 g_list_foreach(list, (GFunc)set_delete_flag_gen, &(transition->acl));
1180 g_list_foreach(list, (GFunc)gtk_tree_path_free, NULL);
1183 result = delete_acl_policy(transition->dp, &err_buff,
1184 transition->acl.list, transition->acl.count);
1186 g_warning("%s", err_buff);
1193 gint delete_exp(transition_t *transition,
1194 GtkTreeSelection *selection, gint count)
1197 char *err_buff = NULL;
1200 list = gtk_tree_selection_get_selected_rows(selection, NULL);
1201 g_list_foreach(list, (GFunc)set_delete_flag_gen, &(transition->exp));
1202 g_list_foreach(list, (GFunc)gtk_tree_path_free, NULL);
1205 result = delete_exp_policy(transition->dp, &err_buff,
1206 transition->exp.list, transition->exp.count);
1208 g_warning("%s", err_buff);
1214 /*---------------------------------------------------------------------------*/
1215 static void create_tabs(GtkWidget *notebook, GtkWidget *box, const gchar *str)
1217 GtkWidget *label, *label_box, *menu_box;
1220 label_box = gtk_hbox_new(FALSE, 0);
1221 label = gtk_label_new(str);
1222 gtk_box_pack_start(GTK_BOX(label_box), label, FALSE, TRUE, 0);
1223 gtk_widget_show_all(label_box);
1225 // create context menu for tab
1226 menu_box = gtk_hbox_new(FALSE, 0);
1227 label = gtk_label_new(str);
1228 gtk_box_pack_start(GTK_BOX(menu_box), label, FALSE, TRUE, 0);
1229 gtk_widget_show_all(menu_box);
1231 gtk_notebook_append_page_menu(GTK_NOTEBOOK(notebook),
1232 box, label_box, menu_box);
1235 gchar *disp_window_title(enum ccs_screen_type current_page)
1238 gchar *title = NULL;
1239 const char *dir = get_policy_dir();
1240 enum mode_enum {e_off, e_net, e_on, e_end};
1241 const gchar *mode[e_end] = {_("offline"), _("nework"), _("online")};
1244 switch((int)current_page) {
1245 case CCS_SCREEN_DOMAIN_LIST :
1246 case CCS_SCREEN_ACL_LIST :
1248 title = g_strdup_printf("%s - %s%s%s", mode[e_off], dir,
1249 CCS_DISK_POLICY_DIR, CCS_DISK_POLICY_DOMAIN_POLICY);
1250 else if (is_network())
1251 title = g_strdup_printf("%s(%s) - %s", mode[e_net],
1252 get_remote_ip(str_ip),
1253 CCS_PROC_POLICY_DOMAIN_POLICY);
1255 title = g_strdup_printf("%s - %s", mode[e_on],
1256 CCS_PROC_POLICY_DOMAIN_POLICY);
1258 case CCS_SCREEN_EXCEPTION_LIST :
1260 title = g_strdup_printf("%s - %s%s%s", mode[e_off], dir,
1261 CCS_DISK_POLICY_DIR, CCS_DISK_POLICY_EXCEPTION_POLICY);
1262 else if (is_network())
1263 title = g_strdup_printf("%s(%s) - %s", mode[e_net],
1264 get_remote_ip(str_ip),
1265 CCS_PROC_POLICY_EXCEPTION_POLICY);
1267 title = g_strdup_printf("%s - %s", mode[e_on],
1268 CCS_PROC_POLICY_EXCEPTION_POLICY);
1270 case CCS_SCREEN_PROFILE_LIST :
1271 case CCS_SCREEN_NS_LIST :
1273 title = g_strdup_printf("%s - %s%s%s", mode[e_off], dir,
1274 CCS_DISK_POLICY_DIR, CCS_DISK_POLICY_PROFILE);
1275 else if (is_network())
1276 title = g_strdup_printf("%s(%s) - %s", mode[e_net],
1277 get_remote_ip(str_ip),
1278 CCS_PROC_POLICY_PROFILE);
1280 title = g_strdup_printf("%s - %s", mode[e_on],
1281 CCS_PROC_POLICY_PROFILE);
1283 case CCS_SCREEN_STAT_LIST :
1285 title = g_strdup_printf("%s: %s(%s) - %s",
1286 _("Statistics"), mode[e_net],
1287 get_remote_ip(str_ip),
1288 CCS_PROC_POLICY_STAT);
1290 title = g_strdup_printf("%s: %s - %s",
1291 _("Statistics"), mode[e_on],
1292 CCS_PROC_POLICY_STAT);
1294 case CCS_SCREEN_MANAGER_LIST :
1296 title = g_strdup_printf("%s: %s - %s%s%s",
1297 _("Manager Policy"), mode[e_off], dir,
1298 CCS_DISK_POLICY_DIR, CCS_DISK_POLICY_MANAGER);
1299 else if (is_network())
1300 title = g_strdup_printf("%s: %s(%s) - %s",
1301 _("Manager Policy"), mode[e_net],
1302 get_remote_ip(str_ip),
1303 CCS_PROC_POLICY_MANAGER);
1305 title = g_strdup_printf("%s: %s - %s",
1306 _("Manager Policy"), mode[e_on],
1307 CCS_PROC_POLICY_MANAGER);
1309 case CCS_MAXSCREEN :
1311 title = g_strdup_printf("%s: %s - %s%s%s",
1312 _("Domain Policy Editor"), mode[e_off], dir,
1313 CCS_DISK_POLICY_DIR, CCS_DISK_POLICY_DOMAIN_POLICY);
1314 else if (is_network())
1315 title = g_strdup_printf("%s: %s(%s) - %s",
1316 _("Domain Policy Editor"), mode[e_net],
1317 get_remote_ip(str_ip),
1318 CCS_PROC_POLICY_DOMAIN_POLICY);
1320 title = g_strdup_printf("%s: %s - %s",
1321 _("Domain Policy Editor"), mode[e_on],
1322 CCS_PROC_POLICY_DOMAIN_POLICY);
1329 static void control_acl_window(transition_t *tran)
1331 static gint x, y, w, h;
1332 static gboolean saved_flag = FALSE;
1334 if (tran->current_page == CCS_SCREEN_ACL_LIST) {
1335 gtk_window_move(GTK_WINDOW(tran->acl_window), x, y);
1336 gtk_window_set_default_size(
1337 GTK_WINDOW(tran->acl_window), w, h);
1339 gtk_widget_show(tran->acl_window);
1342 gtk_window_get_position(
1343 GTK_WINDOW(tran->acl_window), &x, &y);
1344 gtk_window_get_size(
1345 GTK_WINDOW(tran->acl_window), &w, &h);
1348 gtk_widget_hide(tran->acl_window);
1352 static void cb_switch_page(GtkWidget *notebook,
1353 GtkNotebookPage *page,
1357 GtkTreeSelection *selection_tree, *selection_list;
1361 old_page_num = gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook));
1362 if (page_num == old_page_num)
1365 DEBUG_PRINT("In Tab[%d]\n", page_num);
1368 selection_tree = gtk_tree_view_get_selection(
1369 GTK_TREE_VIEW(tran->treeview));
1370 selection_list = gtk_tree_view_get_selection(
1371 GTK_TREE_VIEW(tran->acl.listview));
1372 if (tran->acl_detached) {
1373 tran->current_page = CCS_SCREEN_ACL_LIST;
1374 control_acl_window(tran);
1376 if (tran->task_flag ||
1378 gtk_tree_selection_count_selected_rows(selection_tree)))
1379 tran->current_page = CCS_SCREEN_DOMAIN_LIST;
1380 else if(selection_list &&
1381 gtk_tree_selection_count_selected_rows(selection_list))
1382 tran->current_page = CCS_SCREEN_ACL_LIST;
1384 tran->current_page = CCS_MAXSCREEN;
1385 g_object_set(G_OBJECT(notebook), "can-focus", TRUE, NULL);
1388 tran->current_page = CCS_SCREEN_EXCEPTION_LIST;
1389 if (tran->acl_detached) {
1390 control_acl_window(tran);
1392 g_object_set(G_OBJECT(notebook), "can-focus", FALSE, NULL);
1395 tran->current_page = CCS_SCREEN_PROFILE_LIST;
1396 if (tran->acl_detached) {
1397 control_acl_window(tran);
1399 g_object_set(G_OBJECT(notebook), "can-focus", FALSE, NULL);
1402 tran->current_page = CCS_SCREEN_NS_LIST;
1403 if (tran->acl_detached) {
1404 control_acl_window(tran);
1406 g_object_set(G_OBJECT(notebook), "can-focus", FALSE, NULL);
1410 title = disp_window_title(tran->current_page);
1411 gtk_window_set_title(GTK_WINDOW(tran->window), title);
1413 set_sensitive(tran->actions, tran->task_flag,
1414 tran->current_page);
1416 refresh_transition(NULL, tran);
1417 disp_statusbar(tran, tran->current_page);
1418 DEBUG_PRINT("Out Tab[%d]\n", page_num);
1420 /*---------------------------------------------------------------------------*/
1421 static void cb_set_focus(GtkWindow *window,
1422 GtkWidget *view, transition_t *tran)
1424 if (view == tran->treeview) {
1425 DEBUG_PRINT("Focus changed!!<Domain>\n");
1426 tran->current_page = CCS_SCREEN_DOMAIN_LIST;
1427 } else if (view == tran->acl.listview) {
1428 DEBUG_PRINT("Focus changed!!<Acl>(%p)\n", view);
1429 tran->current_page = CCS_SCREEN_ACL_LIST;
1430 } else if (view == tran->exp.listview) {
1431 DEBUG_PRINT("Focus changed!!<Exception>\n");
1432 tran->current_page = CCS_SCREEN_EXCEPTION_LIST;
1433 } else if (view == tran->prf.listview) {
1434 DEBUG_PRINT("Focus changed!!<Profile>\n");
1435 tran->current_page = CCS_SCREEN_PROFILE_LIST;
1436 } else if (view == tran->tsk.treeview) {
1437 DEBUG_PRINT("Focus changed!!<Process>\n");
1438 tran->current_page = CCS_SCREEN_DOMAIN_LIST;
1439 } else if (G_IS_OBJECT(view)) {
1440 DEBUG_PRINT("Focus changed!![Other:%s(%p)]\n",
1441 g_type_name(G_OBJECT_TYPE(view)), view);
1442 // g_object_set(G_OBJECT(view), "can-focus", FALSE, NULL);
1444 DEBUG_PRINT("Focus changed!![Not object(%p)]\n", view);
1448 static void cb_set_focus_acl(GtkWindow *window,
1449 GtkWidget *view, transition_t *tran)
1451 tran->current_page = CCS_SCREEN_ACL_LIST;
1453 if (view == tran->acl.listview) {
1454 DEBUG_PRINT("Focus changed!!<Acl>(%p)\n", view);
1455 } else if (G_IS_OBJECT(view)) {
1456 DEBUG_PRINT("Focus changed!![Other:%s(%p)]\n",
1457 g_type_name(G_OBJECT_TYPE(view)), view);
1458 g_object_set(G_OBJECT(view), "can-focus", FALSE, NULL);
1460 DEBUG_PRINT("Focus changed!![Not object(%p)]\n", view);
1464 static void cb_show_acl(GtkWidget *view, transition_t *tran)
1466 DEBUG_PRINT("Show ACL!!(%p)==(%p)\n", tran->acl.listview, view);
1468 /*---------------------------------------------------------------------------*/
1472 GtkWidget *menubar, *toolbar = NULL;
1473 GtkWidget *statusbar;
1476 GtkWidget *tab1, *tab2, *tab3, *tab4;
1477 GtkWidget *notebook;
1479 GtkWidget *domainbar;
1480 GtkWidget *acl_window;
1481 GtkWidget *treeview, *listview;
1482 GtkContainer *container, *acl_container;
1484 struct ccs_domain_policy3 dp = { NULL, 0, NULL };
1485 transition_t transition;
1487 transition.task_flag = 0;
1488 if (get_domain_policy(&dp, &(transition.domain_count)))
1490 /*-----------------------------------------------*/
1492 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
1493 transition.window = window;
1494 gtk_window_set_title(GTK_WINDOW(window), _("gpet"));
1495 gtk_window_set_icon(GTK_WINDOW(window), get_png_file());
1496 gtk_container_set_border_width(GTK_CONTAINER(window), 0);
1497 g_signal_connect(G_OBJECT(window), "destroy",
1498 G_CALLBACK(gtk_main_quit), NULL);
1500 vbox = gtk_vbox_new(FALSE, 1);
1501 gtk_container_add(GTK_CONTAINER(window), vbox);
1503 // create menu bar & tool bar & popup menu
1504 menubar = create_menu(window, &transition, &toolbar);
1505 gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0);
1506 gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 0);
1509 notebook = gtk_notebook_new();
1510 // gtk_notebook_set_scrollable(GTK_NOTEBOOK(notebook), TRUE);
1511 gtk_notebook_popup_enable(GTK_NOTEBOOK(notebook));
1512 gtk_box_pack_start(GTK_BOX(vbox), notebook, TRUE, TRUE, 0);
1513 g_object_set(G_OBJECT(notebook), "can-focus", FALSE, NULL);
1515 // create status bar
1516 statusbar = gtk_statusbar_new();
1517 gtk_box_pack_start(GTK_BOX(vbox), statusbar, FALSE, FALSE, 0);
1518 contextid = gtk_statusbar_get_context_id(GTK_STATUSBAR(statusbar), "");
1519 gtk_statusbar_push(GTK_STATUSBAR(statusbar), contextid, _("gpet"));
1522 tab1 = gtk_vbox_new(FALSE, 1);
1523 // create name bar for full domain name
1524 domainbar = gtk_entry_new();
1525 gtk_box_pack_start(GTK_BOX(tab1), domainbar, FALSE, FALSE, 0);
1526 gtk_editable_set_editable(GTK_EDITABLE(domainbar), FALSE);
1527 gtk_entry_set_has_frame(GTK_ENTRY(domainbar), FALSE);
1528 gtk_entry_set_text(GTK_ENTRY(domainbar), "");
1529 // gtk_widget_set_can_focus(domainbar, FALSE); // 2.18
1530 g_object_set(G_OBJECT(domainbar), "can-focus", FALSE, NULL);
1532 pane = gtk_vpaned_new();
1533 g_object_set_data(G_OBJECT(window), "pane", pane);/* to save config */
1534 gtk_box_pack_start(GTK_BOX(tab1), pane, TRUE, TRUE, 0);
1536 // create domain transition view
1537 treeview = create_tree_model();
1538 container = create_domain_view(
1539 pane, treeview, gtk_paned_pack1, TRUE, NULL, NULL);
1540 //a add_tree_data(GTK_TREE_VIEW(treeview), &dp);
1541 //a gtk_tree_view_expand_all(GTK_TREE_VIEW(treeview));
1542 // ツリーインデント pixel(2.12)
1543 // gtk_tree_view_set_level_indentation(GTK_TREE_VIEW(treeview), 0);
1545 // gtk_tree_view_set_show_expanders(GTK_TREE_VIEW(treeview), TRUE);
1546 g_object_set(G_OBJECT(treeview), "enable-tree-lines", FALSE,
1548 // gtk_tree_view_set_grid_lines(GTK_TREE_VIEW(treeview),
1549 // GTK_TREE_VIEW_GRID_LINES_NONE);
1550 // create domain policy float window
1551 acl_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
1552 title = disp_window_title(CCS_MAXSCREEN);
1553 gtk_window_set_title(GTK_WINDOW(acl_window), title);
1555 gtk_container_set_border_width(GTK_CONTAINER(acl_window), 0);
1556 gtk_window_set_position(GTK_WINDOW(acl_window),
1557 GTK_WIN_POS_CENTER);
1558 gtk_window_set_destroy_with_parent(GTK_WINDOW(acl_window), TRUE);
1559 gtk_window_add_accel_group(GTK_WINDOW(acl_window),
1560 g_object_get_data(G_OBJECT(window), "AccelGroup"));
1561 gtk_widget_hide(acl_window);
1563 // create domain policy view
1564 listview = create_list_model(TRUE);
1565 transition.acl_detached = FALSE;
1566 acl_container = create_domain_view(pane, listview, gtk_paned_pack2,
1567 FALSE, acl_window, &transition.acl_detached);
1568 /* to save menu.c Detach_acl() */
1569 g_object_set_data(G_OBJECT(window), "acl_container", acl_container);
1571 // copy data pointer
1572 transition.domainbar = domainbar;
1573 transition.container = container;
1574 transition.treeview = treeview;
1575 transition.acl.listview = listview;
1576 transition.acl_window = acl_window;
1577 transition.statusbar = statusbar;
1578 transition.contextid = contextid;
1579 transition.dp = &dp;
1580 transition.acl.count = 0;
1581 transition.acl.list = NULL;
1582 transition.tsk.treeview = create_task_tree_model(&transition);
1583 transition.addentry = ADDENTRY_NON;
1585 // cursor move domain window
1586 g_signal_connect(gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)),
1587 "changed", G_CALLBACK(cb_selection), &transition);
1588 // g_signal_connect(GTK_TREE_VIEW(treeview), "cursor-changed",
1589 // G_CALLBACK(cb_selection), &transition);
1590 // double click or enter key domain window
1591 g_signal_connect(G_OBJECT(treeview), "row-activated",
1592 G_CALLBACK(cb_initialize_domain), &transition);
1593 // mouse click domain window
1594 g_signal_connect(G_OBJECT(treeview), "button-press-event",
1595 G_CALLBACK(cb_select_domain), &transition);
1596 // mouse click acl window
1597 g_signal_connect(G_OBJECT(listview), "button-press-event",
1598 G_CALLBACK(cb_select_acl), &transition);
1601 tab2 = gtk_vbox_new(FALSE, 1);
1602 // create exception policy view
1603 listview = create_list_model(TRUE);
1604 create_list_view(tab2, listview, TRUE);
1605 transition.exp.listview = listview;
1606 // mouse click exception window
1607 g_signal_connect(G_OBJECT(listview), "button-press-event",
1608 G_CALLBACK(cb_select_exp), &transition);
1610 tab3 = gtk_vbox_new(FALSE, 1);
1611 // create profile view
1612 listview = create_list_model(FALSE);
1613 create_list_view(tab3, listview, FALSE);
1614 transition.prf.listview = listview;
1615 transition.prf.count = 0;
1616 transition.prf.list = NULL;
1617 if (get_profile(&(transition.prf.list), &(transition.prf.count)))
1618 g_warning("Read error : profile");
1620 add_list_data(&(transition.prf), CCS_SCREEN_PROFILE_LIST);
1621 // mouse click profile window
1622 g_signal_connect(G_OBJECT(listview), "button-press-event",
1623 G_CALLBACK(cb_select_prf), &transition);
1625 tab4 = gtk_vbox_new(FALSE, 1);
1626 // create namespace view
1627 listview = create_list_model(FALSE);
1628 create_list_view(tab4, listview, FALSE);
1629 transition.ns.listview = listview;
1630 transition.ns.count = 0;
1631 transition.ns.list = NULL;
1632 if (get_namespace(&(transition.ns.list), &(transition.ns.count)))
1633 g_warning("Read error : namespace");
1635 add_list_data(&(transition.ns), CCS_SCREEN_NS_LIST);
1636 // mouse click namespace window
1637 g_signal_connect(G_OBJECT(listview), "button-press-event",
1638 G_CALLBACK(cb_select_ns), &transition);
1639 // cursor move namespace window
1640 g_signal_connect(gtk_tree_view_get_selection(GTK_TREE_VIEW(listview)),
1641 "changed", G_CALLBACK(cb_ns_selection), &transition);
1644 create_tabs(notebook, tab1, _("Domain Transition"));
1645 create_tabs(notebook, tab2, _("Exception Policy"));
1646 create_tabs(notebook, tab3, _("Profile"));
1647 create_tabs(notebook, tab4, get_ns_name());
1649 /* to save menu.c Process_state() */
1650 g_object_set_data(G_OBJECT(window), "notebook", notebook);
1651 g_object_set_data(G_OBJECT(window), "tab1", tab1);
1652 /* to save cb_ns_selection() */
1653 g_object_set_data(G_OBJECT(window), "tab4", tab4);
1656 g_signal_connect(G_OBJECT(notebook), "switch_page",
1657 G_CALLBACK(cb_switch_page), &transition);
1658 read_config(&transition);
1660 /* set widget names for .gpetrc */
1661 gtk_widget_set_name(transition.window, "GpetMainWindow");
1662 gtk_widget_set_name(transition.domainbar, "GpetDomainbar");
1663 gtk_widget_set_name(transition.acl_window, "GpetAclWindow");
1665 gtk_widget_show_all(window);
1671 /*---------------------------------------------------------------------------*/
1672 int main(int argc, char **argv)
1674 const gchar *homedir = g_getenv("HOME");
1679 bindtextdomain(GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR);
1680 bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
1681 textdomain(GETTEXT_PACKAGE);
1684 gtk_init(&argc, &argv);
1687 homedir = g_get_home_dir ();
1688 gpetrc = g_build_path("/", homedir, ".gpetrc", NULL);
1689 gtk_rc_parse(gpetrc);
1692 result = ccs_main(argc, argv);
1696 /*---------------------------------------------------------------------------*/