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]); }
gboolean setup_term(GtkWidget *win, GtkWidget *term, struct term_options *to) { static char *args_default[] = { NULL, NULL, NULL }; char **args_use; size_t i; GdkRGBA c_foreground_gdk; GdkRGBA c_background_gdk; GdkRGBA c_palette_gdk[16]; GdkRGBA c_gdk; VteRegex *url_vregex = NULL; GError *err = NULL; GSpawnFlags spawn_flags; if (to->argv != NULL) { args_use = to->argv; spawn_flags = G_SPAWN_SEARCH_PATH; } else { if (args_default[0] == NULL) { args_default[0] = vte_get_user_shell(); if (args_default[0] == NULL) args_default[0] = "/bin/sh"; if (login_shell) args_default[1] = g_strdup_printf("-%s", args_default[0]); else args_default[1] = args_default[0]; } args_use = args_default; spawn_flags = G_SPAWN_SEARCH_PATH | G_SPAWN_FILE_AND_ARGV_ZERO; } /* Appearance. */ term_set_font(NULL, VTE_TERMINAL(term), 0); gtk_widget_show_all(win); vte_terminal_set_allow_bold(VTE_TERMINAL(term), enable_bold); vte_terminal_set_cursor_blink_mode(VTE_TERMINAL(term), VTE_CURSOR_BLINK_OFF); vte_terminal_set_geometry_hints_for_window(VTE_TERMINAL(term), GTK_WINDOW(win)); vte_terminal_set_mouse_autohide(VTE_TERMINAL(term), TRUE); vte_terminal_set_scrollback_lines(VTE_TERMINAL(term), scrollback_lines); gdk_rgba_parse(&c_foreground_gdk, c_foreground); gdk_rgba_parse(&c_background_gdk, c_background); for (i = 0; i < 16; i++) gdk_rgba_parse(&c_palette_gdk[i], c_palette[i]); vte_terminal_set_colors(VTE_TERMINAL(term), &c_foreground_gdk, &c_background_gdk, c_palette_gdk, 16); if (c_bold != NULL) { gdk_rgba_parse(&c_gdk, c_bold); vte_terminal_set_color_bold(VTE_TERMINAL(term), &c_gdk); } if (c_cursor != NULL) { gdk_rgba_parse(&c_gdk, c_cursor); vte_terminal_set_color_cursor(VTE_TERMINAL(term), &c_gdk); } if (c_cursor_foreground != NULL) { gdk_rgba_parse(&c_gdk, c_cursor_foreground); vte_terminal_set_color_cursor_foreground(VTE_TERMINAL(term), &c_gdk); } url_vregex = vte_regex_new_for_match(url_regex, strlen(url_regex), PCRE2_MULTILINE | PCRE2_CASELESS, &err); if (url_vregex == NULL) fprintf(stderr, "url_regex: %s\n", err == NULL ? "<err is NULL>" : err->message); else { vte_terminal_match_add_regex(VTE_TERMINAL(term), url_vregex, 0); vte_regex_unref(url_vregex); } /* Signals. */ g_signal_connect(G_OBJECT(term), "bell", G_CALLBACK(sig_bell), win); g_signal_connect(G_OBJECT(term), "button-press-event", G_CALLBACK(sig_button_press), NULL); if (!to->hold) g_signal_connect(G_OBJECT(term), "child-exited", G_CALLBACK(sig_child_exited), win); g_signal_connect(G_OBJECT(term), "decrease-font-size", G_CALLBACK(sig_decrease_font_size), win); g_signal_connect(G_OBJECT(term), "increase-font-size", G_CALLBACK(sig_increase_font_size), win); g_signal_connect(G_OBJECT(term), "key-press-event", G_CALLBACK(sig_key_press), win); g_signal_connect(G_OBJECT(term), "resize-window", G_CALLBACK(sig_window_resize), win); g_signal_connect(G_OBJECT(term), "window-title-changed", G_CALLBACK(sig_window_title_changed), win); /* Spawn child. */ return vte_terminal_spawn_sync(VTE_TERMINAL(term), VTE_PTY_DEFAULT, to->cwd, args_use, NULL, spawn_flags, NULL, NULL, NULL, NULL, NULL); }
static int button_pressed(GtkWidget *widget, GdkEventButton *event, gpointer data) { VteTerminal *terminal; char *match; int tag; GtkBorder padding; gboolean has_extra_match; char *extra_match = NULL; switch (event->button) { case 3: terminal = VTE_TERMINAL(widget); gtk_style_context_get_padding(gtk_widget_get_style_context(widget), gtk_widget_get_state_flags(widget), &padding); match = vte_terminal_match_check_event(terminal, (GdkEvent*)event, &tag); if (match != NULL) { g_print("Matched `%s' (%d).\n", match, tag); g_free(match); if (GPOINTER_TO_INT(data) != 0) { vte_terminal_match_remove(terminal, tag); } } #ifdef WITH_PCRE2 if (!use_gregex) { VteRegex *regex = vte_regex_new("\\d+", -1, PCRE2_UTF, NULL); has_extra_match = vte_terminal_event_check_regex_simple(terminal, (GdkEvent*)event, ®ex, 1, 0, &extra_match); vte_regex_unref(regex); } else #endif { GRegex *regex = g_regex_new("\\d+", 0, 0, NULL); has_extra_match = vte_terminal_event_check_gregex_simple(terminal, (GdkEvent*)event, ®ex, 1, 0, &extra_match); g_regex_unref(regex); } if (has_extra_match) g_print("Extra regex match: %s\n", extra_match); else g_print("Extra regex didn't match\n"); g_free(extra_match); break; case 1: case 2: default: break; } return FALSE; }