aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGerald Combs <gerald@wireshark.org>2013-01-18 00:50:14 +0000
committerGerald Combs <gerald@wireshark.org>2013-01-18 00:50:14 +0000
commitae7ee61e842f46d0e7a7a4dc64c848866a6d7afb (patch)
tree6e483f057cb06bc3c9a8ee68a6211bd4be557f6a
parent7a9095ee15c9ef012f3c8fd77c8f8cd06bdaa37b (diff)
Rename the "saved_val" preference element to "stashed_val" in order to
more clearly indicate that it's a copy of a preference value rather than something we've saved in the preferences file. Update prefs_pref_to_str() to handle default, stashed, and current prefs. Create ui/preference_utils.[ch] and move some common routines there. Use prefs_pref_type_name() in the GTK+ preferences dialog. Make the "OK" button in the Qt preferences dialog work. We simply write the prefs and redissect on "OK" and do nothing on "Cancel". This is intentionally different from the Apply/OK/Cancel behavior in the GTK+ version. Add a general "emitAppSignal" method to wsApp and use it for packet dissection and preference changes. Suggest that we might want to create a WsString class to make conversion between QStrings, gchar *s, and GStrings easier. svn path=/trunk/; revision=47139
-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);