[gtkmm/use-dllexport: 35/60] demos, tests: Fix modal dialogs
- From: Chun-wei Fan <fanchunwei src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtkmm/use-dllexport: 35/60] demos, tests: Fix modal dialogs
- Date: Mon, 8 Jun 2020 02:44:56 +0000 (UTC)
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]