[gtkmm] Builder::get_widget_derived(): Make this static



commit e1eb87eeb949a03505a7a590968acd366f37a01d
Author: Murray Cumming <murrayc murrayc com>
Date:   Mon Apr 17 22:04:19 2017 +0200

    Builder::get_widget_derived(): Make this static
    
    To avoid the need to create a shared_ptr to this.
    
    Bug #755037

 demos/gtk-demo/example_builder.cc   |    2 +-
 demos/gtk-demo/example_shortcuts.cc |    2 +-
 gtk/src/builder.hg                  |   16 +++++++---------
 tests/builder/main.cc               |    6 +++---
 4 files changed, 12 insertions(+), 14 deletions(-)
---
diff --git a/demos/gtk-demo/example_builder.cc b/demos/gtk-demo/example_builder.cc
index adf166b..1062572 100644
--- a/demos/gtk-demo/example_builder.cc
+++ b/demos/gtk-demo/example_builder.cc
@@ -39,7 +39,7 @@ Gtk::Window* do_builder()
 
   // Get the GtkBuilder-instantiated window:
   Example_Builder* pWindow = nullptr;
-  builder->get_widget_derived("window1", pWindow);
+  Gtk::Builder::get_widget_derived(builder, "window1", pWindow);
   if (!pWindow)
   {
     std::cout << "Could not get 'window1' from the builder." << std::endl;
diff --git a/demos/gtk-demo/example_shortcuts.cc b/demos/gtk-demo/example_shortcuts.cc
index 37e593c..a5975bb 100644
--- a/demos/gtk-demo/example_shortcuts.cc
+++ b/demos/gtk-demo/example_shortcuts.cc
@@ -39,7 +39,7 @@ Gtk::Window* do_shortcuts()
 
   // Get the GtkBuilder-instantiated window:
   Example_Shortcuts* pWindow = nullptr;
-  builder->get_widget_derived("window1", pWindow);
+  Gtk::Builder::get_widget_derived(builder, "window1", pWindow);
   if (!pWindow)
   {
     std::cout << "Could not get 'window1' from the builder." << std::endl;
diff --git a/gtk/src/builder.hg b/gtk/src/builder.hg
index c0e1752..6c202ea 100644
--- a/gtk/src/builder.hg
+++ b/gtk/src/builder.hg
@@ -500,8 +500,8 @@ public:
    * @code
    * MyDerivedDialog* pDialog1 = nullptr;
    * MyDerivedDialog* pDialog2 = nullptr;
-   * refBuilder->get_widget_derived("mydialog1", pDialog1);
-   * refBuilder->get_widget_derived("mydialog2", pDialog2, "A storm is imminent!", true);
+   * get_widget_derived(refBuilder, "mydialog1", pDialog1);
+   * get_widget_derived(refBuilder, "mydialog2", pDialog2, "A storm is imminent!", true);
    * @endcode
    *
    * @note
@@ -515,14 +515,14 @@ public:
    * @retval widget A pointer to the widget, or <tt>nullptr</tt> on failure.
    */
   template <typename T_Widget, typename... Args> inline
-  void get_widget_derived(const Glib::ustring& name, T_Widget*& widget, Args&&... args)
+  static void get_widget_derived(const Glib::RefPtr<Gtk::Builder>& builder, const Glib::ustring& name, 
T_Widget*& widget, Args&&... args)
   {
      // Initialize output parameter:
      widget = nullptr;
 
      // Get the widget from the GtkBuilder file.
      using cwidget_type = typename T_Widget::BaseObjectType;
-     auto pCWidget = (cwidget_type*)get_cwidget(name);
+     auto pCWidget = (cwidget_type*)builder->get_cwidget(name);
 
      //The error was already reported by get_cwidget().
      if(!pCWidget)
@@ -548,9 +548,7 @@ public:
        //Create a new C++ instance to wrap the existing C instance:
 
        //Set the output variable. We needed to do this because we can not template the return type.
-       Glib::RefPtr<Gtk::Builder> refThis(this);
-       refThis->reference(); //take a copy.
-       widget = new T_Widget(pCWidget, refThis, std::forward<Args>(args)...);
+       widget = new T_Widget(pCWidget, builder, std::forward<Args>(args)...);
        // Don't add reference to widget. That's done only in methods that return
        // a Glib::RefPtr<Something>.
      }
@@ -560,9 +558,9 @@ public:
    * @newin{3,8}
    */
   template <typename T_Widget, typename... Args> inline
-  void get_widget_derived(const Glib::ustring& name, const T_Widget*& widget, Args&&... args) const
+  static void get_widget_derived(const Glib::RefPtr<const Gtk::Builder>& builder, const Glib::ustring& name, 
const T_Widget*& widget, Args&&... args)
   {
-    const_cast<Builder*>(this)->get_widget_derived(name, widget, std::forward<Args>(args)...);
+    get_widget_derived(std::const_pointer_cast<Gtk::Builder>(builder), name, widget, 
std::forward<Args>(args)...);
   }
 
 #m4 _CONVERSION(`GSList*',`std::vector<Glib::RefPtr<Glib::Object> 
',`Glib::SListHandler<Glib::RefPtr<Glib::Object> >::slist_to_vector($3, Glib::OWNERSHIP_SHALLOW)')
diff --git a/tests/builder/main.cc b/tests/builder/main.cc
index 0ff8c2f..2a9635b 100644
--- a/tests/builder/main.cc
+++ b/tests/builder/main.cc
@@ -114,8 +114,8 @@ public:
     std::cout << "MainWindow::ctor" << std::endl;
 
     // Called twice just to see if two calls affect the ref count.
-    refBuilder->get_widget_derived("derived_button", m_pDerivedButton, "face-smile");
-    refBuilder->get_widget_derived("derived_button", m_pDerivedButton);
+    Gtk::Builder::get_widget_derived(refBuilder, "derived_button", m_pDerivedButton, "face-smile");
+    Gtk::Builder::get_widget_derived(refBuilder, "derived_button", m_pDerivedButton);
     refBuilder->get_widget("standard_button", m_pStandardButton);
     refBuilder->get_widget("standard_button", m_pStandardButton);
 
@@ -155,7 +155,7 @@ int main(int argc, char* argv[])
   auto builder = Gtk::Builder::create_from_string(gladefile);
 
   MainWindow* main_win = nullptr;
-  builder->get_widget_derived("main_window", main_win);
+  Gtk::Builder::get_widget_derived(builder, "main_window", main_win);
 
   Gtk::Button* orph_button = nullptr;
   builder->get_widget("orphaned_button", orph_button);


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