[gtkmm/use-dllexport: 35/60] demos, tests: Fix modal dialogs



commit 11da4643ccff7ba9181b3e00092c68eeb31880d4
Author: Kjell Ahlstedt <kjellahlstedt gmail com>
Date:   Sun May 17 13:13:53 2020 +0200

    demos, tests: Fix modal dialogs
    
    Make modal dialogs work without the removed Gtk::Dialog::run().
    
    There are still other problems, like crashing demos and tests.

 demos/gtk-demo/example_appwindow.cc |  2 ++
 demos/gtk-demo/example_dialog.cc    | 38 ++++++++++++++++++++----------------
 demos/gtk-demo/example_images.cc    | 39 +++++++++++++++++++++++++++++--------
 demos/gtk-demo/example_pixbufs.cc   | 17 +++++++++++++---
 tests/refcount_dialog/main.cc       | 31 +++++++++++++++++++----------
 5 files changed, 89 insertions(+), 38 deletions(-)
---
diff --git a/demos/gtk-demo/example_appwindow.cc b/demos/gtk-demo/example_appwindow.cc
index a32735f2..ccdd1843 100644
--- a/demos/gtk-demo/example_appwindow.cc
+++ b/demos/gtk-demo/example_appwindow.cc
@@ -133,6 +133,8 @@ void Example_AppWindow::on_menu_item()
 {
   Gtk::MessageDialog dialog(*this, "You selected or toggled the menu item", false,
                             Gtk::MessageType::INFO, Gtk::ButtonsType::CLOSE, true);
+  // This is not by itself an acceptable replacement for the removed Gtk::Dialog::run().
+  // Won't be fixed now. All uses of on_menu_item() are commented out.
   dialog.show();
 }
 
diff --git a/demos/gtk-demo/example_dialog.cc b/demos/gtk-demo/example_dialog.cc
index d3c36ab7..6a887fa4 100644
--- a/demos/gtk-demo/example_dialog.cc
+++ b/demos/gtk-demo/example_dialog.cc
@@ -19,7 +19,8 @@ protected:
   //Signal handlers:
   void on_button_message();
   void on_button_interactive();
-  void on_dialog_response(int response_id, Gtk::Dialog* dialog);
+  void on_message_response(int response_id, Gtk::MessageDialog* dialog);
+  void on_interactive_response(int response_id, Dialog_Interactive* dialog);
 
   //Member widgets:
   Gtk::Frame m_Frame;
@@ -52,7 +53,6 @@ protected:
 };
 
 
-
 //Called by DemoWindow;
 Gtk::Window* do_dialog()
 {
@@ -115,16 +115,12 @@ void Example_Dialog::on_button_message()
 {
   Glib::ustring strMessage = "This message box has been popped up the following\n"
                              "number of times:\n\n";
-  {
-    auto buf = Glib::make_unique_ptr_gfree(g_strdup_printf("%d", m_count));
-    strMessage += buf.get();
-  }
-  Gtk::MessageDialog dialog(*this, strMessage, false, Gtk::MessageType::INFO, Gtk::ButtonsType::OK, true); 
//true = modal
-  dialog.signal_response().connect(sigc::bind(
-    sigc::mem_fun(*this, &Example_Dialog::on_dialog_response), &dialog));
-  dialog.show();
+  strMessage += Glib::ustring::format(m_count);
 
-  m_count++;
+  auto dialog = new Gtk::MessageDialog(*this, strMessage, false, Gtk::MessageType::INFO, 
Gtk::ButtonsType::OK, true); //true = modal
+  dialog->signal_response().connect(sigc::bind(
+    sigc::mem_fun(*this, &Example_Dialog::on_message_response), dialog));
+  dialog->show();
 }
 
 void Example_Dialog::on_button_interactive()
@@ -132,17 +128,25 @@ void Example_Dialog::on_button_interactive()
   Dialog_Interactive* pDialog = new Dialog_Interactive(*this, m_Entry1.get_text(), m_Entry2.get_text());
   pDialog->set_modal(true);
   pDialog->signal_response().connect(sigc::bind(
-    sigc::mem_fun(*this, &Example_Dialog::on_dialog_response), pDialog));
+    sigc::mem_fun(*this, &Example_Dialog::on_interactive_response), pDialog));
   pDialog->show();
 
-  m_Entry1.set_text(pDialog->get_entry1());
-  m_Entry2.set_text(pDialog->get_entry2());
-  delete pDialog;
 }
 
