diff --git a/management/applets/apparmorapplet-gnome/src/apparmor-applet.c b/management/applets/apparmorapplet-gnome/src/apparmor-applet.c index 2c3bb1797..68df9565f 100644 --- a/management/applets/apparmorapplet-gnome/src/apparmor-applet.c +++ b/management/applets/apparmorapplet-gnome/src/apparmor-applet.c @@ -242,9 +242,8 @@ void applet_about(BonoboUIComponent * uic) { const gchar *license = _("AppArmorApplet is free software; you can redistribute it and/or modify\n" - "it under the terms of the GNU General Public License as published by\n" - "the Free Software Foundation; either version 2 of the License, or\n" - "(at your option) any later version."); + "it under the terms of the GNU General Public License, version 2, as published by\n" + "the Free Software Foundation."); const gchar *authors[] = { "Matt Barringer ", @@ -274,7 +273,7 @@ void applet_prefs (BonoboUIComponent *uic) gboolean on_button_press (GtkWidget *event_box, GdkEventButton *event, gpointer data) - { +{ if (event->button != 1) return FALSE; @@ -290,19 +289,20 @@ gboolean on_button_press (GtkWidget *event_box, } return TRUE; - } - -void reject_button_press (GtkDialog * dialog, gint answer, gpointer data) -{ - if (answer == GTK_RESPONSE_OK || answer == GTK_RESPONSE_CANCEL) - { - gtk_widget_hide(apparmor_applet->reject_dialog); - } } -void reject_window_close (GtkDialog * dialog, gpointer data) +/* Decrement the event count and reset the icon/tooltip state if necessary */ +void decrement_event_count(gint decrement) { - gtk_widget_hide(apparmor_applet->reject_dialog); + apparmor_applet->alert_count = apparmor_applet->alert_count - decrement; + + if (apparmor_applet->alert_count <= 0) + { + apparmor_applet->alert_count= 0; + apparmor_applet->uncleared_alerts = FALSE; + set_appropriate_icon(); + set_tooltip(); + } } PANEL_APPLET_BONOBO_FACTORY("OAFIID:AppArmorApplet_Factory", diff --git a/management/applets/apparmorapplet-gnome/src/apparmor-applet.h b/management/applets/apparmorapplet-gnome/src/apparmor-applet.h index 98bdfaddb..08935b02b 100644 --- a/management/applets/apparmorapplet-gnome/src/apparmor-applet.h +++ b/management/applets/apparmorapplet-gnome/src/apparmor-applet.h @@ -1,6 +1,12 @@ #ifndef __APPARMOR_APPLET_H #define __APPARMOR_APPLET_H +#include + +#define CONF_PATH "/apps/AppArmor/apparmor-applet" +#define CONF_PROFILE_KEY "/apps/AppArmor/apparmor-applet/profiler" +#define CONF_PATH_KEY "/apps/AppArmor/apparmor-applet/path" + struct _apparmor_applet { GtkWidget *applet; @@ -26,7 +32,6 @@ gboolean on_button_press (GtkWidget *event_box, GdkEventButton *event, gpointer data); void insert_into_list(char *name); -void reject_button_press (GtkDialog * dialog, gint answer, gpointer data); -void reject_window_close (GtkDialog * dialog, gpointer data); +void decrement_event_count(gint decrement); #endif diff --git a/management/applets/apparmorapplet-gnome/src/preferences_dialog.c b/management/applets/apparmorapplet-gnome/src/preferences_dialog.c index 4670482ec..bf02ed37d 100644 --- a/management/applets/apparmorapplet-gnome/src/preferences_dialog.c +++ b/management/applets/apparmorapplet-gnome/src/preferences_dialog.c @@ -1,5 +1,5 @@ #ifdef HAVE_CONFIG_H -# include +#include #endif #include @@ -10,99 +10,120 @@ #include #include #include +#include #include "preferences_dialog.h" +#include "apparmor-applet.h" + +GtkWidget *profile_combobox; GtkWidget* create_preferences_dialog (void) { - GtkWidget *preferences_dialog; - GtkWidget *preferences_vbox; - GtkWidget *layout_table; - GtkWidget *profile_label; - GtkWidget *path_label; - GtkWidget *path_entry; - GtkWidget *profile_combobox; - GtkWidget *preferences_buttonbox; - GtkWidget *cancel_button; - GtkWidget *ok_button; + GtkWidget *preferences_dialog; + GtkWidget *preferences_vbox; + GtkWidget *layout_table; + GtkWidget *profile_label; + GtkWidget *path_label; + GtkWidget *preferences_buttonbox; + GtkWidget *cancel_button; + GtkWidget *ok_button; + GtkWidget *path_entry; - preferences_dialog = gtk_dialog_new (); - gtk_widget_set_name (preferences_dialog, "preferences_dialog"); - gtk_window_set_title (GTK_WINDOW (preferences_dialog), _("AppArmor Desktop Preferences")); - gtk_window_set_position (GTK_WINDOW (preferences_dialog), GTK_WIN_POS_CENTER); - gtk_window_set_modal (GTK_WINDOW (preferences_dialog), TRUE); - gtk_window_set_type_hint (GTK_WINDOW (preferences_dialog), GDK_WINDOW_TYPE_HINT_DIALOG); + GConfClient *client; + int active_combo; + client = gconf_client_get_default(); + active_combo = gconf_client_get_int(client, CONF_PROFILE_KEY, NULL); - preferences_vbox = GTK_DIALOG (preferences_dialog)->vbox; - gtk_widget_set_name (preferences_vbox, "preferences_vbox"); - gtk_widget_show (preferences_vbox); + preferences_dialog = gtk_dialog_new (); + gtk_widget_set_name (preferences_dialog, "preferences_dialog"); + gtk_window_set_title (GTK_WINDOW (preferences_dialog), _("AppArmor Desktop Preferences")); + gtk_window_set_position (GTK_WINDOW (preferences_dialog), GTK_WIN_POS_CENTER); + gtk_window_set_modal (GTK_WINDOW (preferences_dialog), TRUE); + gtk_window_set_type_hint (GTK_WINDOW (preferences_dialog), GDK_WINDOW_TYPE_HINT_DIALOG); + + preferences_vbox = GTK_DIALOG (preferences_dialog)->vbox; + gtk_widget_set_name (preferences_vbox, "preferences_vbox"); + gtk_widget_show (preferences_vbox); + + layout_table = gtk_table_new (2, 2, FALSE); + gtk_widget_set_name (layout_table, "layout_table"); + gtk_widget_show (layout_table); + gtk_box_pack_start (GTK_BOX (preferences_vbox), layout_table, FALSE, TRUE, 0); + gtk_table_set_col_spacings (GTK_TABLE (layout_table), 10); + + profile_label = gtk_label_new (_("Profile Generation")); + gtk_widget_set_name (profile_label, "profile_label"); + gtk_widget_show (profile_label); + gtk_table_attach (GTK_TABLE (layout_table), profile_label, 0, 1, 0, 1, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_misc_set_alignment (GTK_MISC (profile_label), 0, 0.5); + + path_label = gtk_label_new (_("Path")); + gtk_widget_set_name (path_label, "path_label"); + gtk_widget_show (path_label); + gtk_table_attach (GTK_TABLE (layout_table), path_label, 0, 1, 1, 2, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_misc_set_alignment (GTK_MISC (path_label), 0, 0.5); + + path_entry = gtk_entry_new (); + gtk_widget_set_name (path_entry, "path_entry"); + gtk_widget_show (path_entry); + gtk_table_attach (GTK_TABLE (layout_table), path_entry, 1, 2, 1, 2, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_entry_set_invisible_char (GTK_ENTRY (path_entry), 9679); + + + profile_combobox = gtk_combo_box_new_text (); + gtk_widget_set_name (profile_combobox, "profile_combobox"); + gtk_widget_show (profile_combobox); + gtk_table_attach (GTK_TABLE (layout_table), profile_combobox, 1, 2, 0, 1, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (GTK_FILL), 0, 0); + gtk_combo_box_append_text (GTK_COMBO_BOX (profile_combobox), _("YAST")); + gtk_combo_box_append_text (GTK_COMBO_BOX (profile_combobox), _("genprof")); + gtk_combo_box_set_active(GTK_COMBO_BOX(profile_combobox), active_combo); - layout_table = gtk_table_new (2, 2, FALSE); - gtk_widget_set_name (layout_table, "layout_table"); - gtk_widget_show (layout_table); - gtk_box_pack_start (GTK_BOX (preferences_vbox), layout_table, FALSE, TRUE, 0); - gtk_table_set_col_spacings (GTK_TABLE (layout_table), 10); - - profile_label = gtk_label_new (_("Profile Generation")); - gtk_widget_set_name (profile_label, "profile_label"); - gtk_widget_show (profile_label); - gtk_table_attach (GTK_TABLE (layout_table), profile_label, 0, 1, 0, 1, - (GtkAttachOptions) (GTK_FILL), - (GtkAttachOptions) (0), 0, 0); - gtk_misc_set_alignment (GTK_MISC (profile_label), 0, 0.5); - - path_label = gtk_label_new (_("Path")); - gtk_widget_set_name (path_label, "path_label"); - gtk_widget_show (path_label); - gtk_table_attach (GTK_TABLE (layout_table), path_label, 0, 1, 1, 2, - (GtkAttachOptions) (GTK_FILL), - (GtkAttachOptions) (0), 0, 0); - gtk_misc_set_alignment (GTK_MISC (path_label), 0, 0.5); - - path_entry = gtk_entry_new (); - gtk_widget_set_name (path_entry, "path_entry"); - gtk_widget_show (path_entry); - gtk_table_attach (GTK_TABLE (layout_table), path_entry, 1, 2, 1, 2, - (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), - (GtkAttachOptions) (0), 0, 0); - gtk_entry_set_invisible_char (GTK_ENTRY (path_entry), 9679); - - profile_combobox = gtk_combo_box_new_text (); - gtk_widget_set_name (profile_combobox, "profile_combobox"); - gtk_widget_show (profile_combobox); - gtk_table_attach (GTK_TABLE (layout_table), profile_combobox, 1, 2, 0, 1, - (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), - (GtkAttachOptions) (GTK_FILL), 0, 0); - gtk_combo_box_append_text (GTK_COMBO_BOX (profile_combobox), _("YAST")); - gtk_combo_box_append_text (GTK_COMBO_BOX (profile_combobox), _("genprof")); - - preferences_buttonbox = GTK_DIALOG (preferences_dialog)->action_area; - gtk_widget_set_name (preferences_buttonbox, "preferences_buttonbox"); - gtk_widget_show (preferences_buttonbox); - gtk_button_box_set_layout (GTK_BUTTON_BOX (preferences_buttonbox), GTK_BUTTONBOX_END); - - cancel_button = gtk_button_new_from_stock ("gtk-cancel"); - gtk_widget_set_name (cancel_button, "cancel_button"); - gtk_widget_show (cancel_button); - gtk_dialog_add_action_widget (GTK_DIALOG (preferences_dialog), cancel_button, GTK_RESPONSE_CANCEL); - GTK_WIDGET_SET_FLAGS (cancel_button, GTK_CAN_DEFAULT); - - ok_button = gtk_button_new_from_stock ("gtk-ok"); - gtk_widget_set_name (ok_button, "ok_button"); - gtk_widget_show (ok_button); - gtk_dialog_add_action_widget (GTK_DIALOG (preferences_dialog), ok_button, GTK_RESPONSE_OK); - GTK_WIDGET_SET_FLAGS (ok_button, GTK_CAN_DEFAULT); - - g_signal_connect(preferences_dialog, "response", + preferences_buttonbox = GTK_DIALOG (preferences_dialog)->action_area; + gtk_widget_set_name (preferences_buttonbox, "preferences_buttonbox"); + gtk_widget_show (preferences_buttonbox); + gtk_button_box_set_layout (GTK_BUTTON_BOX (preferences_buttonbox), GTK_BUTTONBOX_END); + + cancel_button = gtk_button_new_from_stock ("gtk-cancel"); + gtk_widget_set_name (cancel_button, "cancel_button"); + gtk_widget_show (cancel_button); + gtk_dialog_add_action_widget (GTK_DIALOG (preferences_dialog), cancel_button, GTK_RESPONSE_CANCEL); + GTK_WIDGET_SET_FLAGS (cancel_button, GTK_CAN_DEFAULT); + + ok_button = gtk_button_new_from_stock ("gtk-ok"); + gtk_widget_set_name (ok_button, "ok_button"); + gtk_widget_show (ok_button); + gtk_dialog_add_action_widget (GTK_DIALOG (preferences_dialog), ok_button, GTK_RESPONSE_OK); + GTK_WIDGET_SET_FLAGS (ok_button, GTK_CAN_DEFAULT); + + g_signal_connect(preferences_dialog, "response", G_CALLBACK(button_press), NULL); - return preferences_dialog; + return preferences_dialog; } -void button_press (GtkDialog * dialog, gint answer, gpointer data) +void +button_press (GtkDialog * dialog, gint answer, gpointer data) { if (answer == GTK_RESPONSE_OK || answer == GTK_RESPONSE_CANCEL) { + if (answer == GTK_RESPONSE_OK) + { + int active = gtk_combo_box_get_active (GTK_COMBO_BOX(profile_combobox)); + if (active <= -1) + active = 0; + + GConfClient *client; + client = gconf_client_get_default(); + gconf_client_set_int(client, CONF_PROFILE_KEY, active, NULL); + } gtk_widget_destroy(GTK_WIDGET(dialog)); } } diff --git a/management/applets/apparmorapplet-gnome/src/reject_list.c b/management/applets/apparmorapplet-gnome/src/reject_list.c index 815f55959..892a090e1 100644 --- a/management/applets/apparmorapplet-gnome/src/reject_list.c +++ b/management/applets/apparmorapplet-gnome/src/reject_list.c @@ -1,13 +1,15 @@ #ifdef HAVE_CONFIG_H -# include +#include #endif #include #include #include #include +#include #include #include +#include #include #include #include @@ -17,90 +19,254 @@ static void add_columns (GtkTreeView *treeview) { - GtkCellRenderer *renderer; - GtkTreeViewColumn *column; - GtkTreeModel *model = gtk_tree_view_get_model (treeview); - - /* column for fixed toggles */ - renderer = gtk_cell_renderer_text_new (); - - column = gtk_tree_view_column_new_with_attributes ("Program Name", - renderer, - "text", 0, - NULL); - gtk_tree_view_column_set_sort_column_id (column, 0); - gtk_tree_view_append_column (treeview, column); - - renderer = gtk_cell_renderer_text_new (); - column = gtk_tree_view_column_new_with_attributes ("Rejection Count", - renderer, - "text", 1, - NULL); - gtk_tree_view_column_set_sort_column_id (column, 1); - gtk_tree_view_append_column (treeview, column); + GtkCellRenderer *renderer; + GtkTreeViewColumn *column; + GtkTreeModel *model = gtk_tree_view_get_model (treeview); + + /* column for fixed toggles */ + renderer = gtk_cell_renderer_text_new (); + + column = gtk_tree_view_column_new_with_attributes ("Program Name", + renderer, + "text", 0, + NULL); + gtk_tree_view_column_set_sort_column_id (column, 0); + gtk_tree_view_append_column (treeview, column); + + renderer = gtk_cell_renderer_text_new (); + column = gtk_tree_view_column_new_with_attributes ("Rejection Count", + renderer, + "text", 1, + NULL); + gtk_tree_view_column_set_sort_column_id (column, 1); + gtk_tree_view_append_column (treeview, column); } GtkWidget* create_reject_dialog (GtkListStore *store) { - GtkWidget *reject_dialog; - GtkWidget *reject_vbox; - GtkWidget *reject_list_scrolledwindow; - GtkWidget *program_list; - GtkWidget *reject_button_area; - GtkWidget *cancel_button; - GtkWidget *ok_button; - GtkTreeIter listIter; + GtkWidget *reject_dialog; + GtkWidget *reject_vbox; + GtkWidget *reject_list_scrolledwindow; + GtkWidget *program_list; + GtkWidget *reject_button_area; + GtkWidget *cancel_button; + GtkWidget *ok_button; + GtkTreeIter listIter; + + reject_dialog = gtk_dialog_new (); + gtk_widget_set_name (reject_dialog, "reject_dialog"); + gtk_window_set_title (GTK_WINDOW (reject_dialog), _("AppArmor Rejections")); + gtk_window_set_type_hint (GTK_WINDOW (reject_dialog), GDK_WINDOW_TYPE_HINT_DIALOG); + gtk_window_set_modal(GTK_WINDOW(reject_dialog), TRUE); + + reject_vbox = GTK_DIALOG (reject_dialog)->vbox; + gtk_widget_set_name (reject_vbox, "reject_vbox"); + gtk_widget_show (reject_vbox); + + reject_list_scrolledwindow = gtk_scrolled_window_new (NULL, NULL); + gtk_widget_set_name (reject_list_scrolledwindow, "reject_list_scrolledwindow"); + gtk_widget_show (reject_list_scrolledwindow); + gtk_box_pack_start (GTK_BOX (reject_vbox), reject_list_scrolledwindow, TRUE, TRUE, 0); + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (reject_list_scrolledwindow), GTK_SHADOW_IN); + + program_list = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)); + gtk_widget_set_name (program_list, "program_list"); + gtk_widget_show (program_list); + gtk_container_add (GTK_CONTAINER (reject_list_scrolledwindow), program_list); + gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (program_list), TRUE); + add_columns (GTK_TREE_VIEW (program_list)); + + reject_button_area = GTK_DIALOG (reject_dialog)->action_area; + gtk_widget_set_name (reject_button_area, "reject_button_area"); + gtk_widget_show (reject_button_area); + gtk_button_box_set_layout (GTK_BUTTON_BOX (reject_button_area), GTK_BUTTONBOX_END); + + cancel_button = gtk_button_new_from_stock ("gtk-cancel"); + gtk_widget_set_name (cancel_button, "cancel_button"); + gtk_widget_show (cancel_button); + gtk_dialog_add_action_widget (GTK_DIALOG (reject_dialog), cancel_button, GTK_RESPONSE_CANCEL); + GTK_WIDGET_SET_FLAGS (cancel_button, GTK_CAN_DEFAULT); + + ok_button = gtk_button_new_from_stock ("gtk-ok"); + gtk_widget_set_name (ok_button, "ok_button"); + gtk_widget_show (ok_button); + gtk_dialog_add_action_widget (GTK_DIALOG (reject_dialog), ok_button, GTK_RESPONSE_OK); + GTK_WIDGET_SET_FLAGS (ok_button, GTK_CAN_DEFAULT); + + g_signal_connect(reject_dialog, + "response", + G_CALLBACK(reject_button_press), + NULL); + + g_signal_connect(reject_dialog, + "delete-event", + G_CALLBACK(reject_window_close), + NULL); - reject_dialog = gtk_dialog_new (); - gtk_widget_set_name (reject_dialog, "reject_dialog"); - gtk_window_set_title (GTK_WINDOW (reject_dialog), _("AppArmor Rejections")); - gtk_window_set_type_hint (GTK_WINDOW (reject_dialog), GDK_WINDOW_TYPE_HINT_DIALOG); - gtk_window_set_modal(GTK_WINDOW(reject_dialog), TRUE); + g_signal_connect(program_list, + "button-press-event", + G_CALLBACK(popup_button_pressed), + NULL); - reject_vbox = GTK_DIALOG (reject_dialog)->vbox; - gtk_widget_set_name (reject_vbox, "reject_vbox"); - gtk_widget_show (reject_vbox); - - reject_list_scrolledwindow = gtk_scrolled_window_new (NULL, NULL); - gtk_widget_set_name (reject_list_scrolledwindow, "reject_list_scrolledwindow"); - gtk_widget_show (reject_list_scrolledwindow); - gtk_box_pack_start (GTK_BOX (reject_vbox), reject_list_scrolledwindow, TRUE, TRUE, 0); - gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (reject_list_scrolledwindow), GTK_SHADOW_IN); - - program_list = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)); - gtk_widget_set_name (program_list, "program_list"); - gtk_widget_show (program_list); - gtk_container_add (GTK_CONTAINER (reject_list_scrolledwindow), program_list); - gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (program_list), TRUE); - add_columns (GTK_TREE_VIEW (program_list)); - - reject_button_area = GTK_DIALOG (reject_dialog)->action_area; - gtk_widget_set_name (reject_button_area, "reject_button_area"); - gtk_widget_show (reject_button_area); - gtk_button_box_set_layout (GTK_BUTTON_BOX (reject_button_area), GTK_BUTTONBOX_END); - - cancel_button = gtk_button_new_from_stock ("gtk-cancel"); - gtk_widget_set_name (cancel_button, "cancel_button"); - gtk_widget_show (cancel_button); - gtk_dialog_add_action_widget (GTK_DIALOG (reject_dialog), cancel_button, GTK_RESPONSE_CANCEL); - GTK_WIDGET_SET_FLAGS (cancel_button, GTK_CAN_DEFAULT); - - ok_button = gtk_button_new_from_stock ("gtk-ok"); - gtk_widget_set_name (ok_button, "ok_button"); - gtk_widget_show (ok_button); - gtk_dialog_add_action_widget (GTK_DIALOG (reject_dialog), ok_button, GTK_RESPONSE_OK); - GTK_WIDGET_SET_FLAGS (ok_button, GTK_CAN_DEFAULT); - - g_signal_connect(reject_dialog, "response", - G_CALLBACK(reject_button_press), - NULL); - - g_signal_connect(reject_dialog, "delete-event", - G_CALLBACK(reject_window_close), - NULL); - - gtk_widget_grab_focus (program_list); - return reject_dialog; + g_signal_connect(program_list, + "popup-menu", + G_CALLBACK(view_on_popup_menu), + NULL); + + gtk_widget_grab_focus (program_list); + gtk_window_set_default_size(GTK_WINDOW(reject_dialog), 500, 400); + return reject_dialog; } + + +void reject_button_press (GtkDialog * dialog, gint answer, gpointer data) +{ + if (answer == GTK_RESPONSE_OK || answer == GTK_RESPONSE_CANCEL) + { + gtk_widget_hide(GTK_WIDGET(dialog)); + } +} + +void reject_window_close (GtkDialog * dialog, gpointer data) +{ + gtk_widget_hide(GTK_WIDGET(dialog)); +} + +void +handle_popup_profile (GtkWidget *menuitem, gpointer userdata) +{ + GtkTreeView *treeview = GTK_TREE_VIEW(userdata); + GConfClient *client = gconf_client_get_default(); + + int profiler_type = gconf_client_get_int(client, CONF_PROFILE_KEY, NULL); + char *cmdline; + + GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview); + GtkTreeIter iter; + GtkTreeModel *model = gtk_tree_view_get_model(treeview); + gchar *str_data = NULL; + + if (gtk_tree_selection_get_selected(selection, &model, &iter) == TRUE) + { + + gint int_data; + GtkListStore *store = GTK_LIST_STORE(model); + + gtk_tree_model_get (model, &iter, + 0, &str_data, + 1, &int_data, + -1); + } + + // 0 is YAST, 1 is genprof + if ((profiler_type == 0) && (str_data != NULL)) + { + cmdline = "/opt/gnome/bin/gnomesu /sbin/yast2 LogProf"; + gnome_execute_terminal_shell(NULL, cmdline); + } + else if ((profiler_type == 1) && (str_data != NULL)) + { + /* /usr/sbin/genprof */ + cmdline = (char *) malloc(41 + strlen(str_data)); + strcpy(cmdline, "/opt/gnome/bin/gnomesu /usr/sbin/genprof "); + strcat(cmdline, str_data); + gnome_execute_terminal_shell(NULL, cmdline); + free(cmdline); + } + + if (str_data != NULL) + g_free (str_data); +} + +void +handle_popup_remove (GtkWidget *menuitem, gpointer userdata) +{ + GtkTreeView *treeview = GTK_TREE_VIEW(userdata); + GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview); + GtkTreeIter iter; + GtkTreeModel *model = gtk_tree_view_get_model(treeview); + if (gtk_tree_selection_get_selected(selection, &model, &iter) == TRUE) + { + gchar *str_data; + gint int_data; + GtkListStore *store = GTK_LIST_STORE(model); + + gtk_tree_model_get (model, &iter, + 0, &str_data, + 1, &int_data, + -1); + g_free (str_data); + decrement_event_count(int_data); + gtk_list_store_remove(store, &iter); + } +} + +void +display_popup_menu (GtkWidget *treeview, GdkEventButton *event, gpointer userdata) +{ + GtkWidget *menu, *remove_item, *profile_item; + + menu = gtk_menu_new(); + + profile_item = gtk_menu_item_new_with_label(_("Profile application")); + remove_item = gtk_menu_item_new_with_label(_("Remove from list")); + + g_signal_connect(remove_item, + "activate", + G_CALLBACK(handle_popup_remove), + treeview); + g_signal_connect(profile_item, + "activate", + G_CALLBACK(handle_popup_profile), + treeview); + + gtk_menu_shell_append(GTK_MENU_SHELL(menu), profile_item); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), remove_item); + + gtk_widget_show_all(menu); + + gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, + (event != NULL) ? event->button : 0, + gdk_event_get_time((GdkEvent*)event)); +} + + +gboolean +popup_button_pressed (GtkWidget *treeview, GdkEventButton *event, gpointer userdata) +{ + if (event->type == GDK_BUTTON_PRESS && event->button == 3) + { + + GtkTreeSelection *selection; + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)); + + if (gtk_tree_selection_count_selected_rows(selection) <= 1) + { + GtkTreePath *path; + if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(treeview), + (gint) event->x, + (gint) event->y, + &path, NULL, NULL, NULL)) + { + gtk_tree_selection_unselect_all(selection); + gtk_tree_selection_select_path(selection, path); + gtk_tree_path_free(path); + } + } + display_popup_menu(treeview, event, userdata); + return TRUE; + } + + return FALSE; +} + + +gboolean +view_on_popup_menu (GtkWidget *treeview, gpointer userdata) +{ + display_popup_menu(treeview, NULL, userdata); + return TRUE; +} + diff --git a/management/applets/apparmorapplet-gnome/src/reject_list.h b/management/applets/apparmorapplet-gnome/src/reject_list.h index 0f19043bd..e768de436 100644 --- a/management/applets/apparmorapplet-gnome/src/reject_list.h +++ b/management/applets/apparmorapplet-gnome/src/reject_list.h @@ -2,5 +2,12 @@ #define REJECT_LIST_H GtkWidget* create_reject_dialog (GtkListStore *store); +void reject_button_press (GtkDialog * dialog, gint answer, gpointer data); +void reject_window_close (GtkDialog * dialog, gpointer data); +void handle_popup_profile (GtkWidget *menuitem, gpointer userdata); +void handle_popup_remove (GtkWidget *menuitem, gpointer userdata); +void display_popup_menu (GtkWidget *treeview, GdkEventButton *event, gpointer userdata); +gboolean popup_button_pressed (GtkWidget *treeview, GdkEventButton *event, gpointer userdata); +gboolean view_on_popup_menu (GtkWidget *treeview, gpointer userdata); #endif