[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Freeze exception for roxterm 1.18.5-2



Hi,

I am the upstream developer and sponsored Debian maintainer of roxterm;
the current release in testing and unstable is 1.18.5-1.

Shortly after the freeze a bug was found in roxterm 1.18.5 and I would
like to have it fixed in squeeze by allowing the inclusion of 1.18.5-2.
The Debian bug is 592984
<http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=592984>.

Unfortunately there was no satisfactory quick fix and I had to rewrite a
considerable amount of code. On the positive side I think the new code
is simpler and "cleaner" than the new code. I have some other changes in
the pipeline for the next upstream release, and on consulting
debian-mentors we decided the best action was to backport the bug fixes
alone to 1.18.5.

I've attached the diff and the new package is waiting to be sponsored on
mentors.debian.net:

- URL: http://mentors.debian.net/debian/pool/main/r/roxterm
- Source repository: deb-src http://mentors.debian.net/debian unstable main contrib non-free
- dget http://mentors.debian.net/debian/pool/main/r/roxterm/roxterm_1.18.5-2.dsc

Please Cc all replies to my sponsor - George Danchev <danchev@spnet.net> -
and me; if and when it gets approved here he'll upload it to unstable.

-- 
TH * http://www.realh.co.uk
From: Tony Houghton <h@realh.co.uk>
Description: Fix issues with tab initialisation and sizing etc.
 The next upstream release will also include new features, so this patch
 cherry-picks the bug fixes which affect Debian to make them more eligible for
 inclusion in Squeeze post-freeze.
Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=592984
Bug: https://sourceforge.net/tracker/?func=detail&aid=3041926&group_id=124080&atid=698428
Bug: https://sourceforge.net/tracker/?func=detail&aid=2996296&group_id=124080&atid=698428
Origin: upstream,
    <http://roxterm.svn.sourceforge.net/viewvc/roxterm/trunk/roxterm/>,
    revisions 792-298,801-810
Index: roxterm-1.18.5/src/multitab.c
===================================================================
--- roxterm-1.18.5.orig/src/multitab.c	2010-08-14 21:14:14.518532321 +0100
+++ roxterm-1.18.5/src/multitab.c	2010-08-15 13:30:00.416242990 +0100
@@ -81,13 +81,6 @@
     gboolean show_menu_bar;
     Options *shortcuts;
     GtkAccelGroup *accel_group;
-    int child_width, child_height; /* Need to store size of child widget before
-                                      removing or adding a tab so we can
-                                      correct size afterwards */
-    int ignore_size_allocate;       /* 0 = Don't ignore
-                                       1 = Ignore
-                                       2 = Special case after tab label has
-                                           changed */
     MultiTabSelectionHandler tab_selection_handler;
     gboolean menu_bar_set;        /* Menu bar can be configured either from
                                    profile when opening a window, or when user
@@ -108,6 +101,8 @@
     gboolean composite;
 #endif
     char *display_name;
+    int cached_width, cached_height;
+    gulong size_alloc_tag;
 };
 
 static double multi_win_zoom_factors[] = {
@@ -204,8 +199,7 @@
     multi_tab_get_show_close_button = get_show_close_button;
 }
 
-MultiTab *multi_tab_new0(MultiWin * parent, gpointer user_data_template,
-        gboolean make_current)
+MultiTab *multi_tab_new(MultiWin * parent, gpointer user_data_template)
 {
     MultiTab *tab = g_new0(MultiTab, 1);
 
@@ -216,8 +210,7 @@
     g_object_set_data(G_OBJECT(tab->widget), "roxterm_tab", tab);
 
     multi_win_add_tab(parent, tab, -1, FALSE);
-    if (make_current)
-        multi_win_select_tab(parent, tab);
+    multi_win_select_tab(parent, tab);
 
     return tab;
 }
@@ -273,13 +266,11 @@
 {
     MultiWin *win = tab->parent;
 
-    win->ignore_size_allocate = 1;
     win->ignore_tabs_moving = TRUE;
     multi_tab_delete_without_notifying_parent(tab, TRUE);
     if (!multi_win_notify_tab_removed(win, tab))
     {
         win->ignore_tabs_moving = FALSE;
-        win->ignore_size_allocate = 0;
     }
 }
 
@@ -293,6 +284,100 @@
     return tab->parent ? tab->parent->display_name : NULL;
 }
 
+void multi_win_set_geometry_hints(MultiWin *win, GtkWidget *child,
+    GdkGeometry *geometry, GdkWindowHints geom_mask)
+{
+    gtk_window_set_geometry_hints(GTK_WINDOW(win->gtkwin), child,
+        geometry, geom_mask);
+}
+
+static void multi_win_set_geometry_hints_for_tab(MultiWin * win, MultiTab * tab)
+{
+    GdkGeometry geom;
+    GdkWindowHints hints;
+
+    if (multi_win_geometry_func)
+    {
+        (*multi_win_geometry_func) (tab->user_data, &geom, &hints);
+        multi_win_set_geometry_hints(win, tab->active_widget, &geom, hints);
+    }
+}
+
+static void multi_win_restore_cached_size(GtkWidget *widget,
+        GtkAllocation *alloc, MultiWin *win)
+{
+    /*
+    int px, py;
+    GdkGeometry dummy_geom;
+    */
+    int w = win->cached_width;
+    int h = win->cached_height;
+    GtkAllocation c_alloc;
+    
+    g_signal_handler_disconnect(widget, win->size_alloc_tag);
+    win->size_alloc_tag = 0;
+    if (!win->current_tab)
+        return;
+    widget = win->current_tab->active_widget;
+    /*
+    g_debug("Restoring cached size %dx%d",
+            win->cached_width, win->cached_height);
+    gtk_window_get_size(GTK_WINDOW(win->gtkwin), &px, &py);
+    */
+    gtk_widget_get_allocation(widget, &c_alloc);
+    /*
+    g_debug("Window size %d x %d, allocation %d x %d",
+            px, py, alloc->width, alloc->height);
+    g_debug("Child allocation %d x %d", c_alloc.width, c_alloc.height);
+    */
+    multi_win_size_func(win->current_tab->user_data, TRUE, &w, &h);
+    /*
+    g_debug("Child wants size %d x %d, setting %d x %d", w, h,
+            w + px - c_alloc.width, h + py - c_alloc.height);
+    multi_win_set_geometry_hints(win, widget, &dummy_geom, 0);
+    */
+    gtk_window_resize(GTK_WINDOW(win->gtkwin),
+            w + alloc->width - c_alloc.width,
+            h + alloc->height - c_alloc.height);
+    multi_win_set_geometry_hints_for_tab(win, win->current_tab);
+    /*
+    gtk_window_get_size(GTK_WINDOW(win->gtkwin), &px, &py);
+    g_debug("Window size %d x %d", px, py);
+    */
+}
+
+static void multi_win_cache_size(MultiWin *win)
+{
+    int px, py, cx, cy;
+    
+    if (win->size_alloc_tag)
+    {
+        /*g_debug("Size already cached");*/
+        return;
+    }
+    if (!win->current_tab || !win->gtkwin ||
+            !gtk_widget_get_visible(win->gtkwin) ||
+            win->fullscreen || multi_win_is_maximised(win))
+    {
+        /*g_debug("Can't cache size");*/
+        return;
+    }
+    multi_win_size_func(win->current_tab->user_data, FALSE,
+            &win->cached_width, &win->cached_height);
+    /*g_debug("Cached size %dx%d", win->cached_width, win->cached_height);*/
+    gtk_window_get_size(GTK_WINDOW(win->gtkwin), &px, &py);
+    gdk_drawable_get_size(GDK_DRAWABLE(
+            gtk_widget_get_window(win->current_tab->active_widget)),
+            &cx, &cy);
+    /*
+    g_debug("Window size %d x %d, child size %d x %d",
+            px, py, cx, cy);
+    */
+    win->size_alloc_tag = g_signal_connect_after(
+            win->gtkwin, "size-allocate",
+            G_CALLBACK(multi_win_restore_cached_size), win);
+}
+
 static void multi_tab_set_name_or_title(MultiTab *tab, const char *title)
 {
     MultiWin *win = tab->parent;
@@ -300,9 +385,11 @@
     if (tab->label)
     {
         GtkPositionType tab_pos = tab->parent->tab_pos;
-
-        if ((tab_pos == GTK_POS_LEFT || tab_pos == GTK_POS_RIGHT) && win)
-            win->ignore_size_allocate = 2;
+        gboolean cache_size = (tab_pos == GTK_POS_LEFT ||
+                tab_pos == GTK_POS_RIGHT) && win;
+        
+        if (cache_size)
+            multi_win_cache_size(win);
         gtk_label_set_text(GTK_LABEL(tab->label), title);
     }
     if (win)
@@ -534,7 +621,7 @@
     win->ignore_tabs_moving = TRUE;
     if (!notify_only)
     {
-        win->ignore_size_allocate = 1;
+        multi_win_cache_size(win);
         g_object_ref(tab->widget);
         gtk_notebook_remove_page(GTK_NOTEBOOK(win->notebook),
                 multi_tab_get_page_num(tab));
@@ -543,7 +630,6 @@
     multi_tab_remove_menutree_items(win, tab);
     if (!multi_win_notify_tab_removed(win, tab))
     {
-        win->ignore_size_allocate = 0;
         win->ignore_tabs_moving = FALSE;
     }
     tab->parent = NULL;
@@ -552,8 +638,17 @@
 #if DO_OWN_TAB_DRAGGING
 void multi_tab_move_to_new_window(MultiWin *win, MultiTab *tab, int position)
 {
+    MultiWin *old_win = tab->parent;
+    
+    multi_win_set_always_show_tabs(win, old_win->always_show_tabs);
+    multi_win_set_show_menu_bar(win, old_win->show_menu_bar);
+    if (multi_win_is_fullscreen(old_win))
+        multi_win_set_fullscreen(win, TRUE);
+    else if (multi_win_is_maximised(old_win))
+        gtk_window_maximize(GTK_WINDOW(win->gtkwin));
     multi_tab_remove_from_parent(tab, FALSE);
     multi_win_add_tab(win, tab, position, FALSE);
+    multi_win_set_geometry_hints_for_tab(win, tab);
     /* Really we want this before multi_win_add_tab but it seems to crash
      * vte_terminal_set_font; maybe it can't cope with unmapped widgets? */
     if (multi_tab_to_new_window_handler)
@@ -597,93 +692,6 @@
     }
 }
 
-void multi_win_set_geometry_hints(MultiWin *win, GtkWidget *child,
-    GdkGeometry *geometry, GdkWindowHints geom_mask)
-{
-    gtk_window_set_geometry_hints(GTK_WINDOW(win->gtkwin), child,
-        geometry, geom_mask);
-}
-
-/*
-static void difference_between_child_and_parent(GtkWidget *child,
-    GtkWidget *parent, int *pwidth, int *pheight)
-{
-    GtkRequisition parent_req, child_req;
-
-    gtk_widget_size_request(parent, &parent_req);
-    gtk_widget_size_request(child, &child_req);
-    if (pwidth)
-        *pwidth = parent_req.width - child_req.width;
-    if (pheight)
-        *pheight = parent_req.height - child_req.height;
-}
-*/
-
-static void difference_between_child_and_parent(GtkWidget *child,
-    GtkWidget *parent, int *pwidth, int *pheight)
-{
-    GtkRequisition child_req;
-    GtkRequisition parent_req;
-
-    gtk_widget_size_request(child, &child_req);
-    gtk_widget_size_request(parent, &parent_req);
-    if (pwidth)
-        *pwidth = parent_req.width - child_req.width;
-    if (pheight)
-        *pheight = parent_req.height - child_req.height;
-}
-
-/*
-static void show_size_request(const char *desc, GtkWidget *widget)
-{
-    GtkRequisition req;
-
-    gtk_widget_size_request(widget, &req);
-    g_debug("%s has size %d x %d allocation %d x %d", desc,
-            req.width, req.height,
-            widget->allocation.width, widget->allocation.height);
-}
-*/
-
-void
-multi_win_set_size(MultiWin * win, GtkWidget * child, int width, int height)
-{
-    int dw, dh;
-
-    g_return_if_fail(width > 0 && height > 0);
-    win->child_width = width;
-    win->child_height = height;
-    if (!GTK_WIDGET_MAPPED(win->gtkwin))
-    {
-        /* If window isn't shown yet, force VTE widget to correct size before
-         * showing, and that will automatically force window to correct size */
-        gtk_widget_set_size_request(child, width, height);
-        return;
-    }
-    win->ignore_size_allocate = 1;
-    /* If window is already showing it's more complicated.
-     * gtk_widget_set_size_request() on child doesn't perform corresponding
-     * resize on parent window, so we need to resize window instead. It may
-     * need to be bigger than child because of scrollbars and tabs etc, so
-     * we have to find difference in size between window and child. */
-    gtk_widget_set_size_request(child, 10000, 10000);
-    difference_between_child_and_parent(child, win->gtkwin, &dw, &dh);
-    gtk_window_resize(GTK_WINDOW(win->gtkwin), width + dw, height + dh);
-    win->ignore_size_allocate = 0;
-}
-
-static void multi_win_set_geometry_hints_for_tab(MultiWin * win, MultiTab * tab)
-{
-    GdkGeometry geom;
-    GdkWindowHints hints;
-
-    if (multi_win_geometry_func)
-    {
-        (*multi_win_geometry_func) (tab->user_data, &geom, &hints);
-        multi_win_set_geometry_hints(win, tab->active_widget, &geom, hints);
-    }
-}
-
 static char *make_title(MultiWin *win, const char *title)
 {
     char *title0 = NULL;
@@ -792,12 +800,12 @@
     win->show_menu_bar = FALSE;
 }
 
-void multi_win_set_show_menu_bar(MultiWin * win, gboolean show, gboolean resize)
+void multi_win_set_show_menu_bar(MultiWin * win, gboolean show)
 {
-    if (!resize && win->menu_bar_set)
+    if (win->menu_bar_set == show)
         return;
-    win->menu_bar_set = TRUE;
-    win->ignore_size_allocate = 1;
+    multi_win_cache_size(win);
+    win->menu_bar_set = show;
     if (show)
         add_menu_bar(win);
     else
@@ -805,12 +813,6 @@
     menutree_set_show_menu_bar_active(win->menu_bar, show);
     menutree_set_show_menu_bar_active(win->popup_menu, show);
     menutree_set_show_menu_bar_active(win->short_popup, show);
-    if (resize && win->current_tab)
-    {
-        multi_win_set_size(win, win->current_tab->active_widget,
-            win->child_width, win->child_height);
-    }
-    win->ignore_size_allocate = 0;
 }
 
 gboolean multi_win_get_show_menu_bar(MultiWin * win)
@@ -845,40 +847,6 @@
     return FALSE;
 }
 
