From f090a73e9c0da07cc60da8fc32f7547e5e5a2efc Mon Sep 17 00:00:00 2001 From: Anders Broman Date: Mon, 9 Jul 2012 02:40:20 +0000 Subject: [PATCH] From Michael Mann: disable hide checkboxes with error messages Updated preference dialog to include text if hide checkbox is disabled. Used error message for "Local Interfaces" dialog. https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=2598 svn path=/trunk/; revision=43622 --- ui/gtk/capture_dlg.c | 30 +++++++++++++++++++++++++----- ui/gtk/prefs_capture.c | 32 +++++++++++++++++++++++++++++--- 2 files changed, 54 insertions(+), 8 deletions(-) diff --git a/ui/gtk/capture_dlg.c b/ui/gtk/capture_dlg.c index 04a89b9715..513d22ac36 100644 --- a/ui/gtk/capture_dlg.c +++ b/ui/gtk/capture_dlg.c @@ -2928,7 +2928,8 @@ static void local_hide_cb(GtkCellRendererToggle *cell _U_, gchar *path_str, gpointer data _U_) { - gboolean hide; + gboolean hide, hide_enabled = TRUE; + gchar *name; GtkTreeModel *model; GtkTreeIter iter; GtkTreePath *path = gtk_tree_path_new_from_string (path_str); @@ -2936,12 +2937,31 @@ static void local_hide_cb(GtkCellRendererToggle *cell _U_, model = gtk_tree_view_get_model(local_l); gtk_tree_model_get_iter (model, &iter, path); - gtk_tree_model_get (model, &iter, 1, &hide, -1); + gtk_tree_model_get (model, &iter, 0, &name, 1, &hide, -1); - if (hide) { - gtk_list_store_set(GTK_LIST_STORE(model), &iter, 1, FALSE, -1); + /* See if this is the currently selected capturing device */ + if (prefs.capture_device != NULL) { + guint i; + interface_t device; + for (i = 0; i < global_capture_opts.all_ifaces->len; i++) { + device = g_array_index(global_capture_opts.all_ifaces, interface_t, i); + if ((strcmp(device.display_name, prefs.capture_device) == 0) && + (strcmp(device.name, name) == 0)) { + /* Don't allow current interface to be hidden */ + hide_enabled = FALSE; + break; + } + } + } + + if (hide_enabled) { + if (hide) { + gtk_list_store_set(GTK_LIST_STORE(model), &iter, 1, FALSE, -1); + } else { + gtk_list_store_set(GTK_LIST_STORE(model), &iter, 1, TRUE, -1); + } } else { - gtk_list_store_set(GTK_LIST_STORE(model), &iter, 1, TRUE, -1); + simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "Default interface cannot be hidden"); } } diff --git a/ui/gtk/prefs_capture.c b/ui/gtk/prefs_capture.c index 55d36a50fb..ee0f16b836 100644 --- a/ui/gtk/prefs_capture.c +++ b/ui/gtk/prefs_capture.c @@ -42,6 +42,7 @@ #include "ui/gtk/gui_utils.h" #include "ui/gtk/dlg_utils.h" #include "ui/gtk/iface_lists.h" +#include "ui/gtk/capture_globals.h" #include "ui/gtk/main_welcome.h" #include "ui/gtk/help_dlg.h" #include "ui/gtk/stock_icons.h" @@ -66,7 +67,7 @@ #define IFOPTS_IF_NOSEL -1 /* interface options dialog */ -static GtkWidget *cur_list, *if_dev_lb, *if_name_lb, *if_linktype_lb, *if_linktype_cb, *if_descr_te, *if_hide_cb; +static GtkWidget *cur_list, *if_dev_lb, *if_name_lb, *if_linktype_lb, *if_linktype_cb, *if_descr_te, *if_hide_cb, *if_default_if_lb; #ifdef HAVE_PCAP_CREATE static GtkWidget *if_monitor_lb, *if_monitor_cb; #endif @@ -560,7 +561,11 @@ ifopts_edit_cb(GtkWidget *w, gpointer data _U_) cur_list); gtk_table_attach_defaults(GTK_TABLE(main_tb), if_hide_cb, 1, 2, row, row+1); gtk_widget_show(if_hide_cb); - row++; + + if_default_if_lb = gtk_label_new("(Default interface cannot be hidden)"); + gtk_table_attach_defaults(GTK_TABLE(main_tb), if_default_if_lb, 1, 3, row, row+1); + gtk_misc_set_alignment(GTK_MISC(if_default_if_lb), 0.15f, 0.5f); + row++; /* button row: OK and Cancel buttons */ bbox = dlg_button_row_new(GTK_STOCK_OK, GTK_STOCK_CANCEL, GTK_STOCK_HELP, NULL); @@ -693,7 +698,7 @@ ifopts_edit_ifsel_cb(GtkTreeSelection *selection _U_, #ifdef HAVE_PCAP_CREATE gboolean monitor_mode; #endif - gboolean hide; + gboolean hide, hide_enabled = TRUE; if_capabilities_t *caps; gint selected = 0; @@ -773,8 +778,29 @@ ifopts_edit_ifsel_cb(GtkTreeSelection *selection _U_, /* display the interface description from current interfaces selection */ gtk_entry_set_text(GTK_ENTRY(if_descr_te), comment); + /* See if this is the currently selected capturing device */ + if (prefs.capture_device != NULL) { + guint i; + interface_t device; + for (i = 0; i < global_capture_opts.all_ifaces->len; i++) { + device = g_array_index(global_capture_opts.all_ifaces, interface_t, i); + if ((strcmp(device.display_name, prefs.capture_device) == 0) && + (strcmp(device.name, if_name) == 0)) { + /* Don't allow current interface to be hidden */ + hide_enabled = FALSE; + break; + } + } + } + /* display the "hide interface" button state from current interfaces selection */ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(if_hide_cb), hide); + gtk_widget_set_sensitive(if_hide_cb, hide_enabled); + if (hide_enabled) { + gtk_widget_hide(if_default_if_lb); + } else { + gtk_widget_show(if_default_if_lb); + } interfaces_info_nochange = FALSE;