Esempio n. 1
0
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;
}
Esempio n. 2
0
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);
}
Esempio n. 3
0
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;
}
Esempio n. 4
0
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;
}
Esempio n. 5
0
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;
    }
}
Esempio n. 6
0
/* 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;
}
Esempio n. 7
0
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;
}
Esempio n. 8
0
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;
}
Esempio n. 9
0
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;
}
Esempio n. 10
0
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;
}