gnome-terminal r2787 - trunk/src
- From: chpe svn gnome org
- To: svn-commits-list gnome org
- Subject: gnome-terminal r2787 - trunk/src
- Date: Thu, 29 May 2008 19:54:16 +0000 (UTC)
Author: chpe
Date: Thu May 29 19:54:16 2008
New Revision: 2787
URL: http://svn.gnome.org/viewvc/gnome-terminal?rev=2787&view=rev
Log:
Fix detaching tab.
The problem is that when we remove the old screen container from the source window,
the container and its containing tab get gtk_widget_destroyed(). So we need to ref
not only the screen but also the container beforehand.
Modified:
trunk/src/terminal-screen.c
trunk/src/terminal-window.c
trunk/src/terminal-window.h
Modified: trunk/src/terminal-screen.c
==============================================================================
--- trunk/src/terminal-screen.c (original)
+++ trunk/src/terminal-screen.c Thu May 29 19:54:16 2008
@@ -1982,9 +1982,8 @@
TerminalScreen *moving_screen;
TerminalWindow *source_window;
TerminalWindow *dest_window;
- GtkWidget *source_notebook;
GtkWidget *dest_notebook;
- gint page_num;
+ int page_num;
/* FIXMEchpe same-app only!? */
container = *(GtkWidget**) selection_data->data;
@@ -1997,15 +1996,11 @@
return;
source_window = moving_screen->priv->window;
- source_notebook = terminal_window_get_notebook (source_window);
dest_window = screen->priv->window;
dest_notebook = terminal_window_get_notebook (dest_window);
page_num = gtk_notebook_page_num (GTK_NOTEBOOK (dest_notebook),
GTK_WIDGET (screen));
-
- g_object_ref_sink (moving_screen);
- terminal_window_add_screen (dest_window, moving_screen, page_num);
- g_object_unref (moving_screen);
+ terminal_window_move_screen (source_window, dest_window, moving_screen, page_num + 1);
gtk_drag_finish (context, TRUE, TRUE, time);
}
Modified: trunk/src/terminal-window.c
==============================================================================
--- trunk/src/terminal-window.c (original)
+++ trunk/src/terminal-window.c Thu May 29 19:54:16 2008
@@ -1093,7 +1093,6 @@
screen_close_cb (TerminalScreen *screen,
TerminalWindow *window)
{
- g_print ("window %p screen-close %p\n", window, screen);
terminal_window_remove_screen (window, screen);
}
@@ -1779,12 +1778,12 @@
void
terminal_window_add_screen (TerminalWindow *window,
TerminalScreen *screen,
- gint position)
+ int position)
{
TerminalWindowPrivate *priv = window->priv;
GtkWidget *old_window;
GtkWidget *screen_container, *tab_label;
-
+
old_window = gtk_widget_get_toplevel (GTK_WIDGET (screen));
if (GTK_WIDGET_TOPLEVEL (old_window) &&
TERMINAL_IS_WINDOW (old_window) &&
@@ -1838,6 +1837,41 @@
gtk_notebook_remove_page (GTK_NOTEBOOK (priv->notebook), num_page);
}
+
+void
+terminal_window_move_screen (TerminalWindow *source_window,
+ TerminalWindow *dest_window,
+ TerminalScreen *screen,
+ int dest_position)
+{
+ GtkWidget *screen_container;
+
+ g_return_if_fail (TERMINAL_IS_WINDOW (source_window));
+ g_return_if_fail (TERMINAL_IS_WINDOW (dest_window));
+ g_return_if_fail (TERMINAL_IS_SCREEN (screen));
+ g_return_if_fail (gtk_widget_get_toplevel (GTK_WIDGET (screen)) == GTK_WIDGET (source_window));
+ g_return_if_fail (dest_position >= -1);
+
+ screen_container = GTK_WIDGET (screen)->parent;
+ g_return_if_fail (GTK_IS_WIDGET (screen_container));
+
+ /* We have to ref the screen container as well as the screen,
+ * because otherwise removing the screen container from the source
+ * window's notebook will cause the container and its containing
+ * screen to be gtk_widget_destroy()ed!
+ */
+ g_object_ref_sink (screen_container);
+ g_object_ref_sink (screen);
+ terminal_window_remove_screen (source_window, screen);
+
+ /* Now we can safely remove the screen from the container and let the container die */
+ gtk_container_remove (GTK_CONTAINER (screen_container), GTK_WIDGET (screen));
+ g_object_unref (screen_container);
+
+ terminal_window_add_screen (dest_window, screen, dest_position);
+ g_object_unref (screen);
+}
+
GList*
terminal_window_list_screens (TerminalWindow *window)
{
@@ -2801,10 +2835,7 @@
geometry);
g_free (geometry);
- g_object_ref_sink (screen);
- terminal_window_remove_screen (window, screen);
- terminal_window_add_screen (new_window, screen, -1);
- g_object_unref (screen);
+ terminal_window_move_screen (window, new_window, screen, -1);
gtk_window_present_with_time (GTK_WINDOW (new_window), gtk_get_current_event_time ());
}
@@ -2849,8 +2880,7 @@
};
gchar *license_text;
- license_text = g_strjoin ("\n\n",
- _(license[0]), _(license[1]), _(license[2]), NULL);
+ license_text = g_strjoin ("\n\n", _(license[0]), _(license[1]), _(license[2]), NULL);
gtk_show_about_dialog (GTK_WINDOW (window),
"program-name", _("GNOME Terminal"),
Modified: trunk/src/terminal-window.h
==============================================================================
--- trunk/src/terminal-window.h (original)
+++ trunk/src/terminal-window.h Thu May 29 19:54:16 2008
@@ -57,11 +57,16 @@
void terminal_window_add_screen (TerminalWindow *window,
TerminalScreen *screen,
- gint position);
+ int position);
void terminal_window_remove_screen (TerminalWindow *window,
TerminalScreen *screen);
+void terminal_window_move_screen (TerminalWindow *source_window,
+ TerminalWindow *dest_window,
+ TerminalScreen *screen,
+ int dest_position);
+
/* Menubar visibility is part of session state, except that
* if it isn't restored from session, the window gets the setting
* from the profile of the first screen added to the window
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]