diff options
-rw-r--r-- | epan/funnel.h | 2 | ||||
-rw-r--r-- | epan/wslua/wslua_gui.c | 2 | ||||
-rw-r--r-- | gtk/funnel_stat.c | 12 |
3 files changed, 10 insertions, 6 deletions
diff --git a/epan/funnel.h b/epan/funnel.h index 2c1bf7afe9..09be5448eb 100644 --- a/epan/funnel.h +++ b/epan/funnel.h @@ -49,6 +49,8 @@ typedef struct _funnel_bt_t { funnel_text_window_t* tw; funnel_bt_cb_t func; void* data; + void (*free)(void*); + void (*free_data)(void*); } funnel_bt_t; typedef struct _funnel_ops_t { diff --git a/epan/wslua/wslua_gui.c b/epan/wslua/wslua_gui.c index c680f149fa..53b2fc0163 100644 --- a/epan/wslua/wslua_gui.c +++ b/epan/wslua/wslua_gui.c @@ -447,6 +447,8 @@ WSLUA_METHOD TextWindow_add_button(lua_State* L) { fbt->tw = tw; fbt->func = wslua_button_callback; fbt->data = cbd; + fbt->free = g_free; + fbt->free_data = g_free; cbd->L = L; cbd->data_ref = luaL_ref(L, LUA_REGISTRYINDEX); diff --git a/gtk/funnel_stat.c b/gtk/funnel_stat.c index 43f10ef73f..aa569dbba8 100644 --- a/gtk/funnel_stat.c +++ b/gtk/funnel_stat.c @@ -107,8 +107,8 @@ static void unref_text_win_cancel_bt_cb(GtkWidget *bt _U_, gpointer data) { for (i = 0; i < tw->buttons->len; i++) { funnel_bt_t* cbd = g_ptr_array_index(tw->buttons,i); /* XXX a free cb should be passed somehow */ - if (cbd->data) g_free(cbd->data); - g_free(cbd); + if (cbd->data && cbd->free_data) cbd->free_data(cbd->data); + if (cbd->free) cbd->free(cbd); } g_ptr_array_free(tw->buttons,TRUE); g_free(tw); @@ -128,8 +128,8 @@ static gboolean text_window_unref_del_event_cb(GtkWidget *win _U_, GdkEvent *eve for (i = 0; i < tw->buttons->len; i++) { funnel_bt_t* cbd = g_ptr_array_index(tw->buttons,i); /* XXX a free cb should be passed somehow */ - if (cbd->data) g_free(cbd->data); - g_free(cbd); + if (cbd->data && cbd->free_data) cbd->free_data(cbd->data); + if (cbd->free) cbd->free(cbd); } g_ptr_array_free(tw->buttons,TRUE); g_free(tw); @@ -380,8 +380,8 @@ static void text_window_destroy(funnel_text_window_t* tw) { for (i = 0; i < tw->buttons->len; i++) { funnel_bt_t* cbd = g_ptr_array_index(tw->buttons,i); /* XXX a free cb should be passed somehow */ - if (cbd->data) g_free(cbd->data); - g_free(cbd); + if (cbd->data && cbd->free_data) cbd->free_data(cbd->data); + if (cbd->free) cbd->free(cbd); } g_ptr_array_free(tw->buttons,TRUE); g_free(tw); |