[gnome-commander/treeview] treeview: the valgrind release



commit 18950f1993d922f9e656df237a0595f941da09da
Author: Guillaume Wardavoir <earlgrey free fr>
Date:   Sat Aug 14 22:39:21 2010 +0200

    treeview: the valgrind release

 src/gnome-cmd-foldview-control.cc   |  143 +++++++++++++++++++-----
 src/gnome-cmd-foldview-gvfs.cc      |   11 ++
 src/gnome-cmd-foldview-gvfs.h       |    1 +
 src/gnome-cmd-foldview-model.cc     |   19 +++-
 src/gnome-cmd-foldview-private.h    |   61 ++++++++---
 src/gnome-cmd-foldview-treestore.cc |   65 +++++++++--
 src/gnome-cmd-foldview-treestore.h  |   20 +--
 src/gnome-cmd-foldview-view.cc      |   47 +++++++-
 src/gnome-cmd-foldview.cc           |  209 +++++++++++++++++++----------------
 src/gnome-cmd-foldview.h            |    1 +
 10 files changed, 411 insertions(+), 166 deletions(-)
---
diff --git a/src/gnome-cmd-foldview-control.cc b/src/gnome-cmd-foldview-control.cc
index 94ada2d..5b4c355 100644
--- a/src/gnome-cmd-foldview-control.cc
+++ b/src/gnome-cmd-foldview-control.cc
@@ -116,9 +116,11 @@
 
 
 
-//=============================================================================
-//  Common vars
-//=============================================================================
+//  ***************************************************************************
+//  *																		  *
+//  *								Common vars							      *
+//  *																		  *
+//  ***************************************************************************
 GcmdGtkFoldview::View::ctx_menu GcmdGtkFoldview:: s_context_menu =
 {
 	NULL, (gint)2,	
@@ -148,9 +150,11 @@ GcmdGtkFoldview::View::ctx_menu GcmdGtkFoldview:: s_context_menu =
 	}
 };
 
-//=============================================================================
-//  init_instance, ...
-//=============================================================================
+//  ***************************************************************************
+//  *																		  *
+//  *						Instance init / destroy ...		          		  *
+//  *																		  *
+//  ***************************************************************************
 void GcmdGtkFoldview::control_raz_pointers()
 {
 	// sync
@@ -175,17 +179,80 @@ void GcmdGtkFoldview::control_init_instance()
 
 	root_uri_set_1((gchar*)"/");
 }
+
+
 gboolean GcmdGtkFoldview::control_create()
