#include "tilda.h"
#include "tilda-terminal.h"
+#include "tilda-config.h"
#include "tilda-terminal-dbus-glue.h"
+#include <stdlib.h>
+
+#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_\\$\\.\\+\\!\\*\\(\\),;:@&=\\?/~\\#\\%]*[^]'\\.}>\\) ,\\\"]"
+
+/*******************************************************************************
+ * All popup-menu code is below
+ ******************************************************************************/
+
+static void
+menu_add_term_cb (GtkWidget *widget, gpointer data)
+{
+ debug_enter ();
+ debug_assert (TILDA_IS_TERMINAL(data));
+
+ TildaTerminal *self = TILDA_TERMINAL(data);
+ TildaWindow *parent_window = TILDA_WINDOW(self->parent_window);
+
+ tilda_window_add_terminal (parent_window);
+}
+
+static void
+menu_remove_term_cb (GtkWidget *widget, gpointer data)
+{
+ debug_enter ();
+ debug_assert (TILDA_IS_TERMINAL(data));
+
+ TildaTerminal *self = TILDA_TERMINAL(data);
+ TildaWindow *parent_window = TILDA_WINDOW(self->parent_window);
+
+ tilda_window_remove_terminal (parent_window, self->number);
+}
+
+static void
+menu_copy_cb (GtkWidget *widget, gpointer data)
+{
+ debug_enter ();
+ debug_assert (TILDA_IS_TERMINAL(data));
+
+ TildaTerminal *self = TILDA_TERMINAL(data);
+
+ vte_terminal_copy_clipboard (VTE_TERMINAL(self->vte_term));
+}
+
+static void
+menu_paste_cb (GtkWidget *widget, gpointer data)
+{
+ debug_enter ();
+ debug_assert (TILDA_IS_TERMINAL(data));
+
+ TildaTerminal *self = TILDA_TERMINAL(data);
+
+ vte_terminal_paste_clipboard (VTE_TERMINAL(self->vte_term));
+}
+
+static void
+menu_preferences_cb (GtkWidget *widget, gpointer data)
+{
+ debug_enter ();
+ debug_assert (TILDA_IS_TERMINAL(data));
+
+ TildaTerminal *self = TILDA_TERMINAL(data);
+ TildaWindow *parent_window = TILDA_WINDOW(self->parent_window);
+
+ /* TODO:
+ *
+ * Note that this lends interesting possibilities for the tilda-wizard
+ * command line interface. Maybe a --window --terminal option, which will
+ * auto-set the preferences to a current window and term :) Neat.
+ */
+
+ g_print ("FIXME: show wizard here\n");
+}
+
+static void
+menu_quit_cb (GtkWidget *widget, gpointer data)
+{
+ debug_enter ();
+ debug_assert (TILDA_IS_TERMINAL(data));
+
+ TildaTerminal *self = TILDA_TERMINAL(data);
+ TildaWindow *parent_window = TILDA_WINDOW(self->parent_window);
+ TildaController *controller = TILDA_CONTROLLER(parent_window->controller);
+
+ tilda_controller_remove_window (controller, parent_window->number);
+}
+
+static void
+tilda_terminal_popup_menu (TildaTerminal *self)
+{
+ debug_enter ();
+ debug_assert (TILDA_IS_TERMINAL(self));
+
+ GtkAction *action;
+ GtkActionGroup *action_group;
+ GtkUIManager *ui_manager;
+ GError *error = NULL;
+ GtkWidget *menu;
+
+ /* Just use a static string here to initialize the GtkUIManager,
+ * rather than installing and reading from a file all the time. */
+ static const gchar menu_str[] =
+ "<ui>"
+ "<popup name=\"popup-menu\">"
+ "<menuitem action=\"add-term\" />"
+ "<menuitem action=\"remove-term\" />"
+ "<separator />"
+ "<menuitem action=\"copy\" />"
+ "<menuitem action=\"paste\" />"
+ "<separator />"
+ "<menuitem action=\"preferences\" />"
+ "<separator />"
+ "<menuitem action=\"quit\" />"
+ "</popup>"
+ "</ui>";
+
+ TildaWindow *parent_window = TILDA_WINDOW(self->parent_window);
+
+ /* Create the action group */
+ action_group = gtk_action_group_new ("popup-menu-action-group");
+
+ /* Add Actions and connect callbacks */
+ action = gtk_action_new ("add-term", _("_Add Terminal"), NULL, GTK_STOCK_ADD);
+ gtk_action_group_add_action_with_accel (action_group, action, parent_window->accel_add_term);
+ g_signal_connect (G_OBJECT(action), "activate", G_CALLBACK(menu_add_term_cb), self);
+
+ action = gtk_action_new ("remove-term", _("_Remove Terminal"), NULL, GTK_STOCK_CLOSE);
+ gtk_action_group_add_action_with_accel (action_group, action, parent_window->accel_remove_term);
+ g_signal_connect (G_OBJECT(action), "activate", G_CALLBACK(menu_remove_term_cb), self);
+
+ action = gtk_action_new ("copy", NULL, NULL, GTK_STOCK_COPY);
+ gtk_action_group_add_action_with_accel (action_group, action, parent_window->accel_copy);
+ g_signal_connect (G_OBJECT(action), "activate", G_CALLBACK(menu_copy_cb), self);
+
+ action = gtk_action_new ("paste", NULL, NULL, GTK_STOCK_PASTE);
+ gtk_action_group_add_action_with_accel (action_group, action, parent_window->accel_paste);
+ g_signal_connect (G_OBJECT(action), "activate", G_CALLBACK(menu_paste_cb), self);
+
+ action = gtk_action_new ("preferences", NULL, NULL, GTK_STOCK_PREFERENCES);
+ gtk_action_group_add_action (action_group, action);
+ g_signal_connect (G_OBJECT(action), "activate", G_CALLBACK(menu_preferences_cb), self);
+
+ action = gtk_action_new ("quit", NULL, NULL, GTK_STOCK_QUIT);
+ gtk_action_group_add_action_with_accel (action_group, action, parent_window->accel_quit);
+ g_signal_connect (G_OBJECT(action), "activate", G_CALLBACK(menu_quit_cb), self);
+
+ /* Create and add actions to the GtkUIManager */
+ ui_manager = gtk_ui_manager_new ();
+ gtk_ui_manager_insert_action_group (ui_manager, action_group, 0);
+ gtk_ui_manager_add_ui_from_string (ui_manager, menu_str, -1, &error);
+
+ /* Check for an error (REALLY REALLY unlikely, unless the developers screwed up */
+ if (error)
+ {
+ g_critical ("GtkUIManager problem: %s\n", error->message);
+ g_error_free (error);
+ }
+
+ /* Get the popup menu out of the GtkUIManager */
+ menu = gtk_ui_manager_get_widget (ui_manager, "/ui/popup-menu");
+
+ /* Display the menu */
+ gtk_menu_popup (GTK_MENU(menu), NULL, NULL, NULL, NULL, 3, gtk_get_current_event_time());
+ gtk_widget_show_all(menu);
+}
+
+/*******************************************************************************
+ * All TildaTerminal functions below
+ ******************************************************************************/
+
static void
tilda_terminal_dbus_register_object (TildaTerminal *tt)
{
+ debug_enter ();
+ debug_assert (TILDA_IS_TERMINAL(tt));
+
+ TildaWindow *parent_window = TILDA_WINDOW(tt->parent_window);
gchar *object_path;
// Register this object with DBus
object_path = g_strdup_printf ("/net/sourceforge/Tilda/Window%d/Terminal%d",
- tt->window_number, tt->number);
+ parent_window->number, tt->number);
dbus_g_connection_register_g_object (dbus_connection, object_path, G_OBJECT(tt));
g_free (object_path);
}
-static GObjectClass *parent_class = NULL;
+gboolean
+tilda_terminal_run_command (TildaTerminal *self, gchar *command, GError **error)
+{
+ debug_enter ();
+ debug_assert (TILDA_IS_TERMINAL(self));
-/* API */
+ vte_terminal_feed_child (VTE_TERMINAL(self->vte_term), command, -1);
+ vte_terminal_feed_child (VTE_TERMINAL(self->vte_term), "\n", -1);
-/*
- * All GObject stuff is below. You probably don't need to change this...
+ return TRUE;
+}
+
+gboolean
+tilda_terminal_close (TildaTerminal *self, GError **error)
+{
+ debug_enter ();
+ debug_assert (TILDA_IS_TERMINAL(self));
+
+ TildaWindow *parent_window = TILDA_WINDOW(self->parent_window);
+
+ tilda_window_remove_terminal (parent_window, self->number);
+
+ return TRUE;
+}
+
+/**
+ * Start the current tt->shell in the given TildaTerminal
+ * NOTE: this will kill whatever is running in the terminal,
+ * NOTE: and run the current tt->shell instead :)
+ * Return: TRUE if ok, FALSE otherwise
+ */
+static gboolean
+tilda_terminal_start_shell (TildaTerminal *tt)
+{
+ debug_enter ();
+ debug_assert (TILDA_IS_TERMINAL(tt));
+
+ gint ret;
+ gint argc;
+ gchar **argv;
+ GError *error = NULL;
+
+ /* Launch a custom command if tt->shell is set (not NULL) */
+ if (tt->shell)
+ {
+ /* Try to parse the user's custom command */
+ ret = g_shell_parse_argv (tt->shell, &argc, &argv, &error);
+
+ if (ret == FALSE)
+ {
+ g_printerr (_("Problem parsing custom command: %s\n"), error->message);
+ g_printerr (_("Launching default shell instead\n"));
+
+ g_error_free (error);
+ goto launch_default_shell;
+ }
+
+ /* Try to start the user's custom command */
+ ret = vte_terminal_fork_command (VTE_TERMINAL(tt->vte_term),
+ argv[0], /* Command */
+ argv, /* Arg Vector */
+ NULL, /* Env Vector */
+ tt->working_directory, /* Start directory */
+ TRUE, /* Add to lastlog */
+ TRUE, /* Add to utmp */
+ TRUE); /* Add to wtmp */
+
+ g_strfreev (argv);
+
+ /* Check for error */
+ if (ret == -1)
+ {
+ g_printerr (_("Unable to launch custom command: %s\n"), tt->shell);
+ g_printerr (_("Launching default shell instead\n"));
+
+ goto launch_default_shell;
+ }
+
+ return TRUE; /* SUCCESS: the early way out */
+ }
+
+launch_default_shell:
+
+ ret = vte_terminal_fork_command (VTE_TERMINAL(tt->vte_term),
+ NULL, /* Command -- VTE will figure it out */
+ NULL, /* Arg Vector */
+ NULL, /* Env Vector */
+ tt->working_directory, /* Start Directory */
+ TRUE, /* Add to lastlog */
+ TRUE, /* Add to utmp */
+ TRUE);/* Add to wtmp */
+
+ if (ret == -1)
+ {
+ g_printerr (_("Unable to launch default shell\n"));
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+/**
+ * Called when the child process running in the VteTerminal exits.
+ */
+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);
+
+ /* Check the user's preference for what to do when the child terminal
+ * is closed. Take the appropriate action */
+ switch (self->exit_action)
+ {
+ case TILDA_CHILD_EXIT_ACTION_EXIT:
+ tilda_window_remove_terminal (TILDA_WINDOW(self->parent_window), self->number);
+ break;
+ case TILDA_CHILD_EXIT_ACTION_RESTART:
+ vte_terminal_feed (VTE_TERMINAL(self->vte_term), "\r\n\r\n", 4);
+ tilda_terminal_start_shell (self);
+ break;
+ case TILDA_CHILD_EXIT_ACTION_HOLD_OPEN:
+ break;
+ default:
+ g_warning ("Bad value in self->exit_action\n");
+ break;
+ }
+}
+
+/**
+ * Called when the child window title changes. Determines if a new
+ * title needs to be put into the notebook's tab label.
+ */
+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;
+ const gchar *vte_title = NULL;
+ gchar *new_title = NULL;
+
+ vte_title = vte_terminal_get_window_title (VTE_TERMINAL (widget));
+ label = gtk_notebook_get_tab_label (GTK_NOTEBOOK(parent_window->notebook), self->hbox);
+
+ switch (self->dynamic_title)
+ {
+ case TILDA_DYNAMIC_TITLE_DISABLED:
+ new_title = g_strdup (self->title);
+ break;
+
+ case TILDA_DYNAMIC_TITLE_AFTER_INITIAL:
+ new_title = g_strdup_printf ("%s - %s", self->title, vte_title);
+ break;
+
+ case TILDA_DYNAMIC_TITLE_BEFORE_INITIAL:
+ new_title = g_strdup_printf ("%s - %s", vte_title, self->title);
+ break;
+
+ case TILDA_DYNAMIC_TITLE_REPLACE_INITIAL:
+ new_title = g_strdup (self->title);
+ break;
+
+ default:
+ g_warning ("Bad value in self->dynamic-title\n");
+ break;
+ }
+
+ gtk_label_set_text (GTK_LABEL(label), new_title);
+ 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 */
+ tilda_terminal_popup_menu (self);
+ 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;
+
+ /* Convert the transparency to VTE's format */
+ temp = ((gdouble) self->transparency_percent) / 100.0;
+
+ if (self->transparency_percent > 0)
+ {
+ vte_terminal_set_background_saturation (VTE_TERMINAL(self->vte_term), temp);
+ vte_terminal_set_opacity (VTE_TERMINAL(self->vte_term), (1.0 - temp) * 0xffff);
+
+ /* Use fake transparency if necessary */
+ vte_terminal_set_background_transparent (VTE_TERMINAL(self->vte_term),
+ !parent_window->have_real_transparency);
+ return;
+ }
+
+ /* Turn off transparency */
+ vte_terminal_set_background_saturation (VTE_TERMINAL(self->vte_term), 0);
+ vte_terminal_set_opacity (VTE_TERMINAL(self->vte_term), 0xffff);
+ 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));
+
+ switch (self->scrollbar_position)
+ {
+ case TILDA_SCROLLBAR_RIGHT:
+ gtk_box_reorder_child (GTK_BOX(self->hbox), self->scrollbar, 0);
+ gtk_widget_show (self->scrollbar);
+ break;
+
+ case TILDA_SCROLLBAR_LEFT:
+ gtk_box_reorder_child (GTK_BOX(self->hbox), self->scrollbar, 1);
+ gtk_widget_show (self->scrollbar);
+ break;
+
+ case TILDA_SCROLLBAR_DISABLED:
+ gtk_widget_hide (self->scrollbar);
+ break;
+
+ default:
+ g_warning ("Bad value in self->scrollbar_position\n");
+ break;
+ }
+}
+
+/*******************************************************************************
+ * All GObject stuff is below. You probably don't need to change this...
+ ******************************************************************************/
+
+static GObjectClass *parent_class = NULL;
enum tilda_terminal_properties {
TILDA_TERMINAL_NUMBER = 1,
- TILDA_TERMINAL_WINDOW_NUMBER,
- TILDA_TERMINAL_TW,
+ TILDA_TERMINAL_PARENT_WINDOW,
/* All non-constructor-only properties */
TILDA_TERMINAL_BACKGROUND_IMAGE,
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_AUDIBLE_BELL,
TILDA_TERMINAL_VISIBLE_BELL,
TILDA_TERMINAL_DOUBLE_BUFFERED,
+ TILDA_TERMINAL_MOUSE_AUTOHIDE,
};
static void
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);
- break;
-
- case TILDA_TERMINAL_TW:
+ case TILDA_TERMINAL_PARENT_WINDOW:
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);
- g_print ("terminal shell: %s\n", self->shell);
+ tilda_terminal_start_shell (self);
+ 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);
- g_print ("terminal transp percent: %d\n", self->transparency_percent);
+ tilda_terminal_set_transparent (self);
+ debug_printf ("terminal transp percent: %d\n", self->transparency_percent);
break;
case TILDA_TERMINAL_BACKSPACE_BINDING:
- self->backspace_binding = g_value_get_int (value);
+ self->backspace_binding = g_value_get_enum (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);
+ self->delete_binding = g_value_get_enum (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);
+ self->dynamic_title = g_value_get_enum (value);
+ 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);
+ self->exit_action = g_value_get_enum (value);
+ debug_printf ("terminal exit action: %d\n", self->exit_action);
+ break;
+
+ case TILDA_TERMINAL_SCROLLBAR_POSITION:
+ self->scrollbar_position = g_value_get_enum (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);
+ debug_printf ("terminal mouse autohide: %d\n", self->mouse_autohide);
break;
default:
g_value_set_int (value, self->number);
break;
- case TILDA_TERMINAL_WINDOW_NUMBER:
- g_value_set_int (value, self->window_number);
- break;
-
- case TILDA_TERMINAL_TW:
+ case TILDA_TERMINAL_PARENT_WINDOW:
g_value_set_pointer (value, self->parent_window);
break;
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;
break;
case TILDA_TERMINAL_BACKSPACE_BINDING:
- g_value_set_int (value, self->backspace_binding);
+ g_value_set_enum (value, self->backspace_binding);
break;
case TILDA_TERMINAL_DELETE_BINDING:
- g_value_set_int (value, self->delete_binding);
+ g_value_set_enum (value, self->delete_binding);
break;
case TILDA_TERMINAL_DYNAMIC_TITLE:
- g_value_set_int (value, self->dynamic_title);
+ g_value_set_enum (value, self->dynamic_title);
break;
case TILDA_TERMINAL_EXIT_ACTION:
- g_value_set_int (value, self->exit_action);
+ g_value_set_enum (value, self->exit_action);
+ break;
+
+ case TILDA_TERMINAL_SCROLLBAR_POSITION:
+ g_value_set_enum (value, self->scrollbar_position);
break;
case TILDA_TERMINAL_SCROLL_BACKGROUND:
g_value_set_boolean (value, self->double_buffered);
break;
+ case TILDA_TERMINAL_MOUSE_AUTOHIDE:
+ g_value_set_boolean (value, self->mouse_autohide);
+
default:
/* We don't have this property... */
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
guint n_construct_properties,
GObjectConstructParam *construct_properties)
{
+ debug_enter ();
+
GObject *obj;
TildaTerminal *self;
+ gint ret;
/* Invoke parent constructor */
TildaTerminalClass *klass;
construct_properties);
/* Do other stuff here. The object is ready to go now, and all
- * ctor properties have been set.
- *
- * TODO: This is the place to do DBus-init */
+ * ctor properties have been set. */
self = TILDA_TERMINAL(obj);
/* Pack into the hbox */
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(gtk_main_quit), self);
-
- vte_terminal_fork_command (VTE_TERMINAL(self->vte_term), NULL, NULL, NULL, NULL, FALSE, FALSE, FALSE);
-
+ G_CALLBACK(tilda_terminal_child_exited_cb), self);
+ g_signal_connect (G_OBJECT(self->vte_term), "eof",
+ 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);
+
+ /* Setup all of the defaults from the config file */
+ tilda_terminal_set_property_from_config (self, "background-image");
+ tilda_terminal_set_property_from_config (self, "shell");
+ tilda_terminal_set_property_from_config (self, "font");
+ tilda_terminal_set_property_from_config (self, "title");
+ tilda_terminal_set_property_from_config (self, "working-directory");
+ tilda_terminal_set_property_from_config (self, "web-browser");
+
+ tilda_terminal_set_property_from_config (self, "scrollback-lines");
+ tilda_terminal_set_property_from_config (self, "transparency-percent");
+
+ tilda_terminal_set_property_from_config (self, "backspace-binding");
+ tilda_terminal_set_property_from_config (self, "delete-binding");
+ tilda_terminal_set_property_from_config (self, "dynamic-title");
+ tilda_terminal_set_property_from_config (self, "exit-action");
+ tilda_terminal_set_property_from_config (self, "scrollbar-position");
+
+ tilda_terminal_set_property_from_config (self, "scroll-background");
+ tilda_terminal_set_property_from_config (self, "scroll-on-output");
+ tilda_terminal_set_property_from_config (self, "scroll-on-keystroke");
+ tilda_terminal_set_property_from_config (self, "antialiased");
+ tilda_terminal_set_property_from_config (self, "allow-bold-text");
+ tilda_terminal_set_property_from_config (self, "cursor-blinks");
+ tilda_terminal_set_property_from_config (self, "audible-bell");
+ tilda_terminal_set_property_from_config (self, "visible-bell");
+ tilda_terminal_set_property_from_config (self, "double-buffered");
+ tilda_terminal_set_property_from_config (self, "mouse-autohide");
+
+ /* All right! We're all ready to go, so register with DBus, and lets start! */
tilda_terminal_dbus_register_object (self);
return obj;
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;
/*
* Here, complete object destruction.
* You might not need to do much...
*/
-
- // TODO: g_free() any primitives here
g_free (self->background_image);
g_free (self->shell);
g_free (self->font);
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;
/* Install all of the properties */
pspec = g_param_spec_int ("number",
- "Terminal number",
- "Set terminal's number",
+ _("Terminal number"),
+ NULL,
0, // min value
INT_MAX, // max value
0, // def value
TILDA_TERMINAL_NUMBER,
pspec);
- pspec = g_param_spec_int ("window-number",
- "Number of the window to which this terminal belongs",
- "Set the number of the parent window",
- 0,
- INT_MAX,
- 0x0000beef,
- G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE);
-
- g_object_class_install_property (gobject_class,
- TILDA_TERMINAL_WINDOW_NUMBER,
- pspec);
-
pspec = g_param_spec_pointer ("parent-window",
- "Pointer to terminal's parent TildaWindow",
- "Set the pointer to the terminal's parent TildaWindow",
+ _("Pointer to terminal's parent TildaWindow"),
+ NULL,
G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE);
g_object_class_install_property (gobject_class,
- TILDA_TERMINAL_TW,
+ TILDA_TERMINAL_PARENT_WINDOW,
pspec);
pspec = g_param_spec_string ("background-image",
- "Terminal's background image",
- "Get/Set terminal's background image",
+ _("Terminal's background image"),
+ NULL,
NULL,
G_PARAM_READWRITE);
pspec);
pspec = g_param_spec_string ("shell",
- "Terminal's shell",
- "Get/Set terminal's shell",
+ _("Terminal's shell"),
+ NULL,
NULL,
G_PARAM_READWRITE);
pspec);
pspec = g_param_spec_string ("font",
- "Terminal's font",
- "Get/Set terminal's font",
+ _("Terminal's font"),
+ NULL,
NULL,
G_PARAM_READWRITE);
pspec);
pspec = g_param_spec_string ("title",
- "Terminal's title",
- "Get/Set terminal's title",
+ _("Terminal's title"),
+ NULL,
NULL,
G_PARAM_READWRITE);
pspec);
pspec = g_param_spec_string ("working-directory",
- "Terminal's initial working directory",
- "Get/Set terminal's initial working directory",
+ _("Terminal's initial working directory"),
+ NULL,
NULL,
G_PARAM_READWRITE);
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",
+ _("Terminal's scrollback amount (lines)"),
+ NULL,
0,
INT_MAX, // TODO: artificially limit this?
1000,
pspec);
pspec = g_param_spec_int ("transparency-percent",
- "Terminal's transparency (percent)",
- "Get/Set terminal's transparency",
+ _("Terminal's transparency (percent)"),
+ NULL,
0,
100,
0,
TILDA_TERMINAL_TRANSPARENCY_PERCENT,
pspec);
- pspec = g_param_spec_int ("backspace-binding",
- "Terminal's backspace binding",
- "Get/Set terminal's backspace key binding",
- VTE_ERASE_AUTO,
- VTE_ERASE_DELETE_SEQUENCE,
- VTE_ERASE_AUTO,
- G_PARAM_READWRITE);
+ pspec = g_param_spec_enum ("backspace-binding",
+ _("Terminal's backspace binding"),
+ NULL,
+ vte_terminal_erase_binding_get_type(),
+ VTE_ERASE_AUTO,
+ G_PARAM_READWRITE);
g_object_class_install_property (gobject_class,
TILDA_TERMINAL_BACKSPACE_BINDING,
pspec);
- pspec = g_param_spec_int ("delete-binding",
- "Terminal's delete binding",
- "Get/Set terminal's delete key binding",
- VTE_ERASE_AUTO,
- VTE_ERASE_DELETE_SEQUENCE,
- VTE_ERASE_AUTO,
- G_PARAM_READWRITE);
+ pspec = g_param_spec_enum ("delete-binding",
+ _("Terminal's delete binding"),
+ NULL,
+ vte_terminal_erase_binding_get_type(),
+ VTE_ERASE_AUTO,
+ G_PARAM_READWRITE);
g_object_class_install_property (gobject_class,
TILDA_TERMINAL_DELETE_BINDING,
pspec);
- pspec = g_param_spec_int ("dynamic-title",
- "Terminal's dynamic title generation method",
- "Get/Set terminal's dynamic title generation method",
- 0,
- INT_MAX,
- 0,
- G_PARAM_READWRITE);
+ pspec = g_param_spec_enum ("dynamic-title",
+ _("Terminal's dynamic title generation method"),
+ NULL,
+ tilda_dynamic_title_get_type(),
+ TILDA_DYNAMIC_TITLE_DISABLED,
+ G_PARAM_READWRITE);
g_object_class_install_property (gobject_class,
TILDA_TERMINAL_DYNAMIC_TITLE,
pspec);
- pspec = g_param_spec_int ("exit-action",
- "Terminal's action upon child exit",
- "Get/Set terminal's action upon child exit",
- 0,
- INT_MAX,
- 0,
- G_PARAM_READWRITE);
+ pspec = g_param_spec_enum ("exit-action",
+ _("Terminal's action upon child exit"),
+ NULL,
+ tilda_child_exit_action_get_type(),
+ TILDA_CHILD_EXIT_ACTION_EXIT,
+ G_PARAM_READWRITE);
g_object_class_install_property (gobject_class,
TILDA_TERMINAL_EXIT_ACTION,
pspec);
+ pspec = g_param_spec_enum ("scrollbar-position",
+ _("Terminal's scrollbar position"),
+ NULL,
+ tilda_scrollbar_position_get_type(),
+ TILDA_SCROLLBAR_RIGHT,
+ 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",
+ _("Controls terminal's scrolling behavior"),
+ NULL,
FALSE,
G_PARAM_READWRITE);
pspec);
pspec = g_param_spec_boolean ("scroll-on-output",
- "Controls terminal's scrolling behavior on output",
- "Get/Set terminal's scrolling behavior on output",
+ _("Controls terminal's scrolling behavior on output"),
+ NULL,
FALSE,
G_PARAM_READWRITE);
pspec);
pspec = g_param_spec_boolean ("scroll-on-keystroke",
- "Controls the terminal's scrolling behavior on keystroke",
+ _("Controls the terminal's scrolling behavior on keystroke"),
NULL, FALSE, G_PARAM_READWRITE);
g_object_class_install_property (gobject_class,
pspec);
pspec = g_param_spec_boolean ("antialiased",
- "Attempt to antialias fonts",
+ _("Attempt to antialias fonts"),
NULL, FALSE, G_PARAM_READWRITE);
g_object_class_install_property (gobject_class,
pspec);
pspec = g_param_spec_boolean ("allow-bold-text",
- "Allow bold text",
+ _("Allow bold text"),
NULL, FALSE, G_PARAM_READWRITE);
g_object_class_install_property (gobject_class,
pspec);
pspec = g_param_spec_boolean ("cursor-blinks",
- NULL, NULL, FALSE, G_PARAM_READWRITE);
+ _("Enable cursor blinking"),
+ NULL, FALSE, G_PARAM_READWRITE);
g_object_class_install_property (gobject_class,
TILDA_TERMINAL_CURSOR_BLINKS,
pspec);
pspec = g_param_spec_boolean ("audible-bell",
- NULL, NULL, FALSE, G_PARAM_READWRITE);
+ _("Enable the audible bell"),
+ NULL, FALSE, G_PARAM_READWRITE);
g_object_class_install_property (gobject_class,
TILDA_TERMINAL_AUDIBLE_BELL,
pspec);
pspec = g_param_spec_boolean ("visible-bell",
- NULL, NULL, FALSE, G_PARAM_READWRITE);
+ _("Enable the visible bell"),
+ NULL, FALSE, G_PARAM_READWRITE);
g_object_class_install_property (gobject_class,
TILDA_TERMINAL_VISIBLE_BELL,
pspec);
pspec = g_param_spec_boolean ("double-buffered",
- NULL, NULL, FALSE, G_PARAM_READWRITE);
+ _("Double buffer the terminal"),
+ NULL, FALSE, G_PARAM_READWRITE);
g_object_class_install_property (gobject_class,
TILDA_TERMINAL_DOUBLE_BUFFERED,
pspec);
+
+ pspec = g_param_spec_boolean ("mouse-autohide",
+ _("Hide the mouse cursor while typing"),
+ NULL, FALSE, G_PARAM_READWRITE);
+
+ g_object_class_install_property (gobject_class,
+ TILDA_TERMINAL_MOUSE_AUTOHIDE,
+ pspec);
}
GType
return type;
}
-#if 0
-
-int main (int argc, char *argv[])
-{
- GObject *tt;
- gint test_number = INT_MIN;
- gchar *test_string = NULL;
-
- /* Initialize the GObject type system */
- g_type_init ();
- gtk_init (&argc, &argv);
-
- tt = g_object_new (TILDA_TYPE_TERMINAL, "number", 10, NULL);
- g_object_get (G_OBJECT (tt), "number", &test_number, NULL);
- g_assert (test_number == 10);
-
- g_object_unref (G_OBJECT (tt));
-
- tt = g_object_new (TILDA_TYPE_TERMINAL, "number", 22, NULL);
- g_object_get (G_OBJECT (tt), "number", &test_number, NULL);
- g_assert (test_number == 22);
-
- g_object_set (G_OBJECT (tt), "font", "hello I'm a font");
- g_object_set (G_OBJECT (tt), "font", "Bitstream Vera Sans Mono 13");
-
- g_object_get (G_OBJECT (tt), "font", &test_string, NULL);
- g_print ("Read Font: %s\n", test_string);
- // NOTE: you MUST free the string!!!!
- g_free (test_string);
-
- g_object_set (G_OBJECT (tt), "transparency-percent", 50);
-
- g_object_unref (G_OBJECT (tt));
-
- return 0;
-}
-
-#endif
-
/* vim: set ts=4 sts=4 sw=4 noet tw=112: */