fix searching in terminal window
Make sure are regex are compiled with PCRE2_MULTILINE which is a requirement by the vte library
parent
d6c850079c
commit
dd41b4a367
|
@ -600,7 +600,7 @@ terminal_screen_class_init (TerminalScreenClass *klass)
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
|
|
||||||
skey_regexes[i] = vte_regex_new_for_match(skey_regex_patterns[i].pattern, -1,
|
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)
|
if (error)
|
||||||
{
|
{
|
||||||
g_message ("%s", error->message);
|
g_message ("%s", error->message);
|
||||||
|
|
|
@ -25,6 +25,9 @@
|
||||||
#include "terminal-search-dialog.h"
|
#include "terminal-search-dialog.h"
|
||||||
#include "terminal-util.h"
|
#include "terminal-util.h"
|
||||||
|
|
||||||
|
#define PCRE2_CODE_UNIT_WIDTH 0
|
||||||
|
#include <pcre2.h>
|
||||||
|
|
||||||
#define HISTORY_MIN_ITEM_LEN 3
|
#define HISTORY_MIN_ITEM_LEN 3
|
||||||
#define HISTORY_LENGTH 10
|
#define HISTORY_LENGTH 10
|
||||||
|
|
||||||
|
@ -60,8 +63,8 @@ typedef struct _TerminalSearchDialogPrivate
|
||||||
GtkEntryCompletion *completion;
|
GtkEntryCompletion *completion;
|
||||||
|
|
||||||
/* Cached regex */
|
/* Cached regex */
|
||||||
GRegex *regex;
|
VteRegex *regex;
|
||||||
GRegexCompileFlags regex_compile_flags;
|
guint32 regex_compile_flags;
|
||||||
} TerminalSearchDialogPrivate;
|
} TerminalSearchDialogPrivate;
|
||||||
|
|
||||||
|
|
||||||
|
@ -153,7 +156,7 @@ terminal_search_dialog_private_destroy (TerminalSearchDialogPrivate *priv)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (priv->regex)
|
if (priv->regex)
|
||||||
g_regex_unref (priv->regex);
|
vte_regex_unref (priv->regex);
|
||||||
|
|
||||||
g_object_unref (priv->store);
|
g_object_unref (priv->store);
|
||||||
g_object_unref (priv->completion);
|
g_object_unref (priv->completion);
|
||||||
|
@ -171,7 +174,7 @@ update_sensitivity (void *unused, GtkWidget *dialog)
|
||||||
|
|
||||||
if (priv->regex)
|
if (priv->regex)
|
||||||
{
|
{
|
||||||
g_regex_unref (priv->regex);
|
vte_regex_unref (priv->regex);
|
||||||
priv->regex = NULL;
|
priv->regex = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -336,11 +339,11 @@ terminal_search_dialog_get_search_flags (GtkWidget *dialog)
|
||||||
return flags;
|
return flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
GRegex *
|
VteRegex *
|
||||||
terminal_search_dialog_get_regex (GtkWidget *dialog)
|
terminal_search_dialog_get_regex (GtkWidget *dialog)
|
||||||
{
|
{
|
||||||
TerminalSearchDialogPrivate *priv;
|
TerminalSearchDialogPrivate *priv;
|
||||||
GRegexCompileFlags compile_flags;
|
guint32 compile_flags;
|
||||||
const char *text, *pattern;
|
const char *text, *pattern;
|
||||||
|
|
||||||
g_return_val_if_fail (GTK_IS_DIALOG (dialog), NULL);
|
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);
|
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))
|
if (!GET_FLAG (match_case_checkbutton))
|
||||||
compile_flags |= G_REGEX_CASELESS;
|
compile_flags |= PCRE2_CASELESS;
|
||||||
|
|
||||||
if (GET_FLAG (regex_checkbutton))
|
if (GET_FLAG (regex_checkbutton))
|
||||||
compile_flags |= G_REGEX_MULTILINE;
|
compile_flags |= PCRE2_UCP;
|
||||||
else
|
else
|
||||||
pattern = g_regex_escape_string (text, -1);
|
pattern = g_regex_escape_string (text, -1);
|
||||||
|
|
||||||
|
@ -372,10 +375,12 @@ terminal_search_dialog_get_regex (GtkWidget *dialog)
|
||||||
{
|
{
|
||||||
priv->regex_compile_flags = compile_flags;
|
priv->regex_compile_flags = compile_flags;
|
||||||
if (priv->regex)
|
if (priv->regex)
|
||||||
g_regex_unref (priv->regex);
|
vte_regex_unref (priv->regex);
|
||||||
|
|
||||||
/* TODO Error handling */
|
/* 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)
|
if (pattern != text)
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
#define TERMINAL_SEARCH_DIALOG_H
|
#define TERMINAL_SEARCH_DIALOG_H
|
||||||
|
|
||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
|
#include <vte/vte.h>
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
|
@ -43,7 +44,7 @@ const gchar *terminal_search_dialog_get_search_text (GtkWidget *dialog);
|
||||||
|
|
||||||
TerminalSearchFlags
|
TerminalSearchFlags
|
||||||
terminal_search_dialog_get_search_flags(GtkWidget *dialog);
|
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
|
G_END_DECLS
|
||||||
|
|
||||||
|
|
|
@ -4064,7 +4064,7 @@ search_find_response_callback (GtkWidget *dialog,
|
||||||
TerminalWindow *window = TERMINAL_WINDOW (user_data);
|
TerminalWindow *window = TERMINAL_WINDOW (user_data);
|
||||||
TerminalWindowPrivate *priv = window->priv;
|
TerminalWindowPrivate *priv = window->priv;
|
||||||
TerminalSearchFlags flags;
|
TerminalSearchFlags flags;
|
||||||
GRegex *regex;
|
VteRegex *regex;
|
||||||
|
|
||||||
if (response != GTK_RESPONSE_ACCEPT)
|
if (response != GTK_RESPONSE_ACCEPT)
|
||||||
return;
|
return;
|
||||||
|
@ -4077,7 +4077,7 @@ search_find_response_callback (GtkWidget *dialog,
|
||||||
|
|
||||||
flags = terminal_search_dialog_get_search_flags (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),
|
vte_terminal_search_set_wrap_around (VTE_TERMINAL (priv->active_screen),
|
||||||
(flags & TERMINAL_SEARCH_FLAG_WRAP_AROUND));
|
(flags & TERMINAL_SEARCH_FLAG_WRAP_AROUND));
|
||||||
|
|
||||||
|
@ -4148,7 +4148,7 @@ search_clear_highlight_callback (GtkAction *action,
|
||||||
if (G_UNLIKELY (!window->priv->active_screen))
|
if (G_UNLIKELY (!window->priv->active_screen))
|
||||||
return;
|
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
|
static void
|
||||||
|
|
Loading…
Reference in New Issue