do not re-create ui_manager at layout change
authorVladimir Nadvornik <nadvornik@suse.cz>
Fri, 20 Mar 2009 22:48:01 +0000 (22:48 +0000)
committerVladimir Nadvornik <nadvornik@suse.cz>
Fri, 20 Mar 2009 22:48:01 +0000 (22:48 +0000)
src/layout.c
src/layout_util.c
src/typedefs.h

index c6725fe..b5ad932 100644 (file)
@@ -258,7 +258,7 @@ static GtkWidget *layout_tool_setup(LayoutWindow *lw)
        gtk_box_pack_start(GTK_BOX(box), menu_bar, FALSE, FALSE, 0);
        gtk_widget_show(menu_bar);
 
-       lw->toolbar = layout_actions_toolbar(lw);
+       layout_actions_toolbar(lw);
        gtk_box_pack_start(GTK_BOX(box), lw->toolbar, FALSE, FALSE, 0);
        if (!lw->options.toolbar_hidden) gtk_widget_show(lw->toolbar);
 
@@ -1638,7 +1638,6 @@ static void layout_grid_setup(LayoutWindow *lw)
        GtkWidget *files;
 
        layout_actions_setup(lw);
-       layout_actions_add_window(lw, lw->window);
 
        lw->group_box = gtk_vbox_new(FALSE, 0);
        gtk_box_pack_start(GTK_BOX(lw->main_box), lw->group_box, TRUE, TRUE, 0);
@@ -1770,21 +1769,17 @@ void layout_style_set(LayoutWindow *lw, gint style, const gchar *order)
 
        layout_geometry_get_dividers(lw, &lw->options.main_window.hdivider_pos, &lw->options.main_window.vdivider_pos);
 
+       /* preserve utility_box (image + sidebars), menu_bar and toolbar to be reused later in layout_grid_setup */
        /* lw->image is preserved together with lw->utility_box */
-       if (lw->utility_box)
-               {
-               /* preserve utility_box (image + sidebars) to be reused later in layout_grid_setup */
-               gtk_widget_hide(lw->utility_box);
-               g_object_ref(lw->utility_box);
-               gtk_container_remove(GTK_CONTAINER(lw->utility_box->parent), lw->utility_box);
-               }
+       if (lw->utility_box) gtk_container_remove(GTK_CONTAINER(lw->utility_box->parent), lw->utility_box);
+       if (lw->menu_bar) gtk_container_remove(GTK_CONTAINER(lw->menu_bar->parent), lw->menu_bar);
+       if (lw->toolbar) gtk_container_remove(GTK_CONTAINER(lw->toolbar->parent), lw->toolbar);
 
        /* clear it all */
 
        lw->h_pane = NULL;
        lw->v_pane = NULL;
 
-       lw->toolbar = NULL;
        lw->path_entry = NULL;
        lw->dir_view = NULL;
        lw->vd = NULL;
@@ -1801,10 +1796,12 @@ void layout_style_set(LayoutWindow *lw, gint style, const gchar *order)
        lw->info_pixel = NULL;
        lw->info_zoom = NULL;
 
+/*
        if (lw->ui_manager) g_object_unref(lw->ui_manager);
        lw->ui_manager = NULL;
        lw->action_group = NULL;
        lw->action_group_editors = NULL;
+*/
 
        gtk_container_remove(GTK_CONTAINER(lw->main_box), lw->group_box);
        lw->group_box = NULL;
@@ -1817,6 +1814,9 @@ void layout_style_set(LayoutWindow *lw, gint style, const gchar *order)
        layout_util_sync(lw);
        layout_status_update_all(lw);
 
+
+       // printf("%d %d %d \n", G_OBJECT(lw->utility_box)->ref_count, G_OBJECT(lw->menu_bar)->ref_count, G_OBJECT(lw->toolbar)->ref_count);
+
        /* sync */
 
        if (image_get_fd(lw->image))
@@ -2208,6 +2208,10 @@ void layout_free(LayoutWindow *lw)
                
        layout_bars_close(lw);
 