-static void
-multi_win_size_allocate(GtkWidget * widget, GtkAllocation * allocation,
-    MultiWin * win)
-{
-    GList *link;
-    MultiTab *tab;
-
-    switch (win->ignore_size_allocate)
-    {
-        case 0:
-            for (link = win->tabs; link; link = g_list_next(link))
-            {
-                tab = (MultiTab *) link->data;
-                (*multi_win_size_func) (tab->user_data,
-                    MultiWin_UpdateConfiguredSize,
-                    &win->child_width, &win->child_height);
-            }
-            break;
-        case 1:
-            break;
-        case 2:
-            tab = win->current_tab;
-            if (!tab)
-                win->ignore_size_allocate = 0;
-            g_return_if_fail(tab != NULL);
-            (*multi_win_size_func) (tab->user_data,
-                MultiWin_GetTargetSize,
-                &win->child_width, &win->child_height);
-            multi_win_set_size(win, tab->active_widget,
-                win->child_width, win->child_height);
-            break;
-    }
-}
-
 static void multi_win_realize_handler(GtkWidget *win, gpointer data)
 {
     GdkWindow *w = win->window;
@@ -982,6 +950,7 @@
     g_return_if_fail(tab);
     if (!win->ignore_tabs_moving)
     {
+        multi_win_cache_size(win);
         /* If tab->parent == win, it's already been added by
          * multi_win_notebook_creation_hook so don't add,
          * but set size and show */
@@ -992,11 +961,6 @@
         else
         {
             gtk_widget_show_all(win->notebook);
-            (*multi_win_size_func) (tab->user_data,
-                MultiWin_GetTargetSize,
-                &win->child_width, &win->child_height);
-            multi_win_set_size(win, tab->active_widget,
-                win->child_width, win->child_height);
             gtk_widget_show_all(win->gtkwin);
         }
     }
@@ -1016,14 +980,6 @@
         {
             multi_tab_remove_from_parent(tab, TRUE);
         }
-        else if (win->ntabs == 1)
-        {
-            /* If we use multi_win_set_size here, for some reason it honours
-             * the silly large size request instead of the gtk_window_resize */
-            tab = (MultiTab *) win->tabs->data;
-            multi_win_set_size(win, tab->active_widget,
-                    win->child_width, win->child_height);
-        }
     }
 }
 
