[gtkmm-documentation] examples: Update for latest gtkmm4 (remove property_margin(), etc.)



commit 36f1365591be7df3b29273934f502e1c6ad5ce3a
Author: Kjell Ahlstedt <kjellahlstedt gmail com>
Date:   Thu Mar 12 17:05:34 2020 +0100

    examples: Update for latest gtkmm4 (remove property_margin(), etc.)
    
    * examples/book/drag_and_drop/dndwindow.[cc|h]:
    * examples/others/dnd/dndwindow.[cc|h]: Drag-and-drop has been modified
    in gtk and gtkmm. These DnD examples can now be compiled, but they don't
    fully work. Neither does tests/testdnd.c in gtk.
    
    Widget::property_margin() and property_expand() have been removed.
    It affects many .ui files and ui_info strings.

 examples/book/buildapp/step5/prefs.ui              |   5 +-
 examples/book/buildapp/step6/prefs.ui              |   5 +-
 examples/book/buildapp/step7/prefs.ui              |   5 +-
 examples/book/buildapp/step8/prefs.ui              |   5 +-
 examples/book/buildapp/step9/prefs.ui              |   5 +-
 examples/book/drag_and_drop/dndwindow.cc           |  37 +++---
 examples/book/drag_and_drop/dndwindow.h            |   4 +-
 examples/book/menus/main_menu/examplewindow.cc     |   6 +-
 examples/book/menus/popup/examplewindow.cc         |   4 +-
 examples/book/menus_and_toolbars/toolbar.glade     |   9 +-
 examples/book/popover/examplewindow.cc             |   4 +-
 examples/book/printing/advanced/examplewindow.cc   |  12 +-
 examples/book/printing/simple/examplewindow.cc     |  12 +-
 examples/book/recent_files/examplewindow.cc        |   6 +-
 examples/book/treeview/popup/treeview_withpopup.cc |   2 +-
 .../others/cellrenderercustom/cellrendererpopup.cc |   5 +-
 examples/others/dnd/dndwindow.cc                   | 144 +++++++--------------
 examples/others/dnd/dndwindow.h                    |  22 ++--
 18 files changed, 130 insertions(+), 162 deletions(-)
---
diff --git a/examples/book/buildapp/step5/prefs.ui b/examples/book/buildapp/step5/prefs.ui
index 580daaf..e8aa1ea 100644
--- a/examples/book/buildapp/step5/prefs.ui
+++ b/examples/book/buildapp/step5/prefs.ui
@@ -9,7 +9,10 @@
       <object class="GtkBox" id="content_area">
         <child>
           <object class="GtkGrid" id="grid">
-            <property name="margin">6</property>
+            <property name="margin-start">6</property>
+            <property name="margin-end">6</property>
+            <property name="margin-top">6</property>
+            <property name="margin-bottom">6</property>
             <property name="row-spacing">12</property>
             <property name="column-spacing">6</property>
             <child>
diff --git a/examples/book/buildapp/step6/prefs.ui b/examples/book/buildapp/step6/prefs.ui
index 580daaf..e8aa1ea 100644
--- a/examples/book/buildapp/step6/prefs.ui
+++ b/examples/book/buildapp/step6/prefs.ui
@@ -9,7 +9,10 @@
       <object class="GtkBox" id="content_area">
         <child>
           <object class="GtkGrid" id="grid">
-            <property name="margin">6</property>
+            <property name="margin-start">6</property>
+            <property name="margin-end">6</property>
+            <property name="margin-top">6</property>
+            <property name="margin-bottom">6</property>
             <property name="row-spacing">12</property>
             <property name="column-spacing">6</property>
             <child>
diff --git a/examples/book/buildapp/step7/prefs.ui b/examples/book/buildapp/step7/prefs.ui
index 580daaf..e8aa1ea 100644
--- a/examples/book/buildapp/step7/prefs.ui
+++ b/examples/book/buildapp/step7/prefs.ui
@@ -9,7 +9,10 @@
       <object class="GtkBox" id="content_area">
         <child>
           <object class="GtkGrid" id="grid">
-            <property name="margin">6</property>
+            <property name="margin-start">6</property>
+            <property name="margin-end">6</property>
+            <property name="margin-top">6</property>
+            <property name="margin-bottom">6</property>
             <property name="row-spacing">12</property>
             <property name="column-spacing">6</property>
             <child>
diff --git a/examples/book/buildapp/step8/prefs.ui b/examples/book/buildapp/step8/prefs.ui
index 580daaf..e8aa1ea 100644
--- a/examples/book/buildapp/step8/prefs.ui
+++ b/examples/book/buildapp/step8/prefs.ui
@@ -9,7 +9,10 @@
       <object class="GtkBox" id="content_area">
         <child>
           <object class="GtkGrid" id="grid">
