aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--epan/libwireshark.def2
-rw-r--r--epan/prefs-int.h4
-rw-r--r--epan/prefs.c84
-rw-r--r--epan/prefs.h23
-rw-r--r--ui/CMakeLists.txt1
-rw-r--r--ui/Makefile.common2
-rw-r--r--ui/gtk/airpcap_dlg.c1
-rw-r--r--ui/gtk/capture_dlg.c3
-rw-r--r--ui/gtk/filter_expression_save_dlg.c5
-rw-r--r--ui/gtk/gtkglobals.h3
-rw-r--r--ui/gtk/main.c16
-rw-r--r--ui/gtk/main.h3
-rw-r--r--ui/gtk/main_menubar.c1
-rw-r--r--ui/gtk/packet_list.c1
-rw-r--r--ui/gtk/prefs_dlg.c247
-rw-r--r--ui/gtk/prefs_dlg.h4
-rw-r--r--ui/preference_utils.c295
-rw-r--r--ui/preference_utils.h88
-rw-r--r--ui/qt/display_filter_combo.cpp2
-rw-r--r--ui/qt/main.cpp3
-rw-r--r--ui/qt/main_window.cpp4
-rw-r--r--ui/qt/packet_list.cpp4
-rw-r--r--ui/qt/packet_list.h2
-rw-r--r--ui/qt/preferences_dialog.cpp219
-rw-r--r--ui/qt/preferences_dialog.h7
-rw-r--r--ui/qt/qt_ui_utils.cpp5
-rw-r--r--ui/qt/wireshark_application.cpp20
-rw-r--r--ui/qt/wireshark_application.h11
28 files changed, 693 insertions, 367 deletions
diff --git a/epan/libwireshark.def b/epan/libwireshark.def
index bbd7cb0d3f..93109f7bad 100644
--- a/epan/libwireshark.def
+++ b/epan/libwireshark.def
@@ -738,7 +738,6 @@ prefs_module_has_submodules
prefs_modules_foreach
prefs_modules_foreach_submodules
prefs_pref_foreach
-prefs_pref_is_default
prefs_pref_to_str
prefs_pref_type_description
prefs_pref_type_name
@@ -947,7 +946,6 @@ report_open_failure
report_read_failure
report_write_failure
req_resp_hdrs_do_reassembly
-reset_pref
reset_tap_listeners
reset_tcp_reassembly
rose_ctx_clean_data
diff --git a/epan/prefs-int.h b/epan/prefs-int.h
index 9994a4555d..799a7fa4dd 100644
--- a/epan/prefs-int.h
+++ b/epan/prefs-int.h
@@ -119,7 +119,7 @@ struct preference {
const char **string;
range_t **range;
void* uat;
- color_t *color;
+ color_t *colorp;
GList** list;
} varp; /**< pointer to variable storing the value */
union {
@@ -130,7 +130,7 @@ struct preference {
range_t *range;
color_t color;
GList* list;
- } saved_val; /**< original value, when editing from the GUI */
+ } stashed_val; /**< original value, when editing from the GUI */
union {
guint uint;
gboolean boolval;
diff --git a/epan/prefs.c b/epan/prefs.c
index 9c3fc78f86..ec88812492 100644
--- a/epan/prefs.c
+++ b/epan/prefs.c
@@ -929,7 +929,7 @@ register_string_like_preference(module_t *module, const char *name,
}
preference->varp.string = var;
preference->default_val.string = varcopy;
- preference->saved_val.string = NULL;
+ preference->stashed_val.string = NULL;
return preference;
}
@@ -1004,7 +1004,7 @@ prefs_register_range_preference(module_t *module, const char *name,
*var = range_empty();
preference->varp.range = var;
preference->default_val.range = range_copy(*var);
- preference->saved_val.range = NULL;
+ preference->stashed_val.range = NULL;
}
/*
@@ -1043,7 +1043,7 @@ void prefs_register_color_preference(module_t *module, const char *name,
{
pref_t* preference = register_preference(module, name, title, description, PREF_COLOR);
- preference->varp.color = color;
+ preference->varp.colorp = color;
preference->default_val.color = *color;
}
@@ -2696,7 +2696,7 @@ pre_init_prefs(void)
/*
* Reset a single dissector preference.
*/
-void
+static void
reset_pref(pref_t *pref)
{
if (!pref) return;
@@ -2739,7 +2739,7 @@ reset_pref(pref_t *pref)
break;
case PREF_COLOR:
- *pref->varp.color = pref->default_val.color;
+ *pref->varp.colorp = pref->default_val.color;
break;
case PREF_CUSTOM:
@@ -3867,14 +3867,14 @@ set_pref(gchar *pref_name, const gchar *value, void *private_data _U_,
case PREF_COLOR:
{
cval = strtoul(value, NULL, 16);
- pref->varp.color->pixel = 0;
- if ((pref->varp.color->red != RED_COMPONENT(cval)) ||
- (pref->varp.color->green != GREEN_COMPONENT(cval)) ||
- (pref->varp.color->blue != BLUE_COMPONENT(cval))) {
+ pref->varp.colorp->pixel = 0;
+ if ((pref->varp.colorp->red != RED_COMPONENT(cval)) ||
+ (pref->varp.colorp->green != GREEN_COMPONENT(cval)) ||
+ (pref->varp.colorp->blue != BLUE_COMPONENT(cval))) {
module->prefs_changed = TRUE;
- pref->varp.color->red = RED_COMPONENT(cval);
- pref->varp.color->green = GREEN_COMPONENT(cval);
- pref->varp.color->blue = BLUE_COMPONENT(cval);
+ pref->varp.colorp->red = RED_COMPONENT(cval);
+ pref->varp.colorp->green = GREEN_COMPONENT(cval);
+ pref->varp.colorp->blue = BLUE_COMPONENT(cval);
}
break;
}
@@ -4065,7 +4065,7 @@ prefs_pref_type_description(pref_t *pref)
return g_strdup(type_desc);
}
-gboolean
+static gboolean
prefs_pref_is_default(pref_t *pref) {
if (!pref) return FALSE;
@@ -4088,7 +4088,7 @@ prefs_pref_is_default(pref_t *pref) {
case PREF_STRING:
case PREF_FILENAME:
- if (!(strcmp(pref->default_val.string, *pref->varp.string)))
+ if (!(g_strcmp0(pref->default_val.string, *pref->varp.string)))
return TRUE;
break;
@@ -4101,9 +4101,9 @@ prefs_pref_is_default(pref_t *pref) {
case PREF_COLOR:
{
- if ((pref->default_val.color.red == pref->varp.color->red) &&
- (pref->default_val.color.green == pref->varp.color->green) &&
- (pref->default_val.color.blue == pref->varp.color->blue))
+ if ((pref->default_val.color.red == pref->varp.colorp->red) &&
+ (pref->default_val.color.green == pref->varp.colorp->green) &&
+ (pref->default_val.color.blue == pref->varp.colorp->blue))
return TRUE;
break;
}
@@ -4122,7 +4122,7 @@ prefs_pref_is_default(pref_t *pref) {
}
char *
-prefs_pref_to_str(pref_t *pref, gboolean default_val) {
+prefs_pref_to_str(pref_t *pref, pref_source_t source) {
const char *pref_text = "[Unknown]";
guint pref_uint;
gboolean pref_boolval;
@@ -4132,24 +4132,38 @@ prefs_pref_to_str(pref_t *pref, gboolean default_val) {
color_t *pref_color;
if (!pref) {
- return g_strdup(pref_text); /* ...or maybe assert? */
+ return g_strdup(pref_text);
}
- if (default_val) {
- pref_uint = pref->default_val.uint;
- pref_boolval = pref->default_val.boolval;
- pref_enumval = pref->default_val.enumval;
- pref_string = pref->default_val.string;
- pref_range = pref->default_val.range;
- pref_color = &pref->default_val.color;
- } else {
- pref_uint = *pref->varp.uint;
- pref_boolval = *pref->varp.boolp;
- pref_enumval = *pref->varp.enump;
- pref_string = *pref->varp.string;
- pref_range = *pref->varp.range;
- pref_color = pref->varp.color;
+ switch (source) {
+ case pref_default:
+ pref_uint = pref->default_val.uint;
+ pref_boolval = pref->default_val.boolval;
+ pref_enumval = pref->default_val.enumval;
+ pref_string = pref->default_val.string;
+ pref_range = pref->default_val.range;
+ pref_color = &pref->default_val.color;
+ break;
+ case pref_stashed:
+ pref_uint = pref->stashed_val.uint;
+ pref_boolval = pref->stashed_val.boolval;
+ pref_enumval = pref->stashed_val.enumval;
+ pref_string = pref->stashed_val.string;
+ pref_range = pref->stashed_val.range;
+ pref_color = &pref->stashed_val.color;
+ break;
+ case pref_current:
+ pref_uint = *pref->varp.uint;
+ pref_boolval = *pref->varp.boolp;
+ pref_enumval = *pref->varp.enump;
+ pref_string = *pref->varp.string;
+ pref_range = *pref->varp.range;
+ pref_color = pref->varp.colorp;
+ break;
+ default:
+ return g_strdup(pref_text);
}
+
switch (pref->type) {
case PREF_UINT:
@@ -4209,7 +4223,7 @@ prefs_pref_to_str(pref_t *pref, gboolean default_val) {
case PREF_CUSTOM:
if (pref->custom_cbs.to_str_cb)
- return pref->custom_cbs.to_str_cb(pref, default_val);
+ return pref->custom_cbs.to_str_cb(pref, source == pref_default ? TRUE : FALSE);
pref_text = "[Custom]";
break;
@@ -4300,7 +4314,7 @@ write_pref(gpointer data, gpointer user_data)
g_strfreev(desc_lines);
g_free(type_desc);
- pref_text = prefs_pref_to_str(pref, FALSE);
+ pref_text = prefs_pref_to_str(pref, pref_current);
fprintf(arg->pf, "%s%s.%s: ", def_prefix, name_prefix, pref->name);
desc_lines = g_strsplit(pref_text,"\n",0);
for (i = 0; desc_lines[i] != NULL; ++i) {
diff --git a/epan/prefs.h b/epan/prefs.h
index 461a04753a..9795ced0c1 100644
--- a/epan/prefs.h
+++ b/epan/prefs.h
@@ -113,6 +113,12 @@ typedef enum {
version_neither
} version_info_e;
+typedef enum {
+ pref_default,
+ pref_stashed,
+ pref_current
+} pref_source_t;
+
typedef struct _e_prefs {
gint pr_format;
@@ -474,15 +480,6 @@ const char *prefs_pref_type_name(pref_t *pref);
*/
char *prefs_pref_type_description(pref_t *pref);
-/** Check if a preference differs from its default value
- *
- * @param pref A preference.
- *
- * @return TRUE if the current value of the preference is the same as
- * its default value or FALSE if they differ.
- */
-gboolean prefs_pref_is_default(pref_t *pref);
-
/** Fetch a string representation of the preference.
*
* @param pref A preference.
@@ -491,7 +488,7 @@ gboolean prefs_pref_is_default(pref_t *pref);
*
* @return A string representation of the preference. Must be g_free()d.
*/
-char *prefs_pref_to_str(pref_t *pref, gboolean default_val);
+char *prefs_pref_to_str(pref_t *pref, pref_source_t source);
/* Read the preferences file, fill in "prefs", and return a pointer to it.
@@ -514,12 +511,6 @@ extern e_prefs *read_prefs(int *, int *, char **, int *, int *, char **);
into "*pf_path_return", and return the errno. */
extern int write_prefs(char **);
-/** Set a preference to its default value
- *
- * @param pref A preference.
- */
-extern void reset_pref(pref_t *pref);
-
/*
* Given a string of the form "<pref name>:<pref value>", as might appear
* as an argument to a "-o" option, parse it and set the preference in
diff --git a/ui/CMakeLists.txt b/ui/CMakeLists.txt
index 620d3d00dc..664cb25d8f 100644
--- a/ui/CMakeLists.txt
+++ b/ui/CMakeLists.txt
@@ -30,6 +30,7 @@ set(COMMON_UI_SRC
export_object_smb.c
help_url.c
iface_lists.c
+ preference_utils.c
profile.c
ssl_key_export.c
text_import.c
diff --git a/ui/Makefile.common b/ui/Makefile.common
index 626cc6f82a..4509496f7d 100644
--- a/ui/Makefile.common
+++ b/ui/Makefile.common
@@ -51,6 +51,7 @@ WIRESHARK_UI_SRC = \
export_object_smb.c \
iface_lists.c \
help_url.c \
+ preference_utils.c \
profile.c \
ssl_key_export.c \
text_import.c \
@@ -66,6 +67,7 @@ noinst_HEADERS = \
help_url.h \
iface_lists.h \
main_statusbar.h \
+ preference_utils.h \
profile.h \
progress_dlg.h \
recent.h \
diff --git a/ui/gtk/airpcap_dlg.c b/ui/gtk/airpcap_dlg.c
index ea0fd3f290..6e9661fb4b 100644
--- a/ui/gtk/airpcap_dlg.c
+++ b/ui/gtk/airpcap_dlg.c
@@ -41,6 +41,7 @@
#include <pcap.h>
+#include "ui/preference_utils.h"
#include "ui/simple_dialog.h"
#include "ui/gtk/main.h"
diff --git a/ui/gtk/capture_dlg.c b/ui/gtk/capture_dlg.c
index 083d473001..f971292c6d 100644
--- a/ui/gtk/capture_dlg.c
+++ b/ui/gtk/capture_dlg.c
@@ -46,6 +46,7 @@
#include "ui/capture_globals.h"
#include "ui/iface_lists.h"
+#include "ui/preference_utils.h"
#include "ui/recent.h"
#include "ui/recent_utils.h"
#include "ui/simple_dialog.h"
@@ -4429,7 +4430,7 @@ capture_prep_cb(GtkWidget *w _U_, gpointer d _U_)
/* load the airpcap interfaces */
airpcap_if_list = get_airpcap_interface_list(&err, &err_str);
- /* If we don't get a list don't do any thing.
+ /* If we don't get a list don't do any thing.
* If the error is AIRPCAP_NOT_LOADED it avoids a unneccessay rescan of the packet list
* ( see airpcap_loader.h for error codes).
*/
diff --git a/ui/gtk/filter_expression_save_dlg.c b/ui/gtk/filter_expression_save_dlg.c
index 1c9b598de1..73db849892 100644
--- a/ui/gtk/filter_expression_save_dlg.c
+++ b/ui/gtk/filter_expression_save_dlg.c
@@ -41,8 +41,9 @@
#include "../globals.h"
#include "ui/alert_box.h"
-#include "ui/simple_dialog.h"
#include "ui/main_statusbar.h"
+#include "ui/preference_utils.h"
+#include "ui/simple_dialog.h"
#include "ui/ui_util.h"
#include "ui/gtk/gui_utils.h"
@@ -227,7 +228,7 @@ filter_expression_save_dlg(gpointer data)
*filter_save_type_vb, *filter_save_type_hb, *entry_hb,
*bbox, *ok_bt, *cancel_bt, *help_bt, *filter_text_box,
*label_text_box;
-
+
const char *expr;
/* The filter requested */
diff --git a/ui/gtk/gtkglobals.h b/ui/gtk/gtkglobals.h
index e5d69d3a2f..7cf7737ef0 100644
--- a/ui/gtk/gtkglobals.h
+++ b/ui/gtk/gtkglobals.h
@@ -51,7 +51,4 @@ extern GtkWidget *byte_nb_ptr_gbl;
/** The filter text entry in the filter toolbar. */
extern GtkWidget *main_display_filter_widget;
-/** If autoscroll in live captures is active or not */
-extern gboolean auto_scroll_live;
-
#endif
diff --git a/ui/gtk/main.c b/ui/gtk/main.c
index 276dabfa6a..4b27b55419 100644
--- a/ui/gtk/main.c
+++ b/ui/gtk/main.c
@@ -106,6 +106,7 @@
#include "ui/alert_box.h"
#include "ui/main_statusbar.h"
+#include "ui/preference_utils.h"
#include "ui/recent.h"
#include "ui/recent_utils.h"
#include "ui/simple_dialog.h"
@@ -3786,21 +3787,6 @@ show_main_window(gboolean doing_work)
#endif /* HAVE_AIRPCAP */
}
-/* Fill in capture options with values from the preferences */
-void
-prefs_to_capture_opts(void)
-{
-#ifdef HAVE_LIBPCAP
- /* Set promiscuous mode from the preferences setting. */
- /* the same applies to other preferences settings as well. */
- global_capture_opts.default_options.promisc_mode = prefs.capture_prom_mode;
- global_capture_opts.use_pcapng = prefs.capture_pcap_ng;
- global_capture_opts.show_info = prefs.capture_show_info;
- global_capture_opts.real_time_mode = prefs.capture_real_time;
- auto_scroll_live = prefs.capture_auto_scroll;
-#endif /* HAVE_LIBPCAP */
-}
-
static void copy_global_profile (const gchar *profile_name)
{
char *pf_dir_path, *pf_dir_path2, *pf_filename;
diff --git a/ui/gtk/main.h b/ui/gtk/main.h
index 80edea5762..845cf296c0 100644
--- a/ui/gtk/main.h
+++ b/ui/gtk/main.h
@@ -355,9 +355,6 @@ extern void create_console(void);
extern void reset_tap_update_timer(void);
#endif
-/** Fill in capture options with values from the preferences */
-extern void prefs_to_capture_opts(void);
-
/** Change configuration profile */
extern void change_configuration_profile(const gchar *profile_name);
diff --git a/ui/gtk/main_menubar.c b/ui/gtk/main_menubar.c
index 4082ed43ba..ac6afa366f 100644
--- a/ui/gtk/main_menubar.c
+++ b/ui/gtk/main_menubar.c
@@ -54,6 +54,7 @@
#include "ui/iface_lists.h"
#include "ui/main_statusbar.h"
+#include "ui/preference_utils.h"
#include "ui/recent.h"
#include "ui/simple_dialog.h"
#include "ui/ui_util.h"
diff --git a/ui/gtk/packet_list.c b/ui/gtk/packet_list.c
index 37c14985ac..87911a10c6 100644
--- a/ui/gtk/packet_list.c
+++ b/ui/gtk/packet_list.c
@@ -42,6 +42,7 @@
#include <epan/emem.h>
#include "ui/main_statusbar.h"
+#include "ui/preference_utils.h"
#include "ui/progress_dlg.h"
#include "ui/recent.h"
#include "ui/recent_utils.h"
diff --git a/ui/gtk/prefs_dlg.c b/ui/gtk/prefs_dlg.c
index 348b8cd800..2cb781c901 100644
--- a/ui/gtk/prefs_dlg.c
+++ b/ui/gtk/prefs_dlg.c
@@ -28,7 +28,6 @@
#include <string.h>
-#include <epan/filesystem.h>
#include <epan/packet.h>
#include <epan/prefs.h>
#include <epan/strutil.h>
@@ -37,6 +36,7 @@
#include "../file.h"
#include "../print.h"
+#include "ui/preference_utils.h"
#include "ui/simple_dialog.h"
#include "ui/gtk/main.h"
@@ -120,25 +120,6 @@ pref_exists(pref_t *pref _U_, gpointer user_data _U_)
return 1;
}
-static const char*
-get_pref_type_string(pref_type_t t)
-{
- switch (t)
- {
-#define CASE(T) case PREF_##T: return #T
- CASE(UINT);
- CASE(BOOL);
- CASE(ENUM);
- CASE(STRING);
- CASE(RANGE);
- CASE(STATIC_TEXT);
- CASE(UAT);
- CASE(OBSOLETE);
- default:
- return "UNKNOWN";
- }
-}
-
/* show a single preference on the GtkTable of a preference page */
static guint
pref_show(pref_t *pref, gpointer user_data)
@@ -146,6 +127,7 @@ pref_show(pref_t *pref, gpointer user_data)
GtkWidget *main_tb = user_data;
module_t *module = g_object_get_data(G_OBJECT(main_tb), E_TABLE_MODULE_KEY);
const char *title;
+ const char *type_name = prefs_pref_type_name(pref);
char *label_string;
size_t label_len;
char uint_str[10+1];
@@ -161,7 +143,7 @@ pref_show(pref_t *pref, gpointer user_data)
tooltip_txt = pref->description? g_strdup_printf("%s.%s: %s\n%s",
module->name,
pref->name,
- get_pref_type_string(pref->type),
+ type_name ? type_name : "Unknown",
pref->description): NULL;
/*
@@ -171,14 +153,14 @@ pref_show(pref_t *pref, gpointer user_data)
if (pref->type != PREF_STATIC_TEXT)
g_strlcat(label_string, ":", label_len);
+ pref_stash(pref, NULL);
+
/* Save the current value of the preference, so that we can revert it if
the user does "Apply" and then "Cancel", and create the control for
editing the preference. */
switch (pref->type) {
case PREF_UINT:
- pref->saved_val.uint = *pref->varp.uint;
-
/* XXX - there are no uint spinbuttons, so we can't use a spinbutton.
Even more annoyingly, even if there were, GLib doesn't define
G_MAXUINT - but I think ANSI C may define UINT_MAX, so we could
@@ -186,15 +168,15 @@ pref_show(pref_t *pref, gpointer user_data)
switch (pref->info.base) {
case 10:
- g_snprintf(uint_str, sizeof(uint_str), "%u", pref->saved_val.uint);
+ g_snprintf(uint_str, sizeof(uint_str), "%u", pref->stashed_val.uint);
break;
case 8:
- g_snprintf(uint_str, sizeof(uint_str), "%o", pref->saved_val.uint);
+ g_snprintf(uint_str, sizeof(uint_str), "%o", pref->stashed_val.uint);
break;
case 16:
- g_snprintf(uint_str, sizeof(uint_str), "%x", pref->saved_val.uint);
+ g_snprintf(uint_str, sizeof(uint_str), "%x", pref->stashed_val.uint);
break;
}
pref->control = create_preference_entry(main_tb, pref->ordinal,
@@ -203,52 +185,44 @@ pref_show(pref_t *pref, gpointer user_data)
break;
case PREF_BOOL:
- pref->saved_val.boolval = *pref->varp.boolp;
pref->control = create_preference_check_button(main_tb, pref->ordinal,
label_string, tooltip_txt,
- pref->saved_val.boolval);
+ pref->stashed_val.boolval);
break;
case PREF_ENUM:
- pref->saved_val.enumval = *pref->varp.enump;
if (pref->info.enum_info.radio_buttons) {
/* Show it as radio buttons. */
pref->control = create_preference_radio_buttons(main_tb, pref->ordinal,
label_string, tooltip_txt,
pref->info.enum_info.enumvals,
- pref->saved_val.enumval);
+ pref->stashed_val.enumval);
} else {
/* Show it as an option menu. */
pref->control = create_preference_option_menu(main_tb, pref->ordinal,
label_string, tooltip_txt,
pref->info.enum_info.enumvals,
- pref->saved_val.enumval);
+ pref->stashed_val.enumval);
}
break;
case PREF_STRING:
- g_free(pref->saved_val.string);
- pref->saved_val.string = g_strdup(*pref->varp.string);
pref->control = create_preference_entry(main_tb, pref->ordinal,
label_string, tooltip_txt,
- pref->saved_val.string);
+ pref->stashed_val.string);
break;
case PREF_FILENAME:
- g_free(pref->saved_val.string);
- pref->saved_val.string = g_strdup(*pref->varp.string);
pref->control = create_preference_filename_entry(main_tb, pref->ordinal,
label_string,
tooltip_txt,
- pref->saved_val.string);
+ pref->stashed_val.string);
break;
case PREF_RANGE:
{
char *range_str_p;
- g_free(pref->saved_val.range);
- pref->saved_val.range = range_copy(*pref->varp.range);
range_str_p = range_convert_range(*pref->varp.range);
pref->control = create_preference_entry(main_tb, pref->ordinal,
label_string, tooltip_txt,
@@ -1230,51 +1204,7 @@ prefs_airpcap_update(void)
#endif
static guint
-pref_clean(pref_t *pref, gpointer user_data _U_)
-{
- switch (pref->type) {
-
- case PREF_UINT:
- break;
-
- case PREF_BOOL:
- break;
-
- case PREF_ENUM:
- break;
-
- case PREF_STRING:
- case PREF_FILENAME:
- if (pref->saved_val.string != NULL) {
- g_free(pref->saved_val.string);
- pref->saved_val.string = NULL;
- }
- break;
-
- case PREF_RANGE:
- if (pref->saved_val.range != NULL) {
- g_free(pref->saved_val.range);
- pref->saved_val.range = NULL;
- }
- break;
-
- case PREF_STATIC_TEXT:
- case PREF_UAT:
- break;
-
- case PREF_COLOR:
- case PREF_CUSTOM:
- /* currently not supported */
-
- case PREF_OBSOLETE:
- g_assert_not_reached();
- break;
- }
- return 0;
-}
-
-static guint
-module_prefs_clean(module_t *module, gpointer user_data _U_)
+module_prefs_clean_stash(module_t *module, gpointer user_data _U_)
{
/* Ignore any preferences with their own interface */
if (!module->use_gui) {
@@ -1283,7 +1213,7 @@ module_prefs_clean(module_t *module, gpointer user_data _U_)
/* For all preferences in this module, clean up any cruft allocated for
use by the GUI code. */
- prefs_pref_foreach(module, pref_clean, NULL);
+ prefs_pref_foreach(module, pref_clean_stash, NULL);
return 0; /* keep cleaning modules */
}
@@ -1414,51 +1344,7 @@ prefs_main_destroy_all(GtkWidget *dlg)
/* Free up the saved preferences (both for "prefs" and for registered
preferences). */
- prefs_modules_foreach(module_prefs_clean, NULL);
-}
-
-
-static guint
-pref_copy(pref_t *pref, gpointer user_data _U_)
-{
- switch (pref->type) {
-
- case PREF_UINT:
- pref->saved_val.uint = *pref->varp.uint;
- break;
-
- case PREF_BOOL:
- pref->saved_val.boolval = *pref->varp.boolp;
- break;
-
- case PREF_ENUM:
- pref->saved_val.enumval = *pref->varp.enump;
- break;
-
- case PREF_STRING:
- case PREF_FILENAME:
- g_free(pref->saved_val.string);
- pref->saved_val.string = g_strdup(*pref->varp.string);
- break;
-
- case PREF_RANGE:
- g_free(pref->saved_val.range);
- pref->saved_val.range = range_copy(*pref->varp.range);
- break;
-
- case PREF_STATIC_TEXT:
- case PREF_UAT:
- break;
-
- case PREF_COLOR:
- case PREF_CUSTOM:
- /* currently not supported */
-
- case PREF_OBSOLETE:
- g_assert_not_reached();
- break;
- }
- return 0;
+ prefs_modules_foreach(module_prefs_clean_stash, NULL);
}
static guint
@@ -1470,7 +1356,7 @@ module_prefs_copy(module_t *module, gpointer user_data _U_)
}
/* For all preferences in this module, (re)save current value */
- prefs_pref_foreach(module, pref_copy, NULL);
+ prefs_pref_foreach(module, pref_stash, NULL);
return 0; /* continue making copies */
}
@@ -1480,42 +1366,6 @@ static void prefs_copy(void) {
prefs_modules_foreach(module_prefs_copy, NULL);
}
-
-void
-prefs_main_write(void)
-{
- int err;
- char *pf_dir_path;
- char *pf_path;
-
- /* Create the directory that holds personal configuration files, if
- necessary. */
- if (create_persconffile_dir(&pf_dir_path) == -1) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Can't create directory\n\"%s\"\nfor preferences file: %s.", pf_dir_path,
- g_strerror(errno));
- g_free(pf_dir_path);
- } else {
- /* Write the preferencs out. */
- err = write_prefs(&pf_path);
- if (err != 0) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "Can't open preferences file\n\"%s\": %s.", pf_path,
- g_strerror(err));
- g_free(pf_path);
- }
- }
-
-#ifdef HAVE_AIRPCAP
- /*
- * Load the Wireshark decryption keys (just set) and save
- * the changes to the adapters' registry
- */
- airpcap_load_decryption_keys(airpcap_if_list);
-#endif
-}
-
-
static void
prefs_main_ok_cb(GtkWidget *ok_bt _U_, gpointer parent_w)
{
@@ -1614,67 +1464,6 @@ prefs_main_save_cb(GtkWidget *save_bt _U_, gpointer parent_w)
}
static guint
-pref_revert(pref_t *pref, gpointer user_data)
-{
- gboolean *pref_changed_p = user_data;
-
- /* Revert the preference to its saved value. */
- switch (pref->type) {
-
- case PREF_UINT:
- if (*pref->varp.uint != pref->saved_val.uint) {
- *pref_changed_p = TRUE;
- *pref->varp.uint = pref->saved_val.uint;
- }
- break;
-
- case PREF_BOOL:
- if (*pref->varp.boolp != pref->saved_val.boolval) {
- *pref_changed_p = TRUE;
- *pref->varp.boolp = pref->saved_val.boolval;
- }
- break;
-
- case PREF_ENUM:
- if (*pref->varp.enump != pref->saved_val.enumval) {
- *pref_changed_p = TRUE;
- *pref->varp.enump = pref->saved_val.enumval;
- }
- break;
-
- case PREF_STRING:
- case PREF_FILENAME:
- if (strcmp(*pref->varp.string, pref->saved_val.string) != 0) {
- *pref_changed_p = TRUE;
- g_free((void *)*pref->varp.string);
- *pref->varp.string = g_strdup(pref->saved_val.string);
- }
- break;
-
- case PREF_RANGE:
- if (!ranges_are_equal(*pref->varp.range, pref->saved_val.range)) {
- *pref_changed_p = TRUE;
- g_free(*pref->varp.range);
- *pref->varp.range = range_copy(pref->saved_val.range);
- }
- break;
-
- case PREF_STATIC_TEXT:
- case PREF_UAT:
- break;
-
- case PREF_COLOR:
- case PREF_CUSTOM:
- /* currently not supported */
-
- case PREF_OBSOLETE:
- g_assert_not_reached();
- break;
- }
- return 0;
-}
-
-static guint
module_prefs_revert(module_t *module, gpointer user_data)
{
gboolean *must_redissect_p = user_data;
@@ -1688,7 +1477,7 @@ module_prefs_revert(module_t *module, gpointer user_data)
it had when we popped up the Preferences dialog. Find out whether
this changes any of them. */
module->prefs_changed = FALSE; /* assume none of them changed */
- prefs_pref_foreach(module, pref_revert, &module->prefs_changed);
+ prefs_pref_foreach(module, pref_unstash, &module->prefs_changed);
/* If any of them changed, indicate that we must redissect and refilter
the current capture (if we have one), as the preference change
diff --git a/ui/gtk/prefs_dlg.h b/ui/gtk/prefs_dlg.h
index 440443ce87..efb84a9167 100644
--- a/ui/gtk/prefs_dlg.h
+++ b/ui/gtk/prefs_dlg.h
@@ -185,8 +185,4 @@ GtkWidget *
create_preference_uat(GtkWidget *main_tb, int table_position,
const gchar *label_text, const gchar *tooltip_text, void *uat);
-/** Save all preferences */
-void
-prefs_main_write(void);
-
#endif
diff --git a/ui/preference_utils.c b/ui/preference_utils.c
new file mode 100644
index 0000000000..faf6b6d3e9
--- /dev/null
+++ b/ui/preference_utils.c
@@ -0,0 +1,295 @@
+/* preference_utils.h
+ * Routines for handling preferences
+ *
+ * $Id$
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1998 Gerald Combs
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include "config.h"
+
+#include <errno.h>
+
+#include <glib.h>
+
+#include <epan/filesystem.h>
+#include <epan/prefs.h>
+#include <epan/prefs-int.h>
+
+#ifdef HAVE_LIBPCAP
+#include "capture_opts.h"
+#include "ui/capture_globals.h"
+#endif
+
+#include "ui/preference_utils.h"
+#include "ui/simple_dialog.h"
+
+guint
+pref_stash(pref_t *pref, gpointer unused _U_)
+{
+ g_log(NULL,G_LOG_LEVEL_INFO, "=stashing %s", pref->name);
+ switch (pref->type) {
+
+ case PREF_UINT:
+ pref->stashed_val.uint = *pref->varp.uint;
+ break;
+
+ case PREF_BOOL:
+ pref->stashed_val.boolval = *pref->varp.boolp;
+ break;
+
+ case PREF_ENUM:
+ pref->stashed_val.enumval = *pref->varp.enump;
+ break;
+
+ case PREF_STRING:
+ case PREF_FILENAME:
+ g_free(pref->stashed_val.string);
+ pref->stashed_val.string = g_strdup(*pref->varp.string);
+ break;
+
+ case PREF_RANGE:
+ g_free(pref->stashed_val.range);
+ pref->stashed_val.range = range_copy(*pref->varp.range);
+ break;
+
+ case PREF_COLOR:
+ g_log(NULL,G_LOG_LEVEL_INFO, "=stashing %s", pref->name);
+ pref->stashed_val.color = *pref->varp.colorp;
+ break;
+
+ case PREF_STATIC_TEXT:
+ case PREF_UAT:
+ case PREF_CUSTOM:
+ break;
+
+ case PREF_OBSOLETE:
+ g_assert_not_reached();
+ break;
+ }
+ return 0;
+}
+
+guint
+pref_unstash(pref_t *pref, gpointer changed_p)
+{
+ gboolean *pref_changed_p = changed_p;
+
+ /* Revert the preference to its saved value. */
+ switch (pref->type) {
+
+ case PREF_UINT:
+ if (*pref->varp.uint != pref->stashed_val.uint) {
+ *pref_changed_p = TRUE;
+ *pref->varp.uint = pref->stashed_val.uint;
+ }
+ break;
+
+ case PREF_BOOL:
+ if (*pref->varp.boolp != pref->stashed_val.boolval) {
+ *pref_changed_p = TRUE;
+ *pref->varp.boolp = pref->stashed_val.boolval;
+ }
+ break;
+
+ case PREF_ENUM:
+ if (*pref->varp.enump != pref->stashed_val.enumval) {
+ *pref_changed_p = TRUE;
+ *pref->varp.enump = pref->stashed_val.enumval;
+ }
+ break;
+
+ case PREF_STRING:
+ case PREF_FILENAME:
+ if (strcmp(*pref->varp.string, pref->stashed_val.string) != 0) {
+ *pref_changed_p = TRUE;
+ g_free((void *)*pref->varp.string);
+ *pref->varp.string = g_strdup(pref->stashed_val.string);
+ }
+ break;
+
+ case PREF_RANGE:
+ if (!ranges_are_equal(*pref->varp.range, pref->stashed_val.range)) {
+ *pref_changed_p = TRUE;
+ g_free(*pref->varp.range);
+ *pref->varp.range = range_copy(pref->stashed_val.range);
+ }
+ break;
+
+ case PREF_COLOR:
+ *pref->varp.colorp = pref->stashed_val.color;
+ break;
+
+ case PREF_STATIC_TEXT:
+ case PREF_UAT:
+ case PREF_CUSTOM:
+ break;
+
+ case PREF_OBSOLETE:
+ g_assert_not_reached();
+ break;
+ }
+ return 0;
+}
+
+void
+reset_stashed_pref(pref_t *pref) {
+ switch (pref->type) {
+
+ case PREF_UINT:
+ pref->stashed_val.uint = pref->default_val.uint;
+ break;
+
+ case PREF_BOOL:
+ pref->stashed_val.boolval = pref->default_val.boolval;
+ break;
+
+ case PREF_ENUM:
+ pref->stashed_val.enumval = pref->default_val.enumval;
+ break;
+
+ case PREF_STRING:
+ case PREF_FILENAME:
+ g_free(pref->stashed_val.string);
+ pref->stashed_val.string = g_strdup(pref->default_val.string);
+ break;
+
+ case PREF_RANGE:
+ g_free(pref->stashed_val.range);
+ pref->stashed_val.range = range_copy(pref->default_val.range);
+ break;
+
+ case PREF_COLOR:
+ memcpy(&pref->stashed_val.color, &pref->default_val.color, sizeof(color_t));
+ break;
+
+ case PREF_STATIC_TEXT:
+ case PREF_UAT:
+ case PREF_CUSTOM:
+ break;
+
+ case PREF_OBSOLETE:
+ g_assert_not_reached();
+ break;
+ }
+}
+
+guint
+pref_clean_stash(pref_t *pref, gpointer unused _U_)
+{
+ switch (pref->type) {
+
+ case PREF_UINT:
+ break;
+
+ case PREF_BOOL:
+ break;
+
+ case PREF_ENUM:
+ break;
+
+ case PREF_STRING:
+ case PREF_FILENAME:
+ if (pref->stashed_val.string != NULL) {
+ g_free(pref->stashed_val.string);
+ pref->stashed_val.string = NULL;
+ }
+ break;
+
+ case PREF_RANGE:
+ if (pref->stashed_val.range != NULL) {
+ g_free(pref->stashed_val.range);
+ pref->stashed_val.range = NULL;
+ }
+ break;
+
+ case PREF_STATIC_TEXT:
+ case PREF_UAT:
+ case PREF_COLOR:
+ case PREF_CUSTOM:
+ break;
+
+ case PREF_OBSOLETE:
+ g_assert_not_reached();
+ break;
+ }
+ return 0;
+}
+
+/* Fill in capture options with values from the preferences */
+void
+prefs_to_capture_opts(void)
+{
+#ifdef HAVE_LIBPCAP
+ /* Set promiscuous mode from the preferences setting. */
+ /* the same applies to other preferences settings as well. */
+ global_capture_opts.default_options.promisc_mode = prefs.capture_prom_mode;
+ global_capture_opts.use_pcapng = prefs.capture_pcap_ng;
+ global_capture_opts.show_info = prefs.capture_show_info;
+ global_capture_opts.real_time_mode = prefs.capture_real_time;
+ auto_scroll_live = prefs.capture_auto_scroll;
+#endif /* HAVE_LIBPCAP */
+}
+
+void
+prefs_main_write(void)
+{
+ int err;
+ char *pf_dir_path;
+ char *pf_path;
+
+ /* Create the directory that holds personal configuration files, if
+ necessary. */
+ if (create_persconffile_dir(&pf_dir_path) == -1) {
+ simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
+ "Can't create directory\n\"%s\"\nfor preferences file: %s.", pf_dir_path,
+ g_strerror(errno));
+ g_free(pf_dir_path);
+ } else {
+ /* Write the preferencs out. */
+ err = write_prefs(&pf_path);
+ if (err != 0) {
+ simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
+ "Can't open preferences file\n\"%s\": %s.", pf_path,
+ g_strerror(err));
+ g_free(pf_path);
+ }
+ }
+
+#ifdef HAVE_AIRPCAP
+ /*
+ * Load the Wireshark decryption keys (just set) and save
+ * the changes to the adapters' registry
+ */
+ airpcap_load_decryption_keys(airpcap_if_list);
+#endif
+}
+
+/*
+ * Editor modelines
+ *
+ * Local Variables:
+ * c-basic-offset: 2
+ * tab-width: 8
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * ex: set shiftwidth=2 tabstop=8 expandtab:
+ * :indentSize=2:tabSize=8:noTabs=true:
+ */
diff --git a/ui/preference_utils.h b/ui/preference_utils.h
new file mode 100644
index 0000000000..c135b1d305
--- /dev/null
+++ b/ui/preference_utils.h
@@ -0,0 +1,88 @@
+/* preference_utils.h
+ * Routines for handling preferences
+ *
+ * $Id$
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1998 Gerald Combs
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef __PREFRENCE_UTILS_H__
+#define __PREFRENCE_UTILS_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/** @file
+ * Preference utility routines.
+ * @ingroup prefs_group
+ */
+
+/** "Stash" a preference.
+ * Copy a preference to its stashed value. Can be called from prefs_pref_foreach().
+ *
+ * @param pref: A preference.
+ */
+extern guint pref_stash(pref_t *pref, gpointer unused _U_);
+
+/** "Untash" a preference.
+ * Set a preference to its stashed value. Can be called from prefs_pref_foreach().
+ *
+ * @param pref: A preference.
+ * @param changed_p: A pointer to a gboolean. Set to TRUE if the preference differs
+ * from its stashed value.
+ *
+ * @return Always returns 0.
+ */
+extern guint pref_unstash(pref_t *pref, gpointer changed_p);
+
+/** Clean up a stashed preference.
+ * Can be called from prefs_pref_foreach().
+ *
+ * @param pref A preference.
+ *
+ * @return Always returns 0.
+ */
+extern guint pref_clean_stash(pref_t *pref, gpointer unused _U_);
+
+/** Set a stashed preference to its default value.
+ *
+ *@pram pref A preference.
+ */
+extern void reset_stashed_pref(pref_t *pref);
+
+
+/** If autoscroll in live captures is active or not
+ */
+extern gboolean auto_scroll_live;
+
+/** Fill in capture options with values from the preferences
+ */
+extern void prefs_to_capture_opts(void);
+
+/** Save all preferences
+ */
+extern void prefs_main_write(void);
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* __PREFRENCE_UTILS_H__ */
diff --git a/ui/qt/display_filter_combo.cpp b/ui/qt/display_filter_combo.cpp
index 1d6b121b80..bd0f5bd589 100644
--- a/ui/qt/display_filter_combo.cpp
+++ b/ui/qt/display_filter_combo.cpp
@@ -76,7 +76,7 @@ DisplayFilterCombo::DisplayFilterCombo(QWidget *parent) :
);
completer()->setCompletionMode(QCompleter::PopupCompletion);
- connect(wsApp, SIGNAL(updatePreferences()), this, SLOT(updateMaxCount()));
+ connect(wsApp, SIGNAL(preferencesChanged()), this, SLOT(updateMaxCount()));
}
extern "C" void dfilter_recent_combo_write_all(FILE *rf) {
diff --git a/ui/qt/main.cpp b/ui/qt/main.cpp
index 43b00c615f..955ebac211 100644
--- a/ui/qt/main.cpp
+++ b/ui/qt/main.cpp
@@ -962,7 +962,8 @@ int main(int argc, char *argv[])
/* Notify all registered modules that have had any of their preferences
changed either from one of the preferences file or from the command
line that their preferences have changed. */
- wsApp->applyAllPreferences();
+ prefs_apply_all();
+ wsApp->emitAppSignal(WiresharkApplication::PreferencesChanged);
#ifdef HAVE_LIBPCAP
if ((global_capture_opts.num_selected == 0) &&
diff --git a/ui/qt/main_window.cpp b/ui/qt/main_window.cpp
index 0e78e59b4d..d0aa9993ba 100644
--- a/ui/qt/main_window.cpp
+++ b/ui/qt/main_window.cpp
@@ -191,6 +191,8 @@ MainWindow::MainWindow(QWidget *parent) :
this, SLOT(captureFileClosing(const capture_file*)));
connect(wsApp, SIGNAL(captureFileClosed(const capture_file*)),
this, SLOT(captureFileClosed(const capture_file*)));
+ connect(wsApp, SIGNAL(packetDissectionChanged()),
+ this, SLOT(redissectPackets()));
connect(main_welcome_, SIGNAL(startCapture()),
this, SLOT(startCapture()));
@@ -224,7 +226,7 @@ MainWindow::MainWindow(QWidget *parent) :
connect(packet_list_->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
this, SLOT(setMenusForSelectedPacket()));
- connect(packet_list_, SIGNAL(packetsChanged()),
+ connect(packet_list_, SIGNAL(packetDissectionChanged()),
this, SLOT(redissectPackets()));
connect(proto_tree_, SIGNAL(protoItemSelected(QString&)),
diff --git a/ui/qt/packet_list.cpp b/ui/qt/packet_list.cpp
index fdf2877f2c..0e93cd454f 100644
--- a/ui/qt/packet_list.cpp
+++ b/ui/qt/packet_list.cpp
@@ -746,7 +746,7 @@ void PacketList::ignoreFrame()
fdata = packet_list_model_->getRowFdata(row);
setFrameIgnore(!fdata->flags.ignored, fdata);
- emit packetsChanged();
+ emit packetDissectionChanged();
}
void PacketList::ignoreAllDisplayedFrames(bool set)
@@ -761,7 +761,7 @@ void PacketList::ignoreAllDisplayedFrames(bool set)
if (!set || fdata->flags.passed_dfilter)
setFrameIgnore(set, fdata);
}
- emit packetsChanged();
+ emit packetDissectionChanged();
}
void PacketList::setTimeReference()
diff --git a/ui/qt/packet_list.h b/ui/qt/packet_list.h
index 739c8116cc..e8e1595c5c 100644
--- a/ui/qt/packet_list.h
+++ b/ui/qt/packet_list.h
@@ -71,7 +71,7 @@ private:
void setFrameReftime(gboolean set, frame_data *fdata);
signals:
- void packetsChanged();
+ void packetDissectionChanged();
public slots:
void setCaptureFile(capture_file *cf);
diff --git a/ui/qt/preferences_dialog.cpp b/ui/qt/preferences_dialog.cpp
index 8f96ffee6a..c48f465c7f 100644
--- a/ui/qt/preferences_dialog.cpp
+++ b/ui/qt/preferences_dialog.cpp
@@ -27,6 +27,8 @@
#include <epan/prefs-int.h>
+#include <ui/preference_utils.h>
+
#include "syntax_line_edit.h"
#include "qt_ui_utils.h"
@@ -72,14 +74,17 @@ fill_advanced_prefs(module_t *module, gpointer root_ptr)
const char *type_name = prefs_pref_type_name(pref);
if (!type_name) continue;
+ pref_stash(pref, NULL);
+
QTreeWidgetItem *item = new QTreeWidgetItem();
QString full_name = QString(module->name ? module->name : module->parent->name) + "." + pref->name;
QString type_desc = gchar_free_to_qstring(prefs_pref_type_description(pref));
- QString default_value = gchar_free_to_qstring(prefs_pref_to_str(pref, true));
+ QString default_value = gchar_free_to_qstring(prefs_pref_to_str(pref, pref_stashed));
item->setData(0, Qt::UserRole, qVariantFromValue(pref));
item->setText(0, full_name);
item->setToolTip(0, QString("<span>%1</span>").arg(pref->description));
+ item->setToolTip(1, "Has this preference been changed?");
item->setText(2, type_name);
item->setToolTip(2, QString("<span>%1</span>").arg(type_desc));
item->setToolTip(3, QString("<span>%1</span>").arg(
@@ -94,13 +99,62 @@ fill_advanced_prefs(module_t *module, gpointer root_ptr)
return 0;
}
+static guint
+module_prefs_unstash(module_t *module, gpointer data)
+{
+ gboolean *must_redissect_p = (gboolean *)data;
+
+ module->prefs_changed = FALSE; /* assume none of them changed */
+ for (GList *pref_l = module->prefs; pref_l && pref_l->data; pref_l = g_list_next(pref_l)) {
+ pref_t *pref = (pref_t *) pref_l->data;
+
+ if (pref->type == PREF_OBSOLETE || pref->type == PREF_STATIC_TEXT) continue;
+
+ pref_unstash(pref, &module->prefs_changed);
+ }
+
+ /* If any of them changed, indicate that we must redissect and refilter
+ the current capture (if we have one), as the preference change
+ could cause packets to be dissected differently. */
+ if (module->prefs_changed)
+ *must_redissect_p = TRUE;
+
+ if(prefs_module_has_submodules(module))
+ return prefs_modules_foreach_submodules(module, module_prefs_unstash, data);
+
+ return 0; /* Keep unstashing. */
+}
+
+static guint
+module_prefs_clean_stash(module_t *module, gpointer unused)
+{
+ Q_UNUSED(unused);
+
+ for (GList *pref_l = module->prefs; pref_l && pref_l->data; pref_l = g_list_next(pref_l)) {
+ pref_t *pref = (pref_t *) pref_l->data;
+
+ if (pref->type == PREF_OBSOLETE || pref->type == PREF_STATIC_TEXT) continue;
+
+ pref_clean_stash(pref, NULL);
+ }
+
+ if(prefs_module_has_submodules(module))
+ return prefs_modules_foreach_submodules(module, module_prefs_clean_stash, NULL);
+
+ return 0; /* Keep cleaning modules */
+}
+
} // extern "C"
+// Preference tree items
const int appearance_item_ = 0;
const int protocols_item_ = 4;
const int statistics_item_ = 5;
const int advanced_item_ = 6;
+// We store the saved and current preference values in the "Advanced" tree columns
+const int pref_ptr_col_ = 0;
+
PreferencesDialog::PreferencesDialog(QWidget *parent) :
QDialog(parent),
pd_ui_(new Ui::PreferencesDialog),
@@ -115,11 +169,11 @@ PreferencesDialog::PreferencesDialog(QWidget *parent) :
pd_ui_->advancedTree->invisibleRootItem()->addChildren(tmp_item.takeChildren());
QTreeWidgetItemIterator pref_it(pd_ui_->advancedTree, QTreeWidgetItemIterator::NoChildren);
while (*pref_it) {
-// pref_t *pref = (*pref_it)->data(0, Qt::UserRole).value<pref_t *>();
updateItem(*(*pref_it));
-// if (pref) pref_item_hash_[pref] = (*pref_it);
++pref_it;
}
+ qDebug() << "FIX: Open UAT dialogs from prefs dialog.";
+ qDebug() << "FIX: Auto-size each preference pane.";
pd_ui_->splitter->setStretchFactor(0, 1);
pd_ui_->splitter->setStretchFactor(1, 5);
@@ -131,6 +185,7 @@ PreferencesDialog::PreferencesDialog(QWidget *parent) :
PreferencesDialog::~PreferencesDialog()
{
delete pd_ui_;
+ prefs_modules_foreach_submodules(NULL, module_prefs_clean_stash, NULL);
}
void PreferencesDialog::showEvent(QShowEvent *evt)
@@ -200,18 +255,74 @@ void PreferencesDialog::keyPressEvent(QKeyEvent *evt)
QDialog::keyPressEvent(evt);
}
+// Copied from prefs.c:prefs_pref_is_default. We may want to move this to
+// prefs.c as well.
+bool PreferencesDialog::stashedPrefIsDefault(pref_t *pref)
+{
+ if (!pref) return false;
+
+ switch (pref->type) {
+
+ case PREF_UINT:
+ if (pref->default_val.uint == pref->stashed_val.uint)
+ return true;
+ break;
+
+ case PREF_BOOL:
+ if (pref->default_val.boolval == pref->stashed_val.boolval)
+ return true;
+ break;
+
+ case PREF_ENUM:
+ if (pref->default_val.enumval == pref->stashed_val.enumval)
+ return true;
+ break;
+
+ case PREF_STRING:
+ case PREF_FILENAME:
+ if (!(g_strcmp0(pref->default_val.string, pref->stashed_val.string)))
+ return true;
+ break;
+
+ case PREF_RANGE:
+ {
+ if ((ranges_are_equal(pref->default_val.range, pref->stashed_val.range)))
+ return true;
+ break;
+ }
+
+ case PREF_COLOR:
+ {
+ if ((pref->default_val.color.red == pref->stashed_val.color.red) &&
+ (pref->default_val.color.green == pref->stashed_val.color.green) &&
+ (pref->default_val.color.blue == pref->stashed_val.color.blue))
+ return true;
+ break;
+ }
+
+ case PREF_CUSTOM:
+ case PREF_OBSOLETE:
+ case PREF_STATIC_TEXT:
+ case PREF_UAT:
+ return false;
+ break;
+ }
+ return false;
+}
+
+
void PreferencesDialog::updateItem(QTreeWidgetItem &item)
{
- pref_t *pref = item.data(0, Qt::UserRole).value<pref_t *>();
+ pref_t *pref = item.data(pref_ptr_col_, Qt::UserRole).value<pref_t *>();
if (!pref) return;
- QString cur_value = gchar_free_to_qstring(prefs_pref_to_str(pref, false)).remove(QRegExp("\n\t"));
+ QString cur_value = gchar_free_to_qstring(prefs_pref_to_str(pref, pref_stashed)).remove(QRegExp("\n\t"));
bool is_changed = false;
QFont font = item.font(0);
- if (pref->type == PREF_UAT) {
+ if (pref->type == PREF_UAT || pref->type == PREF_CUSTOM) {
item.setText(1, "Unknown");
- } else if (prefs_pref_is_default(pref)) {
+ } else if (stashedPrefIsDefault(pref)) {
item.setText(1, "Default");
} else {
item.setText(1, "Changed");
@@ -224,7 +335,6 @@ void PreferencesDialog::updateItem(QTreeWidgetItem &item)
item.setFont(2, font);
item.setFont(3, font);
- item.setToolTip(1, "Has this value been changed?");
item.setText(3, cur_value);
}
@@ -243,7 +353,7 @@ void PreferencesDialog::on_advancedSearchLineEdit_textEdited(const QString &sear
// Hide or show each branch
QTreeWidgetItemIterator branch_it(pd_ui_->advancedTree);
while (*branch_it) {
- if ((*branch_it)->data(0, Qt::UserRole).value<pref_t *>() == NULL) {
+ if ((*branch_it)->data(pref_ptr_col_, Qt::UserRole).value<pref_t *>() == NULL) {
(*branch_it)->setHidden(!search_str.isEmpty());
}
++branch_it;
@@ -254,7 +364,7 @@ void PreferencesDialog::on_advancedSearchLineEdit_textEdited(const QString &sear
while (*pref_it) {
bool hidden = true;
- if ((*pref_it)->data(0, Qt::UserRole).value<pref_t *>()) {
+ if ((*pref_it)->data(pref_ptr_col_, Qt::UserRole).value<pref_t *>()) {
QTreeWidgetItem *parent = (*pref_it)->parent();
if (search_str.isEmpty() ||
@@ -286,11 +396,11 @@ void PreferencesDialog::on_advancedTree_currentItemChanged(QTreeWidgetItem *curr
void PreferencesDialog::on_advancedTree_itemActivated(QTreeWidgetItem *item, int column)
{
- pref_t *pref = item->data(0, Qt::UserRole).value<pref_t *>();
+ pref_t *pref = item->data(pref_ptr_col_, Qt::UserRole).value<pref_t *>();
if (!pref || cur_line_edit_ || cur_combo_box_) return;
- if (column < 3) {
- reset_pref(pref);
+ if (column < 3) { // Reset to default
+ reset_stashed_pref(pref);
updateItem(*item);
} else {
QWidget *editor = NULL;
@@ -300,13 +410,13 @@ void PreferencesDialog::on_advancedTree_itemActivated(QTreeWidgetItem *item, int
{
cur_line_edit_ = new QLineEdit();
// cur_line_edit_->setInputMask("0000000009;");
- saved_string_pref_ = QString::number(*pref->varp.uint, pref->info.base);
+ saved_string_pref_ = QString::number(pref->stashed_val.uint, pref->info.base);
connect(cur_line_edit_, SIGNAL(editingFinished()), this, SLOT(uintPrefEditingFinished()));
editor = cur_line_edit_;
break;
}
case PREF_BOOL:
- *pref->varp.boolp = !*pref->varp.boolp;
+ pref->stashed_val.boolval = !pref->stashed_val.boolval;
updateItem(*item);
break;
case PREF_ENUM:
@@ -315,7 +425,7 @@ void PreferencesDialog::on_advancedTree_itemActivated(QTreeWidgetItem *item, int
const enum_val_t *ev;
for (ev = pref->info.enum_info.enumvals; ev && ev->description; ev++) {
cur_combo_box_->addItem(ev->description, QVariant(ev->value));
- if (*pref->varp.enump == ev->value)
+ if (pref->stashed_val.enumval == ev->value)
cur_combo_box_->setCurrentIndex(cur_combo_box_->count() - 1);
}
saved_combo_idx_ = cur_combo_box_->currentIndex();
@@ -326,7 +436,7 @@ void PreferencesDialog::on_advancedTree_itemActivated(QTreeWidgetItem *item, int
case PREF_STRING:
{
cur_line_edit_ = new QLineEdit();
- saved_string_pref_ = *pref->varp.string;
+ saved_string_pref_ = pref->stashed_val.string;
connect(cur_line_edit_, SIGNAL(editingFinished()), this, SLOT(stringPrefEditingFinished()));
editor = cur_line_edit_;
break;
@@ -335,10 +445,10 @@ void PreferencesDialog::on_advancedTree_itemActivated(QTreeWidgetItem *item, int
{
QString filename = QFileDialog::getSaveFileName(this,
QString("Wireshark: ") + pref->description,
- *pref->varp.string);
+ pref->stashed_val.string);
if (!filename.isEmpty()) {
- g_free((void *)*pref->varp.string);
- *pref->varp.string = g_strdup(filename.toUtf8().constData());
+ g_free((void *)pref->stashed_val.string);
+ pref->stashed_val.string = g_strdup(filename.toUtf8().constData());
updateItem(*item);
}
break;
@@ -346,7 +456,7 @@ void PreferencesDialog::on_advancedTree_itemActivated(QTreeWidgetItem *item, int
case PREF_RANGE:
{
SyntaxLineEdit *syntax_edit = new SyntaxLineEdit();
- char *cur_val = prefs_pref_to_str(pref, FALSE);
+ char *cur_val = prefs_pref_to_str(pref, pref_stashed);
saved_string_pref_ = gchar_free_to_qstring(cur_val);
connect(syntax_edit, SIGNAL(textChanged(QString)),
this, SLOT(rangePrefTextChanged(QString)));
@@ -359,15 +469,15 @@ void PreferencesDialog::on_advancedTree_itemActivated(QTreeWidgetItem *item, int
QColorDialog color_dlg;
color_dlg.setCurrentColor(QColor(
- pref->varp.color->red >> 8,
- pref->varp.color->green >> 8,
- pref->varp.color->blue >> 8
+ pref->stashed_val.color.red >> 8,
+ pref->stashed_val.color.green >> 8,
+ pref->stashed_val.color.blue >> 8
));
if (color_dlg.exec() == QDialog::Accepted) {
QColor cc = color_dlg.currentColor();
- pref->varp.color->red = cc.red() << 8 | cc.red();
- pref->varp.color->green = cc.green() << 8 | cc.green();
- pref->varp.color->blue = cc.blue() << 8 | cc.blue();
+ pref->stashed_val.color.red = cc.red() << 8 | cc.red();
+ pref->stashed_val.color.green = cc.green() << 8 | cc.green();
+ pref->stashed_val.color.blue = cc.blue() << 8 | cc.blue();
updateItem(*item);
}
break;
@@ -423,10 +533,13 @@ void PreferencesDialog::uintPrefEditingFinished()
QTreeWidgetItem *item = pd_ui_->advancedTree->currentItem();
if (!cur_line_edit_ || !item) return;
- pref_t *pref = item->data(0, Qt::UserRole).value<pref_t *>();
+ pref_t *pref = item->data(pref_ptr_col_, Qt::UserRole).value<pref_t *>();
if (!pref) return;
- *pref->varp.uint = cur_line_edit_->text().toUInt(NULL, pref->info.base);
+ bool ok;
+ guint new_val = cur_line_edit_->text().toUInt(&ok, pref->info.base);
+
+ if (ok) pref->stashed_val.uint = new_val;
pd_ui_->advancedTree->removeItemWidget(item, 3);
updateItem(*item);
}
@@ -436,11 +549,10 @@ void PreferencesDialog::enumPrefCurrentIndexChanged(int index)
QTreeWidgetItem *item = pd_ui_->advancedTree->currentItem();
if (!cur_combo_box_ || !item || index < 0) return;
- pref_t *pref = item->data(0, Qt::UserRole).value<pref_t *>();
+ pref_t *pref = item->data(pref_ptr_col_, Qt::UserRole).value<pref_t *>();
if (!pref) return;
- *pref->varp.enump = cur_combo_box_->itemData(index, Qt::UserRole).toInt();
-// pd_ui_->advancedTree->removeItemWidget(item, 3);
+ pref->stashed_val.enumval = cur_combo_box_->itemData(index, Qt::UserRole).toInt();
updateItem(*item);
}
@@ -449,11 +561,11 @@ void PreferencesDialog::stringPrefEditingFinished()
QTreeWidgetItem *item = pd_ui_->advancedTree->currentItem();
if (!cur_line_edit_ || !item) return;
- pref_t *pref = item->data(0, Qt::UserRole).value<pref_t *>();
+ pref_t *pref = item->data(pref_ptr_col_, Qt::UserRole).value<pref_t *>();
if (!pref) return;
- g_free((void *)*pref->varp.string);
- *pref->varp.string = g_strdup(cur_line_edit_->text().toUtf8().constData());
+ g_free((void *)pref->stashed_val.string);
+ pref->stashed_val.string = g_strdup(cur_line_edit_->text().toUtf8().constData());
pd_ui_->advancedTree->removeItemWidget(item, 3);
updateItem(*item);
}
@@ -464,7 +576,7 @@ void PreferencesDialog::rangePrefTextChanged(const QString &text)
QTreeWidgetItem *item = pd_ui_->advancedTree->currentItem();
if (!syntax_edit || !item) return;
- pref_t *pref = item->data(0, Qt::UserRole).value<pref_t *>();
+ pref_t *pref = item->data(pref_ptr_col_, Qt::UserRole).value<pref_t *>();
if (!pref) return;
if (text.isEmpty()) {
@@ -488,20 +600,49 @@ void PreferencesDialog::rangePrefEditingFinished()
QTreeWidgetItem *item = pd_ui_->advancedTree->currentItem();
if (!syntax_edit || !item) return;
- pref_t *pref = item->data(0, Qt::UserRole).value<pref_t *>();
+ pref_t *pref = item->data(pref_ptr_col_, Qt::UserRole).value<pref_t *>();
if (!pref) return;
range_t *newrange;
convert_ret_t ret = range_convert_str(&newrange, syntax_edit->text().toUtf8().constData(), pref->info.max_value);
if (ret == CVT_NO_ERROR) {
- g_free(*pref->varp.range);
- *pref->varp.range = newrange;
+ g_free(pref->stashed_val.range);
+ pref->stashed_val.range = newrange;
}
pd_ui_->advancedTree->removeItemWidget(item, 3);
updateItem(*item);
}
+void PreferencesDialog::on_buttonBox_accepted()
+{
+ gboolean must_redissect = FALSE;
+
+ // XXX - We should validate preferences as the user changes them, not here.
+// if (!prefs_main_fetch_all(parent_w, &must_redissect))
+// return; /* Errors in some preference setting - already reported */
+ prefs_modules_foreach_submodules(NULL, module_prefs_unstash, (gpointer) &must_redissect);
+
+ prefs_main_write();
+
+ /* Fill in capture options with values from the preferences */
+ prefs_to_capture_opts();
+
+#ifdef HAVE_AIRPCAP
+ prefs_airpcap_update();
+#endif
+
+ wsApp->emitAppSignal(WiresharkApplication::PreferencesChanged);
+
+ /* Now destroy the "Preferences" dialog. */
+// window_destroy(GTK_WIDGET(parent_w));
+
+ if (must_redissect) {
+ /* Redissect all the packets, and re-evaluate the display filter. */
+ wsApp->emitAppSignal(WiresharkApplication::PacketDissectionChanged);
+ }
+}
+
void PreferencesDialog::on_buttonBox_helpRequested()
{
wsApp->helpTopicAction(HELP_PREFERENCES_DIALOG);
diff --git a/ui/qt/preferences_dialog.h b/ui/qt/preferences_dialog.h
index b00b60d4a1..4654146db0 100644
--- a/ui/qt/preferences_dialog.h
+++ b/ui/qt/preferences_dialog.h
@@ -54,6 +54,7 @@ protected:
void keyPressEvent(QKeyEvent *evt);
private:
+ bool stashedPrefIsDefault(pref_t *pref);
void updateItem(QTreeWidgetItem &item);
Ui::PreferencesDialog *pd_ui_;
@@ -62,7 +63,6 @@ private:
QString saved_string_pref_;
QComboBox *cur_combo_box_;
int saved_combo_idx_;
-// QHash<pref_t *, QTreeWidgetItem *> pref_item_hash_;
private slots:
void on_prefsTree_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous);
@@ -75,8 +75,11 @@ private slots:
void stringPrefEditingFinished();
void rangePrefTextChanged(const QString & text);
void rangePrefEditingFinished();
- void on_buttonBox_helpRequested();
+
void on_advancedTree_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous);
+
+ void on_buttonBox_accepted();
+ void on_buttonBox_helpRequested();
};
#endif // PREFERENCES_DIALOG_H
diff --git a/ui/qt/qt_ui_utils.cpp b/ui/qt/qt_ui_utils.cpp
index d2c27e8728..5a5677cb1a 100644
--- a/ui/qt/qt_ui_utils.cpp
+++ b/ui/qt/qt_ui_utils.cpp
@@ -164,6 +164,11 @@ format_size_flags_e operator|(format_size_flags_e lhs, format_size_flags_e rhs)
return (format_size_flags_e) ((int)lhs| (int)rhs);
}
+/*
+ * We might want to create our own "wsstring" class with convenience
+ * methods for handling g_malloc()ed strings, GStrings, and a shortcut
+ * to .toUtf8().constData().
+ */
QString gchar_free_to_qstring(gchar *glib_string) {
QString *qt_string = new QString(glib_string);
g_free(glib_string);
diff --git a/ui/qt/wireshark_application.cpp b/ui/qt/wireshark_application.cpp
index 6dd3e93f11..9f00ff9b02 100644
--- a/ui/qt/wireshark_application.cpp
+++ b/ui/qt/wireshark_application.cpp
@@ -523,6 +523,20 @@ void WiresharkApplication::registerUpdate(register_action_e action, const char *
emit splashUpdate(action, message);
}
+void WiresharkApplication::emitAppSignal(AppSignal signal)
+{
+ switch (signal) {
+ case PreferencesChanged:
+ emit preferencesChanged();
+ break;
+ case PacketDissectionChanged:
+ emit packetDissectionChanged();
+ break;
+ default:
+ break;
+ }
+}
+
void WiresharkApplication::allSystemsGo()
{
initialized_ = true;
@@ -533,12 +547,6 @@ void WiresharkApplication::allSystemsGo()
}
}
-void WiresharkApplication::applyAllPreferences()
-{
- prefs_apply_all();
- emit updatePreferences();
-}
-
e_prefs * WiresharkApplication::readConfigurationFiles(char **gdp_path, char **dp_path)
{
int gpf_open_errno, gpf_read_errno;
diff --git a/ui/qt/wireshark_application.h b/ui/qt/wireshark_application.h
index 219c33d171..326d7cd248 100644
--- a/ui/qt/wireshark_application.h
+++ b/ui/qt/wireshark_application.h
@@ -60,9 +60,14 @@ class WiresharkApplication : public QApplication
public:
explicit WiresharkApplication(int &argc, char **argv);
+ enum AppSignal {
+ PacketDissectionChanged,
+ PreferencesChanged
+ };
+
void registerUpdate(register_action_e action, const char *message);
+ void emitAppSignal(AppSignal signal);
void allSystemsGo();
- void applyAllPreferences();
e_prefs * readConfigurationFiles(char **gdp_path, char **dp_path);
QList<recent_item_status *> recentItems() const;
void addRecentItem(const QString &filename, qint64 size, bool accessible);
@@ -93,9 +98,11 @@ signals:
void openCaptureFile(QString &cf_path);
void updateRecentItemStatus(const QString &filename, qint64 size, bool accessible);
void splashUpdate(register_action_e action, const char *message);
- void updatePreferences();
void configurationProfileChanged(const gchar *profile_name);
+ void packetDissectionChanged();
+ void preferencesChanged();
+
#ifdef HAVE_LIBPCAP
// XXX It might make more sense to move these to main.cpp or main_window.cpp or their own class.
void captureCapturePrepared(capture_options *capture_opts);