gnome-terminal r2787 - trunk/src



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]