-            <property name="margin">6</property>
+            <property name="margin-start">6</property>
+            <property name="margin-end">6</property>
+            <property name="margin-top">6</property>
+            <property name="margin-bottom">6</property>
             <property name="row-spacing">12</property>
             <property name="column-spacing">6</property>
             <child>
diff --git a/examples/book/buildapp/step9/prefs.ui b/examples/book/buildapp/step9/prefs.ui
index 580daaf..e8aa1ea 100644
--- a/examples/book/buildapp/step9/prefs.ui
+++ b/examples/book/buildapp/step9/prefs.ui
@@ -9,7 +9,10 @@
       <object class="GtkBox" id="content_area">
         <child>
           <object class="GtkGrid" id="grid">
-            <property name="margin">6</property>
+            <property name="margin-start">6</property>
+            <property name="margin-end">6</property>
+            <property name="margin-top">6</property>
+            <property name="margin-bottom">6</property>
             <property name="row-spacing">12</property>
             <property name="column-spacing">6</property>
             <child>
diff --git a/examples/book/drag_and_drop/dndwindow.cc b/examples/book/drag_and_drop/dndwindow.cc
index ece2383..8f760be 100644
--- a/examples/book/drag_and_drop/dndwindow.cc
+++ b/examples/book/drag_and_drop/dndwindow.cc
@@ -15,7 +15,6 @@
  */
 
 #include "dndwindow.h"
-#include <gdkmm/contentformats.h>
 #include <gdkmm/contentprovider.h>
 #include <gtkmm/dragsource.h>
 #include <gtkmm/droptarget.h>
@@ -32,8 +31,8 @@ DnDWindow::DnDWindow()
   //Drag site:
 
   //Make m_Label_Drag a DnD drag source:
-  const GType ustring_type = Glib::Value<Glib::ustring>::value_type();
   auto source = Gtk::DragSource::create();
+  source->set_actions(Gdk::DragAction::COPY);
   source->signal_prepare().connect(
     sigc::mem_fun(*this, &DnDWindow::on_label_drag_prepare_data), false);
   m_Label_Drag.add_controller(source);
@@ -44,10 +43,10 @@ DnDWindow::DnDWindow()
   //Drop site:
 
   //Make m_Button_Drop a DnD drop destination:
-  auto formats = Gdk::ContentFormats::create(ustring_type);
-  auto target = Gtk::DropTarget::create(formats, Gdk::DragAction::COPY);
-  target->signal_drag_drop().connect(
-    sigc::mem_fun(*this, &DnDWindow::on_button_drop_drag_drop), false);
+  const GType ustring_type = Glib::Value<Glib::ustring>::value_type();
+  auto target = Gtk::DropTarget::create(ustring_type, Gdk::DragAction::COPY);
+  target->signal_drop().connect(
+    sigc::mem_fun(*this, &DnDWindow::on_button_drop_drop_data), false);
   m_Button_Drop.add_controller(target);
 
   m_HBox.add(m_Button_Drop);
@@ -69,24 +68,22 @@ Glib::RefPtr<Gdk::ContentProvider> DnDWindow::on_label_drag_prepare_data(double,
   return Gdk::ContentProvider::create(ustring_value);
 }
 
-bool DnDWindow::on_button_drop_drag_drop(const Glib::RefPtr<Gdk::Drop>& drop, int, int)
-{
-  drop->read_text_async(sigc::bind(sigc::mem_fun(*this, &DnDWindow::on_button_drop_got_data), drop));
-  return true;
-}
-
-void DnDWindow::on_button_drop_got_data(Glib::RefPtr<Gio::AsyncResult>& result,
-  const Glib::RefPtr<Gdk::Drop>& drop)
+bool DnDWindow::on_button_drop_drop_data(const Glib::ValueBase& value, double, double)
 {
-  try
+  if (G_VALUE_HOLDS(value.gobj(), Glib::Value<Glib::ustring>::value_type()))
   {
-    const Glib::ustring dropped_string = drop->read_text_finish(result);
+    // We got the value type that we expected.
+    Glib::Value<Glib::ustring> ustring_value;
+    ustring_value.init(value.gobj());
+    const Glib::ustring dropped_string = ustring_value.get();
+
     std::cout << "Received \"" << dropped_string << "\" in button " << std::endl;
-    drop->finish(Gdk::DragAction::COPY);
+    return true;
   }
-  catch (const std::exception& ex)
+  else
   {
-    std::cout << "Drop failed: " << ex.what() << std::endl;
-    drop->failed();
+    std::cout << "Received unexpected data type \""
+      << G_VALUE_TYPE_NAME(value.gobj()) << "\" in button " << std::endl;
+    return false;
   }
 }
