From 4e526888171b87e4716b6b8b4c5dba39d42d8f79 Mon Sep 17 00:00:00 2001 From: "Ira W. Snyder" Date: Thu, 10 Jan 2008 19:32:30 -0800 Subject: [PATCH] Hook TildaTerminal and TildaWindow together This is the most basic of connections, but it's a good point to start testing with. We can add tabs to a TildaWindow, and all appears to work as expected, so far. --- Makefile | 4 +-- tilda-terminal.c | 18 ++++++++++++++ tilda-terminal.h | 4 ++- tilda-window.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++- tilda-window.h | 3 +++ 5 files changed, 89 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 7eadae5..1396ced 100644 --- a/Makefile +++ b/Makefile @@ -8,9 +8,9 @@ ALL_LIBS=`pkg-config --libs gtk+-2.0 vte` .PHONY: all memcheck-tt memcheck-tw memcheck clean -all: tilda-window tilda-terminal +all: tilda-window -tilda-window: tilda-window.o +tilda-window: tilda-window.o tilda-terminal.o $(GCC) $(CFLAGS) $^ -o $@ $(ALL_LIBS) tilda-window.o: tilda-window.c tilda-window.h diff --git a/tilda-terminal.c b/tilda-terminal.c index b074d78..1c76325 100644 --- a/tilda-terminal.c +++ b/tilda-terminal.c @@ -39,6 +39,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 @@ -181,6 +183,7 @@ tilda_terminal_constructor (GType type, GObjectConstructParam *construct_properties) { GObject *obj; + TildaTerminal *self; /* Invoke parent constructor */ TildaTerminalClass *klass; @@ -193,7 +196,18 @@ 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); + + + 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); return obj; } @@ -375,6 +389,8 @@ tilda_terminal_get_type (void) return type; } +#if 0 + int main (int argc, char *argv[]) { GObject *tt; @@ -410,4 +426,6 @@ int main (int argc, char *argv[]) return 0; } +#endif + /* vim: set ts=4 sts=4 sw=4 noet tw=112: */ diff --git a/tilda-terminal.h b/tilda-terminal.h index 8cc8741..80b1bef 100644 --- a/tilda-terminal.h +++ b/tilda-terminal.h @@ -7,7 +7,7 @@ #define TILDA_TYPE_TERMINAL (tilda_terminal_get_type()) -#define TILDA_TERMINAL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TILDA_TYPE_TERMINAL)) +#define TILDA_TERMINAL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TILDA_TYPE_TERMINAL, TildaTerminal)) #define TILDA_TERMINAL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TILDA_TYPE_TERMINAL, TildaTerminalClass)) #define TILDA_IS_TERMINAL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TILDA_TYPE_TERMINAL)) #define TILDA_IS_TERMINAL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TILDA_TYPE_TERMINAL)) @@ -24,6 +24,8 @@ struct _TildaTerminal { // FIXME: ADD THESE BACK // TildaWindow *tw; GtkWidget *vte_term; + GtkWidget *scrollbar; + GtkWidget *hbox; gint number; gchar *background_image; diff --git a/tilda-window.c b/tilda-window.c index 6b2c674..fdf2376 100644 --- a/tilda-window.c +++ b/tilda-window.c @@ -1,5 +1,44 @@ #include "tilda-window.h" +static gboolean +tilda_window_add_term (TildaWindow *tw) +{ + // FIXME: this is totally bad, but it's a good hack for feasability + static gint mynumber = 0; + TildaTerminal *tt = g_object_new (TILDA_TYPE_TERMINAL, "number", mynumber++, NULL); + g_ptr_array_add (tw->terms, tt); + + GtkWidget *label = gtk_label_new ("Tilda"); + gint index = gtk_notebook_prepend_page (GTK_NOTEBOOK(tw->notebook), tt->hbox, label); + gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK(tw->notebook), tt->hbox, TRUE, TRUE, GTK_PACK_END); + //gtk_notebook_set_current_page (GTK_NOTEBOOK(tw->notebook), index); + + if (gtk_notebook_get_n_pages (GTK_NOTEBOOK(tw->notebook)) > 1) + gtk_notebook_set_show_tabs (GTK_NOTEBOOK(tw->notebook), TRUE); + + return TRUE; +} + +static gboolean +tilda_window_remove_term (TildaWindow *tw, int number) +{ + int i; + + for (i=0; iterms->len; ++i) + { + TildaTerminal *tt = g_ptr_array_index (tw->terms, i); + + if (tt->number == number) + g_print ("Need to remove window %d terminal %d\n", tw->number, tt->number); + } + + return TRUE; +} + +/******************************************************************************* + * ALL GOBJECT STUFF BELOW PLEASE + ******************************************************************************/ + static GObjectClass *parent_class = NULL; enum tilda_window_properties { @@ -15,8 +54,10 @@ tilda_window_instance_init (GTypeInstance *instance, /* Initialize all properties */ self->window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + self->notebook = gtk_notebook_new (); self->terms = g_ptr_array_new (); + /* Somewhat of a "poison" value, incase we don't set this */ self->number = 0xdeadbeef; } @@ -69,6 +110,7 @@ tilda_window_constructor (GType type, GObjectConstructParam *construct_properties) { GObject *obj; + TildaWindow *self; /* Invoke parent constructor */ TildaWindowClass *klass; @@ -81,10 +123,23 @@ tilda_window_constructor (GType type, * ctor properties have been set. * * TODO: This is the place to do DBus-init */ + self = TILDA_WINDOW(obj); + + gtk_container_add (GTK_CONTAINER(self->window), self->notebook); + gtk_widget_show (self->notebook); + + tilda_window_add_term (self); + gtk_widget_show_all (self->window); return obj; } +static void +my_unref (gpointer data, gpointer user_data) +{ + g_object_unref (G_OBJECT(data)); +} + static void tilda_window_dispose (GObject *obj) { @@ -99,7 +154,12 @@ tilda_window_dispose (GObject *obj) * object which might themselves hold a reference to self. Generally, * the most simple solution is to unref all members on which you own a * reference. + * + * NOTE: See the following for how to deal with GtkObject-derived things: + * http://library.gnome.org/devel/gtk/unstable/GtkObject.html */ + g_ptr_array_foreach (self->terms, my_unref, NULL); + gtk_widget_destroy (self->window); /* Chain up to the parent class */ G_OBJECT_CLASS (parent_class)->dispose (obj); @@ -115,6 +175,7 @@ tilda_window_finalize (GObject *obj) * You might not need to do much... */ // TODO: g_free() any primitives here + g_ptr_array_free (self->terms, TRUE); /* Chain up to the parent class */ @@ -182,7 +243,6 @@ tilda_window_get_type (void) return type; } - int main (int argc, char *argv[]) { GObject *tw; @@ -202,6 +262,8 @@ int main (int argc, char *argv[]) g_object_get (G_OBJECT (tw), "number", &test_number, NULL); g_assert (test_number == 22); + gtk_main (); + g_object_unref (G_OBJECT (tw)); return 0; diff --git a/tilda-window.h b/tilda-window.h index 8663779..f40347a 100644 --- a/tilda-window.h +++ b/tilda-window.h @@ -20,6 +20,8 @@ tilda_window_finalize() #include #include +#include "tilda-terminal.h" + #define TILDA_TYPE_WINDOW (tilda_window_get_type()) #define TILDA_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TILDA_TYPE_WINDOW, TildaWindow)) #define TILDA_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TILDA_TYPE_WINDOW, TildaWindowClass)) @@ -36,6 +38,7 @@ struct _TildaWindow { /* Instance Members */ GtkWidget *window; + GtkWidget *notebook; GPtrArray *terms; gint number; -- 2.25.1