X-Git-Url: https://irasnyder.com/gitweb/?a=blobdiff_plain;ds=sidebyside;f=tilda-terminal.c;h=c765eca2762f506fd5624ef2bdff398a5c79978d;hb=f700382da8724c1c3cd0b6fa898129605255a91a;hp=b074d78919ea1881d8ca94d6c5fd93a5a3230c22;hpb=2858292b31807061130dc2a366281ab99cea8700;p=tilda-gobject.git diff --git a/tilda-terminal.c b/tilda-terminal.c index b074d78..c765eca 100644 --- a/tilda-terminal.c +++ b/tilda-terminal.c @@ -1,15 +1,320 @@ +#include "tilda.h" #include "tilda-terminal.h" +#include "tilda-terminal-dbus-glue.h" -static GObjectClass *parent_class = NULL; +// FIXME: temporary helpers for gettext +// TODO: remove these +#define _(X) X +#define N_(X) X -/* API */ +#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 GObject stuff is below. You probably don't need to change this... + +static void +tilda_terminal_dbus_register_object (TildaTerminal *tt) +{ + 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); + dbus_g_connection_register_g_object (dbus_connection, object_path, G_OBJECT(tt)); + g_free (object_path); +} + +/** + * 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) +{ + 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) +{ + TildaTerminal *self = TILDA_TERMINAL(data); + + /* These can stay here. They don't need to go into a header because + * they are only used at this point in the code. */ + enum exit_actions { HOLD_TERMINAL_OPEN, RESTART_COMMAND, EXIT_TERMINAL }; + + /* Check the user's preference for what to do when the child terminal + * is closed. Take the appropriate action */ + switch (self->exit_action) + { + case EXIT_TERMINAL: + tilda_window_remove_term (TILDA_WINDOW(self->parent_window), self->number); + break; + case RESTART_COMMAND: + vte_terminal_feed (VTE_TERMINAL(self->vte_term), "\r\n\r\n", 4); + tilda_terminal_start_shell (self); + break; + case HOLD_TERMINAL_OPEN: + break; + default: + 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) +{ + TildaTerminal *self = TILDA_TERMINAL(data); + TildaWindow *parent_window = TILDA_WINDOW(self->parent_window); + GtkWidget *label; + const gchar *vte_title; + gchar *new_title; + + enum dynamic_titles { NOT_DISPLAYED, AFTER_INITIAL, BEFORE_INITIAL, REPLACE_INITIAL }; + label = gtk_notebook_get_tab_label (GTK_NOTEBOOK(parent_window->notebook), self->hbox); + + /* If we aren't using a dynamic title -- NOT_DISPLAYED -- then just + * set it to the static title and exit */ + if (!self->dynamic_title) + { + gtk_label_set_text (GTK_LABEL(label), self->title); + return; + } + + /* Get the title from VTE */ + vte_title = vte_terminal_get_window_title (VTE_TERMINAL (widget)); + + /* Take the appropriate action */ + switch (self->dynamic_title) + { + case REPLACE_INITIAL: + new_title = g_strdup (vte_title); + break; + + case BEFORE_INITIAL: + new_title = g_strdup_printf ("%s - %s", vte_title, self->title); + break; + + case AFTER_INITIAL: + 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")); + new_title = g_strdup(self->title); + 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) +{ + 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. */ +static void +tilda_terminal_set_transparent (TildaTerminal *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) +{ + 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... + ******************************************************************************/ + +static GObjectClass *parent_class = NULL; enum tilda_terminal_properties { TILDA_TERMINAL_NUMBER = 1, + TILDA_TERMINAL_WINDOW_NUMBER, + TILDA_TERMINAL_TW, /* All non-constructor-only properties */ TILDA_TERMINAL_BACKGROUND_IMAGE, @@ -17,6 +322,7 @@ enum tilda_terminal_properties { TILDA_TERMINAL_FONT, TILDA_TERMINAL_TITLE, TILDA_TERMINAL_WORKING_DIRECTORY, + TILDA_TERMINAL_WEB_BROWSER, TILDA_TERMINAL_SCROLLBACK_LINES, TILDA_TERMINAL_TRANSPARENCY_PERCENT, @@ -25,6 +331,18 @@ 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, + TILDA_TERMINAL_SCROLL_ON_KEYSTROKE, + TILDA_TERMINAL_ANTIALIASED, + TILDA_TERMINAL_ALLOW_BOLD_TEXT, + TILDA_TERMINAL_CURSOR_BLINKS, + TILDA_TERMINAL_AUDIBLE_BELL, + TILDA_TERMINAL_VISIBLE_BELL, + TILDA_TERMINAL_DOUBLE_BUFFERED, + TILDA_TERMINAL_MOUSE_AUTOHIDE, }; static void @@ -39,6 +357,8 @@ tilda_terminal_instance_init (GTypeInstance *instance, self->number = 0; self->vte_term = vte_terminal_new (); + self->scrollbar = gtk_vscrollbar_new (VTE_TERMINAL(self->vte_term)->adjustment); + self->hbox = gtk_hbox_new (FALSE, 0); } static void @@ -56,22 +376,37 @@ tilda_terminal_set_property (GObject *object, g_print ("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: + 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); + break; + case TILDA_TERMINAL_BACKGROUND_IMAGE: g_free (self->background_image); self->background_image = g_value_dup_string (value); - // TODO: Actually set it in self->vte_term + vte_terminal_set_background_image_file (VTE_TERMINAL(self->vte_term), self->background_image); g_print ("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); break; case TILDA_TERMINAL_FONT: g_free (self->font); self->font = g_value_dup_string (value); + vte_terminal_set_font_from_string_full (VTE_TERMINAL(self->vte_term), + self->font, + self->antialiased); g_print ("terminal font: %s\n", self->font); break; @@ -87,25 +422,33 @@ tilda_terminal_set_property (GObject *object, g_print ("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); + g_print ("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); 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); 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); + vte_terminal_set_backspace_binding (VTE_TERMINAL(self->vte_term), self->backspace_binding); g_print ("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); + vte_terminal_set_delete_binding (VTE_TERMINAL(self->vte_term), self->delete_binding); g_print ("terminal delete key: %d\n", self->delete_binding); break; @@ -119,6 +462,74 @@ 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); + g_print ("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); + 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); + break; + + case TILDA_TERMINAL_ANTIALIASED: + self->antialiased = g_value_get_boolean (value); + vte_terminal_set_font_from_string_full (VTE_TERMINAL(self->vte_term), + self->font, + self->antialiased); + g_print ("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); + 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); + 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); + 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); + 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); + 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); + break; + default: /* We don't have this property... */ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); @@ -140,6 +551,14 @@ tilda_terminal_get_property (GObject *object, 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: + g_value_set_pointer (value, self->parent_window); + break; + case TILDA_TERMINAL_BACKGROUND_IMAGE: g_value_set_string (value, self->background_image); break; @@ -160,6 +579,10 @@ tilda_terminal_get_property (GObject *object, 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; @@ -168,6 +591,65 @@ tilda_terminal_get_property (GObject *object, g_value_set_int (value, self->transparency_percent); break; + case TILDA_TERMINAL_BACKSPACE_BINDING: + g_value_set_int (value, self->backspace_binding); + break; + + case TILDA_TERMINAL_DELETE_BINDING: + g_value_set_int (value, self->delete_binding); + break; + + case TILDA_TERMINAL_DYNAMIC_TITLE: + g_value_set_int (value, self->dynamic_title); + break; + + case TILDA_TERMINAL_EXIT_ACTION: + 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; + + case TILDA_TERMINAL_SCROLL_ON_OUTPUT: + g_value_set_boolean (value, self->scroll_on_output); + break; + + case TILDA_TERMINAL_SCROLL_ON_KEYSTROKE: + g_value_set_boolean (value, self->scroll_on_keystroke); + break; + + case TILDA_TERMINAL_ANTIALIASED: + g_value_set_boolean (value, self->antialiased); + break; + + case TILDA_TERMINAL_ALLOW_BOLD_TEXT: + g_value_set_boolean (value, self->allow_bold_text); + break; + + case TILDA_TERMINAL_CURSOR_BLINKS: + g_value_set_boolean (value, self->cursor_blinks); + break; + + case TILDA_TERMINAL_AUDIBLE_BELL: + g_value_set_boolean (value, self->audible_bell); + break; + + case TILDA_TERMINAL_VISIBLE_BELL: + g_value_set_boolean (value, self->visible_bell); + break; + + case TILDA_TERMINAL_DOUBLE_BUFFERED: + 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); @@ -181,6 +663,8 @@ tilda_terminal_constructor (GType type, GObjectConstructParam *construct_properties) { GObject *obj; + TildaTerminal *self; + gint ret; /* Invoke parent constructor */ TildaTerminalClass *klass; @@ -193,7 +677,31 @@ tilda_terminal_constructor (GType type, * ctor properties have been set. * * TODO: This is the place to do DBus-init */ - + 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); + + /* 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), "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); + + tilda_terminal_start_shell (self); + tilda_terminal_dbus_register_object (self); return obj; } @@ -259,6 +767,9 @@ tilda_terminal_class_init (gpointer g_class, parent_class = g_type_class_peek_parent (klass); + /* Hook the TildaTerminal type into DBus */ + dbus_g_object_type_install_info (tilda_terminal_get_type(), &dbus_glib_tilda_terminal_object_info); + /* Install all of the properties */ pspec = g_param_spec_int ("number", "Terminal number", @@ -272,6 +783,27 @@ tilda_terminal_class_init (gpointer g_class, 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", + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + + g_object_class_install_property (gobject_class, + TILDA_TERMINAL_TW, + pspec); + pspec = g_param_spec_string ("background-image", "Terminal's background image", "Get/Set terminal's background image", @@ -322,6 +854,16 @@ tilda_terminal_class_init (gpointer g_class, 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", @@ -345,6 +887,145 @@ tilda_terminal_class_init (gpointer g_class, g_object_class_install_property (gobject_class, 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); + + 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); + + 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); + + 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); + + g_object_class_install_property (gobject_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", + FALSE, + G_PARAM_READWRITE); + + g_object_class_install_property (gobject_class, + TILDA_TERMINAL_SCROLL_BACKGROUND, + pspec); + + pspec = g_param_spec_boolean ("scroll-on-output", + "Controls terminal's scrolling behavior on output", + "Get/Set terminal's scrolling behavior on output", + FALSE, + G_PARAM_READWRITE); + + g_object_class_install_property (gobject_class, + TILDA_TERMINAL_SCROLL_ON_OUTPUT, + pspec); + + pspec = g_param_spec_boolean ("scroll-on-keystroke", + "Controls the terminal's scrolling behavior on keystroke", + NULL, FALSE, G_PARAM_READWRITE); + + g_object_class_install_property (gobject_class, + TILDA_TERMINAL_SCROLL_ON_KEYSTROKE, + pspec); + + pspec = g_param_spec_boolean ("antialiased", + "Attempt to antialias fonts", + NULL, FALSE, G_PARAM_READWRITE); + + g_object_class_install_property (gobject_class, + TILDA_TERMINAL_ANTIALIASED, + pspec); + + pspec = g_param_spec_boolean ("allow-bold-text", + "Allow bold text", + NULL, FALSE, G_PARAM_READWRITE); + + g_object_class_install_property (gobject_class, + TILDA_TERMINAL_ALLOW_BOLD_TEXT, + pspec); + + pspec = g_param_spec_boolean ("cursor-blinks", + NULL, 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); + + 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); + + 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); + + g_object_class_install_property (gobject_class, + TILDA_TERMINAL_DOUBLE_BUFFERED, + pspec); + + pspec = g_param_spec_boolean ("mouse-autohide", + NULL, NULL, FALSE, G_PARAM_READWRITE); + + g_object_class_install_property (gobject_class, + TILDA_TERMINAL_MOUSE_AUTOHIDE, + pspec); } GType @@ -375,6 +1056,8 @@ tilda_terminal_get_type (void) return type; } +#if 0 + int main (int argc, char *argv[]) { GObject *tt; @@ -410,4 +1093,6 @@ int main (int argc, char *argv[]) return 0; } +#endif + /* vim: set ts=4 sts=4 sw=4 noet tw=112: */