diff -r c03c338a7dcf -r cc2170ea05ad ui/gtk/text.c --- a/ui/gtk/text.c Fri Nov 10 17:17:14 2017 +0100 +++ b/ui/gtk/text.c Fri Nov 10 18:04:40 2017 +0100 @@ -101,9 +101,9 @@ if(value) { GtkTextBuffer *buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_area)); - if(value->value) { - gtk_text_buffer_set_text(buf, value->value, -1); - // TODO: free value + if(value->value.ptr) { + gtk_text_buffer_set_text(buf, value->value.ptr, -1); + value->value.free(value->value.ptr); } value->get = ui_textarea_get; @@ -115,7 +115,8 @@ value->selection = ui_textarea_selection; value->length = ui_textarea_length; value->remove = ui_textarea_remove; - value->value = NULL; + value->value.ptr = NULL; + value->value.free = NULL; value->obj = buf; if(!value->undomgr) { value->undomgr = ui_create_undomgr(); @@ -169,29 +170,31 @@ } char* ui_textarea_get(UiText *text) { - if(text->value) { - g_free(text->value); + if(text->value.ptr) { + text->value.free(text->value.ptr); } GtkTextBuffer *buf = text->obj; GtkTextIter start; GtkTextIter end; gtk_text_buffer_get_bounds(buf, &start, &end); char *str = gtk_text_buffer_get_text(buf, &start, &end, FALSE); - text->value = str; + text->value.ptr = g_strdup(str); + text->value.free = (ui_freefunc)g_free; return str; } void ui_textarea_set(UiText *text, char *str) { gtk_text_buffer_set_text((GtkTextBuffer*)text->obj, str, -1); - if(text->value) { - g_free(text->value); + if(text->value.ptr) { + text->value.free(text->value.ptr); } - text->value = NULL; + text->value.ptr = NULL; + text->value.free = NULL; } char* ui_textarea_getsubstr(UiText *text, int begin, int end) { - if(text->value) { - g_free(text->value); + if(text->value.ptr) { + text->value.free(text->value.ptr); } GtkTextBuffer *buf = text->obj; GtkTextIter ib; @@ -199,18 +202,20 @@ gtk_text_buffer_get_iter_at_offset(text->obj, &ib, begin); gtk_text_buffer_get_iter_at_offset(text->obj, &ie, end); char *str = gtk_text_buffer_get_text(buf, &ib, &ie, FALSE); - text->value = str; + text->value.ptr = g_strdup(str); + text->value.free = (ui_freefunc)g_free; return str; } void ui_textarea_insert(UiText *text, int pos, char *str) { - if(text->value) { - g_free(text->value); - } - text->value = NULL; GtkTextIter offset; gtk_text_buffer_get_iter_at_offset(text->obj, &offset, pos); gtk_text_buffer_insert(text->obj, &offset, str, -1); + if(text->value.ptr) { + text->value.free(text->value.ptr); + } + text->value.ptr = NULL; + text->value.free = NULL; } void ui_textarea_setposition(UiText *text, int pos) { @@ -508,15 +513,17 @@ if(var) { UiString *value = var->value; - if(value->value) { - gtk_entry_set_text(GTK_ENTRY(textfield), value->value); - g_free(value->value); - value->value = NULL; + if(value->value.ptr) { + gtk_entry_set_text(GTK_ENTRY(textfield), value->value.ptr); + value->value.free(value->value.ptr); + value->value.ptr = NULL; + value->value.free = NULL; } value->get = ui_textfield_get; value->set = ui_textfield_set; - value->value = NULL; + value->value.ptr = NULL; + value->value.free = NULL; value->obj = GTK_ENTRY(textfield); } @@ -589,17 +596,19 @@ } char* ui_textfield_get(UiString *str) { - if(str->value) { - g_free(str->value); + if(str->value.ptr) { + str->value.free(str->value.ptr); } - str->value = g_strdup(gtk_entry_get_text(str->obj)); - return str->value; + str->value.ptr = g_strdup(gtk_entry_get_text(str->obj)); + str->value.free = (ui_freefunc)g_free; + return str->value.ptr; } void ui_textfield_set(UiString *str, char *value) { - if(str->value) { - g_free(str->value); + gtk_entry_set_text(str->obj, value); + if(str->value.ptr) { + str->value.free(str->value.ptr); + str->value.ptr = NULL; + str->value.free = NULL; } - str->value = NULL; - gtk_entry_set_text(str->obj, value); }