-void Example_Dialog::on_dialog_response(int /* response_id */, Gtk::Dialog* dialog)
+void Example_Dialog::on_message_response(int /* response_id */, Gtk::MessageDialog* dialog)
+{
+  m_count++;
+  delete dialog;
+}
+
+void Example_Dialog::on_interactive_response(int response_id, Dialog_Interactive* dialog)
 {
-  dialog->hide();
+  if (response_id == Gtk::ResponseType::OK)
+  {
+    m_Entry1.set_text(dialog->get_entry1());
+    m_Entry2.set_text(dialog->get_entry2());
+  }
+  delete dialog;
 }
 
 Dialog_Interactive::Dialog_Interactive(Gtk::Window& parent, const Glib::ustring& entry1, const 
Glib::ustring& entry2)
diff --git a/demos/gtk-demo/example_images.cc b/demos/gtk-demo/example_images.cc
index f53b91dd..d50a7661 100644
--- a/demos/gtk-demo/example_images.cc
+++ b/demos/gtk-demo/example_images.cc
@@ -35,6 +35,8 @@ protected:
   void on_loader_area_updated(int x, int y, int width, int height);
   void on_toggle_sensitivity();
 
+  void init_message_dialog();
+
   //Member widgets:
   Gtk::Box m_BaseVBox;
   Gtk::Box m_HBox;
@@ -54,6 +56,7 @@ protected:
 
   Glib::RefPtr<Gdk::PixbufLoader> m_refPixbufLoader;
   Glib::RefPtr<Gio::InputStream> m_image_stream;
+  std::unique_ptr<Gtk::MessageDialog> m_pMessageDialog;
 };
 
 //Called by DemoWindow;
@@ -189,6 +192,19 @@ Example_Images::~Example_Images()
   }
 }
 
+void Example_Images::init_message_dialog()
+{
+  if (!m_pMessageDialog)
+  {
+    m_pMessageDialog.reset(new Gtk::MessageDialog(
+      "", false, Gtk::MessageType::ERROR, Gtk::ButtonsType::CLOSE, true));
+    m_pMessageDialog->set_transient_for(*this);
+    m_pMessageDialog->set_hide_on_close(true);
+    m_pMessageDialog->signal_response().connect(
+      sigc::hide(sigc::mem_fun(*m_pMessageDialog, &Gtk::Widget::hide)));
+  }
+}
+
 void Example_Images::start_progressive_loading()
 {
   Glib::signal_timeout().connect(sigc::mem_fun(*this, &Example_Images::on_timeout), 150);
@@ -212,12 +228,13 @@ bool Example_Images::on_timeout()
     }
     catch(const Glib::Error& error)
     {
+      init_message_dialog();
 
       Glib::ustring strMsg = "Failure reading image 'alphatest.png': ";
       strMsg += error.what();
 
-      Gtk::MessageDialog dialog(strMsg, false, Gtk::MessageType::ERROR, Gtk::ButtonsType::CLOSE);
-      dialog.show();
+      m_pMessageDialog->set_message(strMsg);
+      m_pMessageDialog->show();
 
       m_image_stream.reset();
 
@@ -230,11 +247,13 @@ bool Example_Images::on_timeout()
     }
     catch(const Glib::Error& error)
     {
+      init_message_dialog();
+
       Glib::ustring strMsg = "Failed to load image: ";
       strMsg += error.what();
 
-      Gtk::MessageDialog dialog(strMsg, false, Gtk::MessageType::ERROR, Gtk::ButtonsType::CLOSE);
-      dialog.show();
+      m_pMessageDialog->set_message(strMsg);
+      m_pMessageDialog->show();
 
       m_image_stream.reset();
 
@@ -256,11 +275,13 @@ bool Example_Images::on_timeout()
       }
       catch(const Glib::Error& error)
       {
+        init_message_dialog();
+
         Glib::ustring strMsg = "Failed to close image: ";
         strMsg += error.what();
 
-        Gtk::MessageDialog dialog(strMsg, false, Gtk::MessageType::ERROR, Gtk::ButtonsType::CLOSE);
-        dialog.show();
+        m_pMessageDialog->set_message(strMsg);
+        m_pMessageDialog->show();
 
         m_refPixbufLoader.reset();
 
@@ -278,11 +299,13 @@ bool Example_Images::on_timeout()
     }
     catch(const Glib::Error& error)
     {
+      init_message_dialog();
+
       Glib::ustring strMsg = "Unable to open image 'alphatest.png': ";
       strMsg += error.what();
 
-      Gtk::MessageDialog dialog(strMsg, false, Gtk::MessageType::ERROR, Gtk::ButtonsType::CLOSE);
-      dialog.show();
+      m_pMessageDialog->set_message(strMsg);
+      m_pMessageDialog->show();
 
       return false; // uninstall the timeout
     }
