From 072de1f518d33556531902c192283b5d1a175b9f Mon Sep 17 00:00:00 2001 From: Colin Leroy Date: Tue, 4 Jan 2005 13:51:22 +0000 Subject: [PATCH] 2005-01-04 [colin] 0.9.13cvs25.9 * src/compose.c Fix Show Ruler menuitem * src/prefs_template.c Convert to GTK2 * src/common/utils.c Make auto pointer stuff handles NULLs Patches by Alfons. --- ChangeLog-gtk2.claws | 10 ++ PATCHSETS | 1 + configure.ac | 2 +- src/common/utils.c | 43 +++-- src/compose.c | 6 +- src/prefs_template.c | 375 +++++++++++++++++++++++++++++-------------- 6 files changed, 304 insertions(+), 133 deletions(-) diff --git a/ChangeLog-gtk2.claws b/ChangeLog-gtk2.claws index ad255a67d..9d96724e9 100644 --- a/ChangeLog-gtk2.claws +++ b/ChangeLog-gtk2.claws @@ -1,3 +1,13 @@ +2005-01-04 [colin] 0.9.13cvs25.9 + + * src/compose.c + Fix Show Ruler menuitem + * src/prefs_template.c + Convert to GTK2 + * src/common/utils.c + Make auto pointer stuff handles NULLs + Patches by Alfons. + 2005-01-04 [colin] 0.9.13cvs25.8 * src/compose.c diff --git a/PATCHSETS b/PATCHSETS index ad3f345c8..524ae7dff 100644 --- a/PATCHSETS +++ b/PATCHSETS @@ -308,3 +308,4 @@ ( cvs diff -u -r 1.1.4.2 -r 1.1.4.3 src/gtk/gtkshruler.c; ) > 0.9.13cvs25.6.patchset ( cvs diff -u -r 1.96.2.38 -r 1.96.2.39 src/textview.c; ) > 0.9.13cvs25.7.patchset ( cvs diff -u -r 1.382.2.83 -r 1.382.2.84 src/compose.c; ) > 0.9.13cvs25.8.patchset +( cvs diff -u -r 1.382.2.84 -r 1.382.2.85 src/compose.c; cvs diff -u -r 1.12.2.5 -r 1.12.2.6 src/prefs_template.c; cvs diff -u -r 1.36.2.19 -r 1.36.2.20 src/common/utils.c; ) > 0.9.13cvs25.9.patchset diff --git a/configure.ac b/configure.ac index 94ab9d87d..cd895fee9 100644 --- a/configure.ac +++ b/configure.ac @@ -13,7 +13,7 @@ INTERFACE_AGE=0 BINARY_AGE=0 EXTRA_VERSION=25 EXTRA_RELEASE= -EXTRA_GTK2_VERSION=.8 +EXTRA_GTK2_VERSION=.9 if test \( $EXTRA_VERSION -eq 0 \) -o \( "x$EXTRA_RELEASE" != "x" \); then VERSION=${MAJOR_VERSION}.${MINOR_VERSION}.${MICRO_VERSION}${EXTRA_RELEASE}${EXTRA_GTK2_VERSION} diff --git a/src/common/utils.c b/src/common/utils.c index b0f9e5516..be25f07b0 100644 --- a/src/common/utils.c +++ b/src/common/utils.c @@ -3822,8 +3822,14 @@ typedef struct AutoPointer { */ GAuto *g_auto_pointer_new(gpointer p) { - AutoPointerRef *ref = g_new0(AutoPointerRef, 1); - AutoPointer *ptr = g_new0(AutoPointer, 1); + AutoPointerRef *ref; + AutoPointer *ptr; + + if (p == NULL) + return NULL; + + ref = g_new0(AutoPointerRef, 1); + ptr = g_new0(AutoPointer, 1); ref->pointer = p; ref->free = g_free; @@ -3842,15 +3848,21 @@ GAuto *g_auto_pointer_new(gpointer p) * free the guarded pointer */ GAuto *g_auto_pointer_new_with_free(gpointer p, GFreeFunc free_) -{ - AutoPointer *aptr = g_auto_pointer_new(p); +{ + AutoPointer *aptr; + + if (p == NULL) + return NULL; + aptr = g_auto_pointer_new(p); aptr->ref->free = free_; return aptr; } gpointer g_auto_pointer_get_ptr(GAuto *auto_ptr) { + if (auto_ptr == NULL) + return NULL; return ((AutoPointer *) auto_ptr)->ptr; } @@ -3866,9 +3878,16 @@ gpointer g_auto_pointer_get_ptr(GAuto *auto_ptr) */ GAuto *g_auto_pointer_copy(GAuto *auto_ptr) { - AutoPointer *ptr = auto_ptr; - AutoPointerRef *ref = ptr->ref; - AutoPointer *newp = g_new0(AutoPointer, 1); + AutoPointer *ptr; + AutoPointerRef *ref; + AutoPointer *newp; + + if (auto_ptr == NULL) + return NULL; + + ptr = auto_ptr; + ref = ptr->ref; + newp = g_new0(AutoPointer, 1); newp->ref = ref; newp->ptr = ref->pointer; @@ -3884,8 +3903,14 @@ GAuto *g_auto_pointer_copy(GAuto *auto_ptr) */ void g_auto_pointer_free(GAuto *auto_ptr) { - AutoPointer *ptr = auto_ptr; - AutoPointerRef *ref = ptr->ref; + AutoPointer *ptr; + AutoPointerRef *ref; + + if (auto_ptr == NULL) + return; + + ptr = auto_ptr; + ref = ptr->ref; if (--(ref->cnt) == 0) { G_PRINT_REF ("XXXX FREE(%lx) -- REF (%d)\n", ref->pointer, ref->cnt); diff --git a/src/compose.c b/src/compose.c index 41acb1262..3bfee2f2f 100644 --- a/src/compose.c +++ b/src/compose.c @@ -4793,6 +4793,7 @@ static Compose *compose_create(PrefsAccount *account, ComposeMode mode) GtkItemFactory *ifactory; GtkWidget *tmpl_menu; gint n_entries; + GtkWidget *menuitem; #if USE_ASPELL GtkAspell * gtkaspell = NULL; @@ -5127,7 +5128,6 @@ static Compose *compose_create(PrefsAccount *account, ComposeMode mode) if (mode != COMPOSE_REDIRECT) compose_set_template_menu(compose); else { - GtkWidget *menuitem; menuitem = gtk_item_factory_get_item(ifactory, "/Tools/Template"); menu_set_sensitive(ifactory, "/Tools/Template", FALSE); } @@ -5136,6 +5136,10 @@ static Compose *compose_create(PrefsAccount *account, ComposeMode mode) if (!prefs_common.show_ruler) gtk_widget_hide(ruler_hbox); + + menuitem = gtk_item_factory_get_item(ifactory, "/Tools/Show ruler"); + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), + prefs_common.show_ruler); /* Priority */ compose->priority = PRIORITY_NORMAL; diff --git a/src/prefs_template.c b/src/prefs_template.c index bc1ab4dae..30a5b1c77 100644 --- a/src/prefs_template.c +++ b/src/prefs_template.c @@ -39,10 +39,17 @@ #include "addr_compl.h" #include "quote_fmt.h" +enum { + TEMPL_TEXT, + TEMPL_DATA, + TEMPL_AUTO_DATA, /*!< auto pointer */ + N_TEMPL_COLUMNS +}; + static struct Templates { GtkWidget *window; GtkWidget *ok_btn; - GtkWidget *clist_tmpls; + GtkWidget *list_view; GtkWidget *entry_name; GtkWidget *entry_subject; GtkWidget *entry_to; @@ -67,14 +74,23 @@ static gboolean prefs_template_key_pressed_cb (GtkWidget *widget, gpointer data); static void prefs_template_cancel_cb (void); static void prefs_template_ok_cb (void); -static void prefs_template_select_cb (GtkCList *clist, - gint row, - gint column, - GdkEvent *event); static void prefs_template_register_cb (void); static void prefs_template_substitute_cb (void); static void prefs_template_delete_cb (void); +static GtkListStore* prefs_template_create_data_store (void); +static void prefs_template_list_view_insert_template (GtkWidget *list_view, + GtkTreeIter *row_iter, + const gchar *template, + Template *data); +static GtkWidget *prefs_template_list_view_create (void); +static void prefs_template_create_list_view_columns (GtkWidget *list_view); +static gboolean prefs_template_selected (GtkTreeSelection *selector, + GtkTreeModel *model, + GtkTreePath *path, + gboolean currently_selected, + gpointer data); + /* Called from mainwindow.c */ void prefs_template_open(void) { @@ -126,13 +142,11 @@ static void prefs_template_window_create(void) GtkWidget *del_btn; GtkWidget *desc_btn; GtkWidget *scroll1; - GtkWidget *clist_tmpls; + GtkWidget *list_view; GtkWidget *confirm_area; GtkWidget *ok_btn; GtkWidget *cancel_btn; - gchar *title[1]; - /* main window */ window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); @@ -213,7 +227,7 @@ static void prefs_template_window_create(void) gtk_widget_show(hbox3); gtk_box_pack_start(GTK_BOX(hbox2), hbox3, FALSE, FALSE, 0); - reg_btn = gtk_button_new_with_label(_("Add")); + reg_btn = gtk_button_new_from_stock(GTK_STOCK_ADD); gtk_widget_show(reg_btn); gtk_box_pack_start(GTK_BOX(hbox3), reg_btn, FALSE, TRUE, 0); g_signal_connect(G_OBJECT (reg_btn), "clicked", @@ -226,7 +240,7 @@ static void prefs_template_window_create(void) G_CALLBACK(prefs_template_substitute_cb), NULL); - del_btn = gtk_button_new_with_label(_("Delete")); + del_btn = gtk_button_new_from_stock(GTK_STOCK_REMOVE); gtk_widget_show(del_btn); gtk_box_pack_start(GTK_BOX(hbox3), del_btn, FALSE, TRUE, 0); g_signal_connect(G_OBJECT(del_btn), "clicked", @@ -245,23 +259,15 @@ static void prefs_template_window_create(void) gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll1), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - - title[0] = _("Current templates"); - clist_tmpls = gtk_clist_new_with_titles(1, title); - gtk_widget_show(clist_tmpls); + + list_view = prefs_template_list_view_create(); + gtk_widget_show(list_view); gtk_widget_set_size_request(scroll1, -1, 140); - gtk_container_add(GTK_CONTAINER(scroll1), clist_tmpls); - gtk_clist_set_column_width(GTK_CLIST(clist_tmpls), 0, 80); - gtk_clist_set_selection_mode(GTK_CLIST(clist_tmpls), - GTK_SELECTION_BROWSE); - GTK_WIDGET_UNSET_FLAGS(GTK_CLIST(clist_tmpls)->column[0].button, - GTK_CAN_FOCUS); - g_signal_connect(G_OBJECT (clist_tmpls), "select_row", - G_CALLBACK (prefs_template_select_cb), NULL); + gtk_container_add(GTK_CONTAINER(scroll1), list_view); /* ok | cancel */ - gtkut_button_set_create(&confirm_area, &ok_btn, _("OK"), - &cancel_btn, _("Cancel"), NULL, NULL); + gtkut_button_set_create_stock(&confirm_area, &ok_btn, GTK_STOCK_OK, + &cancel_btn, GTK_STOCK_CANCEL, NULL, NULL); gtk_widget_show(confirm_area); gtk_box_pack_end(GTK_BOX(vbox2), confirm_area, FALSE, FALSE, 0); gtk_widget_grab_default(ok_btn); @@ -282,7 +288,7 @@ static void prefs_template_window_create(void) templates.window = window; templates.ok_btn = ok_btn; - templates.clist_tmpls = clist_tmpls; + templates.list_view = list_view; templates.entry_name = entry_name; templates.entry_subject = entry_subject; templates.entry_to = entry_to; @@ -293,49 +299,44 @@ static void prefs_template_window_create(void) static void prefs_template_window_setup(void) { - GtkCList *clist = GTK_CLIST(templates.clist_tmpls); GSList *tmpl_list; GSList *cur; gchar *title[1]; gint row; Template *tmpl; + GtkListStore *store; + + store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW + (templates.list_view))); manage_window_set_transient(GTK_WINDOW(templates.window)); gtk_widget_grab_focus(templates.ok_btn); - gtk_clist_freeze(clist); - gtk_clist_clear(clist); - - title[0] = _("(New)"); - row = gtk_clist_append(clist, title); - gtk_clist_set_row_data(clist, row, NULL); + gtk_list_store_clear(store); + prefs_template_list_view_insert_template(templates.list_view, + NULL, _("(New)"), + NULL); + tmpl_list = template_read_config(); for (cur = tmpl_list; cur != NULL; cur = cur->next) { tmpl = (Template *)cur->data; - title[0] = tmpl->name; - row = gtk_clist_append(clist, title); - gtk_clist_set_row_data(clist, row, tmpl); + prefs_template_list_view_insert_template(templates.list_view, + NULL, tmpl->name, + tmpl); } g_slist_free(tmpl_list); - - gtk_clist_thaw(clist); } static void prefs_template_clear(void) { - Template *tmpl; - gint row = 1; - - while ((tmpl = gtk_clist_get_row_data - (GTK_CLIST(templates.clist_tmpls), row)) != NULL) { - template_free(tmpl); - row++; - } + GtkListStore *store; - gtk_clist_clear(GTK_CLIST(templates.clist_tmpls)); + store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW + (templates.list_view))); + gtk_list_store_clear(store); } static gint prefs_template_deleted_cb(GtkWidget *widget, GdkEventAny *event, @@ -360,7 +361,7 @@ static void prefs_template_ok_cb(void) tmpl_list = prefs_template_get_list(); template_set_config(tmpl_list); compose_reflect_prefs_all(); - gtk_clist_clear(GTK_CLIST(templates.clist_tmpls)); + prefs_template_clear(); gtk_widget_hide(templates.window); inc_unlock(); } @@ -372,58 +373,58 @@ static void prefs_template_cancel_cb(void) inc_unlock(); } -static void prefs_template_select_cb(GtkCList *clist, gint row, gint column, - GdkEvent *event) -{ - Template *tmpl; - Template tmpl_def; - GtkTextBuffer *buffer; - GtkTextIter iter; - - tmpl_def.name = _("Template"); - tmpl_def.subject = ""; - tmpl_def.to = ""; - tmpl_def.cc = ""; - tmpl_def.bcc = ""; - tmpl_def.value = ""; - - if (!(tmpl = gtk_clist_get_row_data(clist, row))) - tmpl = &tmpl_def; - - gtk_entry_set_text(GTK_ENTRY(templates.entry_name), tmpl->name); - gtk_entry_set_text(GTK_ENTRY(templates.entry_to), - tmpl->to ? tmpl->to : ""); - gtk_entry_set_text(GTK_ENTRY(templates.entry_cc), - tmpl->cc ? tmpl->cc : ""); - gtk_entry_set_text(GTK_ENTRY(templates.entry_bcc), - tmpl->bcc ? tmpl->bcc : ""); - gtk_entry_set_text(GTK_ENTRY(templates.entry_subject), - tmpl->subject ? tmpl->subject : ""); - - buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(templates.text_value)); - gtk_text_buffer_set_text(buffer, "", -1); - gtk_text_buffer_get_start_iter(buffer, &iter); - gtk_text_buffer_insert(buffer, &iter, tmpl->value, -1); -} - +/*! + *\brief Request list for storage. New list is owned + * by template.c... + */ static GSList *prefs_template_get_list(void) { - gint row = 1; GSList *tmpl_list = NULL; Template *tmpl; - - while ((tmpl = gtk_clist_get_row_data - (GTK_CLIST(templates.clist_tmpls), row)) != NULL) { - tmpl_list = g_slist_append(tmpl_list, tmpl); - row++; - } + GtkTreeModel *model; + GtkTreeIter iter; + + model = gtk_tree_view_get_model(GTK_TREE_VIEW(templates.list_view)); + if (!gtk_tree_model_get_iter_first(model, &iter)) + return NULL; + + do { + gtk_tree_model_get(model, &iter, + TEMPL_DATA, &tmpl, + -1); + + if (tmpl) { + Template *ntmpl; + + ntmpl = g_new(Template, 1); + ntmpl->name = tmpl->name && *(tmpl->name) + ? g_strdup(tmpl->name) + : NULL; + ntmpl->subject = tmpl->subject && *(tmpl->subject) + ? g_strdup(tmpl->subject) + : NULL; + ntmpl->to = tmpl->to && *(tmpl->to) + ? g_strdup(tmpl->to) + : NULL; + ntmpl->cc = tmpl->cc && *(tmpl->cc) + ? g_strdup(tmpl->cc) + : NULL; + ntmpl->bcc = tmpl->bcc && *(tmpl->bcc) + ? g_strdup(tmpl->bcc) + : NULL; + ntmpl->value = tmpl->value && *(tmpl->value) + ? g_strdup(tmpl->value) + : NULL; + tmpl_list = g_slist_append(tmpl_list, ntmpl); + } + + } while (gtk_tree_model_iter_next(model, &iter)); return tmpl_list; } -static gint prefs_template_clist_set_row(gint row) +static void prefs_template_list_view_set_row(GtkTreeIter *row) { - GtkCList *clist = GTK_CLIST(templates.clist_tmpls); Template *tmpl; Template *tmp_tmpl; gchar *name; @@ -432,11 +433,11 @@ static gint prefs_template_clist_set_row(gint row) gchar *cc; gchar *bcc; gchar *value; - gchar *title[1]; GtkTextBuffer *buffer; GtkTextIter start, end; + GtkTreeModel *model; - g_return_val_if_fail(row != 0, -1); + model = gtk_tree_view_get_model(GTK_TREE_VIEW(templates.list_view)); buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(templates.text_value)); gtk_text_buffer_get_start_iter(buffer, &start); @@ -455,7 +456,7 @@ static gint prefs_template_clist_set_row(gint row) if (!parsed_buf) { alertpanel_error(_("Template format error.")); g_free(value); - return -1; + return; } } @@ -495,59 +496,189 @@ static gint prefs_template_clist_set_row(gint row) tmpl->bcc = bcc; tmpl->value = value; - title[0] = name; - - if (row < 0) { - row = gtk_clist_append(clist, title); - } else { - gtk_clist_set_text(clist, row, 0, name); - tmp_tmpl = gtk_clist_get_row_data(clist, row); - if (tmp_tmpl) - template_free(tmp_tmpl); - } - - gtk_clist_set_row_data(clist, row, tmpl); - return row; + prefs_template_list_view_insert_template(templates.list_view, + row, tmpl->name, tmpl); } static void prefs_template_register_cb(void) { - prefs_template_clist_set_row(-1); + prefs_template_list_view_set_row(NULL); } static void prefs_template_substitute_cb(void) { - GtkCList *clist = GTK_CLIST(templates.clist_tmpls); Template *tmpl; - gint row; + GtkTreeIter row; + GtkTreeSelection *selection; + GtkTreeModel *model; - if (!clist->selection) return; + selection = gtk_tree_view_get_selection + (GTK_TREE_VIEW(templates.list_view)); + + if (!gtk_tree_selection_get_selected(selection, &model, &row)) + return; - row = GPOINTER_TO_INT(clist->selection->data); - if (row == 0) return; + gtk_tree_model_get(model, &row, + TEMPL_DATA, &tmpl, + -1); - tmpl = gtk_clist_get_row_data(clist, row); if (!tmpl) return; - prefs_template_clist_set_row(row); + prefs_template_list_view_set_row(&row); } static void prefs_template_delete_cb(void) { - GtkCList *clist = GTK_CLIST(templates.clist_tmpls); Template *tmpl; - gint row; + GtkTreeIter row; + GtkTreeSelection *selection; + GtkTreeModel *model; - if (!clist->selection) return; - row = GPOINTER_TO_INT(clist->selection->data); - if (row == 0) return; + selection = gtk_tree_view_get_selection + (GTK_TREE_VIEW(templates.list_view)); + + if (!gtk_tree_selection_get_selected(selection, &model, &row)) + return; + + gtk_tree_model_get(model, &row, + TEMPL_DATA, &tmpl, + -1); + + if (!tmpl) + return; if (alertpanel(_("Delete template"), _("Do you really want to delete this template?"), _("Yes"), _("No"), NULL) != G_ALERTDEFAULT) return; - tmpl = gtk_clist_get_row_data(clist, row); - template_free(tmpl); - gtk_clist_remove(clist, row); + gtk_list_store_remove(GTK_LIST_STORE(model), &row); } + +static GtkListStore* prefs_template_create_data_store(void) +{ + return gtk_list_store_new(N_TEMPL_COLUMNS, + G_TYPE_STRING, + G_TYPE_POINTER, + G_TYPE_AUTO_POINTER, + -1); +} + +static void prefs_template_list_view_insert_template(GtkWidget *list_view, + GtkTreeIter *row_iter, + const gchar *template, + Template *data) +{ + GtkTreeIter iter; + GtkListStore *list_store = GTK_LIST_STORE(gtk_tree_view_get_model + (GTK_TREE_VIEW(list_view))); + GAuto *auto_data; + + if (row_iter == NULL) { + /* append new */ + gtk_list_store_append(list_store, &iter); + } else { + iter = *row_iter; + } + + auto_data = g_auto_pointer_new_with_free(data, (GFreeFunc) template_free); + + /* if replacing data in an existing row, the auto pointer takes care + * of destroying the Template data */ + gtk_list_store_set(list_store, &iter, + TEMPL_TEXT, template, + TEMPL_DATA, data, + TEMPL_AUTO_DATA, auto_data, + -1); + + g_auto_pointer_free(auto_data); +} + +static GtkWidget *prefs_template_list_view_create(void) +{ + GtkTreeView *list_view; + GtkTreeSelection *selector; + GtkTreeModel *model; + + model = GTK_TREE_MODEL(prefs_template_create_data_store()); + list_view = GTK_TREE_VIEW(gtk_tree_view_new_with_model(model)); + g_object_unref(model); + + gtk_tree_view_set_rules_hint(list_view, TRUE); + + selector = gtk_tree_view_get_selection(list_view); + gtk_tree_selection_set_mode(selector, GTK_SELECTION_BROWSE); + gtk_tree_selection_set_select_function(selector, prefs_template_selected, + NULL, NULL); + + /* create the columns */ + prefs_template_create_list_view_columns(GTK_WIDGET(list_view)); + + return GTK_WIDGET(list_view); +} + +static void prefs_template_create_list_view_columns(GtkWidget *list_view) +{ + GtkTreeViewColumn *column; + GtkCellRenderer *renderer; + + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes + (_("Current templates"), + renderer, + "text", TEMPL_TEXT, + NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW(list_view), column); +} + +static gboolean prefs_template_selected(GtkTreeSelection *selector, + GtkTreeModel *model, + GtkTreePath *path, + gboolean currently_selected, + gpointer data) +{ + Template *tmpl; + Template tmpl_def; + GtkTextBuffer *buffer; + GtkTextIter iter; + GtkTreeIter titer; + + if (currently_selected) + return TRUE; + + if (!gtk_tree_model_get_iter(model, &titer, path)) + return TRUE; + + tmpl_def.name = _("Template"); + tmpl_def.subject = ""; + tmpl_def.to = ""; + tmpl_def.cc = ""; + tmpl_def.bcc = ""; + tmpl_def.value = ""; + + gtk_tree_model_get(model, &titer, + TEMPL_DATA, &tmpl, + -1); + + if (!tmpl) + tmpl = &tmpl_def; + + gtk_entry_set_text(GTK_ENTRY(templates.entry_name), tmpl->name); + gtk_entry_set_text(GTK_ENTRY(templates.entry_to), + tmpl->to ? tmpl->to : ""); + gtk_entry_set_text(GTK_ENTRY(templates.entry_cc), + tmpl->cc ? tmpl->cc : ""); + gtk_entry_set_text(GTK_ENTRY(templates.entry_bcc), + tmpl->bcc ? tmpl->bcc : ""); + gtk_entry_set_text(GTK_ENTRY(templates.entry_subject), + tmpl->subject ? tmpl->subject : ""); + + buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(templates.text_value)); + gtk_text_buffer_set_text(buffer, "", -1); + gtk_text_buffer_get_start_iter(buffer, &iter); + gtk_text_buffer_insert(buffer, &iter, tmpl->value, -1); + + return TRUE; +} + + -- 2.25.1