[gnome-commander/treeview] treeview: the valgrind release
- From: Piotr Eljasiak <epiotr src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-commander/treeview] treeview: the valgrind release
- Date: Sat, 14 Aug 2010 20:40:16 +0000 (UTC)
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]