[gtkmm] IconSet: Use this via a RefPtr.



commit 59ad99f9f9347ca0f97d6265f6eea189f723665d
Author: Murray Cumming <murrayc murrayc com>
Date:   Fri Jan 28 13:52:21 2011 +0100

    IconSet: Use this via a RefPtr.
    
    * gtk/src/iconset.[h|cc]: Use this via RefPtr, because that is what the
    C API expects, though this is not a GObject.
    * gtk/gtkmm/stock.[h|cc]:
    * gtk/src/iconfactory.hg:
    * gtk/src/image.[hg|ccg]:
    * gtk/src/stylecontext.hg:
    * tools/m4/convert_gtk.m4: Adapt.

 ChangeLog               |   12 ++++++++++++
 gtk/gtkmm/stock.cc      |    6 +++---
 gtk/gtkmm/stock.h       |    2 +-
 gtk/src/iconfactory.hg  |    2 +-
 gtk/src/iconset.ccg     |   11 +++--------
 gtk/src/iconset.hg      |   24 +++++++++---------------
 gtk/src/image.ccg       |    6 +++---
 gtk/src/image.hg        |    8 ++++----
 gtk/src/stylecontext.hg |    4 ++--
 tools/m4/convert_gtk.m4 |    8 ++++----
 10 files changed, 42 insertions(+), 41 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 453f108..25ee795 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,17 @@
 2011-01-28  Murray Cumming  <murrayc murrayc com>
 
+	IconSet: Use this via a RefPtr.
+
+	* gtk/src/iconset.[h|cc]: Use this via RefPtr, because that is what the 
+	C API expects, though this is not a GObject.
+	* gtk/gtkmm/stock.[h|cc]:
+	* gtk/src/iconfactory.hg:
+	* gtk/src/image.[hg|ccg]:
+	* gtk/src/stylecontext.hg:
+	* tools/m4/convert_gtk.m4: Adapt.
+
+2011-01-28  Murray Cumming  <murrayc murrayc com>
+
 	Widget: Add some methods.
 
 	* gtk/src/widget.hg: Added set_state_flags(), get_state_flags(), 
diff --git a/gtk/gtkmm/stock.cc b/gtk/gtkmm/stock.cc
index c679c0b..55201c3 100644
--- a/gtk/gtkmm/stock.cc
+++ b/gtk/gtkmm/stock.cc
@@ -150,10 +150,10 @@ bool lookup(const Gtk::StockID& stock_id, Gtk::StockItem& item)
   return Gtk::StockItem::lookup(stock_id, item);
 }
 
-bool lookup(const Gtk::StockID& stock_id, Gtk::IconSet& iconset)
+bool lookup(const Gtk::StockID& stock_id, Glib::RefPtr<IconSet>& iconset)
 {
-  iconset = Gtk::IconSet::lookup_default(stock_id);
-  return (iconset.gobj() != 0);
+  iconset = IconSet::lookup_default(stock_id);
+  return (iconset && (iconset->gobj() != 0));
 }
 
 bool lookup(const Gtk::StockID& stock_id, Gtk::IconSize size, Gtk::Image& image)
diff --git a/gtk/gtkmm/stock.h b/gtk/gtkmm/stock.h
index e7ed80c..01b3f14 100644
--- a/gtk/gtkmm/stock.h
+++ b/gtk/gtkmm/stock.h
@@ -202,7 +202,7 @@ bool lookup(const Gtk::StockID& stock_id, Gtk::StockItem& item);
   *
   * @return <tt>true</tt> if the item was found - <tt>false</tt> otherwise.
   */