-{
+{   
+	//g_signal_connect (this, "destroy", G_CALLBACK (__TEST__), NULL);
+
 	return TRUE;
 }
-void GcmdGtkFoldview::control_destroy()
+
+void GcmdGtkFoldview::control_dispose()
+{
+	model.release_objects();
+}
+void GcmdGtkFoldview::control_finalize()
+{
+	GVFS_async_cancel_all();
+	GVFS_qstack_destroy();
+}
+
+//  ***************************************************************************
+//  *																		  *
+//  *						GObject stuff					          		  *
+//  *																		  *
+//  ***************************************************************************
+GObjectClass *GcmdGtkFoldview::Control_parent_class = NULL;
+
+void GcmdGtkFoldview::Control_gtk_object_destroy(GtkObject* object)
+{
+	//g_return_if_fail( IS_GCMDGTKFOLDVIEW(object) );
+
+	//gwr_inf("Control_gtk_object_destroy:%03i", GCMDGTKFOLDVIEW(object)->control_ref_count());
+	gwr_inf("GcmdGtkFoldview::Control_gtk_object_destroy");
+
+	GCMDGTKFOLDVIEW(object)->control_dispose();
+
+	(* GTK_OBJECT_CLASS (Control_parent_class)->destroy)(object);
+}
+
+
+void GcmdGtkFoldview::Control_g_object_dispose(GObject* object)
+{
+	//g_return_if_fail( IS_GCMDGTKFOLDVIEW(object) );
+
+	//gwr_inf("Control_g_object_dispose:%03i", GCMDGTKFOLDVIEW(object)->control_ref_count());
+	gwr_inf("GcmdGtkFoldview::Control_g_object_dispose");
+
+	//g_assert(FALSE);
+
+	(*Control_parent_class->dispose)(object);
+}
+void GcmdGtkFoldview::Control_g_object_finalize(GObject* object)
+{
+	g_return_if_fail( IS_GCMDGTKFOLDVIEW(object) );
+
+	//gwr_inf("Control_g_object_finalize:%03i", GCMDGTKFOLDVIEW(object)->control_ref_count());
+	gwr_inf("GcmdGtkFoldview::Control_g_object_finalize");
+
+	GCMDGTKFOLDVIEW(object)->control_finalize();
+
+	(*Control_parent_class->finalize)(object);
+}
+void
+GcmdGtkFoldview::Control_g_object_init (GcmdGtkFoldview *foldview)
 {
+	foldview->control_init_instance();
 }
 
-//=============================================================================
-//	Contextual menu
-//=============================================================================
+
+
+//  ***************************************************************************
+//  *																		  *
+//  *							Contextual menu					              *
+//  *																		  *
+//  ***************************************************************************
 void GcmdGtkFoldview::control_context_menu_populate_add_separator(GtkWidget *widget)
 {
 	gtk_menu_shell_append(GTK_MENU_SHELL(widget), gtk_separator_menu_item_new());
@@ -489,13 +556,18 @@ void GcmdGtkFoldview::control_sync_treeview(GcmdGtkFoldview::View::ctx_menu_data
 	gnome_vfs_uri_unref(uri);
 }
 
+//  ***************************************************************************
+//  *																		  *
+//  *							Iter expansion					              *
+//  *																		  *
+//  ***************************************************************************
 
-//=============================================================================
-//	control_iter_expand
+//
+//	When an expansion occurs :
 //
 //  - Find all subdirs
 //  - For each subdir : call control_check_if_empty
-//=============================================================================
+//
 
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 //  Iter expansion static callback									MULTITHREAD
@@ -667,13 +739,19 @@ GcmdGtkFoldview::control_iter_expand(
 
 
 
-//=============================================================================
-//  control_check_if_empty static callback
+//  ***************************************************************************
+//  *																		  *
+//  *						Check is a directory is empty	                  *
+//  *																		  *
+//  ***************************************************************************
+
+//
+//	What we do here:
+//
+//  - Find all subdirs
+//  - If at least one, add a dummy subitem so GtkTreeview will show a little
+//  arrow allowing expansion.
 //
-//  - no   : add dummy element to the directory ( so the gtktreeview will show
-//  an arrow )
-//  - yes  : nop
-//=============================================================================
 
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 //  result callback													MULTITHREAD
@@ -733,6 +811,7 @@ void GcmdGtkFoldview::control_check_if_empty_callback_1(gvfs_async *ga)
 		CCIE_INF("cciec_1:adding dummy to parent:[0x%16x]-[0x%16x]-[0x%16x][0x%16x][0x%16x] %s | %s",
 			&parent_iter, parent_iter.stamp, parent_iter.user_data, parent_iter.user_data2, parent_iter.user_data3,
 			str, ls->ppath());
+		g_free(str);
 	}
 
 	// delete user data
@@ -792,13 +871,21 @@ void GcmdGtkFoldview::control_check_if_empty(GtkTreeIter *parent)
 	control_check_if_empty_p(parent_uri, parent_path);
 }
 
-//============================================================================= // _GWR_TODO_ MONITORING
+//  ***************************************************************************
+//  *																		  *
+//  *							Item collapse	              				  *
+//  *																		  *
+//  ***************************************************************************
+																				// _GWR_TODO_ MONITORING
+//
 //  Item collapsed
+//
 //  - Remove all subdirs
 //  - Add [DUMMY] ( we have been callapsed, so there were subdirs in there )
 //  This is useful, because when re-expanding, directory will be re-scanned
 //  and thus we'll be more accurate
-//=============================================================================
+//
+
 void
 GcmdGtkFoldview::control_iter_collapsed(
 GtkTreeIter *parent)
@@ -809,14 +896,18 @@ GtkTreeIter *parent)
 
 	removed = model.iter_remove_children(parent);
 
-	gwr_inf("control::iter_collapsed:removed %03i children", removed);
+	//gwr_inf("control::iter_collapsed:removed %03i children", removed);
 
 	// we have been collapsed, so we had children ; so re-add dummy child
 	model.iter_add_child(parent, &child, "...Working...", View::eIconUnknown);
 }
-//=============================================================================
-//  Divers
-//=============================================================================
+
+//  ***************************************************************************
+//  *																		  *
+//  *								Divers	              					  *
+//  *																		  *
+//  ***************************************************************************
+
 gboolean GcmdGtkFoldview::control_root_uri_set(GnomeVFSURI *uri)
 {
 	GtkTreeIter *parent = NULL;
diff --git a/src/gnome-cmd-foldview-gvfs.cc b/src/gnome-cmd-foldview-gvfs.cc
index 7e83684..4c51e91 100644
--- a/src/gnome-cmd-foldview-gvfs.cc
+++ b/src/gnome-cmd-foldview-gvfs.cc
@@ -374,6 +374,14 @@ void GVFS_qstack_initialize()
 	GVFS_qstack_size = GVFS_qstack_step;
 }
 
