diff --git a/legacy/ecore/src/lib/ecore_x/ecore_x.c b/legacy/ecore/src/lib/ecore_x/ecore_x.c index adc9f7fb78..b9e7784ada 100644 --- a/legacy/ecore/src/lib/ecore_x/ecore_x.c +++ b/legacy/ecore/src/lib/ecore_x/ecore_x.c @@ -422,6 +422,7 @@ ecore_x_shutdown(void) _ecore_x_filter_handler = NULL; _ecore_x_disp = NULL; _ecore_x_event_handlers = NULL; + _ecore_x_selection_shutdown(); if (_ecore_x_init_count < 0) _ecore_x_init_count = 0; return _ecore_x_init_count; } diff --git a/legacy/ecore/src/lib/ecore_x/ecore_x_private.h b/legacy/ecore/src/lib/ecore_x/ecore_x_private.h index 43d26a031c..a8a73c32bd 100644 --- a/legacy/ecore/src/lib/ecore_x/ecore_x_private.h +++ b/legacy/ecore/src/lib/ecore_x/ecore_x_private.h @@ -183,6 +183,7 @@ void _ecore_x_event_handle_mapping_notify(XEvent *xevent); void _ecore_x_event_handle_shape_change(XEvent *xevent); void _ecore_x_selection_data_initialize(void); +void _ecore_x_selection_shutdown(void); Atom _ecore_x_selection_target_atom_get(char *target); char * _ecore_x_selection_target_get(Atom target); void _ecore_x_selection_request_data_set(Ecore_X_Selection_Data data); diff --git a/legacy/ecore/src/lib/ecore_x/ecore_x_selection.c b/legacy/ecore/src/lib/ecore_x/ecore_x_selection.c index 1a1bd17bbd..fdfe81e1f2 100644 --- a/legacy/ecore/src/lib/ecore_x/ecore_x_selection.c +++ b/legacy/ecore/src/lib/ecore_x/ecore_x_selection.c @@ -3,28 +3,40 @@ #include #include -/* FIXME: Initialize! */ -static Ecore_X_Selection_Data selections[3]; -static Ecore_X_Selection_Data request_data[3]; -static Ecore_X_Selection_Converter *converters; +static Ecore_X_Selection_Data selections[3] = {{0}}; +static Ecore_X_Selection_Data request_data[3] = {{0}}; +static Ecore_X_Selection_Converter *converters = NULL; static int _ecore_x_selection_converter_text(char *target, void *data, int size, void **data_ret, int *size_ret); void _ecore_x_selection_data_initialize(void) { - memset(selections, 0, sizeof(selections)); - memset(request_data, 0, sizeof(request_data)); - /* Initialize converters */ - converters = NULL; ecore_x_selection_converter_atom_add(_ecore_x_atom_text, _ecore_x_selection_converter_text); ecore_x_selection_converter_atom_add(_ecore_x_atom_compound_text, _ecore_x_selection_converter_text); ecore_x_selection_converter_atom_add(_ecore_x_atom_string, _ecore_x_selection_converter_text); - +} + +void +_ecore_x_selection_shutdown(void) +{ + Ecore_X_Selection_Converter *cnv = converters, *tmp; + + if (!converters) + return; + + /* free the selection converters */ + while (cnv) { + tmp = cnv->next; + free(cnv); + cnv = tmp; + } + + converters = NULL; } static void