X-Git-Url: https://irasnyder.com/gitweb/?a=blobdiff_plain;f=tilda-terminal.c;h=c765eca2762f506fd5624ef2bdff398a5c79978d;hb=f700382da8724c1c3cd0b6fa898129605255a91a;hp=78a91bff2c10b5c418720f6121dc64bfe68d44af;hpb=1b68d0c264c4cd5fb5c4bd68ff4dc829f98baa78;p=tilda-gobject.git diff --git a/tilda-terminal.c b/tilda-terminal.c index 78a91bf..c765eca 100644 --- a/tilda-terminal.c +++ b/tilda-terminal.c @@ -7,6 +7,10 @@ #define _(X) X #define N_(X) X +#define DINGUS1 "(((news|telnet|nttp|file|http|ftp|https)://)|(www|ftp)[-A-Za-z0-9]*\\.)[-A-Za-z0-9\\.]+(:[0-9]*)?" +#define DINGUS2 "(((news|telnet|nttp|file|http|ftp|https)://)|(www|ftp)[-A-Za-z0-9]*\\.)[-A-Za-z0-9\\.]+(:[0-9]*)?/[-A-Za-z0-9_\\$\\.\\+\\!\\*\\(\\),;:@&=\\?/~\\#\\%]*[^]'\\.}>\\) ,\\\"]" + + static void tilda_terminal_dbus_register_object (TildaTerminal *tt) { @@ -175,6 +179,76 @@ tilda_terminal_window_title_changed_cb (GtkWidget *widget, gpointer data) g_free (new_title); } +/** + * Gets called whenever there is a button-press event in the VteTerminal. It + * is used to open the user's web browser, for example. + */ +static gint +tilda_terminal_button_press_cb (GtkWidget *widget, + GdkEventButton *event, + gpointer data) +{ + GError *error = NULL; + TildaTerminal *self = TILDA_TERMINAL(data); + VteTerminal *terminal = VTE_TERMINAL(self->vte_term); + gint tag, xpad, ypad; + gchar *match, *cmd, *web_browser_cmd; + gboolean ret = FALSE; + + switch (event->button) + { + case 3: /* Right Click */ + // FIXME: need to add this + //popup_menu (tt->tw, tt); + g_print ("FIXME: popup_menu() here\n"); + break; + + case 2: /* Middle Click */ + break; + + case 1: /* Left Click */ + vte_terminal_get_padding (terminal, &xpad, &ypad); + match = vte_terminal_match_check (terminal, + (event->x - ypad) / terminal->char_width, + (event->y - ypad) / terminal->char_height, + &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 (self->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, &error); + + /* Check that the command launched */ + if (!ret) + { + g_printerr (_("Failed to launch web browser command: `%s'\n"), cmd); + g_printerr (_("Error message: %s\n"), error->message); + } + + /* Free allocated memory */ + g_free (web_browser_cmd); + g_free (cmd); + } + + /* Always free match if it is non NULL */ + g_free (match); + break; + + default: + break; + } + + return FALSE; +} + /** * Set the given TildaTerminal to the appropriate transparency level * based on the self->transparency_percent member. */ @@ -204,6 +278,33 @@ tilda_terminal_set_transparent (TildaTerminal *self) vte_terminal_set_background_transparent (VTE_TERMINAL(self->vte_term), FALSE); } +/** + * Set the scrollbar position of the given TildaTerminal to + * the value in self->scrollbar_position. + */ +static void +tilda_terminal_set_scrollbar_position (TildaTerminal *self) +{ + enum scrollbar_positions { DISABLED, LEFT, RIGHT }; + switch (self->scrollbar_position) + { + case LEFT: + gtk_box_reorder_child (GTK_BOX(self->hbox), self->scrollbar, 0); + gtk_widget_show (self->scrollbar); + break; + + case RIGHT: + gtk_box_reorder_child (GTK_BOX(self->hbox), self->scrollbar, 1); + gtk_widget_show (self->scrollbar); + break; + + case DISABLED: + default: + gtk_widget_hide (self->scrollbar); + break; + } +} + /******************************************************************************* * All GObject stuff is below. You probably don't need to change this... ******************************************************************************/ @@ -230,6 +331,7 @@ enum tilda_terminal_properties { TILDA_TERMINAL_DELETE_BINDING, TILDA_TERMINAL_DYNAMIC_TITLE, TILDA_TERMINAL_EXIT_ACTION, + TILDA_TERMINAL_SCROLLBAR_POSITION, TILDA_TERMINAL_SCROLL_BACKGROUND, TILDA_TERMINAL_SCROLL_ON_OUTPUT, @@ -360,6 +462,12 @@ tilda_terminal_set_property (GObject *object, g_print ("terminal exit action: %d\n", self->exit_action); break; + case TILDA_TERMINAL_SCROLLBAR_POSITION: + self->scrollbar_position = g_value_get_int (value); + tilda_terminal_set_scrollbar_position (self); + g_print ("terminal scrollbar position: %d\n", self->scrollbar_position); + break; + case TILDA_TERMINAL_SCROLL_BACKGROUND: self->scroll_background = g_value_get_boolean (value); vte_terminal_set_scroll_background (VTE_TERMINAL(self->vte_term), self->scroll_background); @@ -499,6 +607,10 @@ tilda_terminal_get_property (GObject *object, g_value_set_int (value, self->exit_action); break; + case TILDA_TERMINAL_SCROLLBAR_POSITION: + g_value_set_int (value, self->scrollbar_position); + break; + case TILDA_TERMINAL_SCROLL_BACKGROUND: g_value_set_boolean (value, self->scroll_background); break; @@ -552,6 +664,7 @@ tilda_terminal_constructor (GType type, { GObject *obj; TildaTerminal *self; + gint ret; /* Invoke parent constructor */ TildaTerminalClass *klass; @@ -571,6 +684,11 @@ tilda_terminal_constructor (GType type, gtk_box_pack_end (GTK_BOX(self->hbox), self->vte_term, TRUE, TRUE, 0); gtk_widget_show (self->scrollbar); + /* Match URL's, etc */ + ret = vte_terminal_match_add (VTE_TERMINAL(self->vte_term), DINGUS1); + vte_terminal_match_set_cursor_type (VTE_TERMINAL(self->vte_term), ret, GDK_HAND2); + ret = vte_terminal_match_add(VTE_TERMINAL(self->vte_term), DINGUS2); + vte_terminal_match_set_cursor_type (VTE_TERMINAL(self->vte_term), ret, GDK_HAND2); /* Connect Signals */ g_signal_connect (G_OBJECT(self->vte_term), "child-exited", @@ -579,6 +697,8 @@ tilda_terminal_constructor (GType type, G_CALLBACK(tilda_terminal_child_exited_cb), self); g_signal_connect (G_OBJECT(self->vte_term), "window-title-changed", G_CALLBACK(tilda_terminal_window_title_changed_cb), self); + g_signal_connect (G_OBJECT(self->vte_term), "button-press-event", + G_CALLBACK(tilda_terminal_button_press_cb), self); tilda_terminal_start_shell (self); tilda_terminal_dbus_register_object (self); @@ -816,6 +936,18 @@ tilda_terminal_class_init (gpointer g_class, TILDA_TERMINAL_EXIT_ACTION, pspec); + pspec = g_param_spec_int ("scrollbar-position", + "Terminal's scrollbar position", + NULL, + 0, + INT_MAX, + 0, + G_PARAM_READWRITE); + + g_object_class_install_property (gobject_class, + TILDA_TERMINAL_SCROLLBAR_POSITION, + pspec); + pspec = g_param_spec_boolean ("scroll-background", "Controls terminal's scrolling behavior", "Get/Set terminal's scrolling behavior",