-bool lookup(const Gtk::StockID& stock_id, Gtk::IconSet& iconset);
+bool lookup(const Gtk::StockID& stock_id, Glib::RefPtr<Gtk::IconSet>& iconset);
 
 /** Receive an Image of the registered stock id with the correct size.
   * @param stock_id StockID to search for.
diff --git a/gtk/src/iconfactory.hg b/gtk/src/iconfactory.hg
index b48bb30..41c4a33 100644
--- a/gtk/src/iconfactory.hg
+++ b/gtk/src/iconfactory.hg
@@ -41,7 +41,7 @@ protected:
 public:
   _WRAP_CREATE()
 
-  _WRAP_METHOD(void add(const Gtk::StockID& stock_id, const IconSet& icon_set), gtk_icon_factory_add)
+  _WRAP_METHOD(void add(const Gtk::StockID& stock_id, const Glib::RefPtr<IconSet>& icon_set), gtk_icon_factory_add)
   _WRAP_METHOD(void add_default(), gtk_icon_factory_add_default)
   _WRAP_METHOD(void remove_default(), gtk_icon_factory_remove_default)
 };
diff --git a/gtk/src/iconset.ccg b/gtk/src/iconset.ccg
index daa4646..9fe0a0a 100644
--- a/gtk/src/iconset.ccg
+++ b/gtk/src/iconset.ccg
@@ -26,9 +26,10 @@
 namespace Gtk
 {
 
-IconSet::IconSet(const Glib::RefPtr<Gdk::Pixbuf>& pixbuf)
+Glib::RefPtr<IconSet> IconSet::create(const Glib::RefPtr<Gdk::Pixbuf>& pixbuf)
 {
-  gobject_ = gtk_icon_set_new_from_pixbuf(Glib::unwrap(pixbuf));
+  // See the comment at the top of this file, if you want to know why the cast works.
+  return Glib::RefPtr<IconSet>(reinterpret_cast<IconSet*>(gtk_icon_set_new_from_pixbuf(Glib::unwrap(pixbuf))));
 }
 
 std::vector<IconSize> IconSet::get_sizes() const
@@ -40,12 +41,6 @@ std::vector<IconSize> IconSet::get_sizes() const
   return Glib::ArrayHandler<IconSize, IconSizeTraits>::array_to_vector(pSizes, n_sizes, Glib::OWNERSHIP_SHALLOW);
 }
 
-IconSet IconSet::lookup_default(const Gtk::StockID& stock_id) //static
-{
-  GtkIconSet* pIconSet = gtk_icon_factory_lookup_default(stock_id.get_string().c_str());
-  return IconSet(pIconSet, true); //true = take_copy.
-}
-
 } /* namespace Gtk */
 
 
diff --git a/gtk/src/iconset.hg b/gtk/src/iconset.hg
index 3680541..b51d16c 100644
--- a/gtk/src/iconset.hg
+++ b/gtk/src/iconset.hg
@@ -33,8 +33,7 @@ namespace Gtk
 class StyleContext;
 class Widget;
 
-//TODO: Is _CLASS_BOXEDTYPE the appropriate thing to use here.
-//This seems to be reference-counted, not copied.
+
 
 /** This manages a set of variants of a particular icon 
  * An IconSet contains variants for different sizes and widget states. 
@@ -42,12 +41,16 @@ class Widget;
  */
 class IconSet
 {
-  _CLASS_BOXEDTYPE(IconSet, GtkIconSet, gtk_icon_set_new, gtk_icon_set_ref, gtk_icon_set_unref)
+  //GtkIconSet is registered as a boxed type, but it has ref/unref functions instead of copy/free,
+  //so we use it via RefPtr.
+  _CLASS_OPAQUE_REFCOUNTED(IconSet, GtkIconSet, gtk_icon_set_new, gtk_icon_set_ref, gtk_icon_set_unref)
   _IGNORE(gtk_icon_set_ref, gtk_icon_set_unref, gtk_icon_set_get_sizes)
+
 public:
-  explicit IconSet(const Glib::RefPtr<Gdk::Pixbuf>& pixbuf);
+  //TODO: Documentation
+  static Glib::RefPtr<IconSet> create(const Glib::RefPtr<Gdk::Pixbuf>& pixbuf);
 
-  _WRAP_METHOD(IconSet copy() const, gtk_icon_set_copy)
+  _WRAP_METHOD(Glib::RefPtr<IconSet> copy() const, gtk_icon_set_copy)
 
   _WRAP_METHOD(Glib::RefPtr<Gdk::Pixbuf> render_icon_pixbuf(const Glib::RefPtr<StyleContext>& context, IconSize size), gtk_icon_set_render_icon_pixbuf)
   _IGNORE(gtk_icon_set_render_icon) //deprecated.
@@ -56,16 +59,7 @@ public:
 
   std::vector<IconSize> get_sizes() const;
 
-  /** Looks for an icon in the list of default icon factories.
-   * @param stock_id StockID to search for
-   *
-   * For display to the user, you should use Style::lookup_icon_set() on the Style 
-   * for the widget that will display the icon, instead of using this function directly, 
-   * so that themes are taken into account
-   *
-   * @returns an IconSet
-   */
-  static IconSet lookup_default(const Gtk::StockID& stock_id);
+  _WRAP_METHOD(static Glib::RefPtr<IconSet> lookup_default(const Gtk::StockID& stock_id), gtk_icon_factory_lookup_default, refreturn)
 };
 
 } /* namespace Gtk */
