Beispiel #1
0
bool Terminal::searchentry_keypress(GdkEventKey* event) {
    if (event->keyval == GDK_KEY_Shift_L || event->keyval == GDK_KEY_Shift_R)
        return false;

    if (event->keyval == GDK_KEY_Return || event->keyval == GDK_KEY_KP_Enter) {
        if (event->state & GDK_SHIFT_MASK) {
            if (!vte_terminal_search_find_next((VteTerminal *)vte)) {
                vte_terminal_unselect_all((VteTerminal *)vte);
                vte_terminal_search_find_next((VteTerminal *)vte);
            }
        } else {
            if (!vte_terminal_search_find_previous((VteTerminal *)vte)) {
                vte_terminal_unselect_all((VteTerminal *)vte);
                vte_terminal_search_find_previous((VteTerminal *)vte);
            }
        }
        return false;
    }

    VteRegex *regex = vte_regex_new_for_search(searchentry.get_text().c_str(), -1, PCRE2_CASELESS, NULL);
    vte_terminal_unselect_all((VteTerminal *)vte);
    vte_terminal_search_set_regex((VteTerminal *)vte, regex, 0);
    vte_terminal_search_find_previous((VteTerminal *)vte);
    return false;
}
Beispiel #2
0
static void
update_regex (IdeTerminalSearch *self)
{
  const char *search_text;
  gboolean caseless;
  g_autofree gchar *pattern = NULL;
  g_autoptr(GError) error = NULL;

  g_assert (IDE_IS_TERMINAL_SEARCH (self));

  search_text = gtk_entry_get_text (GTK_ENTRY (self->search_entry));
  caseless = !gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->match_case_checkbutton));

  if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->regex_checkbutton)))
    pattern = g_strdup (search_text);
  else
    pattern = g_regex_escape_string (search_text, -1);

  if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->entire_word_checkbutton)))
    {
      char *new_pattern;
      new_pattern = g_strdup_printf ("\\b%s\\b", pattern);
      g_free (pattern);
      pattern = new_pattern;
    }

  if (self->regex_caseless == caseless &&
      g_strcmp0 (self->regex_pattern, pattern) == 0)
    return;

  if (self->regex)
    {
      vte_regex_unref (self->regex);
    }

  g_clear_pointer (&self->regex_pattern, g_free);

  if (search_text[0] != '\0')
    {
      guint32 compile_flags;

      compile_flags = PCRE2_UTF | PCRE2_NO_UTF_CHECK | PCRE2_MULTILINE;
      if (caseless)
        compile_flags |= PCRE2_CASELESS;

      self->regex = vte_regex_new_for_search (pattern, -1, compile_flags, &error);

      if (self->regex != NULL)
        self->regex_pattern = g_steal_pointer (&pattern);
    }
  else
    self->regex = NULL;

  update_sensitivity (self);

  g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_REGEX]);
}