diff --git a/examples/book/drag_and_drop/dndwindow.h b/examples/book/drag_and_drop/dndwindow.h
index 563837f..8de4612 100644
--- a/examples/book/drag_and_drop/dndwindow.h
+++ b/examples/book/drag_and_drop/dndwindow.h
@@ -33,9 +33,7 @@ public:
 protected:
   //Signal handlers:
   Glib::RefPtr<Gdk::ContentProvider> on_label_drag_prepare_data(double x, double y);
-  bool on_button_drop_drag_drop(const Glib::RefPtr<Gdk::Drop>& drop, int x, int y);
-  void on_button_drop_got_data(Glib::RefPtr<Gio::AsyncResult>& result,
-    const Glib::RefPtr<Gdk::Drop>& drop);
+  bool on_button_drop_drop_data(const Glib::ValueBase& value, double x, double y);
 
   //Member widgets:
   Gtk::Box m_HBox;
diff --git a/examples/book/menus/main_menu/examplewindow.cc b/examples/book/menus/main_menu/examplewindow.cc
index 1b507ac..bd874ff 100644
--- a/examples/book/menus/main_menu/examplewindow.cc
+++ b/examples/book/menus/main_menu/examplewindow.cc
@@ -69,7 +69,8 @@ ExampleWindow::ExampleWindow()
     "        <property name='tooltip_text' translatable='yes'>New Standard</property>"
     "        <property name='action_name'>app.newstandard</property>"
     "        <property name='icon_name'>document-new</property>"
-    "        <property name='expand'>False</property>"
+    "        <property name='hexpand'>False</property>"
+    "        <property name='vexpand'>False</property>"
     "      </object>"
     "    </child>"
     "    <child>"
@@ -78,7 +79,8 @@ ExampleWindow::ExampleWindow()
     "        <property name='tooltip_text' translatable='yes'>Quit</property>"
     "        <property name='action_name'>app.quit</property>"
     "        <property name='icon_name'>application-exit</property>"
-    "        <property name='expand'>False</property>"
+    "        <property name='hexpand'>False</property>"
+    "        <property name='vexpand'>False</property>"
     "      </object>"
     "    </child>"
     "  </object>"
diff --git a/examples/book/menus/popup/examplewindow.cc b/examples/book/menus/popup/examplewindow.cc
index d6549fa..d5ec9ab 100644
--- a/examples/book/menus/popup/examplewindow.cc
+++ b/examples/book/menus/popup/examplewindow.cc
@@ -19,8 +19,7 @@
 
 ExampleWindow::ExampleWindow(const Glib::RefPtr<Gtk::Application>& app)
 : m_Box(Gtk::Orientation::VERTICAL),
-  m_Label("Right-click to see the popup menu."),
-  m_MenuPopup(m_Label)
+  m_Label("Right-click to see the popup menu.")
 {
   set_title("popup example");
   set_default_size(200, 200);
@@ -100,6 +99,7 @@ ExampleWindow::ExampleWindow(const Glib::RefPtr<Gtk::Application>& app)
   if(!gmenu)
     g_warning("GMenu not found");
 
+  m_MenuPopup.set_parent(m_Label);
   m_MenuPopup.set_menu_model(gmenu);
   m_MenuPopup.set_has_arrow(false);
 }
diff --git a/examples/book/menus_and_toolbars/toolbar.glade b/examples/book/menus_and_toolbars/toolbar.glade
index b7c68cb..1078b02 100644
--- a/examples/book/menus_and_toolbars/toolbar.glade
+++ b/examples/book/menus_and_toolbars/toolbar.glade
@@ -11,7 +11,8 @@
         <property name="tooltip_text" translatable="yes">New</property>
         <property name="action_name">example.new</property>
         <property name="icon_name">document-new</property>
-        <property name="expand">False</property>
+        <property name="hexpand">False</property>
+        <property name="vexpand">False</property>
       </object>
     </child>
     <child>
@@ -19,7 +20,8 @@
         <property name="can_focus">False</property>
         <property name="tooltip_text" translatable="yes">Stay dry in the rain</property>
         <property name="action_name">example.rain</property>
-        <property name="expand">False</property>
+        <property name="hexpand">False</property>
+        <property name="vexpand">False</property>
         <child>
           <object class="GtkImage" id="image_rain">
             <property name="can_focus">False</property>
@@ -34,7 +36,8 @@
         <property name="tooltip_text" translatable="yes">Quit</property>
         <property name="action_name">example.quit</property>
         <property name="icon_name">application-exit</property>
-        <property name="expand">False</property>
+        <property name="hexpand">False</property>
+        <property name="vexpand">False</property>
       </object>
     </child>
   </object>
diff --git a/examples/book/popover/examplewindow.cc b/examples/book/popover/examplewindow.cc
index cd6f09e..a6a748a 100644
--- a/examples/book/popover/examplewindow.cc
+++ b/examples/book/popover/examplewindow.cc
@@ -19,10 +19,8 @@
 ExampleWindow::ExampleWindow()
  : m_format_buttons_box(Gtk::Orientation::HORIZONTAL),
    m_toggle_button("Button"),