diff --git a/gtk/src/image.ccg b/gtk/src/image.ccg
index e195d01..878c818 100644
--- a/gtk/src/image.ccg
+++ b/gtk/src/image.ccg
@@ -30,9 +30,9 @@ Image::Image(const Gtk::StockID& stock_id, IconSize size)
   _CONSTRUCT("stock", stock_id.get_c_str(), "icon-size", (GtkIconSize) int(size))
 {}
 
-Image::Image(IconSet& icon_set, IconSize size)
+Image::Image(const Glib::RefPtr<IconSet>& icon_set, IconSize size)
 :
-  _CONSTRUCT("icon-set", icon_set.gobj(), "icon-size", (GtkIconSize) int(size))
+  _CONSTRUCT("icon-set", (icon_set ? icon_set->gobj() : 0), "icon-size", (GtkIconSize) int(size))
 {}
 
 Image::Image(const Glib::RefPtr<Gdk::PixbufAnimation>& animation)
@@ -51,7 +51,7 @@ void Image::get_stock(Gtk::StockID& stock_id, IconSize& size) const
   stock_id = Gtk::StockID(pStockID); // the StockID ctor checks for 0
 }
 
-void Image::get_icon_set(IconSet& icon_set, IconSize& size) const
+void Image::get_icon_set(Glib::RefPtr<IconSet>& icon_set, IconSize& size) const
 {
   GtkIconSet* pIconSet = 0;
   GtkIconSize icon_size = GTK_ICON_SIZE_INVALID;
diff --git a/gtk/src/image.hg b/gtk/src/image.hg
index 615ae78..0d05386 100644
--- a/gtk/src/image.hg
+++ b/gtk/src/image.hg
@@ -95,13 +95,13 @@ public:
    */
   Image(const Gtk::StockID& stock_id, IconSize size);
 
-  Image(IconSet& icon_set, IconSize size);
+  Image(const Glib::RefPtr<IconSet>& icon_set, IconSize size);
   explicit Image(const Glib::RefPtr<Gdk::PixbufAnimation>& animation);
 
   _WRAP_METHOD(void set(const std::string& filename), gtk_image_set_from_file)
   _WRAP_METHOD(void set(const Glib::RefPtr<Gdk::Pixbuf>& pixbuf), gtk_image_set_from_pixbuf)
   _WRAP_METHOD(void set(const Gtk::StockID& stock_id, IconSize size), gtk_image_set_from_stock)
-  _WRAP_METHOD(void set(IconSet& icon_set, IconSize size), gtk_image_set_from_icon_set)
+  _WRAP_METHOD(void set(const Glib::RefPtr<IconSet>& icon_set, IconSize size), gtk_image_set_from_icon_set)
   _WRAP_METHOD(void set(const Glib::RefPtr<Gdk::PixbufAnimation>& animation), gtk_image_set_from_animation)
   _WRAP_METHOD(void set(const Glib::RefPtr<const Gio::Icon>& icon, IconSize size), gtk_image_set_from_gicon)
 
@@ -115,7 +115,7 @@ public:
   _WRAP_METHOD(Glib::RefPtr<Gdk::Pixbuf> get_pixbuf(), gtk_image_get_pixbuf, refreturn)
   _WRAP_METHOD(Glib::RefPtr<const Gdk::Pixbuf> get_pixbuf() const, gtk_image_get_pixbuf, refreturn, constversion)
   void get_stock(Gtk::StockID& stock_id, IconSize& size) const;
-  void get_icon_set(IconSet& icon_set, IconSize& size) const;
+  void get_icon_set(Glib::RefPtr<IconSet>& icon_set, IconSize& size) const;
   _WRAP_METHOD(Glib::RefPtr<Gdk::PixbufAnimation> get_animation(), gtk_image_get_animation, refreturn)
   _WRAP_METHOD(Glib::RefPtr<const Gdk::PixbufAnimation> get_animation() const, gtk_image_get_animation, refreturn, constversion)
 
@@ -150,7 +150,7 @@ public:
   _WRAP_PROPERTY("pixbuf", Glib::RefPtr<Gdk::Pixbuf>)
   _WRAP_PROPERTY("file", Glib::ustring)
   _WRAP_PROPERTY("stock", Glib::ustring)
-  _WRAP_PROPERTY("icon-set", Gtk::IconSet)
+  _WRAP_PROPERTY("icon-set", Glib::RefPtr<IconSet>)
   _WRAP_PROPERTY("icon-size", int)
   _WRAP_PROPERTY("pixel-size", int)
   _WRAP_PROPERTY("pixbuf-animation", Glib::RefPtr<Gdk::PixbufAnimation>)
diff --git a/gtk/src/stylecontext.hg b/gtk/src/stylecontext.hg
index 6bd867c..8e00d12 100644
--- a/gtk/src/stylecontext.hg
+++ b/gtk/src/stylecontext.hg
@@ -105,10 +105,10 @@ public:
                                            ...), gtk_style_context_get_style)
 */
 
