Index: trunk/src_plugins/dialogs/dlg_pref.c =================================================================== --- trunk/src_plugins/dialogs/dlg_pref.c (revision 35844) +++ trunk/src_plugins/dialogs/dlg_pref.c (revision 35845) @@ -505,8 +505,17 @@ void pcb_dlg_pref_uninit(void) { + int t; + rnd_event_unbind_allcookie(pref_cookie); rnd_conf_hid_unreg(pref_cookie); + + for(t = 0; t < pref_ctx.tabs; t++) { + if (pref_ctx.tab[t].hooks->flags & Rnd_PREFTAB_AUTO_FREE_DATA) { + free(pref_ctx.tab[t].tabdata); + pref_ctx.tab[t].tabdata = NULL; + } + } } const char pcb_acts_Preferences[] = "Preferences([tabname])\n"; Index: trunk/src_plugins/dialogs/dlg_pref.h =================================================================== --- trunk/src_plugins/dialogs/dlg_pref.h (revision 35844) +++ trunk/src_plugins/dialogs/dlg_pref.h (revision 35845) @@ -24,7 +24,8 @@ }; typedef enum Rnd_pref_tab_flag_e { /* bitfield */ - Rnd_PREFTAB_NEEDS_ROLE = 1 + Rnd_PREFTAB_NEEDS_ROLE = 1, + Rnd_PREFTAB_AUTO_FREE_DATA = 2 /* free tab data when plugin is unloaded */ } Rnd_pref_tab_flag_t; typedef struct Rnd_pref_tab_hook_s Rnd_pref_tab_hook_t; Index: trunk/src_plugins/dialogs/dlg_pref_board.c =================================================================== --- trunk/src_plugins/dialogs/dlg_pref_board.c (revision 35844) +++ trunk/src_plugins/dialogs/dlg_pref_board.c (revision 35845) @@ -100,7 +100,7 @@ } static const Rnd_pref_tab_hook_t pref_board = { - "Board meta", 0, + "Board meta", Rnd_PREFTAB_AUTO_FREE_DATA, NULL, NULL, pcb_dlg_pref_board_create, pref_board_brd2dlg, pref_board_brd2dlg /* board change, meta change */ Index: trunk/src_plugins/dialogs/dlg_pref_color.c =================================================================== --- trunk/src_plugins/dialogs/dlg_pref_color.c (revision 35844) +++ trunk/src_plugins/dialogs/dlg_pref_color.c (revision 35845) @@ -169,7 +169,7 @@ } static const Rnd_pref_tab_hook_t pref_color = { - "Colors", Rnd_PREFTAB_NEEDS_ROLE, + "Colors", Rnd_PREFTAB_AUTO_FREE_DATA | Rnd_PREFTAB_NEEDS_ROLE, pcb_dlg_pref_color_open, pcb_dlg_pref_color_close, pcb_dlg_pref_color_create, pref_color_brd2dlg, pref_color_brd2dlg /* board change, meta change */ Index: trunk/src_plugins/dialogs/dlg_pref_general.c =================================================================== --- trunk/src_plugins/dialogs/dlg_pref_general.c (revision 35844) +++ trunk/src_plugins/dialogs/dlg_pref_general.c (revision 35845) @@ -93,7 +93,7 @@ } static const Rnd_pref_tab_hook_t pref_general = { - "General", Rnd_PREFTAB_NEEDS_ROLE, + "General", Rnd_PREFTAB_AUTO_FREE_DATA | Rnd_PREFTAB_NEEDS_ROLE, NULL, pcb_dlg_pref_general_close, pcb_dlg_pref_general_create, NULL, NULL Index: trunk/src_plugins/dialogs/dlg_pref_layer.c =================================================================== --- trunk/src_plugins/dialogs/dlg_pref_layer.c (revision 35844) +++ trunk/src_plugins/dialogs/dlg_pref_layer.c (revision 35845) @@ -61,7 +61,7 @@ } static const Rnd_pref_tab_hook_t pref_layer = { - "Layers", 0, + "Layers", Rnd_PREFTAB_AUTO_FREE_DATA, NULL, NULL, pcb_dlg_pref_layer_create, NULL, NULL Index: trunk/src_plugins/dialogs/dlg_pref_lib.c =================================================================== --- trunk/src_plugins/dialogs/dlg_pref_lib.c (revision 35844) +++ trunk/src_plugins/dialogs/dlg_pref_lib.c (revision 35845) @@ -468,7 +468,7 @@ } static const Rnd_pref_tab_hook_t pref_lib = { - "Library", Rnd_PREFTAB_NEEDS_ROLE, + "Library", Rnd_PREFTAB_AUTO_FREE_DATA | Rnd_PREFTAB_NEEDS_ROLE, pcb_dlg_pref_lib_open, pcb_dlg_pref_lib_close, pcb_dlg_pref_lib_create, NULL, NULL Index: trunk/src_plugins/dialogs/dlg_pref_sizes.c =================================================================== --- trunk/src_plugins/dialogs/dlg_pref_sizes.c (revision 35844) +++ trunk/src_plugins/dialogs/dlg_pref_sizes.c (revision 35845) @@ -158,7 +158,7 @@ } static const Rnd_pref_tab_hook_t pref_sizes = { - "Sizes & DRC", Rnd_PREFTAB_NEEDS_ROLE, + "Sizes & DRC", Rnd_PREFTAB_AUTO_FREE_DATA | Rnd_PREFTAB_NEEDS_ROLE, NULL, pcb_dlg_pref_sizes_close, pcb_dlg_pref_sizes_create, pref_sizes_brd2dlg, pref_sizes_brd2dlg /* board change, meta change */