-   m_toggle_form_popover(m_toggle_button),
    m_toggle_form_label("Non-modal Popover"),
    m_toggle_form_combo_label("Popover position:"),
-   m_calendar_popover(m_calendar),
    m_calendar_popover_label("Label:")
 {
   // Window properties
@@ -71,6 +69,7 @@ void ExampleWindow::configure_form_popover()
   m_toggle_form_grid.attach(m_toggle_form_combo_label, 0, 2, 1, 1);
   m_toggle_form_grid.attach(m_toggle_form_combo, 1, 2, 1, 1);
 
+  m_toggle_form_popover.set_parent(m_toggle_button);
   m_toggle_form_popover.add(m_toggle_form_grid);
   m_toggle_form_popover.set_position(Gtk::PositionType::BOTTOM);
   m_toggle_form_popover.set_margin(6);
@@ -131,6 +130,7 @@ void ExampleWindow::configure_cal_popover()
   m_calendar_form_grid.attach(m_calendar_popover_label, 0, 0, 1, 1);
   m_calendar_form_grid.attach(m_calendar_popover_entry, 1, 0, 1, 1);
 
+  m_calendar_popover.set_parent(m_calendar);
   m_calendar_popover.add(m_calendar_form_grid);
   m_calendar_popover.set_margin(6);
 }
diff --git a/examples/book/printing/advanced/examplewindow.cc 
b/examples/book/printing/advanced/examplewindow.cc
index df82aa2..4dc23bd 100644
--- a/examples/book/printing/advanced/examplewindow.cc
+++ b/examples/book/printing/advanced/examplewindow.cc
@@ -165,7 +165,8 @@ void ExampleWindow::build_main_menu(const Glib::RefPtr<Gtk::Application>& app)
             "<property name='tooltip_text' translatable='yes'>New</property>"
             "<property name='action_name'>example.new</property>"
             "<property name='icon_name'>document-new</property>"
-            "<property name='expand'>False</property>"
+            "<property name='hexpand'>False</property>"
+            "<property name='vexpand'>False</property>"
           "</object>"
         "</child>"
         "<child>"
@@ -174,13 +175,15 @@ void ExampleWindow::build_main_menu(const Glib::RefPtr<Gtk::Application>& app)
             "<property name='tooltip_text' translatable='yes'>Print</property>"
             "<property name='action_name'>example.print</property>"
             "<property name='icon_name'>document-print</property>"
-            "<property name='expand'>False</property>"
+            "<property name='hexpand'>False</property>"
+            "<property name='vexpand'>False</property>"
           "</object>"
         "</child>"
         "<child>"
           "<object class='GtkSeparator' id='separator1'>"
             "<property name='can_focus'>False</property>"
-            "<property name='expand'>False</property>"
+            "<property name='hexpand'>False</property>"
+            "<property name='vexpand'>False</property>"
           "</object>"
         "</child>"
         "<child>"
@@ -189,7 +192,8 @@ void ExampleWindow::build_main_menu(const Glib::RefPtr<Gtk::Application>& app)
             "<property name='tooltip_text' translatable='yes'>Quit</property>"
             "<property name='action_name'>example.quit</property>"
             "<property name='icon_name'>application-exit</property>"
-            "<property name='expand'>False</property>"
+            "<property name='hexpand'>False</property>"
+            "<property name='vexpand'>False</property>"
           "</object>"
         "</child>"
       "</object>"
diff --git a/examples/book/printing/simple/examplewindow.cc b/examples/book/printing/simple/examplewindow.cc
index df82aa2..4dc23bd 100644
--- a/examples/book/printing/simple/examplewindow.cc
+++ b/examples/book/printing/simple/examplewindow.cc
@@ -165,7 +165,8 @@ void ExampleWindow::build_main_menu(const Glib::RefPtr<Gtk::Application>& app)
             "<property name='tooltip_text' translatable='yes'>New</property>"
             "<property name='action_name'>example.new</property>"
             "<property name='icon_name'>document-new</property>"
-            "<property name='expand'>False</property>"
+            "<property name='hexpand'>False</property>"
+            "<property name='vexpand'>False</property>"
           "</object>"
         "</child>"
         "<child>"
@@ -174,13 +175,15 @@ void ExampleWindow::build_main_menu(const Glib::RefPtr<Gtk::Application>& app)
             "<property name='tooltip_text' translatable='yes'>Print</property>"
             "<property name='action_name'>example.print</property>"
             "<property name='icon_name'>document-print</property>"
-            "<property name='expand'>False</property>"
+            "<property name='hexpand'>False</property>"
+            "<property name='vexpand'>False</property>"
           "</object>"
         "</child>"
         "<child>"
           "<object class='GtkSeparator' id='separator1'>"
             "<property name='can_focus'>False</property>"
