gboolean termit_on_popup(GtkWidget *widget, GdkEvent *event) { if (event->type != GDK_BUTTON_PRESS) return FALSE; GdkEventButton *event_button = (GdkEventButton *) event; if (event_button->button == 3) { GtkMenu *menu = GTK_MENU(termit.menu); gtk_menu_popup (menu, NULL, NULL, NULL, NULL, event_button->button, event_button->time); return TRUE; } else if (event_button->button == 1) { gint page = gtk_notebook_get_current_page(GTK_NOTEBOOK(termit.notebook)); TERMIT_GET_TAB_BY_INDEX2(pTab, page, FALSE); char* matchedText = NULL; int matchTag = termit_cursor_under_match(event_button, &matchedText); if (!matchedText) return FALSE; struct Match* match = get_match_by_tag(pTab->matches, matchTag); if (!match) { g_free(matchedText); return FALSE; } TRACE("tag=%d match=[%s]", matchTag, match->pattern); termit_lua_domatch(match->lua_callback, matchedText); g_free(matchedText); } return FALSE; }
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; }
gchar* termit_get_selection() { gint page = gtk_notebook_get_current_page(GTK_NOTEBOOK(termit.notebook)); TERMIT_GET_TAB_BY_INDEX2(pTab, page, NULL); if (vte_terminal_get_has_selection(VTE_TERMINAL(pTab->vte)) == FALSE) { return NULL; } GtkClipboard* clip = gtk_clipboard_get(GDK_SELECTION_PRIMARY); gchar* text = NULL; gtk_clipboard_request_text(clip, clipboard_received_text, &text); if (!text) return NULL; return text; }