gboolean cterm_onclick(GtkWidget* w, GdkEventButton* e, gpointer data) { CTerm* term = (CTerm*) data; char* match = NULL; VteTerminal* vte = cterm_get_current_vte(term); GtkBorder* inner_border; glong col, row; int char_width, char_height; int tag; if(e->type == GDK_BUTTON_PRESS && e->button == 3) { cterm_run_external(term); } else if(e->type == GDK_2BUTTON_PRESS && e->button == 1) { char_width = vte_terminal_get_char_width(VTE_TERMINAL(vte)); char_height = vte_terminal_get_char_height(VTE_TERMINAL(vte)); gtk_widget_style_get(GTK_WIDGET(vte), "inner-border", &inner_border, NULL); row = (e->y - (inner_border ? inner_border->top : 0)) / char_height; col = (e->x - (inner_border ? inner_border->left : 0)) / char_width; gtk_border_free(inner_border); match = vte_terminal_match_check(vte, col, row, &tag); if(match != NULL) { cterm_open_url(term, match); free(match); } } return FALSE; }
static char *check_match(VteTerminal *vte, int event_x, int event_y) { int xpad, ypad, tag; get_vte_padding(vte, &xpad, &ypad); return vte_terminal_match_check(vte, (event_x - ypad) / vte_terminal_get_char_width(vte), (event_y - ypad) / vte_terminal_get_char_height(vte), &tag); }
static int termit_cursor_under_match(const GdkEventButton* ev, char** matchedText) { gint page = gtk_notebook_get_current_page(GTK_NOTEBOOK(termit.notebook)); TERMIT_GET_TAB_BY_INDEX2(pTab, page, -1); glong column = ((glong) (ev->x) / vte_terminal_get_char_width(VTE_TERMINAL(pTab->vte))); glong row = ((glong) (ev->y) / vte_terminal_get_char_height(VTE_TERMINAL(pTab->vte))); int tag = -1; *matchedText = vte_terminal_match_check(VTE_TERMINAL(pTab->vte), column, row, &tag); TRACE("column=%ld row=%ld matchedText=[%s] tag=%d", column, row, *matchedText, tag); return tag; }
static gboolean termomix_button_press(GtkWidget *widget, GdkEventButton *button_event, gpointer user_data) { glong column, row; gint tag; if (button_event->type != GDK_BUTTON_PRESS) return FALSE; /* Get the column and row relative to pointer position */ column = ((glong) (button_event->x) / vte_terminal_get_char_width( VTE_TERMINAL(termomix.term->vte))); row = ((glong) (button_event->y) / vte_terminal_get_char_height( VTE_TERMINAL(termomix.term->vte))); termomix.current_match = vte_terminal_match_check( VTE_TERMINAL(termomix.term->vte), column, row, &tag); /* Left button: open the URL if any */ if (button_event->button == 1 && ((button_event->state & termomix.open_url_accelerator) == termomix.open_url_accelerator) && termomix.current_match) { termomix_open_url(NULL, NULL); return TRUE; } /* Right button: show the popup menu */ if (button_event->button == 3) { GtkMenu *menu; menu = GTK_MENU (widget); if (termomix.current_match) { /* Show the extra options in the menu */ gtk_widget_show(termomix.item_open_link); gtk_widget_show(termomix.item_copy_link); gtk_widget_show(termomix.open_link_separator); } else { /* Hide all the options */ gtk_widget_hide(termomix.item_open_link); gtk_widget_hide(termomix.item_copy_link); gtk_widget_hide(termomix.open_link_separator); } gtk_menu_popup (menu, NULL, NULL, NULL, NULL, button_event->button, button_event->time); return TRUE; } return FALSE; }
static VALUE rg_match_check(VALUE self, VALUE column, VALUE row) { char *string; int tag; string = vte_terminal_match_check(_SELF(self), NUM2LONG(column), NUM2LONG(row), &tag); if (string) { VALUE rb_string; rb_string = CSTR2RVAL(string); free(string); return rb_ary_new3(2, rb_string, INT2NUM(tag)); } else { return Qnil; } }
/* button event handler */ gboolean event_button(GtkWidget *widget, GdkEventButton *button_event) { int ret = 0; gchar *match; if(button_event->button == 1) { match = vte_terminal_match_check(VTE_TERMINAL(widget), button_event->x / vte_terminal_get_char_width (VTE_TERMINAL (widget)), button_event->y / vte_terminal_get_char_height (VTE_TERMINAL (widget)), &ret); if (match) { launch_url(match); return TRUE; } } return FALSE; }
static CursorMatch term_cursor_match_pattern(GdkEventButton* event) { int tag = -1; gint page = gtk_notebook_get_current_page(GTK_NOTEBOOK(tabbar)); GList *children = gtk_container_get_children(GTK_CONTAINER(gtk_notebook_get_nth_page(GTK_NOTEBOOK(tabbar), page))); GtkWidget *vte = GTK_WIDGET(children->data); glong column = ((glong) (event->x) / vte_terminal_get_char_width(VTE_TERMINAL(vte))); glong row = ((glong) (event->y) / vte_terminal_get_char_height(VTE_TERMINAL(vte))); char* current_match = vte_terminal_match_check(VTE_TERMINAL(vte), column, row, &tag); CursorMatch match; match.tag = tag; match.text = current_match; return match; }
static int button_pressed(GtkWidget *widget, GdkEventButton *event, gpointer data) { VteTerminal *terminal; char *match; int tag; GtkBorder *inner_border; int char_width, char_height; switch (event->button) { case 3: terminal = VTE_TERMINAL(widget); gtk_widget_style_get (widget, "inner-border", &inner_border, NULL); char_width = vte_terminal_get_char_width (terminal); char_height = vte_terminal_get_char_height (terminal); match = vte_terminal_match_check(terminal, (event->x - (inner_border ? inner_border->left : 0)) / char_width, (event->y - (inner_border ? inner_border->top : 0)) / char_height, &tag); gtk_border_free (inner_border); 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); } } break; case 1: case 2: default: break; } return FALSE; }
static gboolean term_mouse_button_released (VteTerminal *vtterm, GdkEventButton *event, gpointer userdata) { g_free (last_match_text); last_match_text = NULL; glong row = (glong) (event->y) / vte_terminal_get_char_height (vtterm); glong col = (glong) (event->x) / vte_terminal_get_char_width (vtterm); gint match_tag; dg_lmem gchar* match = vte_terminal_match_check (vtterm, col, row, &match_tag); if (match && event->button == 1) { if (CHECK_FLAGS (event->state, GDK_CONTROL_MASK)) { dg_lerr GError *gerror = NULL; if (!gtk_show_uri (NULL, match, event->time, &gerror)) g_printerr ("Could not open URL: %s\n", gerror->message); return FALSE; } else if (g_regex_match (image_regex, match, 0, NULL)) { /* Show picture in a popover */ GdkRectangle rect; rect.height = vte_terminal_get_char_height (vtterm); rect.width = vte_terminal_get_char_width (vtterm); rect.y = rect.height * row; rect.x = rect.width * col; GtkWidget* popover = make_popover_for_image_url (vtterm, match); gtk_popover_set_pointing_to (GTK_POPOVER (popover), &rect); return FALSE; } } if (event->button == 3 && userdata != NULL) { GdkRectangle rect; rect.height = vte_terminal_get_char_height (vtterm); rect.width = vte_terminal_get_char_width (vtterm); rect.y = rect.height * row; rect.x = rect.width * col; gtk_popover_set_pointing_to (GTK_POPOVER (userdata), &rect); GActionMap *actions = G_ACTION_MAP (gtk_widget_get_ancestor (GTK_WIDGET (vtterm), GTK_TYPE_WINDOW)); g_simple_action_set_enabled (G_SIMPLE_ACTION (g_action_map_lookup_action (actions, "copy")), vte_terminal_get_has_selection (vtterm)); g_simple_action_set_enabled (G_SIMPLE_ACTION (g_action_map_lookup_action (actions, "open-url")), match != NULL); g_simple_action_set_enabled (G_SIMPLE_ACTION (g_action_map_lookup_action (actions, "copy-url")), match != NULL); if (match) { last_match_text = match; match = NULL; } gtk_widget_show_all (GTK_WIDGET (userdata)); return TRUE; } return FALSE; }
static int button_press_cb (GtkWidget *widget, GdkEventButton *event, gpointer data) { DEBUG_FUNCTION ("button_press_cb"); DEBUG_ASSERT (data != NULL); VteTerminal *terminal; tilda_term *tt; gchar *match; gint tag; gint xpad, ypad; gchar *cmd; gchar *web_browser_cmd; gboolean ret = FALSE; tt = TILDA_TERM(data); switch (event->button) { case 3: /* Right Click */ popup_menu (tt->tw, tt); break; case 2: /* Middle Click */ break; case 1: /* Left Click */ terminal = VTE_TERMINAL(tt->vte_term); GtkBorder border; gtk_widget_style_get (GTK_WIDGET (terminal), "inner-border", &border, NULL); xpad = border.left; ypad = border.bottom; match = vte_terminal_match_check (terminal, (event->x - ypad) / vte_terminal_get_char_width (terminal), (event->y - ypad) / vte_terminal_get_char_height (terminal), &tag); /* Check if we can launch a web browser, and do so if possible */ if ((event->state & GDK_CONTROL_MASK) && match != NULL) { #if DEBUG g_print ("Got a Ctrl+Left Click -- Matched: `%s' (%d)\n", match, tag); #endif web_browser_cmd = g_strescape (config_getstr ("web_browser"), NULL); cmd = g_strdup_printf ("%s %s", web_browser_cmd, match); #if DEBUG g_print ("Launching command: `%s'\n", cmd); #endif ret = g_spawn_command_line_async(cmd, NULL); /* Check that the command launched */ if (!ret) { g_printerr (_("Failed to launch the web browser. The command was `%s'\n"), cmd); TILDA_PERROR (); } g_free (cmd); } /* Always free match if it is non NULL */ if (match) g_free (match); break; default: break; } return FALSE; }