@@ -1038,10 +994,6 @@
 
     g_return_val_if_fail(tab, NULL);
     win = tab->parent;
-    /* Remember widget's size for later */
-    (*multi_win_size_func) (tab->user_data,
-        MultiWin_GetTargetSize,
-        &win->child_width, &win->child_height);
     multi_tab_remove_from_parent(tab, TRUE);
     multi_win_get_disable_menu_shortcuts(tab->user_data,
             &disable_menu_shortcuts, &disable_tab_shortcuts);
@@ -1076,11 +1028,25 @@
 
     multi_win_initial_tabs(user_data_template, &tab_pos, &num_tabs);
     if (old->fullscreen)
+    {
         creator = multi_win_new_fullscreen;
+    }
     else if (multi_win_is_maximised(old))
+    {
         creator = multi_win_new_maximised;
+    }
     else
-        creator = multi_win_new;
+    {
+        char geom[16];
+        int width, height;
+        
+        multi_win_size_func(multi_tab_get_user_data(old->current_tab),
+                FALSE, &width, &height);
+        sprintf(geom, "%dx%d", width, height);
+        return multi_win_new_with_geom(old->display_name, old->shortcuts,
+                old->zoom_index, user_data_template, geom,
+                num_tabs, tab_pos, always_show_tabs);
+    }
     return creator(old->display_name, old->shortcuts, old->zoom_index,
             user_data_template, num_tabs, tab_pos, always_show_tabs);
 }
@@ -1249,7 +1215,7 @@
     gboolean show = gtk_check_menu_item_get_active(item);
 
     if (show != win->show_menu_bar)
-        multi_win_set_show_menu_bar(win, show, TRUE);
+        multi_win_set_show_menu_bar(win, show);
 }
 
 static void
@@ -1531,8 +1497,6 @@
 
     multi_win_connect_actions(win);
     (*multi_win_menu_signal_connector) (win);
-    g_signal_connect_after(win->gtkwin, "size-allocate",
-        G_CALLBACK(multi_win_size_allocate), win);
     g_signal_connect(win->gtkwin, "window-state-event",
         G_CALLBACK(multi_win_state_event_handler), win);
 
@@ -1592,6 +1556,7 @@
 {
     gboolean disable_menu_shortcuts, disable_tab_shortcuts; 
     MultiWin *win;
+    int n;
     
     multi_win_get_disable_menu_shortcuts(user_data_template,
             &disable_menu_shortcuts, &disable_tab_shortcuts);
@@ -1600,7 +1565,7 @@
             tab_pos, always_show_tabs);
     win->user_data_template = user_data_template;
     win->tab_pos = tab_pos;
-    while (numtabs--)
+    for (n = 0; n < numtabs; ++n)
         multi_tab_new(win, user_data_template);
 
     gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), 0);
@@ -1632,12 +1597,9 @@
     multi_win_show(win);
 
     /* Need to do this after multi_tab_new's initial call of
-     * multi_win_select_tab to ensure child widget is realized */
-    if (win->current_tab && win->tab_selection_handler)
-    {
-        (*win->tab_selection_handler) (win->current_tab->user_data,
-            win->current_tab);
-    }
+     * multi_win_select_tab to ensure child widgets are realized */
+    for (n = numtabs - 1; n >= 0; --n)
+        gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), n);
 
     return win;
 }
