No changes, just add wxGtkList to ensure g_list_free() is always called.

Add an extremely simple RAII wrapper around GList and use it.

Also add wxGtkTreePathList which also automatically frees its contents to
simplify working with the lists of GtkTreePaths.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@68842 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2011-08-22 12:41:00 +00:00
parent 040050b8f4
commit 0eec47e4a2
3 changed files with 61 additions and 18 deletions

View File

@@ -0,0 +1,33 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/gtk/private/list.h
// Purpose: wxGtkList class.
// Author: Vadim Zeitlin
// Created: 2011-08-21
// RCS-ID: $Id$
// Copyright: (c) 2011 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_GTK_PRIVATE_LIST_H_
#define _WX_GTK_PRIVATE_LIST_H_
// ----------------------------------------------------------------------------
// Convenience class for calling g_list_free() automatically
// ----------------------------------------------------------------------------
class wxGtkList
{
public:
explicit wxGtkList(GList* list) : m_list(list) { }
~wxGtkList() { g_list_free(m_list); }
operator GList *() const { return m_list; }
GList * operator->() const { return m_list; }
protected:
GList* const m_list;
wxDECLARE_NO_COPY_CLASS(wxGtkList);
};
#endif // _WX_GTK_PRIVATE_LIST_H_

View File

@@ -19,6 +19,7 @@
#include "wx/stockitem.h" #include "wx/stockitem.h"
#include "wx/gtk/private.h" #include "wx/gtk/private.h"
#include "wx/gtk/private/list.h"
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// GTK callbacks // GTK callbacks
@@ -252,13 +253,12 @@ GtkLabel *wxButton::GTKGetLabel() const
{ {
GtkWidget* box = gtk_bin_get_child(GTK_BIN(child)); GtkWidget* box = gtk_bin_get_child(GTK_BIN(child));
GtkLabel* label = NULL; GtkLabel* label = NULL;
GList* list = gtk_container_get_children(GTK_CONTAINER(box)); wxGtkList list(gtk_container_get_children(GTK_CONTAINER(box)));
for (GList* item = list; item; item = item->next) for (GList* item = list; item; item = item->next)
{ {
if (GTK_IS_LABEL(item->data)) if (GTK_IS_LABEL(item->data))
label = GTK_LABEL(item->data); label = GTK_LABEL(item->data);
} }
g_list_free(list);
return label; return label;
} }
@@ -280,12 +280,11 @@ void wxButton::DoApplyWidgetStyle(GtkRcStyle *style)
GtkWidget* box = gtk_bin_get_child(GTK_BIN(child)); GtkWidget* box = gtk_bin_get_child(GTK_BIN(child));
if ( GTK_IS_BOX(box) ) if ( GTK_IS_BOX(box) )
{ {
GList* list = gtk_container_get_children(GTK_CONTAINER(box)); wxGtkList list(gtk_container_get_children(GTK_CONTAINER(box)));
for (GList* item = list; item; item = item->next) for (GList* item = list; item; item = item->next)
{ {
gtk_widget_modify_style(GTK_WIDGET(item->data), style); gtk_widget_modify_style(GTK_WIDGET(item->data), style);
} }
g_list_free(list);
} }
} }
} }

View File

@@ -34,6 +34,7 @@
#include "wx/gtk/dcclient.h" #include "wx/gtk/dcclient.h"
#include "wx/gtk/private/gdkconv.h" #include "wx/gtk/private/gdkconv.h"
#include "wx/gtk/private/list.h"
using namespace wxGTKImpl; using namespace wxGTKImpl;
class wxGtkDataViewModelNotifier; class wxGtkDataViewModelNotifier;
@@ -98,6 +99,26 @@ private:
wxDECLARE_NO_COPY_CLASS(wxGtkTreePath); wxDECLARE_NO_COPY_CLASS(wxGtkTreePath);
}; };
// ----------------------------------------------------------------------------
// wxGtkTreePathList: self-destroying list of GtkTreePath objects.
// ----------------------------------------------------------------------------
class wxGtkTreePathList : public wxGtkList
{
public:
// Ctor takes ownership of the list.
explicit wxGtkTreePathList(GList* list)
: wxGtkList(list)
{
}
~wxGtkTreePathList()
{
// Delete the list contents, wxGtkList will delete the list itself.
g_list_foreach(m_list, (GFunc)gtk_tree_path_free, NULL);
}
};
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// wxGtkTreeSelectionLock: prevent selection from changing during the // wxGtkTreeSelectionLock: prevent selection from changing during the
// lifetime of this object // lifetime of this object
@@ -4811,13 +4832,9 @@ int wxDataViewCtrl::GetColumnPosition( const wxDataViewColumn *column ) const
{ {
GtkTreeViewColumn *gtk_column = GTK_TREE_VIEW_COLUMN(column->GetGtkHandle()); GtkTreeViewColumn *gtk_column = GTK_TREE_VIEW_COLUMN(column->GetGtkHandle());
GList *list = gtk_tree_view_get_columns( GTK_TREE_VIEW(m_treeview) ); wxGtkList list(gtk_tree_view_get_columns(GTK_TREE_VIEW(m_treeview)));
gint pos = g_list_index( list, (gconstpointer) gtk_column ); return g_list_index( list, (gconstpointer) gtk_column );
g_list_free( list );
return pos;
} }
wxDataViewColumn *wxDataViewCtrl::GetSortingColumn() const wxDataViewColumn *wxDataViewCtrl::GetSortingColumn() const
@@ -4956,23 +4973,17 @@ int wxDataViewCtrl::GetSelections( wxDataViewItemArray & sel ) const
if (HasFlag(wxDV_MULTIPLE)) if (HasFlag(wxDV_MULTIPLE))
{ {
GtkTreeModel *model; GtkTreeModel *model;
GList *list = gtk_tree_selection_get_selected_rows( selection, &model ); wxGtkTreePathList list(gtk_tree_selection_get_selected_rows(selection, &model));
int count = 0; int count = 0;
while (list) for ( GList* current = list; current; current = g_list_next(current) )
{ {
GtkTreePath *path = (GtkTreePath*) list->data; GtkTreePath *path = (GtkTreePath*) list->data;
sel.Add(GTKPathToItem(path)); sel.Add(GTKPathToItem(path));
list = g_list_next( list );
count++; count++;
} }
// delete list
g_list_foreach( list, (GFunc) gtk_tree_path_free, NULL );
g_list_free( list );
return count; return count;
} }
else else