+void GVFS_qstack_destroy()
+{
+	gwr_inf("gstack_destroy");
+	g_free(GVFS_qstack_el);
+	g_free(GVFS_qstack_ix);
+}
+
+
 gboolean GVFS_qstack_realloc()
 {
 	gpointer temp = NULL;
@@ -415,6 +423,9 @@ gboolean GVFS_qstack_realloc()
 	// copy used pointers
 	memcpy( GVFS_qstack_el, temp, GVFS_qstack_el_core_size * GVFS_qstack_size);
 
+	// free temp
+	g_free(temp);
+
 	// update stack size
 	GVFS_qstack_size += GVFS_qstack_step;
 
diff --git a/src/gnome-cmd-foldview-gvfs.h b/src/gnome-cmd-foldview-gvfs.h
index 402dc47..437e707 100644
--- a/src/gnome-cmd-foldview-gvfs.h
+++ b/src/gnome-cmd-foldview-gvfs.h
@@ -259,6 +259,7 @@ struct gvfs_async_load_subdirs
 //*****************************************************************************
 gboolean		GVFS_qstack_initialized();
 void			GVFS_qstack_initialize();
+void			GVFS_qstack_destroy();
 
 GnomeVFSURI*	GVFS_uri_new(const gchar *text);
 gboolean		GVFS_info_from_uri(GnomeVFSURI* uri, GnomeVFSFileInfo* info);
diff --git a/src/gnome-cmd-foldview-model.cc b/src/gnome-cmd-foldview-model.cc
index 897479e..f75f1b4 100644
--- a/src/gnome-cmd-foldview-model.cc
+++ b/src/gnome-cmd-foldview-model.cc
@@ -75,6 +75,7 @@ GcmdGtkFoldview::Model::Rowlike::Rowlike(gchar *_utf8_name, gint _icon)
 GcmdGtkFoldview::Model::Rowlike::~Rowlike()
 {
 	g_free(d_utf8_name);
+	g_free(d_utf8_collate_key);
 }
 
 const   gchar*  
@@ -134,6 +135,8 @@ gboolean GcmdGtkFoldview::Model::create()
 #else
 
 	m_treestore = gnome_cmd_foldview_treestore_new();
+	// dont do sink on a widget that will be parented !!!
+	//g_object_ref_sink(m_treestore);
 
 #endif
 
@@ -141,8 +144,22 @@ gboolean GcmdGtkFoldview::Model::create()
 
 	return TRUE;
 }
-void GcmdGtkFoldview::Model::destroy()
+
+void GcmdGtkFoldview::Model::release_objects()
 {
+	gwr_inf("GcmdGtkFoldview::Model::release_objects()");
+#ifdef __GTS__
+	#warning NOT IMPLEMENTED
+#else
+
+	if ( m_treestore )
+	{
+		gwr_inf("GcmdGtkFoldview::Model::release_objects::releasing:%03i", m_treestore->refcount());
+		g_object_unref(m_treestore);
+		m_treestore = NULL;
+	}
+	
+#endif
 }
 
 //=============================================================================
diff --git a/src/gnome-cmd-foldview-private.h b/src/gnome-cmd-foldview-private.h
index ab24ca8..28e72f0 100644
--- a/src/gnome-cmd-foldview-private.h
+++ b/src/gnome-cmd-foldview-private.h
@@ -32,13 +32,8 @@
 
 		GcmdFileSelector resize automatically resize the main vertical pane
 		( FILL / EXPAND gtk settings somewhere ) ?
-		
-		memory leaks hunt
 
-		symlinks icons show little white pixel when selected its ugly
-		but gcmd's too
-			
-		init / destroy cleanup : g_object_ref on hided widgets
+		Trivial bug as no item is selectionned on foldview showing
 
 		..................... facultative  / later ............................
 
@@ -49,6 +44,26 @@
 		Notification from filesystem ( very hard to do, we're really going
 		multithread ) -> gdk_threads_enter will be enough I think
 