@@ -1658,7 +1620,9 @@
         win->accel_group = NULL;
     }
     if (destroy_widgets && win->gtkwin)
+    {
         g_signal_handler_disconnect(win->gtkwin, win->destroy_handler);
+    }
 
     for (link = win->tabs; link; link = g_list_next(link))
     {
@@ -1728,7 +1692,10 @@
         {
             tab = win->tabs->data;
             if (!win->always_show_tabs)
+            {
+                multi_win_cache_size(win);
                 multi_win_hide_tabs(win);
+            }
             if (win->tab_pos != GTK_POS_LEFT && win->tab_pos != GTK_POS_RIGHT)
             {
                 gtk_label_set_ellipsize(GTK_LABEL(tab->label),
@@ -1736,12 +1703,6 @@
             }
             single_tab(win, tab);
         }
-        if (win->current_tab)
-        {
-            multi_win_set_geometry_hints_for_tab(win, win->current_tab);
-            multi_win_set_size(win, win->current_tab->active_widget,
-                win->child_width, win->child_height);
-        }
     }
     multi_win_shade_menus_for_tabs(win);
     return FALSE;
@@ -1760,9 +1721,7 @@
     win = tab->parent;
     if (win)
     {
-        win->ignore_size_allocate =
-                (win->tab_pos == GTK_POS_LEFT || win->tab_pos == GTK_POS_RIGHT)
-                ? 2 : 1;
+        multi_win_cache_size(win);
     }
     tab->close_button = gtk_button_new();
     tab->image = gtk_image_new_from_stock(
@@ -1785,16 +1744,6 @@
     gtk_widget_show_all(tab->close_button);
     if (win)
     {
-        if (win->current_tab)
-        {
-            multi_win_set_size(win, win->current_tab->active_widget,
-                win->child_width, win->child_height);
-        }
-        else
-        {
-            if (win->ignore_size_allocate == 1)
-                win->ignore_size_allocate = 0;
-        }
     }
 }
 
@@ -1807,26 +1756,10 @@
         win = tab->parent;
         if (win)
         {
-            win->ignore_size_allocate =
-                    (win->tab_pos == GTK_POS_LEFT ||
-                            win->tab_pos == GTK_POS_RIGHT)
-                    ? 2 : 1;
+            multi_win_cache_size(win);
         }
         gtk_widget_destroy(tab->close_button);
         tab->close_button = NULL;
-        if (win)
-        {
-            if (win->current_tab)
-            {
-                multi_win_set_size(win, win->current_tab->active_widget,
-                    win->child_width, win->child_height);
-            }
-            else
-            {
-                if (win->ignore_size_allocate == 1)
-                    win->ignore_size_allocate = 0;
-            }
-        }
     }
     tab->image = NULL;
 }
@@ -1964,7 +1897,7 @@
         gboolean notify_only)
 {
     tab->parent = win;
-    win->ignore_size_allocate = 1;
+    multi_win_cache_size(win);
     win->ignore_tabs_moving = TRUE;
     if (position == -1)
         win->tabs = g_list_append(win->tabs, tab);
@@ -1982,15 +1915,6 @@
         gtk_widget_show(tab->widget);
     }
     multi_win_shade_menus_for_tabs(win);
-    multi_win_set_geometry_hints_for_tab(win, tab);
-    if (!win->child_width || !win->child_height)
-    {
-        (*multi_win_size_func) (tab->user_data,
-            MultiWin_GetTargetSize,
-            &win->child_width, &win->child_height);
-    }
-    multi_win_set_size(win, tab->active_widget,
-        win->child_width, win->child_height);
     win->ignore_tabs_moving = FALSE;
 }
 
@@ -2006,8 +1930,9 @@
 
 gboolean multi_win_is_maximised(MultiWin *win)
 {
-    return (gdk_window_get_state(win->gtkwin->window) &
-            GDK_WINDOW_STATE_MAXIMIZED) != 0;
+    return (win->gtkwin->window &&
+            (gdk_window_get_state(win->gtkwin->window) &
+                GDK_WINDOW_STATE_MAXIMIZED) != 0);
 }
 
 int multi_win_get_zoom_index(MultiWin *win)
@@ -2195,15 +2120,13 @@
     if (win->ntabs == 1 && old_show != show)
     {
         MultiTab *tab = win->current_tab;
-        int w, h;
         
         g_return_if_fail(tab != NULL);
-        (*multi_win_size_func)(tab->user_data, MultiWin_GetTargetSize, &w, &h);
+        multi_win_cache_size(win);
         if (show)
             multi_win_show_tabs(win);
         else
             multi_win_hide_tabs(win);
-        multi_win_set_size(win, tab->active_widget, w, h);
     }
 }
 
Index: roxterm-1.18.5/src/multitab.h
===================================================================
--- roxterm-1.18.5.orig/src/multitab.h	2010-08-14 21:14:14.454560212 +0100
+++ roxterm-1.18.5/src/multitab.h	2010-08-15 13:30:00.416242990 +0100
@@ -56,18 +56,12 @@
 typedef void (*MultiWinGeometryFunc) (gpointer user_data, GdkGeometry * geom,
     GdkWindowHints * hints);
 
-/* Size function. pwidth and pheight point to return values for width and
- * height in pixels of the core of the widget ie minus any borders */
-typedef enum {
-    MultiWin_GetActualSize,        /* Return the current actual size of the
-                                   widget's core */
-    MultiWin_GetTargetSize,        /* Return the size it should be from
-                                   config settings or whatever */
-    MultiWin_UpdateConfiguredSize    /* User has resized window; update config
-                                       from current size */
-} MultiWinSizeReason;
-typedef void (*MultiWinSizeFunc) (gpointer user_data, MultiWinSizeReason,
-        int *pwidth, int *pheight);
+/* If set is TRUE, the child widget may use the width and height values
+ * to resize itself and must update width and height to desired size in pixels,
+ * otherwise it must update width and height with its current size
+ */
+typedef gboolean (*MultiWinSizeFunc) (gpointer user_data, gboolean set,
+    int *pwidth, int *pheight);
 
 /* Called when a tab is selected */
 typedef void (*MultiTabSelectionHandler) (gpointer user_data, MultiTab * tab);
@@ -113,14 +107,7 @@
 void
 multi_tab_connect_tab_selection_handler(MultiWin *, MultiTabSelectionHandler);
 
