[gtkmm/gtkmm-3-22] Fix the Change Display demo
- From: Kjell Ahlstedt <kjellahl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtkmm/gtkmm-3-22] Fix the Change Display demo
- Date: Wed, 24 Jan 2018 12:19:01 +0000 (UTC)
commit f8b67c9050e80222924402e119d45fc488ffd17c
Author: Kjell Ahlstedt <kjellahlstedt gmail com>
Date: Wed Jan 24 13:16:28 2018 +0100
Fix the Change Display demo
Make the demo more like the corresponding demo in gtk+, e.g. by using
Gdk::Seat::grab() and Gdk::Device::get_window_at_position().
demos/gtk-demo/example_change_display.cc | 58 +++++++++++-------------------
1 files changed, 21 insertions(+), 37 deletions(-)
---
diff --git a/demos/gtk-demo/example_change_display.cc b/demos/gtk-demo/example_change_display.cc
index 9a327b9..a5f0fbf 100644
--- a/demos/gtk-demo/example_change_display.cc
+++ b/demos/gtk-demo/example_change_display.cc
@@ -90,8 +90,6 @@ protected:
Glib::RefPtr<Gdk::Display> m_refCurrentDisplay;
- Popup* m_pPopup;
-
bool m_popup_clicked;
};
@@ -104,7 +102,6 @@ Example_ChangeDisplay::Example_ChangeDisplay()
m_Frame_Display("Display"),
m_ButtonBox_Display(Gtk::ORIENTATION_VERTICAL, 5),
m_Button_Display_Open("_Open...", true), m_Button_Display_Close("_Close...", true),
- m_pPopup(nullptr),
m_popup_clicked(false)
{
add_button("_Close", Gtk::RESPONSE_CLOSE);
@@ -146,11 +143,6 @@ Example_ChangeDisplay::Example_ChangeDisplay()
Example_ChangeDisplay::~Example_ChangeDisplay()
{
- if(m_pPopup)
- {
- delete m_pPopup;
- m_pPopup = nullptr;
- }
}
void Example_ChangeDisplay::setup_frame(Gtk::Frame& frame, Gtk::TreeView& treeview, Gtk::Box& buttonbox)
@@ -287,38 +279,32 @@ void Example_ChangeDisplay::on_response(int response_id)
}
-
/* Asks the user to click on a window, then waits for them click
* the mouse. When the mouse is released, returns the toplevel
* window under the pointer, or NULL, if there is none.
*/
Gtk::Window* Example_ChangeDisplay::query_for_toplevel(const Glib::RefPtr<Gdk::Screen>& screen, const
Glib::ustring& prompt)
{
- Glib::RefPtr<Gdk::Display> refDisplay = screen->get_display();
+ auto device = Glib::wrap(gtk_get_current_event_device(), true);
+ if (!device)
+ return nullptr;
- if(m_pPopup)
- {
- delete m_pPopup;
- m_pPopup = nullptr;
- }
-
- m_pPopup = new Popup(screen, prompt);
+ Glib::RefPtr<Gdk::Display> refDisplay = screen->get_display();
- m_pPopup->show();
+ std::unique_ptr<Popup> pPopup(new Popup(screen, prompt));
+ pPopup->show();
Glib::RefPtr<Gdk::Cursor> cursor = Gdk::Cursor::create(refDisplay, Gdk::CROSSHAIR);
Gtk::Window* toplevel = nullptr;
+ auto seat = device->get_seat();
- //TODO: Find a suitable replacement for this:
- //const GdkGrabStatus grabbed = m_pPopup->get_window()->grab(false, Gdk::BUTTON_RELEASE_MASK, cursor,
GDK_CURRENT_TIME);
- //Check it when the GTK+ example has been updated and file a bug about the unhelpful deprecation comment.
- const Gdk::GrabStatus grabbed = Gdk::GRAB_SUCCESS;
- if(grabbed == Gdk::GRAB_SUCCESS )
+ if (seat && seat->grab(pPopup->get_window(), Gdk::SEAT_CAPABILITY_ALL_POINTING,
+ false, cursor) == Gdk::GRAB_SUCCESS)
{
m_popup_clicked = false;
- m_pPopup->signal_button_release_event().connect( sigc::mem_fun(*this,
&Example_ChangeDisplay::on_popup_button_release_event) );
-
+ pPopup->signal_button_release_event().connect(
+ sigc::mem_fun(*this, &Example_ChangeDisplay::on_popup_button_release_event));
// Process events until clicked is set by button_release_event_cb.
// We pass in may_block=true since we want to wait if there
@@ -326,9 +312,9 @@ Gtk::Window* Example_ChangeDisplay::query_for_toplevel(const Glib::RefPtr<Gdk::S
while (!m_popup_clicked)
Gtk::Main::iteration(true);
- toplevel = dynamic_cast<Gtk::Window*>(find_toplevel_at_pointer(screen->get_display()));
- if (toplevel == m_pPopup)
- toplevel = nullptr;
+ toplevel = dynamic_cast<Gtk::Window*>(find_toplevel_at_pointer(refDisplay));
+ if (toplevel == pPopup.get())
+ toplevel = nullptr;
}
refDisplay->flush(); /* Really release the grab */
@@ -339,25 +325,23 @@ Gtk::Window* Example_ChangeDisplay::query_for_toplevel(const Glib::RefPtr<Gdk::S
// Finds the toplevel window under the mouse pointer, if any.
Gtk::Widget* Example_ChangeDisplay::find_toplevel_at_pointer(const Glib::RefPtr<Gdk::Display>& /* display */)
{
- //TODO: This needs to use Device::get_window_at_position(), when we can figure that out.
- //See https://bugzilla.gnome.org/show_bug.cgi?id=638907
- /*
- Glib::RefPtr<Gdk::Window> refPointerWindow = display->get_window_at_pointer();
+ auto device = Glib::wrap(gtk_get_current_event_device(), true);
+ if (!device)
+ return nullptr;
+ auto refPointerWindow = device->get_window_at_position();
if (refPointerWindow)
{
// The user data field of a GdkWindow is used to store a pointer
// to the widget that created it.
- GtkWidget* cWidget = nullptr;
- gpointer* user_data = nullptr;
- refPointerWindow->get_user_data(user_data);
- cWidget = (GtkWidget*)user_data;
+ gpointer user_data = nullptr;
+ refPointerWindow->get_user_data(&user_data);
+ GtkWidget* cWidget = static_cast<GtkWidget*>(user_data);
Gtk::Widget* pWidget = Glib::wrap(cWidget);
if(pWidget)
return pWidget->get_toplevel();
}
- */
return nullptr;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]