From 9d128954c0e60b6cd8a10a55a243a070fc780fd8 Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Fri, 20 Mar 2020 07:53:04 +0900 Subject: fix searching in terminal window Make sure are regex are compiled with PCRE2_MULTILINE which is a requirement by the vte library --- src/terminal-screen.c | 2 +- src/terminal-search-dialog.c | 27 ++++++++++++++++----------- src/terminal-search-dialog.h | 3 ++- src/terminal-window.c | 6 +++--- 4 files changed, 22 insertions(+), 16 deletions(-) diff --git a/src/terminal-screen.c b/src/terminal-screen.c index 1ebe973..9ead8be 100644 --- a/src/terminal-screen.c +++ b/src/terminal-screen.c @@ -600,7 +600,7 @@ terminal_screen_class_init (TerminalScreenClass *klass) GError *error = NULL; skey_regexes[i] = vte_regex_new_for_match(skey_regex_patterns[i].pattern, -1, - PCRE2_MULTILINE, &error); + PCRE2_MULTILINE | PCRE2_UTF | PCRE2_NO_UTF_CHECK, &error); if (error) { g_message ("%s", error->message); diff --git a/src/terminal-search-dialog.c b/src/terminal-search-dialog.c index 7ff80e8..86d0ce7 100644 --- a/src/terminal-search-dialog.c +++ b/src/terminal-search-dialog.c @@ -25,6 +25,9 @@ #include "terminal-search-dialog.h" #include "terminal-util.h" +#define PCRE2_CODE_UNIT_WIDTH 0 +#include + #define HISTORY_MIN_ITEM_LEN 3 #define HISTORY_LENGTH 10 @@ -60,8 +63,8 @@ typedef struct _TerminalSearchDialogPrivate GtkEntryCompletion *completion; /* Cached regex */ - GRegex *regex; - GRegexCompileFlags regex_compile_flags; + VteRegex *regex; + guint32 regex_compile_flags; } TerminalSearchDialogPrivate; @@ -153,7 +156,7 @@ terminal_search_dialog_private_destroy (TerminalSearchDialogPrivate *priv) { if (priv->regex) - g_regex_unref (priv->regex); + vte_regex_unref (priv->regex); g_object_unref (priv->store); g_object_unref (priv->completion); @@ -171,7 +174,7 @@ update_sensitivity (void *unused, GtkWidget *dialog) if (priv->regex) { - g_regex_unref (priv->regex); + vte_regex_unref (priv->regex); priv->regex = NULL; } @@ -336,11 +339,11 @@ terminal_search_dialog_get_search_flags (GtkWidget *dialog) return flags; } -GRegex * +VteRegex * terminal_search_dialog_get_regex (GtkWidget *dialog) { TerminalSearchDialogPrivate *priv; - GRegexCompileFlags compile_flags; + guint32 compile_flags; const char *text, *pattern; g_return_val_if_fail (GTK_IS_DIALOG (dialog), NULL); @@ -350,13 +353,13 @@ terminal_search_dialog_get_regex (GtkWidget *dialog) pattern = text = terminal_search_dialog_get_search_text (dialog); - compile_flags = G_REGEX_OPTIMIZE; + compile_flags = PCRE2_MULTILINE | PCRE2_UTF | PCRE2_NO_UTF_CHECK; if (!GET_FLAG (match_case_checkbutton)) - compile_flags |= G_REGEX_CASELESS; + compile_flags |= PCRE2_CASELESS; if (GET_FLAG (regex_checkbutton)) - compile_flags |= G_REGEX_MULTILINE; + compile_flags |= PCRE2_UCP; else pattern = g_regex_escape_string (text, -1); @@ -372,10 +375,12 @@ terminal_search_dialog_get_regex (GtkWidget *dialog) { priv->regex_compile_flags = compile_flags; if (priv->regex) - g_regex_unref (priv->regex); + vte_regex_unref (priv->regex); /* TODO Error handling */ - priv->regex = g_regex_new (pattern, compile_flags, 0, NULL); + priv->regex = vte_regex_new_for_search(pattern, -1, + compile_flags, NULL); + } if (pattern != text) diff --git a/src/terminal-search-dialog.h b/src/terminal-search-dialog.h index 593290a..8c87e91 100644 --- a/src/terminal-search-dialog.h +++ b/src/terminal-search-dialog.h @@ -22,6 +22,7 @@ #define TERMINAL_SEARCH_DIALOG_H #include +#include G_BEGIN_DECLS @@ -43,7 +44,7 @@ const gchar *terminal_search_dialog_get_search_text (GtkWidget *dialog); TerminalSearchFlags terminal_search_dialog_get_search_flags(GtkWidget *dialog); -GRegex *terminal_search_dialog_get_regex (GtkWidget *dialog); +VteRegex *terminal_search_dialog_get_regex (GtkWidget *dialog); G_END_DECLS diff --git a/src/terminal-window.c b/src/terminal-window.c index 9949fdf..f61dc17 100644 --- a/src/terminal-window.c +++ b/src/terminal-window.c @@ -4064,7 +4064,7 @@ search_find_response_callback (GtkWidget *dialog, TerminalWindow *window = TERMINAL_WINDOW (user_data); TerminalWindowPrivate *priv = window->priv; TerminalSearchFlags flags; - GRegex *regex; + VteRegex *regex; if (response != GTK_RESPONSE_ACCEPT) return; @@ -4077,7 +4077,7 @@ search_find_response_callback (GtkWidget *dialog, flags = terminal_search_dialog_get_search_flags (dialog); - vte_terminal_search_set_gregex (VTE_TERMINAL (priv->active_screen), regex, 0); + vte_terminal_search_set_regex (VTE_TERMINAL (priv->active_screen), regex, 0); vte_terminal_search_set_wrap_around (VTE_TERMINAL (priv->active_screen), (flags & TERMINAL_SEARCH_FLAG_WRAP_AROUND)); @@ -4148,7 +4148,7 @@ search_clear_highlight_callback (GtkAction *action, if (G_UNLIKELY (!window->priv->active_screen)) return; - vte_terminal_search_set_gregex (VTE_TERMINAL (window->priv->active_screen), NULL, 0); + vte_terminal_search_set_regex (VTE_TERMINAL (window->priv->active_screen), NULL, 0); } static void -- cgit v1.2.1