-MultiTab *multi_tab_new0(MultiWin * parent, gpointer user_data_template,
-        gboolean make_current);
-
-inline static MultiTab *multi_tab_new(MultiWin *parent,
-        gpointer user_data_template)
-{
-    return multi_tab_new0(parent, user_data_template, TRUE);
-}
+MultiTab *multi_tab_new(MultiWin * parent, gpointer user_data_template);
 
 /* When all tabs are destroyed the window is destroyed too */
 void multi_tab_delete(MultiTab *);
@@ -274,10 +261,6 @@
 multi_win_set_geometry_hints(MultiWin * win, GtkWidget * child,
     GdkGeometry * geometry, GdkWindowHints geom_mask);
 
-/* Set window size to fit child at given size */
-void
-multi_win_set_size(MultiWin * win, GtkWidget * child, int width, int height);
-
 void multi_win_set_fullscreen(MultiWin *win, gboolean fullscreen);
 
 GtkWidget *multi_win_get_widget(MultiWin * win);
@@ -336,9 +319,8 @@
 
 GtkAccelGroup *multi_win_get_accel_group(MultiWin * win);
 
-/* If resize is TRUE, force window resize to accommodate change in height */
 void
-multi_win_set_show_menu_bar(MultiWin * win, gboolean show, gboolean resize);
+multi_win_set_show_menu_bar(MultiWin * win, gboolean show);
 
 gboolean multi_win_get_show_menu_bar(MultiWin * win);
 
Index: roxterm-1.18.5/src/profilegui.c
===================================================================
--- roxterm-1.18.5.orig/src/profilegui.c	2010-08-14 21:14:14.474531813 +0100
+++ roxterm-1.18.5/src/profilegui.c	2010-08-15 13:30:00.428267918 +0100
@@ -648,6 +648,8 @@
     capplet_set_text_entry(glade, profile, "color_term", "roxterm");
     capplet_set_text_entry(glade, profile, "term", "xterm");
     /*capplet_set_text_entry(glade, profile, "emulation", NULL);*/
+    capplet_set_combo(glade, profile, "tab_pos", 0);
+    capplet_set_spin_button(glade, profile, "init_tabs", 1);
     capplet_set_boolean_toggle(glade, profile, "wrap_switch_tab", FALSE);
     capplet_set_boolean_toggle(glade, profile, "tab_close_btn", TRUE);
     capplet_set_boolean_toggle(glade, profile, "show_tab_status", FALSE);
@@ -696,7 +698,6 @@
     capplet_set_boolean_toggle(glade, profile, "use_custom_command", FALSE);
     capplet_set_text_entry(glade, profile, "command", NULL);
     capplet_set_combo(glade, profile, "exit_action", 0);
-    capplet_set_combo(glade, profile, "tab_pos", 0);
     capplet_set_spin_button_float(glade, profile, "exit_pause");
     capplet_set_text_entry(glade, profile, "title_string", "%s");
     exit_action_changed(GTK_COMBO_BOX(profilegui_widget(pg, "exit_action")),
Index: roxterm-1.18.5/src/roxterm.c
===================================================================
--- roxterm-1.18.5.orig/src/roxterm.c	2010-08-14 21:14:14.494534582 +0100
+++ roxterm-1.18.5/src/roxterm.c	2010-08-15 13:30:00.440582443 +0100
@@ -65,8 +65,6 @@
     GtkWidget *widget;            /* VteTerminal */
     GtkWidget *hbox;
     GtkWidget *scrollbar;
-    int geom_width, geom_height;
-    int nonfs_width, nonfs_height;
     pid_t pid;
     /* We own a reference to colour_scheme */
     Options *colour_scheme;
@@ -110,6 +108,7 @@
     gboolean setup_encodings;
     gboolean dont_lookup_dimensions;
     char *reply;
+    int columns, rows;
 };
 
 #define PROFILE_NAME_KEY "roxterm_profile_name"
@@ -278,15 +277,6 @@
     return roxterm_profiles;
 }
 
-static void roxterm_save_nonfs_dimensions(ROXTermData *roxterm)
-{
-    if (!roxterm->win || !multi_win_is_fullscreen(roxterm->win))
-    {
-        roxterm->nonfs_width = roxterm->geom_width;
-        roxterm->nonfs_height = roxterm->geom_height;
-    }
-}
-
 /* Foreground (and palette?) colour change doesn't cause a redraw so force it */
 inline static void roxterm_force_redraw(ROXTermData *roxterm)
 {
@@ -294,20 +284,6 @@
         gtk_widget_queue_draw(roxterm->widget);
 }
 
-static void roxterm_set_geometry(ROXTermData *roxterm, int width, int height)
-{
-    roxterm->geom_width = width;
-    roxterm->geom_height = height;
-    roxterm_save_nonfs_dimensions(roxterm);
-}
-
-static void roxterm_default_dimensions(ROXTermData *roxterm)
-{
-    roxterm_set_geometry(roxterm,
-            options_lookup_int_with_default(roxterm->profile, "width", 80),
-            options_lookup_int_with_default(roxterm->profile, "height", 24));
-}
-
 char *roxterm_get_cwd(ROXTermData *roxterm)
 {
     char *pidfile = NULL;
@@ -363,24 +339,6 @@
         new_gt->profile = dynamic_options_lookup_and_ref(roxterm_profiles,
             options_get_leafname(old_gt->profile), "roxterm profile");
     }
-    if (old_gt->widget)
-    {
-        if (!multi_win_is_fullscreen(old_gt->win))
-        {
-            roxterm_set_geometry(new_gt,
-                    (VTE_TERMINAL(old_gt->widget))->column_count,
-                    (VTE_TERMINAL(old_gt->widget))->row_count);
-        }
-        else
-        {
-            roxterm_set_geometry(new_gt,
-                    old_gt->nonfs_width, old_gt->nonfs_height);
-        }
-    }
-    else if (!old_gt->maximise && !old_gt->dont_lookup_dimensions)
-    {
-        roxterm_default_dimensions(new_gt);
-    }
     /* special_command should be transferred to new data and removed from old
      * one */
     old_gt->special_command = NULL;
@@ -414,6 +372,13 @@
     {
         new_gt->pango_desc = pango_font_description_copy(old_gt->pango_desc);
     }
+    if (old_gt->widget && GTK_WIDGET_REALIZED(old_gt->widget))
+    {
+        VteTerminal *vte = VTE_TERMINAL(old_gt->widget);
+        
+        new_gt->columns = vte->column_count;
+        new_gt->rows = vte->row_count;
+    }
 
     return new_gt;
 }
@@ -794,7 +759,9 @@
     
     gwin = roxterm_get_toplevel(roxterm);
     if (gwin)
+    {
         g_signal_handler_disconnect(gwin, roxterm->win_state_changed_tag);
+    }
     if (roxterm->post_exit_tag)
         g_source_remove(roxterm->post_exit_tag);
     if (roxterm->colour_scheme)