+DONE	init / destroy cleanup : g_object_ref on hided widgets
+
+DONE	memory leaks hunt
+
+DONE	memory leak : gnome-cmd-foldview-control.cc::814 forgot g_free(str)
+
+DONE	memory leak : root node
+
+DONE	memory leak : GcmdGtkFldview::Model::destroy implemented
+
+DONE	memory leak : gvfs quickstack
+
+DONE	correct ESC[30m for terminal after each gwr_print
+
+		.......................................................................
+COMMIT  05bb32e2cfd8eb56bf64e93bc1785ce52f6a100d
+
+DONE	symlinks icons show little white pixel when selected its ugly
+		but gcmd's too
+
 DONE	foldview correct position on show / hide ( cmdline, buttonbar, ... )
 
 DONE	(Finally) gcmd crashes when opening access-denied folder from treeview 
@@ -348,17 +363,10 @@ void GnomeCmdFileList::set_directory(GnomeCmdDir *dir)
 		"drag-data-delete"								SRC
 		
 ******************************************************************************/
-//#define USE_GTK_TREESTORE
-
-
-
 #include <glib.h>
 #include <glib-object.h>
 #include <gtk/gtkvbox.h>
 #include <gtk/gtklabel.h>
-#ifndef USE_GTK_TREESTORE
-	#include "gnome-cmd-foldview-treestore.h"
-#endif
 
 //*****************************************************************************
 //								Defines
@@ -368,10 +376,14 @@ void GnomeCmdFileList::set_directory(GnomeCmdDir *dir)
 // of a GnomeCmdFoldviewTreestore
 //#define USE_GTK_TREESTORE
 
+#ifndef USE_GTK_TREESTORE
+	#include "gnome-cmd-foldview-treestore.h"
+#endif
+
 //*****************************************************************************
 //								Logging
 //*****************************************************************************
-#define DEBUG_SHOW_INF
+//#define DEBUG_SHOW_INF
 #define DEBUG_SHOW_WNG
 #define DEBUG_SHOW_ERR
 #define DEBUG_SHOW_VFS
@@ -650,10 +662,10 @@ struct GcmdGtkFoldview
 	{
 		public:
 		void			init_instance();
+		void			release_objects();
 		private:
 		void			raz_pointers();
 		gboolean		create();
-		void			destroy();												// __GWR__TODO__
 
 		//---------------------------------------------------------------------
 		// divers
@@ -777,9 +789,26 @@ struct GcmdGtkFoldview
 	private:
 	void		control_raz_pointers();
 	gboolean	control_create();
-	void		control_destroy();
+	void		control_finalize();
+	void		control_dispose();
 
 	//-------------------------------------------------------------------------
+	// GObject stuff
+	//-------------------------------------------------------------------------
+	public:
+	static GObjectClass *Control_parent_class;
+	public:
+	static  void	Control_gtk_object_destroy	(GtkObject*);
+	static  void	Control_g_object_dispose	(GObject*);
+	static  void	Control_g_object_finalize   (GObject*);
+	static  void	Control_g_object_init		(GcmdGtkFoldview *foldview);
+	
+			gint	control_ref_count()
+					{
+						return ((GInitiallyUnowned*)this)->ref_count;
+					}
+	
+	//-------------------------------------------------------------------------
 	// divers
 	//-------------------------------------------------------------------------
 	private:
diff --git a/src/gnome-cmd-foldview-treestore.cc b/src/gnome-cmd-foldview-treestore.cc
index 8650440..720ba02 100644
--- a/src/gnome-cmd-foldview-treestore.cc
+++ b/src/gnome-cmd-foldview-treestore.cc
@@ -319,11 +319,13 @@ void*   GnomeCmdFoldviewTreestore::node_block::operator new(
 //=============================================================================
 void	GnomeCmdFoldviewTreestore::node_block::operator delete (void *p)
 {
-	#ifdef DEBUG_BLOCKS
 	GnomeCmdFoldviewTreestore::node_block *b = (GnomeCmdFoldviewTreestore::node_block*)p;
-	BLOCK_INF("BLK(+%04i blocks) d:%03i c:%03i", Count - 1, b->a_depth, b->a_card);
+	#ifdef DEBUG_BLOCKS
+	BLOCK_INF("BLK(-%04i blocks) d:%03i c:%03i", Count - 1, b->a_depth, b->a_card);
 	#endif
 
+	g_array_free( b->d_nodes, TRUE );
+
 	g_free(p);
 
 	Count--;
@@ -352,7 +354,7 @@ GnomeCmdFoldviewTreestore::node_block::node_get(
 		if ( pos != 0 )
 			return NULL;
 
-		BLOCK_INF("BLK(%-20s) d:%03i p:%03i c:%03i [NULL]", "node_get", a_depth, index, a_card);
+		//BLOCK_INF("BLK(%-20s) d:%03i p:%03i c:%03i [NULL]", "node_get", a_depth, index, a_card);
 		// this is authorized, since gtk call us for 0th child !!!
 		return NULL;
 	}
@@ -365,7 +367,7 @@ GnomeCmdFoldviewTreestore::node_block::node_get(
 	}
 
 	node = g_array_index(d_nodes, GnomeCmdFoldviewTreestore::node*, pos);
-	BLOCK_INF("BLK(%-20s) d:%03i p:%03i c:%03i [%s]", "node_get", a_depth, pos, a_card, node->log());
+	//BLOCK_INF("BLK(%-20s) d:%03i p:%03i c:%03i [%s]", "node_get", a_depth, pos, a_card, node->log());
 	return node;
 }
 
@@ -577,7 +579,7 @@ GnomeCmdFoldviewTreestore::node_block::node_cut(
 	*   @node : the node of this block to remove
 	*
 	*   _RECURSIVELY_ remove all the nodes of the block.
-	*   After this call, the block is set to have 0 child.
+	*   After this call, the block cannot be used, its info is invalid
 	*
 	**/
 
@@ -596,13 +598,15 @@ GnomeCmdFoldviewTreestore::node_block::purge()
 	{
 		next = node->next();
 		count += node->purge();
+
 		delete node;
+		count++;
+
 		node = next;
 	}
 
-	// update block 
-	//g_array_remove_range(d_nodes, 0, a_card - 1);
-	//a_card = 0;
+	// no update block, the "purge" process for node_blocks is separated
+	// in two methods - this is the quick part
 	return count;
 }
 
@@ -620,12 +624,15 @@ GnomeCmdFoldviewTreestore::node_block::purge_and_update()
 	{
 		next = node->next();
 		count += node->purge();
+
 		delete node;
+		count++;
+
 		node = next;
 	}
 
-	// update block 
-	//g_array_remove_range(pointer, index, length);
+	// update block, the "purge" process for node_blocks is separated
+	// in two methods - this is the first call
 	g_array_remove_range(d_nodes, 0, a_card);
 	a_card = 0;
 	return count;
@@ -858,6 +865,42 @@ gint GnomeCmdFoldviewTreestore::remove_children(
 	return count;
 }
 
+//=============================================================================
+
+  /**
+	*   GnomeCmdFoldviewTreestore::clear:
+	*
+	*   Clear * everything *
+	*
+	**/
+
+//=============================================================================
+gint 
+GnomeCmdFoldviewTreestore::clear()
+{
+	gint count = 0;
+
+	// store is empty !
+	if ( !d_node_root )
+		return 0;
+
+	// Quickly purge all beyond node_root	
+	count = d_node_root->children()->purge();
+
+	// delete node_root
+	delete d_node_root->children();
+	delete d_node_root;
+	count++;
+
+	// Set pointer to NULL
+	d_node_root = NULL;
+	
+	gwr_inf("GnomeCmdFoldviewTreestore::clear:%03i nodes deleted", count);
+	
+	return count;
+}
+
+
 
 
 //  ###########################################################################
@@ -1399,6 +1442,8 @@ gnome_cmd_foldview_treestore_finalize(GObject *object)
 	g_return_if_fail ( IS_GNOME_CMD_FOLDVIEW_TREESTORE(object) );
 	treestore = GNOME_CMD_FOLDVIEW_TREESTORE(object);
 
+	gwr_inf("GnomeCmdFoldviewTreestore::finalize()");
+
 	// free all records and free all memory used by the list
 	treestore->clear();
 
diff --git a/src/gnome-cmd-foldview-treestore.h b/src/gnome-cmd-foldview-treestore.h
index 179d329..9166b1e 100644
--- a/src/gnome-cmd-foldview-treestore.h
+++ b/src/gnome-cmd-foldview-treestore.h
@@ -206,6 +206,12 @@ struct GnomeCmdFoldviewTreestore
 					return TRUE;
 				}
 
+	public:
+	gint		refcount()
+				{
+					return ((GInitiallyUnowned*)this)->ref_count;
+				}
+
 	//.........................................................................
 	// GtkTreeModel interface
 	//.........................................................................
@@ -240,19 +246,7 @@ struct GnomeCmdFoldviewTreestore
 	void	add_child			(GtkTreeIter *in_parent,	GtkTreeIter *out_child, GnomeCmdFoldviewTreestore::Data*);
 	void	set_value			(GtkTreeIter *in,			gint column, GValue *value);
 	gint	remove_children		(GtkTreeIter *in);	
-	gint	clear()
-			{
-				// store is empty !
-				if ( !d_node_root )
-					return 0;
-					
-				//return d_node_root->children()->node_remove_all(dyn_data);
-				// return 0;
-				delete d_node_root;
-				d_node_root = NULL;
-				
-				return 0;
-			}
+	gint	clear();
 };
 
 GType         					gnome_cmd_foldview_treestore_get_type   (void);
diff --git a/src/gnome-cmd-foldview-view.cc b/src/gnome-cmd-foldview-view.cc
index 4790169..d38d412 100644
--- a/src/gnome-cmd-foldview-view.cc
+++ b/src/gnome-cmd-foldview-view.cc
@@ -246,7 +246,7 @@ gboolean GcmdGtkFoldview::View::create(GtkWidget *_this, GtkTreeModel *_treemode
 	// create the connection combo
 	m_con_combo = (GtkWidget*)( new GnomeCmdCombo(2, 1, NULL) );
 
-	gtk_object_set_data_full (GTK_OBJECT (foldview()), "con_combo", m_con_combo, (GtkDestroyNotify) g_object_unref);
+	//gtk_object_set_data_full (GTK_OBJECT (foldview()), "con_combo", m_con_combo, (GtkDestroyNotify) g_object_unref);
 	gtk_widget_set_size_request (m_con_combo, 150, -1);
 		gtk_clist_set_row_height (GTK_CLIST (GNOME_CMD_COMBO (m_con_combo)->list), 20);
 		gtk_entry_set_editable (GTK_ENTRY (GNOME_CMD_COMBO (m_con_combo)->entry), FALSE);
@@ -278,9 +278,11 @@ gboolean GcmdGtkFoldview::View::create(GtkWidget *_this, GtkTreeModel *_treemode
 	
 	// create the scrollwindow that we'll place the treeview in
 	m_scrolledwindow = gtk_scrolled_window_new(NULL, NULL);
+	/*
 	gtk_object_set_data_full (GTK_OBJECT (foldview()),
 		                      "scrolledwindow", m_scrolledwindow,
 		                      (GtkDestroyNotify) g_object_unref);
+	*/
 	gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (m_scrolledwindow),
 		                            GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
 
@@ -394,6 +396,9 @@ gboolean GcmdGtkFoldview::View::create(GtkWidget *_this, GtkTreeModel *_treemode
 	// some settings
 	gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(m_treeview), FALSE);
 	gtk_tree_view_set_model(GTK_TREE_VIEW(m_treeview), m_treemodel);
+
+	gwr_inf("--> %03i", GNOME_CMD_FOLDVIEW_TREESTORE(m_treemodel)->refcount() );
+
 	gtk_tree_view_set_show_expanders(treeview(), TRUE);
 
 	// treeview contextual menu :
@@ -418,14 +423,15 @@ gboolean GcmdGtkFoldview::View::create(GtkWidget *_this, GtkTreeModel *_treemode
 
 	//-------------------------------------------------------------------------
 	// ref objects for showing / hiding since I dont understand gtk ref / unref
-	g_object_ref(foldview());
+	// g_object_ref(foldview()); 
+	// Now I understand !
 
-	g_object_ref(m_con_hbox);
-	g_object_ref(m_con_combo);
+//g_object_ref(m_con_hbox);
+//g_object_ref(m_con_combo);
 	//g_object_ref(m_dir_indicator);
 	//g_object_ref(m_vol_label);
-	g_object_ref(m_scrolledwindow);
-	g_object_ref(m_treeview);
+	//g_object_ref(m_scrolledwindow);
+	//g_object_ref(m_treeview);
 
 	//-------------------------------------------------------------------------
 	// show, except the pane container
@@ -447,7 +453,36 @@ gboolean GcmdGtkFoldview::View::create(GtkWidget *_this, GtkTreeModel *_treemode
 
 void GcmdGtkFoldview::View::destroy()
 {
+	/*
+	if ( m_con_hbox )
+		GtkWidget *m_con_combo;
+		GtkWidget *m_vol_label;
+
+		GtkWidget   *m_scrolledwindow;
+		GtkWidget   *m_info_label;
+
+		GdkPixbuf		*m_pixbuf[50];
 	
+		public:
+		enum eIcon
+		{
+			eIconUnknown					,
+
+			eIconDirReadWrite				,
+			eIconDirReadOnly				,
+			eIconDirForbidden				,
+
+			eIconSymlinkToDirReadWrite		,
+			eIconSymlinkToDirReadOnly		,
+			eIconSymlinkToDirForbidden
+		};
+		
+		// Release 
+		icons_unload();
+
+
+		GtkWidget		*m_treeview;
+	*/
 }
 
 //=============================================================================
diff --git a/src/gnome-cmd-foldview.cc b/src/gnome-cmd-foldview.cc
index 93c0bb5..e50b089 100644
--- a/src/gnome-cmd-foldview.cc
+++ b/src/gnome-cmd-foldview.cc
@@ -68,6 +68,16 @@ static  GnomeVFSResult  sVFSResult		= GNOME_VFS_OK;	 // for sync operations
 
 extern  GnomeCmdMainWin *main_win;
 
+
+//  ###########################################################################
+//  ###																		###
+//  ##																		 ##
+//  #								Logging									  #
+//  ##																		 ##
+//  ###																		###
+//  ###########################################################################
+
+
 //=============================================================================
 //  Logger
 //=============================================================================
@@ -121,7 +131,7 @@ void gwr_inf(const char* fmt, ...)
 		return;
 	#endif
 	va_list val; va_start(val, fmt); vsprintf(sLogStr, fmt, val); va_end(val);
-	gwr_print("\033[0;32mINF:\033[0;30m");
+	gwr_print("\033[0;32mINF:\033[0m");
 }
 void gwr_wng(const char* fmt, ...)
 {
@@ -129,7 +139,7 @@ void gwr_wng(const char* fmt, ...)
 		return;
 	#endif
 	va_list val; va_start(val, fmt); vsprintf(sLogStr, fmt, val); va_end(val);
-	gwr_print("\033[0;35mWNG:\033[0;30m");
+	gwr_print("\033[0;35mWNG:\033[0m");
 }
 void gwr_err(const char* fmt, ...)
 {
@@ -137,7 +147,7 @@ void gwr_err(const char* fmt, ...)
 		return;
 	#endif
 	va_list val; va_start(val, fmt); vsprintf(sLogStr, fmt, val); va_end(val);
-	gwr_print("\033[0;31mERR:\033[0;30m");
+	gwr_print("\033[0;31mERR:\033[0m");
 }
 void gwr_inf_vfs(const char* fmt, ...)
 {
@@ -148,7 +158,7 @@ void gwr_inf_vfs(const char* fmt, ...)
 	strcat(sLogStr, " [VFS-INF:");
 	strcat(sLogStr,   gnome_vfs_result_to_string(sVFSResult));
 	strcat(sLogStr, "]");
-	gwr_print("\033[0;31mERR:\033[0;30m");
+	gwr_print("\033[0;31mERR:\033[0m");
 }
 void gwr_err_vfs(const char* fmt, ...)
 {
@@ -159,15 +169,17 @@ void gwr_err_vfs(const char* fmt, ...)
 	strcat(sLogStr, " [VFS-ERR:");
 	strcat(sLogStr,   gnome_vfs_result_to_string(sVFSResult));
 	strcat(sLogStr, "]");
-	gwr_print("\033[0;31mERR:\033[0;30m");
+	gwr_print("\033[0;31mERR:\033[0m");
 }
 
 
-//  ***************************************************************************
-//  *																		  *
-//  *								Divers									  *
-//  *																		  *
-//  ***************************************************************************
+//  ###########################################################################
+//  ###																		###
+//  ##																		 ##
+//  #								Divers									  #
+//  ##																		 ##
+//  ###																		###
+//  ###########################################################################
 GcmdGtkFoldview::eFileAccess GcmdGtkFoldview::Access_from_permissions(
 	GnomeVFSFilePermissions permissions)
 {
@@ -227,23 +239,30 @@ GcmdGtkFoldview::View::eIcon GcmdGtkFoldview::View::Icon_from_type_access(
 	return View::eIconUnknown;
 }
 
-//  ***************************************************************************
-//  *																		  *
-//  *						widget showing / hiding							  *
-//  *																		  *
-//  ***************************************************************************
-static  GtkWidget*	GcmdGtkFoldviewSingleton	= NULL;
+
+
+//  ###########################################################################
+//  ###																		###
+//  ##																		 ##
+//  #						GcmdGtkFoldview									  #
+//  ##																		 ##
+//  ###																		###
+//  ###########################################################################
 
 //  ***************************************************************************
 //  *																		  *
-//  *						public interface								  *
+//  *							Singleton impl							      *
 //  *																		  *
 //  ***************************************************************************
 
-//=============================================================================
-//  Singleton
-//=============================================================================
+//
+// ~ The ~  singleton
+//
+static  GtkWidget*	GcmdGtkFoldviewSingleton = NULL;
 
+//
+// Singleton accessors
+//
 GtkWidget* GcmdWidget()
 {
 	if ( GcmdGtkFoldviewSingleton != NULL )
@@ -251,6 +270,10 @@ GtkWidget* GcmdWidget()
 
 	GcmdGtkFoldviewSingleton = gcmdgtkfoldview_new();
 
+	// assume ownership:
+	// ensure foldview will not be destroyed when showing / hiding
+	g_object_ref_sink(GcmdGtkFoldviewSingleton);
+
 	return GcmdGtkFoldviewSingleton;
 }
 
@@ -259,78 +282,29 @@ GcmdGtkFoldview* GcmdFoldview()
 	return (GcmdGtkFoldview*)( GcmdWidget() );
 }
 
-void	gnome_cmd_foldview_update_style(GtkWidget *widget)
-{
-	g_return_if_fail( widget != NULL );
-
-	(GCMDGTKFOLDVIEW(widget))->view.update_style();
-}
-
-GtkWidget* gnome_cmd_foldview_get_instance()
-{
-	return GcmdWidget();
-}
-
-//=============================================================================
-//  Init
-//=============================================================================
-
-//=============================================================================
-//  Root element
-//=============================================================================
-gboolean GcmdGtkFoldview::root_uri_set_1(gchar * text)
-{
-	GnomeVFSURI *uri	= GVFS_uri_new(text);
-	control_root_uri_set(uri);
-	gnome_vfs_uri_unref(uri);
-	return TRUE;
-}
-
-gboolean GcmdGtkFoldview::root_uri_set_2(GnomeVFSURI *uri)
-{
-	return control_root_uri_set(uri);
-}
-
-
-
 //  ***************************************************************************
 //  *																		  *
-//  *						gtk implementation								  *
+//  *							GObject impl								  *
 //  *																		  *
 //  ***************************************************************************
 
+static  void	gcmdgtkfoldview_class_init(GcmdGtkFoldviewClass   *klass);
+
 enum
 {
   GCMDGTKFOLDVIEW_SIGNAL,
   LAST_SIGNAL
 };
 
-static void gcmdgtkfoldview_class_init          (GcmdGtkFoldviewClass   *klass);
-static void gcmdgtkfoldview_init                (GcmdGtkFoldview  		*ttt);
-//static void init								(GcmdGtkFoldview		*foldview);
-
 static guint gcmdgtkfoldview_signals[LAST_SIGNAL] = { 0 };
 
-// GObject stuff - nothing to worry about
-static GObjectClass *parent_class = NULL;
-
 
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-static void
-gnome_cmd_foldview_treestore_finalize(GObject *object)
-{
-	GcmdGtkFoldview *foldview  = NULL;
-	//......................................................................... 
-	g_return_if_fail ( IS_GCMDGTKFOLDVIEW(object) );
-	foldview = GCMDGTKFOLDVIEW(object);
-
-	g_assert(FALSE);
-
-	// must chain up - finalize parent
-	(* parent_class->finalize) (object);
+//=============================================================================
+//
+//							Pure GObject stuff
+//
+//=============================================================================
 
-}
 //-----------------------------------------------------------------------------
 //	GcmdGtkFoldview GType implementation
 //-----------------------------------------------------------------------------
@@ -351,7 +325,7 @@ gcmdgtkfoldview_get_type (void)
 			NULL, /* class_data */
 			sizeof (GcmdGtkFoldview),
 			0,
-			(GInstanceInitFunc) gcmdgtkfoldview_init,
+			(GInstanceInitFunc)GcmdGtkFoldview::Control_g_object_init,
 		};
 
 	fv_type = g_type_register_static(GTK_TYPE_VBOX, "gtkGcmdFoldview", &fv_info, (GTypeFlags)0);
@@ -376,24 +350,18 @@ gcmdgtkfoldview_class_init (GcmdGtkFoldviewClass *klass)
 		g_cclosure_marshal_VOID__VOID,
 		G_TYPE_NONE, 0);
 
-
-
 	// For exiting properly 
-	GObjectClass *object_class;
+    GtkObjectClass  *gtk_object_class   = GTK_OBJECT_CLASS  (klass);
+    //GtkWidgetClass  *gtk_widget_class   = GTK_WIDGET_CLASS  (klass);
+	GObjectClass	*g_object_class		= G_OBJECT_CLASS	(klass);
 
-	parent_class = (GObjectClass*) g_type_class_peek_parent (klass);
-	object_class = (GObjectClass*) klass;
 
-	object_class->finalize = gnome_cmd_foldview_treestore_finalize;
-}
+	GcmdGtkFoldview::Control_parent_class	= (GObjectClass*) g_type_class_peek_parent (klass);
 
-//-----------------------------------------------------------------------------
-//	GcmdGtkFoldview instance initialization
-//-----------------------------------------------------------------------------
-static void
-gcmdgtkfoldview_init (GcmdGtkFoldview *foldview)
-{
-	foldview->control_init_instance();
+	// override dispose & finalize
+	gtk_object_class->destroy   = GcmdGtkFoldview::Control_gtk_object_destroy;
+	g_object_class->dispose		= GcmdGtkFoldview::Control_g_object_dispose;
+	g_object_class->finalize	= GcmdGtkFoldview::Control_g_object_finalize;
 }
 
 GtkWidget*
@@ -402,8 +370,61 @@ gcmdgtkfoldview_new ()
     return GTK_WIDGET (g_object_new (GCMDGTKFOLDVIEW_TYPE, NULL));
 }
 
