From: Bram Moolenaar Date: Sun, 4 Feb 2018 13:32:57 +0000 (+0100) Subject: patch 8.0.1466: older GTK versions don't have gtk_entry_get_text_length() X-Git-Tag: v8.0.1466 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=06b77ef69f252e1ba8a2136dcbed6622bc2371bb;p=vim patch 8.0.1466: older GTK versions don't have gtk_entry_get_text_length() Problem: Older GTK versions don't have gtk_entry_get_text_length(). Solution: Add a function with #ifdefs to take care of GTK version differences. (Kazunobu Kuriyama, closes #2605) --- diff --git a/src/gui_gtk.c b/src/gui_gtk.c index c1b047974..7ae9cbfdb 100644 --- a/src/gui_gtk.c +++ b/src/gui_gtk.c @@ -2144,6 +2144,37 @@ convert_localized_message(char_u **buffer, const char *message) return (const char *)*buffer; } +/* + * Returns the number of characters in GtkEntry. + */ + static unsigned long +entry_get_text_length(GtkEntry *entry) +{ + g_return_val_if_fail(entry != NULL, 0); + g_return_val_if_fail(GTK_IS_ENTRY(entry) == TRUE, 0); + +#if GTK_CHECK_VERSION(2,18,0) + /* 2.18 introduced a new object GtkEntryBuffer to handle text data for + * GtkEntry instead of letting each instance of the latter have its own + * storage for that. The code below is almost identical to the + * implementation of gtk_entry_get_text_length() for the versions >= 2.18. + */ + return gtk_entry_buffer_get_length(gtk_entry_get_buffer(entry)); +#elif GTK_CHECK_VERSION(2,14,0) + /* 2.14 introduced a new function to avoid memory management bugs which can + * happen when gtk_entry_get_text() is used without due care and attention. + */ + return gtk_entry_get_text_length(entry); +#else + /* gtk_entry_get_text() returns the pointer to the storage allocated + * internally by the widget. Accordingly, use the one with great care: + * Don't free it nor modify the contents it points to; call the function + * every time you need the pointer since its value may have been changed + * by the widget. */ + return g_utf8_strlen(gtk_entry_get_text(entry), -1); +#endif +} + static void find_replace_dialog_create(char_u *arg, int do_replace) { @@ -2198,10 +2229,9 @@ find_replace_dialog_create(char_u *arg, int do_replace) * For :promptrepl dialog, give it to 'with' entry if 'what' has an * non-empty entry; otherwise, to 'what' entry. */ gtk_widget_grab_focus(frdp->what); - if (do_replace && gtk_entry_get_text_length(GTK_ENTRY(frdp->what))) + if (do_replace && entry_get_text_length(GTK_ENTRY(frdp->what)) > 0) gtk_widget_grab_focus(frdp->with); - vim_free(entry_text); return; } diff --git a/src/version.c b/src/version.c index 352d491bf..bac652b61 100644 --- a/src/version.c +++ b/src/version.c @@ -771,6 +771,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1466, /**/ 1465, /**/