1 #include "tilda-terminal.h"
3 static GObjectClass *parent_class = NULL;
8 * All GObject stuff is below. You probably don't need to change this...
11 enum tilda_terminal_properties {
12 TILDA_TERMINAL_NUMBER = 1,
14 /* All non-constructor-only properties */
15 TILDA_TERMINAL_BACKGROUND_IMAGE,
19 TILDA_TERMINAL_WORKING_DIRECTORY,
21 TILDA_TERMINAL_SCROLLBACK_LINES,
22 TILDA_TERMINAL_TRANSPARENCY_PERCENT,
24 TILDA_TERMINAL_BACKSPACE_BINDING,
25 TILDA_TERMINAL_DELETE_BINDING,
26 TILDA_TERMINAL_DYNAMIC_TITLE,
27 TILDA_TERMINAL_EXIT_ACTION,
31 tilda_terminal_instance_init (GTypeInstance *instance,
34 TildaTerminal *self = (TildaTerminal *) instance;
36 /* Initialize instance members and allocate any necessary memory here.
37 * NOTE: any constructor-time values will be set later. */
38 self->dispose_has_run = FALSE;
41 self->vte_term = vte_terminal_new ();
42 self->scrollbar = gtk_vscrollbar_new (VTE_TERMINAL(self->vte_term)->adjustment);
43 self->hbox = gtk_hbox_new (FALSE, 0);
47 tilda_terminal_set_property (GObject *object,
52 TildaTerminal *self = (TildaTerminal *) object;
54 switch (property_id) {
56 case TILDA_TERMINAL_NUMBER:
57 self->number = g_value_get_int (value);
58 g_print ("terminal number: %d\n", self->number);
61 case TILDA_TERMINAL_BACKGROUND_IMAGE:
62 g_free (self->background_image);
63 self->background_image = g_value_dup_string (value);
64 // TODO: Actually set it in self->vte_term
65 g_print ("terminal back img: %s\n", self->background_image);
68 case TILDA_TERMINAL_SHELL:
70 self->shell = g_value_dup_string (value);
71 g_print ("terminal shell: %s\n", self->shell);
74 case TILDA_TERMINAL_FONT:
76 self->font = g_value_dup_string (value);
77 g_print ("terminal font: %s\n", self->font);
80 case TILDA_TERMINAL_TITLE:
82 self->title = g_value_dup_string (value);
83 g_print ("terminal title: %s\n", self->title);
86 case TILDA_TERMINAL_WORKING_DIRECTORY:
87 g_free (self->working_directory);
88 self->working_directory = g_value_dup_string (value);
89 g_print ("terminal wrk dir: %s\n", self->working_directory);
92 case TILDA_TERMINAL_SCROLLBACK_LINES:
93 self->scrollback_lines = g_value_get_int (value);
94 g_print ("terminal scrollback lines: %d\n", self->scrollback_lines);
97 case TILDA_TERMINAL_TRANSPARENCY_PERCENT:
98 self->transparency_percent = g_value_get_int (value);
99 g_print ("terminal transp percent: %d\n", self->transparency_percent);
102 case TILDA_TERMINAL_BACKSPACE_BINDING:
103 self->backspace_binding = g_value_get_int (value);
104 //vte_terminal_set_backspace_binding (VTE_TERMINAL(self->vte_term), self->backspace_binding);
105 g_print ("terminal backspace key: %d\n", self->backspace_binding);
108 case TILDA_TERMINAL_DELETE_BINDING:
109 self->delete_binding = g_value_get_int (value);
110 //vte_terminal_set_delete_binding (VTE_TERMINAL(self->vte_term), self->delete_binding);
111 g_print ("terminal delete key: %d\n", self->delete_binding);
114 case TILDA_TERMINAL_DYNAMIC_TITLE:
115 self->dynamic_title = g_value_get_int (value);
116 g_print ("terminal dynamic title: %d\n", self->dynamic_title);
119 case TILDA_TERMINAL_EXIT_ACTION:
120 self->exit_action = g_value_get_int (value);
121 g_print ("terminal exit action: %d\n", self->exit_action);
125 /* We don't have this property... */
126 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
132 tilda_terminal_get_property (GObject *object,
137 TildaTerminal *self = (TildaTerminal *) object;
139 switch (property_id) {
141 case TILDA_TERMINAL_NUMBER:
142 g_value_set_int (value, self->number);
145 case TILDA_TERMINAL_BACKGROUND_IMAGE:
146 g_value_set_string (value, self->background_image);
149 case TILDA_TERMINAL_SHELL:
150 g_value_set_string (value, self->shell);
153 case TILDA_TERMINAL_FONT:
154 g_value_set_string (value, self->font);
157 case TILDA_TERMINAL_TITLE:
158 g_value_set_string (value, self->title);
161 case TILDA_TERMINAL_WORKING_DIRECTORY:
162 g_value_set_string (value, self->working_directory);
165 case TILDA_TERMINAL_SCROLLBACK_LINES:
166 g_value_set_int (value, self->scrollback_lines);
169 case TILDA_TERMINAL_TRANSPARENCY_PERCENT:
170 g_value_set_int (value, self->transparency_percent);
174 /* We don't have this property... */
175 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
181 tilda_terminal_constructor (GType type,
182 guint n_construct_properties,
183 GObjectConstructParam *construct_properties)
188 /* Invoke parent constructor */
189 TildaTerminalClass *klass;
190 klass = TILDA_TERMINAL_CLASS (g_type_class_peek (TILDA_TYPE_TERMINAL));
191 obj = parent_class->constructor (type,
192 n_construct_properties,
193 construct_properties);
195 /* Do other stuff here. The object is ready to go now, and all
196 * ctor properties have been set.
198 * TODO: This is the place to do DBus-init */
199 self = TILDA_TERMINAL(obj);
201 /* Pack into the hbox */
202 gtk_box_pack_end (GTK_BOX(self->hbox), self->scrollbar, FALSE, FALSE, 0);
203 gtk_box_pack_end (GTK_BOX(self->hbox), self->vte_term, TRUE, TRUE, 0);
204 gtk_widget_show (self->scrollbar);
207 g_signal_connect (G_OBJECT(self->vte_term), "child-exited",
208 G_CALLBACK(gtk_main_quit), self);
210 vte_terminal_fork_command (VTE_TERMINAL(self->vte_term), NULL, NULL, NULL, NULL, FALSE, FALSE, FALSE);
216 tilda_terminal_dispose (GObject *obj)
218 TildaTerminal *self = (TildaTerminal *) obj;
220 /* We don't want to run dispose twice, so just return immediately */
221 if (self->dispose_has_run)
224 self->dispose_has_run = TRUE;
227 * In dispose, you are supposed to free all types referenced from this
228 * object which might themselves hold a reference to self. Generally,
229 * the most simple solution is to unref all members on which you own a
233 /* Chain up to the parent class */
234 G_OBJECT_CLASS (parent_class)->dispose (obj);
238 tilda_terminal_finalize (GObject *obj)
240 TildaTerminal *self = (TildaTerminal *) obj;
243 * Here, complete object destruction.
244 * You might not need to do much...
247 // TODO: g_free() any primitives here
248 g_free (self->background_image);
249 g_free (self->shell);
251 g_free (self->title);
252 g_free (self->working_directory);
255 /* Chain up to the parent class */
256 G_OBJECT_CLASS (parent_class)->finalize (obj);
260 tilda_terminal_class_init (gpointer g_class,
261 gpointer g_class_data)
263 GObjectClass *gobject_class = G_OBJECT_CLASS (g_class);
264 TildaTerminalClass *klass = TILDA_TERMINAL_CLASS (g_class);
267 /* Hook our functions to this type */
268 gobject_class->set_property = tilda_terminal_set_property;
269 gobject_class->get_property = tilda_terminal_get_property;
270 gobject_class->dispose = tilda_terminal_dispose;
271 gobject_class->finalize = tilda_terminal_finalize;
272 gobject_class->constructor = tilda_terminal_constructor;
274 parent_class = g_type_class_peek_parent (klass);
276 /* Install all of the properties */
277 pspec = g_param_spec_int ("number",
279 "Set terminal's number",
281 INT_MAX, // max value
283 G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE);
285 g_object_class_install_property (gobject_class,
286 TILDA_TERMINAL_NUMBER,
289 pspec = g_param_spec_string ("background-image",
290 "Terminal's background image",
291 "Get/Set terminal's background image",
295 g_object_class_install_property (gobject_class,
296 TILDA_TERMINAL_BACKGROUND_IMAGE,
299 pspec = g_param_spec_string ("shell",
301 "Get/Set terminal's shell",
305 g_object_class_install_property (gobject_class,
306 TILDA_TERMINAL_SHELL,
309 pspec = g_param_spec_string ("font",
311 "Get/Set terminal's font",
315 g_object_class_install_property (gobject_class,
319 pspec = g_param_spec_string ("title",
321 "Get/Set terminal's title",
325 g_object_class_install_property (gobject_class,
326 TILDA_TERMINAL_TITLE,
329 pspec = g_param_spec_string ("working-directory",
330 "Terminal's initial working directory",
331 "Get/Set terminal's initial working directory",
335 g_object_class_install_property (gobject_class,
336 TILDA_TERMINAL_WORKING_DIRECTORY,
339 pspec = g_param_spec_int ("scrollback-lines",
340 "Terminal's scrollback amount (lines)",
341 "Get/Set terminal's scrollback amount",
343 INT_MAX, // TODO: artificially limit this?
347 g_object_class_install_property (gobject_class,
348 TILDA_TERMINAL_SCROLLBACK_LINES,
351 pspec = g_param_spec_int ("transparency-percent",
352 "Terminal's transparency (percent)",
353 "Get/Set terminal's transparency",
359 g_object_class_install_property (gobject_class,
360 TILDA_TERMINAL_TRANSPARENCY_PERCENT,
365 tilda_terminal_get_type (void)
367 static GType type = 0;
371 static const GTypeInfo info = {
372 sizeof (TildaTerminalClass),
373 NULL, /* base_init */
374 NULL, /* base_finalize */
375 tilda_terminal_class_init, /* class_init */
376 NULL, /* class_finalize */
377 NULL, /* class_data */
378 sizeof (TildaTerminal),
380 tilda_terminal_instance_init, /* instance_init */
383 type = g_type_register_static (G_TYPE_OBJECT,
394 int main (int argc, char *argv[])
397 gint test_number = INT_MIN;
398 gchar *test_string = NULL;
400 /* Initialize the GObject type system */
402 gtk_init (&argc, &argv);
404 tt = g_object_new (TILDA_TYPE_TERMINAL, "number", 10, NULL);
405 g_object_get (G_OBJECT (tt), "number", &test_number, NULL);
406 g_assert (test_number == 10);
408 g_object_unref (G_OBJECT (tt));
410 tt = g_object_new (TILDA_TYPE_TERMINAL, "number", 22, NULL);
411 g_object_get (G_OBJECT (tt), "number", &test_number, NULL);
412 g_assert (test_number == 22);
414 g_object_set (G_OBJECT (tt), "font", "hello I'm a font");
415 g_object_set (G_OBJECT (tt), "font", "Bitstream Vera Sans Mono 13");
417 g_object_get (G_OBJECT (tt), "font", &test_string, NULL);
418 g_print ("Read Font: %s\n", test_string);
419 // NOTE: you MUST free the string!!!!
420 g_free (test_string);
422 g_object_set (G_OBJECT (tt), "transparency-percent", 50);
424 g_object_unref (G_OBJECT (tt));
431 /* vim: set ts=4 sts=4 sw=4 noet tw=112: */