-  _WRAP_METHOD(IconSet lookup_icon_set(const Glib::ustring& stock_id), gtk_style_context_lookup_icon_set)
+  _WRAP_METHOD(Glib::RefPtr<IconSet> lookup_icon_set(const Glib::ustring& stock_id), gtk_style_context_lookup_icon_set, refreturn)
 
 /* TODO: Move this to Iconset?
-  _WRAP_METHOD(GdkPixbuf  * gtk_icon_set_render_icon_pixbuf   (const IconSet& con_set,
+  _WRAP_METHOD(GdkPixbuf  * gtk_icon_set_render_icon_pixbuf   (const Glib::RefPtr<IconSet>& con_set,
                                                 GtkStyleContext *context,
                                                 GtkIconSize      size), gtk_icon_set_render_icon_pixbuf)
 */
diff --git a/tools/m4/convert_gtk.m4 b/tools/m4/convert_gtk.m4
index 29c463c..c6e52a8 100644
--- a/tools/m4/convert_gtk.m4
+++ b/tools/m4/convert_gtk.m4
@@ -386,9 +386,10 @@ _CONVERSION(Gtk::Notebook_Helpers::Page*,GtkNotebookPage*,`($1)((void*)($3))',`(
 
 _CONVERSION(`GtkSettings*',`Glib::RefPtr<Settings>', Glib::wrap($3))
 
-_CONVERSION(`IconSet&',`GtkIconSet*',__FR2P)
-_CONVERSION(`const IconSet&',`GtkIconSet*',`const_cast<GtkIconSet*>(($3).gobj())')
-_CONVERSION(`GtkIconSet*',`IconSet',`Glib::wrap($3)')
+_CONVERSION(`Glib::RefPtr<IconSet>&',`GtkIconSet*',__CONVERT_REFPTR_TO_P($3))
+_CONVERSION(`const Glib::RefPtr<IconSet>&',`GtkIconSet*',__CONVERT_REFPTR_TO_P($3))
+_CONVERSION(`GtkIconSet*',`Glib::RefPtr<IconSet>',`Glib::wrap($3)')
+
 _CONVERSION(`IconSource&',`GtkIconSource*',__FR2P)
 _CONVERSION(`const IconSource&',`const GtkIconSource*',__FR2P)
 _CONVERSION(`const GtkIconSource*',`const IconSource&',`Glib::wrap(const_cast<GtkIconSource*>($3), true)')
@@ -474,7 +475,6 @@ _CONVERSION(`const TreeModelColumnBase&',`int',`($3).index`'()')
 _CONVERSION(`GtkTreePath*',`TreePath', `Gtk::TreePath($3, false)')
 _CONVERSION(`GtkTreePath*',`Path', `Gtk::TreePath($3, false)')
 _CONVERSION(`GtkTreePath*',`TreeModel::Path', `Gtk::TreePath($3, false)')
-_CONVERSION(`GtkIconSet*&',`GtkIconSet**',`&($3)')
 _CONVERSION(`GtkIconSize&',`GtkIconSize*',`&($3)')
 _CONVERSION(`GtkCellEditable*',`CellEditable*',`dynamic_cast<$2>(Glib::wrap_auto((GObject*)($3), false))')
 _CONVERSION(`CellEditable*',`GtkCellEditable*',`Glib::unwrap($3)')



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