@@ -994,15 +961,59 @@
     GtkBorder *border = NULL;
     
     gtk_widget_style_get(GTK_WIDGET(vte), "inner-border", &border, NULL);
-    g_return_if_fail(border != NULL);
-    *w = border->left + border->right;
-    *h = border->top + border->bottom;
-    gtk_border_free(border);
+    if (border == NULL)
+    {
+        g_warning(_("VTE's inner-border property unavailable"));
+        *w = *h = 0;
+    }
+    else
+    {
+        *w = border->left + border->right;
+        *h = border->top + border->bottom;
+        gtk_border_free(border);
+    }
 }
 #else
 #define roxterm_get_vte_padding vte_terminal_get_padding
 #endif
 
+static void
+roxterm_set_vte_size(ROXTermData *roxterm, VteTerminal *vte,
+        int columns, int rows)
+{
+    /* First get current size of vte and parent window so we know difference */
+    int cw, ch, ww, wh;
+    GtkWidget *vw = GTK_WIDGET(vte);
+    GdkWindow *drbl = gtk_widget_get_window(vw);
+    GtkWidget *pw = roxterm->win ? multi_win_get_widget(roxterm->win) : NULL;
+    GdkWindow *pd = pw ? gtk_widget_get_window(pw) : NULL;
+    
+    if (drbl && pd)
+    {
+        gdk_drawable_get_size(GDK_DRAWABLE(drbl), &cw, &ch);
+        gtk_window_get_size(GTK_WINDOW(pw), &ww, &wh);
+    }
+    vte_terminal_set_size(vte, columns, rows);
+    /* If we're in a realized window, resize it as required, otherwise the
+     * vte's size request won't be honoured.
+     */
+    if (drbl && pd)
+    {
+        int px, py;
+        int req_w, req_h;
+        
+        roxterm_get_vte_padding(vte, &px, &py);
+        req_w = vte->char_width * columns + px;
+        req_h = vte->char_height * rows + py;
+        /*
+        g_debug("Child was %dx%d, window bigger by %dx%d; "
+                "resizing for child calc %dx%d",
+                cw, ch, ww - cw, wh - ch, req_w, req_h);
+        */
+        gtk_window_resize(GTK_WINDOW(pw), req_w + ww - cw, req_h + wh - ch);
+    }
+}
+
 static void roxterm_geometry_func(ROXTermData *roxterm,
         GdkGeometry *geom, GdkWindowHints *hints)
 {
@@ -1016,55 +1027,41 @@
     *hints = GDK_HINT_RESIZE_INC | GDK_HINT_BASE_SIZE | GDK_HINT_MIN_SIZE;
 }
 
-static void
-roxterm_cell_to_pixel_size(ROXTermData * roxterm, int *pwidth, int *pheight)
-{
-    int xpad, ypad;
-    VteTerminal *vte = VTE_TERMINAL(roxterm->widget);
-
-    roxterm_get_vte_padding(vte, &xpad, &ypad);
-    *pwidth = *pwidth * vte->char_width + xpad;
-    *pheight = *pheight * vte->char_height + ypad;
-}
-
-static void roxterm_size_func(ROXTermData *roxterm, MultiWinSizeReason reason,
+static void roxterm_size_func(ROXTermData *roxterm, gboolean set,
         int *pwidth, int *pheight)
 {
-    VteTerminal *vte = VTE_TERMINAL(roxterm->widget);
+    /* column_/row_count may contain garbage if the widget isn't showing,
+     * so read values from current tab's vte */
+    MultiTab *ctab = multi_win_get_current_tab(roxterm->win);
+    ROXTermData *crt = ctab ? multi_tab_get_user_data(ctab) : roxterm;
+    VteTerminal *vte = VTE_TERMINAL(crt->widget);
 
-    if (reason == MultiWin_UpdateConfiguredSize)
+    if (set)
     {
-        roxterm_set_geometry(roxterm,
-                *pwidth = vte->column_count, *pheight = vte->row_count);
+        if (crt == roxterm)
+        {
+            int px, py;
+            
+            vte_terminal_set_size(vte, *pwidth, *pheight);
+            roxterm_get_vte_padding(vte, &px, &py);
+            *pwidth = *pwidth * vte->char_width + px;
+            *pheight = *pheight * vte->char_height + py;
+        }
     }
-    else if (reason == MultiWin_GetActualSize)
+    else
     {
         *pwidth = vte->column_count;
         *pheight = vte->row_count;
     }
-    else /* if (reason == MultiWin_GetTargetSize) */
-    {
-        *pwidth = roxterm->nonfs_width;
-        *pheight = roxterm->nonfs_height;
-    }
-    roxterm_cell_to_pixel_size(roxterm, pwidth, pheight);
 }
 
 static void roxterm_update_size(ROXTermData * roxterm, VteTerminal * vte)
 {
     if (multi_win_get_current_tab(roxterm->win) == roxterm->tab)
     {
-        int width;
-        int height;
-
-        roxterm_set_geometry(roxterm,
+        roxterm_set_vte_size(roxterm, vte,
             options_lookup_int_with_default(roxterm->profile, "width", 80),
             options_lookup_int_with_default(roxterm->profile, "height", 24));
-        vte_terminal_set_size(vte, roxterm->geom_width, roxterm->geom_height);
-        width = roxterm->geom_width;
-        height = roxterm->geom_height;
-        roxterm_cell_to_pixel_size(roxterm, &width, &height);
-        multi_win_set_size(roxterm->win, roxterm->widget, width, height);
     }
 }
 
@@ -1074,19 +1071,10 @@
     {
         GdkGeometry geom;
         GdkWindowHints hints;
-        int width = roxterm->geom_width;
-        int height = roxterm->geom_height;
-
-        /*
-           int width = vte->column_count;
-           int height = vte->row_count;
-         */
 
         roxterm_geometry_func(roxterm, &geom, &hints);
         multi_win_set_geometry_hints(roxterm->win, roxterm->widget,
             &geom, hints);
-        roxterm_cell_to_pixel_size(roxterm, &width, &height);
-        multi_win_set_size(roxterm->win, roxterm->widget, width, height);
     }
 }
 
@@ -1116,6 +1104,8 @@
 {
     char *fdesc;
     PangoFontDescription *pango_desc = NULL;
+    int w = vte->column_count;
+    int h = vte->row_count;
 
     if (roxterm->pango_desc)
     {
@@ -1163,7 +1153,10 @@
     g_free(fdesc);
     roxterm->current_zoom_factor = roxterm->target_zoom_factor;
     if (update_geometry)
+    {
+        roxterm_set_vte_size(roxterm, vte, w, h);
         roxterm_update_geometry(roxterm, vte);
+    }
 }
 
 static void
@@ -1172,12 +1165,15 @@
 {
     PangoFontDescription *pango_desc = NULL;
     double zf;
+    int w, h;
 
     if (!roxterm->pango_desc)
     {
         roxterm_apply_profile_font(roxterm, vte, update_geometry);
         return;
     }
+    w = vte->column_count;
+    h = vte->row_count;
     zf = roxterm->target_zoom_factor /
             (roxterm->current_zoom_factor ?
                     roxterm->current_zoom_factor : 1);
@@ -1186,7 +1182,10 @@
     vte_terminal_set_font(vte, pango_desc);
     roxterm->current_zoom_factor = roxterm->target_zoom_factor;
     if (update_geometry)
+    {
+        roxterm_set_vte_size(roxterm, vte, w, h);
         roxterm_update_geometry(roxterm, vte);
+    }
 }
 
 static void roxterm_set_zoom_factor(ROXTermData *roxterm, double factor,
@@ -1201,26 +1200,31 @@
 static void roxterm_match_text_size(ROXTermData *roxterm, ROXTermData *other)
 {
     VteTerminal *vte;
+    VteTerminal *other_vte;
     const PangoFontDescription *fd;
+    int width, height;
     
     if (roxterm == other)
         return;
     vte = VTE_TERMINAL(roxterm->widget);
+    other_vte = VTE_TERMINAL(other->widget);
+    width = other_vte->column_count;
+    height = other_vte->row_count;
     fd = vte_terminal_get_font(VTE_TERMINAL(other->widget));
     roxterm->target_zoom_factor = other->current_zoom_factor;
     roxterm->current_zoom_factor = other->current_zoom_factor;
     roxterm->zoom_index = other->zoom_index;
     if (!pango_font_description_equal(
             vte_terminal_get_font(VTE_TERMINAL(roxterm->widget)), fd))
+    {
         vte_terminal_set_font(vte, fd);
-    if (roxterm->geom_width != other->geom_width
-            || roxterm->geom_height != other->geom_height)
+    }
+    if (vte->column_count != width || vte->row_count != height)
     {
-        roxterm_set_geometry(roxterm,
-                other->geom_width, other->geom_height);
-        vte_terminal_set_size(VTE_TERMINAL(roxterm->widget),
-                roxterm->geom_width, roxterm->geom_height);
+        roxterm_set_vte_size(roxterm, VTE_TERMINAL(roxterm->widget),
+                width, height);
     }
+    roxterm_update_geometry(roxterm, vte);
 }
 
 static void roxterm_about_www_hook(GtkAboutDialog *about,
@@ -1432,7 +1436,7 @@
         ROXTermData * roxterm)
 {
     multi_tab_set_window_title(roxterm->tab,
-        vte->window_title ? vte->window_title : "roxterm");
+        vte->window_title ? vte->window_title : _("ROXTerm"));
 }
 
 static void roxterm_icon_title_handler(VteTerminal *vte,
@@ -1441,12 +1445,6 @@
     multi_tab_set_icon_title(roxterm->tab, vte->icon_title);
 }
 
-inline static void
-roxterm_update_geom_record(ROXTermData * roxterm, VteTerminal * vte)
-{
-    roxterm_set_geometry(roxterm, vte->column_count, vte->row_count);
-}
-
 /* data is cast to char const **pname - indirect pointer to name to check for -
  * if a match is found, *pname is set to NULL */
 static void check_if_name_matches_property(GtkWidget *widget, gpointer data)
@@ -1582,8 +1580,6 @@
     menutree_select_encoding(menu_bar, roxterm->encoding);
     menutree_select_encoding(short_popup, roxterm->encoding);
     multi_win_set_ignore_toggles(roxterm->win, FALSE);
-
-    roxterm_update_geom_record(roxterm, vte);
 }
 
 static void roxterm_widget_realized(VteTerminal *vte, ROXTermData *roxterm)
@@ -2643,6 +2639,15 @@
     return FALSE;
 }
 
