2 #include "tilda-terminal.h"
3 #include "tilda-terminal-dbus-glue.h"
6 tilda_terminal_dbus_register_object (TildaTerminal *tt)
10 // Register this object with DBus
11 object_path = g_strdup_printf ("/net/sourceforge/Tilda/Window%d/Terminal%d",
12 tt->window_number, tt->number);
13 dbus_g_connection_register_g_object (dbus_connection, object_path, G_OBJECT(tt));
17 static GObjectClass *parent_class = NULL;
22 * All GObject stuff is below. You probably don't need to change this...
25 enum tilda_terminal_properties {
26 TILDA_TERMINAL_NUMBER = 1,
27 TILDA_TERMINAL_WINDOW_NUMBER,
30 /* All non-constructor-only properties */
31 TILDA_TERMINAL_BACKGROUND_IMAGE,
35 TILDA_TERMINAL_WORKING_DIRECTORY,
37 TILDA_TERMINAL_SCROLLBACK_LINES,
38 TILDA_TERMINAL_TRANSPARENCY_PERCENT,
40 TILDA_TERMINAL_BACKSPACE_BINDING,
41 TILDA_TERMINAL_DELETE_BINDING,
42 TILDA_TERMINAL_DYNAMIC_TITLE,
43 TILDA_TERMINAL_EXIT_ACTION,
45 TILDA_TERMINAL_SCROLL_BACKGROUND,
46 TILDA_TERMINAL_SCROLL_ON_OUTPUT,
47 TILDA_TERMINAL_SCROLL_ON_KEYSTROKE,
48 TILDA_TERMINAL_ANTIALIASED,
49 TILDA_TERMINAL_ALLOW_BOLD_TEXT,
50 TILDA_TERMINAL_CURSOR_BLINKS,
51 TILDA_TERMINAL_AUDIBLE_BELL,
52 TILDA_TERMINAL_VISIBLE_BELL,
53 TILDA_TERMINAL_DOUBLE_BUFFERED,
57 tilda_terminal_instance_init (GTypeInstance *instance,
60 TildaTerminal *self = (TildaTerminal *) instance;
62 /* Initialize instance members and allocate any necessary memory here.
63 * NOTE: any constructor-time values will be set later. */
64 self->dispose_has_run = FALSE;
67 self->vte_term = vte_terminal_new ();
68 self->scrollbar = gtk_vscrollbar_new (VTE_TERMINAL(self->vte_term)->adjustment);
69 self->hbox = gtk_hbox_new (FALSE, 0);
73 tilda_terminal_set_property (GObject *object,
78 TildaTerminal *self = (TildaTerminal *) object;
80 switch (property_id) {
82 case TILDA_TERMINAL_NUMBER:
83 self->number = g_value_get_int (value);
84 g_print ("terminal number: %d\n", self->number);
87 case TILDA_TERMINAL_WINDOW_NUMBER:
88 self->window_number = g_value_get_int (value);
89 g_print ("terminal parent window number: %d\n", self->window_number);
92 case TILDA_TERMINAL_TW:
93 self->parent_window = g_value_get_pointer (value);
94 g_print ("terminal parent window: 0x%x\n", self->parent_window);
95 g_print ("terminal parent window number (direct): %d\n", TILDA_WINDOW(self->parent_window)->number);
98 case TILDA_TERMINAL_BACKGROUND_IMAGE:
99 g_free (self->background_image);
100 self->background_image = g_value_dup_string (value);
101 vte_terminal_set_background_image_file (VTE_TERMINAL(self->vte_term), self->background_image);
102 g_print ("terminal back img: %s\n", self->background_image);
105 case TILDA_TERMINAL_SHELL:
106 g_free (self->shell);
107 self->shell = g_value_dup_string (value);
108 g_print ("terminal shell: %s\n", self->shell);
111 case TILDA_TERMINAL_FONT:
113 self->font = g_value_dup_string (value);
114 vte_terminal_set_font_from_string_full (VTE_TERMINAL(self->vte_term),
117 g_print ("terminal font: %s\n", self->font);
120 case TILDA_TERMINAL_TITLE:
121 g_free (self->title);
122 self->title = g_value_dup_string (value);
123 g_print ("terminal title: %s\n", self->title);
126 case TILDA_TERMINAL_WORKING_DIRECTORY:
127 g_free (self->working_directory);
128 self->working_directory = g_value_dup_string (value);
129 g_print ("terminal wrk dir: %s\n", self->working_directory);
132 case TILDA_TERMINAL_SCROLLBACK_LINES:
133 self->scrollback_lines = g_value_get_int (value);
134 vte_terminal_set_scrollback_lines (VTE_TERMINAL(self->vte_term), self->scrollback_lines);
135 g_print ("terminal scrollback lines: %d\n", self->scrollback_lines);
138 case TILDA_TERMINAL_TRANSPARENCY_PERCENT:
139 self->transparency_percent = g_value_get_int (value);
140 g_print ("terminal transp percent: %d\n", self->transparency_percent);
143 case TILDA_TERMINAL_BACKSPACE_BINDING:
144 self->backspace_binding = g_value_get_int (value);
145 vte_terminal_set_backspace_binding (VTE_TERMINAL(self->vte_term), self->backspace_binding);
146 g_print ("terminal backspace key: %d\n", self->backspace_binding);
149 case TILDA_TERMINAL_DELETE_BINDING:
150 self->delete_binding = g_value_get_int (value);
151 vte_terminal_set_delete_binding (VTE_TERMINAL(self->vte_term), self->delete_binding);
152 g_print ("terminal delete key: %d\n", self->delete_binding);
155 case TILDA_TERMINAL_DYNAMIC_TITLE:
156 self->dynamic_title = g_value_get_int (value);
157 g_print ("terminal dynamic title: %d\n", self->dynamic_title);
160 case TILDA_TERMINAL_EXIT_ACTION:
161 self->exit_action = g_value_get_int (value);
162 g_print ("terminal exit action: %d\n", self->exit_action);
165 case TILDA_TERMINAL_SCROLL_BACKGROUND:
166 self->scroll_background = g_value_get_boolean (value);
167 vte_terminal_set_scroll_background (VTE_TERMINAL(self->vte_term), self->scroll_background);
168 g_print ("terminal scroll background: %d\n", self->scroll_background);
171 case TILDA_TERMINAL_SCROLL_ON_OUTPUT:
172 self->scroll_on_output = g_value_get_boolean (value);
173 vte_terminal_set_scroll_on_output (VTE_TERMINAL(self->vte_term), self->scroll_on_output);
174 g_print ("terminal scroll on output: %d\n", self->scroll_on_output);
177 case TILDA_TERMINAL_SCROLL_ON_KEYSTROKE:
178 self->scroll_on_keystroke = g_value_get_boolean (value);
179 vte_terminal_set_scroll_on_keystroke (VTE_TERMINAL(self->vte_term), self->scroll_on_keystroke);
180 g_print ("terminal scroll on keystroke: %d\n", self->scroll_on_keystroke);
183 case TILDA_TERMINAL_ANTIALIASED:
184 self->antialiased = g_value_get_boolean (value);
185 vte_terminal_set_font_from_string_full (VTE_TERMINAL(self->vte_term),
188 g_print ("terminal antialiased: %d\n", self->antialiased);
191 case TILDA_TERMINAL_ALLOW_BOLD_TEXT:
192 self->allow_bold_text = g_value_get_boolean (value);
193 vte_terminal_set_allow_bold (VTE_TERMINAL(self->vte_term), self->allow_bold_text);
194 g_print ("terminal allow bold text: %d\n", self->allow_bold_text);
197 case TILDA_TERMINAL_CURSOR_BLINKS:
198 self->cursor_blinks = g_value_get_boolean (value);
199 vte_terminal_set_cursor_blinks (VTE_TERMINAL(self->vte_term), self->cursor_blinks);
200 g_print ("terminal cursor blinks: %d\n", self->cursor_blinks);
203 case TILDA_TERMINAL_AUDIBLE_BELL:
204 self->audible_bell = g_value_get_boolean (value);
205 vte_terminal_set_audible_bell (VTE_TERMINAL(self->vte_term), self->audible_bell);
206 g_print ("terminal audible bell: %d\n", self->audible_bell);
209 case TILDA_TERMINAL_VISIBLE_BELL:
210 self->visible_bell = g_value_get_boolean (value);
211 vte_terminal_set_visible_bell (VTE_TERMINAL(self->vte_term), self->visible_bell);
212 g_print ("terminal visible bell: %d\n", self->visible_bell);
215 case TILDA_TERMINAL_DOUBLE_BUFFERED:
216 self->double_buffered = g_value_get_boolean (value);
217 gtk_widget_set_double_buffered (GTK_WIDGET(self->vte_term), self->double_buffered);
218 g_print ("terminal double buffered: %d\n", self->double_buffered);
222 /* We don't have this property... */
223 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
229 tilda_terminal_get_property (GObject *object,
234 TildaTerminal *self = (TildaTerminal *) object;
236 switch (property_id) {
238 case TILDA_TERMINAL_NUMBER:
239 g_value_set_int (value, self->number);
242 case TILDA_TERMINAL_WINDOW_NUMBER:
243 g_value_set_int (value, self->window_number);
246 case TILDA_TERMINAL_TW:
247 g_value_set_pointer (value, self->parent_window);
250 case TILDA_TERMINAL_BACKGROUND_IMAGE:
251 g_value_set_string (value, self->background_image);
254 case TILDA_TERMINAL_SHELL:
255 g_value_set_string (value, self->shell);
258 case TILDA_TERMINAL_FONT:
259 g_value_set_string (value, self->font);
262 case TILDA_TERMINAL_TITLE:
263 g_value_set_string (value, self->title);
266 case TILDA_TERMINAL_WORKING_DIRECTORY:
267 g_value_set_string (value, self->working_directory);
270 case TILDA_TERMINAL_SCROLLBACK_LINES:
271 g_value_set_int (value, self->scrollback_lines);
274 case TILDA_TERMINAL_TRANSPARENCY_PERCENT:
275 g_value_set_int (value, self->transparency_percent);
278 case TILDA_TERMINAL_BACKSPACE_BINDING:
279 g_value_set_int (value, self->backspace_binding);
282 case TILDA_TERMINAL_DELETE_BINDING:
283 g_value_set_int (value, self->delete_binding);
286 case TILDA_TERMINAL_DYNAMIC_TITLE:
287 g_value_set_int (value, self->dynamic_title);
290 case TILDA_TERMINAL_EXIT_ACTION:
291 g_value_set_int (value, self->exit_action);
294 case TILDA_TERMINAL_SCROLL_BACKGROUND:
295 g_value_set_boolean (value, self->scroll_background);
298 case TILDA_TERMINAL_SCROLL_ON_OUTPUT:
299 g_value_set_boolean (value, self->scroll_on_output);
302 case TILDA_TERMINAL_SCROLL_ON_KEYSTROKE:
303 g_value_set_boolean (value, self->scroll_on_keystroke);
306 case TILDA_TERMINAL_ANTIALIASED:
307 g_value_set_boolean (value, self->antialiased);
310 case TILDA_TERMINAL_ALLOW_BOLD_TEXT:
311 g_value_set_boolean (value, self->allow_bold_text);
314 case TILDA_TERMINAL_CURSOR_BLINKS:
315 g_value_set_boolean (value, self->cursor_blinks);
318 case TILDA_TERMINAL_AUDIBLE_BELL:
319 g_value_set_boolean (value, self->audible_bell);
322 case TILDA_TERMINAL_VISIBLE_BELL:
323 g_value_set_boolean (value, self->visible_bell);
326 case TILDA_TERMINAL_DOUBLE_BUFFERED:
327 g_value_set_boolean (value, self->double_buffered);
331 /* We don't have this property... */
332 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
338 tilda_terminal_constructor (GType type,
339 guint n_construct_properties,
340 GObjectConstructParam *construct_properties)
345 /* Invoke parent constructor */
346 TildaTerminalClass *klass;
347 klass = TILDA_TERMINAL_CLASS (g_type_class_peek (TILDA_TYPE_TERMINAL));
348 obj = parent_class->constructor (type,
349 n_construct_properties,
350 construct_properties);
352 /* Do other stuff here. The object is ready to go now, and all
353 * ctor properties have been set.
355 * TODO: This is the place to do DBus-init */
356 self = TILDA_TERMINAL(obj);
358 /* Pack into the hbox */
359 gtk_box_pack_end (GTK_BOX(self->hbox), self->scrollbar, FALSE, FALSE, 0);
360 gtk_box_pack_end (GTK_BOX(self->hbox), self->vte_term, TRUE, TRUE, 0);
361 gtk_widget_show (self->scrollbar);
364 g_signal_connect (G_OBJECT(self->vte_term), "child-exited",
365 G_CALLBACK(gtk_main_quit), self);
367 vte_terminal_fork_command (VTE_TERMINAL(self->vte_term), NULL, NULL, NULL, NULL, FALSE, FALSE, FALSE);
369 tilda_terminal_dbus_register_object (self);
375 tilda_terminal_dispose (GObject *obj)
377 TildaTerminal *self = (TildaTerminal *) obj;
379 /* We don't want to run dispose twice, so just return immediately */
380 if (self->dispose_has_run)
383 self->dispose_has_run = TRUE;
386 * In dispose, you are supposed to free all types referenced from this
387 * object which might themselves hold a reference to self. Generally,
388 * the most simple solution is to unref all members on which you own a
392 /* Chain up to the parent class */
393 G_OBJECT_CLASS (parent_class)->dispose (obj);
397 tilda_terminal_finalize (GObject *obj)
399 TildaTerminal *self = (TildaTerminal *) obj;
402 * Here, complete object destruction.
403 * You might not need to do much...
406 // TODO: g_free() any primitives here
407 g_free (self->background_image);
408 g_free (self->shell);
410 g_free (self->title);
411 g_free (self->working_directory);
414 /* Chain up to the parent class */
415 G_OBJECT_CLASS (parent_class)->finalize (obj);
419 tilda_terminal_class_init (gpointer g_class,
420 gpointer g_class_data)
422 GObjectClass *gobject_class = G_OBJECT_CLASS (g_class);
423 TildaTerminalClass *klass = TILDA_TERMINAL_CLASS (g_class);
426 /* Hook our functions to this type */
427 gobject_class->set_property = tilda_terminal_set_property;
428 gobject_class->get_property = tilda_terminal_get_property;
429 gobject_class->dispose = tilda_terminal_dispose;
430 gobject_class->finalize = tilda_terminal_finalize;
431 gobject_class->constructor = tilda_terminal_constructor;
433 parent_class = g_type_class_peek_parent (klass);
435 /* Hook the TildaTerminal type into DBus */
436 dbus_g_object_type_install_info (tilda_terminal_get_type(), &dbus_glib_tilda_terminal_object_info);
438 /* Install all of the properties */
439 pspec = g_param_spec_int ("number",
441 "Set terminal's number",
443 INT_MAX, // max value
445 G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE);
447 g_object_class_install_property (gobject_class,
448 TILDA_TERMINAL_NUMBER,
451 pspec = g_param_spec_int ("window-number",
452 "Number of the window to which this terminal belongs",
453 "Set the number of the parent window",
457 G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE);
459 g_object_class_install_property (gobject_class,
460 TILDA_TERMINAL_WINDOW_NUMBER,
463 pspec = g_param_spec_pointer ("parent-window",
464 "Pointer to terminal's parent TildaWindow",
465 "Set the pointer to the terminal's parent TildaWindow",
466 G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE);
468 g_object_class_install_property (gobject_class,
472 pspec = g_param_spec_string ("background-image",
473 "Terminal's background image",
474 "Get/Set terminal's background image",
478 g_object_class_install_property (gobject_class,
479 TILDA_TERMINAL_BACKGROUND_IMAGE,
482 pspec = g_param_spec_string ("shell",
484 "Get/Set terminal's shell",
488 g_object_class_install_property (gobject_class,
489 TILDA_TERMINAL_SHELL,
492 pspec = g_param_spec_string ("font",
494 "Get/Set terminal's font",
498 g_object_class_install_property (gobject_class,
502 pspec = g_param_spec_string ("title",
504 "Get/Set terminal's title",
508 g_object_class_install_property (gobject_class,
509 TILDA_TERMINAL_TITLE,
512 pspec = g_param_spec_string ("working-directory",
513 "Terminal's initial working directory",
514 "Get/Set terminal's initial working directory",
518 g_object_class_install_property (gobject_class,
519 TILDA_TERMINAL_WORKING_DIRECTORY,
522 pspec = g_param_spec_int ("scrollback-lines",
523 "Terminal's scrollback amount (lines)",
524 "Get/Set terminal's scrollback amount",
526 INT_MAX, // TODO: artificially limit this?
530 g_object_class_install_property (gobject_class,
531 TILDA_TERMINAL_SCROLLBACK_LINES,
534 pspec = g_param_spec_int ("transparency-percent",
535 "Terminal's transparency (percent)",
536 "Get/Set terminal's transparency",
542 g_object_class_install_property (gobject_class,
543 TILDA_TERMINAL_TRANSPARENCY_PERCENT,
546 pspec = g_param_spec_int ("backspace-binding",
547 "Terminal's backspace binding",
548 "Get/Set terminal's backspace key binding",
550 VTE_ERASE_DELETE_SEQUENCE,
554 g_object_class_install_property (gobject_class,
555 TILDA_TERMINAL_BACKSPACE_BINDING,
558 pspec = g_param_spec_int ("delete-binding",
559 "Terminal's delete binding",
560 "Get/Set terminal's delete key binding",
562 VTE_ERASE_DELETE_SEQUENCE,
566 g_object_class_install_property (gobject_class,
567 TILDA_TERMINAL_DELETE_BINDING,
570 pspec = g_param_spec_int ("dynamic-title",
571 "Terminal's dynamic title generation method",
572 "Get/Set terminal's dynamic title generation method",
578 g_object_class_install_property (gobject_class,
579 TILDA_TERMINAL_DYNAMIC_TITLE,
582 pspec = g_param_spec_int ("exit-action",
583 "Terminal's action upon child exit",
584 "Get/Set terminal's action upon child exit",
590 g_object_class_install_property (gobject_class,
591 TILDA_TERMINAL_EXIT_ACTION,
594 pspec = g_param_spec_boolean ("scroll-background",
595 "Controls terminal's scrolling behavior",
596 "Get/Set terminal's scrolling behavior",
600 g_object_class_install_property (gobject_class,
601 TILDA_TERMINAL_SCROLL_BACKGROUND,
604 pspec = g_param_spec_boolean ("scroll-on-output",
605 "Controls terminal's scrolling behavior on output",
606 "Get/Set terminal's scrolling behavior on output",
610 g_object_class_install_property (gobject_class,
611 TILDA_TERMINAL_SCROLL_ON_OUTPUT,
614 pspec = g_param_spec_boolean ("scroll-on-keystroke",
615 "Controls the terminal's scrolling behavior on keystroke",
616 NULL, FALSE, G_PARAM_READWRITE);
618 g_object_class_install_property (gobject_class,
619 TILDA_TERMINAL_SCROLL_ON_KEYSTROKE,
622 pspec = g_param_spec_boolean ("antialiased",
623 "Attempt to antialias fonts",
624 NULL, FALSE, G_PARAM_READWRITE);
626 g_object_class_install_property (gobject_class,
627 TILDA_TERMINAL_ANTIALIASED,
630 pspec = g_param_spec_boolean ("allow-bold-text",
632 NULL, FALSE, G_PARAM_READWRITE);
634 g_object_class_install_property (gobject_class,
635 TILDA_TERMINAL_ALLOW_BOLD_TEXT,
638 pspec = g_param_spec_boolean ("cursor-blinks",
639 NULL, NULL, FALSE, G_PARAM_READWRITE);
641 g_object_class_install_property (gobject_class,
642 TILDA_TERMINAL_CURSOR_BLINKS,
645 pspec = g_param_spec_boolean ("audible-bell",
646 NULL, NULL, FALSE, G_PARAM_READWRITE);
648 g_object_class_install_property (gobject_class,
649 TILDA_TERMINAL_AUDIBLE_BELL,
652 pspec = g_param_spec_boolean ("visible-bell",
653 NULL, NULL, FALSE, G_PARAM_READWRITE);
655 g_object_class_install_property (gobject_class,
656 TILDA_TERMINAL_VISIBLE_BELL,
659 pspec = g_param_spec_boolean ("double-buffered",
660 NULL, NULL, FALSE, G_PARAM_READWRITE);
662 g_object_class_install_property (gobject_class,
663 TILDA_TERMINAL_DOUBLE_BUFFERED,
668 tilda_terminal_get_type (void)
670 static GType type = 0;
674 static const GTypeInfo info = {
675 sizeof (TildaTerminalClass),
676 NULL, /* base_init */
677 NULL, /* base_finalize */
678 tilda_terminal_class_init, /* class_init */
679 NULL, /* class_finalize */
680 NULL, /* class_data */
681 sizeof (TildaTerminal),
683 tilda_terminal_instance_init, /* instance_init */
686 type = g_type_register_static (G_TYPE_OBJECT,
697 int main (int argc, char *argv[])
700 gint test_number = INT_MIN;
701 gchar *test_string = NULL;
703 /* Initialize the GObject type system */
705 gtk_init (&argc, &argv);
707 tt = g_object_new (TILDA_TYPE_TERMINAL, "number", 10, NULL);
708 g_object_get (G_OBJECT (tt), "number", &test_number, NULL);
709 g_assert (test_number == 10);
711 g_object_unref (G_OBJECT (tt));
713 tt = g_object_new (TILDA_TYPE_TERMINAL, "number", 22, NULL);
714 g_object_get (G_OBJECT (tt), "number", &test_number, NULL);
715 g_assert (test_number == 22);
717 g_object_set (G_OBJECT (tt), "font", "hello I'm a font");
718 g_object_set (G_OBJECT (tt), "font", "Bitstream Vera Sans Mono 13");
720 g_object_get (G_OBJECT (tt), "font", &test_string, NULL);
721 g_print ("Read Font: %s\n", test_string);
722 // NOTE: you MUST free the string!!!!
723 g_free (test_string);
725 g_object_set (G_OBJECT (tt), "transparency-percent", 50);
727 g_object_unref (G_OBJECT (tt));
734 /* vim: set ts=4 sts=4 sw=4 noet tw=112: */