diff --git a/demos/gtk-demo/example_pixbufs.cc b/demos/gtk-demo/example_pixbufs.cc
index acc53c6d..0dee8461 100644
--- a/demos/gtk-demo/example_pixbufs.cc
+++ b/demos/gtk-demo/example_pixbufs.cc
@@ -14,6 +14,7 @@
 #include <gtkmm.h>
 #include <cmath>
 #include <algorithm>
+#include <memory>
 
 namespace
 {
@@ -59,6 +60,7 @@ protected:
   guint m_back_width = 0;
   guint m_back_height = 0;
   gint64 m_start_time = 0;
+  std::unique_ptr<Gtk::MessageDialog> m_pMessageDialog;
 };
 
 //Called by DemoWindow;
@@ -86,11 +88,20 @@ Example_Pixbufs::Example_Pixbufs()
   }
   catch (const Glib::Error& error)
   {
+    if (!m_pMessageDialog)
+    {
+      m_pMessageDialog.reset(new Gtk::MessageDialog(
+        "", false, Gtk::MessageType::ERROR, Gtk::ButtonsType::CLOSE, true));
+      m_pMessageDialog->set_transient_for(*this);
+      m_pMessageDialog->set_hide_on_close(true);
+      m_pMessageDialog->signal_response().connect(
+        sigc::hide(sigc::mem_fun(*m_pMessageDialog, &Gtk::Widget::hide)));
+    }
+
     Glib::ustring strMsg = "Failed to load an image: ";
     strMsg += error.what();
-
-    Gtk::MessageDialog dialog(strMsg, false, Gtk::MessageType::ERROR, Gtk::ButtonsType::CLOSE);
-    dialog.show();
+    m_pMessageDialog->set_message(strMsg);
+    m_pMessageDialog->show();
   }
 }
 
diff --git a/tests/refcount_dialog/main.cc b/tests/refcount_dialog/main.cc
index 9924021f..30c543d0 100644
--- a/tests/refcount_dialog/main.cc
+++ b/tests/refcount_dialog/main.cc
@@ -18,10 +18,12 @@ public:
   MyWindow();
 
   void on_button_clicked();
+  void on_dialog_response(int response_id);
 
 protected:
   Gtk::Box m_Box;
   Gtk::Button m_Button;
+  std::unique_ptr<MyDialog> m_Dialog;
 };
 
 MyWindow::MyWindow()
@@ -38,19 +40,28 @@ MyWindow::MyWindow()
 
 void MyWindow::on_button_clicked()
 {
-  {
-    MyDialog d;
-    d.set_transient_for(*this);
-    d.set_modal();
-    d.show();
-    std::cout << "After d.show()" << std::endl;
-  }
-
-  std::cout << "before list_toplevel" << std::endl;
+  m_Dialog.reset(nullptr);
+  std::cout << "before list_toplevels 1" << std::endl;
   std::vector<Gtk::Window*> toplevelwindows = list_toplevels();
-  std::cout << "after list_toplevel" << std::endl;
+  std::cout << "after list_toplevels" << std::endl;
+  std::cout << "toplevelwindows.size = " << toplevelwindows.size() << std::endl;
+
+  m_Dialog.reset(new MyDialog);
+  m_Dialog->set_transient_for(*this);
+  m_Dialog->set_modal();
+  m_Dialog->set_hide_on_close();
+  m_Dialog->signal_response().connect(sigc::mem_fun(*this, &MyWindow::on_dialog_response));
+  m_Dialog->show();
+  std::cout << "After m_Dialog->show()" << std::endl;
+}
 
+void MyWindow::on_dialog_response(int /* response_id */)
+{
+  std::cout << "before list_toplevels 2" << std::endl;
+  std::vector<Gtk::Window*> toplevelwindows = list_toplevels();
+  std::cout << "after list_toplevels" << std::endl;
   std::cout << "toplevelwindows.size = " << toplevelwindows.size() << std::endl;
+  m_Dialog->hide();
 }
 
 int main(int argc, char* argv[])


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