+inline static void
+roxterm_attach_state_changed_handler(ROXTermData *roxterm)
+{
+    roxterm->win_state_changed_tag = 
+            g_signal_connect(roxterm_get_toplevel(roxterm),
+            "window-state-event",
+            G_CALLBACK(roxterm_window_state_changed), roxterm);
+}
+
 static GtkWidget *roxterm_multi_tab_filler(MultiWin * win, MultiTab * tab,
     ROXTermData * roxterm_template, ROXTermData ** roxterm_out,
     char **title, GtkWidget ** vte_widget, GtkAdjustment **adjustment)
@@ -2653,7 +2658,6 @@
     int hide_menu_bar;
     MultiWinScrollBar_Position scrollbar_pos;
     char *tab_name;
-    /* GtkWidget *gwin; */
 
     if ((!roxterm_template->win || roxterm_template->win == win)
         && roxterm_template->title_template)
@@ -2675,7 +2679,7 @@
                 "hide_menubar") == 1;
         }
     }
-    multi_win_set_show_menu_bar(win, !hide_menu_bar, FALSE);
+    multi_win_set_show_menu_bar(win, !hide_menu_bar);
 
     roxterm->win = win;
     roxterm->tab = tab;
@@ -2727,16 +2731,7 @@
         g_free(tab_name);
     }
 
-    /* Used to call vte_terminal_set_size() here, but doing so before parent
-     * window is shown seems to mess up scrollbar in libvte9, and everything
-     * works OK without */
-    /*
-    gwin = multi_win_get_widget(win);
-    if (win && gwin->window)
-    {
-        vte_terminal_set_size(vte, roxterm->geom_width, roxterm->geom_height);
-    }
-    */
+    roxterm_set_vte_size(roxterm, vte, roxterm->columns, roxterm->rows);
 
     title_orig = vte_terminal_get_window_title(vte);
     *title = g_strdup(title_orig ? title_orig : _("ROXTerm"));
@@ -2747,10 +2742,7 @@
     roxterm->drd = drag_receive_setup_dest_widget(roxterm->widget,
             roxterm_drag_data_received, roxterm);
     
-    roxterm->win_state_changed_tag = 
-            g_signal_connect(roxterm_get_toplevel(roxterm),
-            "window-state-event",
-            G_CALLBACK(roxterm_window_state_changed), roxterm);
+    roxterm_attach_state_changed_handler(roxterm);
 
     return scrollbar_pos ? roxterm->hbox : roxterm->widget;
 }
@@ -2830,7 +2822,7 @@
             multi_win_get_current_tab(roxterm->win) == roxterm->tab)
         {
             multi_win_set_show_menu_bar(roxterm->win,
-                !options_lookup_int(roxterm->profile, "hide_menubar"), TRUE);
+                !options_lookup_int(roxterm->profile, "hide_menubar"));
         }
         else if (!strcmp(key, "audible_bell"))
         {
@@ -3407,7 +3399,7 @@
 }
 
 /* Takes over ownership of profile and non-const strings;
- * on exit size_on_cli indicates * whether dimensions were given in *geom;
+ * on exit size_on_cli indicates whether dimensions were given in *geom;
  * geom is freed and set to NULL if it's invalid
  */
 static ROXTermData *roxterm_data_new(const char *display_name,
@@ -3477,7 +3469,8 @@
             }
             if (*geom)
             {
-                roxterm_set_geometry(roxterm, width, height);
+                roxterm->columns = width;
+                roxterm->rows = height;
                 if (size_on_cli)
                     *size_on_cli = TRUE;
             }
