X-Git-Url: https://irasnyder.com/gitweb/?a=blobdiff_plain;f=tilda-window.c;h=87849d8fd0aa3bc645ced2c99b9fa7762dcd0022;hb=93db48f0c2f7a1185d4da9d9ab7cde83b9a3aa94;hp=e7a4f24af2c14d3d508c3f984cf144f4d42ca650;hpb=991bd2ff6b3b8d56e2ab8c0e2722848da74422c0;p=tilda-gobject.git diff --git a/tilda-window.c b/tilda-window.c index e7a4f24..87849d8 100644 --- a/tilda-window.c +++ b/tilda-window.c @@ -1,6 +1,10 @@ +#include /* for strcmp() */ +#include /* for gdk_x11_window_set_user_time() */ + #include "tilda.h" #include "tilda-window.h" #include "tilda-window-dbus-glue.h" +#include "tomboykeybinder.h" /** * Find the TildaTerminal corresponding to the currently selected @@ -31,10 +35,10 @@ tilda_window_find_current_terminal (TildaWindow *self) } static gint -tilda_window_find_next_free_terminal_number (TildaWindow *tw) +tilda_window_find_next_free_terminal_number (TildaWindow *self) { debug_enter (); - debug_assert (TILDA_IS_WINDOW(tw)); + debug_assert (TILDA_IS_WINDOW(self)); gint i, j; gboolean found; @@ -43,9 +47,9 @@ tilda_window_find_next_free_terminal_number (TildaWindow *tw) { found = FALSE; - for (j=0; jterms->len; ++j) + for (j=0; jterms->len; ++j) { - TildaTerminal *tt = g_ptr_array_index (tw->terms, j); + TildaTerminal *tt = g_ptr_array_index (self->terms, j); if (tt->number == i) { @@ -61,30 +65,48 @@ tilda_window_find_next_free_terminal_number (TildaWindow *tw) return 0; } -static gboolean -tilda_window_add_term (TildaWindow *tw) +/** + * Clean up and remove self completely from the program + * + * Should only be used by DBus... + */ +gboolean +tilda_window_close (TildaWindow *self) +{ + debug_enter (); + debug_assert (TILDA_IS_WINDOW(self)); + + tilda_del_window (self->number); + + return TRUE; +} + +gboolean +tilda_window_add_terminal (TildaWindow *self) { debug_enter (); - debug_assert (TILDA_IS_WINDOW(tw)); + debug_assert (TILDA_IS_WINDOW(self)); gint number; TildaTerminal *tt; - number = tilda_window_find_next_free_terminal_number (tw); + number = tilda_window_find_next_free_terminal_number (self); tt = g_object_new (TILDA_TYPE_TERMINAL, "number", number, - "window-number", tw->number, - "parent-window", tw, + "parent-window", self, NULL); - g_ptr_array_add (tw->terms, tt); + g_ptr_array_add (self->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); + gint index = gtk_notebook_prepend_page (GTK_NOTEBOOK(self->notebook), tt->hbox, label); + gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK(self->notebook), tt->hbox, TRUE, TRUE, GTK_PACK_END); + gtk_notebook_set_current_page (GTK_NOTEBOOK(self->notebook), index); + + if (gtk_notebook_get_n_pages (GTK_NOTEBOOK(self->notebook)) > 1) + gtk_notebook_set_show_tabs (GTK_NOTEBOOK(self->notebook), TRUE); - if (gtk_notebook_get_n_pages (GTK_NOTEBOOK(tw->notebook)) > 1) - gtk_notebook_set_show_tabs (GTK_NOTEBOOK(tw->notebook), TRUE); + /* Focus the VTE Terminal */ + gtk_widget_grab_focus (tt->vte_term); return TRUE; } @@ -96,21 +118,21 @@ tilda_window_add_term (TildaWindow *tw) * Return: TRUE on success, FALSE otherwise. */ gboolean -tilda_window_remove_term (TildaWindow *tw, gint terminal_number) +tilda_window_remove_terminal (TildaWindow *self, gint terminal_number) { debug_enter (); - debug_assert (TILDA_IS_WINDOW(tw)); + debug_assert (TILDA_IS_WINDOW(self)); debug_assert (terminal_number >= 0); gint i; - for (i=0; iterms->len; ++i) + for (i=0; iterms->len; ++i) { - TildaTerminal *tt = g_ptr_array_index (tw->terms, i); + TildaTerminal *tt = g_ptr_array_index (self->terms, i); if (tt->number == terminal_number) { - gint notebook_index = gtk_notebook_page_num (GTK_NOTEBOOK(tw->notebook), tt->hbox); + gint notebook_index = gtk_notebook_page_num (GTK_NOTEBOOK(self->notebook), tt->hbox); /* Make sure the index was valid */ if (notebook_index == -1) @@ -120,23 +142,23 @@ tilda_window_remove_term (TildaWindow *tw, gint terminal_number) } /* Actually remove the terminal */ - gtk_notebook_remove_page (GTK_NOTEBOOK (tw->notebook), notebook_index); + gtk_notebook_remove_page (GTK_NOTEBOOK (self->notebook), notebook_index); /* We should hide the tabs if there is only one tab left */ - if (gtk_notebook_get_n_pages (GTK_NOTEBOOK (tw->notebook)) == 1) - gtk_notebook_set_show_tabs (GTK_NOTEBOOK (tw->notebook), FALSE); - -#if 0 - // FIXME FIXME FIXME: need to actually do the stuff below - /* With no pages left, it's time to leave the program */ - if (gtk_notebook_get_n_pages (GTK_NOTEBOOK (tw->notebook)) < 1) - gtk_main_quit (); -#endif + if (gtk_notebook_get_n_pages (GTK_NOTEBOOK (self->notebook)) == 1) + gtk_notebook_set_show_tabs (GTK_NOTEBOOK (self->notebook), FALSE); /* Remove the term from our lists, then free it */ - g_ptr_array_remove_fast (tw->terms, tt); + g_ptr_array_remove_fast (self->terms, tt); g_object_unref (G_OBJECT(tt)); + /* With no pages left, it's time to remove this window */ + if (gtk_notebook_get_n_pages (GTK_NOTEBOOK (self->notebook)) < 1) + { + debug_printf ("no terminals left, closing window %d\n", self->number); + tilda_del_window (self->number); + } + /* Leave the loop, we're done */ break; } @@ -209,7 +231,12 @@ tilda_window_keybinding_cb (const gchar *keystr, gpointer data) TildaWindow *self = TILDA_WINDOW(data); TildaTerminal *tt; - // FIXME: this doesn't handle animation! + /* This call sets the X11 window property _NET_WM_USER_TIME, which GTK+ normally + * sets for us. However, because this callback is activated via a global keybinding, + * we see the event before GDK / GTK+ does. Therefore, to get the focus, we must + * set the property ourselves. */ + gdk_x11_window_set_user_time (GTK_WIDGET(self->window)->window, + tomboy_keybinder_get_current_event_time()); switch (self->state) { @@ -228,8 +255,7 @@ tilda_window_keybinding_cb (const gchar *keystr, gpointer data) "keep-above", self->keep_above, "stick", self->stick, NULL); - gtk_window_present_with_time (GTK_WINDOW(self->window), - tomboy_keybinder_get_current_event_time()); + gtk_widget_show (GTK_WIDGET(self->window)); /* Focusing the term here works perfectly, near as I can tell */ tt = tilda_window_find_current_terminal (self); @@ -273,7 +299,7 @@ tilda_window_try_to_bind_key (TildaWindow *self, const gchar *new_key) /* Unbind if we were set */ if (self->key) - tomboy_keybinder_unbind (self->key, tilda_window_keybinding_cb, self); + tomboy_keybinder_unbind (self->key, tilda_window_keybinding_cb); ret = tomboy_keybinder_bind (new_key, tilda_window_keybinding_cb, self); @@ -285,7 +311,7 @@ tilda_window_try_to_bind_key (TildaWindow *self, const gchar *new_key) return TRUE; } - g_printerr ("Keybinding unsuccessful. Reverting to original key\n"); + g_printerr (_("Bind key '%s' failed. Reverting to original keybinding\n"), self->key); /* Not successful, so rebind the old key, and return FALSE */ if (self->key != NULL && strcmp("",self->key) != 0) @@ -294,25 +320,25 @@ tilda_window_try_to_bind_key (TildaWindow *self, const gchar *new_key) /* Check that it went ok */ if (!ret) - g_printerr ("Unable to bind original key as well! Oh shit...\n"); + g_printerr (_("Unable to re-bind original key '%s'. Oh shit...\n"), self->key); } else - g_printerr ("No original key to revert to!\n"); + g_printerr (_("No original key to revert to!\n")); return FALSE; } static void -tilda_window_dbus_register_object (TildaWindow *tw) +tilda_window_dbus_register_object (TildaWindow *self) { debug_enter (); - debug_assert (TILDA_IS_WINDOW(tw)); + debug_assert (TILDA_IS_WINDOW(self)); gchar *object_path; // Register this object with DBus - object_path = g_strdup_printf ("/net/sourceforge/Tilda/Window%d", tw->number); - dbus_g_connection_register_g_object (dbus_connection, object_path, G_OBJECT(tw)); + object_path = g_strdup_printf ("/net/sourceforge/Tilda/Window%d", self->number); + dbus_g_connection_register_g_object (dbus_connection, object_path, G_OBJECT(self)); g_free (object_path); } @@ -580,8 +606,7 @@ tilda_window_constructor (GType type, /* Do other stuff here. The object is ready to go now, and all * ctor properties have been set. - * - * TODO: This is the place to do DBus-init */ + */ self = TILDA_WINDOW(obj); /* Register this object with DBus */ @@ -591,6 +616,7 @@ tilda_window_constructor (GType type, tilda_window_setup_real_transparency (self); gtk_container_add (GTK_CONTAINER(self->window), self->notebook); + g_object_set (G_OBJECT(self->notebook), "can-focus", FALSE, NULL); gtk_widget_show (self->notebook); // FIXME: Remove these, and replace with reads from the config system @@ -603,8 +629,8 @@ tilda_window_constructor (GType type, gtk_window_set_decorated (GTK_WINDOW(self->window), FALSE); // FIXME: It should be configurable how many terms we add at startup - tilda_window_add_term (self); - tilda_window_add_term (self); + tilda_window_add_terminal (self); + tilda_window_add_terminal (self); /* Show us if we're ready. If not, just remain hidden. All sub-widgets must * be gtk_widget_show()n by this point. */ @@ -695,8 +721,8 @@ tilda_window_class_init (gpointer g_class, /* Install all of the properties */ pspec = g_param_spec_int ("number", - "Window number", - "Set window's number", + _("Window number"), + NULL, 0, // min value INT_MAX, // max value 0, // def value @@ -707,7 +733,7 @@ tilda_window_class_init (gpointer g_class, pspec); pspec = g_param_spec_string ("key", - "Window's drop-down keybinding", + _("Window's drop-down keybinding"), NULL, NULL, G_PARAM_READWRITE); @@ -717,7 +743,7 @@ tilda_window_class_init (gpointer g_class, pspec); pspec = g_param_spec_int ("height", - "Window's height", + _("Window's height"), NULL, 0, INT_MAX, @@ -729,7 +755,7 @@ tilda_window_class_init (gpointer g_class, pspec); pspec = g_param_spec_int ("width", - "Window's width", + _("Window's width"), NULL, 0, INT_MAX, @@ -741,7 +767,7 @@ tilda_window_class_init (gpointer g_class, pspec); pspec = g_param_spec_int ("x-position", - "Window's x position", + _("Window's x position"), NULL, 0, INT_MAX, @@ -753,7 +779,7 @@ tilda_window_class_init (gpointer g_class, pspec); pspec = g_param_spec_int ("y-position", - "Window's y position", + _("Window's y position"), NULL, 0, INT_MAX, @@ -765,7 +791,7 @@ tilda_window_class_init (gpointer g_class, pspec); pspec = g_param_spec_int ("tab-position", - "Window's tab position", + _("Position of window's tab bar"), NULL, 0, INT_MAX, @@ -777,7 +803,7 @@ tilda_window_class_init (gpointer g_class, pspec); pspec = g_param_spec_int ("animation-orientation", - "Window's animation orientation", + _("Window's animation orientation"), NULL, 0, INT_MAX, @@ -789,7 +815,7 @@ tilda_window_class_init (gpointer g_class, pspec); pspec = g_param_spec_int ("animation-delay", - "Amount of time in milliseconds between animation intervals", + _("Amount of time in milliseconds between animation intervals"), NULL, 0, INT_MAX, @@ -801,7 +827,7 @@ tilda_window_class_init (gpointer g_class, pspec); pspec = g_param_spec_boolean ("keep-above", - "Keep this window above all others", + _("Keep this window above all others"), NULL, FALSE, G_PARAM_READWRITE); @@ -811,7 +837,7 @@ tilda_window_class_init (gpointer g_class, pspec); pspec = g_param_spec_boolean ("skip-taskbar-hint", - "Hide this window in the taskbar if TRUE", + _("Hide this window in the taskbar if TRUE"), NULL, FALSE, G_PARAM_READWRITE); @@ -821,7 +847,7 @@ tilda_window_class_init (gpointer g_class, pspec); pspec = g_param_spec_boolean ("stick", - "Display this window on all workspaces", + _("Display this window on all workspaces"), NULL, FALSE, G_PARAM_READWRITE); @@ -831,7 +857,7 @@ tilda_window_class_init (gpointer g_class, pspec); pspec = g_param_spec_boolean ("hidden-at-start", - "Hide the window when it is first created", + _("Hide the window when it is first created"), NULL, FALSE, G_PARAM_READWRITE); @@ -841,7 +867,7 @@ tilda_window_class_init (gpointer g_class, pspec); pspec = g_param_spec_boolean ("centered-horizontally", - "Center the window horizontally", + _("Center the window horizontally"), NULL, FALSE, G_PARAM_READWRITE); @@ -851,7 +877,7 @@ tilda_window_class_init (gpointer g_class, pspec); pspec = g_param_spec_boolean ("centered-vertically", - "Center the window vertically", + _("Center the window vertically"), NULL, FALSE, G_PARAM_READWRITE); @@ -899,34 +925,4 @@ tilda_window_get_type (void) return type; } -#if 0 - -int main (int argc, char *argv[]) -{ - GObject *tw; - gint test_number = INT_MIN; - - /* Initialize the GObject type system */ - g_type_init (); - gtk_init (&argc, &argv); - - tw = g_object_new (TILDA_TYPE_WINDOW, "number", 10, NULL); - g_object_get (G_OBJECT (tw), "number", &test_number, NULL); - g_assert (test_number == 10); - - g_object_unref (G_OBJECT (tw)); - - tw = g_object_new (TILDA_TYPE_WINDOW, "number", 22, NULL); - 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; -} - -#endif - /* vim: set ts=4 sts=4 sw=4 noet tw=112: */