-            "<property name='expand'>False</property>"
+            "<property name='hexpand'>False</property>"
+            "<property name='vexpand'>False</property>"
           "</object>"
         "</child>"
         "<child>"
@@ -189,7 +192,8 @@ void ExampleWindow::build_main_menu(const Glib::RefPtr<Gtk::Application>& app)
             "<property name='tooltip_text' translatable='yes'>Quit</property>"
             "<property name='action_name'>example.quit</property>"
             "<property name='icon_name'>application-exit</property>"
-            "<property name='expand'>False</property>"
+            "<property name='hexpand'>False</property>"
+            "<property name='vexpand'>False</property>"
           "</object>"
         "</child>"
       "</object>"
diff --git a/examples/book/recent_files/examplewindow.cc b/examples/book/recent_files/examplewindow.cc
index 8abc9bd..8f152e1 100644
--- a/examples/book/recent_files/examplewindow.cc
+++ b/examples/book/recent_files/examplewindow.cc
@@ -85,7 +85,8 @@ ExampleWindow::ExampleWindow(const Glib::RefPtr<Gtk::Application>& app)
     "        <property name='tooltip_text' translatable='yes'>New</property>"
     "        <property name='action_name'>example.new</property>"
     "        <property name='icon_name'>document-new</property>"
-    "        <property name='expand'>False</property>"
+    "        <property name='hexpand'>False</property>"
+    "        <property name='vexpand'>False</property>"
     "      </object>"
     "    </child>"
     "    <child>"
@@ -94,7 +95,8 @@ ExampleWindow::ExampleWindow(const Glib::RefPtr<Gtk::Application>& app)
     "        <property name='tooltip_text' translatable='yes'>Quit</property>"
     "        <property name='action_name'>example.quit</property>"
     "        <property name='icon_name'>application-exit</property>"
-    "        <property name='expand'>False</property>"
+    "        <property name='hexpand'>False</property>"
+    "        <property name='vexpand'>False</property>"
     "      </object>"
     "    </child>"
     "  </object>"
diff --git a/examples/book/treeview/popup/treeview_withpopup.cc 
b/examples/book/treeview/popup/treeview_withpopup.cc
index 972eb3c..d68b731 100644
--- a/examples/book/treeview/popup/treeview_withpopup.cc
+++ b/examples/book/treeview/popup/treeview_withpopup.cc
@@ -18,7 +18,6 @@
 #include <iostream>
 
 TreeView_WithPopup::TreeView_WithPopup()