@@ -3488,10 +3481,6 @@
         }
     }
     roxterm->maximise = maximise;
-    if ((!geom || !*geom) && !maximise)
-    {
-        roxterm_default_dimensions(roxterm);
-    }
     if (colour_scheme_name)
     {
         roxterm->colour_scheme = colour_scheme_lookup_and_ref
@@ -3534,6 +3523,13 @@
             global_options_lookup_string("encoding"),
             &geom, &size_on_cli);
             
+    if (!size_on_cli)
+    {
+        roxterm->columns = options_lookup_int_with_default(roxterm->profile,
+                "width", 80);
+        roxterm->rows = options_lookup_int_with_default(roxterm->profile,
+                "height", 24);
+    }
     if (global_options_commandv)
     {
         roxterm->commandv = global_options_copy_strv(global_options_commandv);
@@ -3565,10 +3561,6 @@
             {
                 roxterm->current_zoom_factor = 1.0;
             }
-            roxterm->nonfs_width = partner->nonfs_width;
-            roxterm->nonfs_height = partner->nonfs_height;
-            roxterm_set_geometry(roxterm,
-                    partner->geom_width, partner->geom_height);
             /* roxterm_data_clone needs to see a widget to get geometry
              * correct */
             roxterm->widget = partner->widget;
@@ -3609,13 +3601,13 @@
                 char *old_geom = geom;
 
                 geom = g_strdup_printf("%dx%d%s",
-                        roxterm->geom_width, roxterm->geom_height, old_geom);
+                        roxterm->columns, roxterm->rows, old_geom);
                 g_free(old_geom);
             }
             else
             {
                 geom = g_strdup_printf("%dx%d",
-                        roxterm->geom_width, roxterm->geom_height);
+                        roxterm->columns, roxterm->rows);
             }
         }
         multi_win_new_with_geom(display_name, shortcuts, roxterm->zoom_index,
@@ -3631,12 +3623,17 @@
 
 static void roxterm_tab_to_new_window(MultiWin *win, MultiTab *tab)
 {
-    ROXTermData *roxterm;
+    ROXTermData *roxterm = multi_tab_get_user_data(tab);
     ROXTermData *match_roxterm;
     MultiTab *match_tab = multi_win_get_current_tab(win);
+    GtkWindow *old_gwin = roxterm_get_toplevel(roxterm);
 
-    roxterm = multi_tab_get_user_data(tab);
+    if (old_gwin)
+    {
+        g_signal_handler_disconnect(old_gwin, roxterm->win_state_changed_tag);
+    }
     roxterm->win = win;
+    roxterm_attach_state_changed_handler(roxterm);
     g_return_if_fail(match_tab);
     match_roxterm = multi_tab_get_user_data(match_tab);
     if (roxterm == match_roxterm)
@@ -3851,10 +3848,7 @@
 
 void roxterm_get_nonfs_dimensions(ROXTermData *roxterm, int *cols, int *rows)
 {
-    if (cols)
-        *cols = roxterm->nonfs_width;
-    if (rows)
-        *rows = roxterm->nonfs_height;
+    roxterm_size_func(roxterm, FALSE, cols, rows);
 }
 
 double roxterm_get_zoom_factor(ROXTermData *roxterm)
@@ -3879,6 +3873,7 @@
     gboolean fullscreen;
     char *disp;
     char *geom;
+    int width, height;
     PangoFontDescription *fdesc;
     char *title_template;
     double zoom_factor;
@@ -3925,7 +3920,10 @@
         if (!strcmp(a, "disp"))
             rctx->disp = g_strdup(v);
         else if (!strcmp(a, "geometry"))
+        {
             rctx->geom = g_strdup(v);
+            sscanf(v, "%dx%d+", &rctx->width, &rctx->height);
+        }
         else if (!strcmp(a, "title_template"))
             title_template = g_strdup(v);
         else if (!strcmp(a, "font"))
@@ -3991,7 +3989,7 @@
     }
     if (disp && disp[0])
         rctx->disp = g_strdup(disp);
-    multi_win_set_show_menu_bar(win, show_mbar, FALSE);
+    multi_win_set_show_menu_bar(win, show_mbar);
     multi_win_set_always_show_tabs(win, show_tabs);
     if (title_template && title_template[0])
         rctx->title_template = g_strdup(title_template);
@@ -4109,7 +4107,6 @@
 static void close_tab_tag(_ROXTermParseContext *rctx)
 {
     ROXTermData *roxterm = rctx->roxterm;
-    VteTerminal *vte;
     
     if (rctx->commandv)
     {
@@ -4123,7 +4120,7 @@
         }
     }
     rctx->commandv = NULL;
-    rctx->tab = multi_tab_new0(rctx->win, roxterm, rctx->current);
+    rctx->tab = multi_tab_new(rctx->win, roxterm);
     if (rctx->tab_name && rctx->tab_name[0])
         multi_tab_set_name(rctx->tab, rctx->tab_name);
     if (rctx->tab_title && rctx->tab_title[0])
@@ -4137,9 +4134,11 @@
     g_free(rctx->icon_title);
     rctx->icon_title = NULL;
     roxterm_data_delete(roxterm);
+    /*
     roxterm = multi_tab_get_user_data(rctx->tab);
     vte = VTE_TERMINAL(roxterm->widget);
-    vte_terminal_set_size(vte, roxterm->geom_width, roxterm->geom_height);
+    roxterm_set_vte_size(roxterm, vte, rctx->width, rctx->height);
+    */
 }
 
 static void parse_open_command(_ROXTermParseContext *rctx,
Index: roxterm-1.18.5/src/roxterm-config.glade
===================================================================
--- roxterm-1.18.5.orig/src/roxterm-config.glade	2010-08-15 13:30:04.089238157 +0100
+++ roxterm-1.18.5/src/roxterm-config.glade	2010-08-15 13:30:35.608247939 +0100
@@ -2120,7 +2120,7 @@
                                         <property name="visible">True</property>
                                         <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
                                         <property name="xalign">0</property>
-                                        <property name="label" translatable="yes">_Number of initial tabs:</property>
+                                        <property name="label" translatable="yes">Initial _number of tabs:</property>
                                         <property name="use_underline">True</property>
                                         <property name="justify">right</property>
                                         <property name="mnemonic_widget">init_tabs</property>

Reply to: