#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)
{
+ debug_enter ();
+ debug_assert (TILDA_IS_TERMINAL(tt));
+
gchar *object_path;
// Register this object with DBus
static gboolean
tilda_terminal_start_shell (TildaTerminal *tt)
{
+ debug_enter ();
+ debug_assert (TILDA_IS_TERMINAL(tt));
+
gint ret;
gint argc;
gchar **argv;
static void
tilda_terminal_child_exited_cb (GtkWidget *widget, gpointer data)
{
+ debug_enter ();
+ debug_assert (GTK_IS_WIDGET(widget));
+ debug_assert (TILDA_IS_TERMINAL(data));
+
TildaTerminal *self = TILDA_TERMINAL(data);
/* These can stay here. They don't need to go into a header because
static void
tilda_terminal_window_title_changed_cb (GtkWidget *widget, gpointer data)
{
+ debug_enter ();
+ debug_assert (GTK_IS_WIDGET(widget));
+ debug_assert (TILDA_IS_TERMINAL(data));
+
TildaTerminal *self = TILDA_TERMINAL(data);
TildaWindow *parent_window = TILDA_WINDOW(self->parent_window);
GtkWidget *label;
new_title = g_strdup_printf ("%s - %s", self->title, vte_title);
break;
- case NOT_DISPLAYED:
default:
- g_printerr (_("FIXME: Bad value of self->dynamic_title\n"));
+ debug_printf ("ERROR: Bad value of self->dynamic_title\n");
+ case NOT_DISPLAYED:
new_title = g_strdup(self->title);
break;
}
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)
+{
+ debug_enter ();
+ debug_assert (GTK_IS_WIDGET(widget));
+ debug_assert (TILDA_IS_TERMINAL(data));
+ debug_printf ("event->button = %d\n", event->button);
+
+ 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)
+ {
+ web_browser_cmd = g_strescape (self->web_browser, NULL);
+ cmd = g_strdup_printf ("%s %s", web_browser_cmd, match);
+
+ debug_printf ("Got a Ctrl+Left-Click -- match: '%s' tag: %d\n", match, tag);
+ debug_printf ("Launching command: '%s'\n", cmd);
+
+ 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. */
static void
tilda_terminal_set_transparent (TildaTerminal *self)
{
+ debug_enter ();
+ debug_assert (TILDA_IS_TERMINAL(self));
+
TildaWindow *parent_window = TILDA_WINDOW(self->parent_window);
gdouble temp;
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)
+{
+ debug_enter ();
+ debug_assert (TILDA_IS_TERMINAL(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;
+
+ default:
+ debug_printf ("ERROR: Bad scrollbar position\n");
+ case DISABLED:
+ gtk_widget_hide (self->scrollbar);
+ break;
+ }
+}
+
/*******************************************************************************
* All GObject stuff is below. You probably don't need to change this...
******************************************************************************/
TILDA_TERMINAL_FONT,
TILDA_TERMINAL_TITLE,
TILDA_TERMINAL_WORKING_DIRECTORY,
+ TILDA_TERMINAL_WEB_BROWSER,
TILDA_TERMINAL_SCROLLBACK_LINES,
TILDA_TERMINAL_TRANSPARENCY_PERCENT,
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,
tilda_terminal_instance_init (GTypeInstance *instance,
gpointer g_class)
{
+ debug_enter ();
+
TildaTerminal *self = (TildaTerminal *) instance;
/* Initialize instance members and allocate any necessary memory here.
case TILDA_TERMINAL_NUMBER:
self->number = g_value_get_int (value);
- g_print ("terminal number: %d\n", self->number);
+ debug_printf ("terminal number: %d\n", self->number);
break;
case TILDA_TERMINAL_WINDOW_NUMBER:
self->window_number = g_value_get_int (value);
- g_print ("terminal parent window number: %d\n", self->window_number);
+ debug_printf ("terminal parent window number: %d\n", self->window_number);
break;
case TILDA_TERMINAL_TW:
self->parent_window = g_value_get_pointer (value);
- g_print ("terminal parent window: 0x%x\n", self->parent_window);
- g_print ("terminal parent window number (direct): %d\n", TILDA_WINDOW(self->parent_window)->number);
+ debug_printf ("terminal parent window: 0x%x\n", self->parent_window);
break;
case TILDA_TERMINAL_BACKGROUND_IMAGE:
g_free (self->background_image);
self->background_image = g_value_dup_string (value);
vte_terminal_set_background_image_file (VTE_TERMINAL(self->vte_term), self->background_image);
- g_print ("terminal back img: %s\n", self->background_image);
+ debug_printf ("terminal back img: %s\n", self->background_image);
break;
case TILDA_TERMINAL_SHELL:
g_free (self->shell);
self->shell = g_value_dup_string (value);
tilda_terminal_start_shell (self);
- g_print ("terminal shell: %s\n", self->shell);
+ debug_printf ("terminal shell: %s\n", self->shell);
break;
case TILDA_TERMINAL_FONT:
vte_terminal_set_font_from_string_full (VTE_TERMINAL(self->vte_term),
self->font,
self->antialiased);
- g_print ("terminal font: %s\n", self->font);
+ debug_printf ("terminal font: %s\n", self->font);
break;
case TILDA_TERMINAL_TITLE:
g_free (self->title);
self->title = g_value_dup_string (value);
- g_print ("terminal title: %s\n", self->title);
+ debug_printf ("terminal title: %s\n", self->title);
break;
case TILDA_TERMINAL_WORKING_DIRECTORY:
g_free (self->working_directory);
self->working_directory = g_value_dup_string (value);
- g_print ("terminal wrk dir: %s\n", self->working_directory);
+ debug_printf ("terminal wrk dir: %s\n", self->working_directory);
+ break;
+
+ case TILDA_TERMINAL_WEB_BROWSER:
+ g_free (self->web_browser);
+ self->web_browser = g_value_dup_string (value);
+ debug_printf ("terminal web browser: %s\n", self->web_browser);
break;
case TILDA_TERMINAL_SCROLLBACK_LINES:
self->scrollback_lines = g_value_get_int (value);
vte_terminal_set_scrollback_lines (VTE_TERMINAL(self->vte_term), self->scrollback_lines);
- g_print ("terminal scrollback lines: %d\n", self->scrollback_lines);
+ debug_printf ("terminal scrollback lines: %d\n", self->scrollback_lines);
break;
case TILDA_TERMINAL_TRANSPARENCY_PERCENT:
self->transparency_percent = g_value_get_int (value);
tilda_terminal_set_transparent (self);
- g_print ("terminal transp percent: %d\n", self->transparency_percent);
+ debug_printf ("terminal transp percent: %d\n", self->transparency_percent);
break;
case TILDA_TERMINAL_BACKSPACE_BINDING:
self->backspace_binding = g_value_get_int (value);
vte_terminal_set_backspace_binding (VTE_TERMINAL(self->vte_term), self->backspace_binding);
- g_print ("terminal backspace key: %d\n", self->backspace_binding);
+ debug_printf ("terminal backspace key: %d\n", self->backspace_binding);
break;
case TILDA_TERMINAL_DELETE_BINDING:
self->delete_binding = g_value_get_int (value);
vte_terminal_set_delete_binding (VTE_TERMINAL(self->vte_term), self->delete_binding);
- g_print ("terminal delete key: %d\n", self->delete_binding);
+ debug_printf ("terminal delete key: %d\n", self->delete_binding);
break;
case TILDA_TERMINAL_DYNAMIC_TITLE:
self->dynamic_title = g_value_get_int (value);
- g_print ("terminal dynamic title: %d\n", self->dynamic_title);
+ debug_printf ("terminal dynamic title: %d\n", self->dynamic_title);
break;
case TILDA_TERMINAL_EXIT_ACTION:
self->exit_action = g_value_get_int (value);
- g_print ("terminal exit action: %d\n", self->exit_action);
+ debug_printf ("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);
+ debug_printf ("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);
- g_print ("terminal scroll background: %d\n", self->scroll_background);
+ debug_printf ("terminal scroll background: %d\n", self->scroll_background);
break;
case TILDA_TERMINAL_SCROLL_ON_OUTPUT:
self->scroll_on_output = g_value_get_boolean (value);
vte_terminal_set_scroll_on_output (VTE_TERMINAL(self->vte_term), self->scroll_on_output);
- g_print ("terminal scroll on output: %d\n", self->scroll_on_output);
+ debug_printf ("terminal scroll on output: %d\n", self->scroll_on_output);
break;
case TILDA_TERMINAL_SCROLL_ON_KEYSTROKE:
self->scroll_on_keystroke = g_value_get_boolean (value);
vte_terminal_set_scroll_on_keystroke (VTE_TERMINAL(self->vte_term), self->scroll_on_keystroke);
- g_print ("terminal scroll on keystroke: %d\n", self->scroll_on_keystroke);
+ debug_printf ("terminal scroll on keystroke: %d\n", self->scroll_on_keystroke);
break;
case TILDA_TERMINAL_ANTIALIASED:
vte_terminal_set_font_from_string_full (VTE_TERMINAL(self->vte_term),
self->font,
self->antialiased);
- g_print ("terminal antialiased: %d\n", self->antialiased);
+ debug_printf ("terminal antialiased: %d\n", self->antialiased);
break;
case TILDA_TERMINAL_ALLOW_BOLD_TEXT:
self->allow_bold_text = g_value_get_boolean (value);
vte_terminal_set_allow_bold (VTE_TERMINAL(self->vte_term), self->allow_bold_text);
- g_print ("terminal allow bold text: %d\n", self->allow_bold_text);
+ debug_printf ("terminal allow bold text: %d\n", self->allow_bold_text);
break;
case TILDA_TERMINAL_CURSOR_BLINKS:
self->cursor_blinks = g_value_get_boolean (value);
vte_terminal_set_cursor_blinks (VTE_TERMINAL(self->vte_term), self->cursor_blinks);
- g_print ("terminal cursor blinks: %d\n", self->cursor_blinks);
+ debug_printf ("terminal cursor blinks: %d\n", self->cursor_blinks);
break;
case TILDA_TERMINAL_AUDIBLE_BELL:
self->audible_bell = g_value_get_boolean (value);
vte_terminal_set_audible_bell (VTE_TERMINAL(self->vte_term), self->audible_bell);
- g_print ("terminal audible bell: %d\n", self->audible_bell);
+ debug_printf ("terminal audible bell: %d\n", self->audible_bell);
break;
case TILDA_TERMINAL_VISIBLE_BELL:
self->visible_bell = g_value_get_boolean (value);
vte_terminal_set_visible_bell (VTE_TERMINAL(self->vte_term), self->visible_bell);
- g_print ("terminal visible bell: %d\n", self->visible_bell);
+ debug_printf ("terminal visible bell: %d\n", self->visible_bell);
break;
case TILDA_TERMINAL_DOUBLE_BUFFERED:
self->double_buffered = g_value_get_boolean (value);
gtk_widget_set_double_buffered (GTK_WIDGET(self->vte_term), self->double_buffered);
- g_print ("terminal double buffered: %d\n", self->double_buffered);
+ debug_printf ("terminal double buffered: %d\n", self->double_buffered);
break;
case TILDA_TERMINAL_MOUSE_AUTOHIDE:
self->mouse_autohide = g_value_get_boolean (value);
vte_terminal_set_mouse_autohide (VTE_TERMINAL(self->vte_term), self->mouse_autohide);
- g_print ("terminal mouse autohide: %d\n", self->mouse_autohide);
+ debug_printf ("terminal mouse autohide: %d\n", self->mouse_autohide);
break;
default:
g_value_set_string (value, self->working_directory);
break;
+ case TILDA_TERMINAL_WEB_BROWSER:
+ g_value_set_string (value, self->web_browser);
+ break;
+
case TILDA_TERMINAL_SCROLLBACK_LINES:
g_value_set_int (value, self->scrollback_lines);
break;
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;
guint n_construct_properties,
GObjectConstructParam *construct_properties)
{
+ debug_enter ();
+
GObject *obj;
TildaTerminal *self;
+ gint ret;
/* Invoke parent constructor */
TildaTerminalClass *klass;
gtk_box_pack_end (GTK_BOX(self->hbox), self->scrollbar, FALSE, FALSE, 0);
gtk_box_pack_end (GTK_BOX(self->hbox), self->vte_term, TRUE, TRUE, 0);
gtk_widget_show (self->scrollbar);
+ gtk_widget_show (self->vte_term);
+ gtk_widget_show (self->hbox);
+ /* 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",
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);
static void
tilda_terminal_dispose (GObject *obj)
{
+ debug_enter ();
+
TildaTerminal *self = (TildaTerminal *) obj;
/* We don't want to run dispose twice, so just return immediately */
static void
tilda_terminal_finalize (GObject *obj)
{
+ debug_enter ();
+
TildaTerminal *self = (TildaTerminal *) obj;
/*
tilda_terminal_class_init (gpointer g_class,
gpointer g_class_data)
{
+ debug_enter ();
+
GObjectClass *gobject_class = G_OBJECT_CLASS (g_class);
TildaTerminalClass *klass = TILDA_TERMINAL_CLASS (g_class);
GParamSpec *pspec;
TILDA_TERMINAL_WORKING_DIRECTORY,
pspec);
+ pspec = g_param_spec_string ("web-browser",
+ "Terminal's web browser command",
+ NULL,
+ NULL,
+ G_PARAM_READWRITE);
+
+ g_object_class_install_property (gobject_class,
+ TILDA_TERMINAL_WEB_BROWSER,
+ pspec);
+
pspec = g_param_spec_int ("scrollback-lines",
"Terminal's scrollback amount (lines)",
"Get/Set terminal's scrollback amount",
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",