ui/gtk/text.c

changeset 141
cc2170ea05ad
parent 140
c03c338a7dcf
child 143
d499b29d7cb6
--- 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);
 }

mercurial