-: m_MenuPopup(*this)
 {
   //Create the Tree model:
   m_refTreeModel = Gtk::ListStore::create(m_Columns);
@@ -54,6 +53,7 @@ TreeView_WithPopup::TreeView_WithPopup()
   gmenu->append("_Process", "popup.process");
   gmenu->append("_Remove", "popup.remove");
 
+  m_MenuPopup.set_parent(*this);
   m_MenuPopup.set_menu_model(gmenu);
   m_MenuPopup.set_has_arrow(false);
 
diff --git a/examples/others/cellrenderercustom/cellrendererpopup.cc 
b/examples/others/cellrenderercustom/cellrendererpopup.cc
index 2deeaa3..fe3212e 100644
--- a/examples/others/cellrenderercustom/cellrendererpopup.cc
+++ b/examples/others/cellrenderercustom/cellrendererpopup.cc
@@ -205,7 +205,8 @@ void CellRendererPopup::on_show_popup(const Glib::ustring&, int, int y1, int x2,
   x -= alloc.get_width();
   x = std::max(0, x);
 
-  popup_window_.add_modal_grab();
+  popup_window_.set_can_focus(true);
+  popup_window_.grab_focus();
 
   //popup_window_.move(x, y);
   (void)x; (void)y; // Pretend that x and y are used.
@@ -221,7 +222,7 @@ void CellRendererPopup::on_show_popup(const Glib::ustring&, int, int y1, int x2,
 
 void CellRendererPopup::on_hide_popup()
 {
-  popup_window_.remove_modal_grab();
+  popup_window_.set_can_focus(false);
   popup_window_.hide();
 
   if(popup_entry_)
diff --git a/examples/others/dnd/dndwindow.cc b/examples/others/dnd/dndwindow.cc
index 1308cc8..f944fca 100644
--- a/examples/others/dnd/dndwindow.cc
+++ b/examples/others/dnd/dndwindow.cc
@@ -36,26 +36,11 @@ DnDWindow::DnDWindow()
   m_trashcan_open = Gdk::Pixbuf::create_from_xpm_data(trashcan_open_xpm);
   m_trashcan_closed = Gdk::Pixbuf::create_from_xpm_data(trashcan_closed_xpm);
 
-  //Targets:
-  m_listTargets.push_back("STRING");
-  m_listTargets.push_back("text/plain");
-  m_listTargets.push_back("text/plain;charset=utf-8");
-  if (!Glib::get_charset())
-  {
-    std::string charset;
-    Glib::get_charset(charset);
-    m_listTargets.push_back("text/plain;charset=" + charset);
-  }
-  m_listTargets.push_back("application/x-rootwin-drop");
-
-  //Targets without rootwin:
-  m_listTargetsNoRoot.assign(m_listTargets.begin(), --m_listTargets.end());
-
   // Drop site
 
-  auto formats = Gdk::ContentFormats::create(m_listTargetsNoRoot);
-  auto dest = Gtk::DropTarget::create(formats, Gdk::DragAction::COPY | Gdk::DragAction::MOVE);
-  dest->signal_drag_drop().connect(sigc::mem_fun(*this, &DnDWindow::on_label_drop_drag_drop), false);
+  const GType ustring_type = Glib::Value<Glib::ustring>::value_type();
+  auto dest = Gtk::DropTarget::create(ustring_type, Gdk::DragAction::COPY | Gdk::DragAction::MOVE);
+  dest->signal_drop().connect(sigc::mem_fun(*this, &DnDWindow::on_label_drop_drop), false);
   m_Label_Drop.add_controller(dest);
 
   m_Grid.attach(m_Label_Drop, 0, 0);
@@ -63,23 +48,21 @@ DnDWindow::DnDWindow()
 
   // Popup site
 
-  dest = Gtk::DropTarget::create(formats, Gdk::DragAction::COPY | Gdk::DragAction::MOVE);
-  dest->signal_accept().connect(sigc::mem_fun(*this, &DnDWindow::on_label_popup_accept), false);
-  dest->signal_drag_enter().connect(sigc::mem_fun(*this, &DnDWindow::on_label_popup_drag_enter));
-  dest->signal_drag_leave().connect(sigc::mem_fun(*this, &DnDWindow::on_label_popup_drag_leave));
-  m_Label_Popup.add_controller(dest);
+  auto controller = Gtk::DropControllerMotion::create();
+  controller->signal_enter().connect(sigc::mem_fun(*this, &DnDWindow::on_label_popup_enter));
+  controller->signal_leave().connect(sigc::mem_fun(*this, &DnDWindow::on_label_popup_leave));
+  m_Label_Popup.add_controller(controller);
 
   m_Grid.attach(m_Label_Popup, 1, 1);
   m_Label_Popup.set_expand(true);
 
   // Image
 
-  formats = Gdk::ContentFormats::create();
-  dest = Gtk::DropTarget::create(formats, Gdk::DragAction::MOVE);
-  dest->signal_accept().connect(sigc::mem_fun(*this, &DnDWindow::on_image_accept), false);
-  dest->signal_drag_leave().connect(sigc::mem_fun(*this, &DnDWindow::on_image_drag_leave));
-  dest->signal_drag_drop().connect(sigc::mem_fun(*this, &DnDWindow::on_image_drag_drop), false);
-  m_Image.add_controller(dest);
+  auto async = Gtk::DropTargetAsync::create();
+  async->signal_drag_enter().connect(sigc::mem_fun(*this, &DnDWindow::on_image_drag_enter), false);
+  async->signal_drag_leave().connect(sigc::mem_fun(*this, &DnDWindow::on_image_drag_leave));
+  async->signal_drop().connect(sigc::mem_fun(*this, &DnDWindow::on_image_drop), false);
+  m_Image.add_controller(async);
 
   m_Image.set(m_trashcan_closed);
 
@@ -126,11 +109,11 @@ void DnDWindow::create_popup()
       pButton->set_expand(true);
       pGrid->attach(*pButton, i, j);
 
-      auto dest = Gtk::DropTarget::create(formats, Gdk::DragAction::COPY | Gdk::DragAction::MOVE);
-      dest->signal_accept().connect(sigc::mem_fun(*this, &DnDWindow::on_button_popup_accept), false);
-      dest->signal_drag_enter().connect(sigc::mem_fun(*this, &DnDWindow::on_button_popup_drag_enter));
-      dest->signal_drag_leave().connect(sigc::mem_fun(*this, &DnDWindow::on_button_popup_drag_leave));
-      dest->signal_drag_drop().connect(sigc::mem_fun(*this, &DnDWindow::on_button_popup_drag_drop), false);
+      const GType ustring_type = Glib::Value<Glib::ustring>::value_type();
+      auto dest = Gtk::DropTarget::create(ustring_type, Gdk::DragAction::COPY | Gdk::DragAction::MOVE);
+      dest->signal_enter().connect(sigc::mem_fun(*this, &DnDWindow::on_button_popup_enter), false);
+      dest->signal_leave().connect(sigc::mem_fun(*this, &DnDWindow::on_button_popup_leave));
+      dest->signal_drop().connect(sigc::mem_fun(*this, &DnDWindow::on_button_popup_drop), false);
       pButton->add_controller(dest);
     }
   }
@@ -138,54 +121,41 @@ void DnDWindow::create_popup()
   m_PopupWindow.add(*pGrid);
 }
 
-bool DnDWindow::on_label_drop_drag_drop(const Glib::RefPtr<Gdk::Drop>& drop, int, int)
+bool DnDWindow::on_label_drop_drop(const Glib::ValueBase& value, double, double)
 {
-  drop->read_text_async(sigc::bind(sigc::mem_fun(*this, &DnDWindow::on_label_drop_got_data), drop));
-  return true;
-}
-
-void DnDWindow::on_label_drop_got_data(Glib::RefPtr<Gio::AsyncResult>& result,
-  const Glib::RefPtr<Gdk::Drop>& drop)
-{
-  try
+  if (G_VALUE_HOLDS(value.gobj(), Glib::Value<Glib::ustring>::value_type()))
   {
-    const Glib::ustring dropped_string = drop->read_text_finish(result);
+    // We got the value type that we expected.
+    Glib::Value<Glib::ustring> ustring_value;
+    ustring_value.init(value.gobj());
+    const Glib::ustring dropped_string = ustring_value.get();
+
     std::cout << "Received \"" << dropped_string << "\" in label " << std::endl;
-    drop->finish(Gdk::DragAction::COPY);
+    return true;
   }
-  catch (const std::exception& ex)
+  else
   {
-    std::cout << "Drop failed: " << ex.what() << std::endl;
-    drop->failed();
+    std::cout << "Received unexpected data type \""
+      << G_VALUE_TYPE_NAME(value.gobj()) << "\" in label " << std::endl;
+    return false;
   }
 }
 
-bool DnDWindow::on_label_popup_accept(const Glib::RefPtr<Gdk::Drop>& /* drop */)
-{
-  return true;
-}
-
-void DnDWindow::on_label_popup_drag_enter(const Glib::RefPtr<Gdk::Drop>& /* drop */)
+void DnDWindow::on_label_popup_enter(double, double)
 {
   std::cout << "popsite enter" << std::endl;
   if (!m_popup_timer)
     m_popup_timer = Glib::signal_timeout().connect(sigc::mem_fun(*this, &DnDWindow::on_popup_timeout), 500);
 }
 
-void DnDWindow::on_label_popup_drag_leave(const Glib::RefPtr<Gdk::Drop>& /* drop */)
+void DnDWindow::on_label_popup_leave()
 {
   std::cout << "popsite leave" << std::endl;
   if (m_popup_timer)
     m_popup_timer.disconnect();
 }
 
-bool DnDWindow::on_button_popup_accept(const Glib::RefPtr<Gdk::Drop>& drop)
-{
-  drop->status(Gdk::DragAction::COPY);
-  return true;
-}
-
-void DnDWindow::on_button_popup_drag_enter(const Glib::RefPtr<Gdk::Drop>& /* drop */)
+Gdk::DragAction DnDWindow::on_button_popup_enter(double, double)
 {
   std::cout << "popup enter" << std::endl;
   if (!m_in_popup)
@@ -197,9 +167,10 @@ void DnDWindow::on_button_popup_drag_enter(const Glib::RefPtr<Gdk::Drop>& /* dro
       m_popdown_timer.disconnect();
     }
   }
+  return Gdk::DragAction::COPY;
 }
 
-void DnDWindow::on_button_popup_drag_leave(const Glib::RefPtr<Gdk::Drop>& /* drop */)
+void DnDWindow::on_button_popup_leave()
 {
   std::cout << "popup leave" << std::endl;
   if (m_in_popup)
@@ -213,65 +184,42 @@ void DnDWindow::on_button_popup_drag_leave(const Glib::RefPtr<Gdk::Drop>& /* dro
   }
 }
 
-bool DnDWindow::on_button_popup_drag_drop(const Glib::RefPtr<Gdk::Drop>& drop, int, int)
+bool DnDWindow::on_button_popup_drop(const Glib::ValueBase& /* value */, double, double)
 {
-  drop->finish(Gdk::DragAction::COPY);
   on_popdown_timeout();
   return true;
 }
 
-bool DnDWindow::on_image_accept(const Glib::RefPtr<Gdk::Drop>& drop)
+Gdk::DragAction DnDWindow::on_image_drag_enter(const Glib::RefPtr<Gdk::Drop>& drop, double, double)
 {
+  std::cout << "trashcan enter: " << drop->get_formats()->to_string() << std::endl;
+
   if (!m_have_drag)
   {
     m_have_drag = true;
     m_Image.set(m_trashcan_open);
   }
 
-  std::cout << drop->get_formats()->to_string() << std::endl;
-
-  drop->status(Gdk::DragAction::MOVE);
-  return true;
+  return Gdk::DragAction::MOVE;
 }
 
-void DnDWindow::on_image_drag_leave(const Glib::RefPtr<Gdk::Drop>& /* drop */)
+void DnDWindow::on_image_drag_leave(const Glib::RefPtr<Gdk::Drop>& drop)
 {
-  std::cout << "trashcan leave" << std::endl;
+  std::cout << "trashcan leave: " << drop->get_formats()->to_string() << std::endl;
+
   m_have_drag = false;
   m_Image.set(m_trashcan_closed);
 }
 
-bool DnDWindow::on_image_drag_drop(const Glib::RefPtr<Gdk::Drop>& drop, int, int)
+bool DnDWindow::on_image_drop(const Glib::RefPtr<Gdk::Drop>& drop, double, double)
 {
-  std::cout << "trashcan drop" << std::endl;
+  std::cout << "trashcan drop: " << drop->get_formats()->to_string() << std::endl;
   m_have_drag = false;
 
   m_Image.set(m_trashcan_closed);
 
-  const auto targets = drop->get_formats()->get_mime_types();
-  if (!targets.empty())
-  {
-    drop->read_text_async(sigc::bind(sigc::mem_fun(*this, &DnDWindow::on_image_got_data), drop));
-    return true;
-  }
-  drop->status(static_cast<Gdk::DragAction>(0));
-  return false;
-}
-
-void DnDWindow::on_image_got_data(Glib::RefPtr<Gio::AsyncResult>& result,
-  const Glib::RefPtr<Gdk::Drop>& drop)
-{
-  try
-  {
-    const Glib::ustring dropped_string = drop->read_text_finish(result);
-    std::cout << "Received \"" << dropped_string << "\" in trashcan " << std::endl;
-    drop->finish(Gdk::DragAction::MOVE);
-  }
-  catch (const std::exception& ex)
-  {
-    std::cout << "Drop failed: " << ex.what() << std::endl;
-    drop->failed();
-  }
+  drop->finish(Gdk::DragAction::MOVE);
+  return true;
 }
 
 void DnDWindow::on_label_drag_drag_end(const Glib::RefPtr<Gdk::Drag>& /* drag */,
diff --git a/examples/others/dnd/dndwindow.h b/examples/others/dnd/dndwindow.h
index a3eba3e..3b2df5c 100644
--- a/examples/others/dnd/dndwindow.h
+++ b/examples/others/dnd/dndwindow.h
@@ -30,24 +30,18 @@ protected:
   void create_popup();
 
   //Signal handlers and callback functions:
-  bool on_label_drop_drag_drop(const Glib::RefPtr<Gdk::Drop>& drop, int x, int y);
-  void on_label_drop_got_data(Glib::RefPtr<Gio::AsyncResult>& result,
-    const Glib::RefPtr<Gdk::Drop>& drop);
+  bool on_label_drop_drop(const Glib::ValueBase& value, double x, double y);
 
-  bool on_label_popup_accept(const Glib::RefPtr<Gdk::Drop>& drop);
-  void on_label_popup_drag_enter(const Glib::RefPtr<Gdk::Drop>& drop);
-  void on_label_popup_drag_leave(const Glib::RefPtr<Gdk::Drop>& drop);
+  void on_label_popup_enter(double x, double y);
+  void on_label_popup_leave();
 
-  bool on_button_popup_accept(const Glib::RefPtr<Gdk::Drop>& drop);
-  void on_button_popup_drag_enter(const Glib::RefPtr<Gdk::Drop>& drop);
-  void on_button_popup_drag_leave(const Glib::RefPtr<Gdk::Drop>& drop);
-  bool on_button_popup_drag_drop(const Glib::RefPtr<Gdk::Drop>& drop, int x, int y);
+  Gdk::DragAction on_button_popup_enter(double x, double y);
+  void on_button_popup_leave();
+  bool on_button_popup_drop(const Glib::ValueBase& value, double x, double y);
 
-  bool on_image_accept(const Glib::RefPtr<Gdk::Drop>& drop);
+  Gdk::DragAction on_image_drag_enter(const Glib::RefPtr<Gdk::Drop>& drop, double x, double y);
   void on_image_drag_leave(const Glib::RefPtr<Gdk::Drop>& drop);
-  bool on_image_drag_drop(const Glib::RefPtr<Gdk::Drop>& drop, int x, int y);
-  void on_image_got_data(Glib::RefPtr<Gio::AsyncResult>& result,
-    const Glib::RefPtr<Gdk::Drop>& drop);
+  bool on_image_drop(const Glib::RefPtr<Gdk::Drop>& drop, double x, double y);
 
   void on_label_drag_drag_end(const Glib::RefPtr<Gdk::Drag>& drag, bool delete_data);
 


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