2 #include "tilda-terminal.h"
3 #include "tilda-terminal-dbus-glue.h"
5 // FIXME: temporary helpers for gettext
10 #define DINGUS1 "(((news|telnet|nttp|file|http|ftp|https)://)|(www|ftp)[-A-Za-z0-9]*\\.)[-A-Za-z0-9\\.]+(:[0-9]*)?"
11 #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_\\$\\.\\+\\!\\*\\(\\),;:@&=\\?/~\\#\\%]*[^]'\\.}>\\) ,\\\"]"
15 tilda_terminal_dbus_register_object (TildaTerminal *tt)
19 // Register this object with DBus
20 object_path = g_strdup_printf ("/net/sourceforge/Tilda/Window%d/Terminal%d",
21 tt->window_number, tt->number);
22 dbus_g_connection_register_g_object (dbus_connection, object_path, G_OBJECT(tt));
27 * Start the current tt->shell in the given TildaTerminal
28 * NOTE: this will kill whatever is running in the terminal,
29 * NOTE: and run the current tt->shell instead :)
30 * Return: TRUE if ok, FALSE otherwise
33 tilda_terminal_start_shell (TildaTerminal *tt)
40 /* Launch a custom command if tt->shell is set (not NULL) */
43 /* Try to parse the user's custom command */
44 ret = g_shell_parse_argv (tt->shell, &argc, &argv, &error);
48 g_printerr (_("Problem parsing custom command: %s\n"), error->message);
49 g_printerr (_("Launching default shell instead\n"));
52 goto launch_default_shell;
55 /* Try to start the user's custom command */
56 ret = vte_terminal_fork_command (VTE_TERMINAL(tt->vte_term),
57 argv[0], /* Command */
58 argv, /* Arg Vector */
59 NULL, /* Env Vector */
60 tt->working_directory, /* Start directory */
61 TRUE, /* Add to lastlog */
62 TRUE, /* Add to utmp */
63 TRUE); /* Add to wtmp */
70 g_printerr (_("Unable to launch custom command: %s\n"), tt->shell);
71 g_printerr (_("Launching default shell instead\n"));
73 goto launch_default_shell;
76 return TRUE; /* SUCCESS: the early way out */
81 ret = vte_terminal_fork_command (VTE_TERMINAL(tt->vte_term),
82 NULL, /* Command -- VTE will figure it out */
83 NULL, /* Arg Vector */
84 NULL, /* Env Vector */
85 tt->working_directory, /* Start Directory */
86 TRUE, /* Add to lastlog */
87 TRUE, /* Add to utmp */
88 TRUE);/* Add to wtmp */
92 g_printerr (_("Unable to launch default shell\n"));
100 * Called when the child process running in the VteTerminal exits.
103 tilda_terminal_child_exited_cb (GtkWidget *widget, gpointer data)
105 TildaTerminal *self = TILDA_TERMINAL(data);
107 /* These can stay here. They don't need to go into a header because
108 * they are only used at this point in the code. */
109 enum exit_actions { HOLD_TERMINAL_OPEN, RESTART_COMMAND, EXIT_TERMINAL };
111 /* Check the user's preference for what to do when the child terminal
112 * is closed. Take the appropriate action */
113 switch (self->exit_action)
116 tilda_window_remove_term (TILDA_WINDOW(self->parent_window), self->number);
118 case RESTART_COMMAND:
119 vte_terminal_feed (VTE_TERMINAL(self->vte_term), "\r\n\r\n", 4);
120 tilda_terminal_start_shell (self);
122 case HOLD_TERMINAL_OPEN:
130 * Called when the child window title changes. Determines if a new
131 * title needs to be put into the notebook's tab label.
134 tilda_terminal_window_title_changed_cb (GtkWidget *widget, gpointer data)
136 TildaTerminal *self = TILDA_TERMINAL(data);
137 TildaWindow *parent_window = TILDA_WINDOW(self->parent_window);
139 const gchar *vte_title;
142 enum dynamic_titles { NOT_DISPLAYED, AFTER_INITIAL, BEFORE_INITIAL, REPLACE_INITIAL };
143 label = gtk_notebook_get_tab_label (GTK_NOTEBOOK(parent_window->notebook), self->hbox);
145 /* If we aren't using a dynamic title -- NOT_DISPLAYED -- then just
146 * set it to the static title and exit */
147 if (!self->dynamic_title)
149 gtk_label_set_text (GTK_LABEL(label), self->title);
153 /* Get the title from VTE */
154 vte_title = vte_terminal_get_window_title (VTE_TERMINAL (widget));
156 /* Take the appropriate action */
157 switch (self->dynamic_title)
159 case REPLACE_INITIAL:
160 new_title = g_strdup (vte_title);
164 new_title = g_strdup_printf ("%s - %s", vte_title, self->title);
168 new_title = g_strdup_printf ("%s - %s", self->title, vte_title);
173 g_printerr (_("FIXME: Bad value of self->dynamic_title\n"));
174 new_title = g_strdup(self->title);
178 gtk_label_set_text (GTK_LABEL(label), new_title);
183 * Gets called whenever there is a button-press event in the VteTerminal. It
184 * is used to open the user's web browser, for example.
187 tilda_terminal_button_press_cb (GtkWidget *widget,
188 GdkEventButton *event,
191 GError *error = NULL;
192 TildaTerminal *self = TILDA_TERMINAL(data);
193 VteTerminal *terminal = VTE_TERMINAL(self->vte_term);
194 gint tag, xpad, ypad;
195 gchar *match, *cmd, *web_browser_cmd;
196 gboolean ret = FALSE;
198 switch (event->button)
200 case 3: /* Right Click */
201 // FIXME: need to add this
202 //popup_menu (tt->tw, tt);
203 g_print ("FIXME: popup_menu() here\n");
206 case 2: /* Middle Click */
209 case 1: /* Left Click */
210 vte_terminal_get_padding (terminal, &xpad, &ypad);
211 match = vte_terminal_match_check (terminal,
212 (event->x - ypad) / terminal->char_width,
213 (event->y - ypad) / terminal->char_height,
216 /* Check if we can launch a web browser, and do so if possible */
217 if ((event->state & GDK_CONTROL_MASK) && match != NULL)
220 g_print ("Got a Ctrl+Left Click -- Matched: `%s' (%d)\n", match, tag);
222 web_browser_cmd = g_strescape (self->web_browser, NULL);
223 cmd = g_strdup_printf ("%s %s", web_browser_cmd, match);
225 g_print ("Launching command: `%s'\n", cmd);
227 ret = g_spawn_command_line_async(cmd, &error);
229 /* Check that the command launched */
232 g_printerr (_("Failed to launch web browser command: `%s'\n"), cmd);
233 g_printerr (_("Error message: %s\n"), error->message);
236 /* Free allocated memory */
237 g_free (web_browser_cmd);
241 /* Always free match if it is non NULL */
253 * Set the given TildaTerminal to the appropriate transparency level
254 * based on the self->transparency_percent member. */
256 tilda_terminal_set_transparent (TildaTerminal *self)
258 TildaWindow *parent_window = TILDA_WINDOW(self->parent_window);
261 /* Convert the transparency to VTE's format */
262 temp = ((gdouble) self->transparency_percent) / 100.0;
264 if (self->transparency_percent > 0)
266 vte_terminal_set_background_saturation (VTE_TERMINAL(self->vte_term), temp);
267 vte_terminal_set_opacity (VTE_TERMINAL(self->vte_term), (1.0 - temp) * 0xffff);
269 /* Use fake transparency if necessary */
270 vte_terminal_set_background_transparent (VTE_TERMINAL(self->vte_term),
271 !parent_window->have_real_transparency);
275 /* Turn off transparency */
276 vte_terminal_set_background_saturation (VTE_TERMINAL(self->vte_term), 0);
277 vte_terminal_set_opacity (VTE_TERMINAL(self->vte_term), 0xffff);
278 vte_terminal_set_background_transparent (VTE_TERMINAL(self->vte_term), FALSE);
281 /*******************************************************************************
282 * All GObject stuff is below. You probably don't need to change this...
283 ******************************************************************************/
285 static GObjectClass *parent_class = NULL;
287 enum tilda_terminal_properties {
288 TILDA_TERMINAL_NUMBER = 1,
289 TILDA_TERMINAL_WINDOW_NUMBER,
292 /* All non-constructor-only properties */
293 TILDA_TERMINAL_BACKGROUND_IMAGE,
294 TILDA_TERMINAL_SHELL,
296 TILDA_TERMINAL_TITLE,
297 TILDA_TERMINAL_WORKING_DIRECTORY,
298 TILDA_TERMINAL_WEB_BROWSER,
300 TILDA_TERMINAL_SCROLLBACK_LINES,
301 TILDA_TERMINAL_TRANSPARENCY_PERCENT,
303 TILDA_TERMINAL_BACKSPACE_BINDING,
304 TILDA_TERMINAL_DELETE_BINDING,
305 TILDA_TERMINAL_DYNAMIC_TITLE,
306 TILDA_TERMINAL_EXIT_ACTION,
308 TILDA_TERMINAL_SCROLL_BACKGROUND,
309 TILDA_TERMINAL_SCROLL_ON_OUTPUT,
310 TILDA_TERMINAL_SCROLL_ON_KEYSTROKE,
311 TILDA_TERMINAL_ANTIALIASED,
312 TILDA_TERMINAL_ALLOW_BOLD_TEXT,
313 TILDA_TERMINAL_CURSOR_BLINKS,
314 TILDA_TERMINAL_AUDIBLE_BELL,
315 TILDA_TERMINAL_VISIBLE_BELL,
316 TILDA_TERMINAL_DOUBLE_BUFFERED,
317 TILDA_TERMINAL_MOUSE_AUTOHIDE,
321 tilda_terminal_instance_init (GTypeInstance *instance,
324 TildaTerminal *self = (TildaTerminal *) instance;
326 /* Initialize instance members and allocate any necessary memory here.
327 * NOTE: any constructor-time values will be set later. */
328 self->dispose_has_run = FALSE;
331 self->vte_term = vte_terminal_new ();
332 self->scrollbar = gtk_vscrollbar_new (VTE_TERMINAL(self->vte_term)->adjustment);
333 self->hbox = gtk_hbox_new (FALSE, 0);
337 tilda_terminal_set_property (GObject *object,
342 TildaTerminal *self = (TildaTerminal *) object;
344 switch (property_id) {
346 case TILDA_TERMINAL_NUMBER:
347 self->number = g_value_get_int (value);
348 g_print ("terminal number: %d\n", self->number);
351 case TILDA_TERMINAL_WINDOW_NUMBER:
352 self->window_number = g_value_get_int (value);
353 g_print ("terminal parent window number: %d\n", self->window_number);
356 case TILDA_TERMINAL_TW:
357 self->parent_window = g_value_get_pointer (value);
358 g_print ("terminal parent window: 0x%x\n", self->parent_window);
359 g_print ("terminal parent window number (direct): %d\n", TILDA_WINDOW(self->parent_window)->number);
362 case TILDA_TERMINAL_BACKGROUND_IMAGE:
363 g_free (self->background_image);
364 self->background_image = g_value_dup_string (value);
365 vte_terminal_set_background_image_file (VTE_TERMINAL(self->vte_term), self->background_image);
366 g_print ("terminal back img: %s\n", self->background_image);
369 case TILDA_TERMINAL_SHELL:
370 g_free (self->shell);
371 self->shell = g_value_dup_string (value);
372 tilda_terminal_start_shell (self);
373 g_print ("terminal shell: %s\n", self->shell);
376 case TILDA_TERMINAL_FONT:
378 self->font = g_value_dup_string (value);
379 vte_terminal_set_font_from_string_full (VTE_TERMINAL(self->vte_term),
382 g_print ("terminal font: %s\n", self->font);
385 case TILDA_TERMINAL_TITLE:
386 g_free (self->title);
387 self->title = g_value_dup_string (value);
388 g_print ("terminal title: %s\n", self->title);
391 case TILDA_TERMINAL_WORKING_DIRECTORY:
392 g_free (self->working_directory);
393 self->working_directory = g_value_dup_string (value);
394 g_print ("terminal wrk dir: %s\n", self->working_directory);
397 case TILDA_TERMINAL_WEB_BROWSER:
398 g_free (self->web_browser);
399 self->web_browser = g_value_dup_string (value);
400 g_print ("terminal web browser: %s\n", self->web_browser);
403 case TILDA_TERMINAL_SCROLLBACK_LINES:
404 self->scrollback_lines = g_value_get_int (value);
405 vte_terminal_set_scrollback_lines (VTE_TERMINAL(self->vte_term), self->scrollback_lines);
406 g_print ("terminal scrollback lines: %d\n", self->scrollback_lines);
409 case TILDA_TERMINAL_TRANSPARENCY_PERCENT:
410 self->transparency_percent = g_value_get_int (value);
411 tilda_terminal_set_transparent (self);
412 g_print ("terminal transp percent: %d\n", self->transparency_percent);
415 case TILDA_TERMINAL_BACKSPACE_BINDING:
416 self->backspace_binding = g_value_get_int (value);
417 vte_terminal_set_backspace_binding (VTE_TERMINAL(self->vte_term), self->backspace_binding);
418 g_print ("terminal backspace key: %d\n", self->backspace_binding);
421 case TILDA_TERMINAL_DELETE_BINDING:
422 self->delete_binding = g_value_get_int (value);
423 vte_terminal_set_delete_binding (VTE_TERMINAL(self->vte_term), self->delete_binding);
424 g_print ("terminal delete key: %d\n", self->delete_binding);
427 case TILDA_TERMINAL_DYNAMIC_TITLE:
428 self->dynamic_title = g_value_get_int (value);
429 g_print ("terminal dynamic title: %d\n", self->dynamic_title);
432 case TILDA_TERMINAL_EXIT_ACTION:
433 self->exit_action = g_value_get_int (value);
434 g_print ("terminal exit action: %d\n", self->exit_action);
437 case TILDA_TERMINAL_SCROLL_BACKGROUND:
438 self->scroll_background = g_value_get_boolean (value);
439 vte_terminal_set_scroll_background (VTE_TERMINAL(self->vte_term), self->scroll_background);
440 g_print ("terminal scroll background: %d\n", self->scroll_background);
443 case TILDA_TERMINAL_SCROLL_ON_OUTPUT:
444 self->scroll_on_output = g_value_get_boolean (value);
445 vte_terminal_set_scroll_on_output (VTE_TERMINAL(self->vte_term), self->scroll_on_output);
446 g_print ("terminal scroll on output: %d\n", self->scroll_on_output);
449 case TILDA_TERMINAL_SCROLL_ON_KEYSTROKE:
450 self->scroll_on_keystroke = g_value_get_boolean (value);
451 vte_terminal_set_scroll_on_keystroke (VTE_TERMINAL(self->vte_term), self->scroll_on_keystroke);
452 g_print ("terminal scroll on keystroke: %d\n", self->scroll_on_keystroke);
455 case TILDA_TERMINAL_ANTIALIASED:
456 self->antialiased = g_value_get_boolean (value);
457 vte_terminal_set_font_from_string_full (VTE_TERMINAL(self->vte_term),
460 g_print ("terminal antialiased: %d\n", self->antialiased);
463 case TILDA_TERMINAL_ALLOW_BOLD_TEXT:
464 self->allow_bold_text = g_value_get_boolean (value);
465 vte_terminal_set_allow_bold (VTE_TERMINAL(self->vte_term), self->allow_bold_text);
466 g_print ("terminal allow bold text: %d\n", self->allow_bold_text);
469 case TILDA_TERMINAL_CURSOR_BLINKS:
470 self->cursor_blinks = g_value_get_boolean (value);
471 vte_terminal_set_cursor_blinks (VTE_TERMINAL(self->vte_term), self->cursor_blinks);
472 g_print ("terminal cursor blinks: %d\n", self->cursor_blinks);
475 case TILDA_TERMINAL_AUDIBLE_BELL:
476 self->audible_bell = g_value_get_boolean (value);
477 vte_terminal_set_audible_bell (VTE_TERMINAL(self->vte_term), self->audible_bell);
478 g_print ("terminal audible bell: %d\n", self->audible_bell);
481 case TILDA_TERMINAL_VISIBLE_BELL:
482 self->visible_bell = g_value_get_boolean (value);
483 vte_terminal_set_visible_bell (VTE_TERMINAL(self->vte_term), self->visible_bell);
484 g_print ("terminal visible bell: %d\n", self->visible_bell);
487 case TILDA_TERMINAL_DOUBLE_BUFFERED:
488 self->double_buffered = g_value_get_boolean (value);
489 gtk_widget_set_double_buffered (GTK_WIDGET(self->vte_term), self->double_buffered);
490 g_print ("terminal double buffered: %d\n", self->double_buffered);
493 case TILDA_TERMINAL_MOUSE_AUTOHIDE:
494 self->mouse_autohide = g_value_get_boolean (value);
495 vte_terminal_set_mouse_autohide (VTE_TERMINAL(self->vte_term), self->mouse_autohide);
496 g_print ("terminal mouse autohide: %d\n", self->mouse_autohide);
500 /* We don't have this property... */
501 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
507 tilda_terminal_get_property (GObject *object,
512 TildaTerminal *self = (TildaTerminal *) object;
514 switch (property_id) {
516 case TILDA_TERMINAL_NUMBER:
517 g_value_set_int (value, self->number);
520 case TILDA_TERMINAL_WINDOW_NUMBER:
521 g_value_set_int (value, self->window_number);
524 case TILDA_TERMINAL_TW:
525 g_value_set_pointer (value, self->parent_window);
528 case TILDA_TERMINAL_BACKGROUND_IMAGE:
529 g_value_set_string (value, self->background_image);
532 case TILDA_TERMINAL_SHELL:
533 g_value_set_string (value, self->shell);
536 case TILDA_TERMINAL_FONT:
537 g_value_set_string (value, self->font);
540 case TILDA_TERMINAL_TITLE:
541 g_value_set_string (value, self->title);
544 case TILDA_TERMINAL_WORKING_DIRECTORY:
545 g_value_set_string (value, self->working_directory);
548 case TILDA_TERMINAL_WEB_BROWSER:
549 g_value_set_string (value, self->web_browser);
552 case TILDA_TERMINAL_SCROLLBACK_LINES:
553 g_value_set_int (value, self->scrollback_lines);
556 case TILDA_TERMINAL_TRANSPARENCY_PERCENT:
557 g_value_set_int (value, self->transparency_percent);
560 case TILDA_TERMINAL_BACKSPACE_BINDING:
561 g_value_set_int (value, self->backspace_binding);
564 case TILDA_TERMINAL_DELETE_BINDING:
565 g_value_set_int (value, self->delete_binding);
568 case TILDA_TERMINAL_DYNAMIC_TITLE:
569 g_value_set_int (value, self->dynamic_title);
572 case TILDA_TERMINAL_EXIT_ACTION:
573 g_value_set_int (value, self->exit_action);
576 case TILDA_TERMINAL_SCROLL_BACKGROUND:
577 g_value_set_boolean (value, self->scroll_background);
580 case TILDA_TERMINAL_SCROLL_ON_OUTPUT:
581 g_value_set_boolean (value, self->scroll_on_output);
584 case TILDA_TERMINAL_SCROLL_ON_KEYSTROKE:
585 g_value_set_boolean (value, self->scroll_on_keystroke);
588 case TILDA_TERMINAL_ANTIALIASED:
589 g_value_set_boolean (value, self->antialiased);
592 case TILDA_TERMINAL_ALLOW_BOLD_TEXT:
593 g_value_set_boolean (value, self->allow_bold_text);
596 case TILDA_TERMINAL_CURSOR_BLINKS:
597 g_value_set_boolean (value, self->cursor_blinks);
600 case TILDA_TERMINAL_AUDIBLE_BELL:
601 g_value_set_boolean (value, self->audible_bell);
604 case TILDA_TERMINAL_VISIBLE_BELL:
605 g_value_set_boolean (value, self->visible_bell);
608 case TILDA_TERMINAL_DOUBLE_BUFFERED:
609 g_value_set_boolean (value, self->double_buffered);
612 case TILDA_TERMINAL_MOUSE_AUTOHIDE:
613 g_value_set_boolean (value, self->mouse_autohide);
616 /* We don't have this property... */
617 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
623 tilda_terminal_constructor (GType type,
624 guint n_construct_properties,
625 GObjectConstructParam *construct_properties)
631 /* Invoke parent constructor */
632 TildaTerminalClass *klass;
633 klass = TILDA_TERMINAL_CLASS (g_type_class_peek (TILDA_TYPE_TERMINAL));
634 obj = parent_class->constructor (type,
635 n_construct_properties,
636 construct_properties);
638 /* Do other stuff here. The object is ready to go now, and all
639 * ctor properties have been set.
641 * TODO: This is the place to do DBus-init */
642 self = TILDA_TERMINAL(obj);
644 /* Pack into the hbox */
645 gtk_box_pack_end (GTK_BOX(self->hbox), self->scrollbar, FALSE, FALSE, 0);
646 gtk_box_pack_end (GTK_BOX(self->hbox), self->vte_term, TRUE, TRUE, 0);
647 gtk_widget_show (self->scrollbar);
649 /* Match URL's, etc */
650 ret = vte_terminal_match_add (VTE_TERMINAL(self->vte_term), DINGUS1);
651 vte_terminal_match_set_cursor_type (VTE_TERMINAL(self->vte_term), ret, GDK_HAND2);
652 ret = vte_terminal_match_add(VTE_TERMINAL(self->vte_term), DINGUS2);
653 vte_terminal_match_set_cursor_type (VTE_TERMINAL(self->vte_term), ret, GDK_HAND2);
655 /* Connect Signals */
656 g_signal_connect (G_OBJECT(self->vte_term), "child-exited",
657 G_CALLBACK(tilda_terminal_child_exited_cb), self);
658 g_signal_connect (G_OBJECT(self->vte_term), "eof",
659 G_CALLBACK(tilda_terminal_child_exited_cb), self);
660 g_signal_connect (G_OBJECT(self->vte_term), "window-title-changed",
661 G_CALLBACK(tilda_terminal_window_title_changed_cb), self);
662 g_signal_connect (G_OBJECT(self->vte_term), "button-press-event",
663 G_CALLBACK(tilda_terminal_button_press_cb), self);
665 tilda_terminal_start_shell (self);
666 tilda_terminal_dbus_register_object (self);
672 tilda_terminal_dispose (GObject *obj)
674 TildaTerminal *self = (TildaTerminal *) obj;
676 /* We don't want to run dispose twice, so just return immediately */
677 if (self->dispose_has_run)
680 self->dispose_has_run = TRUE;
683 * In dispose, you are supposed to free all types referenced from this
684 * object which might themselves hold a reference to self. Generally,
685 * the most simple solution is to unref all members on which you own a
689 /* Chain up to the parent class */
690 G_OBJECT_CLASS (parent_class)->dispose (obj);
694 tilda_terminal_finalize (GObject *obj)
696 TildaTerminal *self = (TildaTerminal *) obj;
699 * Here, complete object destruction.
700 * You might not need to do much...
703 // TODO: g_free() any primitives here
704 g_free (self->background_image);
705 g_free (self->shell);
707 g_free (self->title);
708 g_free (self->working_directory);
711 /* Chain up to the parent class */
712 G_OBJECT_CLASS (parent_class)->finalize (obj);
716 tilda_terminal_class_init (gpointer g_class,
717 gpointer g_class_data)
719 GObjectClass *gobject_class = G_OBJECT_CLASS (g_class);
720 TildaTerminalClass *klass = TILDA_TERMINAL_CLASS (g_class);
723 /* Hook our functions to this type */
724 gobject_class->set_property = tilda_terminal_set_property;
725 gobject_class->get_property = tilda_terminal_get_property;
726 gobject_class->dispose = tilda_terminal_dispose;
727 gobject_class->finalize = tilda_terminal_finalize;
728 gobject_class->constructor = tilda_terminal_constructor;
730 parent_class = g_type_class_peek_parent (klass);
732 /* Hook the TildaTerminal type into DBus */
733 dbus_g_object_type_install_info (tilda_terminal_get_type(), &dbus_glib_tilda_terminal_object_info);
735 /* Install all of the properties */
736 pspec = g_param_spec_int ("number",
738 "Set terminal's number",
740 INT_MAX, // max value
742 G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE);
744 g_object_class_install_property (gobject_class,
745 TILDA_TERMINAL_NUMBER,
748 pspec = g_param_spec_int ("window-number",
749 "Number of the window to which this terminal belongs",
750 "Set the number of the parent window",
754 G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE);
756 g_object_class_install_property (gobject_class,
757 TILDA_TERMINAL_WINDOW_NUMBER,
760 pspec = g_param_spec_pointer ("parent-window",
761 "Pointer to terminal's parent TildaWindow",
762 "Set the pointer to the terminal's parent TildaWindow",
763 G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE);
765 g_object_class_install_property (gobject_class,
769 pspec = g_param_spec_string ("background-image",
770 "Terminal's background image",
771 "Get/Set terminal's background image",
775 g_object_class_install_property (gobject_class,
776 TILDA_TERMINAL_BACKGROUND_IMAGE,
779 pspec = g_param_spec_string ("shell",
781 "Get/Set terminal's shell",
785 g_object_class_install_property (gobject_class,
786 TILDA_TERMINAL_SHELL,
789 pspec = g_param_spec_string ("font",
791 "Get/Set terminal's font",
795 g_object_class_install_property (gobject_class,
799 pspec = g_param_spec_string ("title",
801 "Get/Set terminal's title",
805 g_object_class_install_property (gobject_class,
806 TILDA_TERMINAL_TITLE,
809 pspec = g_param_spec_string ("working-directory",
810 "Terminal's initial working directory",
811 "Get/Set terminal's initial working directory",
815 g_object_class_install_property (gobject_class,
816 TILDA_TERMINAL_WORKING_DIRECTORY,
819 pspec = g_param_spec_string ("web-browser",
820 "Terminal's web browser command",
825 g_object_class_install_property (gobject_class,
826 TILDA_TERMINAL_WEB_BROWSER,
829 pspec = g_param_spec_int ("scrollback-lines",
830 "Terminal's scrollback amount (lines)",
831 "Get/Set terminal's scrollback amount",
833 INT_MAX, // TODO: artificially limit this?
837 g_object_class_install_property (gobject_class,
838 TILDA_TERMINAL_SCROLLBACK_LINES,
841 pspec = g_param_spec_int ("transparency-percent",
842 "Terminal's transparency (percent)",
843 "Get/Set terminal's transparency",
849 g_object_class_install_property (gobject_class,
850 TILDA_TERMINAL_TRANSPARENCY_PERCENT,
853 pspec = g_param_spec_int ("backspace-binding",
854 "Terminal's backspace binding",
855 "Get/Set terminal's backspace key binding",
857 VTE_ERASE_DELETE_SEQUENCE,
861 g_object_class_install_property (gobject_class,
862 TILDA_TERMINAL_BACKSPACE_BINDING,
865 pspec = g_param_spec_int ("delete-binding",
866 "Terminal's delete binding",
867 "Get/Set terminal's delete key binding",
869 VTE_ERASE_DELETE_SEQUENCE,
873 g_object_class_install_property (gobject_class,
874 TILDA_TERMINAL_DELETE_BINDING,
877 pspec = g_param_spec_int ("dynamic-title",
878 "Terminal's dynamic title generation method",
879 "Get/Set terminal's dynamic title generation method",
885 g_object_class_install_property (gobject_class,
886 TILDA_TERMINAL_DYNAMIC_TITLE,
889 pspec = g_param_spec_int ("exit-action",
890 "Terminal's action upon child exit",
891 "Get/Set terminal's action upon child exit",
897 g_object_class_install_property (gobject_class,
898 TILDA_TERMINAL_EXIT_ACTION,
901 pspec = g_param_spec_boolean ("scroll-background",
902 "Controls terminal's scrolling behavior",
903 "Get/Set terminal's scrolling behavior",
907 g_object_class_install_property (gobject_class,
908 TILDA_TERMINAL_SCROLL_BACKGROUND,
911 pspec = g_param_spec_boolean ("scroll-on-output",
912 "Controls terminal's scrolling behavior on output",
913 "Get/Set terminal's scrolling behavior on output",
917 g_object_class_install_property (gobject_class,
918 TILDA_TERMINAL_SCROLL_ON_OUTPUT,
921 pspec = g_param_spec_boolean ("scroll-on-keystroke",
922 "Controls the terminal's scrolling behavior on keystroke",
923 NULL, FALSE, G_PARAM_READWRITE);
925 g_object_class_install_property (gobject_class,
926 TILDA_TERMINAL_SCROLL_ON_KEYSTROKE,
929 pspec = g_param_spec_boolean ("antialiased",
930 "Attempt to antialias fonts",
931 NULL, FALSE, G_PARAM_READWRITE);
933 g_object_class_install_property (gobject_class,
934 TILDA_TERMINAL_ANTIALIASED,
937 pspec = g_param_spec_boolean ("allow-bold-text",
939 NULL, FALSE, G_PARAM_READWRITE);
941 g_object_class_install_property (gobject_class,
942 TILDA_TERMINAL_ALLOW_BOLD_TEXT,
945 pspec = g_param_spec_boolean ("cursor-blinks",
946 NULL, NULL, FALSE, G_PARAM_READWRITE);
948 g_object_class_install_property (gobject_class,
949 TILDA_TERMINAL_CURSOR_BLINKS,
952 pspec = g_param_spec_boolean ("audible-bell",
953 NULL, NULL, FALSE, G_PARAM_READWRITE);
955 g_object_class_install_property (gobject_class,
956 TILDA_TERMINAL_AUDIBLE_BELL,
959 pspec = g_param_spec_boolean ("visible-bell",
960 NULL, NULL, FALSE, G_PARAM_READWRITE);
962 g_object_class_install_property (gobject_class,
963 TILDA_TERMINAL_VISIBLE_BELL,
966 pspec = g_param_spec_boolean ("double-buffered",
967 NULL, NULL, FALSE, G_PARAM_READWRITE);
969 g_object_class_install_property (gobject_class,
970 TILDA_TERMINAL_DOUBLE_BUFFERED,
973 pspec = g_param_spec_boolean ("mouse-autohide",
974 NULL, NULL, FALSE, G_PARAM_READWRITE);
976 g_object_class_install_property (gobject_class,
977 TILDA_TERMINAL_MOUSE_AUTOHIDE,
982 tilda_terminal_get_type (void)
984 static GType type = 0;
988 static const GTypeInfo info = {
989 sizeof (TildaTerminalClass),
990 NULL, /* base_init */
991 NULL, /* base_finalize */
992 tilda_terminal_class_init, /* class_init */
993 NULL, /* class_finalize */
994 NULL, /* class_data */
995 sizeof (TildaTerminal),
997 tilda_terminal_instance_init, /* instance_init */
1000 type = g_type_register_static (G_TYPE_OBJECT,
1001 "TildaTerminalType",
1011 int main (int argc, char *argv[])
1014 gint test_number = INT_MIN;
1015 gchar *test_string = NULL;
1017 /* Initialize the GObject type system */
1019 gtk_init (&argc, &argv);
1021 tt = g_object_new (TILDA_TYPE_TERMINAL, "number", 10, NULL);
1022 g_object_get (G_OBJECT (tt), "number", &test_number, NULL);
1023 g_assert (test_number == 10);
1025 g_object_unref (G_OBJECT (tt));
1027 tt = g_object_new (TILDA_TYPE_TERMINAL, "number", 22, NULL);
1028 g_object_get (G_OBJECT (tt), "number", &test_number, NULL);
1029 g_assert (test_number == 22);
1031 g_object_set (G_OBJECT (tt), "font", "hello I'm a font");
1032 g_object_set (G_OBJECT (tt), "font", "Bitstream Vera Sans Mono 13");
1034 g_object_get (G_OBJECT (tt), "font", &test_string, NULL);
1035 g_print ("Read Font: %s\n", test_string);
1036 // NOTE: you MUST free the string!!!!
1037 g_free (test_string);
1039 g_object_set (G_OBJECT (tt), "transparency-percent", 50);
1041 g_object_unref (G_OBJECT (tt));
1048 /* vim: set ts=4 sts=4 sw=4 noet tw=112: */