gboolean sig_button_press(GtkWidget *widget, GdkEvent *event, gpointer data) { GtkClipboard *clip = NULL; char *url = NULL; (void)data; if (event->type == GDK_BUTTON_PRESS) { if (((GdkEventButton *)event)->button == 3) { clip = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD); url = vte_terminal_match_check_event(VTE_TERMINAL(widget), event, NULL); if (url != NULL) { if (clip != NULL) gtk_clipboard_set_text(clip, url, -1); g_free(url); } } } return FALSE; }
static void popup_targets_received (GtkClipboard *clipboard, GtkSelectionData *data, gpointer user_data) { PopupInfo *popup_info = user_data; g_autoptr(IdeTerminal) self = NULL; g_autoptr(GdkEvent) event = NULL; IdeTerminalPrivate *priv; g_assert (popup_info != NULL); g_assert (IDE_IS_TERMINAL (popup_info->terminal)); self = g_steal_pointer (&popup_info->terminal); priv = ide_terminal_get_instance_private (self); event = g_steal_pointer (&popup_info->event); if (gtk_widget_get_realized (GTK_WIDGET (self))) { DzlWidgetActionGroup *group; GMenu *menu; gboolean clipboard_contains_text; gboolean have_selection; clipboard_contains_text = gtk_selection_data_targets_include_text (data); have_selection = vte_terminal_get_has_selection (VTE_TERMINAL (self)); g_clear_pointer (&priv->popup_menu, gtk_widget_destroy); priv->url = vte_terminal_match_check_event (VTE_TERMINAL (self), event, NULL); menu = dzl_application_get_menu_by_id (DZL_APPLICATION_DEFAULT, "ide-terminal-view-popup-menu"); priv->popup_menu = gtk_menu_new_from_model (G_MENU_MODEL (menu)); group = DZL_WIDGET_ACTION_GROUP (gtk_widget_get_action_group (GTK_WIDGET (self), "terminal")); dzl_widget_action_group_set_action_enabled (group, "copy-link-address", priv->url != NULL); dzl_widget_action_group_set_action_enabled (group, "open-link", priv->url != NULL); dzl_widget_action_group_set_action_enabled (group, "copy-clipboard", have_selection); dzl_widget_action_group_set_action_enabled (group, "paste-clipboard", clipboard_contains_text); dzl_gtk_widget_add_style_class (priv->popup_menu, GTK_STYLE_CLASS_CONTEXT_MENU); gtk_menu_attach_to_widget (GTK_MENU (priv->popup_menu), GTK_WIDGET (self), popup_menu_detach); g_signal_emit (self, signals[POPULATE_POPUP], 0, priv->popup_menu); gtk_menu_popup_at_pointer (GTK_MENU (priv->popup_menu), event); } g_slice_free (PopupInfo, popup_info); }
gchar * germinal_terminal_get_url (GerminalTerminal *self, GdkEventButton *button_event) { GerminalTerminalPrivate *priv = germinal_terminal_get_instance_private (self); if (button_event) /* only access to cached url if no button_event available */ { g_clear_pointer (&priv->url, g_free); /* free previous url */ gint tag; /* avoid stupid vte segv (said to be optional) */ priv->url = vte_terminal_match_check_event (VTE_TERMINAL (self), (GdkEvent *) button_event, &tag); } return priv->url; }
gboolean Terminal::vte_click(GtkWidget *vte, GdkEvent *event, gpointer user_data) { GdkEventButton *button_event = (GdkEventButton *)event; if (button_event->button != 1 || !(button_event->state & GDK_CONTROL_MASK)) return FALSE; const char *url = vte_terminal_match_check_event(VTE_TERMINAL(vte), event, 0); if (!url) return FALSE; if (strcasestr(url, "http") != url) url = std::string(url).insert(0, "http://").c_str(); if (vfork() == 0) { execlp("xdg-open", "xdg-open", url, NULL); _exit(0); } }
static gboolean ide_terminal_button_press_event (GtkWidget *widget, GdkEventButton *button) { IdeTerminal *self = (IdeTerminal *)widget; g_assert (IDE_IS_TERMINAL (self)); g_assert (button != NULL); if ((button->type == GDK_BUTTON_PRESS) && (button->button == GDK_BUTTON_SECONDARY)) { if (!gtk_widget_has_focus (GTK_WIDGET (self))) gtk_widget_grab_focus (GTK_WIDGET (self)); ide_terminal_do_popup (self, (GdkEvent *)button); return GDK_EVENT_STOP; } else if ((button->type == GDK_BUTTON_PRESS) && (button->button == GDK_BUTTON_PRIMARY) && ((button->state & GDK_CONTROL_MASK) == GDK_CONTROL_MASK)) { g_autofree gchar *pattern = NULL; pattern = vte_terminal_match_check_event (VTE_TERMINAL (self), (GdkEvent *)button, NULL); if (pattern != NULL) { GtkApplication *app; GtkWindow *focused_window; if (NULL != (app = GTK_APPLICATION (g_application_get_default ())) && NULL != (focused_window = gtk_application_get_active_window (app))) gtk_show_uri_on_window (focused_window, pattern, gtk_get_current_event_time (), NULL); } return GDK_EVENT_STOP; } return GTK_WIDGET_CLASS (ide_terminal_parent_class)->button_press_event (widget, button); }
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; }