+       g_object_unref(lw->menu_bar);
+       g_object_unref(lw->toolbar);
+       g_object_unref(lw->utility_box);
+       
        gtk_widget_destroy(lw->window);
        
        if (lw->split_image_sizegroup) g_object_unref(lw->split_image_sizegroup);
index 25d96dc..fe06a22 100644 (file)
@@ -1760,6 +1760,8 @@ void layout_actions_setup(LayoutWindow *lw)
        layout_actions_setup_marks(lw);
        layout_actions_setup_editors(lw);
        layout_copy_path_update(lw);
+
+       layout_actions_add_window(lw, lw->window);
 }
 
 void layout_editors_reload_all(void)
@@ -1800,15 +1802,20 @@ void layout_actions_add_window(LayoutWindow *lw, GtkWidget *window)
 
 GtkWidget *layout_actions_menu_bar(LayoutWindow *lw)
 {
-       return gtk_ui_manager_get_widget(lw->ui_manager, "/MainMenu");
+       if (lw->menu_bar) return lw->menu_bar;
+       lw->menu_bar = gtk_ui_manager_get_widget(lw->ui_manager, "/MainMenu");
+       g_object_ref(lw->menu_bar);
+       return lw->menu_bar;
 }
 
 GtkWidget *layout_actions_toolbar(LayoutWindow *lw)
 {
-       GtkWidget *bar = gtk_ui_manager_get_widget(lw->ui_manager, "/ToolBar");
-       gtk_toolbar_set_icon_size(GTK_TOOLBAR(bar), GTK_ICON_SIZE_SMALL_TOOLBAR);
-       gtk_toolbar_set_style(GTK_TOOLBAR(bar), GTK_TOOLBAR_ICONS);
-       return bar;
+       if (lw->toolbar) return lw->toolbar;
+       lw->toolbar = gtk_ui_manager_get_widget(lw->ui_manager, "/ToolBar");
+       g_object_ref(lw->toolbar);
+       gtk_toolbar_set_icon_size(GTK_TOOLBAR(lw->toolbar), GTK_ICON_SIZE_SMALL_TOOLBAR);
+       gtk_toolbar_set_style(GTK_TOOLBAR(lw->toolbar), GTK_TOOLBAR_ICONS);
+       return lw->toolbar;
 }
 
 void layout_toolbar_clear(LayoutWindow *lw)
@@ -2164,6 +2171,7 @@ void layout_bars_new_selection(LayoutWindow *lw, gint count)
 
 GtkWidget *layout_bars_prepare(LayoutWindow *lw, GtkWidget *image)
 {
+       if (lw->utility_box) return lw->utility_box;
        lw->utility_box = gtk_hbox_new(FALSE, PREF_PAD_GAP);
        lw->utility_paned = gtk_hpaned_new();
        gtk_box_pack_start(GTK_BOX(lw->utility_box), lw->utility_paned, TRUE, TRUE, 0);
@@ -2173,6 +2181,7 @@ GtkWidget *layout_bars_prepare(LayoutWindow *lw, GtkWidget *image)
        
        gtk_widget_show(image);
 
+       g_object_ref(lw->utility_box);
        return lw->utility_box;
 }
 
index 9d684df..2dd8664 100644 (file)
@@ -578,9 +578,10 @@ struct _LayoutWindow
 //     gint tools_float;
 //     gint tools_hidden;
 
+       GtkWidget *menu_bar; /* referenced by lw, exist during whole lw lifetime */
        /* toolbar */
 
-       GtkWidget *toolbar;
+       GtkWidget *toolbar; /* referenced by lw, exist during whole lw lifetime */
 //     gint toolbar_hidden;
 
 //     GtkWidget *thumb_button;
@@ -638,7 +639,7 @@ struct _LayoutWindow
 
        /* misc */
 
-       GtkWidget *utility_box;
+       GtkWidget *utility_box; /* referenced by lw, exist during whole lw lifetime */
        GtkWidget *utility_paned; /* between image and bar */
        GtkWidget *bar_sort;
        GtkWidget *bar;