-void
-gcmdgtkfoldview_clear (GcmdGtkFoldview *foldview)
+//  ###########################################################################
+//  ###																		###
+//  ##																		 ##
+//  #						Public methods									  #
+//  ##																		 ##
+//  ###																		###
+//  ###########################################################################
+void	
+gnome_cmd_foldview_update_style(GtkWidget *widget)
+{
+	g_return_if_fail( widget != NULL );
+
+	(GCMDGTKFOLDVIEW(widget))->view.update_style();
+}
+
+GtkWidget* 
+gnome_cmd_foldview_get_instance()
 {
+	return GcmdWidget();
 }
 
+void gnome_cmd_foldview_destroy()
+{
+	gint rc = 0;
+
+	if ( ! GcmdGtkFoldviewSingleton )
+		return;
+
+	rc = (GCMDGTKFOLDVIEW(GcmdGtkFoldviewSingleton))->control_ref_count();
+
+	// release our ref
+	gwr_inf("gnome_cmd_foldview_destroy:refcount is %03i, releasing one", rc);
+	g_object_unref( GcmdGtkFoldviewSingleton );
+
+	// last ref !
+	//gwr_inf("removing last ref...");
+	//g_object_unref( GcmdGtkFoldviewSingleton );
+	//gtk_widget_destroy( GcmdWidget() );
+}
+
+
+//=============================================================================
+//  Root element
+//=============================================================================
+gboolean GcmdGtkFoldview::root_uri_set_1(gchar * text)
+{
+	GnomeVFSURI *uri	= GVFS_uri_new(text);
+	control_root_uri_set(uri);
+	gnome_vfs_uri_unref(uri);
+	return TRUE;
+}
+
+gboolean GcmdGtkFoldview::root_uri_set_2(GnomeVFSURI *uri)
+{
+	return control_root_uri_set(uri);
+}
+
+
diff --git a/src/gnome-cmd-foldview.h b/src/gnome-cmd-foldview.h
index f9464b4..e20327c 100644
--- a/src/gnome-cmd-foldview.h
+++ b/src/gnome-cmd-foldview.h
@@ -35,6 +35,7 @@
 
 // This function because of the creation process of GtkWidgets. Annoying.
 GtkWidget*			gnome_cmd_foldview_get_instance();
+GtkWidget*			gnome_cmd_foldview_destroy();
 void				gnome_cmd_foldview_update_style (GtkWidget *widget);
 
 #endif //__GCMDGTKFOLDVIEW_H__



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