[gedit] ViewFrame: fix unescape/escape cycle bug
- From: Sébastien Wilmet <swilmet src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gedit] ViewFrame: fix unescape/escape cycle bug
- Date: Wed, 28 Aug 2013 09:58:31 +0000 (UTC)
commit 5840f654c25871a5a9938f659ab98a9d3726ecba
Author: Sébastien Wilmet <swilmet gnome org>
Date: Sat Aug 24 16:35:58 2013 +0200
ViewFrame: fix unescape/escape cycle bug
gedit/gedit-view-frame.c | 49 +++++++++++++++++++++++++++++++++++++++------
1 files changed, 42 insertions(+), 7 deletions(-)
---
diff --git a/gedit/gedit-view-frame.c b/gedit/gedit-view-frame.c
index 118c78f..2d8c631 100644
--- a/gedit/gedit-view-frame.c
+++ b/gedit/gedit-view-frame.c
@@ -79,6 +79,14 @@ struct _GeditViewFramePrivate
* cancelled.
*/
GtkSourceSearchSettings *old_search_settings;
+
+ /* The original search texts. In search_settings and
+ * old_search_settings, the search text is unescaped. Since the escape
+ * function is not reciprocal, we need to store the original search
+ * texts.
+ */
+ gchar *search_text;
+ gchar *old_search_text;
};
enum
@@ -115,6 +123,17 @@ gedit_view_frame_dispose (GObject *object)
}
static void
+gedit_view_frame_finalize (GObject *object)
+{
+ GeditViewFrame *frame = GEDIT_VIEW_FRAME (object);
+
+ g_free (frame->priv->search_text);
+ g_free (frame->priv->old_search_text);
+
+ G_OBJECT_CLASS (gedit_view_frame_parent_class)->finalize (object);
+}
+
+static void
gedit_view_frame_get_property (GObject *object,
guint prop_id,
GValue *value,
@@ -533,6 +552,14 @@ search_widget_key_press_event (GtkWidget *widget,
gtk_source_search_context_set_settings (search_context,
frame->priv->search_settings);
+
+ g_free (frame->priv->search_text);
+ frame->priv->search_text = NULL;
+
+ if (frame->priv->old_search_text != NULL)
+ {
+ frame->priv->search_text = g_strdup (frame->priv->old_search_text);
+ }
}
hide_search_widget (frame, TRUE);
@@ -672,6 +699,10 @@ update_search_text (GeditViewFrame *frame)
gchar *unescaped_entry_text;
entry_text = gtk_entry_get_text (GTK_ENTRY (frame->priv->search_entry));
+
+ g_free (frame->priv->search_text);
+ frame->priv->search_text = g_strdup (entry_text);
+
unescaped_entry_text = gtk_source_utils_unescape_search_text (entry_text);
gtk_source_search_settings_set_search_text (frame->priv->search_settings,
@@ -1110,7 +1141,6 @@ init_search_entry (GeditViewFrame *frame)
gboolean selection_exists;
gchar *search_text = NULL;
gint selection_len = 0;
- const gchar *old_search_text;
GtkSourceSearchContext *search_context;
if (frame->priv->search_settings == NULL)
@@ -1121,6 +1151,14 @@ init_search_entry (GeditViewFrame *frame)
g_clear_object (&frame->priv->old_search_settings);
frame->priv->old_search_settings = copy_search_settings (frame->priv->search_settings);
+ g_free (frame->priv->old_search_text);
+ frame->priv->old_search_text = NULL;
+
+ if (frame->priv->search_text != NULL)
+ {
+ frame->priv->old_search_text = g_strdup (frame->priv->search_text);
+ }
+
search_context = gtk_source_search_context_new (GTK_SOURCE_BUFFER (buffer),
frame->priv->search_settings);
@@ -1138,8 +1176,6 @@ init_search_entry (GeditViewFrame *frame)
&search_text,
&selection_len);
- old_search_text = gtk_source_search_settings_get_search_text (frame->priv->search_settings);
-
if (selection_exists && (search_text != NULL) && (selection_len <= 160))
{
gchar *search_text_escaped = gtk_source_utils_escape_search_text (search_text);
@@ -1152,15 +1188,13 @@ init_search_entry (GeditViewFrame *frame)
g_free (search_text_escaped);
}
- else if (old_search_text != NULL)
+ else if (frame->priv->search_text != NULL)
{
- gchar *old_search_text_escaped = gtk_source_utils_escape_search_text
(old_search_text);
-
g_signal_handler_block (frame->priv->search_entry,
frame->priv->search_entry_changed_id);
gtk_entry_set_text (GTK_ENTRY (frame->priv->search_entry),
- old_search_text_escaped);
+ frame->priv->search_text);
gtk_editable_select_region (GTK_EDITABLE (frame->priv->search_entry),
0, -1);
@@ -1247,6 +1281,7 @@ gedit_view_frame_class_init (GeditViewFrameClass *klass)
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
object_class->dispose = gedit_view_frame_dispose;
+ object_class->finalize = gedit_view_frame_finalize;
object_class->get_property = gedit_view_frame_get_property;
g_object_class_install_property (object_class, PROP_DOCUMENT,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]