const char *description; /**< human-readable description of preference */
int ordinal; /**< ordinal number of this preference */
int type; /**< type of that preference */
+ unsigned int effect_flags; /**< Flags of types effected by preference (PREF_TYPE_DISSECTION, PREF_EFFECT_CAPTURE, etc).
+ Flags must be non-zero to ensure saving to disk */
gui_type_t gui; /**< type of the GUI (QT, GTK or both) the preference is registered for */
union { /* The Qt preference code assumes that these will all be pointers (and unique) */
guint *uint;
module->parent = parent;
module->submodules = NULL; /* no submodules, to start */
module->numprefs = 0;
- module->prefs_changed = FALSE;
+ module->prefs_changed_flags = 0;
module->obsolete = FALSE;
module->use_gui = use_gui;
+ /* A module's preferences affects dissection unless otherwise told */
+ module->effect_flags = PREF_EFFECT_DISSECTION;
/*
* Do we have a module name?
if (module->obsolete)
return FALSE;
- if (module->prefs_changed) {
+ if (module->prefs_changed_flags) {
if (module->apply_cb != NULL)
(*module->apply_cb)();
- module->prefs_changed = FALSE;
+ module->prefs_changed_flags = 0;
}
if (module->submodules)
wmem_tree_foreach(module->submodules, call_apply_cb, NULL);
void
prefs_apply(module_t *module)
{
- if (module && module->prefs_changed)
+ if (module && module->prefs_changed_flags)
call_apply_cb(NULL, module, NULL);
}
preference->title = title;
preference->description = description;
preference->type = type;
+ /* Default to module's preference effects */
+ preference->effect_flags = module->effect_flags;
+
preference->gui = GUI_ALL; /* default */
if (title != NULL)
preference->ordinal = module->numprefs;
preference->default_val.boolval = *var;
}
-gboolean prefs_set_bool_value(pref_t *pref, gboolean value, pref_source_t source)
+unsigned int prefs_set_bool_value(pref_t *pref, gboolean value, pref_source_t source)
{
- gboolean changed = FALSE;
+ unsigned int changed = 0;
switch (source)
{
case pref_default:
if (pref->default_val.boolval != value) {
pref->default_val.boolval = value;
- changed = TRUE;
+ changed = prefs_get_effect_flags(pref);
}
break;
case pref_stashed:
if (pref->stashed_val.boolval != value) {
pref->stashed_val.boolval = value;
- changed = TRUE;
+ changed = prefs_get_effect_flags(pref);
}
break;
case pref_current:
if (*pref->varp.boolp != value) {
*pref->varp.boolp = value;
- changed = TRUE;
+ changed = prefs_get_effect_flags(pref);
}
break;
default:
preference->info.enum_info.radio_buttons = radio_buttons;
}
-gboolean prefs_set_enum_value(pref_t *pref, gint value, pref_source_t source)
+unsigned int prefs_set_enum_value(pref_t *pref, gint value, pref_source_t source)
{
- gboolean changed = FALSE;
+ unsigned int changed = 0;
switch (source)
{
case pref_default:
if (pref->default_val.enumval != value) {
pref->default_val.enumval = value;
- changed = TRUE;
+ changed = prefs_get_effect_flags(pref);
}
break;
case pref_stashed:
if (pref->stashed_val.enumval != value) {
pref->stashed_val.enumval = value;
- changed = TRUE;
+ changed = prefs_get_effect_flags(pref);
}
break;
case pref_current:
if (*pref->varp.enump != value) {
*pref->varp.enump = value;
- changed = TRUE;
+ changed = prefs_get_effect_flags(pref);
}
break;
default:
/*
* For use by UI code that sets preferences.
*/
-gboolean
+unsigned int
prefs_set_string_value(pref_t *pref, const char* value, pref_source_t source)
{
- gboolean changed = FALSE;
+ unsigned int changed = 0;
switch (source)
{
case pref_default:
if (*pref->default_val.string) {
if (strcmp(pref->default_val.string, value) != 0) {
- changed = TRUE;
+ changed = prefs_get_effect_flags(pref);
g_free(pref->default_val.string);
pref->default_val.string = g_strdup(value);
}
case pref_stashed:
if (pref->stashed_val.string) {
if (strcmp(pref->stashed_val.string, value) != 0) {
- changed = TRUE;
+ changed = prefs_get_effect_flags(pref);
g_free(pref->stashed_val.string);
pref->stashed_val.string = g_strdup(value);
}
case pref_current:
if (*pref->varp.string) {
if (strcmp(*pref->varp.string, value) != 0) {
- changed = TRUE;
+ changed = prefs_get_effect_flags(pref);
g_free(*pref->varp.string);
*pref->varp.string = g_strdup(value);
}
gboolean
prefs_set_range_value_work(pref_t *pref, const gchar *value,
- gboolean return_range_errors, gboolean *changed)
+ gboolean return_range_errors, unsigned int *changed_flags)
{
range_t *newrange;
}
if (!ranges_are_equal(*pref->varp.range, newrange)) {
- *changed = TRUE;
+ *changed_flags |= prefs_get_effect_flags(pref);
wmem_free(wmem_epan_scope(), *pref->varp.range);
*pref->varp.range = newrange;
} else {
/*
* For use by UI code that sets preferences.
*/
-gboolean
+unsigned int
prefs_set_stashed_range_value(pref_t *pref, const gchar *value)
{
range_t *newrange;
if (range_convert_str_work(wmem_epan_scope(), &newrange, value, pref->info.max_value,
TRUE) != CVT_NO_ERROR) {
- return FALSE; /* number was bad */
+ return 0; /* number was bad */
}
if (!ranges_are_equal(pref->stashed_val.range, newrange)) {
} else {
wmem_free(wmem_epan_scope(), newrange);
}
- return TRUE;
+ return prefs_get_effect_flags(pref);
}
case PREF_DECODE_AS_UINT:
if (*pref->varp.uint != pref->stashed_val.uint) {
- unstash_data->module->prefs_changed = TRUE;
+ unstash_data->module->prefs_changed_flags |= prefs_get_effect_flags(pref);
if (unstash_data->handle_decode_as) {
if (*pref->varp.uint != pref->default_val.uint) {
case PREF_UINT:
if (*pref->varp.uint != pref->stashed_val.uint) {
- unstash_data->module->prefs_changed = TRUE;
+ unstash_data->module->prefs_changed_flags |= prefs_get_effect_flags(pref);
*pref->varp.uint = pref->stashed_val.uint;
}
break;
case PREF_BOOL:
if (*pref->varp.boolp != pref->stashed_val.boolval) {
- unstash_data->module->prefs_changed = TRUE;
+ unstash_data->module->prefs_changed_flags |= prefs_get_effect_flags(pref);
*pref->varp.boolp = pref->stashed_val.boolval;
}
break;
case PREF_ENUM:
if (*pref->varp.enump != pref->stashed_val.enumval) {
- unstash_data->module->prefs_changed = TRUE;
+ unstash_data->module->prefs_changed_flags |= prefs_get_effect_flags(pref);
*pref->varp.enump = pref->stashed_val.enumval;
}
break;
case PREF_OPEN_FILENAME:
case PREF_DIRNAME:
if (strcmp(*pref->varp.string, pref->stashed_val.string) != 0) {
- unstash_data->module->prefs_changed = TRUE;
+ unstash_data->module->prefs_changed_flags |= prefs_get_effect_flags(pref);
g_free(*pref->varp.string);
*pref->varp.string = g_strdup(pref->stashed_val.string);
}
case PREF_DECODE_AS_RANGE:
if (!ranges_are_equal(*pref->varp.range, pref->stashed_val.range)) {
guint32 i, j;
- unstash_data->module->prefs_changed = TRUE;
+ unstash_data->module->prefs_changed_flags |= prefs_get_effect_flags(pref);
if (unstash_data->handle_decode_as) {
sub_dissectors = find_dissector_table(pref->name);
case PREF_RANGE:
if (!ranges_are_equal(*pref->varp.range, pref->stashed_val.range)) {
- unstash_data->module->prefs_changed = TRUE;
+ unstash_data->module->prefs_changed_flags |= prefs_get_effect_flags(pref);
wmem_free(wmem_epan_scope(), *pref->varp.range);
*pref->varp.range = range_copy(wmem_epan_scope(), pref->stashed_val.range);
}
break;
case PREF_COLOR:
- *pref->varp.colorp = pref->stashed_val.color;
+ if ((pref->varp.colorp->blue != pref->stashed_val.color.blue) ||
+ (pref->varp.colorp->red != pref->stashed_val.color.red) ||
+ (pref->varp.colorp->green != pref->stashed_val.color.green)) {
+ unstash_data->module->prefs_changed_flags |= prefs_get_effect_flags(pref);
+ *pref->varp.colorp = pref->stashed_val.color;
+ }
break;
case PREF_STATIC_TEXT:
}
static prefs_set_pref_e
-console_log_level_set_cb(pref_t* pref, const gchar* value, gboolean* changed)
+console_log_level_set_cb(pref_t* pref, const gchar* value, unsigned int* changed_flags)
{
guint uval;
uval = (guint)strtoul(value, NULL, 10);
if (*pref->varp.uint != uval) {
- *changed = TRUE;
+ *changed_flags = prefs_get_effect_flags(pref);
*pref->varp.uint = uval;
}
static module_t *gui_column_module = NULL;
static prefs_set_pref_e
-column_hidden_set_cb(pref_t* pref, const gchar* value, gboolean* changed)
+column_hidden_set_cb(pref_t* pref, const gchar* value, unsigned int* changed_flags)
{
GList *clp;
fmt_data *cfmt;
pref_t *format_pref;
- (*changed) |= prefs_set_string_value(pref, value, pref_current);
+ (*changed_flags) |= prefs_set_string_value(pref, value, pref_current);
/*
* Set the "visible" flag for the existing columns; we need to
}
static prefs_set_pref_e
-column_num_set_cb(pref_t* pref _U_, const gchar* value _U_, gboolean* changed _U_)
+column_num_set_cb(pref_t* pref _U_, const gchar* value _U_, unsigned int* changed_flags _U_)
{
/* Don't write this to the preferences file */
return PREFS_SET_OK;
}
static prefs_set_pref_e
-column_format_set_cb(pref_t* pref, const gchar* value, gboolean* changed _U_)
+column_format_set_cb(pref_t* pref, const gchar* value, unsigned int* changed_flags _U_)
{
GList *col_l, *col_l_elt;
fmt_data *cfmt;
}
static prefs_set_pref_e
-capture_column_set_cb(pref_t* pref, const gchar* value, gboolean* changed _U_)
+capture_column_set_cb(pref_t* pref, const gchar* value, unsigned int* changed_flags _U_)
{
GList *col_l = prefs_get_string_list(value);
GList *col_l_elt;
}
static prefs_set_pref_e
-colorized_frame_set_cb(pref_t* pref, const gchar* value, gboolean* changed)
+colorized_frame_set_cb(pref_t* pref, const gchar* value, unsigned int* changed_flags)
{
- (*changed) |= prefs_set_string_value(pref, value, pref_current);
+ (*changed_flags) |= prefs_set_string_value(pref, value, pref_current);
return PREFS_SET_OK;
}
return prefs_get_uint_value_real(prefs_find_preference(prefs_find_module(module_name), pref_name), pref_current);
}
-gboolean prefs_set_uint_value(pref_t *pref, guint value, pref_source_t source)
+unsigned int prefs_set_uint_value(pref_t *pref, guint value, pref_source_t source)
{
- gboolean changed = FALSE;
+ unsigned int changed = 0;
switch (source)
{
case pref_default:
if (pref->default_val.uint != value) {
pref->default_val.uint = value;
- changed = TRUE;
+ changed = prefs_get_effect_flags(pref);
}
break;
case pref_stashed:
if (pref->stashed_val.uint != value) {
pref->stashed_val.uint = value;
- changed = TRUE;
+ changed = prefs_get_effect_flags(pref);
}
break;
case pref_current:
if (*pref->varp.uint != value) {
*pref->varp.uint = value;
- changed = TRUE;
+ changed = prefs_get_effect_flags(pref);
}
break;
default:
pref = prefs_find_preference(module, port_prefs[i].table_name);
if (pref != NULL)
{
- module->prefs_changed = TRUE;
+ module->prefs_changed_flags |= prefs_get_effect_flags(pref);
*pref->varp.uint = uval;
}
pref = prefs_find_preference(module, port_range_prefs[i].table_name);
if (pref != NULL)
{
- if (!prefs_set_range_value_work(pref, value, TRUE, &module->prefs_changed))
+ if (!prefs_set_range_value_work(pref, value, TRUE, &module->prefs_changed_flags))
{
return FALSE; /* number was bad */
}
if (p == value || *p != '\0')
return PREFS_SET_SYNTAX_ERR; /* number was bad */
if (*pref->varp.uint != uval) {
- containing_module->prefs_changed = TRUE;
+ containing_module->prefs_changed_flags |= prefs_get_effect_flags(pref);
*pref->varp.uint = uval;
}
break;
return PREFS_SET_SYNTAX_ERR; /* number was bad */
if (*pref->varp.uint != uval) {
- containing_module->prefs_changed = TRUE;
+ containing_module->prefs_changed_flags |= prefs_get_effect_flags(pref);
*pref->varp.uint = uval;
/* Name of preference is the dissector table */
else
bval = FALSE;
if (*pref->varp.boolp != bval) {
- containing_module->prefs_changed = TRUE;
+ containing_module->prefs_changed_flags |= prefs_get_effect_flags(pref);
*pref->varp.boolp = bval;
}
break;
enum_val = find_val_for_string(value, pref->info.enum_info.enumvals,
*pref->varp.enump);
if (*pref->varp.enump != enum_val) {
- containing_module->prefs_changed = TRUE;
+ containing_module->prefs_changed_flags |= prefs_get_effect_flags(pref);
*pref->varp.enump = enum_val;
}
break;
case PREF_SAVE_FILENAME:
case PREF_OPEN_FILENAME:
case PREF_DIRNAME:
- containing_module->prefs_changed |= prefs_set_string_value(pref, value, pref_current);
+ containing_module->prefs_changed_flags |= prefs_set_string_value(pref, value, pref_current);
break;
case PREF_RANGE:
{
if (!prefs_set_range_value_work(pref, value, return_range_errors,
- &containing_module->prefs_changed))
+ &containing_module->prefs_changed_flags))
return PREFS_SET_SYNTAX_ERR; /* number was bad */
break;
}
if (!ranges_are_equal(*pref->varp.range, newrange)) {
wmem_free(wmem_epan_scope(), *pref->varp.range);
*pref->varp.range = newrange;
- containing_module->prefs_changed = TRUE;
+ containing_module->prefs_changed_flags |= prefs_get_effect_flags(pref);
/* Name of preference is the dissector table */
sub_dissectors = find_dissector_table(pref->name);
if ((pref->varp.colorp->red != RED_COMPONENT(cval)) ||
(pref->varp.colorp->green != GREEN_COMPONENT(cval)) ||
(pref->varp.colorp->blue != BLUE_COMPONENT(cval))) {
- containing_module->prefs_changed = TRUE;
+ containing_module->prefs_changed_flags |= prefs_get_effect_flags(pref);
pref->varp.colorp->red = RED_COMPONENT(cval);
pref->varp.colorp->green = GREEN_COMPONENT(cval);
pref->varp.colorp->blue = BLUE_COMPONENT(cval);
}
case PREF_CUSTOM:
- return pref->custom_cbs.set_cb(pref, value, &containing_module->prefs_changed);
+ return pref->custom_cbs.set_cb(pref, value, &containing_module->prefs_changed_flags);
case PREF_STATIC_TEXT:
case PREF_UAT:
return type_name;
}
+unsigned int
+prefs_get_effect_flags(pref_t *pref)
+{
+ if (pref == NULL)
+ return 0;
+
+ return pref->effect_flags;
+}
+
+void
+prefs_set_effect_flags(pref_t *pref, unsigned int flags)
+{
+ if (pref != NULL) {
+ pref->effect_flags = flags;
+ }
+}
+
+void
+prefs_set_effect_flags_by_name(module_t * module, const char *pref, unsigned int flags)
+{
+ prefs_set_effect_flags(prefs_find_preference(module, pref), flags);
+}
+
+unsigned int
+prefs_get_module_effect_flags(module_t * module)
+{
+ if (module == NULL)
+ return 0;
+
+ return module->effect_flags;
+}
+
+void
+prefs_set_module_effect_flags(module_t * module, unsigned int flags)
+{
+ if (module != NULL) {
+ module->effect_flags = flags;
+ }
+}
+
char *
prefs_pref_type_description(pref_t *pref)
{